commit 9f48d4a18cae94c7e49fa1b28e4879eac99b5cbb Author: wehub-resource-sync Date: Mon Jul 13 12:37:25 2026 +0800 chore: import upstream snapshot with attribution diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..86b7318 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,17 @@ +.git +.DS_Store +.env +.env.* +node_modules +dist +packages/*/dist +release +release-local +logs +tmp +test-results +playwright-report +blob-report +docs/node_modules +docs/dist +docs/.astro diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..00463e0 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,48 @@ +name: Docs + +on: + push: + branches: + - main + paths: + - "docs/**" + - ".github/workflows/docs.yml" + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v6 + + - name: Build and upload docs + uses: withastro/action@v6 + env: + ASTRO_SITE: https://ccrdesk.top + ASTRO_BASE: / + with: + path: docs + node-version: 24 + + deploy: + name: Deploy + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v5 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..409612d --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,207 @@ +name: Release + +on: + push: + tags: + - "v*" + +permissions: + contents: write + +concurrency: + group: release-${{ github.ref }} + cancel-in-progress: false + +jobs: + macos: + name: macOS (${{ matrix.display_name }}) + runs-on: ${{ matrix.runner }} + strategy: + fail-fast: false + matrix: + include: + - arch: arm64 + arch_flag: --arm64 + runner: macos-14 + display_name: Apple Silicon + release_label: Apple-Silicon + artifact_name: macos-apple-silicon-arm64 + - arch: x64 + arch_flag: --x64 + runner: macos-15-intel + display_name: Intel + release_label: Intel + artifact_name: macos-intel-x64 + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Verify tag version + shell: bash + run: | + tag_version="${GITHUB_REF_NAME#v}" + package_version="$(node -p "require('./package.json').version")" + if [[ "$tag_version" != "$package_version" ]]; then + echo "Tag v$tag_version does not match package.json version $package_version" + exit 1 + fi + + - name: Build ad-hoc macOS artifacts + run: | + npm run build:assets + npx electron-builder \ + --config build/electron-builder.local.cjs \ + --mac ${{ matrix.arch_flag }} \ + --publish never \ + -c.mac.artifactName='Claude-Code-Router_${version}-mac-${{ matrix.release_label }}-${arch}.${ext}' + + - name: Upload macOS release files + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.artifact_name }} + path: | + release-local/Claude-Code-Router_*-mac-${{ matrix.release_label }}-${{ matrix.arch }}.* + release-local/latest-mac.yml + if-no-files-found: error + + publish-macos: + name: Publish macOS + needs: macos + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install metadata merge dependencies + run: npm ci --ignore-scripts + + - name: Download macOS release files + uses: actions/download-artifact@v4 + with: + pattern: macos-* + path: macos-release-artifacts + + - name: Merge macOS update metadata + run: node build/merge-macos-update-metadata.mjs latest-mac.yml macos-release-artifacts/*/latest-mac.yml + + - name: Create GitHub release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release view "$GITHUB_REF_NAME" >/dev/null 2>&1 || \ + gh release create "$GITHUB_REF_NAME" --title "$GITHUB_REF_NAME" --generate-notes + + - name: Upload macOS release assets + shell: bash + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + shopt -s nullglob + assets=(macos-release-artifacts/*/Claude-Code-Router_*-mac-*.*) + if (( ${#assets[@]} == 0 )); then + echo "No macOS release assets were found." + exit 1 + fi + + upload_args=() + for asset in "${assets[@]}"; do + name="$(basename "$asset")" + case "$name" in + *Apple-Silicon-arm64.dmg) label="macOS Apple Silicon DMG (arm64)" ;; + *Apple-Silicon-arm64.zip) label="macOS Apple Silicon ZIP (arm64)" ;; + *Apple-Silicon-arm64.dmg.blockmap) label="macOS Apple Silicon DMG blockmap (arm64)" ;; + *Apple-Silicon-arm64.zip.blockmap) label="macOS Apple Silicon ZIP blockmap (arm64)" ;; + *Intel-x64.dmg) label="macOS Intel DMG (x64)" ;; + *Intel-x64.zip) label="macOS Intel ZIP (x64)" ;; + *Intel-x64.dmg.blockmap) label="macOS Intel DMG blockmap (x64)" ;; + *Intel-x64.zip.blockmap) label="macOS Intel ZIP blockmap (x64)" ;; + *) label="$name" ;; + esac + upload_args+=("${asset}#${label}") + done + upload_args+=("latest-mac.yml#macOS update metadata") + + gh release upload "$GITHUB_REF_NAME" "${upload_args[@]}" --clobber + + windows: + name: Windows + needs: publish-macos + runs-on: windows-latest + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Verify tag version + shell: bash + run: | + tag_version="${GITHUB_REF_NAME#v}" + package_version="$(node -p "require('./package.json').version")" + if [[ "$tag_version" != "$package_version" ]]; then + echo "Tag v$tag_version does not match package.json version $package_version" + exit 1 + fi + + - name: Build and publish Windows artifacts + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + npm run build:assets + npx electron-builder --win --publish always + + linux: + name: Linux + needs: publish-macos + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Verify tag version + shell: bash + run: | + tag_version="${GITHUB_REF_NAME#v}" + package_version="$(node -p "require('./package.json').version")" + if [[ "$tag_version" != "$package_version" ]]; then + echo "Tag v$tag_version does not match package.json version $package_version" + exit 1 + fi + + - name: Build and publish Linux artifacts + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + npm run build:assets + npx electron-builder --linux AppImage --publish always diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6efc5ae --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +.DS_Store +node_modules +dist +release +*.log +.env +.env.* +!.env.example +.idea +.claude +.bot-gateway-state +.agent-data +tmp +release-local +logs +.opencat +test-results +playwright-report +blob-report +.tmp \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..c7d3517 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +install-links=true diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4c0c868 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,75 @@ +ARG NODE_IMAGE=node:22-bookworm +ARG RUNTIME_NODE_IMAGE=node:22-bookworm-slim + +FROM ${NODE_IMAGE} AS build +WORKDIR /app + +COPY package.json package-lock.json ./ +COPY packages/cli/package.json packages/cli/package.json +COPY packages/core/package.json packages/core/package.json +COPY packages/electron/package.json packages/electron/package.json +COPY packages/ui/package.json packages/ui/package.json +RUN npm ci + +COPY . . +RUN npm run build:docker + +FROM ${NODE_IMAGE} AS production-deps +WORKDIR /app +ENV NODE_ENV=production + +COPY package.json package-lock.json ./ +COPY packages/core/package.json packages/core/package.json +RUN npm ci --omit=dev --workspace=@claude-code-router/core --include-workspace-root=false \ + && npm cache clean --force + +FROM ${RUNTIME_NODE_IMAGE} AS runtime +ENV NODE_ENV=production \ + CCR_DATA_DIR=/data \ + CCR_WEB_HOST=127.0.0.1 \ + CCR_WEB_PORT=3459 \ + CCR_NGINX_PORT=8080 \ + CCR_GATEWAY_HOST=127.0.0.1 \ + CCR_GATEWAY_PORT=3456 \ + CCR_GATEWAY_CORE_PORT=3457 \ + CCR_PUBLIC_HOST=127.0.0.1 \ + CCR_PUBLIC_PORT=3458 + +WORKDIR /app + +RUN apt-get update \ + && apt-get install -y --no-install-recommends ca-certificates libstdc++6 nginx \ + && rm -rf /var/lib/apt/lists/* \ + && rm -f /etc/nginx/sites-enabled/default /etc/nginx/conf.d/default.conf \ + && rm -rf \ + /opt/yarn-* \ + /usr/local/bin/corepack \ + /usr/local/bin/npm \ + /usr/local/bin/npx \ + /usr/local/bin/yarn \ + /usr/local/bin/yarnpkg \ + /usr/local/include/node \ + /usr/local/lib/node_modules/corepack \ + /usr/local/lib/node_modules/npm \ + /usr/local/share/doc \ + /usr/local/share/man + +COPY package.json package-lock.json ./ +COPY packages/core/package.json packages/core/package.json +COPY --from=production-deps /app/node_modules node_modules + +COPY --from=build /app/packages/core/dist packages/core/dist +COPY --from=build /app/packages/ui/dist/renderer /usr/share/nginx/html +COPY docker/entrypoint.sh /usr/local/bin/ccr-docker-entrypoint +COPY docker/pm2.config.cjs docker/pm2.config.cjs + +RUN chmod +x /usr/local/bin/ccr-docker-entrypoint \ + && mkdir -p /data /run/nginx /var/lib/nginx /var/log/nginx + +VOLUME ["/data"] +EXPOSE 8080 + +HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ + CMD node -e "fetch('http://127.0.0.1:' + (process.env.CCR_NGINX_PORT || '8080') + '/').then((r) => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))" + +ENTRYPOINT ["ccr-docker-entrypoint"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ea7e8ac --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 musistudio + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..f32ddf1 --- /dev/null +++ b/README.md @@ -0,0 +1,392 @@ +

Claude Code Router

+ +

+ Chinese README + Discord + X + License + Desktop downloads + Documentation +

+ +
+ + + + + + + + +
+ + Kimi K2.7 Code sponsor banner + +
+ + Kimi Code Subscription +  ·  + API Global +  ·  + API China + +
+

+ Thanks to Kimi for sponsoring this project! Kimi K2.7 Code is an open-source, coding-focused agentic model developed by Moonshot AI, with substantial gains on real-world long-horizon coding tasks and higher end-to-end success across complex software engineering workflows. It also cuts thinking-token usage by approximately 30% compared with K2.6. Inside CCR, Kimi ships as built-in provider presets: import the pay-as-you-go API or the Kimi Code subscription in one click and route your coding agent's requests to Kimi, the subscription endpoint passes straight through natively with no protocol conversion, API endpoints are adapted automatically, and your balance and subscription usage show up right in the CCR dashboard. +

+

+ CCR already supports Kimi. Visit the Kimi Open Platform (中文站 | Global) to try the API, or explore the cost-effective Coding Plan. +

+
+ +
+ +Claude Code Router Desktop is a local gateway and desktop control panel for routing agent requests from Claude Code, Codex, ZCode, and compatible clients to the model provider you actually want to use. + +

+ Claude Code Router Desktop screenshot +

+ +## Why Use CCR + +- Use one local endpoint for multiple agent tools instead of configuring every client separately. +- Route requests with default routing, conditional rules, fallback targets, and request rewrites instead of editing client configuration by hand. +- Mix providers without changing your workflow. CCR supports OpenAI-compatible APIs, Anthropic Messages, Gemini Generate Content, OpenRouter, DeepSeek, SiliconFlow, Moonshot, Kimi Code, Mistral, Z.AI, Bailian, and custom providers. +- Control cost and reliability with fallback routing, API key rotation, usage statistics, and request logs. + +## Features + +- **Overview dashboard**: inspect system status, usage widgets, account balances, model distribution, and share cards. +- **Provider management**: add provider presets or custom endpoints, probe protocol support, test model connectivity, manage credentials, and monitor supported account balances where available. +- **Routing rules**: configure default routing, conditional and model-prefix rules, fallback handling, and request rewrites. +- **Agent Config**: configure Claude Code, Codex, and ZCode launch entries, models, scopes, and multi-instance app profiles. +- **Gateway compatibility**: translate supported client requests through the local CCR model gateway. +- **Proxy mode**: capture supported API traffic through a local proxy with optional system proxy integration and network capture. +- **Fusion models**: combine a base model with vision, web search, or MCP tools into a reusable selectable model. + +## Documentation + +Read the full documentation at [ccrdesk.top](https://ccrdesk.top/). + +## Download And Install + +1. Open the [GitHub Releases page](https://github.com/musistudio/claude-code-router/releases). +2. Download the package for your platform: + - macOS Apple Silicon: `Claude-Code-Router_-mac-Apple-Silicon-arm64.dmg` or `.zip` + - macOS Intel: `Claude-Code-Router_-mac-Intel-x64.dmg` or `.zip` + - Windows: `Claude Code Router_.exe` + - Linux: `Claude Code Router_.AppImage` +3. Install and launch **Claude Code Router**. +4. On first launch, CCR creates its local configuration database: + - macOS/Linux: `~/.claude-code-router/config.sqlite` + - Windows: `%APPDATA%\Claude Code Router\config.sqlite` + +CCR stores runtime configuration in SQLite. A legacy `config.json` is read only once for migration when no SQLite config exists. + +After the service is started from the **Server** page, CCR listens on `http://localhost:8080` by default. The **Server** page controls the gateway `Host`, `Port`, proxy mode, system proxy, network capture, and CA certificate status. + +## Quick Start + +CCR can be configured entirely from the desktop UI. Use this setup order for a clean first run. + +### 1. Add a provider + +Open **Providers**, click **Add Provider**, then choose a built-in preset or **Other / custom API endpoint**. Fill in the provider name, base URL, protocol, API key, and model list. Run protocol probing and model connectivity checks when available, then save the provider. + +### 2. Configure routing + +Open **Routing** to add conditional rules, configure request rewrites, and set fallback behavior. + +Use **Add Routing Rule** for request conditions, model-prefix routing, or rule-level fallback targets. + +### 3. Start the gateway + +Open **Server** and click **Start**. After the page shows Running, CCR listens on `http://localhost:8080`. Enable **Auto start** if you want CCR to start the local gateway whenever the desktop app opens. + +### 4. Connect your agent tool + +Open **Agent Config** and choose the client you want to use. Configure Claude Code, Codex, or ZCode, select the target model and effect scope, then apply the config. For app entries, use the **Open Agent** action to open the target app through CCR. + +### 5. Monitor and adjust + +Use **Settings → Logs & Observability** to enable request logs and agent observability. Use **Logs** to confirm `request model`, `resolved provider`, `resolved model`, status, tokens, latency, and errors; use the tray window for quick token and account status. + +## Acknowledgements + +Codex support is powered by [musistudio/codexl](https://github.com/musistudio/codexl). + +## Support & Sponsoring + +
+ +

If you find this project helpful, please consider sponsoring its development. Your support is greatly appreciated.

+ + + + + + +
+ + Support on Ko-fi + +
+ One-time support via Ko-fi +
+ + Sponsor with PayPal + +
+ International sponsorship +
+ + + + + + +
+ Alipay +
+ Alipay QR code +
+ WeChat Pay +
+ WeChat Pay QR code +
+ +
+ +### Our Sponsors + +
+ +

A huge thank you to all our sponsors for their generous support.

+ + + + + + + + + + + + + + + + + + +
+ + Zhipu icon +
+ Z智谱 +
+
+ + AIHubmix icon +
+ AIHubmix +
+
+ + BurnCloud icon +
+ BurnCloud +
+
+ + 302.AI icon +
+ 302.AI +
+
+ + RunAPI icon +
+ RunAPI +
+
+ + TeamoRouter icon +
+ TeamoRouter +
+
+ + code0.ai icon +
+ code0.ai +
+
+ + claudeapi icon +
+ claudeapi +
+
+ + Qiniu Cloud AI icon +
+ Qiniu Cloud AI +
+
+ + Fenno.ai icon +
+ Fenno.ai +
+
+ +

Community Sponsors

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
@Simon Leischnig@duanshuaimin@vrgitadmin@*o@ceilwoo@*说
@*更@K*g@R*R@bobleer@*苗@*划
@Clarence-pan@carter003@S*r@*晖@*敏@Z*z
@*然@cluic@*苗@PromptExpert@*应@yusnake
@*飞@董*@*汀@*涯@*:-)@**磊
@*琢@*成@Z*o@*琨@congzhangzh@*_
@Z*m@*鑫@c*y@*昕@witsice@b*g
@*亿@*辉@JACK@*光@W*l@kesku
@biguncle@二吉吉@a*g@*林@*咸@*明
@S*y@f*o@*智@F*t@r*c@qierkang
@*军@snrise-z@*王@greatheart1000@*王@zcutlip
@Peng-YM@*更@*.@F*t@*政@*铭
@*叶@七*o@*青@**晨@*远@*霄
@**吉@**飞@**驰@x*g@**东@*落
@哆*k@*涛@苗大@*呢@d*u@crizcraig
s*s*火*勤**锟*涛**明
*知*语*瓜
+ +If your name is masked, please contact me via my homepage email to update it with your GitHub username. + +
+ +## License + +This project is licensed under the [MIT License](LICENSE). diff --git a/README.wehub.md b/README.wehub.md new file mode 100644 index 0000000..77256fa --- /dev/null +++ b/README.wehub.md @@ -0,0 +1,7 @@ +# WeHub 来源说明 + +- 原始项目:`musistudio/claude-code-router` +- 原始仓库:https://github.com/musistudio/claude-code-router +- 导入方式:上游默认分支的最新快照 +- 原作者、版权和许可证信息以原始仓库及本仓库 LICENSE 为准 +- 本文件仅用于记录来源,不代表 WeHub 是原项目作者 diff --git a/README_zh.md b/README_zh.md new file mode 100644 index 0000000..7065c54 --- /dev/null +++ b/README_zh.md @@ -0,0 +1,391 @@ +

Claude Code Router

+ +

+ English README + Discord + X + License + 桌面端下载次数 + 文档 +

+ +
+ + + + + + + + +
+ + Kimi K2.7 Code 赞助横幅 + +
+ + Kimi Code 订阅 +  ·  + API 中文站 +  ·  + API Global + +
+

+ 感谢 Kimi 赞助本项目!Kimi K2.7 Code 是 Moonshot AI 推出的编程专用开源智能体模型,在真实长程编程与复杂软件工程工作流中显著提升端到端任务成功率,同时优化推理效率,相比 K2.6 平均减少约 30% 的推理 token 消耗。在 CCR 中,Kimi 已作为内置供应商预设开箱即用:无论按量付费 API 还是 Kimi Code 订阅,一键导入即可把你的编程 Agent 请求路由到 Kimi,订阅端点原生直通、无需协议转换,API 端点自动适配,账户余额与订阅用量也能直接在 CCR 面板中查看。 +

+

+ CCR 已内置 Kimi 供应商预设。前往 Kimi 开放平台(中文站Global)体验 API,或了解高性价比 Coding Plan 套餐。 +

+
+ +
+ +Claude Code Router Desktop 是一个本地网关和桌面控制台,用来把 Claude Code、Codex、ZCode 以及兼容客户端的 Agent 请求路由到你真正想使用的模型服务。 + +

+ Claude Code Router Desktop 项目截图 +

+ +## 为什么使用 CCR + +- 用一个本地入口连接多个 Agent 工具,不需要在每个客户端里重复配置 Provider。 +- 在不改变工作流的情况下混用不同 Provider。CCR 支持 OpenAI 兼容 API、Anthropic Messages、Gemini Generate Content、OpenRouter、DeepSeek、SiliconFlow、Moonshot、Kimi Code、Mistral、Z.AI、百炼以及自定义 Provider。 +- 通过 fallback 路由、API Key 轮换、用量统计和请求日志来控制成本和可靠性。 + +## 功能和特性 + +- **概览仪表盘**:查看系统状态、用量组件、账号余额、模型分布和分享卡片。 +- **Provider 管理**:添加预设或自定义端点,探测协议支持,检测模型连通性,管理凭据,并在可用时查看账号余额。 +- **路由规则**:配置条件路由、模型前缀规则、失败降级和请求改写。 +- **Agent配置**:为 Claude Code、Codex 和 ZCode 配置启动入口、模型、作用范围和多开 App 配置。 +- **网关兼容层**:通过本地 CCR 模型网关转换支持的客户端请求。 +- **代理模式**:通过本地代理捕获支持的 API 流量,可选系统代理和网络捕获。 +- **Fusion 组合模型**:把基础模型与视觉、联网搜索或 MCP 工具组合成新的可选模型。 + +## 文档 + +完整文档见 [ccrdesk.top](https://ccrdesk.top/)。 + +## 下载和安装 + +1. 打开 [GitHub Releases 页面](https://github.com/musistudio/claude-code-router/releases)。 +2. 按系统下载对应安装包: + - macOS Apple 芯片:`Claude-Code-Router_-mac-Apple-Silicon-arm64.dmg` 或 `.zip` + - macOS Intel 芯片:`Claude-Code-Router_-mac-Intel-x64.dmg` 或 `.zip` + - Windows:`Claude Code Router_.exe` + - Linux:`Claude Code Router_.AppImage` +3. 安装并启动 **Claude Code Router**。 +4. 首次启动后,CCR 会创建本地配置数据库: + - macOS/Linux:`~/.claude-code-router/config.sqlite` + - Windows:`%APPDATA%\Claude Code Router\config.sqlite` + +CCR 的运行配置存储在 SQLite 中。旧版 `config.json` 只会在没有 SQLite 配置时作为迁移来源读取一次。 + +从 **服务** 页面启动后,CCR 默认监听 `http://localhost:8080`。**服务** 页面负责配置网关 `Host`、`Port`、代理模式、系统代理、网络捕获和 CA 证书状态。 + +## 快速开始 + +CCR 可以完全通过桌面 UI 完成配置。首次使用建议按下面顺序操作。 + +### 1. 添加 Provider + +打开 **供应商**,点击 **添加供应商**,选择内置预设或 **其他 / 自定义 API 端点**。按表单填写 Provider 名称、基础 URL、协议、API Key 和模型列表。可用时先运行协议探测和模型连通性检查,然后保存 Provider。 + +### 2. 设置路由 + +打开 **路由**,添加条件规则,配置请求改写和失败降级。 + +如果需要更细粒度控制,使用 **添加路由规则** 添加模型前缀、请求条件或规则级失败降级目标。 + +### 3. 启动网关 + +打开 **服务**,点击 **启动**。页面显示运行中后,CCR 会在本机监听 `http://localhost:8080`。如果希望每次打开桌面应用时自动启动网关,可以启用自动启动。 + +### 4. 连接 Agent 工具 + +打开 **Agent配置**,选择要使用的客户端。配置 Claude Code、Codex 或 ZCode,选择目标模型和作用范围,然后应用配置。对于 App 入口,可以使用 **打开 Agent** 操作通过 CCR 打开目标应用。 + +### 5. 日常查看和调整 + +到 **设置 → 日志与观测** 打开请求日志和 Agent 观测。使用 **日志** 确认 `request model`、`resolved provider`、`resolved model`、状态码、tokens、耗时和错误;使用托盘窗口快速查看 Token 和账号状态。 + +## 致谢 + +对 Codex 的支持来自于 [musistudio/codexl](https://github.com/musistudio/codexl) 这个项目。 + +## 支持与赞助 + +
+ +

如果你觉得这个项目有帮助,欢迎赞助项目开发。非常感谢你的支持。

+ + + + + + +
+ + 通过 Ko-fi 赞助 + +
+ 通过 Ko-fi 单次赞助 +
+ + 通过 PayPal 赞助 + +
+ 国际赞助通道 +
+ + + + + + +
+ 支付宝 +
+ 支付宝收款码 +
+ 微信支付 +
+ 微信支付收款码 +
+ +
+ +### 我们的赞助商 + +
+ +

非常感谢所有赞助商的慷慨支持。

+ + + + + + + + + + + + + + + + + + +
+ + 智谱图标 +
+ Z智谱 +
+
+ + AIHubmix 图标 +
+ AIHubmix +
+
+ + BurnCloud 图标 +
+ BurnCloud +
+
+ + 302.AI 图标 +
+ 302.AI +
+
+ + RunAPI 图标 +
+ RunAPI +
+
+ + TeamoRouter 图标 +
+ TeamoRouter +
+
+ + code0.ai 图标 +
+ code0.ai +
+
+ + claudeapi 图标 +
+ claudeapi +
+
+ + 七牛云 AI 图标 +
+ 七牛云 AI +
+
+ + Fenno.ai 图标 +
+ Fenno.ai +
+
+ +

社区赞助者

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
@Simon Leischnig@duanshuaimin@vrgitadmin@*o@ceilwoo@*说
@*更@K*g@R*R@bobleer@*苗@*划
@Clarence-pan@carter003@S*r@*晖@*敏@Z*z
@*然@cluic@*苗@PromptExpert@*应@yusnake
@*飞@董*@*汀@*涯@*:-)@**磊
@*琢@*成@Z*o@*琨@congzhangzh@*_
@Z*m@*鑫@c*y@*昕@witsice@b*g
@*亿@*辉@JACK@*光@W*l@kesku
@biguncle@二吉吉@a*g@*林@*咸@*明
@S*y@f*o@*智@F*t@r*c@qierkang
@*军@snrise-z@*王@greatheart1000@*王@zcutlip
@Peng-YM@*更@*.@F*t@*政@*铭
@*叶@七*o@*青@**晨@*远@*霄
@**吉@**飞@**驰@x*g@**东@*落
@哆*k@*涛@苗大@*呢@d*u@crizcraig
s*s*火*勤**锟*涛**明
*知*语*瓜
+ +如果你的名字被打码,请通过我的主页邮箱联系我更新为 GitHub 用户名。 + +
+ +## 许可证 + +本项目基于 [MIT License](LICENSE) 发布。 diff --git a/blog/en/maybe-we-can-do-more-with-the-route.md b/blog/en/maybe-we-can-do-more-with-the-route.md new file mode 100644 index 0000000..70596e1 --- /dev/null +++ b/blog/en/maybe-we-can-do-more-with-the-route.md @@ -0,0 +1,105 @@ +# Maybe We Can Do More with the Router + +Since the release of `claude-code-router`, I’ve received a lot of user feedback, and quite a few issues are still open. Most of them are related to support for different providers and the lack of tool usage from the deepseek model. + +Originally, I created this project for personal use, mainly to access claude code at a lower cost. So, multi-provider support wasn’t part of the initial design. But during troubleshooting, I discovered that even though most providers claim to be compatible with the OpenAI-style `/chat/completions` interface, there are many subtle differences. For example: + +1. When Gemini's tool parameter type is string, the `format` field only supports `date` and `date-time`, and there’s no tool call ID. + +2. OpenRouter requires `cache_control` for caching. + +3. The official DeepSeek API has a `max_output` of 8192, but Volcano Engine’s limit is even higher. + +Aside from these, smaller providers often have quirks in their parameter handling. So I decided to create a new project, [musistudio/llms](https://github.com/musistudio/llms), to deal with these compatibility issues. It uses the OpenAI format as a base and introduces a generic Transformer interface for transforming both requests and responses. + +Once a `Transformer` is implemented for each provider, it becomes possible to mix-and-match requests between them. For example, I implemented bidirectional conversion between Anthropic and OpenAI formats in `AnthropicTransformer`, which listens to the `/v1/messages` endpoint. Similarly, `GeminiTransformer` handles Gemini <-> OpenAI format conversions and listens to `/v1beta/models/:modelAndAction`. + +When both requests and responses are transformed into a common format, they can interoperate seamlessly: + +``` +AnthropicRequest -> AnthropicTransformer -> OpenAIRequest -> GeminiTransformer -> GeminiRequest -> GeminiServer +``` + +``` +GeminiResponse -> GeminiTransformer -> OpenAIResponse -> AnthropicTransformer -> AnthropicResponse +``` + +Using a middleware layer to smooth out differences may introduce some performance overhead, but the main goal here is to enable `claude-code-router` to support multiple providers. + +As for the issue of DeepSeek’s lackluster tool usage — I found that it stems from poor instruction adherence in long conversations. Initially, the model actively calls tools, but after several rounds, it starts responding with plain text instead. My first workaround was injecting a system prompt to remind the model to use tools proactively. But in long contexts, the model tends to forget this instruction. + +After reading the DeepSeek documentation, I noticed it supports the `tool_choice` parameter, which can be set to `"required"` to force the model to use at least one tool. I tested this by enabling the parameter, and it significantly improved the model’s tool usage. We can remove the setting when it's no longer necessary. With the help of the `Transformer` interface in [musistudio/llms](https://github.com/musistudio/llms), we can modify the request before it’s sent and adjust the response after it’s received. + +Inspired by the Plan Mode in `claude code`, I implemented a similar Tool Mode for DeepSeek: + +```typescript +export class TooluseTransformer implements Transformer { + name = "tooluse"; + + transformRequestIn(request: UnifiedChatRequest): UnifiedChatRequest { + if (request.tools?.length) { + request.messages.push({ + role: "system", + content: `Tool mode is active. The user expects you to proactively execute the most suitable tool to help complete the task. +Before invoking a tool, you must carefully evaluate whether it matches the current task. If no available tool is appropriate for the task, you MUST call the \`ExitTool\` to exit tool mode — this is the only valid way to terminate tool mode. +Always prioritize completing the user's task effectively and efficiently by using tools whenever appropriate.`, + }); + request.tool_choice = "required"; + request.tools.unshift({ + type: "function", + function: { + name: "ExitTool", + description: `Use this tool when you are in tool mode and have completed the task. This is the only valid way to exit tool mode. +IMPORTANT: Before using this tool, ensure that none of the available tools are applicable to the current task. You must evaluate all available options — only if no suitable tool can help you complete the task should you use ExitTool to terminate tool mode. +Examples: +1. Task: "Use a tool to summarize this document" — Do not use ExitTool if a summarization tool is available. +2. Task: "What’s the weather today?" — If no tool is available to answer, use ExitTool after reasoning that none can fulfill the task.`, + parameters: { + type: "object", + properties: { + response: { + type: "string", + description: + "Your response will be forwarded to the user exactly as returned — the tool will not modify or post-process it in any way.", + }, + }, + required: ["response"], + }, + }, + }); + } + return request; + } + + async transformResponseOut(response: Response): Promise { + if (response.headers.get("Content-Type")?.includes("application/json")) { + const jsonResponse = await response.json(); + if ( + jsonResponse?.choices[0]?.message.tool_calls?.length && + jsonResponse?.choices[0]?.message.tool_calls[0]?.function?.name === + "ExitTool" + ) { + const toolArguments = JSON.parse(toolCall.function.arguments || "{}"); + jsonResponse.choices[0].message.content = toolArguments.response || ""; + delete jsonResponse.choices[0].message.tool_calls; + } + + // Handle non-streaming response if needed + return new Response(JSON.stringify(jsonResponse), { + status: response.status, + statusText: response.statusText, + headers: response.headers, + }); + } else if (response.headers.get("Content-Type")?.includes("stream")) { + // ... + } + return response; + } +} +``` + +This transformer ensures the model calls at least one tool. If no tools are appropriate or the task is finished, it can exit using `ExitTool`. Since this relies on the `tool_choice` parameter, it only works with models that support it. + +In practice, this approach noticeably improves tool usage for DeepSeek. The tradeoff is that sometimes the model may invoke irrelevant or unnecessary tools, which could increase latency and token usage. + +This update is just a small experiment — adding an `“agent”` to the router. Maybe there are more interesting things we can explore from here. \ No newline at end of file diff --git a/blog/en/progressive-disclosure-of-agent-tools-from-the-perspective-of-cli-tool-style.md b/blog/en/progressive-disclosure-of-agent-tools-from-the-perspective-of-cli-tool-style.md new file mode 100644 index 0000000..cbaf115 --- /dev/null +++ b/blog/en/progressive-disclosure-of-agent-tools-from-the-perspective-of-cli-tool-style.md @@ -0,0 +1,154 @@ +# Progressive Disclosure of Agent Tools from the Perspective of CLI Tool Style + +It has been nearly two months since Anthropic released [Skills](https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills). In this release, Anthropic mentioned a term: Progressive Disclosure. What exactly is this? What problem does it solve? + +Actually, in my Vibe Coding workflow, I rarely use MCP. The reason is that I find the implementation quality of MCP to be inconsistent. At its core, it’s about context injection (the essence of tools is also context injection), and I’m not sure if prompts written by others might affect my workflow, so I simply avoid using it altogether. The current implementation of MCP essentially wraps all functionalities as tools exposed to the Agent (one functionality wrapped as one tool, given a detailed description, telling the agent when to call it and what the parameter format is). This has led to the current explosion of prompts. + +It wasn’t until Anthropic released Skills and I looked into it that I realized its essence is still prompt injection. If MCP provides a specification for injecting tools, then what Skills advocates is somewhat "unconventional." Skills provides a Markdown document to describe the purpose and best practices of the skill, along with some attached scripts (different from MCP). +![image](https://www.anthropic.com/_next/image?url=https%3A%2F%2Fwww-cdn.anthropic.com%2Fimages%2F4zrzovbb%2Fwebsite%2F6f22d8913dbc6228e7f11a41e0b3c124d817b6d2-1650x929.jpg&w=3840&q=75) + +Since these scripts run directly on the user’s local machine, there are significant security risks. If users cannot review the script code, it can easily lead to serious security issues such as data leakage or virus infections. Compared to MCP, which provides a standardized interface, Skills offer a series of script files. Different skills may have different types of script files—for example, some scripts are implemented in Node.js, while others use Python. To use these scripts, users also need to install the corresponding runtime and dependencies. This is why I describe it as "unconventional." + + +Is this really the best practice? + +Regarding Progressive Disclosure, here is how Anthropic describes it: +> Progressive disclosure is the core design principle that makes Agent Skills flexible and scalable. Like a well-organized manual that starts with a table of contents, then specific chapters, and finally a detailed appendix, skills let Claude load information only as needed: +> ![image](https://www.anthropic.com/_next/image?url=https%3A%2F%2Fwww-cdn.anthropic.com%2Fimages%2F4zrzovbb%2Fwebsite%2Fa3bca2763d7892982a59c28aa4df7993aaae55ae-2292x673.jpg&w=3840&q=75) +> Agents with a filesystem and code execution tools don’t need to read the entirety of a skill into their context window when working on a particular task. This means that the amount of context that can be bundled into a skill is effectively unbounded. + +The following diagram shows how the context window changes when a skill is triggered by a user’s message. +![image](https://www.anthropic.com/_next/image?url=https%3A%2F%2Fwww-cdn.anthropic.com%2Fimages%2F4zrzovbb%2Fwebsite%2F441b9f6cc0d2337913c1f41b05357f16f51f702e-1650x929.jpg&w=3840&q=75) + +Do we really need to implement it this way? + +In our daily use of CLI tools, most CLI tools come with a `--help` parameter for viewing the tool's usage and instructions. Isn't that essentially the tool's user manual? For example: +```shell +> npm --help +npm + +Usage: + +npm install install all the dependencies in your project +npm install add the dependency to your project +npm test run this project's tests +npm run run the script named +npm -h quick help on +npm -l display usage info for all commands +npm help search for help on +npm help npm more involved overview + +All commands: + + access, adduser, audit, bugs, cache, ci, completion, + config, dedupe, deprecate, diff, dist-tag, docs, doctor, + edit, exec, explain, explore, find-dupes, fund, get, help, + help-search, hook, init, install, install-ci-test, + install-test, link, ll, login, logout, ls, org, outdated, + owner, pack, ping, pkg, prefix, profile, prune, publish, + query, rebuild, repo, restart, root, run-script, sbom, + search, set, shrinkwrap, star, stars, start, stop, team, + test, token, uninstall, unpublish, unstar, update, version, + view, whoami + +Specify configs in the ini-formatted file: + /Users/xxx/.npmrc +or on the command line via: npm --key=value + +More configuration info: npm help config +Configuration fields: npm help 7 config +``` + +This manual doesn't return every possible usage of every command either. It only lists which commands are available and what functions they can perform. For the specific usage of a command, you can still obtain it by using the `--help` parameter: +```shell +> npm install --help +Install a package + +Usage: +npm install [ ...] + +Options: +[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle] +[-E|--save-exact] [-g|--global] +[--install-strategy ] [--legacy-bundling] +[--global-style] [--omit [--omit ...]] +[--include [--include ...]] +[--strict-peer-deps] [--prefer-dedupe] [--no-package-lock] [--package-lock-only] +[--foreground-scripts] [--ignore-scripts] [--no-audit] [--no-bin-links] +[--no-fund] [--dry-run] [--cpu ] [--os ] [--libc ] +[-w|--workspace [-w|--workspace ...]] +[-ws|--workspaces] [--include-workspace-root] [--install-links] + +aliases: add, i, in, ins, inst, insta, instal, isnt, isnta, isntal, isntall + +Run "npm help install" for more info +``` +Doesn't this resemble the definition of progressive disclosure mentioned above? + +Can we implement an MCP in this style to achieve progressive disclosure of tools without needing skills? I used Codex to convert the official PDF Skill into an MCP, exposing only a single tool: +```json +{ + "name": "mcp__pdf__pdf", + "description": "Comprehensive PDF manipulation toolkit for extracting text and tables, creating new PDFs, merging/splitting documents, and handling forms. When Claude needs to fill in a PDF form or programmatically process, generate, or analyze PDF documents at scale.You need to pass in the --help parameter to obtain the usage of this tool first.", + "input_schema": { + "type": "object", + "properties": { + "params": { + "$ref": "#/$defs/PdfCommandInput" + } + }, + "required": [ + "params" + ], + "$defs": { + "PdfCommandInput": { + "additionalProperties": false, + "properties": { + "argv": { + "description": "Command tokens excluding the leading 'pdf' executable name", + "items": { + "type": "string" + }, + "title": "Argv", + "type": "array" + }, + "command": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional command string; if set, it will be split like a shell", + "title": "Command" + } + }, + "title": "PdfCommandInput", + "type": "object" + } + }, + "title": "pdfArguments" + } +} +``` + +Below is the change in the context window when using this MCP: +```json +User: Extract all the text from test.pdf and write it into result.txt +Agent: Tool(name="pdf", args=["--help"]) +Tool: pdf - Comprehensive PDF manipulation toolkit for extracting text and tables, creating new PDFs, merging/splitting documents, and handling forms. When Claude needs to fill in a PDF form or programmatically process, generate, or analyze PDF documents at scale在使用之前你需要先传入--help参数以获取该工具的用法\n\nUsage:\n pdf [--help] [options]\n\nDomains:\n forms Fill, extract, and validate PDF form fields.\n documents Create, merge, and split PDFs.\n text Extract text content from PDFs.\n tables Extract tables (heuristic, whitespace-based).\n images Render PDF pages to PNG images.\n\nRun `pdf --help` for domain help.\nRun `pdf --help` for command help. +Agent: Tool(name="pdf", args=["text", "--help"]) +Tool: text - Extract text content from PDFs.\n\nUsage:\n pdf text [options]\n\nCommands:\n extract Extract text content from a PDF.\n\nRun `pdf text --help` for details. +Agent: Tool(name="pdf", args=["text", "extract", "--help"]) +Tool: usage: pdf text extract --pdf PDF_PATH [--pages PAGES] [--out OUTPUT_PATH]\n [--format {text,json}] [--overwrite]\n\nExtract text content from a PDF.\n\noptions:\n --pdf PDF_PATH Input PDF\n --pages PAGES Page selection like 1,3-5 or 'all' (default: all)\n --out OUTPUT_PATH Write extracted text to a file\n --format {text,json} Output format (default: text)\n --overwrite Overwrite output file if it exists\n +Agent: Tool(name="pdf", args=["text", "extract", "--pdf", "test.pdf", "--out", "result.txt", "--overwrite"]) +Tool: {"result": {"stdout": "xx","data": {"pdf_path": "test.pdf","page_count": 6,"pages": [xxx],"format": "text","output_path": "result.txt"}}} +Agent: xxx +``` + +From the perspective of context changes, progressive disclosure has been fully realized. This MCP code is open-source (entirely written by Codex, serving only to validate the idea without any review): https://github.com/musistudio/pdf-skill-mcp + +If you have any thoughts or ideas, I’d also welcome the opportunity to discuss them with you. email: [m@musiiot.top](mailto://m@musiiot.top ) diff --git a/blog/en/project-motivation-and-how-it-works.md b/blog/en/project-motivation-and-how-it-works.md new file mode 100644 index 0000000..09882c4 --- /dev/null +++ b/blog/en/project-motivation-and-how-it-works.md @@ -0,0 +1,103 @@ +# Project Motivation and Principles + +As early as the day after Claude Code was released (2025-02-25), I began and completed a reverse engineering attempt of the project. At that time, using Claude Code required registering for an Anthropic account, applying for a waitlist, and waiting for approval. However, due to well-known reasons, Anthropic blocks users from mainland China, making it impossible for me to use the service through normal means. Based on known information, I discovered the following: + +1. Claude Code is installed via npm, so it's very likely developed with Node.js. +2. Node.js offers various debugging methods: simple `console.log` usage, launching with `--inspect` to hook into Chrome DevTools, or even debugging obfuscated code using `d8`. + +My goal was to use Claude Code without an Anthropic account. I didn’t need the full source code—just a way to intercept and reroute requests made by Claude Code to Anthropic’s models to my own custom endpoint. So I started the reverse engineering process: + +1. First, install Claude Code: +```bash +npm install -g @anthropic-ai/claude-code +``` + +2. After installation, the project is located at `~/.nvm/versions/node/v20.10.0/lib/node_modules/@anthropic-ai/claude-code`(this may vary depending on your Node version manager and version). + +3. Open the package.json to analyze the entry point: +```package.json +{ + "name": "@anthropic-ai/claude-code", + "version": "1.0.24", + "main": "sdk.mjs", + "types": "sdk.d.ts", + "bin": { + "claude": "cli.js" + }, + "engines": { + "node": ">=18.0.0" + }, + "type": "module", + "author": "Boris Cherny ", + "license": "SEE LICENSE IN README.md", + "description": "Use Claude, Anthropic's AI assistant, right from your terminal. Claude can understand your codebase, edit files, run terminal commands, and handle entire workflows for you.", + "homepage": "https://github.com/anthropics/claude-code", + "bugs": { + "url": "https://github.com/anthropics/claude-code/issues" + }, + "scripts": { + "prepare": "node -e \"if (!process.env.AUTHORIZED) { console.error('ERROR: Direct publishing is not allowed.\\nPlease use the publish-external.sh script to publish this package.'); process.exit(1); }\"", + "preinstall": "node scripts/preinstall.js" + }, + "dependencies": {}, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "^0.33.5", + "@img/sharp-darwin-x64": "^0.33.5", + "@img/sharp-linux-arm": "^0.33.5", + "@img/sharp-linux-arm64": "^0.33.5", + "@img/sharp-linux-x64": "^0.33.5", + "@img/sharp-win32-x64": "^0.33.5" + } +} +``` + +The key entry is `"claude": "cli.js"`. Opening cli.js, you'll see the code is minified and obfuscated. But using WebStorm’s `Format File` feature, you can reformat it for better readability: +![webstorm-formate-file](../images/webstorm-formate-file.png) + +Now you can begin understanding Claude Code’s internal logic and prompt structure by reading the code. To dig deeper, you can insert console.log statements or launch in debug mode with Chrome DevTools using: + +```bash +NODE_OPTIONS="--inspect-brk=9229" claude +``` + +This command starts Claude Code in debug mode and opens port 9229. Visit chrome://inspect/ in Chrome and click inspect to begin debugging: +![chrome-devtools](../images/chrome-inspect.png) +![chrome-devtools](../images/chrome-devtools.png) + +By searching for the keyword api.anthropic.com, you can easily locate where Claude Code makes its API calls. From the surrounding code, it's clear that baseURL can be overridden with the `ANTHROPIC_BASE_URL` environment variable, and `apiKey` and `authToken` can be configured similarly: +![search](../images/search.png) + +So far, we’ve discovered some key information: + +1. Environment variables can override Claude Code's `baseURL` and `apiKey`. + +2. Claude Code adheres to the Anthropic API specification. + +Therefore, we need: +1. A service to convert OpenAI API–compatible requests into Anthropic API format. + +2. Set the environment variables before launching Claude Code to redirect requests to this service. + +Thus, `claude-code-router` was born. This project uses `Express.js` to implement the `/v1/messages` endpoint. It leverages middlewares to transform request/response formats and supports request rewriting (useful for prompt tuning per model). + +Back in February, the full DeepSeek model series had poor support for Function Calling, so I initially used `qwen-max`. It worked well—but without KV cache support, it consumed a large number of tokens and couldn’t provide the native `Claude Code` experience. + +So I experimented with a Router-based mode using a lightweight model to dispatch tasks. The architecture included four roles: `router`, `tool`, `think`, and `coder`. Each request passed through a free lightweight model that would decide whether the task involved reasoning, coding, or tool usage. Reasoning and coding tasks looped until a tool was invoked to apply changes. However, the lightweight model lacked the capability to route tasks accurately, and architectural issues prevented it from effectively driving Claude Code. + +Everything changed at the end of May when the official Claude Code was launched, and `DeepSeek-R1` model (released 2025-05-28) added Function Call support. I redesigned the system. With the help of AI pair programming, I fixed earlier request/response transformation issues—especially the handling of models that return JSON instead of Function Call outputs. + +This time, I used the `DeepSeek-V3` model. It performed better than expected: supporting most tool calls, handling task decomposition and stepwise planning, and—most importantly—costing less than one-tenth the price of Claude 3.5 Sonnet. + +The official Claude Code organizes agents differently from the beta version, so I restructured my Router mode to include four roles: the default model, `background`, `think`, and `longContext`. + +- The default model handles general tasks and acts as a fallback. + +- The `background` model manages lightweight background tasks. According to Anthropic, Claude Haiku 3.5 is often used here, so I routed this to a local `ollama` service. + +- The `think` model is responsible for reasoning and planning mode tasks. I use `DeepSeek-R1` here, though it doesn’t support cost control, so `Think` and `UltraThink` behave identically. + +- The `longContext` model handles long-context scenarios. The router uses `tiktoken` to calculate token lengths in real time, and if the context exceeds 32K, it switches to this model to compensate for DeepSeek's long-context limitations. + +This describes the evolution and reasoning behind the project. By cleverly overriding environment variables, we can forward and modify requests without altering Claude Code’s source—allowing us to benefit from official updates while using our own models and custom prompts. + +This project offers a practical approach to running Claude Code under Anthropic’s regional restrictions, balancing `cost`, `performance`, and `customizability`. That said, the official `Max Plan` still offers the best experience if available. \ No newline at end of file diff --git a/blog/images/alipay.jpg b/blog/images/alipay.jpg new file mode 100644 index 0000000..546f7ae Binary files /dev/null and b/blog/images/alipay.jpg differ diff --git a/blog/images/chrome-devtools.png b/blog/images/chrome-devtools.png new file mode 100644 index 0000000..9a5548b Binary files /dev/null and b/blog/images/chrome-devtools.png differ diff --git a/blog/images/chrome-inspect.png b/blog/images/chrome-inspect.png new file mode 100644 index 0000000..c629700 Binary files /dev/null and b/blog/images/chrome-inspect.png differ diff --git a/blog/images/claude-code-router-img.png b/blog/images/claude-code-router-img.png new file mode 100644 index 0000000..63c7785 Binary files /dev/null and b/blog/images/claude-code-router-img.png differ diff --git a/blog/images/claude-code-router.png b/blog/images/claude-code-router.png new file mode 100644 index 0000000..c45ce43 Binary files /dev/null and b/blog/images/claude-code-router.png differ diff --git a/blog/images/claude-code.png b/blog/images/claude-code.png new file mode 100644 index 0000000..551c115 Binary files /dev/null and b/blog/images/claude-code.png differ diff --git a/blog/images/roadmap.svg b/blog/images/roadmap.svg new file mode 100644 index 0000000..0403023 --- /dev/null +++ b/blog/images/roadmap.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + New Documentation + Clear structure, examples & best practices + + + + + + + + + + + + Plugin Marketplace + Community submissions, ratings & version constraints + + + + + + + + + + + + One More Thing + 🚀 Confidential project · Revealing soon + + + + + + + + + diff --git a/blog/images/search.png b/blog/images/search.png new file mode 100644 index 0000000..77e49bc Binary files /dev/null and b/blog/images/search.png differ diff --git a/blog/images/sponsors/glm-en.jpg b/blog/images/sponsors/glm-en.jpg new file mode 100644 index 0000000..7994bf9 Binary files /dev/null and b/blog/images/sponsors/glm-en.jpg differ diff --git a/blog/images/sponsors/glm-zh.jpg b/blog/images/sponsors/glm-zh.jpg new file mode 100644 index 0000000..88c2178 Binary files /dev/null and b/blog/images/sponsors/glm-zh.jpg differ diff --git a/blog/images/statusline-config.png b/blog/images/statusline-config.png new file mode 100644 index 0000000..70d7746 Binary files /dev/null and b/blog/images/statusline-config.png differ diff --git a/blog/images/statusline.png b/blog/images/statusline.png new file mode 100644 index 0000000..36c6df4 Binary files /dev/null and b/blog/images/statusline.png differ diff --git a/blog/images/ui.png b/blog/images/ui.png new file mode 100644 index 0000000..2322b4a Binary files /dev/null and b/blog/images/ui.png differ diff --git a/blog/images/webstorm-formate-file.png b/blog/images/webstorm-formate-file.png new file mode 100644 index 0000000..97598b0 Binary files /dev/null and b/blog/images/webstorm-formate-file.png differ diff --git a/blog/images/wechat.jpg b/blog/images/wechat.jpg new file mode 100644 index 0000000..dac97e3 Binary files /dev/null and b/blog/images/wechat.jpg differ diff --git a/blog/images/wechat_group.jpg b/blog/images/wechat_group.jpg new file mode 100644 index 0000000..1f5d709 Binary files /dev/null and b/blog/images/wechat_group.jpg differ diff --git a/blog/zh/从CLI工具风格看工具渐进式披露.md b/blog/zh/从CLI工具风格看工具渐进式披露.md new file mode 100644 index 0000000..edc9587 --- /dev/null +++ b/blog/zh/从CLI工具风格看工具渐进式披露.md @@ -0,0 +1,299 @@ +# 从CLI工具风格看Agent工具渐进式披露 + +距离Anthropic发布[Skills](https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills)也过去将近两个月的时间了,其中Anthropic提到了一个术语渐进式披露(Progressive Disclosure),这到底是什么东西?解决了什么问题? + +其实在我的Vibe Coding流程中,我很少使用MCP。因为我觉得MCP实现质量层次不齐,本质是上下文注入(工具的本质也是上下文注入),我不确定别人写的提示词会不会影响到我的工作流,干脆直接不用。现在的MCP实现基本上就是把所有的功能全都包装成工具暴露给Agent(一个功能包装成一个工具,给定详细的描述,告诉agent在什么时候进行调用,参数格式是什么),这就导致了现在的提示词爆炸。 + +直到Anthropic发布了Skills,研究了一下发现本质仍然是提示词注入。如果说MCP是提供了一套注入工具的规范,那么Skills所提倡的则是“离经叛道”。Skills给了一个Markdown文档用于描述该skill的用途和最佳用法,附带提供了一些脚本(与MCP不同)。 +![image](https://www.anthropic.com/_next/image?url=https%3A%2F%2Fwww-cdn.anthropic.com%2Fimages%2F4zrzovbb%2Fwebsite%2F6f22d8913dbc6228e7f11a41e0b3c124d817b6d2-1650x929.jpg&w=3840&q=75) +由于这些脚本直接在用户本地运行,存在极大的安全风险。如果用户不能对脚本代码进行review,很容易造成数据泄露、感染病毒等严重安全性问题。相比于MCP提供一个标准化的接口,Skill提供一系列的脚本文件,不同的skill可能拥有不同类型的脚本文件,比如有些脚本使用node.js实现,有些脚本使用Python实现,要使用这些脚本还需要用户安装对应的运行时和脚本所需要的依赖。这也是我说“离经叛道”的原因所在。 + +这真的是最佳实践吗? + +关于渐进式披露,Anthropic是这样描述的: +> 渐进式披露是使代理技能灵活且可扩展的核心设计原则。就像一本组织良好的手册,从目录开始,然后是具体章节,最后是详细的附录一样,技能允许 Claude 仅在需要时加载信息: +> ![image](https://www.ant# 从CLI工具风格看Agent工具渐进式披露 + +距离Anthropic发布[Skills](https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills)也过去将近两个月的时间了,其中Anthropic提到了一个术语渐进式披露(Progressive Disclosure),这到底是什么东西?解决了什么问题? + +其实在我的Vibe Coding流程中,我很少使用MCP。因为我觉得MCP实现质量层次不齐,本质是上下文注入(工具的本质也是上下文注入),我不确定别人写的提示词会不会影响到我的工作流,干脆直接不用。现在的MCP实现基本上就是把所有的功能全都包装成工具暴露给Agent(一个功能包装成一个工具,给定详细的描述,告诉agent在什么时候进行调用,参数格式是什么),这就导致了现在的提示词爆炸。 + +直到Anthropic发布了Skills,研究了一下发现本质仍然是提示词注入。如果说MCP是提供了一套注入工具的规范,那么Skills所提倡的则是“离经叛道”。Skills给了一个Markdown文档用于描述该skill的用途和最佳用法,附带提供了一些脚本(与MCP不同)。 +![image](https://www.anthropic.com/_next/image?url=https%3A%2F%2Fwww-cdn.anthropic.com%2Fimages%2F4zrzovbb%2Fwebsite%2F6f22d8913dbc6228e7f11a41e0b3c124d817b6d2-1650x929.jpg&w=3840&q=75) +由于这些脚本直接在用户本地运行,存在极大的安全风险。如果用户不能对脚本代码进行review,很容易造成数据泄露、感染病毒等严重安全性问题。相比于MCP提供一个标准化的接口,Skill提供一系列的脚本文件,不同的skill可能拥有不同类型的脚本文件,比如有些脚本使用node.js实现,有些脚本使用Python实现,要使用这些脚本还需要用户安装对应的运行时和脚本所需要的依赖。这也是我说“离经叛道”的原因所在。 + +这真的是最佳实践吗? + +关于渐进式披露,Anthropic是这样描述的: +> 渐进式披露是使代理技能灵活且可扩展的核心设计原则。就像一本组织良好的手册,从目录开始,然后是具体章节,最后是详细的附录一样,技能允许 Claude 仅在需要时加载信息: +> ![image](https://www.anthropic.com/_next/image?url=https%3A%2F%2Fwww-cdn.anthropic.com%2Fimages%2F4zrzovbb%2Fwebsite%2Fa3bca2763d7892982a59c28aa4df7993aaae55ae-2292x673.jpg&w=3840&q=75) +> 拥有文件系统和代码执行工具的智能体在执行特定任务时,无需将技能的全部内容读取到上下文窗口中。这意味着技能中可以包含的上下文信息量实际上是无限的。 + +下图是使用Skill的上下文窗口变化 +![image](https://www.anthropic.com/_next/image?url=https%3A%2F%2Fwww-cdn.anthropic.com%2Fimages%2F4zrzovbb%2Fwebsite%2F441b9f6cc0d2337913c1f41b05357f16f51f702e-1650x929.jpg&w=3840&q=75) + +我们真的需要这样去实现吗? + +在我们平时使用CLI工具时,一般的CLI工具都会带有一个`--help`参数,用于查看该工具的用法和说明,这不就是该工具的使用手册吗?比如: +```shell +> npm --help +npm + +Usage: + +npm install install all the dependencies in your project +npm install add the dependency to your project +npm test run this project's tests +npm run run the script named +npm -h quick help on +npm -l display usage info for all commands +npm help search for help on +npm help npm more involved overview + +All commands: + + access, adduser, audit, bugs, cache, ci, completion, + config, dedupe, deprecate, diff, dist-tag, docs, doctor, + edit, exec, explain, explore, find-dupes, fund, get, help, + help-search, hook, init, install, install-ci-test, + install-test, link, ll, login, logout, ls, org, outdated, + owner, pack, ping, pkg, prefix, profile, prune, publish, + query, rebuild, repo, restart, root, run-script, sbom, + search, set, shrinkwrap, star, stars, start, stop, team, + test, token, uninstall, unpublish, unstar, update, version, + view, whoami + +Specify configs in the ini-formatted file: + /Users/xxx/.npmrc +or on the command line via: npm --key=value + +More configuration info: npm help config +Configuration fields: npm help 7 config +``` + +这份手册也不会返回所有的命令所有的用法,它只会返回它有哪些命令可以实现什么功能,对于命令的具体用法你仍然可以通过`--help`参数获得: +```shell +> npm install --help +Install a package + +Usage: +npm install [ ...] + +Options: +[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle] +[-E|--save-exact] [-g|--global] +[--install-strategy ] [--legacy-bundling] +[--global-style] [--omit [--omit ...]] +[--include [--include ...]] +[--strict-peer-deps] [--prefer-dedupe] [--no-package-lock] [--package-lock-only] +[--foreground-scripts] [--ignore-scripts] [--no-audit] [--no-bin-links] +[--no-fund] [--dry-run] [--cpu ] [--os ] [--libc ] +[-w|--workspace [-w|--workspace ...]] +[-ws|--workspaces] [--include-workspace-root] [--install-links] + +aliases: add, i, in, ins, inst, insta, instal, isnt, isnta, isntal, isntall + +Run "npm help install" for more info +``` +这是不是很像上面的渐进式披露的定义? + +我们是不是可以按照这种风格去实现一个MCP来实现无需skill的工具渐进式披露?我使用Codex将官方的PDF Skill转换成了一个MCP,只暴露一个工具: +```json +{ + "name": "mcp__pdf__pdf", + "description": "Comprehensive PDF manipulation toolkit for extracting text and tables, creating new PDFs, merging/splitting documents, and handling forms. When Claude needs to fill in a PDF form or programmatically process, generate, or analyze PDF documents at scale.You need to pass in the --help parameter to obtain the usage of this tool first.", + "input_schema": { + "type": "object", + "properties": { + "params": { + "$ref": "#/$defs/PdfCommandInput" + } + }, + "required": [ + "params" + ], + "$defs": { + "PdfCommandInput": { + "additionalProperties": false, + "properties": { + "argv": { + "description": "Command tokens excluding the leading 'pdf' executable name", + "items": { + "type": "string" + }, + "title": "Argv", + "type": "array" + }, + "command": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional command string; if set, it will be split like a shell", + "title": "Command" + } + }, + "title": "PdfCommandInput", + "type": "object" + } + }, + "title": "pdfArguments" + } +} +``` +下面是使用该MCP的上下文窗口变化 +```json +User: Extract all the text from test.pdf and write it into result.txt +Agent: Tool(name="pdf", args=["--help"]) +Tool: pdf - Comprehensive PDF manipulation toolkit for extracting text and tables, creating new PDFs, merging/splitting documents, and handling forms. When Claude needs to fill in a PDF form or programmatically process, generate, or analyze PDF documents at scale在使用之前你需要先传入--help参数以获取该工具的用法\n\nUsage:\n pdf [--help] [options]\n\nDomains:\n forms Fill, extract, and validate PDF form fields.\n documents Create, merge, and split PDFs.\n text Extract text content from PDFs.\n tables Extract tables (heuristic, whitespace-based).\n images Render PDF pages to PNG images.\n\nRun `pdf --help` for domain help.\nRun `pdf --help` for command help. +Agent: Tool(name="pdf", args=["text", "--help"]) +Tool: text - Extract text content from PDFs.\n\nUsage:\n pdf text [options]\n\nCommands:\n extract Extract text content from a PDF.\n\nRun `pdf text --help` for details. +Agent: Tool(name="pdf", args=["text", "extract", "--help"]) +Tool: usage: pdf text extract --pdf PDF_PATH [--pages PAGES] [--out OUTPUT_PATH]\n [--format {text,json}] [--overwrite]\n\nExtract text content from a PDF.\n\noptions:\n --pdf PDF_PATH Input PDF\n --pages PAGES Page selection like 1,3-5 or 'all' (default: all)\n --out OUTPUT_PATH Write extracted text to a file\n --format {text,json} Output format (default: text)\n --overwrite Overwrite output file if it exists\n +Agent: Tool(name="pdf", args=["text", "extract", "--pdf", "test.pdf", "--out", "result.txt", "--overwrite"]) +Tool: {"result": {"stdout": "xx","data": {"pdf_path": "test.pdf","page_count": 6,"pages": [xxx],"format": "text","output_path": "result.txt"}}} +Agent: xxx +``` +从上下文变化情况来看,完全实现了渐进式披露,该MCP代码开源(代码完全由codex编写,只验证想法,未做任何审查): https://github.com/musistudio/pdf-skill-mcp + +如果你有什么想法也欢迎与我进行交流hropic.com/_next/image?url=https%3A%2F%2Fwww-cdn.anthropic.com%2Fimages%2F4zrzovbb%2Fwebsite%2Fa3bca2763d7892982a59c28aa4df7993aaae55ae-2292x673.jpg&w=3840&q=75) +> 拥有文件系统和代码执行工具的智能体在执行特定任务时,无需将技能的全部内容读取到上下文窗口中。这意味着技能中可以包含的上下文信息量实际上是无限的。 + +下图是使用Skill的上下文窗口变化 +![image](https://www.anthropic.com/_next/image?url=https%3A%2F%2Fwww-cdn.anthropic.com%2Fimages%2F4zrzovbb%2Fwebsite%2F441b9f6cc0d2337913c1f41b05357f16f51f702e-1650x929.jpg&w=3840&q=75) + +我们真的需要这样去实现吗? + +在我们平时使用CLI工具时,一般的CLI工具都会带有一个`--help`参数,用于查看该工具的用法和说明,这不就是该工具的使用手册吗?比如: +```shell +> npm --help +npm + +Usage: + +npm install install all the dependencies in your project +npm install add the dependency to your project +npm test run this project's tests +npm run run the script named +npm -h quick help on +npm -l display usage info for all commands +npm help search for help on +npm help npm more involved overview + +All commands: + + access, adduser, audit, bugs, cache, ci, completion, + config, dedupe, deprecate, diff, dist-tag, docs, doctor, + edit, exec, explain, explore, find-dupes, fund, get, help, + help-search, hook, init, install, install-ci-test, + install-test, link, ll, login, logout, ls, org, outdated, + owner, pack, ping, pkg, prefix, profile, prune, publish, + query, rebuild, repo, restart, root, run-script, sbom, + search, set, shrinkwrap, star, stars, start, stop, team, + test, token, uninstall, unpublish, unstar, update, version, + view, whoami + +Specify configs in the ini-formatted file: + /Users/xxx/.npmrc +or on the command line via: npm --key=value + +More configuration info: npm help config +Configuration fields: npm help 7 config +``` + +这份手册也不会返回所有的命令所有的用法,它只会返回它有哪些命令可以实现什么功能,对于命令的具体用法你仍然可以通过`--help`参数获得: +```shell +> npm install --help +Install a package + +Usage: +npm install [ ...] + +Options: +[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle] +[-E|--save-exact] [-g|--global] +[--install-strategy ] [--legacy-bundling] +[--global-style] [--omit [--omit ...]] +[--include [--include ...]] +[--strict-peer-deps] [--prefer-dedupe] [--no-package-lock] [--package-lock-only] +[--foreground-scripts] [--ignore-scripts] [--no-audit] [--no-bin-links] +[--no-fund] [--dry-run] [--cpu ] [--os ] [--libc ] +[-w|--workspace [-w|--workspace ...]] +[-ws|--workspaces] [--include-workspace-root] [--install-links] + +aliases: add, i, in, ins, inst, insta, instal, isnt, isnta, isntal, isntall + +Run "npm help install" for more info +``` +这是不是很像上面的渐进式披露的定义? + +我们是不是可以按照这种风格去实现一个MCP来实现无需skill的工具渐进式披露?我使用Codex将官方的PDF Skill转换成了一个MCP,只暴露一个工具: +```json +{ + "name": "mcp__pdf__pdf", + "description": "Comprehensive PDF manipulation toolkit for extracting text and tables, creating new PDFs, merging/splitting documents, and handling forms. When Claude needs to fill in a PDF form or programmatically process, generate, or analyze PDF documents at scale.You need to pass in the --help parameter to obtain the usage of this tool first.", + "input_schema": { + "type": "object", + "properties": { + "params": { + "$ref": "#/$defs/PdfCommandInput" + } + }, + "required": [ + "params" + ], + "$defs": { + "PdfCommandInput": { + "additionalProperties": false, + "properties": { + "argv": { + "description": "Command tokens excluding the leading 'pdf' executable name", + "items": { + "type": "string" + }, + "title": "Argv", + "type": "array" + }, + "command": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional command string; if set, it will be split like a shell", + "title": "Command" + } + }, + "title": "PdfCommandInput", + "type": "object" + } + }, + "title": "pdfArguments" + } +} +``` +下面是使用该MCP的上下文窗口变化 +```json +User: Extract all the text from test.pdf and write it into result.txt +Agent: Tool(name="pdf", args=["--help"]) +Tool: pdf - Comprehensive PDF manipulation toolkit for extracting text and tables, creating new PDFs, merging/splitting documents, and handling forms. When Claude needs to fill in a PDF form or programmatically process, generate, or analyze PDF documents at scale在使用之前你需要先传入--help参数以获取该工具的用法\n\nUsage:\n pdf [--help] [options]\n\nDomains:\n forms Fill, extract, and validate PDF form fields.\n documents Create, merge, and split PDFs.\n text Extract text content from PDFs.\n tables Extract tables (heuristic, whitespace-based).\n images Render PDF pages to PNG images.\n\nRun `pdf --help` for domain help.\nRun `pdf --help` for command help. +Agent: Tool(name="pdf", args=["text", "--help"]) +Tool: text - Extract text content from PDFs.\n\nUsage:\n pdf text [options]\n\nCommands:\n extract Extract text content from a PDF.\n\nRun `pdf text --help` for details. +Agent: Tool(name="pdf", args=["text", "extract", "--help"]) +Tool: usage: pdf text extract --pdf PDF_PATH [--pages PAGES] [--out OUTPUT_PATH]\n [--format {text,json}] [--overwrite]\n\nExtract text content from a PDF.\n\noptions:\n --pdf PDF_PATH Input PDF\n --pages PAGES Page selection like 1,3-5 or 'all' (default: all)\n --out OUTPUT_PATH Write extracted text to a file\n --format {text,json} Output format (default: text)\n --overwrite Overwrite output file if it exists\n +Agent: Tool(name="pdf", args=["text", "extract", "--pdf", "test.pdf", "--out", "result.txt", "--overwrite"]) +Tool: {"result": {"stdout": "xx","data": {"pdf_path": "test.pdf","page_count": 6,"pages": [xxx],"format": "text","output_path": "result.txt"}}} +Agent: xxx +``` +从上下文变化情况来看,完全实现了渐进式披露,该MCP代码开源(代码完全由codex编写,只验证想法,未做任何审查): https://github.com/musistudio/pdf-skill-mcp + +如果你有什么想法也欢迎与我进行交流 email: [m@musiiot.top](mailto://m@musiiot.top ) diff --git a/blog/zh/或许我们能在Router中做更多事情.md b/blog/zh/或许我们能在Router中做更多事情.md new file mode 100644 index 0000000..64461ba --- /dev/null +++ b/blog/zh/或许我们能在Router中做更多事情.md @@ -0,0 +1,95 @@ +# 或许我们能在 Router 中做更多事情 + +自从`claude-code-router`发布以来,我收到了很多用户的反馈,至今还有不少的 issues 未处理。其中大多都是关于不同的供应商的支持和`deepseek`模型调用工具不积极的问题。 +之前开发这个项目主要是为了我自己能以较低成本使用上`claude code`,所以一开始的设计并没有考虑到多供应商的情况。在实际的排查问题中,我发现尽管市面上所有的供应商几乎都宣称兼容`OpenAI`格式调用,即通过`/chat/compeletions`接口调用,但是其中的细节差异非常多。例如: + +1. Gemini 的工具参数类型是 string 时,`format`参数只支持`date`和`date-time`,并且没有工具调用 ID。 + +2. OpenRouter 需要使用`cache_control`进行缓存。 + +3. DeepSeek 官方 API 的 `max_output` 为 8192,而火山引擎的会更大。 + +除了这些问题之外,还有一些其他的小的供应商,他们或多或少参数都有点问题。于是,我打算开发一个新的项目[musistudio/llms](https://github.com/musistudio/llms)来处理这种不同服务商的兼容问题。该项目使用 OpenAI 格式为基础的通用格式,提供了一个`Transformer`接口,该接口用于处理转换请求和响应。当我们给不同的服务商都实现了`Transformer`后,我们可以实现不同服务商的混合调用。比如我在`AnthropicTransformer`中实现了`Anthropic`<->`OpenAI`格式的互相转换,并监听了`/v1/messages`端点,在`GeminiTransformer`中实现了`Gemini`<->`OpenAI`格式的互相转换,并监听了`/v1beta/models/:modelAndAction`端点,当他们的请求和响应都被转换成一个通用格式的时候,就可以实现他们的互相调用。 + +``` +AnthropicRequest -> AnthropicTransformer -> OpenAIRequest -> GeminiTransformer -> GeminiRequest -> GeminiServer +``` + +``` +GeminiReseponse -> GeminiTransformer -> OpenAIResponse -> AnthropicTransformer -> AnthropicResponse +``` + +虽然使用中间层抹平差异可能会带来一些性能问题,但是该项目最初的目的是为了让`claude-code-router`支持不同的供应商。 + +至于`deepseek`模型调用工具不积极的问题,我发现这是由于`deepseek`在长上下文中的指令遵循不佳导致的。现象就是刚开始模型会主动调用工具,但是在经过几轮对话后模型只会返回文本。一开始的解决方案是通过注入一个系统提示词告知模型需要积极去使用工具以解决用户的问题,但是后面测试发现在长上下文中模型会遗忘该指令。 +查看`deepseek`文档后发现模型支持`tool_choice`参数,可以强制让模型最少调用 1 个工具,我尝试将该值设置为`required`,发现模型调用工具的积极性大大增加,现在我们只需要在合适的时候取消这个参数即可。借助[musistudio/llms](https://github.com/musistudio/llms)的`Transformer`可以让我们在发送请求前和收到响应后做点什么,所以我参考`claude code`的`Plan Mode`,实现了一个使用与`deepseek`的`Tool Mode` + +```typescript +export class TooluseTransformer implements Transformer { + name = "tooluse"; + + transformRequestIn(request: UnifiedChatRequest): UnifiedChatRequest { + if (request.tools?.length) { + request.messages.push({ + role: "system", + content: `Tool mode is active. The user expects you to proactively execute the most suitable tool to help complete the task. +Before invoking a tool, you must carefully evaluate whether it matches the current task. If no available tool is appropriate for the task, you MUST call the \`ExitTool\` to exit tool mode — this is the only valid way to terminate tool mode. +Always prioritize completing the user's task effectively and efficiently by using tools whenever appropriate.`, + }); + request.tool_choice = "required"; + request.tools.unshift({ + type: "function", + function: { + name: "ExitTool", + description: `Use this tool when you are in tool mode and have completed the task. This is the only valid way to exit tool mode. +IMPORTANT: Before using this tool, ensure that none of the available tools are applicable to the current task. You must evaluate all available options — only if no suitable tool can help you complete the task should you use ExitTool to terminate tool mode. +Examples: +1. Task: "Use a tool to summarize this document" — Do not use ExitTool if a summarization tool is available. +2. Task: "What’s the weather today?" — If no tool is available to answer, use ExitTool after reasoning that none can fulfill the task.`, + parameters: { + type: "object", + properties: { + response: { + type: "string", + description: + "Your response will be forwarded to the user exactly as returned — the tool will not modify or post-process it in any way.", + }, + }, + required: ["response"], + }, + }, + }); + } + return request; + } + + async transformResponseOut(response: Response): Promise { + if (response.headers.get("Content-Type")?.includes("application/json")) { + const jsonResponse = await response.json(); + if ( + jsonResponse?.choices[0]?.message.tool_calls?.length && + jsonResponse?.choices[0]?.message.tool_calls[0]?.function?.name === + "ExitTool" + ) { + const toolArguments = JSON.parse(toolCall.function.arguments || "{}"); + jsonResponse.choices[0].message.content = toolArguments.response || ""; + delete jsonResponse.choices[0].message.tool_calls; + } + + // Handle non-streaming response if needed + return new Response(JSON.stringify(jsonResponse), { + status: response.status, + statusText: response.statusText, + headers: response.headers, + }); + } else if (response.headers.get("Content-Type")?.includes("stream")) { + // ... + } + return response; + } +} +``` + +该工具将始终让模型至少调用一个工具,如果没有合适的工具或者任务已完成可以调用`ExitTool`来退出工具模式,因为是依靠`tool_choice`参数实现的,所以仅适用于支持该参数的模型。经过测试,该工具能显著增加`deepseek`的工具调用次数,弊端是可能会有跟任务无关或者没有必要的工具调用导致增加任务执行事件和消耗的 `token` 数。 + +这次更新仅仅是在 Router 中实现一个`agent`的一次小探索,或许还能做更多其他有趣的事也说不定... diff --git a/blog/zh/项目初衷及原理.md b/blog/zh/项目初衷及原理.md new file mode 100644 index 0000000..73b4ebe --- /dev/null +++ b/blog/zh/项目初衷及原理.md @@ -0,0 +1,96 @@ +# 项目初衷及原理 + +早在 Claude Code 发布的第二天(2025-02-25),我就尝试并完成了对该项目的逆向。当时要使用 Claude Code 你需要注册一个 Anthropic 账号,然后申请 waitlist,等待通过后才能使用。但是因为众所周知的原因,Anthropic 屏蔽了中国区的用户,所以通过正常手段我无法使用,通过已知的信息,我发现: + +1. Claude Code 使用 npm 进行安装,所以很大可能其使用 Node.js 进行开发。 +2. Node.js 调试手段众多,可以简单使用`console.log`获取想要的信息,也可以使用`--inspect`将其接入`Chrome Devtools`,甚至你可以使用`d8`去调试某些加密混淆的代码。 + +由于我的目标是让我在没有 Anthropic 账号的情况下使用`Claude Code`,我并不需要获得完整的源代码,只需要将`Claude Code`请求 Anthropic 模型时将其转发到我自定义的接口即可。接下来我就开启了我的逆向过程: + +1. 首先安装`Claude Code` + +```bash +npm install -g @anthropic-ai/claude-code +``` + +2. 安装后该项目被放在了`~/.nvm/versions/node/v20.10.0/lib/node_modules/@anthropic-ai/claude-code`中,因为我使用了`nvm`作为我的 node 版本控制器,当前使用`node-v20.10.0`,所以该路径会因人而异。 +3. 找到项目路径之后可通过 package.json 分析包入口,内容如下: + +```package.json +{ + "name": "@anthropic-ai/claude-code", + "version": "1.0.24", + "main": "sdk.mjs", + "types": "sdk.d.ts", + "bin": { + "claude": "cli.js" + }, + "engines": { + "node": ">=18.0.0" + }, + "type": "module", + "author": "Boris Cherny ", + "license": "SEE LICENSE IN README.md", + "description": "Use Claude, Anthropic's AI assistant, right from your terminal. Claude can understand your codebase, edit files, run terminal commands, and handle entire workflows for you.", + "homepage": "https://github.com/anthropics/claude-code", + "bugs": { + "url": "https://github.com/anthropics/claude-code/issues" + }, + "scripts": { + "prepare": "node -e \"if (!process.env.AUTHORIZED) { console.error('ERROR: Direct publishing is not allowed.\\nPlease use the publish-external.sh script to publish this package.'); process.exit(1); }\"", + "preinstall": "node scripts/preinstall.js" + }, + "dependencies": {}, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "^0.33.5", + "@img/sharp-darwin-x64": "^0.33.5", + "@img/sharp-linux-arm": "^0.33.5", + "@img/sharp-linux-arm64": "^0.33.5", + "@img/sharp-linux-x64": "^0.33.5", + "@img/sharp-win32-x64": "^0.33.5" + } +} +``` + +其中`"claude": "cli.js"`就是我们要找的入口,打开 cli.js,发现代码被压缩混淆过了。没关系,借助`webstorm`的`Formate File`功能可以重新格式化,让代码变得稍微好看一点。就像这样: +![webstorm-formate-file](../images/webstorm-formate-file.png) + +现在,你可以通过阅读部分代码来了解`Claude Code`的内容工具原理与提示词。你也可以在关键地方使用`console.log`来获得更多信息,当然,也可以使用`Chrome Devtools`来进行断点调试,使用以下命令启动`Claude Code`: + +```bash +NODE_OPTIONS="--inspect-brk=9229" claude +``` + +该命令会以调试模式启动`Claude Code`,并将调试的端口设置为`9229`。这时候通过 Chrome 访问`chrome://inspect/`即可看到当前的`Claude Code`进程,点击`inspect`即可进行调试。 +![chrome-devtools](../images/chrome-inspect.png) +![chrome-devtools](../images/chrome-devtools.png) + +通过搜索关键字符`api.anthropic.com`很容易能找到`Claude Code`用来发请求的地方,根据上下文的查看,很容易发现这里的`baseURL`可以通过环境变量`ANTHROPIC_BASE_URL`进行覆盖,`apiKey`和`authToken`也同理。 +![search](../images/search.png) + +到目前为止,我们获得关键信息: + +1. 可以使用环境变量覆盖`Claude Code`的`BaseURL`和`apiKey`的配置 + +2. `Claude Code`使用[Anthropic API](https://docs.anthropic.com/en/api/overview)的规范 + +所以我们需要: + +1. 实现一个服务用来将`OpenAI API`的规范转换成`Anthropic API`格式。 + +2. 启动`Claude Code`之前写入环境变量将`baseURL`指向到该服务。 + +于是,`claude-code-router`就诞生了,该项目使用`Express.js`作为 HTTP 服务,实现`/v1/messages`端点,使用`middlewares`处理请求/响应的格式转换以及请求重写功能(可以用来重写 Claude Code 的提示词以针对单个模型进行调优)。 +在 2 月份由于`DeepSeek`全系列模型对`Function Call`的支持不佳导致无法直接使用`DeepSeek`模型,所以在当时我选择了`qwen-max`模型,一切表现的都很好,但是`qwen-max`不支持`KV Cache`,意味着我要消耗大量的 token,但是却无法获取`Claude Code`原生的体验。 +所以我又尝试了`Router`模式,即使用一个小模型对任务进行分发,一共分为四个模型:`router`、`tool`、`think`和`coder`,所有的请求先经过一个免费的小模型,由小模型去判断应该是进行思考还是编码还是调用工具,再进行任务的分发,如果是思考和编码任务将会进行循环调用,直到最终使用工具写入或修改文件。但是实践下来发现免费的小模型不足以很好的完成任务的分发,再加上整个 Agnet 的设计存在缺陷,导致并不能很好的驱动`Claude Code`。 +直到 5 月底,`Claude Code`被正式推出,这时`DeepSeek`全系列模型(R1 于 05-28)均支持`Function Call`,我开始重新设计该项目。在与 AI 的结对编程中我修复了之前的请求和响应转换问题,在某些场景下模型输出 JSON 响应而不是`Function Call`。这次直接使用`DeepSeek-v3`模型,它工作的比我想象中要好:能完成绝大多数工具调用,还支持用步骤规划解决任务,最关键的是`DeepSeek`的价格不到`claude Sonnet 3.5`的十分之一。正式发布的`Claude Code`对 Agent 的组织也不同于测试版,于是在分析了`Claude Code`的请求调用之后,我重新组织了`Router`模式:现在它还是四个模型:默认模型、`background`、`think`和`longContext`。 + +- 默认模型作为最终的兜底和日常处理 + +- `background`是用来处理一些后台任务,据 Anthropic 官方说主要用`Claude Haiku 3.5`模型去处理一些小任务,如俳句生成和对话摘要,于是我将其路由到了本地的`ollama`服务。 + +- `think`模型用于让`Claude Code`进行思考或者在`Plan Mode`下使用,这里我使用的是`DeepSeek-R1`,由于其不支持推理成本控制,所以`Think`和`UltraThink`是一样的逻辑。 + +- `longContext`是用于处理长下上文的场景,该项目会对每次请求使用tiktoken实时计算上下文长度,如果上下文大于32K则使用该模型,旨在弥补`DeepSeek`在长上下文处理不佳的情况。 + +以上就是该项目的发展历程以及我的一些思考,通过巧妙的使用环境变量覆盖的手段在不修改`Claude Code`源码的情况下完成请求的转发和修改,这就使得在可以得到 Anthropic 更新的同时使用自己的模型,自定义自己的提示词。该项目只是在 Anthropic 封禁中国区用户的情况下使用`Claude Code`并且达到成本和性能平衡的一种手段。如果可以的话,还是官方的Max Plan体验最好。 diff --git a/build/build.mjs b/build/build.mjs new file mode 100644 index 0000000..ba43565 --- /dev/null +++ b/build/build.mjs @@ -0,0 +1,24 @@ +import { buildBrowserRenderer, buildMain, buildRenderer, buildStyles, buildTrayRenderer, buildWebClientBridge, cleanDist, copyAppAssets, copyBrowserRendererHtml, copyMarketplacePlugins, copyModelCatalog, copyRendererHtml, copyTrayRendererHtml, syncUiRendererToRuntimeDists } from "./esbuild.config.mjs"; + +const mode = process.argv.includes("--dev") ? "development" : "production"; + +cleanDist(); +copyAppAssets(); +copyMarketplacePlugins(); +copyModelCatalog(); +copyBrowserRendererHtml(); +copyRendererHtml(); +copyTrayRendererHtml(); + +await Promise.all([ + buildMain({ mode }), + buildBrowserRenderer({ mode }), + buildRenderer({ mode }), + buildTrayRenderer({ mode }), + buildWebClientBridge({ mode }), + buildStyles({ minify: mode === "production" }) +]); + +syncUiRendererToRuntimeDists(); + +console.log(`Built monorepo package assets in ${mode} mode.`); diff --git a/build/dev.mjs b/build/dev.mjs new file mode 100644 index 0000000..b91a341 --- /dev/null +++ b/build/dev.mjs @@ -0,0 +1,486 @@ +import electron from "electron"; +import esbuild from "esbuild"; +import { createHash } from "node:crypto"; +import { spawn } from "node:child_process"; +import { existsSync, readdirSync, readFileSync, statSync, watch } from "node:fs"; +import path from "node:path"; +import { + buildStyles, + cleanDist, + browserRendererHtmlInput, + cliSourceRoot, + coreSourceRoot, + copyAppAssets, + copyBrowserRendererHtml, + copyCliRuntimeToElectronDist, + copyMarketplacePlugins, + copyModelCatalog, + copyRendererHtml, + copyTrayRendererHtml, + createBrowserRendererBuildOptions, + createCliBuildOptions, + createMainBuildOptions, + createRendererBuildOptions, + createTrayRendererBuildOptions, + createWebClientBridgeBuildOptions, + appAssetsInput, + modelCatalogInput, + projectRoot, + rendererRoot, + rendererHtmlInput, + syncUiRendererToRuntimeDists, + trayRendererHtmlInput, + watchPlugin +} from "./esbuild.config.mjs"; + +let electronProcess = null; +let restartTimer = null; +let pendingRestartReasons = []; +const watchSignatures = new Map(); +let shuttingDown = false; +const restartDelayMs = 160; +const styleBuildDelayMs = 160; +const stylePollIntervalMs = 1000; +const ignoredSignatureEntries = new Set([".DS_Store"]); +let styleBuildTimer = null; +let styleBuildInFlight = false; +let queuedStyleBuildReason = null; +const ready = { + browser: false, + cli: false, + main: false, + renderer: false, + tray: false, + webBridge: false +}; +const devTarget = parseDevTarget(process.argv.slice(2)); +const enabled = { + cli: devTarget === "cli" || devTarget === "electron", + electron: devTarget === "electron", + ui: true +}; +const coreSharedSourceRoot = path.join(coreSourceRoot, "shared"); +const styleWatchRoots = [rendererRoot, coreSharedSourceRoot].filter((watchRoot) => existsSync(watchRoot)); +const activeReadyNames = new Set([ + ...(enabled.ui ? ["browser", "renderer", "tray", "webBridge"] : []), + ...(enabled.cli ? ["cli"] : []), + ...(enabled.electron ? ["main"] : []) +]); + +function parseDevTarget(args) { + const target = args[0] ?? "electron"; + if (target === "--help" || target === "-h") { + console.log("Usage: node build/dev.mjs [ui|cli|electron]"); + process.exit(0); + } + if (target === "ui" || target === "cli" || target === "electron") { + return target; + } + console.error(`Unknown dev target "${target}". Expected ui, cli, or electron.`); + process.exit(2); +} + +function logDev(message) { + console.log(`[dev] ${new Date().toISOString()} ${message}`); +} + +function relativePath(file) { + return path.relative(projectRoot, file) || "."; +} + +function readyState() { + return Object.entries(ready) + .filter(([name]) => activeReadyNames.has(name)) + .map(([name, value]) => `${name}:${value ? "ready" : "pending"}`) + .join(" "); +} + +function describeWatchEvent(label, watchedPath, eventType, filename, isDirectory = false) { + const changedPath = filename + ? path.join(isDirectory ? watchedPath : path.dirname(watchedPath), String(filename)) + : watchedPath; + return `${label} ${eventType} ${relativePath(changedPath)}`; +} + +function contentSignature(targetPath) { + try { + return readContentSignature(targetPath); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + return { + key: `error:${message}`, + summary: `signature-error=${message}` + }; + } +} + +function readContentSignature(targetPath) { + if (!existsSync(targetPath)) { + return { + key: "missing", + summary: "missing" + }; + } + + const stats = statSync(targetPath); + if (stats.isDirectory()) { + return directorySignature(targetPath); + } + + const content = readFileSync(targetPath); + const hash = createHash("sha1").update(content).digest("hex").slice(0, 12); + return { + key: `file:${hash}`, + summary: `size=${stats.size} mtime=${stats.mtime.toISOString()} ctime=${stats.ctime.toISOString()} sha1=${hash}` + }; +} + +function directorySignature(targetPath) { + const files = listDirectoryFiles(targetPath); + const hash = createHash("sha1"); + let newestMtimeMs = 0; + + for (const file of files) { + const absolutePath = path.join(targetPath, file); + const stats = statSync(absolutePath); + newestMtimeMs = Math.max(newestMtimeMs, stats.mtimeMs); + hash.update(file); + hash.update("\0"); + hash.update(readFileSync(absolutePath)); + hash.update("\0"); + } + + const digest = hash.digest("hex").slice(0, 12); + const newestMtime = newestMtimeMs > 0 ? new Date(newestMtimeMs).toISOString() : "none"; + return { + key: `dir:${digest}`, + summary: `files=${files.length} newestMtime=${newestMtime} sha1=${digest}` + }; +} + +function listDirectoryFiles(targetPath, basePath = targetPath) { + const entries = readdirSync(targetPath, { withFileTypes: true }) + .filter((entry) => !ignoredSignatureEntries.has(entry.name)) + .sort((a, b) => a.name.localeCompare(b.name)); + const files = []; + + for (const entry of entries) { + const absolutePath = path.join(targetPath, entry.name); + const relative = path.relative(basePath, absolutePath); + if (entry.isDirectory()) { + files.push(...listDirectoryFiles(absolutePath, basePath)); + } else if (entry.isFile()) { + files.push(relative); + } + } + + return files; +} + +function rememberWatchSignature(label, targetPath) { + const signature = contentSignature(targetPath); + watchSignatures.set(label, signature.key); + logDev(`watch baseline: ${label} ${relativePath(targetPath)}; ${signature.summary}`); +} + +function handleWatchedInput(label, watchedPath, eventType, filename, options, onChange) { + const reason = describeWatchEvent(label, watchedPath, eventType, filename, options?.isDirectory); + const signature = contentSignature(watchedPath); + const previousSignature = watchSignatures.get(label); + const changed = previousSignature !== signature.key; + watchSignatures.set(label, signature.key); + logDev(`watch event: ${reason}; ${signature.summary}; content=${changed ? "changed" : "unchanged"}`); + + if (!changed) { + logDev(`restart skipped: ${reason} (content unchanged)`); + return; + } + + onChange(); + if (enabled.electron && options?.restart !== false) { + scheduleRestart(reason); + } +} + +function scheduleStyleBuild(reason) { + queuedStyleBuildReason = reason; + if (styleBuildTimer) { + clearTimeout(styleBuildTimer); + } + styleBuildTimer = setTimeout(() => { + styleBuildTimer = null; + void rebuildStyles(queuedStyleBuildReason ?? reason); + }, styleBuildDelayMs); +} + +async function rebuildStyles(reason) { + if (styleBuildInFlight) { + queuedStyleBuildReason = reason; + return; + } + + styleBuildInFlight = true; + queuedStyleBuildReason = null; + try { + logDev(`rebuilding styles: ${reason}`); + await buildStyles({ minify: false }); + syncUiRendererToRuntimeDists(); + if (enabled.electron) { + scheduleRestart(`styles rebuilt: ${reason}`); + } + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + logDev(`style rebuild failed: ${message}`); + } finally { + styleBuildInFlight = false; + if (queuedStyleBuildReason) { + const queuedReason = queuedStyleBuildReason; + queuedStyleBuildReason = null; + scheduleStyleBuild(queuedReason); + } + } +} + +function pollStyleWatchRoots() { + for (const styleWatchRoot of styleWatchRoots) { + const label = `styles ${relativePath(styleWatchRoot)}`; + const signature = contentSignature(styleWatchRoot); + const previousSignature = watchSignatures.get(label); + if (previousSignature === signature.key) { + continue; + } + + watchSignatures.set(label, signature.key); + logDev(`watch event: ${label}; ${signature.summary}; content=changed`); + scheduleStyleBuild(label); + } +} + +function markReady(name, reason = `${name} esbuild completed`) { + if (name === "browser" || name === "cli" || name === "main" || name === "renderer" || name === "tray" || name === "webBridge") { + ready[name] = true; + } + logDev(`build ready: ${reason}; ${readyState()}`); + if (enabled.electron && Array.from(activeReadyNames).every((readyName) => ready[readyName])) { + scheduleRestart(reason); + } +} + +function scheduleRestart(reason = "unknown trigger") { + if (shuttingDown) { + logDev(`restart ignored during shutdown: ${reason}`); + return; + } + pendingRestartReasons.push(reason); + if (restartTimer) { + clearTimeout(restartTimer); + logDev(`restart rescheduled in ${restartDelayMs}ms: ${reason}`); + } else { + logDev(`restart scheduled in ${restartDelayMs}ms: ${reason}`); + } + restartTimer = setTimeout(restartElectron, restartDelayMs); +} + +function restartElectron() { + const reasons = Array.from(new Set(pendingRestartReasons)); + pendingRestartReasons = []; + restartTimer = null; + + if (electronProcess) { + logDev(`stopping Electron pid=${electronProcess.pid ?? "unknown"}`); + electronProcess.kill(); + electronProcess = null; + } + + logDev(`starting Electron; reasons=${reasons.join(" | ") || "initial start"}`); + const child = spawn(electron, ["."], { + cwd: projectRoot, + env: { + ...process.env, + NODE_ENV: "development" + }, + stdio: "inherit" + }); + electronProcess = child; + logDev(`Electron started pid=${child.pid ?? "unknown"}`); + child.on("exit", (code, signal) => { + logDev(`Electron exited pid=${child.pid ?? "unknown"} code=${code ?? "null"} signal=${signal ?? "null"}`); + if (electronProcess === child) { + electronProcess = null; + } + }); +} + +logDev(`starting dev build target=${devTarget} ui=${enabled.ui ? "on" : "off"} cli=${enabled.cli ? "on" : "off"} electron=${enabled.electron ? "on" : "off"}`); +cleanDist(); +if (enabled.electron) { + copyAppAssets(); +} +if (enabled.cli || enabled.electron) { + copyMarketplacePlugins(); + copyModelCatalog(); +} +copyBrowserRendererHtml(); +copyRendererHtml(); +copyTrayRendererHtml(); +await buildStyles({ minify: false }); +syncUiRendererToRuntimeDists(); + +rememberWatchSignature("home html", rendererHtmlInput); +rememberWatchSignature("browser html", browserRendererHtmlInput); +rememberWatchSignature("tray html", trayRendererHtmlInput); +for (const styleWatchRoot of styleWatchRoots) { + rememberWatchSignature(`styles ${relativePath(styleWatchRoot)}`, styleWatchRoot); +} +if (enabled.electron) { + rememberWatchSignature("app assets", appAssetsInput); +} +if ((enabled.cli || enabled.electron) && existsSync(modelCatalogInput)) { + rememberWatchSignature("model catalog", modelCatalogInput); +} + +const htmlWatcher = watch(rendererHtmlInput, { persistent: true }, (eventType, filename) => { + handleWatchedInput("home html", rendererHtmlInput, eventType, filename, undefined, () => { + copyRendererHtml(); + syncUiRendererToRuntimeDists(); + }); +}); + +const browserHtmlWatcher = watch(browserRendererHtmlInput, { persistent: true }, (eventType, filename) => { + handleWatchedInput("browser html", browserRendererHtmlInput, eventType, filename, undefined, () => { + copyBrowserRendererHtml(); + syncUiRendererToRuntimeDists(); + }); +}); + +const trayHtmlWatcher = watch(trayRendererHtmlInput, { persistent: true }, (eventType, filename) => { + handleWatchedInput("tray html", trayRendererHtmlInput, eventType, filename, undefined, () => { + copyTrayRendererHtml(); + syncUiRendererToRuntimeDists(); + }); +}); + +const stylePoller = setInterval(pollStyleWatchRoots, stylePollIntervalMs); + +const appAssetsWatcher = enabled.electron + ? watch(appAssetsInput, { persistent: true }, (eventType, filename) => { + handleWatchedInput("app assets", appAssetsInput, eventType, filename, { isDirectory: true }, copyAppAssets); + }) + : { close: () => undefined }; + +const modelCatalogWatcher = (enabled.cli || enabled.electron) && existsSync(modelCatalogInput) + ? watch(modelCatalogInput, { persistent: true }, (eventType, filename) => { + handleWatchedInput("model catalog", modelCatalogInput, eventType, filename, undefined, copyModelCatalog); + }) + : { close: () => undefined }; + +const contexts = []; + +if (enabled.electron) { + contexts.push( + await esbuild.context( + createMainBuildOptions({ + mode: "development", + plugins: [watchPlugin("main", (name) => markReady(name))] + }) + ) + ); +} + +if (enabled.cli) { + contexts.push( + await esbuild.context( + createCliBuildOptions({ + mode: "development", + plugins: [ + watchPlugin("cli", (name) => { + if (enabled.electron) { + copyCliRuntimeToElectronDist(); + } + markReady(name); + }) + ] + }) + ) + ); +} + +if (enabled.ui) { + contexts.push( + await esbuild.context( + createRendererBuildOptions({ + mode: "development", + plugins: [ + watchPlugin("renderer", (name) => { + copyRendererHtml(); + syncUiRendererToRuntimeDists(); + markReady(name); + }) + ] + }) + ), + await esbuild.context( + createTrayRendererBuildOptions({ + mode: "development", + plugins: [ + watchPlugin("tray", (name) => { + copyTrayRendererHtml(); + syncUiRendererToRuntimeDists(); + markReady(name); + }) + ] + }) + ), + await esbuild.context( + createBrowserRendererBuildOptions({ + mode: "development", + plugins: [ + watchPlugin("browser", (name) => { + copyBrowserRendererHtml(); + syncUiRendererToRuntimeDists(); + markReady(name); + }) + ] + }) + ), + await esbuild.context( + createWebClientBridgeBuildOptions({ + mode: "development", + plugins: [ + watchPlugin("webBridge", (name) => { + syncUiRendererToRuntimeDists(); + markReady(name); + }) + ] + }) + ) + ); +} + +await Promise.all(contexts.map((context) => context.watch())); +logDev("watchers are active"); + +async function shutdown() { + logDev("shutting down dev build"); + shuttingDown = true; + if (restartTimer) { + clearTimeout(restartTimer); + } + if (electronProcess) { + electronProcess.kill(); + } + if (styleBuildTimer) { + clearTimeout(styleBuildTimer); + } + htmlWatcher.close(); + browserHtmlWatcher.close(); + trayHtmlWatcher.close(); + clearInterval(stylePoller); + appAssetsWatcher.close(); + modelCatalogWatcher.close(); + await Promise.all(contexts.map((context) => context.dispose())); + process.exit(0); +} + +process.on("SIGINT", shutdown); +process.on("SIGTERM", shutdown); diff --git a/build/docker-build.mjs b/build/docker-build.mjs new file mode 100644 index 0000000..75d4ed1 --- /dev/null +++ b/build/docker-build.mjs @@ -0,0 +1,37 @@ +import { + buildBrowserRenderer, + buildCoreServer, + buildRenderer, + buildStyles, + buildTrayRenderer, + buildWebClientBridge, + cleanDist, + copyBrowserRendererHtml, + copyMarketplacePlugins, + copyModelCatalog, + copyRendererHtml, + copyTrayRendererHtml, + syncUiRendererToRuntimeDists +} from "./esbuild.config.mjs"; + +const mode = process.argv.includes("--dev") ? "development" : "production"; + +cleanDist(); +copyMarketplacePlugins(); +copyModelCatalog(); +copyBrowserRendererHtml(); +copyRendererHtml(); +copyTrayRendererHtml(); + +await Promise.all([ + buildCoreServer({ mode }), + buildBrowserRenderer({ mode }), + buildRenderer({ mode }), + buildTrayRenderer({ mode }), + buildWebClientBridge({ mode }), + buildStyles({ minify: mode === "production" }) +]); + +syncUiRendererToRuntimeDists(); + +console.log(`Built Docker core server and UI assets in ${mode} mode.`); diff --git a/build/electron-builder.local.cjs b/build/electron-builder.local.cjs new file mode 100644 index 0000000..e7149ab --- /dev/null +++ b/build/electron-builder.local.cjs @@ -0,0 +1,19 @@ +const baseConfig = require("../electron-builder.json"); + +const config = { + ...baseConfig, + directories: { + ...baseConfig.directories, + output: "release-local" + }, + mac: { + ...baseConfig.mac, + identity: "-", + notarize: false, + forceCodeSigning: false + } +}; + +delete config.afterSign; + +module.exports = config; diff --git a/build/entitlements.mac.inherit.plist b/build/entitlements.mac.inherit.plist new file mode 100644 index 0000000..896ab56 --- /dev/null +++ b/build/entitlements.mac.inherit.plist @@ -0,0 +1,10 @@ + + + + + com.apple.security.cs.allow-jit + + com.apple.security.cs.disable-library-validation + + + diff --git a/build/entitlements.mac.plist b/build/entitlements.mac.plist new file mode 100644 index 0000000..896ab56 --- /dev/null +++ b/build/entitlements.mac.plist @@ -0,0 +1,10 @@ + + + + + com.apple.security.cs.allow-jit + + com.apple.security.cs.disable-library-validation + + + diff --git a/build/esbuild.config.mjs b/build/esbuild.config.mjs new file mode 100644 index 0000000..e4a05f6 --- /dev/null +++ b/build/esbuild.config.mjs @@ -0,0 +1,602 @@ +import esbuild from "esbuild"; +import { spawn } from "node:child_process"; +import { chmodSync, cpSync, existsSync, mkdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs"; +import { builtinModules, createRequire } from "node:module"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const requireFromHere = createRequire(import.meta.url); + +export const projectRoot = path.resolve(__dirname, ".."); +export const packagesRoot = path.join(projectRoot, "packages"); +export const cliRoot = path.join(packagesRoot, "cli"); +export const coreRoot = path.join(packagesRoot, "core"); +export const electronRoot = path.join(packagesRoot, "electron"); +export const uiRoot = path.join(packagesRoot, "ui"); +export const cliSourceRoot = path.join(cliRoot, "src"); +export const coreSourceRoot = path.join(coreRoot, "src"); +export const electronSourceRoot = path.join(electronRoot, "src"); +export const uiSourceRoot = path.join(uiRoot, "src"); +export const legacyDistDir = path.join(projectRoot, "dist"); +export const cliDistDir = path.join(cliRoot, "dist"); +export const coreDistDir = path.join(coreRoot, "dist"); +export const electronDistDir = path.join(electronRoot, "dist"); +export const uiDistDir = path.join(uiRoot, "dist"); +export const distDir = electronDistDir; +export const cliMainOutDir = path.join(cliDistDir, "main"); +export const coreMainOutDir = path.join(coreDistDir, "main"); +export const electronMainOutDir = path.join(electronDistDir, "main"); +export const mainOutDir = electronMainOutDir; +export const gatewayPackageRoot = path.dirname(requireFromHere.resolve("@the-next-ai/ai-gateway/package.json")); +export const gatewayRuntimeInput = path.join(gatewayPackageRoot, "bin", "next-ai-gateway.js"); +export const electronGatewayRuntimeOutput = path.join(electronMainOutDir, "next-ai-gateway.js"); +export const botGatewaySdkPackageRoot = path.dirname(requireFromHere.resolve("@the-next-ai/bot-gateway-sdk/package.json")); +export const botGatewaySdkEntryInput = path.join(botGatewaySdkPackageRoot, "dist", "index.js"); +export const botGatewaySdkRunnerInput = path.join(botGatewaySdkPackageRoot, "bin", "bot-gateway-stdio.mjs"); +export const electronBotGatewaySdkRootDir = path.join(electronMainOutDir, "bot-gateway-sdk"); +export const electronBotGatewaySdkDistDir = path.join(electronBotGatewaySdkRootDir, "dist"); +export const electronBotGatewaySdkBinDir = path.join(electronBotGatewaySdkRootDir, "bin"); +export const electronBotGatewaySdkPackageOutput = path.join(electronBotGatewaySdkRootDir, "package.json"); +export const electronBotGatewaySdkEntryOutput = path.join(electronBotGatewaySdkDistDir, "index.js"); +export const electronBotGatewaySdkRunnerOutput = path.join(electronBotGatewaySdkBinDir, "bot-gateway-stdio.mjs"); +export const rendererOutDir = path.join(uiDistDir, "renderer"); +export const cliRendererOutDir = path.join(cliDistDir, "renderer"); +export const coreRendererOutDir = path.join(coreDistDir, "renderer"); +export const electronRendererOutDir = path.join(electronDistDir, "renderer"); +export const runtimeRendererOutDirs = [cliRendererOutDir, coreRendererOutDir, electronRendererOutDir]; +export const appAssetsDir = path.join(electronDistDir, "assets"); +export const rendererAssetsDir = path.join(rendererOutDir, "assets"); +export const cliMarketplacePluginsDir = path.join(cliDistDir, "marketplace", "plugins"); +export const coreMarketplacePluginsDir = path.join(coreDistDir, "marketplace", "plugins"); +export const electronMarketplacePluginsDir = path.join(electronDistDir, "marketplace", "plugins"); +export const marketplacePluginsDir = electronMarketplacePluginsDir; +export const appAssetsInput = path.join(electronRoot, "assets"); +export const modelCatalogInput = path.join(coreRoot, "models.json"); +export const cliModelCatalogOutput = path.join(cliDistDir, "models.json"); +export const coreModelCatalogOutput = path.join(coreDistDir, "models.json"); +export const electronModelCatalogOutput = path.join(electronDistDir, "models.json"); +export const modelCatalogOutput = electronModelCatalogOutput; +export const rendererRoot = uiSourceRoot; +export const rendererHtmlInput = path.join(rendererRoot, "pages", "home", "index.html"); +export const rendererHtmlOutput = path.join(rendererOutDir, "pages", "home", "index.html"); +export const browserRendererHtmlInput = path.join(rendererRoot, "pages", "browser", "index.html"); +export const browserRendererHtmlOutput = path.join(rendererOutDir, "pages", "browser", "index.html"); +export const trayRendererHtmlInput = path.join(rendererRoot, "pages", "tray", "index.html"); +export const trayRendererHtmlOutput = path.join(rendererOutDir, "pages", "tray", "index.html"); +export const cssInput = path.join(rendererRoot, "styles", "globals.css"); +export const cssOutput = path.join(rendererAssetsDir, "main.css"); +export const webClientBridgeOutput = path.join(rendererAssetsDir, "web-client-bridge.js"); +export const electronUndiciProxyAgentInput = path.join(coreSourceRoot, "proxy", "undici-proxy-agent.ts"); +const lightweightMcpBundleNames = ["browser-web-search-proxy-mcp.js", "fusion-vision-mcp.js", "fusion-tool-fallback-mcp.js"]; +const lightweightMcpBundleMaxBytes = 128 * 1024; +const forbiddenLightweightMcpInputs = [ + { prefix: "packages/core/src/config/", reason: "config modules can pull in native storage side effects" }, + { prefix: "packages/core/src/storage/", reason: "native SQLite storage is not allowed in lightweight MCP subprocesses" }, + { prefix: "packages/electron/src/", reason: "Electron runtime modules are not allowed in lightweight MCP subprocesses" }, + { prefix: "packages/ui/src/", reason: "UI modules do not belong in stdio MCP subprocesses" }, + { prefix: "node_modules/better-sqlite3/", reason: "native SQLite is not allowed in lightweight MCP subprocesses" }, + { prefix: "node_modules/electron/", reason: "Electron runtime modules are not allowed in lightweight MCP subprocesses" } +]; +const forbiddenLightweightMcpExternalImports = new Set(["better-sqlite3", "electron"]); + +const nodeExternals = [ + "electron", + "better-sqlite3", + ...builtinModules, + ...builtinModules.map((moduleName) => `node:${moduleName}`) +]; + +export function cleanDist() { + rmSync(legacyDistDir, { force: true, recursive: true }); + rmSync(cliDistDir, { force: true, recursive: true }); + rmSync(coreDistDir, { force: true, recursive: true }); + rmSync(electronDistDir, { force: true, recursive: true }); + rmSync(uiDistDir, { force: true, recursive: true }); + ensureDist(); +} + +export function ensureDist() { + mkdirSync(cliMainOutDir, { recursive: true }); + mkdirSync(coreMainOutDir, { recursive: true }); + mkdirSync(electronMainOutDir, { recursive: true }); + mkdirSync(electronBotGatewaySdkDistDir, { recursive: true }); + mkdirSync(electronBotGatewaySdkBinDir, { recursive: true }); + mkdirSync(appAssetsDir, { recursive: true }); + mkdirSync(cliMarketplacePluginsDir, { recursive: true }); + mkdirSync(coreMarketplacePluginsDir, { recursive: true }); + mkdirSync(electronMarketplacePluginsDir, { recursive: true }); + mkdirSync(rendererAssetsDir, { recursive: true }); + for (const outputDir of runtimeRendererOutDirs) { + mkdirSync(path.join(outputDir, "assets"), { recursive: true }); + } + mkdirSync(path.dirname(rendererHtmlOutput), { recursive: true }); + mkdirSync(path.dirname(browserRendererHtmlOutput), { recursive: true }); + mkdirSync(path.dirname(trayRendererHtmlOutput), { recursive: true }); +} + +export function copyAppAssets() { + ensureDist(); + if (existsSync(appAssetsInput)) { + cpSync(appAssetsInput, appAssetsDir, { recursive: true }); + } +} + +export function copyModelCatalog() { + ensureDist(); + if (existsSync(modelCatalogInput)) { + cpSync(modelCatalogInput, cliModelCatalogOutput); + cpSync(modelCatalogInput, coreModelCatalogOutput); + cpSync(modelCatalogInput, electronModelCatalogOutput); + } +} + +export function copyRendererHtml() { + copyRendererPageHtml(rendererHtmlInput, rendererHtmlOutput, "main.js", { + beforeModuleScriptTags: [' '] + }); +} + +export function copyTrayRendererHtml() { + copyRendererPageHtml(trayRendererHtmlInput, trayRendererHtmlOutput, "tray.js"); +} + +export function copyBrowserRendererHtml() { + copyRendererPageHtml(browserRendererHtmlInput, browserRendererHtmlOutput, "browser.js"); +} + +export function copyMarketplacePlugins() { + ensureDist(); + for (const filename of ["claude-design-plugin.cjs", "cursor-proxy-plugin.cjs"]) { + const source = path.join(projectRoot, "examples", "plugins", filename); + if (existsSync(source)) { + cpSync(source, path.join(cliMarketplacePluginsDir, filename)); + cpSync(source, path.join(coreMarketplacePluginsDir, filename)); + cpSync(source, path.join(electronMarketplacePluginsDir, filename)); + } + } +} + +export function syncUiRendererToRuntimeDists() { + ensureDist(); + for (const outputDir of runtimeRendererOutDirs) { + rmSync(outputDir, { force: true, recursive: true }); + if (existsSync(rendererOutDir)) { + cpSync(rendererOutDir, outputDir, { recursive: true }); + } + } +} + +function copyRendererPageHtml(input, output, scriptName, options = {}) { + ensureDist(); + const source = readFileSync(input, "utf8"); + const styleTag = ' '; + const scriptTag = ` `; + let html = source.includes('') + ? source.replace(' ', scriptTag) + : source.replace("", `${scriptTag}\n `); + + for (const extraScriptTag of options.beforeModuleScriptTags ?? []) { + if (!hasScriptTag(html, extraScriptTag)) { + html = html.replace(scriptTag, `${extraScriptTag}\n${scriptTag}`); + } + } + + if (!html.includes('href="../../assets/main.css"')) { + html = html.replace("", `${styleTag}\n `); + } + + writeFileSync(output, html, "utf8"); +} + +function hasScriptTag(html, scriptTag) { + const sourceMatch = scriptTag.match(/\bsrc="([^"]+)"/); + return sourceMatch ? html.includes(sourceMatch[1]) : html.includes(scriptTag); +} + +function normalizeDuplicateShebangs(source) { + const lines = source.split("\n"); + if (!lines[0]?.startsWith("#!")) { + return source; + } + let index = 1; + while (lines[index]?.startsWith("#!")) { + index += 1; + } + return [lines[0], ...lines.slice(index)].join("\n"); +} + +export function createMainBuildOptions({ mode = "production", plugins = [] } = {}) { + return { + absWorkingDir: projectRoot, + bundle: true, + entryNames: "[name]", + entryPoints: [ + path.join(electronSourceRoot, "main", "main.ts"), + path.join(electronSourceRoot, "main", "browser-preload.ts"), + gatewayRuntimeInput, + path.join(coreSourceRoot, "mcp", "browser-web-search-proxy-mcp.ts"), + path.join(coreSourceRoot, "mcp", "fusion-vision-mcp.ts"), + path.join(coreSourceRoot, "mcp", "fusion-tool-fallback-mcp.ts"), + path.join(coreSourceRoot, "mcp", "toolhub-mcp.ts"), + electronUndiciProxyAgentInput, + path.join(electronSourceRoot, "main", "preload.ts") + ], + external: nodeExternals, + format: "cjs", + legalComments: "none", + logLevel: "info", + metafile: true, + minify: mode === "production", + outdir: electronMainOutDir, + platform: "node", + plugins: [packageAliasPlugin(), ...plugins], + sourcemap: mode !== "production", + target: "node22" + }; +} + +export function createCliBuildOptions({ mode = "production", plugins = [] } = {}) { + return { + absWorkingDir: projectRoot, + bundle: true, + entryNames: "[name]", + entryPoints: [ + path.join(cliSourceRoot, "cli.ts"), + path.join(coreSourceRoot, "mcp", "fusion-vision-mcp.ts"), + path.join(coreSourceRoot, "mcp", "fusion-tool-fallback-mcp.ts"), + path.join(coreSourceRoot, "mcp", "toolhub-mcp.ts") + ], + external: nodeExternals.filter((moduleName) => moduleName !== "electron"), + format: "cjs", + legalComments: "none", + logLevel: "info", + minify: mode === "production", + outdir: cliMainOutDir, + platform: "node", + plugins: [forbidCliElectronPlugin(), packageAliasPlugin(), ...plugins], + sourcemap: mode !== "production", + target: "node22" + }; +} + +export function createCoreServerBuildOptions({ mode = "production", plugins = [] } = {}) { + return { + absWorkingDir: projectRoot, + bundle: true, + entryNames: "[name]", + entryPoints: [ + path.join(coreSourceRoot, "entrypoints", "server.ts"), + path.join(coreSourceRoot, "mcp", "fusion-vision-mcp.ts"), + path.join(coreSourceRoot, "mcp", "fusion-tool-fallback-mcp.ts"), + path.join(coreSourceRoot, "mcp", "toolhub-mcp.ts") + ], + external: nodeExternals.filter((moduleName) => moduleName !== "electron"), + format: "cjs", + legalComments: "none", + logLevel: "info", + minify: mode === "production", + outdir: coreMainOutDir, + platform: "node", + plugins: [forbidCliElectronPlugin(), packageAliasPlugin(), ...plugins], + sourcemap: mode !== "production", + target: "node22" + }; +} + +export function createRendererBuildOptions({ mode = "production", plugins = [] } = {}) { + return { + absWorkingDir: projectRoot, + assetNames: "assets/[name]-[hash]", + bundle: true, + define: { + "process.env.NODE_ENV": JSON.stringify(mode) + }, + entryPoints: [path.join(rendererRoot, "pages", "home", "main.tsx")], + format: "esm", + jsx: "automatic", + legalComments: "none", + loader: { + ".gif": "file", + ".ico": "file", + ".jpg": "file", + ".jpeg": "file", + ".png": "file", + ".svg": "file", + ".webp": "file" + }, + logLevel: "info", + minify: mode === "production", + outfile: path.join(rendererAssetsDir, "main.js"), + platform: "browser", + plugins: [rendererAliasPlugin(), packageAliasPlugin(), ...plugins], + publicPath: "../../assets", + sourcemap: mode !== "production", + target: "chrome120" + }; +} + +export function createTrayRendererBuildOptions({ mode = "production", plugins = [] } = {}) { + return { + ...createRendererBuildOptions({ mode, plugins }), + entryPoints: [path.join(rendererRoot, "pages", "tray", "main.tsx")], + outfile: path.join(rendererAssetsDir, "tray.js") + }; +} + +export function createBrowserRendererBuildOptions({ mode = "production", plugins = [] } = {}) { + return { + ...createRendererBuildOptions({ mode, plugins }), + entryPoints: [path.join(rendererRoot, "pages", "browser", "main.tsx")], + outfile: path.join(rendererAssetsDir, "browser.js") + }; +} + +export function createWebClientBridgeBuildOptions({ mode = "production", plugins = [] } = {}) { + return { + absWorkingDir: projectRoot, + bundle: true, + entryPoints: [path.join(uiSourceRoot, "web-client-bridge.ts")], + format: "iife", + legalComments: "none", + logLevel: "info", + minify: mode === "production", + outfile: webClientBridgeOutput, + platform: "browser", + plugins: [packageAliasPlugin(), ...plugins], + sourcemap: mode !== "production", + target: "chrome120" + }; +} + +export function createBotGatewaySdkBuildOptions({ mode = "production", plugins = [] } = {}) { + return { + absWorkingDir: projectRoot, + bundle: true, + entryPoints: [botGatewaySdkEntryInput], + external: [ + ...builtinModules, + ...builtinModules.map((moduleName) => `node:${moduleName}`) + ], + format: "esm", + legalComments: "none", + logLevel: "info", + minify: mode === "production", + outfile: electronBotGatewaySdkEntryOutput, + platform: "node", + plugins, + sourcemap: mode !== "production", + target: "node22" + }; +} + +export function watchPlugin(name, onEnd) { + return { + name: `${name}-watch`, + setup(build) { + build.onEnd((result) => { + if (result.errors.length === 0) { + onEnd(name); + } + }); + } + }; +} + +export async function buildMain(options = {}) { + const [mainBuildResult] = await Promise.all([ + esbuild.build(createMainBuildOptions(options)), + buildBotGatewaySdkRuntime(options), + buildCoreServer(options), + buildCli(options) + ]); + copyCliRuntimeToElectronDist(); + validateLightweightMcpBundles(mainBuildResult.metafile); +} + +export async function buildBotGatewaySdkRuntime(options = {}) { + ensureDist(); + await esbuild.build(createBotGatewaySdkBuildOptions(options)); + writeFileSync( + electronBotGatewaySdkPackageOutput, + `${JSON.stringify({ private: true, type: "module" }, null, 2)}\n`, + "utf8" + ); + writeFileSync( + electronBotGatewaySdkRunnerOutput, + normalizeDuplicateShebangs(readFileSync(botGatewaySdkRunnerInput, "utf8")), + "utf8" + ); + chmodSync(electronBotGatewaySdkRunnerOutput, 0o755); +} + +export async function buildCli(options = {}) { + await esbuild.build(createCliBuildOptions(options)); +} + +export async function buildCoreServer(options = {}) { + await esbuild.build(createCoreServerBuildOptions(options)); +} + +export async function buildRenderer(options = {}) { + await esbuild.build(createRendererBuildOptions(options)); +} + +export async function buildTrayRenderer(options = {}) { + await esbuild.build(createTrayRendererBuildOptions(options)); +} + +export async function buildBrowserRenderer(options = {}) { + await esbuild.build(createBrowserRendererBuildOptions(options)); +} + +export async function buildWebClientBridge(options = {}) { + await esbuild.build(createWebClientBridgeBuildOptions(options)); +} + +export function copyCliRuntimeToElectronDist() { + ensureDist(); + const cliRuntime = path.join(cliMainOutDir, "cli.js"); + if (existsSync(cliRuntime)) { + cpSync(cliRuntime, path.join(electronMainOutDir, "cli.js")); + } +} + +export async function buildStyles({ minify = false } = {}) { + ensureDist(); + const args = ["-i", cssInput, "-o", cssOutput]; + if (minify) { + args.push("--minify"); + } + await runCommand(binPath("tailwindcss"), args); +} + +export function binPath(name) { + const extension = process.platform === "win32" ? ".cmd" : ""; + return path.join(projectRoot, "node_modules", ".bin", `${name}${extension}`); +} + +export function runCommand(command, args, options = {}) { + return new Promise((resolve, reject) => { + const child = spawn(command, args, { + cwd: projectRoot, + stdio: "inherit", + shell: process.platform === "win32", + ...options + }); + + child.on("error", reject); + child.on("exit", (code) => { + if (code === 0) { + resolve(); + return; + } + reject(new Error(`${path.basename(command)} exited with code ${code}`)); + }); + }); +} + +function rendererAliasPlugin() { + return { + name: "renderer-alias", + setup(build) { + build.onResolve({ filter: /^@\// }, (args) => { + return { path: resolveRendererImport(args.path.slice(2)) }; + }); + } + }; +} + +function packageAliasPlugin() { + return { + name: "ccr-package-alias", + setup(build) { + build.onResolve({ filter: /^@ccr\/cli\// }, (args) => { + return { path: resolvePackageImport(cliSourceRoot, args.path.slice("@ccr/cli/".length)) }; + }); + build.onResolve({ filter: /^@ccr\/core\// }, (args) => { + return { path: resolvePackageImport(coreSourceRoot, args.path.slice("@ccr/core/".length)) }; + }); + build.onResolve({ filter: /^@ccr\/electron\// }, (args) => { + return { path: resolvePackageImport(electronSourceRoot, args.path.slice("@ccr/electron/".length)) }; + }); + build.onResolve({ filter: /^@ccr\/ui\// }, (args) => { + return { path: resolvePackageImport(uiSourceRoot, args.path.slice("@ccr/ui/".length)) }; + }); + } + }; +} + +function forbidCliElectronPlugin() { + return { + name: "forbid-cli-electron", + setup(build) { + build.onResolve({ filter: /^electron$/ }, () => { + return { + errors: [ + { + text: "CLI bundle must not import electron. Move the dependency behind a desktop-only boundary." + } + ] + }; + }); + } + }; +} + +function validateLightweightMcpBundles(metafile) { + if (!metafile) { + return; + } + + const outputsByName = new Map( + Object.entries(metafile.outputs).map(([outputPath, output]) => [path.basename(outputPath), { output, outputPath }]) + ); + + for (const bundleName of lightweightMcpBundleNames) { + const entry = outputsByName.get(bundleName); + if (!entry) { + continue; + } + + const violations = []; + if (entry.output.bytes > lightweightMcpBundleMaxBytes) { + violations.push(`bundle size ${entry.output.bytes} bytes exceeds ${lightweightMcpBundleMaxBytes} bytes`); + } + + for (const inputPath of Object.keys(entry.output.inputs ?? {})) { + const normalizedInput = normalizeBuildPath(inputPath); + for (const rule of forbiddenLightweightMcpInputs) { + if (normalizedInput.startsWith(rule.prefix)) { + violations.push(`${normalizedInput} (${rule.reason})`); + } + } + } + + for (const imported of entry.output.imports ?? []) { + if (imported.external && forbiddenLightweightMcpExternalImports.has(imported.path)) { + violations.push(`${imported.path} (external native/runtime dependency is not allowed)`); + } + } + + if (violations.length > 0) { + throw new Error([ + `Lightweight MCP bundle ${bundleName} crossed its dependency boundary.`, + ...violations.map((violation) => `- ${violation}`) + ].join("\n")); + } + } +} + +function normalizeBuildPath(value) { + return value.split(path.sep).join("/"); +} + +function resolveRendererImport(importPath) { + return resolvePackageImport(rendererRoot, importPath); +} + +function resolvePackageImport(rootDir, importPath) { + const packageBasePath = path.resolve(rootDir, importPath); + const candidates = [ + packageBasePath, + `${packageBasePath}.tsx`, + `${packageBasePath}.ts`, + `${packageBasePath}.jsx`, + `${packageBasePath}.js`, + `${packageBasePath}.json`, + `${packageBasePath}.css`, + path.join(packageBasePath, "index.tsx"), + path.join(packageBasePath, "index.ts"), + path.join(packageBasePath, "index.jsx"), + path.join(packageBasePath, "index.js") + ]; + + for (const candidate of candidates) { + if (existsSync(candidate) && statSync(candidate).isFile()) { + return candidate; + } + } + + return packageBasePath; +} diff --git a/build/icon.icns b/build/icon.icns new file mode 100644 index 0000000..779cc5d Binary files /dev/null and b/build/icon.icns differ diff --git a/build/icon.ico b/build/icon.ico new file mode 100644 index 0000000..e9a62cd Binary files /dev/null and b/build/icon.ico differ diff --git a/build/icon.png b/build/icon.png new file mode 100644 index 0000000..42cdfc1 Binary files /dev/null and b/build/icon.png differ diff --git a/build/macos-release-preflight.mjs b/build/macos-release-preflight.mjs new file mode 100644 index 0000000..aedc382 --- /dev/null +++ b/build/macos-release-preflight.mjs @@ -0,0 +1,72 @@ +import { execFileSync } from "node:child_process"; + +const errors = []; + +function reportAndExit() { + if (errors.length === 0) { + return; + } + + console.error("macOS release preflight failed:"); + for (const error of errors) { + console.error(`- ${error}`); + } + process.exit(1); +} + +function run(command, args) { + try { + return execFileSync(command, args, { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }); + } catch (error) { + const stderr = error.stderr?.toString().trim(); + const stdout = error.stdout?.toString().trim(); + const details = stderr || stdout || error.message; + errors.push(`cannot run ${command} ${args.join(" ")}: ${details}`); + return ""; + } +} + +function hasCompleteNotaryCredentials() { + const hasAppPassword = + Boolean(process.env.APPLE_ID) && + Boolean(process.env.APPLE_APP_SPECIFIC_PASSWORD) && + Boolean(process.env.APPLE_TEAM_ID); + + const hasApiKey = + Boolean(process.env.APPLE_API_KEY) && + Boolean(process.env.APPLE_API_KEY_ID) && + Boolean(process.env.APPLE_API_ISSUER); + + const hasKeychainProfile = Boolean(process.env.APPLE_KEYCHAIN_PROFILE); + + return hasAppPassword || hasApiKey || hasKeychainProfile; +} + +if (process.platform !== "darwin") { + errors.push("macOS release builds must run on macOS."); + reportAndExit(); +} + +const developerDir = run("xcode-select", ["-p"]).trim(); +if (developerDir.endsWith("/CommandLineTools")) { + errors.push("notarization stapling requires full Xcode. Install Xcode and run `sudo xcode-select -s /Applications/Xcode.app/Contents/Developer`."); +} + +run("xcrun", ["notarytool", "--version"]); +run("xcrun", ["-f", "stapler"]); + +if (!process.env.CSC_LINK) { + const identities = run("security", ["find-identity", "-v", "-p", "codesigning"]); + if (!/"Developer ID Application: .+ \([A-Z0-9]+\)"/.test(identities)) { + errors.push("no Developer ID Application signing identity was found in the keychain. Install a Developer ID Application certificate or provide CSC_LINK/CSC_KEY_PASSWORD."); + } +} + +if (!hasCompleteNotaryCredentials()) { + errors.push( + "missing notarization credentials. Set APPLE_API_KEY + APPLE_API_KEY_ID + APPLE_API_ISSUER, or APPLE_ID + APPLE_APP_SPECIFIC_PASSWORD + APPLE_TEAM_ID, or APPLE_KEYCHAIN_PROFILE." + ); +} + +reportAndExit(); +console.log("macOS release preflight passed."); diff --git a/build/merge-macos-update-metadata.mjs b/build/merge-macos-update-metadata.mjs new file mode 100644 index 0000000..d1e2da0 --- /dev/null +++ b/build/merge-macos-update-metadata.mjs @@ -0,0 +1,78 @@ +import { readFileSync, writeFileSync } from "node:fs"; +import path from "node:path"; +import yaml from "js-yaml"; + +const [outputFile, ...inputFiles] = process.argv.slice(2); + +if (!outputFile || inputFiles.length < 2) { + console.error("Usage: node build/merge-macos-update-metadata.mjs [...]"); + process.exit(1); +} + +const updateInfos = inputFiles.map((file) => { + const info = yaml.load(readFileSync(file, "utf8")); + if (!info || typeof info !== "object") { + throw new Error(`${file} is not a valid update metadata object`); + } + if (!Array.isArray(info.files) || info.files.length === 0) { + throw new Error(`${file} does not contain any update files`); + } + return { file, info }; +}); + +const version = updateInfos[0].info.version; +if (!version || updateInfos.some(({ info }) => info.version !== version)) { + throw new Error("All macOS update metadata files must have the same version"); +} + +const files = uniqueByUrl( + updateInfos + .flatMap(({ info }) => info.files) + .filter((file) => file && typeof file.url === "string") + .sort(compareMacUpdateFile) +); + +const defaultZip = files.find((file) => file.url.endsWith(".zip") && file.url.includes("arm64")) ?? files.find((file) => file.url.endsWith(".zip")); +if (!defaultZip?.sha512) { + throw new Error("Merged macOS update metadata must include at least one ZIP with sha512"); +} + +const releaseDate = updateInfos + .map(({ info }) => info.releaseDate) + .filter(Boolean) + .sort() + .at(-1); + +const { files: _files, path: _path, sha512: _sha512, releaseDate: _releaseDate, ...baseInfo } = updateInfos[0].info; +const mergedInfo = { + ...baseInfo, + version, + files, + path: defaultZip.url, + sha512: defaultZip.sha512, + ...(releaseDate ? { releaseDate } : {}) +}; + +writeFileSync(outputFile, yaml.dump(mergedInfo, { lineWidth: 120, noRefs: true }), "utf8"); +console.log(`Wrote ${path.relative(process.cwd(), outputFile)} with ${files.length} macOS artifacts.`); + +function uniqueByUrl(files) { + const seen = new Set(); + return files.filter((file) => { + if (seen.has(file.url)) { + return false; + } + seen.add(file.url); + return true; + }); +} + +function compareMacUpdateFile(left, right) { + return fileRank(left) - fileRank(right) || left.url.localeCompare(right.url); +} + +function fileRank(file) { + const isZip = file.url.endsWith(".zip") ? 0 : 10; + const isAppleSilicon = file.url.includes("arm64") ? 0 : 1; + return isZip + isAppleSilicon; +} diff --git a/build/run-tests.mjs b/build/run-tests.mjs new file mode 100644 index 0000000..aaa9cfb --- /dev/null +++ b/build/run-tests.mjs @@ -0,0 +1,67 @@ +import electron from "electron"; +import { spawn } from "node:child_process"; +import { mkdtempSync, rmSync } from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const projectRoot = path.resolve(__dirname, ".."); +const testHome = mkdtempSync(path.join(os.tmpdir(), "ccr-test-home-")); +const testSuites = ["main", "renderer"]; +const requestedSuites = process.argv.slice(2); +const suites = requestedSuites.length === 0 ? testSuites : requestedSuites; + +for (const suite of suites) { + if (!testSuites.includes(suite)) { + cleanup(); + throw new Error(`Unknown test suite: ${suite}`); + } +} + +try { + for (const suite of suites) { + await runSuite(suite); + } +} finally { + cleanup(); +} + +function runSuite(suite) { + console.log(`\nRunning ${suite} tests...`); + + return new Promise((resolve, reject) => { + const child = spawn(electron, ["--test", `dist/tests/${suite}/*.test.js`], { + cwd: projectRoot, + env: { + ...process.env, + CCR_INTERNAL_APP_DATA_DIR: path.join(testHome, "app-data"), + CCR_INTERNAL_HOME_DIR: testHome, + CCR_INTERNAL_USER_DATA_DIR: path.join(testHome, "user-data"), + HOME: testHome, + ELECTRON_RUN_AS_NODE: "1" + }, + shell: process.platform === "win32", + stdio: "inherit" + }); + + child.on("error", reject); + child.on("exit", (code, signal) => { + if (signal) { + process.kill(process.pid, signal); + return; + } + + if (code === 0) { + resolve(); + return; + } + + reject(new Error(`${suite} tests exited with code ${code ?? 1}`)); + }); + }); +} + +function cleanup() { + rmSync(testHome, { force: true, recursive: true }); +} diff --git a/build/test.mjs b/build/test.mjs new file mode 100644 index 0000000..be7b4ad --- /dev/null +++ b/build/test.mjs @@ -0,0 +1,145 @@ +import esbuild from "esbuild"; +import { existsSync, readdirSync, rmSync, statSync } from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const projectRoot = path.resolve(__dirname, ".."); +const testsOutDir = path.join(projectRoot, "dist", "tests"); +const rendererRoot = path.join(projectRoot, "packages", "ui", "src"); +const cliSourceRoot = path.join(projectRoot, "packages", "cli", "src"); +const coreSourceRoot = path.join(projectRoot, "packages", "core", "src"); +const testSuites = [ + { name: "main", testDir: path.join(projectRoot, "tests", "main") }, + { name: "renderer", testDir: path.join(projectRoot, "tests", "renderer") } +]; +const requestedSuites = new Set(process.argv.slice(2)); +const suiteNames = new Set(testSuites.map((suite) => suite.name)); +const unknownSuites = [...requestedSuites].filter((suite) => !suiteNames.has(suite)); +const selectedSuites = requestedSuites.size === 0 + ? testSuites + : testSuites.filter((suite) => requestedSuites.has(suite.name)); + +if (unknownSuites.length > 0) { + throw new Error(`Unknown test suite: ${unknownSuites.join(", ")}`); +} + +rmSync(testsOutDir, { force: true, recursive: true }); + +for (const suite of selectedSuites) { + const entryPoints = [ + ...findTestFiles(suite.testDir), + ...runtimeEntryPointsForSuite(suite.name) + ]; + if (entryPoints.length === 0) { + continue; + } + + await esbuild.build({ + absWorkingDir: projectRoot, + bundle: true, + entryNames: "[name]", + entryPoints, + external: [ + "better-sqlite3", + "electron" + ], + format: "cjs", + legalComments: "none", + loader: { + ".gif": "file", + ".ico": "file", + ".jpg": "file", + ".jpeg": "file", + ".png": "file", + ".svg": "file", + ".webp": "file" + }, + logLevel: "info", + outdir: path.join(testsOutDir, suite.name), + platform: "node", + plugins: [rendererAliasPlugin(), packageAliasPlugin()], + target: "node22" + }); +} + +function runtimeEntryPointsForSuite(suiteName) { + if (suiteName !== "main") { + return []; + } + return [ + path.join(coreSourceRoot, "mcp", "fusion-vision-mcp.ts"), + path.join(coreSourceRoot, "mcp", "toolhub-mcp.ts") + ]; +} + +function findTestFiles(dir) { + if (!existsSync(dir)) { + return []; + } + + const files = []; + for (const name of readdirSync(dir)) { + const file = path.join(dir, name); + const stat = statSync(file); + if (stat.isDirectory()) { + files.push(...findTestFiles(file)); + } else if (/\.(test|spec)\.(mjs|ts|tsx)$/.test(name)) { + files.push(file); + } + } + return files.sort(); +} + +function rendererAliasPlugin() { + return { + name: "renderer-test-alias", + setup(build) { + build.onResolve({ filter: /^@\// }, (args) => { + return { path: resolveRendererImport(args.path.slice(2)) }; + }); + } + }; +} + +function packageAliasPlugin() { + return { + name: "test-package-alias", + setup(build) { + build.onResolve({ filter: /^@ccr\/cli\// }, (args) => { + return { path: resolvePackageImport(cliSourceRoot, args.path.slice("@ccr/cli/".length)) }; + }); + build.onResolve({ filter: /^@ccr\/core\// }, (args) => { + return { path: resolvePackageImport(coreSourceRoot, args.path.slice("@ccr/core/".length)) }; + }); + } + }; +} + +function resolveRendererImport(importPath) { + return resolvePackageImport(rendererRoot, importPath); +} + +function resolvePackageImport(rootDir, importPath) { + const basePath = path.resolve(rootDir, importPath); + const candidates = [ + basePath, + `${basePath}.tsx`, + `${basePath}.ts`, + `${basePath}.jsx`, + `${basePath}.js`, + `${basePath}.json`, + path.join(basePath, "index.tsx"), + path.join(basePath, "index.ts"), + path.join(basePath, "index.jsx"), + path.join(basePath, "index.js") + ]; + + for (const candidate of candidates) { + if (existsSync(candidate) && statSync(candidate).isFile()) { + return candidate; + } + } + + return basePath; +} diff --git a/build/verify-macos-notarization.cjs b/build/verify-macos-notarization.cjs new file mode 100644 index 0000000..617da5d --- /dev/null +++ b/build/verify-macos-notarization.cjs @@ -0,0 +1,24 @@ +const { execFileSync } = require("node:child_process"); +const path = require("node:path"); + +function run(command, args) { + execFileSync(command, args, { stdio: "inherit" }); +} + +module.exports = async function verifyMacosNotarization(context) { + if (context.electronPlatformName !== "darwin") { + return; + } + + if (process.env.CCR_SKIP_MAC_NOTARIZATION_VERIFY === "1") { + console.warn("Skipping macOS notarization verification because CCR_SKIP_MAC_NOTARIZATION_VERIFY=1."); + return; + } + + const productFilename = context.packager.appInfo.productFilename; + const appPath = path.join(context.appOutDir, `${productFilename}.app`); + + run("codesign", ["--verify", "--deep", "--strict", "--verbose=2", appPath]); + run("xcrun", ["stapler", "validate", appPath]); + run("spctl", ["--assess", "--type", "execute", "--verbose=4", appPath]); +}; diff --git a/build/verify-packaged-app.cjs b/build/verify-packaged-app.cjs new file mode 100644 index 0000000..ee52160 --- /dev/null +++ b/build/verify-packaged-app.cjs @@ -0,0 +1,233 @@ +const fs = require("node:fs"); +const path = require("node:path"); + +const betterSqliteNativeRelativePath = path.join( + "app.asar.unpacked", + "node_modules", + "better-sqlite3", + "build", + "Release", + "better_sqlite3.node" +); +const betterSqlitePackageRelativePath = path.join("app.asar.unpacked", "node_modules", "better-sqlite3"); +const betterSqlitePrunablePaths = [ + "deps", + "src", + "binding.gyp", + "README.md", + "docs", + "benchmark", + "benchmarks", + "test", + path.join("build", "Release", "obj"), + path.join("build", "Release", "obj.target") +]; + +module.exports = async function verifyPackagedApp(context) { + const platform = context?.electronPlatformName; + const arch = normalizeArch(context?.arch); + const appOutDir = context?.appOutDir; + + if (!platform || !appOutDir) { + throw new Error("Packaged app verification did not receive electron-builder platform context."); + } + + const resourcesDir = findResourcesDir(appOutDir, platform); + assertFile(path.join(resourcesDir, "app.asar"), "Packaged app archive"); + cleanupBetterSqlitePackage(resourcesDir); + + const nativeModule = path.join(resourcesDir, betterSqliteNativeRelativePath); + assertFile(nativeModule, "better-sqlite3 native module"); + + const nativeInfo = inspectNativeModule(nativeModule); + if (nativeInfo.platform !== platform) { + throw new Error( + `Packaged better-sqlite3 native module targets ${formatNativeInfo(nativeInfo)}, ` + + `but electron-builder is packaging ${platform}/${arch}. Rebuild native dependencies for the target platform before packaging.` + ); + } + + if (arch && !nativeArchMatches(nativeInfo, arch)) { + throw new Error( + `Packaged better-sqlite3 native module targets ${formatNativeInfo(nativeInfo)}, ` + + `but electron-builder is packaging ${platform}/${arch}. Run npm run rebuild:sqlite3 on the target platform before packaging.` + ); + } +}; + +function cleanupBetterSqlitePackage(resourcesDir) { + const packageDir = path.join(resourcesDir, betterSqlitePackageRelativePath); + for (const relativePath of betterSqlitePrunablePaths) { + fs.rmSync(path.join(packageDir, relativePath), { force: true, recursive: true }); + } +} + +function findResourcesDir(appOutDir, platform) { + if (platform !== "darwin") { + return path.join(appOutDir, "resources"); + } + + const appBundle = fs.readdirSync(appOutDir) + .find((entry) => entry.endsWith(".app") && fs.statSync(path.join(appOutDir, entry)).isDirectory()); + if (!appBundle) { + throw new Error(`Could not find a .app bundle in ${appOutDir}`); + } + return path.join(appOutDir, appBundle, "Contents", "Resources"); +} + +function assertFile(file, label) { + let stat; + try { + stat = fs.statSync(file); + } catch { + throw new Error(`${label} is missing: ${file}`); + } + + if (!stat.isFile() || stat.size === 0) { + throw new Error(`${label} is empty or not a file: ${file}`); + } +} + +function inspectNativeModule(file) { + const buffer = fs.readFileSync(file); + if (buffer.length < 32) { + throw new Error(`Native module is too small to identify: ${file}`); + } + + if (buffer[0] === 0x4d && buffer[1] === 0x5a) { + return inspectPe(buffer, file); + } + if (buffer[0] === 0x7f && buffer[1] === 0x45 && buffer[2] === 0x4c && buffer[3] === 0x46) { + return inspectElf(buffer); + } + + const magicLe = buffer.readUInt32LE(0); + const magicBe = buffer.readUInt32BE(0); + if (magicLe === 0xfeedface || magicLe === 0xfeedfacf || magicLe === 0xcefaedfe || magicLe === 0xcffaedfe) { + return inspectMachO(buffer, magicLe); + } + if (magicBe === 0xcafebabe || magicBe === 0xcafebabf) { + return inspectFatMachO(buffer, magicBe); + } + + throw new Error(`Native module has an unknown binary format: ${file}`); +} + +function inspectPe(buffer, file) { + const peOffset = buffer.readUInt32LE(0x3c); + if (peOffset + 6 >= buffer.length || buffer.toString("ascii", peOffset, peOffset + 4) !== "PE\0\0") { + throw new Error(`Native module has an invalid PE header: ${file}`); + } + const machine = buffer.readUInt16LE(peOffset + 4); + return { + arch: peMachineArch(machine), + platform: "win32" + }; +} + +function inspectElf(buffer) { + const machine = buffer.readUInt16LE(18); + return { + arch: elfMachineArch(machine), + platform: "linux" + }; +} + +function inspectMachO(buffer, magicLe) { + const bigEndian = magicLe === 0xcefaedfe || magicLe === 0xcffaedfe; + const cpuType = bigEndian ? buffer.readUInt32BE(4) : buffer.readUInt32LE(4); + return { + arch: machCpuArch(cpuType), + platform: "darwin" + }; +} + +function inspectFatMachO(buffer, magicBe) { + const archs = []; + const count = buffer.readUInt32BE(4); + const entrySize = magicBe === 0xcafebabf ? 32 : 20; + for (let index = 0; index < count; index += 1) { + const offset = 8 + index * entrySize; + if (offset + 8 > buffer.length) { + break; + } + archs.push(machCpuArch(buffer.readUInt32BE(offset))); + } + return { + arch: "universal", + archs, + platform: "darwin" + }; +} + +function peMachineArch(machine) { + if (machine === 0x8664) { + return "x64"; + } + if (machine === 0xaa64) { + return "arm64"; + } + if (machine === 0x014c) { + return "ia32"; + } + return `unknown-pe-${machine.toString(16)}`; +} + +function elfMachineArch(machine) { + if (machine === 0x3e) { + return "x64"; + } + if (machine === 0xb7) { + return "arm64"; + } + if (machine === 0x03) { + return "ia32"; + } + if (machine === 0x28) { + return "armv7l"; + } + return `unknown-elf-${machine.toString(16)}`; +} + +function machCpuArch(cpuType) { + if (cpuType === 0x01000007) { + return "x64"; + } + if (cpuType === 0x0100000c) { + return "arm64"; + } + if (cpuType === 0x00000007) { + return "ia32"; + } + return `unknown-macho-${cpuType.toString(16)}`; +} + +function normalizeArch(arch) { + if (typeof arch === "string") { + return arch; + } + const electronBuilderArchNames = new Map([ + [0, "ia32"], + [1, "x64"], + [2, "armv7l"], + [3, "arm64"], + [4, "universal"] + ]); + return electronBuilderArchNames.get(arch); +} + +function nativeArchMatches(info, arch) { + if (info.arch === arch) { + return true; + } + if (info.arch === "universal") { + return arch === "universal" || Boolean(info.archs?.includes(arch)); + } + return false; +} + +function formatNativeInfo(info) { + return info.arch === "universal" && info.archs?.length + ? `${info.platform}/${info.arch} (${info.archs.join(", ")})` + : `${info.platform}/${info.arch}`; +} diff --git a/build/verify-update-metadata.cjs b/build/verify-update-metadata.cjs new file mode 100644 index 0000000..3c8c574 --- /dev/null +++ b/build/verify-update-metadata.cjs @@ -0,0 +1,55 @@ +const fs = require("node:fs"); +const path = require("node:path"); + +module.exports = async function verifyUpdateMetadata(buildResult) { + const artifactPaths = Array.isArray(buildResult?.artifactPaths) ? buildResult.artifactPaths : []; + const outputDirs = new Set(artifactPaths.map((artifactPath) => path.dirname(artifactPath))); + const metadataFiles = artifactPaths.filter((artifactPath) => /^latest(?:-[a-z]+)?\.ya?ml$/i.test(path.basename(artifactPath))); + + for (const outputDir of outputDirs) { + for (const filename of fs.readdirSync(outputDir)) { + const candidate = path.join(outputDir, filename); + if (/^latest(?:-[a-z]+)?\.ya?ml$/i.test(filename) && !metadataFiles.includes(candidate)) { + metadataFiles.push(candidate); + } + } + } + + const errors = []; + for (const metadataFile of metadataFiles) { + const metadataDir = path.dirname(metadataFile); + const metadata = fs.readFileSync(metadataFile, "utf8"); + for (const artifact of readReferencedArtifacts(metadata)) { + if (isRemoteUrl(artifact)) { + continue; + } + const artifactPath = path.resolve(metadataDir, artifact); + if (!fs.existsSync(artifactPath)) { + errors.push(`${path.relative(process.cwd(), metadataFile)} references missing artifact ${artifact}`); + } + } + } + + if (errors.length) { + throw new Error(`Update metadata validation failed:\n${errors.map((error) => `- ${error}`).join("\n")}`); + } +}; + +function readReferencedArtifacts(metadata) { + const values = new Set(); + for (const line of metadata.split(/\r?\n/)) { + const match = line.match(/^\s*(?:path|url):\s*(.+?)\s*$/); + if (!match) { + continue; + } + const value = match[1].replace(/^['"]|['"]$/g, "").trim(); + if (value) { + values.add(value); + } + } + return [...values]; +} + +function isRemoteUrl(value) { + return /^[a-z][a-z0-9+.-]*:\/\//i.test(value); +} diff --git a/cdn/README.md b/cdn/README.md new file mode 100644 index 0000000..772e06a --- /dev/null +++ b/cdn/README.md @@ -0,0 +1,63 @@ +# CCR CDN + +This directory contains the static assets for the embeddable CCR provider import button. + +Default Cloudflare Pages project: + +```text +claude-code-router-cdn +``` + +Default CDN URLs: + +```text +https://cdn.ccrdesk.top/ccr-provider-buttons.js +https://cdn.ccrdesk.top/ccr-icon.png +``` + +Cloudflare Pages custom domain: + +```text +cdn.ccrdesk.top +``` + +The Pages custom domain must have a CNAME record pointing to the Pages project: + +```text +cdn.ccrdesk.top CNAME claude-code-router-cdn.pages.dev +``` + +The documentation site uses `ccrdesk.top` through GitHub Pages. Configure DNS like this: + +```text +ccrdesk.top A 185.199.108.153 +ccrdesk.top A 185.199.109.153 +ccrdesk.top A 185.199.110.153 +ccrdesk.top A 185.199.111.153 +ccrdesk.top AAAA 2606:50c0:8000::153 +ccrdesk.top AAAA 2606:50c0:8001::153 +ccrdesk.top AAAA 2606:50c0:8002::153 +ccrdesk.top AAAA 2606:50c0:8003::153 +cdn.ccrdesk.top CNAME claude-code-router-cdn.pages.dev +``` + +If `ccrdesk.top` is delegated to Cloudflare, use these Cloudflare nameservers at the registrar: + +```text +benedict.ns.cloudflare.com +evangeline.ns.cloudflare.com +``` + +Deploy manually: + +```sh +cd cdn +npx wrangler pages deploy public --project-name=claude-code-router-cdn +``` + +The GitHub Actions workflow requires these repository secrets: + +```text +CLOUDFLARE_API_TOKEN +CLOUDFLARE_ACCOUNT_ID +``` diff --git a/cdn/package.json b/cdn/package.json new file mode 100644 index 0000000..f49b77a --- /dev/null +++ b/cdn/package.json @@ -0,0 +1,11 @@ +{ + "name": "claude-code-router-cdn", + "private": true, + "version": "0.1.0", + "license": "MIT", + "type": "module", + "scripts": { + "deploy": "wrangler pages deploy public --project-name=claude-code-router-cdn", + "deploy:preview": "wrangler pages deploy public --project-name=claude-code-router-cdn --branch=preview" + } +} diff --git a/cdn/public/_headers b/cdn/public/_headers new file mode 100644 index 0000000..c4b9aa0 --- /dev/null +++ b/cdn/public/_headers @@ -0,0 +1,10 @@ +/* + Access-Control-Allow-Origin: * + X-Content-Type-Options: nosniff + +/ccr-provider-buttons.js + Cache-Control: public, max-age=300, s-maxage=86400 + Content-Type: application/javascript; charset=utf-8 + +/ccr-icon.png + Cache-Control: public, max-age=31536000, immutable diff --git a/cdn/public/ccr-icon.png b/cdn/public/ccr-icon.png new file mode 100644 index 0000000..42cdfc1 Binary files /dev/null and b/cdn/public/ccr-icon.png differ diff --git a/cdn/public/ccr-provider-buttons.js b/cdn/public/ccr-provider-buttons.js new file mode 100644 index 0000000..534070c --- /dev/null +++ b/cdn/public/ccr-provider-buttons.js @@ -0,0 +1,302 @@ +(function () { + "use strict"; + + var VERSION = "0.2.0"; + var STYLE_ID = "ccr-provider-buttons-style"; + var OFFICIAL_CCR_ICON_URL = "https://cdn.ccrdesk.top/ccr-icon.png"; + + var LINK_PARAMS = [ + "name", + "base_url", + "api_key", + "protocol", + "icon", + "source", + "payload", + "usage_url", + "usage_method", + "usage_headers", + "usage_body", + "balance", + "balance_unit", + "subscription", + "subscription_limit", + "subscription_reset", + "subscription_unit", + "subscription_window" + ]; + var ELEMENT_ATTRIBUTES = LINK_PARAMS.concat(["manifest", "models", "fetch_usage", "description", "color", "color_2", "color_3"]); + + var CSS = [ + ".ccr-provider-button{--ccrpb-brand:#17201c;--ccrpb-brand-2:#36624d;--ccrpb-brand-3:#dff8eb;position:relative;isolation:isolate;display:grid;grid-template-columns:132px minmax(0,1fr);align-items:center;min-height:86px;width:100%;max-width:420px;padding:13px 16px 13px 12px;overflow:hidden;border:1px solid color-mix(in srgb,var(--ccrpb-brand-2) 42%,transparent);border-radius:12px;background:radial-gradient(circle at 14% 22%,color-mix(in srgb,var(--ccrpb-brand-3) 34%,transparent) 0,transparent 30%),radial-gradient(circle at 96% 96%,color-mix(in srgb,var(--ccrpb-brand-2) 44%,transparent) 0,transparent 46%),linear-gradient(135deg,var(--ccrpb-brand),color-mix(in srgb,var(--ccrpb-brand-2) 88%,#111 12%));box-shadow:0 10px 26px color-mix(in srgb,var(--ccrpb-brand) 22%,transparent),inset 0 1px 0 rgba(255,255,255,.16);box-sizing:border-box;color:#fff;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;text-decoration:none;transform:translateY(0);transition:border-color 180ms ease,box-shadow 220ms ease,transform 220ms ease;}", + ".ccr-provider-button::before{content:\"\";position:absolute;inset:-40% auto -40% -70%;z-index:-1;width:58%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.26),transparent);transform:skewX(-18deg);transition:transform 620ms ease;}", + ".ccr-provider-button::after{content:\"\";position:absolute;right:-38px;bottom:-52px;z-index:-2;width:132px;height:132px;border-radius:999px;background:radial-gradient(circle,color-mix(in srgb,var(--ccrpb-brand-3) 38%,transparent),transparent 68%);opacity:.82;transform:scale(.96);transition:opacity 220ms ease,transform 220ms ease;}", + ".ccr-provider-button:hover,.ccr-provider-button:focus-visible{border-color:color-mix(in srgb,var(--ccrpb-brand-3) 68%,rgba(255,255,255,.34));box-shadow:0 16px 34px color-mix(in srgb,var(--ccrpb-brand) 30%,transparent),0 0 0 1px color-mix(in srgb,var(--ccrpb-brand-3) 26%,transparent),inset 0 1px 0 rgba(255,255,255,.22);color:#fff;text-decoration:none;transform:translateY(-3px);}", + ".ccr-provider-button:hover::before,.ccr-provider-button:focus-visible::before{transform:translateX(320%) skewX(-18deg);}", + ".ccr-provider-button:hover::after,.ccr-provider-button:focus-visible::after{opacity:1;transform:scale(1.08);}", + ".ccr-provider-button:active{transform:translateY(-1px) scale(.992);}", + ".ccrpb-provider-icon{position:relative;z-index:1;grid-column:1;grid-row:1;justify-self:start;display:grid;place-items:center;width:48px;height:48px;overflow:hidden;border:1px solid rgba(255,255,255,.46);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--ccrpb-brand-3) 34%,rgba(255,255,255,.9)),color-mix(in srgb,var(--ccrpb-brand-2) 64%,#111 36%));box-shadow:0 8px 18px rgba(0,0,0,.14),inset 0 1px 0 rgba(255,255,255,.42);color:#fff;font-size:15px;font-weight:820;letter-spacing:0;line-height:1;text-shadow:0 1px 2px rgba(0,0,0,.34);transform:rotate(0) scale(1);transition:border-color 180ms ease,box-shadow 220ms ease,transform 220ms ease;}", + ".ccrpb-provider-icon img{box-sizing:border-box;display:block;width:100%;height:100%;background:color-mix(in srgb,#fff 84%,var(--ccrpb-brand-3));object-fit:contain;filter:drop-shadow(0 1px 1px rgba(0,0,0,.12));}", + ".ccrpb-provider-mark{display:block;max-width:42px;overflow:hidden;text-align:center;text-overflow:ellipsis;white-space:nowrap;}", + ".ccrpb-flow{display:inline-flex;grid-column:1;grid-row:1;align-items:center;justify-self:end;justify-content:flex-end;gap:8px;width:72px;height:48px;padding:0;border:0;background:transparent;color:rgba(255,255,255,.86);font-size:14px;font-weight:760;line-height:1;box-shadow:none;transform:translateX(0);transition:transform 220ms ease;}", + ".ccrpb-ccr-icon{box-sizing:border-box;display:grid;flex:0 0 auto;place-items:center;width:48px;height:48px;overflow:hidden;border:0;border-radius:12px;background:transparent;box-shadow:none;transition:transform 220ms ease;}", + ".ccrpb-ccr-icon img{box-sizing:border-box;display:block;width:48px;height:48px;border-radius:12px;}", + ".ccrpb-arrow{display:inline-block;order:-1;line-height:1;transform:translateX(0);transition:transform 220ms ease;}", + ".ccrpb-copy{display:grid;min-width:0;gap:2px;padding:0 0 0 6px;}", + ".ccrpb-name{display:block;overflow:hidden;color:#fff;font-size:15px;font-weight:780;line-height:1.25;text-overflow:ellipsis;white-space:nowrap;}", + ".ccrpb-description{display:block;overflow:hidden;color:rgba(255,255,255,.74);font-size:11px;font-weight:650;letter-spacing:0;line-height:1.35;text-overflow:ellipsis;white-space:nowrap;}", + ".ccr-provider-button:hover .ccrpb-provider-icon,.ccr-provider-button:focus-visible .ccrpb-provider-icon{border-color:color-mix(in srgb,var(--ccrpb-brand-3) 74%,rgba(255,255,255,.54));box-shadow:0 12px 24px rgba(0,0,0,.18),0 0 0 4px color-mix(in srgb,var(--ccrpb-brand-3) 16%,transparent),inset 0 1px 0 rgba(255,255,255,.52);transform:rotate(-3deg) scale(1.06);}", + ".ccr-provider-button:hover .ccrpb-flow,.ccr-provider-button:focus-visible .ccrpb-flow{transform:translateX(3px);}", + ".ccr-provider-button:hover .ccrpb-ccr-icon,.ccr-provider-button:focus-visible .ccrpb-ccr-icon{transform:scale(1.04);}", + ".ccr-provider-button:hover .ccrpb-arrow,.ccr-provider-button:focus-visible .ccrpb-arrow{transform:translateX(2px);}", + "@media (max-width:520px){.ccr-provider-button{grid-template-columns:118px minmax(0,1fr);min-height:92px;padding:12px}.ccrpb-provider-icon,.ccrpb-provider-icon img,.ccrpb-flow,.ccrpb-ccr-icon,.ccrpb-ccr-icon img{width:44px;height:44px}.ccrpb-provider-icon img,.ccrpb-ccr-icon,.ccrpb-ccr-icon img{border-radius:11px}.ccrpb-flow{width:66px;justify-self:end}}", + "@media (prefers-reduced-motion:reduce){.ccr-provider-button,.ccr-provider-button::before,.ccr-provider-button::after,.ccrpb-provider-icon,.ccrpb-flow,.ccrpb-ccr-icon,.ccrpb-arrow{transition:none}.ccr-provider-button:hover,.ccr-provider-button:focus-visible,.ccr-provider-button:hover .ccrpb-provider-icon,.ccr-provider-button:focus-visible .ccrpb-provider-icon,.ccr-provider-button:hover .ccrpb-flow,.ccr-provider-button:focus-visible .ccrpb-flow,.ccr-provider-button:hover .ccrpb-ccr-icon,.ccr-provider-button:focus-visible .ccrpb-ccr-icon,.ccr-provider-button:hover .ccrpb-arrow,.ccr-provider-button:focus-visible .ccrpb-arrow{transform:none}.ccr-provider-button::before{display:none}}" + ].join(""); + + function injectStyles() { + if (document.getElementById(STYLE_ID)) { + return; + } + var style = document.createElement("style"); + style.id = STYLE_ID; + style.textContent = CSS; + document.head.appendChild(style); + } + + function isPresent(value) { + return value !== undefined && value !== null && String(value).trim() !== ""; + } + + function stringifyValue(value) { + if (value === true) { + return "1"; + } + if (value === false) { + return "0"; + } + if (typeof value === "object") { + return JSON.stringify(value); + } + return String(value); + } + + function appendParam(params, key, value) { + if (!isPresent(value)) { + return; + } + if (Array.isArray(value)) { + value.forEach(function (item) { + if (isPresent(item)) { + params.append(key, stringifyValue(item)); + } + }); + return; + } + params.append(key, stringifyValue(value)); + } + + function providerUrl(options) { + options = options || {}; + var params = new URLSearchParams(); + if (isPresent(options.manifest)) { + params.set("manifest", stringifyValue(options.manifest)); + return "ccr://provider?" + params.toString(); + } + LINK_PARAMS.forEach(function (key) { + appendParam(params, key, options[key]); + }); + appendParam(params, "models", options.models); + appendParam(params, "fetch_usage", options.fetch_usage); + return "ccr://provider?" + params.toString(); + } + + function createImage(src, alt) { + var img = document.createElement("img"); + img.src = src; + img.alt = alt || ""; + img.loading = "lazy"; + img.decoding = "async"; + return img; + } + + function providerInitials(name) { + var words = String(name || "") + .replace(/[^A-Za-z0-9\u4e00-\u9fff]+/g, " ") + .trim() + .split(/\s+/) + .filter(Boolean); + if (words.length === 0) { + return "AI"; + } + if (words.length === 1) { + return words[0].slice(0, 2).toUpperCase(); + } + return (words[0].slice(0, 1) + words[1].slice(0, 1)).toUpperCase(); + } + + function protocolDescription(options) { + if (options.description) { + return options.description; + } + if (options.manifest) { + return "Remote provider manifest"; + } + if (options.protocol) { + return options.protocol.replace(/_/g, " "); + } + return "Import provider to CCR"; + } + + function providerName(options) { + return options.name || (options.manifest ? "Provider manifest" : "Provider"); + } + + function providerId(options) { + return providerName(options).toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || "provider"; + } + + function applyColors(element, options) { + element.style.setProperty("--ccrpb-brand", options.color || "#17201c"); + element.style.setProperty("--ccrpb-brand-2", options.color_2 || "#36624d"); + element.style.setProperty("--ccrpb-brand-3", options.color_3 || "#dff8eb"); + } + + function createProviderIcon(options) { + var shell = document.createElement("span"); + shell.className = "ccrpb-provider-icon"; + if (options.icon) { + shell.appendChild(createImage(options.icon, providerName(options))); + return shell; + } + var mark = document.createElement("span"); + mark.className = "ccrpb-provider-mark"; + mark.textContent = providerInitials(providerName(options)); + shell.appendChild(mark); + return shell; + } + + function createButton(options) { + options = options || {}; + var button = document.createElement("a"); + button.className = "ccr-provider-button ccr-provider-" + providerId(options); + button.href = providerUrl(options); + button.dataset.ccrProviderName = providerName(options); + button.setAttribute("aria-label", "Import " + providerName(options) + " provider to CCR"); + applyColors(button, options); + + var providerIcon = createProviderIcon(options); + + var flow = document.createElement("span"); + flow.className = "ccrpb-flow"; + + var ccrIconShell = document.createElement("span"); + ccrIconShell.className = "ccrpb-ccr-icon"; + ccrIconShell.appendChild(createImage(OFFICIAL_CCR_ICON_URL, "CCR")); + + var arrow = document.createElement("span"); + arrow.className = "ccrpb-arrow"; + arrow.setAttribute("aria-hidden", "true"); + arrow.textContent = "→"; + + flow.appendChild(ccrIconShell); + flow.appendChild(arrow); + + var copy = document.createElement("span"); + copy.className = "ccrpb-copy"; + + var name = document.createElement("span"); + name.className = "ccrpb-name"; + name.textContent = providerName(options); + + var description = document.createElement("span"); + description.className = "ccrpb-description"; + description.textContent = protocolDescription(options); + + copy.appendChild(name); + copy.appendChild(description); + + button.appendChild(providerIcon); + button.appendChild(flow); + button.appendChild(copy); + return button; + } + + function render(target, options) { + options = options || {}; + var root = typeof target === "string" ? document.querySelector(target) : target; + if (!root) { + throw new Error("CCRProviderButtons.render target not found"); + } + injectStyles(); + var button = createButton(options); + if (options.clear !== false) { + root.textContent = ""; + } + root.appendChild(button); + return { + element: button, + href: button.href, + destroy: function () { + if (button.parentNode) { + button.parentNode.removeChild(button); + } + } + }; + } + + function attributeOptions(element) { + var options = {}; + ELEMENT_ATTRIBUTES.forEach(function (name) { + if (!element.hasAttribute(name)) { + return; + } + var value = element.getAttribute(name); + options[name] = name === "fetch_usage" && value === "" ? true : value; + }); + return options; + } + + function defineElement(name) { + if (!("customElements" in window) || customElements.get(name)) { + return; + } + customElements.define(name, class extends HTMLElement { + static get observedAttributes() { + return ELEMENT_ATTRIBUTES; + } + connectedCallback() { + this.render(); + } + attributeChangedCallback() { + if (this.isConnected) { + this.render(); + } + } + render() { + render(this, attributeOptions(this)); + } + }); + } + + function defineElements() { + defineElement("ccr-provider-button"); + defineElement("ccr-provider-buttons"); + } + + window.CCRProviderButtons = { + version: VERSION, + render: render, + renderButton: render, + createButton: function (options) { + injectStyles(); + return createButton(options || {}); + }, + createProviderUrl: providerUrl + }; + + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", defineElements, { once: true }); + } else { + defineElements(); + } +}()); diff --git a/cdn/wrangler.toml b/cdn/wrangler.toml new file mode 100644 index 0000000..3baae4b --- /dev/null +++ b/cdn/wrangler.toml @@ -0,0 +1,3 @@ +name = "claude-code-router-cdn" +compatibility_date = "2026-06-28" +pages_build_output_dir = "./public" diff --git a/components.json b/components.json new file mode 100644 index 0000000..a1acbd1 --- /dev/null +++ b/components.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "packages/ui/src/styles/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib" + }, + "iconLibrary": "lucide" +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..d4a0916 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,15 @@ +services: + ccr: + build: + context: . + dockerfile: Dockerfile + image: claude-code-router:local + ports: + # Publish only Nginx. Internal web/gateway listeners stay inside the container. + - "3458:8080" + volumes: + - ccr-data:/data + restart: unless-stopped + +volumes: + ccr-data: diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000..2b51a1f --- /dev/null +++ b/docker/README.md @@ -0,0 +1,91 @@ +# Docker deployment + +This image runs the core server package with PM2 and serves the built UI package +through Nginx. Nginx is the only published entrypoint: it serves the UI, proxies +management API calls to the internal core server, and proxies gateway API calls +to the internal gateway listener. + +## Build and run + +```sh +docker compose up --build +``` + +Then open: + +- Web UI: +- Gateway endpoint: + +`docker-compose.yml` publishes only Nginx (`3458:8080`). Behind Nginx, the image +runs separate container-private listeners for management RPC, API gateway +routing, and the core gateway runtime. They are implementation details and are +not published or configured by the default Compose file. + +To use a different host port, change the Compose port mapping and keep the +public router endpoint in sync: + +```yaml +services: + ccr: + ports: + - "8088:8080" + environment: + CCR_PUBLIC_BASE_URL: http://127.0.0.1:8088 +``` + +The container stores config and SQLite databases under `/data`, backed by the +`ccr-data` volume in `docker-compose.yml`. + +On a fresh data volume, the Web UI starts immediately. The gateway endpoint is +available through the same Nginx entrypoint, but the gateway only starts after at +least one provider and model are configured. + +## Image scripts + +```sh +npm run docker:build +npm run docker:run +``` + +## Smoke test + +```sh +npm run test:docker +``` + +The smoke test builds the image, starts an isolated temporary container with a +special-character `CCR_WEB_AUTH_TOKEN`, verifies that only the Nginx port is +published, checks UI and RPC authentication, confirms legacy Docker config is +migrated to the public Nginx router endpoint, and removes its temporary +container and volume. Set `CCR_DOCKER_TEST_SKIP_BUILD=1` to reuse an already +built image. + +The Dockerfile uses `node:22-bookworm` for build and native SQLite dependency +installation, then copies the production dependencies into a smaller +`node:22-bookworm-slim` runtime image. To use different base images: + +```sh +docker build \ + --build-arg NODE_IMAGE=node:22-bookworm \ + --build-arg RUNTIME_NODE_IMAGE=node:22-bookworm-slim \ + -t claude-code-router:local . +``` + +## Environment + +Most deployments only need the published Nginx port mapping, `CCR_WEB_AUTH_TOKEN`, +and optionally `CCR_PUBLIC_BASE_URL` when the host-facing URL is not +`http://127.0.0.1:3458`. + +| Variable | Default | Description | +| --- | --- | --- | +| `CCR_WEB_AUTH_TOKEN` | generated | Shared management UI token used by Nginx redirects and the core server. | +| `CCR_PUBLIC_BASE_URL` | `http://127.0.0.1:3458` | Full public router endpoint override. Set this when changing the host-facing Compose port. | +| `CCR_DATA_DIR` | `/data` | Container data root. | +| `CCR_NO_GATEWAY` | `0` | Set to `1` to run only the Web UI management service. | +| `CCR_DOCKER_INIT_CONFIG` | `1` | Set to `0` to disable first-run `config.json` bootstrap. | +| `CCR_DOCKER_SYNC_PUBLIC_ENDPOINT` | `1` | Sync existing Docker config to the Nginx public router endpoint on startup. | + +The first-run bootstrap writes a minimal legacy `config.json` only when neither +`config.json` nor `config.sqlite` exists in the mounted data directory. Once the +UI saves settings into SQLite, existing persisted configuration takes priority. diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100644 index 0000000..c4b8983 --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,207 @@ +#!/bin/sh +set -eu + +CCR_DATA_DIR="${CCR_DATA_DIR:-/data}" +CCR_WEB_HOST="${CCR_WEB_HOST:-127.0.0.1}" +CCR_WEB_PORT="${CCR_WEB_PORT:-3459}" +CCR_NGINX_PORT="${CCR_NGINX_PORT:-8080}" +CCR_GATEWAY_HOST="${CCR_GATEWAY_HOST:-127.0.0.1}" +CCR_GATEWAY_PORT="${CCR_GATEWAY_PORT:-3456}" +CCR_GATEWAY_CORE_PORT="${CCR_GATEWAY_CORE_PORT:-3457}" +CCR_PUBLIC_HOST="${CCR_PUBLIC_HOST:-127.0.0.1}" +CCR_PUBLIC_PORT="${CCR_PUBLIC_PORT:-3458}" +CCR_PUBLIC_BASE_URL="${CCR_PUBLIC_BASE_URL:-http://${CCR_PUBLIC_HOST}:${CCR_PUBLIC_PORT}}" +CCR_NO_GATEWAY="${CCR_NO_GATEWAY:-0}" + +if [ -z "${CCR_WEB_AUTH_TOKEN:-}" ]; then + CCR_WEB_AUTH_TOKEN="$(node -e "process.stdout.write(require('node:crypto').randomBytes(32).toString('base64url'))")" +fi +CCR_WEB_AUTH_TOKEN_QUERY="$(node -e "process.stdout.write(encodeURIComponent(process.argv[1] || ''))" "${CCR_WEB_AUTH_TOKEN}")" + +export HOME="${CCR_DATA_DIR}" +export CCR_DATA_DIR +export CCR_GATEWAY_CORE_PORT +export CCR_GATEWAY_HOST +export CCR_GATEWAY_PORT +export CCR_NGINX_PORT +export CCR_NO_GATEWAY +export CCR_PUBLIC_BASE_URL +export CCR_PUBLIC_HOST +export CCR_PUBLIC_PORT +export CCR_WEB_AUTH_TOKEN +export CCR_WEB_AUTH_TOKEN_QUERY +export CCR_WEB_HOST +export CCR_WEB_PORT + +CONFIG_DIR="${HOME}/.claude-code-router" +CONFIG_FILE="${CONFIG_DIR}/config.json" +APP_CONFIG_DB_FILE="${CONFIG_DIR}/config.sqlite" + +mkdir -p "${CONFIG_DIR}" "${CONFIG_DIR}/app-data" /run/nginx /var/lib/nginx /var/log/nginx + +if [ "${CCR_DOCKER_INIT_CONFIG:-1}" != "0" ] && [ ! -f "${CONFIG_FILE}" ] && [ ! -f "${APP_CONFIG_DB_FILE}" ]; then + node - <<'NODE' +const fs = require("node:fs"); +const path = require("node:path"); + +const configDir = path.join(process.env.HOME, ".claude-code-router"); +const configFile = path.join(configDir, "config.json"); +const gatewayHost = process.env.CCR_GATEWAY_HOST || "0.0.0.0"; +const gatewayPort = Number(process.env.CCR_GATEWAY_PORT || "3456"); +const gatewayCorePort = Number(process.env.CCR_GATEWAY_CORE_PORT || "3457"); +const publicBaseUrl = (process.env.CCR_PUBLIC_BASE_URL || `http://127.0.0.1:${process.env.CCR_PUBLIC_PORT || "3458"}`).replace(/\/+$/, ""); + +fs.mkdirSync(configDir, { recursive: true, mode: 0o700 }); +fs.writeFileSync(configFile, `${JSON.stringify({ + HOST: gatewayHost, + PORT: gatewayPort, + gateway: { + coreHost: "127.0.0.1", + corePort: gatewayCorePort, + enabled: true, + host: gatewayHost, + port: gatewayPort + }, + routerEndpoint: publicBaseUrl +}, null, 2)}\n`, { mode: 0o600 }); +NODE +fi + +if [ "${CCR_DOCKER_SYNC_PUBLIC_ENDPOINT:-1}" != "0" ]; then + node - <<'NODE' +const fs = require("node:fs"); +const path = require("node:path"); + +const configDir = path.join(process.env.HOME, ".claude-code-router"); +const configFile = path.join(configDir, "config.json"); +const appConfigDbFile = path.join(configDir, "config.sqlite"); +const gatewayHost = process.env.CCR_GATEWAY_HOST || "127.0.0.1"; +const gatewayPort = Number(process.env.CCR_GATEWAY_PORT || "3456"); +const gatewayCorePort = Number(process.env.CCR_GATEWAY_CORE_PORT || "3457"); +const publicBaseUrl = (process.env.CCR_PUBLIC_BASE_URL || `http://127.0.0.1:${process.env.CCR_PUBLIC_PORT || "3458"}`).replace(/\/+$/, ""); + +function syncConfig(value) { + if (!value || typeof value !== "object" || Array.isArray(value)) { + return value; + } + value.HOST = gatewayHost; + value.PORT = gatewayPort; + value.gateway = { + ...(value.gateway && typeof value.gateway === "object" && !Array.isArray(value.gateway) ? value.gateway : {}), + coreHost: "127.0.0.1", + corePort: gatewayCorePort, + enabled: true, + host: gatewayHost, + port: gatewayPort + }; + value.routerEndpoint = publicBaseUrl; + return value; +} + +function syncJsonFile() { + if (!fs.existsSync(configFile)) { + return; + } + const parsed = JSON.parse(fs.readFileSync(configFile, "utf8")); + fs.writeFileSync(configFile, `${JSON.stringify(syncConfig(parsed), null, 2)}\n`, { mode: 0o600 }); +} + +function syncSqliteConfig() { + if (!fs.existsSync(appConfigDbFile)) { + return; + } + let Database; + try { + Database = require("better-sqlite3"); + } catch { + return; + } + const db = new Database(appConfigDbFile); + try { + const row = db.prepare("select value_json from app_config where key = ?").get("default"); + if (!row?.value_json) { + return; + } + const parsed = JSON.parse(row.value_json); + db.prepare("update app_config set value_json = ?, updated_at = ? where key = ?") + .run(JSON.stringify(syncConfig(parsed)), new Date().toISOString(), "default"); + } finally { + db.close(); + } +} + +syncJsonFile(); +syncSqliteConfig(); +NODE +fi + +cat > /etc/nginx/conf.d/default.conf <=22.12.0" + }, + "optionalDependencies": { + "@astrojs/compiler-binding-darwin-arm64": "0.2.2", + "@astrojs/compiler-binding-darwin-x64": "0.2.2", + "@astrojs/compiler-binding-linux-arm64-gnu": "0.2.2", + "@astrojs/compiler-binding-linux-arm64-musl": "0.2.2", + "@astrojs/compiler-binding-linux-x64-gnu": "0.2.2", + "@astrojs/compiler-binding-linux-x64-musl": "0.2.2", + "@astrojs/compiler-binding-wasm32-wasi": "0.2.2", + "@astrojs/compiler-binding-win32-arm64-msvc": "0.2.2", + "@astrojs/compiler-binding-win32-x64-msvc": "0.2.2" + } + }, + "node_modules/@astrojs/compiler-binding-darwin-arm64": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-arm64/-/compiler-binding-darwin-arm64-0.2.2.tgz", + "integrity": "sha512-1WxpECx3izz5X4Ha3l6ex79HZlUHpKBTElGJsfOosnhVvXhccfcXAsBlrYPNmUOKJWiG7mcrje0ELSr1KPE69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-darwin-x64": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-x64/-/compiler-binding-darwin-x64-0.2.2.tgz", + "integrity": "sha512-PdIQidwQ4nUX/qNL0JXzSwNYadr+yX/Yoo+kZSCxBZqlAqug9SlKR/1H5EG5jSEpkEDRo2d1JdrO1W4kU6uNHw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-linux-arm64-gnu": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-gnu/-/compiler-binding-linux-arm64-gnu-0.2.2.tgz", + "integrity": "sha512-5sZicPkJCoyxTEOW2he+u6UV97pTXY4c7fbHOZ/aslu9ewsunD0231QUBSvnjBB9hRFzzP2JRfNCLY+IvWfw0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-linux-arm64-musl": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-musl/-/compiler-binding-linux-arm64-musl-0.2.2.tgz", + "integrity": "sha512-Vto5fqRzMepQNJPeEhQLOIkmAoNbSBQNlpMe64OHTjEbAtQpJYVHEwe+8WJLaEGLA9qBksLv7ctiYPLLxgVVYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-linux-x64-gnu": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-gnu/-/compiler-binding-linux-x64-gnu-0.2.2.tgz", + "integrity": "sha512-NJTTaUDU49WEJT+ImS9evlv3i3x42HN8PbcqdyydI9picnKtuf5TxRL94naoW09YDMYWpkrwVeVqaG7GTSIepQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-linux-x64-musl": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-musl/-/compiler-binding-linux-x64-musl-0.2.2.tgz", + "integrity": "sha512-9nFdNDkWaU35bhWUIciDmi439W0fq2ZNgv1GCi2A/LSb+8vTw9l9z+fVW4YEn7Tlvbs8gyQkJvbc62ZD1H76xA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-wasm32-wasi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-wasm32-wasi/-/compiler-binding-wasm32-wasi-0.2.2.tgz", + "integrity": "sha512-3NWaxRc3KSwr9zHBEGcQ147rMgAhi/HzZWZJPRN2YLbtuLhoeBPruhdX1MIlOYAg3FvJPYdzGCAKvvWWU6pF0A==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.5" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@astrojs/compiler-binding-win32-arm64-msvc": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-arm64-msvc/-/compiler-binding-win32-arm64-msvc-0.2.2.tgz", + "integrity": "sha512-QsyOgocLGOwDm8zAyuAiziALMzbTTevaqBLv5lvdhyhj2JC5yjp0H3yeEBtE0owRLr1gDQdX0+1qBSc5tTwp4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-win32-x64-msvc": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-x64-msvc/-/compiler-binding-win32-x64-msvc-0.2.2.tgz", + "integrity": "sha512-+/C8Oh9YS8C0fwtaqDtUSPniKwlJqgiQbxp7XuzxCP0RI/Jf7yOlz9ZHNr6jD3ZJa4CHdq0mYq7pd8QFiNGIZA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-rs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-rs/-/compiler-rs-0.2.2.tgz", + "integrity": "sha512-C0qoz7Hxa2krlwMYfzQ1ZxOjR6cGmO+iskjRXXCdUM85W/cAPGTi/MSQlLkv0ADMz+Go1/lqeRBjL8AZwsFffQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/compiler-binding": "0.2.2" + } + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.0.tgz", + "integrity": "sha512-Ry2R3VPeIN4uPCSA4xQc+e+vsJXkalKpEbDc07hV+a/o5Bs2N/s/uDcPJH/05L19DKh9tAy7e6JM3YZ6Cxfezw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.1.1", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" + } + }, + "node_modules/@astrojs/markdown-satteri": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.3.1.tgz", + "integrity": "sha512-4cvSQp2yUm50LeReHJfuQt5N0rfQEepveVJv1SCitVerTGRjj0SrXCzP89NHb9VJou87Ldi9uw8uQDVCv5rC6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.10.0", + "@astrojs/prism": "4.0.2", + "github-slugger": "^2.0.0", + "satteri": "^0.9.1" + } + }, + "node_modules/@astrojs/prism": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", + "integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "prismjs": "^1.30.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.2.tgz", + "integrity": "sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^4.4.0", + "dset": "^3.1.4", + "is-docker": "^4.0.0", + "is-wsl": "^3.1.1", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bruits/satteri-darwin-arm64": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.9.1.tgz", + "integrity": "sha512-NE4qC2sRd0+R+oPMsKcUikIvWTGpAV16fSXNBoMSW7nK7Pd9e/ZGB7M8knep83pFmGmOb/5NbGKiVIh3oLbljw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@bruits/satteri-darwin-x64": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-x64/-/satteri-darwin-x64-0.9.1.tgz", + "integrity": "sha512-Am8z5nX0L/sJR/n7np+5rMVP434MOBe3zlU+IO8fXbv2UaPNRCrEQPMS6lyxCj7dZHQI2AynSJw3v4fgQE8xSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@bruits/satteri-linux-x64-gnu": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-gnu/-/satteri-linux-x64-gnu-0.9.1.tgz", + "integrity": "sha512-Bivw60+SIfmlaU9wEZ39HAcyPh1xU9TvOrz4KJgc+ziRStQs4EzYoWW4Eh9aSdiol+xV0vjEWYuA79aF3dr7kg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@bruits/satteri-wasm32-wasi": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@bruits/satteri-wasm32-wasi/-/satteri-wasm32-wasi-0.9.1.tgz", + "integrity": "sha512-lEFk5ebh5SxRquA5RJisEoMoDmOiSnS10PGgXgXeVlWgF8KWKI9D3hSzVqNjEg/qKOjHcNdjIfyx/03Wrl6J3g==", + "cpu": [ + "wasm32" + ], + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/core": "1.9.1", + "@emnapi/runtime": "1.9.1", + "@napi-rs/wasm-runtime": "^1.1.5" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@bruits/satteri-win32-x64-msvc": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.9.1.tgz", + "integrity": "sha512-YBhm8yARopswAPeTih11BzMxWVQFD5CI9Yryp6HWepi6F/CeMycqxv18DXrj9U2fDDlbVGwT2IiEM2UPBjIPDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@capsizecss/unpack": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.1.tgz", + "integrity": "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@clack/core": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.2.tgz", + "integrity": "sha512-0Ty/1Gfm+Kb07sXcuESjyKfwEhSy4Ns1AgeEisHb/bDY5fWme0tTeTkU14T1Gmcs17YIjB/teiDe4uaCghbYqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" + } + }, + "node_modules/@clack/prompts": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.6.0.tgz", + "integrity": "sha512-EYlRokl8szrP9Z25qT5aepMdBjzBvHF9ZEhzIiUBc9guz/T31EqRgvD0QSgZcpE93xiwrr+OkB4nz0BZyF6fSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@clack/core": "1.4.2", + "fast-string-width": "^3.0.2", + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", + "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@oxc-project/types": { + "version": "0.133.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", + "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", + "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", + "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", + "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", + "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", + "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", + "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", + "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", + "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", + "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", + "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", + "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", + "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", + "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", + "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", + "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@shikijs/core": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.2.0.tgz", + "integrity": "sha512-Hc87Ab1Ld/vEbZRCbwx344I5v+4RU8CVToUTRkqXL1+TjbuOp9U5Xa0M23V4GEWHxVn+yO5otb+HkQVm3ptWQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/primitive": "4.2.0", + "@shikijs/types": "4.2.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.2.0.tgz", + "integrity": "sha512-fjETeq1k5ffyXqRgS6+3hpvqseLalp1kjNfRbXpUgWR8FpZ1CmQfiNHovc5lncYjt/Vg5JK/WJEmLahjwMa0og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.2.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.6" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.2.0.tgz", + "integrity": "sha512-hTorK1dffPkpbMUk6Z+828PgRo7d07HbnizoP0hNPFjhxMHctj0Px/qoHeGMYafc6ju+u9iMldN4JbVzNQM++g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.2.0", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/langs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.2.0.tgz", + "integrity": "sha512-bwrVRlJ0wUhZxAbVdvBbv2TTC9yLsh4C/IO5Ofz0T8MQntgDvyVnkbjw9vi50r1kx7RCIJdnJnjZAwmAsXFLZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.2.0.tgz", + "integrity": "sha512-NOq+DtUkVBJtZMVXL5A0vI0Xk8nvDYaXetFHSJFlOqjDZIVhIPRYFdGkSoElDqNuegikcc3A76SNUa8dTqtAYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.2.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/themes": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.2.0.tgz", + "integrity": "sha512-RX8IHYeLv8Cu2W6ruc3RxUqWn0IYCqSrMBzi/uRGAmfyDNOnNO5BF/Px7o97n4XTpmFTo5GbRaazuOWj+2ak2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/types": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.2.0.tgz", + "integrity": "sha512-VT/MKtlpOhEPZloSH3Pb9WCZEBDoQVMa9jedp5UAwmJOar1DVc9DRODAxmYPW9M93IK4ryuqRejFfmlvlVDemw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", + "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", + "dev": true, + "license": "ISC" + }, + "node_modules/am-i-vibing": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/am-i-vibing/-/am-i-vibing-0.3.0.tgz", + "integrity": "sha512-JTg9e3qPmVP6x8PG9/J4+eCVP6sGx9oS1pSbgf7fpPVlkHzQdRPSNMb6dBlp9BrdBNxDkctMzehPVYSnt16k4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "process-ancestry": "^0.1.0" + }, + "bin": { + "am-i-vibing": "dist/cli.mjs" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/astro": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/astro/-/astro-7.0.0.tgz", + "integrity": "sha512-ZhsKmnS1V4Bik3Rupl2GA3fRNNVEgQW1Twif7MjKBjGC2qkJFMdAaCVaEwFXlhy9NFRTwcQZlUevWCK+2G2PBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/compiler-rs": "^0.2.2", + "@astrojs/internal-helpers": "0.10.0", + "@astrojs/markdown-satteri": "0.3.1", + "@astrojs/telemetry": "3.3.2", + "@capsizecss/unpack": "^4.0.0", + "@clack/prompts": "^1.1.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "am-i-vibing": "^0.3.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "ci-info": "^4.4.0", + "clsx": "^2.1.1", + "common-ancestor-path": "^2.0.0", + "cookie": "^1.1.1", + "devalue": "^5.8.1", + "diff": "^8.0.3", + "dset": "^3.1.4", + "es-module-lexer": "^2.0.0", + "esbuild": "^0.28.0", + "flattie": "^1.1.1", + "fontace": "~0.4.1", + "get-tsconfig": "5.0.0-beta.4", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "js-yaml": "^4.1.1", + "jsonc-parser": "^3.3.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.2", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "obug": "^2.1.1", + "p-limit": "^7.3.0", + "p-queue": "^9.1.0", + "package-manager-detector": "^1.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.4", + "rehype": "^13.0.2", + "semver": "^7.7.4", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "svgo": "^4.0.1", + "tinyclip": "^0.1.12", + "tinyexec": "^1.0.4", + "tinyglobby": "^0.2.15", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.4", + "unist-util-visit": "^5.1.0", + "unstorage": "^1.17.5", + "vfile": "^6.0.3", + "vite": "^8.0.13", + "vitefu": "^1.1.2", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^22.0.0", + "zod": "^4.3.6" + }, + "bin": { + "astro": "bin/astro.mjs" + }, + "engines": { + "node": ">=22.12.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.34.0" + }, + "peerDependencies": { + "@astrojs/markdown-remark": "7.2.0" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-remark": { + "optional": true + } + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/common-ancestor-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", + "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">= 18" + } + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cookie-es": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", + "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", + "dev": true, + "license": "MIT" + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.8.1.tgz", + "integrity": "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } + }, + "node_modules/fast-wrap-ansi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", + "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-string-width": "^3.0.2" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fontace": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz", + "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.2" + } + }, + "node_modules/fontkitten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz", + "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "5.0.0-beta.4", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.4.tgz", + "integrity": "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "engines": { + "node": ">=20.20.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "dev": true, + "license": "ISC" + }, + "node_modules/h3": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", + "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.3", + "crossws": "^0.3.5", + "defu": "^6.1.6", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-docker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz", + "integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-yaml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/lucide-astro": { + "version": "0.556.0", + "resolved": "https://registry.npmjs.org/lucide-astro/-/lucide-astro-0.556.0.tgz", + "integrity": "sha512-ugMjPb45AMfkLCaduNSbyy5NQEKvB1TxVVMmUS4S6L807PMESnX0Qp+DIKHjbyjJmPXOyLRbrzvR3YikTK7brg==", + "deprecated": "Deprecated: Use `@lucide/astro`", + "dev": true, + "license": "MIT", + "peerDependencies": { + "astro": ">=2.7.1" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", + "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/nanoid": { + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-mock-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/obug": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", + "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/oniguruma-parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", + "dev": true, + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/p-limit": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz", + "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.2.1" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.0.tgz", + "integrity": "sha512-7NED7xhQ74Ngp4JP/2e0VZHp7vSWfJfqeiR92jPgxsz6m0Se4P03YoTKa9dDXyZ3r6P616gUXttrB6nnHYKang==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.4", + "p-timeout": "^7.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", + "dev": true, + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-ancestry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/process-ancestry/-/process-ancestry-0.1.0.tgz", + "integrity": "sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rolldown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", + "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.133.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.3", + "@rolldown/binding-darwin-arm64": "1.0.3", + "@rolldown/binding-darwin-x64": "1.0.3", + "@rolldown/binding-freebsd-x64": "1.0.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", + "@rolldown/binding-linux-arm64-gnu": "1.0.3", + "@rolldown/binding-linux-arm64-musl": "1.0.3", + "@rolldown/binding-linux-ppc64-gnu": "1.0.3", + "@rolldown/binding-linux-s390x-gnu": "1.0.3", + "@rolldown/binding-linux-x64-gnu": "1.0.3", + "@rolldown/binding-linux-x64-musl": "1.0.3", + "@rolldown/binding-openharmony-arm64": "1.0.3", + "@rolldown/binding-wasm32-wasi": "1.0.3", + "@rolldown/binding-win32-arm64-msvc": "1.0.3", + "@rolldown/binding-win32-x64-msvc": "1.0.3" + } + }, + "node_modules/satteri": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.9.1.tgz", + "integrity": "sha512-0oIBjwDxWvz8ePRSBxv8vEdZ0GI25/UcSq11y4651tJztUAmZlIdPjFx8luqBAM22g8YKVr5R17KaaZ2kIfLrw==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.5", + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3" + }, + "optionalDependencies": { + "@bruits/satteri-darwin-arm64": "0.9.1", + "@bruits/satteri-darwin-x64": "0.9.1", + "@bruits/satteri-linux-x64-gnu": "0.9.1", + "@bruits/satteri-wasm32-wasi": "0.9.1", + "@bruits/satteri-win32-x64-msvc": "0.9.1" + } + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/shiki": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.2.0.tgz", + "integrity": "sha512-hjNax6o/ylDy9lefQEaSDtzaT3iVNtZ3WmpQnbuQNoG4xvnSKf2kSKbihZVO4JRG1TTMejs7CmNRYlWgAL66pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.2.0", + "@shikijs/engine-javascript": "4.2.0", + "@shikijs/engine-oniguruma": "4.2.0", + "@shikijs/langs": "4.2.0", + "@shikijs/themes": "4.2.0", + "@shikijs/types": "4.2.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/smol-toml": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.0.tgz", + "integrity": "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/svgo": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", + "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyclip": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.15.tgz", + "integrity": "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >= 17.3.0" + } + }, + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unifont": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.4.tgz", + "integrity": "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.1.0", + "ofetch": "^1.5.1", + "ohash": "^2.0.11" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unstorage": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz", + "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.10", + "lru-cache": "^11.2.7", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", + "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.3", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000..0f0aa87 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,17 @@ +{ + "name": "claude-code-router-docs", + "private": true, + "version": "0.1.0", + "license": "MIT", + "type": "module", + "scripts": { + "dev": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "devDependencies": { + "astro": "7.0.0", + "lucide-astro": "^0.556.0" + } +} diff --git a/docs/public/CNAME b/docs/public/CNAME new file mode 100644 index 0000000..c47ccbf --- /dev/null +++ b/docs/public/CNAME @@ -0,0 +1 @@ +ccrdesk.top diff --git a/docs/public/ccr-icon.png b/docs/public/ccr-icon.png new file mode 100644 index 0000000..42cdfc1 Binary files /dev/null and b/docs/public/ccr-icon.png differ diff --git a/docs/public/favicon.svg b/docs/public/favicon.svg new file mode 100644 index 0000000..0be071d --- /dev/null +++ b/docs/public/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/public/logo.png b/docs/public/logo.png new file mode 100644 index 0000000..76801d1 Binary files /dev/null and b/docs/public/logo.png differ diff --git a/docs/public/provider-icons/anthropic.png b/docs/public/provider-icons/anthropic.png new file mode 100644 index 0000000..c884fe1 Binary files /dev/null and b/docs/public/provider-icons/anthropic.png differ diff --git a/docs/public/provider-icons/bailian.ico b/docs/public/provider-icons/bailian.ico new file mode 100644 index 0000000..f525bfa Binary files /dev/null and b/docs/public/provider-icons/bailian.ico differ diff --git a/docs/public/provider-icons/claudeapi.png b/docs/public/provider-icons/claudeapi.png new file mode 100644 index 0000000..776ced8 Binary files /dev/null and b/docs/public/provider-icons/claudeapi.png differ diff --git a/docs/public/provider-icons/code0.png b/docs/public/provider-icons/code0.png new file mode 100644 index 0000000..32d81c1 Binary files /dev/null and b/docs/public/provider-icons/code0.png differ diff --git a/docs/public/provider-icons/deepseek.ico b/docs/public/provider-icons/deepseek.ico new file mode 100644 index 0000000..8e78c0b Binary files /dev/null and b/docs/public/provider-icons/deepseek.ico differ diff --git a/docs/public/provider-icons/fenno.jpg b/docs/public/provider-icons/fenno.jpg new file mode 100644 index 0000000..364f735 Binary files /dev/null and b/docs/public/provider-icons/fenno.jpg differ diff --git a/docs/public/provider-icons/gemini.svg b/docs/public/provider-icons/gemini.svg new file mode 100644 index 0000000..38f5625 --- /dev/null +++ b/docs/public/provider-icons/gemini.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/public/provider-icons/mistral.webp b/docs/public/provider-icons/mistral.webp new file mode 100644 index 0000000..74e3817 Binary files /dev/null and b/docs/public/provider-icons/mistral.webp differ diff --git a/docs/public/provider-icons/moonshot.ico b/docs/public/provider-icons/moonshot.ico new file mode 100644 index 0000000..9b4870b Binary files /dev/null and b/docs/public/provider-icons/moonshot.ico differ diff --git a/docs/public/provider-icons/openai.png b/docs/public/provider-icons/openai.png new file mode 100644 index 0000000..16896d2 Binary files /dev/null and b/docs/public/provider-icons/openai.png differ diff --git a/docs/public/provider-icons/openrouter.ico b/docs/public/provider-icons/openrouter.ico new file mode 100644 index 0000000..5d47b23 Binary files /dev/null and b/docs/public/provider-icons/openrouter.ico differ diff --git a/docs/public/provider-icons/qiniu-ai.png b/docs/public/provider-icons/qiniu-ai.png new file mode 100644 index 0000000..2ff255d Binary files /dev/null and b/docs/public/provider-icons/qiniu-ai.png differ diff --git a/docs/public/provider-icons/runapi.jpg b/docs/public/provider-icons/runapi.jpg new file mode 100644 index 0000000..cbd5e94 Binary files /dev/null and b/docs/public/provider-icons/runapi.jpg differ diff --git a/docs/public/provider-icons/siliconflow.png b/docs/public/provider-icons/siliconflow.png new file mode 100644 index 0000000..a4fd985 Binary files /dev/null and b/docs/public/provider-icons/siliconflow.png differ diff --git a/docs/public/provider-icons/teamorouter.png b/docs/public/provider-icons/teamorouter.png new file mode 100644 index 0000000..55f0c06 Binary files /dev/null and b/docs/public/provider-icons/teamorouter.png differ diff --git a/docs/public/provider-icons/zai-global-coding.svg b/docs/public/provider-icons/zai-global-coding.svg new file mode 100644 index 0000000..4f511bd --- /dev/null +++ b/docs/public/provider-icons/zai-global-coding.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/public/provider-icons/zai-global-general.svg b/docs/public/provider-icons/zai-global-general.svg new file mode 100644 index 0000000..4f511bd --- /dev/null +++ b/docs/public/provider-icons/zai-global-general.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/public/provider-icons/zhipu-cn-coding.png b/docs/public/provider-icons/zhipu-cn-coding.png new file mode 100644 index 0000000..0cc7d36 Binary files /dev/null and b/docs/public/provider-icons/zhipu-cn-coding.png differ diff --git a/docs/public/provider-icons/zhipu-cn-general.png b/docs/public/provider-icons/zhipu-cn-general.png new file mode 100644 index 0000000..0cc7d36 Binary files /dev/null and b/docs/public/provider-icons/zhipu-cn-general.png differ diff --git a/docs/src/bot-platforms.ts b/docs/src/bot-platforms.ts new file mode 100644 index 0000000..275e36b --- /dev/null +++ b/docs/src/bot-platforms.ts @@ -0,0 +1,62 @@ +export type BotPlatformModule = { + Content: any; + frontmatter: { + title?: string; + pageTitle?: string; + eyebrow?: string; + lead?: string; + [key: string]: unknown; + }; + getHeadings: () => { depth: number; slug: string; text: string }[]; + rawContent: () => string; +}; + +export const zhBotDocs = import.meta.glob( + "./content/docs/zh/bot-与-im-接力-agent/*.md", + { eager: true } +); + +export const enBotDocs = import.meta.glob( + "./content/docs/en/relay-agents-in-im-with-bots/*.md", + { eager: true } +); + +export const BOT_PLATFORM_ORDER = [ + "slack", + "discord", + "telegram", + "line", + "weixin-ilink", + "wecom", + "feishu", + "dingtalk", +] as const; + +export type BotPlatformSlug = (typeof BOT_PLATFORM_ORDER)[number]; + +export const BOT_PLATFORM_LABELS_ZH: Record = { + slack: "Slack", + discord: "Discord", + telegram: "Telegram", + line: "LINE", + "weixin-ilink": "微信", + wecom: "企业微信", + feishu: "飞书", + dingtalk: "钉钉", +}; + +export const BOT_PLATFORM_LABELS_EN: Record = { + slack: "Slack", + discord: "Discord", + telegram: "Telegram", + line: "LINE", + "weixin-ilink": "Weixin", + wecom: "WeCom", + feishu: "Feishu", + dingtalk: "DingTalk", +}; + +export function botPlatformFromPath(filePath: string): string { + const file = filePath.split("/").pop() ?? filePath; + return file.replace(/\.md$/, ""); +} diff --git a/docs/src/components/DocPage.astro b/docs/src/components/DocPage.astro new file mode 100644 index 0000000..da5387e --- /dev/null +++ b/docs/src/components/DocPage.astro @@ -0,0 +1,318 @@ +--- +import DocsLayout from "../layouts/DocsLayout.astro"; +import { docsContent, type DocPageKey, type Locale } from "../i18n/content"; +import * as enConfigurationDoc from "../content/docs/en/configuration.md"; +import * as enGuidesDoc from "../content/docs/en/guides.md"; +import * as enDoc from "../content/docs/en/index.md"; +import * as enTroubleshootingDoc from "../content/docs/en/troubleshooting.md"; +import * as zhConfigurationDoc from "../content/docs/zh/configuration.md"; +import * as zhGuidesDoc from "../content/docs/zh/guides.md"; +import * as zhDoc from "../content/docs/zh/index.md"; +import * as zhTroubleshootingDoc from "../content/docs/zh/troubleshooting.md"; +import { Check, Copy } from "lucide-astro"; + +interface Props { + locale: Locale; + pageKey?: DocPageKey; + doc?: any; + activeSidebarItem?: string; +} + +const docsByLocale = { + zh: { + documentation: zhDoc, + guides: zhGuidesDoc, + configuration: zhConfigurationDoc, + troubleshooting: zhTroubleshootingDoc, + }, + en: { + documentation: enDoc, + guides: enGuidesDoc, + configuration: enConfigurationDoc, + troubleshooting: enTroubleshootingDoc, + }, +} satisfies Record>; + +const { + locale, + pageKey: pageKeyProp = "documentation", + doc: docProp, + activeSidebarItem: activeSidebarItemProp, +} = Astro.props; +const content = docsContent[locale]; +const pages = content.pages as Record; +const pageKey = pageKeyProp; +const pageContent = pages[pageKey] ?? pages.documentation; +const sectionDoc = docsByLocale[locale][pageKey] ?? docsByLocale[locale].documentation; +const sectionHref = + content.navItems.find((item) => item.pageKey === pageKey)?.href ?? + (locale === "en" ? "/en/" : "/"); +const isSectionDoc = !docProp || docProp === sectionDoc; +const doc = docProp ?? sectionDoc; +const { Content, frontmatter } = doc; +const allHeadings = doc.getHeadings(); +const tocHeadings = allHeadings.filter((heading) => heading.depth >= 2 && heading.depth <= 5); +const isExplicitHref = (value: string) => + value.startsWith("#") || + value.startsWith("/") || + value.startsWith("//") || + /^[a-z][a-z\d+.-]*:/i.test(value); + +const getHeadingLinks = (targetDoc: any, baseHref: string, useLocalHashes: boolean) => { + const links = new Map(); + + for (const heading of targetDoc.getHeadings()) { + if (!links.has(heading.text)) { + links.set( + heading.text, + useLocalHashes ? `#${heading.slug}` : `${baseHref}#${heading.slug}` + ); + } + } + + return links; +}; +const sectionHeadingLinks = getHeadingLinks(sectionDoc, sectionHref, isSectionDoc); +const resolveDocTarget = (target?: string, headingLinks = sectionHeadingLinks) => { + if (!target) return "#"; + if (isExplicitHref(target)) return target; + return headingLinks.get(target) ?? "#"; +}; +const navItems = content.navItems.map((item) => { + return { + ...item, + active: item.pageKey === pageKey, + }; +}); +const sidebarLabels = new Set(); + +for (const group of pageContent.sidebarGroups) { + for (const item of group.items) { + sidebarLabels.add(item); + + for (const child of pageContent.sidebarChildren[item] ?? []) { + sidebarLabels.add(child); + } + } +} + +const sidebarLinks = Object.fromEntries( + Array.from(sidebarLabels).map((label) => [ + label, + resolveDocTarget( + pageContent.sidebarLinks[label] ?? + pageContent.sidebarTargets[label] ?? + label + ), + ]) +); +const sidebarNavItems = content.navItems.filter((navItem) => navItem.pageKey !== "documentation"); +const sidebarTree = sidebarNavItems.map((navItem, index) => { + const navPageKey = navItem.pageKey as DocPageKey; + const navPageContent = pages[navPageKey] ?? pages.documentation; + const navSectionDoc = docsByLocale[locale][navPageKey] ?? docsByLocale[locale].documentation; + const navHref = navItem.href ?? "#"; + const navIsCurrentSection = navPageKey === pageKey && isSectionDoc; + const navHeadingLinks = getHeadingLinks(navSectionDoc, navHref, navIsCurrentSection); + const navActive = navPageKey === pageKey; + const openByDefault = pageKey === "documentation" && index === 0; + + return { + label: navItem.label, + href: navHref, + active: navActive, + open: navActive || openByDefault, + groups: navPageContent.sidebarGroups.map((group) => ({ + ...group, + active: navActive && group.active, + items: group.items.map((item) => { + const childItems = navPageContent.sidebarChildren[item] ?? []; + const itemHref = resolveDocTarget( + navPageContent.sidebarLinks[item] ?? + navPageContent.sidebarTargets[item] ?? + item, + navHeadingLinks + ); + + const children = childItems.map((child) => ({ + label: child, + href: resolveDocTarget( + navPageContent.sidebarLinks[child] ?? + navPageContent.sidebarTargets[child] ?? + child, + navHeadingLinks + ), + active: navActive && activeSidebarItemProp === child, + })); + + return { + label: item, + href: itemHref, + active: navActive && (activeSidebarItemProp ? activeSidebarItemProp === item : group.active === item), + children, + }; + }), + })), + }; +}); +const tocItems = tocHeadings.map((heading) => ({ + label: heading.text, + href: `#${heading.slug}`, + depth: heading.depth, +})); +const pageMarkdown = doc.rawContent(); +--- + + +
+
+
+

{frontmatter.eyebrow}

+

{frontmatter.title}

+

{frontmatter.lead}

+
+ +
+ +
+ +
+
+ + + + +
diff --git a/docs/src/configuration-docs.ts b/docs/src/configuration-docs.ts new file mode 100644 index 0000000..609c8c1 --- /dev/null +++ b/docs/src/configuration-docs.ts @@ -0,0 +1,28 @@ +export type ConfigurationDocModule = { + Content: any; + frontmatter: { + title?: string; + pageTitle?: string; + eyebrow?: string; + lead?: string; + [key: string]: unknown; + }; + getHeadings: () => { depth: number; slug: string; text: string }[]; + rawContent: () => string; +}; + +export const zhConfigurationDocs = import.meta.glob( + "./content/docs/zh/configuration/*.md", + { eager: true } +); + +export const enConfigurationDocs = import.meta.glob( + "./content/docs/en/configuration/*.md", + { eager: true } +); + +export function configurationSlugFromPath(filePath: string): string { + const file = filePath.split("/").pop() ?? filePath; + return file.replace(/\.md$/, ""); +} + diff --git a/docs/src/content/docs/en/configuration.md b/docs/src/content/docs/en/configuration.md new file mode 100644 index 0000000..2294e3a --- /dev/null +++ b/docs/src/content/docs/en/configuration.md @@ -0,0 +1,38 @@ +--- +title: Claude Code Router Detailed Configuration +pageTitle: Detailed Configuration +eyebrow: Detailed Configuration +lead: "Separate main app pages from settings pages while following the app's actual order: main pages cover overview, providers, Agent Config, routing, Fusion, API keys, logs and observability, server, and extensions; settings pages cover ToolHub, Bots, data, and tray." +--- + +## Page Structure + +Detailed configuration docs are split into standalone pages. Every left-sidebar item opens a page; the right outline is reserved for headings inside the current page. Main pages follow the app's left navigation order. Settings pages are grouped separately and follow the settings dialog order. + +## Main Pages + +| Page | Covers | +| --- | --- | +| Overview Dashboard | System status, account balance, usage widgets, layout editing, and share cards | +| Provider Config | Upstream services, protocol, Base URL, model list, and credentials | +| One click import | Provider deeplink protocol, manifest import, one-click import buttons, and security boundaries | +| Agent Config | Agent launch method, model, scope, multi-instance launching, and Bot binding | +| Routing Config | Default routing, conditional rules, fallback, and request rewrites | +| Fusion Models | Combine a base model with vision, search, or MCP tools into a new selectable model | +| API Keys | Client access keys, expiration, and local limits | +| Logs & Observability | Request logs, Agent execution traces, tool calls, and tool results | +| Server | Host, port, proxy mode, system proxy, network capture, and CA certificate | +| Extension Mechanism | Wrapper plugins, core gateway plugins, custom extension creation, and debugging | + +## Settings Pages + +| Page | Covers | +| --- | --- | +| ToolHub | Collapse many MCP servers into one dynamic tool resolution entry point for agents | +| Bots And IM Agent Relay | Bot forwarding, handoff mode, and platform pages | +| Config Database Location | SQLite config database location maintained by the desktop app | +| Tray Configuration | Tray icon, balance progress, and tray window widgets | + +## Content Relationships + +Overview Dashboard shows system status and usage. Provider Config and One click import cover how upstream model services enter CCR. Agent Config covers Claude Code, Codex, and ZCode launch, multi-instance usage, and model selection. Routing determines where model requests go. Fusion covers vision, web search, and MCP tools. API Keys control client access to CCR. Logs & Observability cover request logs and agent execution traces. Server controls the local gateway listener and proxy features. Extension Mechanism covers local plugin creation, installation, and debugging. ToolHub, Bots, Config Database Location, and Tray Configuration match the corresponding settings pages in the settings dialog. diff --git a/docs/src/content/docs/en/configuration/api-keys.md b/docs/src/content/docs/en/configuration/api-keys.md new file mode 100644 index 0000000..a6a3ef0 --- /dev/null +++ b/docs/src/content/docs/en/configuration/api-keys.md @@ -0,0 +1,46 @@ +--- +title: API Keys +pageTitle: API Keys +eyebrow: Detailed Configuration +lead: Manage API keys that clients use to access the CCR gateway, with expiration and local limits. +--- + +## List Fields + +| Field | Capability | +| --- | --- | +| Search API keys | Filters the list by key name or key value. | +| Add API key | Opens the create dialog and generates a new client access key. | +| Name | Display name for the key. Use it to identify a client, team, purpose, or automation. | +| Key | Masked access key. Use `Copy API key` to copy the full key. | +| Expires | Expiration time. After expiration, clients can no longer use the key to access CCR. | +| Limits | Local limit summary. Shows `No limits configured` when no limits are set. | +| Edit API key | Edits expiration and limits. The key value itself is not shown again. | +| Remove API key | Deletes the client access key. Deleted keys stop working immediately. | + +## Create And Edit + +| Field | Capability | +| --- | --- | +| Name | Display name for the new key. Examples: `Claude Code - laptop`, `CI`, or a team name. | +| Expiration | Selects the validity period: `Never`, `7 days`, `30 days`, `90 days`, or `Custom`. | +| Expires at | Appears for `Custom` expiration and sets the exact date and time. | +| API key created | Confirmation dialog after creation. It displays the full key. | +| Copy this key now. It may not be shown again. | Reminder to copy the key immediately because CCR will not show it again after the dialog closes. | + +## Advanced Settings + +`Advanced settings` adds local limits to a client key. When a limit is reached, requests using that key are rejected or limited; provider-side quota is not changed. + +| Field | Capability | +| --- | --- | +| Advanced settings | Expands or collapses limit editing. | +| No limits configured | The key has no local limits. | +| Requests | Limits by request count. | +| Tokens | Limits by token count. | +| Images | Limits by image count. | +| per minute | Uses a 1-minute limit window. | +| per hour | Uses a 1-hour limit window. | +| per day | Uses a 1-day limit window. | +| Add limit | Adds one limit rule. | +| Remove limit | Removes the current limit rule. | diff --git a/docs/src/content/docs/en/configuration/bot-setup.md b/docs/src/content/docs/en/configuration/bot-setup.md new file mode 100644 index 0000000..ef33824 --- /dev/null +++ b/docs/src/content/docs/en/configuration/bot-setup.md @@ -0,0 +1,18 @@ +--- +title: Setup +pageTitle: Bot Setup +eyebrow: Bots +lead: Add a Bot, bind it to Agent Config, and choose message forwarding or handoff. +--- + +## Steps + +1. Open **Bot Management** and click **Add Bot**. +2. Select a platform and fill in the required token, secret, signing secret, robot code, or OAuth fields. +3. Save the Bot. +4. Open the target **Agent Config** and enable **Bot**. +5. Choose **Forward agent messages** or **Handoff**, then reopen the agent from CCR. + +## Verification + +Open the agent from CCR and send a test message. Confirm that Logs include Bot records and the IM side receives the message. diff --git a/docs/src/content/docs/en/configuration/bots.md b/docs/src/content/docs/en/configuration/bots.md new file mode 100644 index 0000000..614dd76 --- /dev/null +++ b/docs/src/content/docs/en/configuration/bots.md @@ -0,0 +1,15 @@ +--- +title: Bots And IM Agent Relay +pageTitle: Bots And IM Agent Relay +eyebrow: Detailed Configuration +lead: Forward agent messages to instant-messaging platforms or hand off active work after desktop idle. +--- + +## Common Modes + +- **Forward agent messages**: mirror agent messages into IM. +- **Handoff**: relay the interaction into IM after desktop idle. + +## Platform Pages + +Slack, Discord, Telegram, LINE, Weixin, WeCom, Feishu, and DingTalk each have a dedicated page. diff --git a/docs/src/content/docs/en/configuration/configuration-file.md b/docs/src/content/docs/en/configuration/configuration-file.md new file mode 100644 index 0000000..5543fc1 --- /dev/null +++ b/docs/src/content/docs/en/configuration/configuration-file.md @@ -0,0 +1,17 @@ +--- +title: Config Database Location +pageTitle: Config Database Location +eyebrow: Detailed Configuration +lead: Locate the SQLite configuration database maintained by the CCR desktop app. +--- + +## Default Locations + +- **macOS/Linux**: `~/.claude-code-router/config.sqlite` +- **Windows**: `%APPDATA%\Claude Code Router\config.sqlite` + +## Applying Changes + +CCR stores runtime configuration in SQLite. A legacy `config.json` is read only once as a migration source when no SQLite config exists; after migration, editing `config.json` does not affect the current configuration. + +Use the desktop UI to change configuration, or export a backup from **Settings**. Do not edit `config.sqlite` directly while CCR is running; SQLite also maintains companion `config.sqlite-wal` and `config.sqlite-shm` files in the same directory. diff --git a/docs/src/content/docs/en/configuration/extensions.md b/docs/src/content/docs/en/configuration/extensions.md new file mode 100644 index 0000000..bf6f503 --- /dev/null +++ b/docs/src/content/docs/en/configuration/extensions.md @@ -0,0 +1,281 @@ +--- +title: Extension Mechanism +pageTitle: Extension Mechanism +eyebrow: Detailed Configuration +lead: Learn how CCR extensions are loaded, what they can register, and how to create, install, and debug your own extension. +--- + +## Extension Types + +CCR has two extension layers: + +| Type | Config location | Runtime | Good for | +| --- | --- | --- | --- | +| Wrapper plugin | `plugins` | CCR Desktop's Electron wrapper process | Local HTTP routes, local backends, proxy capture routing, built-in browser entries, provider account meters | +| Core gateway plugin | `providerPlugins` or `plugins[].coreGateway.providerPlugins` | core gateway runtime | Provider, auth, or internal core gateway behavior | + +Most custom extensions should start as a Wrapper plugin. It receives CCR config, a private data directory, a logger, and registration helpers through `ctx`. + +## Loading Flow + +When the gateway starts, CCR reads the `plugins` array and processes each plugin whose `enabled !== false`: + +1. It first applies `apps`, `proxy.routes`, `coreGateway.providerPlugins`, `coreGateway.virtualModelProfiles`, and `coreGateway.config` declared in config. +2. It then loads the plugin module. `module` can be an absolute path, a `~/` path, a `./...` path relative to the CCR config directory, or a Node-resolvable package name. +3. If `module` is missing, CCR tries to match the plugin `id` with built-in marketplace plugins such as `claude-design` and `cursor-proxy`. +4. A module can export a function or an object with `setup(ctx)` or `activate(ctx)`. +5. On stop, CCR runs `stop` and `onStop` hooks in reverse order, then closes HTTP backends and SQLite stores registered by the plugin. + +Common module shape: + +```js +"use strict"; + +module.exports = { + async setup(ctx) { + ctx.logger.info("extension loaded"); + }, + async stop() { + // Optional: release resources owned by the extension. + } +}; +``` + +You can also export the setup function directly: + +```js +"use strict"; + +module.exports = async function setup(ctx) { + ctx.logger.info(`loaded ${ctx.pluginId}`); +}; +``` + +`setup(ctx)` or `activate(ctx)` can call `ctx.register...` methods directly, or return a registration object. Returned registrations support `apps`, `gatewayRoutes`, `proxyRoutes`, `providerAccountConnectors`, `coreGateway`, `virtualModelProfiles`, `stop`, and `onStop`. + +## ctx Reference + +`setup(ctx)` receives these common fields and helpers: + +| Field or method | Description | +| --- | --- | +| `ctx.pluginId` | Current plugin ID | +| `ctx.pluginConfig` | Custom value from `plugins[].config` | +| `ctx.config` | Current CCR AppConfig snapshot | +| `ctx.logger` | `debug/info/warn/error` logger prefixed with `[plugin:]` | +| `ctx.paths.configDir` | CCR config directory | +| `ctx.paths.dataDir` | CCR data directory | +| `ctx.paths.pluginDataDir` | Private data directory for this plugin | +| `ctx.registerGatewayRoute(route)` | Register a local HTTP route on the CCR gateway | +| `ctx.registerHttpBackend(backend)` | Start a local HTTP backend and return `{ url, host, port }` | +| `ctx.registerProxyRoute(route)` | Route proxy-captured host/path traffic to a plugin backend or another upstream | +| `ctx.registerApp(app)` | Add an entry to the built-in browser app list | +| `ctx.openSqliteStore(options)` | Open a SQLite store under the plugin data directory | +| `ctx.registerProviderAccountConnector(connector)` | Register a provider balance or quota connector | +| `ctx.registerCoreGatewayProviderPlugin(plugin)` | Inject a provider plugin into the core gateway | +| `ctx.registerCoreGatewayVirtualModelProfile(profile)` | Inject a virtual model profile into the core gateway | + +Gateway route handlers also receive helper functions: + +| Helper | Description | +| --- | --- | +| `helpers.readBody(request)` | Read request body as a `Buffer` | +| `helpers.readJson(request)` | Read and parse JSON request body | +| `helpers.sendJson(response, statusCode, body)` | Send a JSON response | + +`registerGatewayRoute` defaults to `auth: "gateway"`. If CCR has API keys configured, requests must include `Authorization: Bearer ` or `x-api-key: `. Use `auth: "none"` only for debugging or local public status routes. + +## Create Your First Extension + +Create a directory such as `~/ccr-extensions/hello-extension`: + +```text +hello-extension/ + plugin.json + index.cjs +``` + +`plugin.json` lets CCR's local extension picker discover the extension ID, name, and entrypoint: + +```json +{ + "id": "hello-extension", + "name": "Hello Extension", + "module": "index.cjs", + "apps": [ + { + "id": "hello-status", + "name": "Hello Status", + "url": "http://127.0.0.1:3456/plugins/hello" + } + ] +} +``` + +`index.cjs` registers a status route, an echo backend, and one proxy route: + +```js +"use strict"; + +module.exports = { + async setup(ctx) { + ctx.registerGatewayRoute({ + auth: "none", + id: "hello-status", + method: "GET", + path: "/plugins/hello", + handler(_request, response, helpers) { + helpers.sendJson(response, 200, { + ok: true, + plugin: ctx.pluginId, + message: ctx.pluginConfig?.message || "hello from CCR" + }); + } + }); + + const backend = await ctx.registerHttpBackend({ + id: "hello-echo", + async handler(request, response, helpers) { + const body = request.method === "POST" + ? (await helpers.readBody(request)).toString("utf8") + : ""; + + helpers.sendJson(response, 200, { + method: request.method, + path: request.url, + body + }); + } + }); + + ctx.registerProxyRoute({ + host: "api.example.local", + id: "hello-example-api", + paths: ["/v1"], + preserveHost: true, + upstream: backend.url + }); + + ctx.logger.info(`hello backend listening at ${backend.url}`); + } +}; +``` + +This exposes: + +- `GET /plugins/hello`: a route mounted directly on the CCR gateway to verify that the plugin loaded. +- A local echo backend: CCR assigns a free port automatically. +- A proxy rule: proxy-captured `api.example.local/v1...` traffic is forwarded to the echo backend. + +## Install The Extension + +The recommended flow is through the desktop UI: + +1. Open **Extensions**. +2. Add an extension and choose a local extension directory. +3. Select the `hello-extension` directory. +4. Save the config. +5. Open **Server** and restart the gateway. + +CCR stores runtime configuration in SQLite. Add extensions through the UI; the legacy JSON config file is kept here only as a reference. The extension entry has this shape: + +```json +{ + "plugins": [ + { + "id": "hello-extension", + "enabled": true, + "module": "/Users/you/ccr-extensions/hello-extension/index.cjs", + "config": { + "message": "hello from my config" + } + } + ] +} +``` + +Restart the gateway after saving the extension config. See [Config Database Location](/en/configuration/configuration-file/). + +The local directory picker recognizes entry metadata from: + +- `plugin.json` +- `ccr-plugin.json` +- `.ccr-plugin/plugin.json` +- `.codex-plugin/plugin.json` +- `main`, `ccr.module`, or `ccrPlugin.module` in `package.json` + +If no entrypoint is declared, CCR tries `index.cjs`, `index.mjs`, `index.js`, `plugin.cjs`, `plugin.mjs`, or `plugin.js` in the selected directory. + +## Debug Extensions + +### 1. Check syntax first + +For CommonJS extensions: + +```bash +node --check ~/ccr-extensions/hello-extension/index.cjs +``` + +If the extension depends on npm packages, install them in the extension directory and make sure Node can resolve the entrypoint. + +### 2. Start CCR from source + +From the CCR repository root: + +```bash +npm install +npm run dev +``` + +`ctx.logger.info/warn/error` output appears in the terminal that started CCR, with a prefix such as `[plugin:hello-extension]`. + +### 3. Verify the Gateway route + +After the gateway starts, request the status route: + +```bash +curl http://127.0.0.1:3456/plugins/hello +``` + +If the route uses the default `auth: "gateway"` and CCR has API keys configured: + +```bash +curl -H "Authorization: Bearer " http://127.0.0.1:3456/plugins/hello +``` + +You can also use: + +```bash +curl -H "x-api-key: " http://127.0.0.1:3456/plugins/hello +``` + +### 4. Verify the HTTP backend and proxy route + +`registerHttpBackend` returns `backend.url`, which the example writes to logs. Request that URL directly first, then enable proxy mode and verify whether the target host/path hits `registerProxyRoute`. + +Proxy route matching rules: + +- `host` must match the target hostname. Exact host, `.example.com` suffix, and `*.example.com` wildcard patterns are supported. +- Empty `paths` matches all paths for that host. +- When multiple paths match, CCR chooses the longest path prefix. +- `stripPathPrefix` removes the matched prefix from the forwarded path. +- `rewritePathPrefix` replaces the matched prefix with a configured prefix. + +### 5. Common Issues + +| Symptom | What to check | +| --- | --- | +| Extension does not load | Check `plugins[].enabled`, `plugins[].module`, and terminal errors prefixed with `[plugin:]` | +| `GET /plugins/hello` returns 404 | Restart the gateway and confirm `path` or `pathPrefix` starts with `/` | +| Response is 401 | Routes require gateway API key by default; set `auth: "none"` for debug routes | +| Code changes do not apply | Wrapper plugins are not hot reloaded; restart the gateway or CCR | +| Port is already in use | Omit `port` in `registerHttpBackend` so CCR can allocate one automatically | +| Proxy route misses requests | Confirm proxy mode is enabled, the certificate is installed, and host matches the real request hostname | + +## Security Notes + +- Use `auth: "none"` only for status pages, health checks, or local debugging routes. +- Do not log API keys, OAuth tokens, cookies, or complete request headers. +- Prefer `ctx.paths.pluginDataDir` for files written by your extension. +- Validate all external input returned by `readJson`. +- When proxying to external upstreams, handle headers explicitly so local auth material is not forwarded to untrusted services. diff --git a/docs/src/content/docs/en/configuration/fusion-mcp-tool.md b/docs/src/content/docs/en/configuration/fusion-mcp-tool.md new file mode 100644 index 0000000..a6c5394 --- /dev/null +++ b/docs/src/content/docs/en/configuration/fusion-mcp-tool.md @@ -0,0 +1,20 @@ +--- +title: Custom MCP Tool +pageTitle: Custom MCP Tool +eyebrow: Fusion +lead: Connect local or remote MCP tools to a Fusion model. +--- + +## Entry Point + +Click **Add custom MCP** and select a transport. + +## Transports + +- **stdio**: local command-line tools. +- **streamable-http / sse**: remote MCP services. +- **Discover tools**: read tools exposed by the MCP server. + +## Verification + +Validate risky or slow tools in a dedicated Agent Config before using them in production routing. diff --git a/docs/src/content/docs/en/configuration/fusion-models.md b/docs/src/content/docs/en/configuration/fusion-models.md new file mode 100644 index 0000000..0677c71 --- /dev/null +++ b/docs/src/content/docs/en/configuration/fusion-models.md @@ -0,0 +1,26 @@ +--- +title: Fusion Models +pageTitle: Fusion Models +eyebrow: Detailed Configuration +lead: Combine a base model with capability models or tools, turning a stable text model into an enhanced model that can see images, search the web, or call tools. +--- + +## How Fusion Works + +Fusion keeps the base model's reasoning, writing, and coding behavior, then adds the missing capability layer. When needed, CCR calls the vision, search, or MCP tool, organizes the result into context, and lets the base model produce the final answer. + +After saving, a Fusion model appears in routing and Agent Config like a normal model. Treat it as a reusable new model: upgrade a strong text model into a vision model, a stable coding model into a web-search model, or an Agent model into one that can call internal tools. + +## Capabilities + +- **Built-In Vision**: give a non-multimodal model visual ability, for example `GLM-5.2 + GLM-5V-Turbo = GLM-5.2V`. +- **Built-In Web Search**: give a model live retrieval capability and bring fresh information into context. +- **Custom MCP Tool**: wrap local scripts, internal systems, or remote services as model-callable tools. + +## Composition Examples + +Use names that make the capability source obvious: + +- `GLM-5.2 + GLM-5V-Turbo = GLM-5.2V` +- `Coding model + Web Search = coding model with live retrieval` +- `General model + custom MCP tool = Agent model that can access internal systems` diff --git a/docs/src/content/docs/en/configuration/fusion-vision.md b/docs/src/content/docs/en/configuration/fusion-vision.md new file mode 100644 index 0000000..adbee2c --- /dev/null +++ b/docs/src/content/docs/en/configuration/fusion-vision.md @@ -0,0 +1,32 @@ +--- +title: Built-In Vision +pageTitle: Built-In Vision +eyebrow: Fusion +lead: Give a non-multimodal model visual ability, for example GLM-5.2 + GLM-5V-Turbo = GLM-5.2V. +--- + +## Capability Composition + +Built-in Vision connects a vision model in front of the base model without replacing the text model you already trust. The vision model understands images, screenshots, charts, and OCR content; CCR passes that visual result to the base model, which continues to handle reasoning, writing, coding, and final output. + +The combined Fusion model can be selected by routing or Agent Config like any other model. A typical form is: + +```text +GLM-5.2 + GLM-5V-Turbo = GLM-5.2V +``` + +This keeps the familiar text model while adding visual input support, so a non-multimodal model can still work with image context. + +This also applies to Codex computer use. After combining GLM-5.2 with GLM-5V-Turbo, GLM-5.2 can receive screen, screenshot, and UI information prepared by the vision model, then use Codex computer use for observation, judgment, and follow-up action planning. + +## Select The Capability + +Select `ccr-fusion-builtins / vision_understand`, and choose a Vision model that actually supports image understanding. + +## Model Requirement + +The Vision model determines image, screenshot, chart, and OCR understanding quality. The base model determines the final answer style, reasoning ability, and coding ability. + +## Troubleshooting + +When image requests fail, relevant details include whether the Vision model supports visual input and any Fusion tool errors in Logs. diff --git a/docs/src/content/docs/en/configuration/fusion-web-search.md b/docs/src/content/docs/en/configuration/fusion-web-search.md new file mode 100644 index 0000000..d12fff4 --- /dev/null +++ b/docs/src/content/docs/en/configuration/fusion-web-search.md @@ -0,0 +1,31 @@ +--- +title: Built-In Web Search +pageTitle: Built-In Web Search +eyebrow: Fusion +lead: Use CCR's built-in Web Search tool to give models live search context. +--- + +## Select The Capability + +Use `ccr-fusion-builtins / web_search`. + +## Search Providers + +Supported providers include In-app Browser, Brave, Bing, Google CSE, Serper, SerpAPI, Tavily, and Exa. + +## In-app Browser + +`In-app Browser` runs searches through a hidden built-in browser window in CCR Desktop, opens result pages, extracts visible content, and passes that evidence to the Fusion model. It does not require an external search API key, so it is useful when you want desktop-side browser retrieval. + +Configuration options include search engine, language, country or region, and safe-search level: + +- Search engine: Bing, Google, or DuckDuckGo. +- Language: for example `en` or `zh-CN`. +- Country or region: for example `US` or `CN`. +- Safe search: default, moderate, strict, or off. + +> Note: `In-app Browser` depends on CCR Desktop's Electron built-in browser capability and is only available in the desktop app. CLI, server deployments, and pure web environments do not have the built-in browser integration; use Brave, Bing, Google CSE, Serper, SerpAPI, Tavily, or Exa instead. + +## Troubleshooting + +When search fails, relevant details include the search provider key and Fusion tool errors in Logs. diff --git a/docs/src/content/docs/en/configuration/observability.md b/docs/src/content/docs/en/configuration/observability.md new file mode 100644 index 0000000..e440141 --- /dev/null +++ b/docs/src/content/docs/en/configuration/observability.md @@ -0,0 +1,27 @@ +--- +title: Logs & Observability +pageTitle: Logs & Observability +eyebrow: Detailed Configuration +lead: Configure Request logs and Agent observability to inspect request details, execution traces, tool calls, tool results, and performance. +--- + +## How To Enable + +Open **Settings → Logs & Observability**: + +1. Enable **Request logs** to record same-day CCR request details. +2. Enable **Agent observability** to populate the observability panel with agent execution traces. + +## View The Observability Panel + +Enable **Agent observability** when you need to inspect an agent's execution trace and performance. The panel shows which step called which tool, what result the tool returned, how long each step took, and where an agent may have stalled or failed. + +It helps diagnose agents getting stuck, unexpected tool results, slow steps, or context flow that does not match expectations. Request logs provide the request body, response body, and error details for individual model requests. + +## Request Logs + +Request logs record model request details passing through CCR, including request time, request ID, client, path, requested model, resolved provider and model, credential, status code, success state, duration, tokens, cost estimate, request headers, request body, response headers, response body, and errors. + +The Logs page supports filtering by status, provider, model, credential, request ID, model name, request body, or response body. A single record shows the main request and response fields, including `request model`, `resolved provider`, `resolved model`, status code, response body, errors, duration, tokens, and cost estimate. + +Regular request logs are kept locally for the current day. When the local date changes, the next request-log read or write cleans up the previous day's regular logs. They are useful for same-day troubleshooting, not long-term audit archiving. diff --git a/docs/src/content/docs/en/configuration/overview.md b/docs/src/content/docs/en/configuration/overview.md new file mode 100644 index 0000000..9a7bf49 --- /dev/null +++ b/docs/src/content/docs/en/configuration/overview.md @@ -0,0 +1,131 @@ +--- +title: Overview Dashboard +pageTitle: Overview Dashboard +eyebrow: Detailed Configuration +lead: Customize the CCR home dashboard to inspect system status, account balance, requests, tokens, cost, and model distribution. +--- + +## When To Use It + +| Scenario | What to inspect | +| --- | --- | +| Check gateway health | System status, success rate, errors, average latency | +| Estimate recent spend | Requests, input / output / cache tokens, estimated cost | +| Compare upstream usage | Provider analysis, model distribution, client analysis | +| Watch account quota | Balance, subscription quota, remaining quota, account status | +| Report or share usage | AI Usage Wrapped, CCR Route Map, Model Leaderboard, Spend Receipt, and other share cards | + +## Time Range + +The `Usage over time` control at the top drives every widget that depends on usage stats. After you switch ranges, requests, tokens, cost, trends, distribution, and share cards are recomputed for the selected window. + +| Option | Window | +| --- | --- | +| `Today` | Current local date from 00:00 to now, bucketed hourly. | +| `24h` | Last 24 hours, bucketed hourly. | +| `7d` | Last 7 days, bucketed daily. | +| `30d` | Last 30 days, bucketed daily. | + +The account balance widget does not use this time range. It shows the latest snapshot returned by provider account connectors. + +## Edit Layout + +Click the pencil button in the upper-right corner to enter editing mode. Editing mode has three columns: + +| Area | Purpose | +| --- | --- | +| Components | Left palette. Click a template to add it to the dashboard. | +| Preview | Middle layout preview. Drag widgets to reorder them or click a widget to select it. | +| Component properties | Right property panel for changing type, data, size, style, or removing the selected widget. | + +Common operations: + +1. Add a widget: click a template in `Components`. +2. Reorder widgets: drag them in `Preview`. +3. Resize a widget: select it, then drag the right, bottom, or bottom-right resize handle. +4. Change data: use `Component category` and `Data` in `Component properties`. +5. Change presentation: choose `Widget size` and `Style`. +6. Save the result: click `Done`; the layout is persisted in app configuration. +7. Restore defaults: click `Reset layout` while editing. + +Removing a widget only removes that card from the overview layout. It does not delete request logs, providers, account connectors, or upstream configuration. If all widgets are removed, the page shows `No widgets configured`. + +## Widget Catalog + +Sizes are written as `width:height`, with both dimensions from `1` to `4`. The overview grid has up to 4 columns on desktop and collapses automatically on narrow screens. + +| Widget | Data | Default size | Default style | Styles | +| --- | --- | --- | --- | --- | +| Status component | System status | `4:1` | Timeline | Timeline, Compact | +| Account component | All accounts or one account | `4:2` | Cards | Cards, Compact, Bars, Ring, Semicircle, Arc, Nested rings | +| Metric component | Requests, tokens, cost | `1:1` | Cards | Cards, Compact, Bar, Ring | +| Trend component | Usage over time | `3:2` | Composed | Composed, Area, Line, Bar | +| Activity component | Token activity | `4:2` | Heatmap | Heatmap | +| Breakdown component | Token distribution / Model distribution | Token distribution: `1:2`; Model distribution: `2:2` | Token distribution: Bars; Model distribution: Pie | Bars, Stacked, Donut, Pie | +| Analysis component | Client Analysis / Provider Analysis | `2:2` | Table | Table, Compact | +| Share card | AI Usage Wrapped, CCR Route Map, Model Leaderboard, AI Fuel Cockpit, Token Calendar Poster, Spend Receipt | `1:4` | Card | Card | + +Size constraints: + +| Rule | Reason | +| --- | --- | +| Share cards have a minimum size of `1:4`. | PNG export uses a vertical poster ratio and needs enough height. | +| The account widget has a minimum size of `2:2` when showing All accounts with the Compact style. | Multi-account lists need readable space. | +| Legacy aliases are still accepted: `small` -> `1:1`, `medium` / `large` -> `2:2`, `wide` -> `3:2`, `full` -> `4:1` or `4:2`. | Backward compatibility for older config. | + +## Metric Data + +`metric` widgets use the `metric` field to choose the displayed value. + +| `metric` | Meaning | +| --- | --- | +| `requests` | Request count | +| `total-tokens` | Total tokens | +| `input-tokens` | Input tokens | +| `output-tokens` | Output tokens | +| `cache-tokens` | Cache tokens | +| `cache-ratio` | Cache ratio | +| `estimated-cost` | Estimated cost, calculated from model pricing data | +| `success-rate` | Success rate | +| `errors` | Error count | +| `avg-latency` | Average latency | + +## Account Widget + +The account widget reads provider account / usage connectors. To show balance or remaining quota, first enable and test `Fetch usage` in provider configuration. + +| Data selection | Behavior | +| --- | --- | +| `All accounts` | Shows every available account snapshot. | +| One account | Shows only one provider or credential snapshot. The internal config value is usually `provider` or `provider::credentialId`. | + +If the account widget is empty, check: + +1. Whether the provider has an account / usage connector configured. +2. Whether the `Fetch usage` test succeeds. +3. Whether the API key or account endpoint is still valid. +4. Whether the selected account was deleted or renamed. + +## Share Cards + +Share card widgets can export PNGs through the download button in the card header. The desktop app uses native export when available; browser environments fall back to frontend canvas export. The exported image size is `1080 x 1350`. + +| Card | `type` | Content | +| --- | --- | --- | +| AI Usage Wrapped | `share-usage-wrapped` | Total tokens, requests, estimated cost, cache ratio, longest activity streak, top model, top provider, peak day. | +| CCR Route Map | `share-route-map` | Main client-to-provider/model route relationships, plus client, provider, and model counts. | +| Model Leaderboard | `share-model-leaderboard` | Models ranked by tokens. | +| AI Fuel Cockpit | `share-fuel-cockpit` | Up to 3 account quota gauges. Requires account / usage connectors. | +| Token Calendar Poster | `share-token-calendar` | Contribution-calendar style token activity poster. | +| Spend Receipt | `share-spend-receipt` | Estimated cost, requests, tokens, latency, and success rate for the selected range. | + +## Data Sources And Troubleshooting + +| Symptom | Likely cause | What to do | +| --- | --- | --- | +| Requests, tokens, or cost are 0 | No requests went through CCR in the selected range, or usage capture has not recorded data yet. | Try `24h` / `7d`, and confirm the client is actually using CCR. | +| Cost shows `$0.00` | The model has no pricing data, or usage is very small. | Check model catalog matching and provider model names; values under 0.01 USD are shown with extra decimals. | +| Success rate or errors look unexpected | The overview only aggregates request results captured by CCR. | Compare with records on the Logs page. | +| Account balance is empty | No account connector exists, or `Fetch usage` failed. | Test account / usage field mapping in provider configuration. | +| Distribution charts have no data | Request logs lack model, provider, or token information. | Confirm requests go through CCR and upstream responses include token usage. | +| PNG export fails | Canvas export is unavailable, the element has no size, or the save dialog was canceled. | Retry in the desktop app, and make sure the card is visible and not resized too small. | diff --git a/docs/src/content/docs/en/configuration/profiles.md b/docs/src/content/docs/en/configuration/profiles.md new file mode 100644 index 0000000..0676811 --- /dev/null +++ b/docs/src/content/docs/en/configuration/profiles.md @@ -0,0 +1,128 @@ +--- +title: Agent Config +pageTitle: Agent Config +eyebrow: Detailed Configuration +lead: Create reusable launch configurations for Claude Code, Codex, and ZCode, and open separate agent instances from different configs. +--- + +## Configuration Flow + +1. Add at least one usable provider and model in **Provider Config**, or create the Fusion model you want to use. +2. Open **Agent Config** and click **Add profile**. +3. Choose the agent type, name the config, then choose the effect scope and entry mode. +4. Select a model. The value is usually `Provider name/model name`, and Fusion models can be selected too. +5. If the entry mode includes App, optionally bind a Bot and choose whether to forward agent messages or enable handoff. +6. Save the config, then open it from the Agent Config card: the terminal button copies the CLI command, and the play button starts the App instance. + +During trial, prefer **Only opened from CCR** and always open the agent from CCR. That keeps the config limited to CCR-launched instances and avoids changing the Claude Code, Codex, or ZCode setup you open directly from the system. + +## Multi-Instance Mechanism + +Every Agent Config has its own `id` and name. When CCR opens an agent, it finds the enabled config by name or `id`, then builds the launch plan for that config. + +| Mechanism | Actual behavior | +| --- | --- | +| Separate config files | With **Only opened from CCR**, Claude Code and Codex write CCR-managed config files in directories separated by config `id` | +| Separate launchers | Claude Code uses a separate launch wrapper; Codex and ZCode use separate middleware launchers; filenames are also separated by config `id` or name | +| Separate app data directories | When opening App mode, Claude App, ChatGPT (the renamed Codex desktop app), and ZCode App use user-data directories separated by config `id` | +| Runtime state | CCR tracks running app instances by entry mode and config `id`; reopening the same config activates the existing window, while a different config can open a separate instance | + +This lets you create multiple configs for the same agent, such as "Claude Code - Work Project", "Claude Code - Test Model", or "Codex - Fusion Vision". They can use different models, scopes, and Bots, then open as separate agent instances. + +## Common Options + +| Option | Applies to | Description | +| --- | --- | --- | +| Agent | All | Claude Code, Codex, or ZCode. ZCode supports App only. | +| Config name | All | Identifies the config in CCR and can be used as the `ccr ` launch target. Names can contain spaces; copied commands are quoted automatically. | +| Enabled | All | Disabled configs are not exposed as active launch entries and are not applied as effective startup configs. | +| Effect scope | All | **Only opened from CCR** uses CCR-managed isolated config; **System default** writes the agent's default config. Only one enabled system-default config is allowed per agent. | +| Entry mode | Claude Code, Codex | `CLI & APP` exposes both CLI and App entry points; `CLI only` only generates a CLI command; `App only` only exposes the App entry point. | +| Model | All | Default model for the opened agent, either a provider model or Fusion model. For Claude Code, leaving it empty keeps the Claude Code default. | +| Bot | App entry | Bot forwarding only works for App mode opened from CCR. CLI does not forward Bot messages yet. | +| Environment variables | All | Extra environment variables injected into this config. Claude Code includes `CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1` by default so gateway model discovery is enabled. | + +## Per-Agent Options + +### Claude Code + +| Option | What it does | +| --- | --- | +| Model override | Writes `ANTHROPIC_MODEL` for Claude Code. Leave it empty to keep Claude Code's own default model. | +| Small fast model | Writes `ANTHROPIC_SMALL_FAST_MODEL` for Claude Code lightweight tasks. Leave it empty to keep the Claude Code default. | +| Settings file | System-default mode uses the Claude Code default settings file; Only opened from CCR creates an isolated settings file under CCR's config directory, separated by Agent Config `id`. | +| Environment variables | Merged into the Claude Code settings `env`. CCR also writes the gateway endpoint, API key helper, and launch wrapper. | +| Bot | Applies only to the Claude App entry. Select a saved Bot, then choose message forwarding or handoff. | + +After Claude Code CLI is opened from CCR, it uses CCR gateway model discovery. In Claude Code CLI, enter `/model` to view and switch the models exposed by CCR, including normal provider models and visible Fusion models. + +Claude App is **zero-config**: when CCR opens Claude App from the desktop app, CCR automatically writes the Claude App gateway config, API key, model discovery list, and isolated user-data directory. No extra user action is required; opening Claude App from CCR automatically completes all necessary configuration. If Claude App is already running, restart it or reopen it from CCR when prompted. + +Claude App and Claude Code CLI use different model-list adapters: + +| Entry | Model list source | Notes | +| --- | --- | --- | +| Claude Code CLI | CCR gateway model discovery | Use `/model` in the CLI to view the list; selected requests still go through CCR providers, routing, and Fusion. | +| Claude App | CCR-generated Claude App inference models | Claude App needs Claude-compatible model names. CCR maps `Provider/model` and Fusion models into model entries Claude App can recognize, while display labels keep the real model meaning visible. | + +### Codex + +| Option | What it does | +| --- | --- | +| Provider ID | Writes Codex `model_provider`, defaulting to `claude-code-router`. Keep it stable and use only letters, numbers, dots, underscores, or hyphens. | +| Provider name | Display name shown in Codex, defaulting to `Claude Code Router`. | +| Codex model | Default Codex model. It can be a provider model or Fusion model; if left empty, CCR uses the first available default model. | +| Show all sessions | Lets Codex show all sessions. ZCode does not expose this option. | +| Config file | Defaults to `~/.codex/config.toml`. Only opened from CCR writes into CCR-managed isolated config directories. | +| Environment variables | Injected into Codex CLI or ChatGPT. Claude Code-specific model discovery variables are not passed to Codex. | +| Bot | Applies only to the ChatGPT app entry. | + +After saving, use the terminal button on the config card to copy the Codex CLI command, for example `ccr "Codex - Work"`. Use the play button to open ChatGPT. Following the CodexL launch model, CCR starts the Electron executable inside the ChatGPT app bundle directly, gives it an isolated user-data directory, and points `CODEX_CLI_PATH` at the CCR middleware. The middleware forwards app-server traffic to ChatGPT's bundled Codex CLI and only adapts the account display: an existing valid ChatGPT token is shown as the real ChatGPT account, while a profile without credentials uses a tokenless ChatGPT-shaped workspace identity so the desktop renderer keeps model selection available without storing a real user login. To make the native app-server select its official API marketplace, CCR creates the exact `ccr-local-profile` bootstrap only during process startup and removes it after the first native response; it is also cleaned after startup or abnormal exit and is never retained as login state. Every other authentication file is preserved. Older `Codex.app` installations remain supported. + +Model and public plugin listings are not synthesized by the middleware. The native Codex app-server reads the generated `model_catalog_json` and handles `model/list` plus public `plugin/list` requests unchanged. This lets Codex refresh the official public [`openai/plugins`](https://github.com/openai/plugins) Git marketplace over the network. In a virtual workspace, only account-private marketplace requests are answered with an explicit empty result because the native service requires real ChatGPT authentication for those sections; they are never replaced with local plugins. Any downloaded Git checkout is owned only by Codex as its normal last-known-good data, not used by CCR as a replacement catalog. + +### ZCode + +| Option | What it does | +| --- | --- | +| Provider ID | Writes the ZCode provider reference, defaulting to `claude-code-router`. | +| Provider name | Display name shown in ZCode, defaulting to `Claude Code Router`. | +| ZCode model | Default model when ZCode App opens. It can be a provider model or Fusion model. | +| Config file | Defaults to `~/.zcode/cli/config.json`; CCR also writes ZCode v2 config and model cache. | +| Environment variables | Injected into ZCode App and the middleware launcher. | +| Bot | Applies only to the ZCode App entry. | + +ZCode supports App only, so its entry mode is fixed to `App only`. The `Show all sessions` option is hidden for ZCode. + +## CLI And App Modes + +| Mode | How to open | Best for | Key differences | +| --- | --- | --- | --- | +| CLI | Click the terminal button to copy the command, then run `ccr ` in a terminal | Working inside a project directory, shell workflows, scripting | Uses the config-specific wrapper or middleware launcher; usually stays in the terminal without opening a desktop window; Bot forwarding support is pending. | +| App | Click the play button in the CCR desktop app | Desktop windows, side-by-side instances, Bot forwarding, handoff | Uses a separate user-data directory per Agent Config; reopening the same config activates the existing window, while different configs can run in parallel. | +| CLI & APP | One config exposes both CLI and App entry points | Reusing the same model config in both terminal and desktop App workflows | Both entries share the config name, model, effect scope, and environment variables, but launch differently. | + +## Agent Differences + +### Claude Code + +Claude Code CLI config writes a settings file. With **Only opened from CCR**, CCR creates an isolated settings file under its own config directory and opens Claude Code through a separate launch wrapper. + +When opening Claude App from the desktop app, CCR also prepares a separate user-data directory for that config. Different Agent Config entries use different directories, so multiple Claude App instances can run at the same time. + +### Codex + +Codex config writes `config.toml` and a model catalog file. With **Only opened from CCR**, CCR stores those files in a directory separated by config `id`. + +Codex supports CLI and App. CLI opens through the launcher for the selected config; App launches ChatGPT, uses a separate user-data directory, and passes the selected model and provider into the app. + +### ZCode + +ZCode supports App only. CCR writes ZCode CLI config, v2 config, and model cache based on ZCode home or a custom config file, then starts the App with the current Agent Config's model, provider, and separate user-data directory. + +## Multi-Instance Suggestions + +1. Create one Agent Config for each agent instance that should run independently. +2. While testing, prefer **Only opened from CCR** to avoid changing the system default agent. +3. To keep desktop windows side by side, use `App only` or `CLI & APP`, then open the App from CCR. +4. If the same config is already running, opening it again activates the existing window. Create another Agent Config when you need a second instance. diff --git a/docs/src/content/docs/en/configuration/provider-deeplink.md b/docs/src/content/docs/en/configuration/provider-deeplink.md new file mode 100644 index 0000000..137d8d9 --- /dev/null +++ b/docs/src/content/docs/en/configuration/provider-deeplink.md @@ -0,0 +1,303 @@ +--- +title: One click import +pageTitle: One click import +eyebrow: Detailed Configuration +lead: Quickly add common model providers, review the details, and save them without filling everything in by hand. +--- + +## One-Click Import + +Choose a provider below to get started. CCR shows what will be added before saving it; when using a custom entry point, make sure the source is one you trust. + + + +## Embeddable Button Component + +CCR also ships a framework-free button script that providers can embed on their own webpages so users can import that provider into CCR with one click. The script registers Web Components automatically. + +### HTML + +```html + + + +``` + +For larger configs, pass a manifest: + +```html + + + +``` + +### JavaScript + +```html +
+ + +``` + +### Render Parameters + +`CCRProviderButtons.render(target, options)` and `` support the same parameter set. Parameter names match the `ccr://provider` protocol: + +| Parameter | Description | +| --- | --- | +| `name` | Provider display name | +| `base_url` | Provider API Base URL, required for direct imports | +| `api_key` | Optional provider API key | +| `protocol` | Protocol, one of `openai_chat_completions`, `openai_responses`, `anthropic_messages`, `gemini_generate_content`, `gemini_interactions` | +| `models` | Model list. Use comma/newline-separated text in HTML, or a string/array in JavaScript | +| `icon` | Provider icon URL | +| `source` | Provider website or config source | +| `manifest` | Remote manifest URL. When present, the button creates a manifest import link | +| `payload` | JSON or base64url JSON config. JavaScript may pass an object | +| `usage_url` | Optional account usage endpoint | +| `fetch_usage` | Whether account usage fetching is enabled | +| `usage_method` | Usage request method, `GET` or `POST` | +| `usage_headers` | Usage request headers. JavaScript may pass an object; HTML must pass a JSON string | +| `usage_body` | Usage request body. JavaScript may pass an object; HTML must pass a JSON string | +| `balance` | Balance field path | +| `balance_unit` | Balance unit | +| `subscription` | Subscription remaining field path | +| `subscription_limit` | Subscription limit field path | +| `subscription_reset` | Subscription reset time field path | +| `subscription_unit` | Subscription unit | +| `subscription_window` | Subscription window, such as `monthly` | + +## URL Format + +CCR supports two URL shapes. The host form is recommended: + +```text +ccr://provider?name=Example%20AI&base_url=https%3A%2F%2Fapi.example.com%2Fv1&protocol=openai_chat_completions&models=example-chat%2Cexample-coder +``` + +The path form is also recognized: + +```text +ccr:///provider?name=Example%20AI&base_url=https%3A%2F%2Fapi.example.com%2Fv1 +``` + +For larger configs, put JSON in `payload`. The value can be URL-encoded JSON or base64url JSON: + +```text +ccr://provider?payload=%7B%22name%22%3A%22Example%20AI%22%2C%22base_url%22%3A%22https%3A%2F%2Fapi.example.com%2Fv1%22%2C%22models%22%3A%5B%22example-chat%22%5D%7D +``` + +## Manifest Import + +Providers can also pass a manifest URL: + +```text +ccr://provider?manifest=https%3A%2F%2Fexample.com%2Fccr-provider.json +``` + +The manifest must use HTTPS, return JSON, avoid local or private network hosts, and stay under 128 KB. CCR fetches the manifest inside the app, shows a confirmation dialog, and writes config only after user approval. + +The manifest can put provider information in a top-level `provider` object: + +| Field | Description | +| --- | --- | +| `provider.name` | Provider display name | +| `provider.base_url` | Provider API Base URL, required | +| `provider.protocol` | Protocol type | +| `provider.models` | Model list as a string array | +| `provider.icon` | Provider icon URL | +| `provider.source` | Provider website or config source | +| `provider.account.enabled` | Whether account usage fetching is enabled | +| `provider.account.refreshIntervalMs` | Usage refresh interval in milliseconds | +| `provider.account.connectors` | Usage connector list | +| `provider.account.connectors[].type` | Connector type, commonly `http-json` | +| `provider.account.connectors[].auth` | Auth mode, commonly `provider-api-key` | +| `provider.account.connectors[].endpoint` | Usage endpoint URL | +| `provider.account.connectors[].method` | Request method, `GET` or `POST` | +| `provider.account.connectors[].headers` | Request headers, without sensitive auth headers | +| `provider.account.connectors[].body` | Optional request body | +| `provider.account.connectors[].mapping.meters` | Usage meter mappings | + +Complete manifest example: + +```json +{ + "provider": { + "name": "Example AI", + "base_url": "https://api.example.com/v1", + "protocol": "openai_chat_completions", + "models": ["example-chat", "example-coder"], + "icon": "https://example.com/icon.png", + "source": "https://example.com", + "account": { + "enabled": true, + "refreshIntervalMs": 300000, + "connectors": [ + { + "type": "http-json", + "auth": "provider-api-key", + "endpoint": "https://api.example.com/v1/account/usage", + "method": "GET", + "headers": { + "accept": "application/json" + }, + "mapping": { + "meters": [ + { + "id": "balance", + "kind": "balance", + "label": "Balance", + "remaining": "data.balance.remaining", + "unit": "USD" + }, + { + "id": "subscription", + "kind": "subscription", + "label": "Monthly quota", + "remaining": "data.quota.remaining", + "limit": "data.quota.limit", + "resetAt": "data.quota.reset_at", + "unit": "tokens", + "window": "monthly" + } + ] + } + } + ] + } + } +} +``` + +## Supported Parameters + +| Parameter | Description | +| --- | --- | +| `name` | Provider display name | +| `base_url` | Provider API Base URL, required | +| `api_key` | Optional provider API key | +| `protocol` | Protocol, one of `openai_chat_completions`, `openai_responses`, `anthropic_messages`, `gemini_generate_content`, `gemini_interactions` | +| `models` | Model list, comma-separated, newline-separated, or repeated | +| `icon` | Provider icon URL | +| `source` | Provider website or config source | +| `manifest` | Remote manifest URL | +| `payload` | JSON or base64url JSON config | +| `usage_url` | Optional account usage endpoint | +| `fetch_usage` | Whether account usage fetching is enabled | +| `usage_method` | Usage request method, `GET` or `POST` | +| `usage_headers` | Usage request headers as a JSON string | +| `usage_body` | Usage request body as a JSON string | +| `balance` | Balance field path | +| `balance_unit` | Balance unit | +| `subscription` | Subscription remaining field path | +| `subscription_limit` | Subscription limit field path | +| `subscription_reset` | Subscription reset time field path | +| `subscription_unit` | Subscription unit | +| `subscription_window` | Subscription window, such as `monthly` | + +Parameter names and protocol values must use the exact names above. Aliases such as `baseUrl`, `apiKey`, `model`, `type`, or `openai` are not accepted. diff --git a/docs/src/content/docs/en/configuration/providers.md b/docs/src/content/docs/en/configuration/providers.md new file mode 100644 index 0000000..ce6a1bf --- /dev/null +++ b/docs/src/content/docs/en/configuration/providers.md @@ -0,0 +1,170 @@ +--- +title: Provider Config +pageTitle: Provider Config +eyebrow: Detailed Configuration +lead: Configure upstream model services, credentials, protocols, base URLs, and model lists. +--- + +## Import Local Agent Login + +When you add a provider, CCR scans for reusable local agent login state. If usable credentials are found, the add dialog shows the matching import entry. Importing creates a normal provider plus provider plugins, so CCR can reuse the local agent authorization without requiring a pasted API key. + +### Claude Code + +Claude Code import reads local Claude Code OAuth credentials. When a usable access token is available, CCR can import it as a `Claude Code API` provider. + +After import: + +1. The protocol is `anthropic_messages`. +2. The default model list includes `claude-sonnet-4-20250514`; you can later add or remove models in the provider model list. +3. CCR creates OAuth provider plugins that convert requests to use the Claude Code login state. +4. Account usage uses the Anthropic OAuth usage endpoint, so quota state can appear in the provider list, tray, and account panels. + +If CCR only detects login traces but no usable access token, the import entry shows why it cannot be imported. Re-authenticate in Claude Code, then return to CCR and add the provider again. + +### Codex + +Codex import reads the local Codex auth file and model cache. When a Codex access token or refresh token is available, CCR can import it as a `Codex API` provider. + +After import: + +1. The protocol is `openai_responses`. +2. The API endpoint points to the Codex backend. The model list always includes at least `gpt-5-codex` and also merges models and display names from the local model cache. +3. CCR creates Codex OAuth provider plugins and refreshes access credentials when needed. +4. Account usage reads Codex quota, balance, and token-stat endpoints. + +After import, select `Codex API/model-name` in routing or Agent Config. If the model cache is stale, open Codex first so it refreshes the model list, then return to CCR to import again or edit the models. + +### ZCode + +ZCode import reads provider API keys, API endpoints, and model lists from local ZCode config. It can be imported as a `ZCode API` provider only when CCR finds a usable provider key and Base URL. + +After import: + +1. The protocol is `anthropic_messages`. +2. Models come from local ZCode config first; if none are configured, CCR uses the ZCode runtime cache or default models. +3. CCR creates API-key provider plugins that use the key from local ZCode config for request authentication. +4. If the API endpoint matches a built-in CCR preset, account usage settings are reused from that preset. + +If CCR detects ZCode login state but no usable provider API key, the import entry remains unavailable. Configure a usable model provider in ZCode first, then return to CCR and add the provider. + +## Main Fields + +| Field | Capability | +| --- | --- | +| Select preset provider | Applies a built-in provider template, including default endpoint, supported protocols, default models, icon, provider website, and sometimes account usage settings. Choose `Other / custom API endpoint` for any OpenAI, Anthropic, or Gemini compatible upstream. | +| Name | Internal CCR display name. It is also used by routing, model selectors, logs, and config references. Names must be unique. | +| API endpoint | Upstream API base URL. It controls where requests are sent, and is also used for protocol probing, model discovery, icon detection, and safety checks. Preset providers hide it by default while adding, but it can be overridden in Advanced settings. Custom providers must provide it. | +| API key | Default provider credential. When the credential pool is empty, model requests use this key. Protocol probing, model discovery, connection checks, and default usage fetching also use it. Only use a key issued for the selected endpoint. | +| Models | Model IDs exposed by CCR. Routing rules, profile model selectors, the model catalog, and client `/models` responses all use this list. | +| Search models / All / Clear | When CCR can discover models from the upstream or catalog, you can search, select all, clear, and choose models. Selected models are saved to the provider. | +| Custom models | Manually adds model IDs that discovery did not return. Use this when the provider lacks a `/models` endpoint or a new model is not in the catalog yet. | +| Check Connection | Sends real test requests with the current endpoint, API key, protocol, and selected models. It verifies key, model name, and protocol usability. | +| Models to check | Model selection inside the connection-check confirmation dialog. Use it to test only some models. | +| Check results | Shows whether each model is available, which protocol matched, and the upstream diagnostic message. Results are diagnostic. Add models through the main model selection when you want them saved. | + +## Connectivity Checks + +`Check Connection` sends real model requests for the models you select. It verifies whether the endpoint, API key, protocol, and model IDs are usable. The check limits generated output, but it can still create extra token usage or count against provider-side request limits. + +If the provider bills by request, input tokens, or output tokens, select only the models you need to verify. Checking every model at once can create unnecessary usage. Review the diagnostics, then adjust the model list or usage-fetching settings manually when needed. + +## Credentials + +`API key` is the simplest single-key setup. For multiple upstream keys, expand `Credential pool` in Advanced settings. + +| Field | Capability | +| --- | --- | +| Show credential settings | Expands or collapses credential pool editing. Collapsing does not remove saved credentials. | +| Import JSON | Imports credentials from a JSON file. CCR accepts a top-level array, or an object with a `credentials`, `keys`, or `apiKeys` array. | +| Add key | Adds one upstream API key row. | +| Enable | Controls whether this credential participates in request forwarding and usage fetching. Disabled credentials are kept but not selected. | +| Name | Display name for the credential. It appears in account usage, logs, and diagnostics, so use a recognizable purpose or quota source. | +| API key | The actual key sent to the upstream for this credential. When a credential pool is configured, CCR expands enabled credentials into internal upstream targets and prefers the pool over the main form API key for model requests. | +| Remove | Deletes the credential row. | +| Advanced key options | Expands per-key scheduling and limit fields. | +| Priority | Credential priority. Lower numbers are tried first. If omitted, the row order is used. | +| Weight | Tie-break weight among credentials with the same priority and similar usage. Higher numbers are preferred. Defaults to `1`. | +| Limits JSON | Local limit rules for this key. CCR tracks request, token, or image usage windows and skips a key once it would exceed its limit, then tries another key on the same provider. | + +Common `Limits JSON` fields: + +| Field | Meaning | +| --- | --- | +| `rpm` / `rph` / `rpd` | Max requests per minute / hour / day | +| `tpm` / `tph` / `tpd` | Max tokens per minute / hour / day | +| `ipm` / `iph` / `ipd` | Max images per minute / hour / day | +| `maxRequests` + `windowMs` | Max requests in a custom time window | +| `maxTokens` + `quotaWindowMs` | Max tokens in a custom time window | + +Example: + +```json +{ + "rpm": 60, + "tpm": 100000 +} +``` + +The credential pool is an upstream provider key pool. It is separate from the client access keys configured on the API Keys page. + +## Usage Fetching + +`Fetch usage` lets CCR show balance, subscription quota, status, and messages in the provider list, tray, and account panels. It does not affect whether models can be requested. + +| Field | Capability | +| --- | --- | +| Fetch usage | Enables or disables account usage fetching for this provider. | +| Usage mode | Usage connector mode. `Standard usage endpoint` uses CCR standard account endpoints; `HTTP JSON request` maps a custom JSON endpoint; `Raw connector JSON` edits the connector array directly. | +| Refresh interval ms | Usage refresh interval in milliseconds. Empty uses the default interval. The minimum effective interval is 30000ms. | + +### Standard Usage Endpoint + +This mode tries provider-hosted CCR account endpoints such as `/.well-known/ccr/account` and `/v1/account/limits`. It is best for providers or presets that already implement CCR's standard account format. + +### HTTP JSON Request + +Use this mode when the provider has a balance or quota endpoint that returns a custom JSON shape. + +| Field | Capability | +| --- | --- | +| Method | Usage request method, `GET` or `POST`. | +| Usage request URL | Usage endpoint URL. It can be a full URL. The request includes the provider API key unless changed through raw connector JSON. | +| Headers | Extra headers for the usage endpoint. Avoid hard-coding sensitive auth headers here; prefer provider API key auth. | +| Body | `POST` request body. Must be valid JSON. | +| Balance remaining field | JSON path for remaining balance. | +| Balance total field | JSON path for total balance or total credits. | +| Balance used field | JSON path for used balance. | +| Balance unit | Balance unit, such as `USD`, `CNY`, or `%`. | +| Subscription remaining field | JSON path for remaining subscription, token, quota, or package amount. | +| Subscription limit field | JSON path for subscription, token, quota, or package limit. | +| Subscription reset field | JSON path for reset time. It may resolve to an ISO string, seconds timestamp, or milliseconds timestamp. | +| Subscription unit | Subscription unit, such as `tokens`, `requests`, or `hours`. | +| Status field | JSON path for account status. Supported values are `ok`, `warning`, `critical`, `error`, and `unsupported`. | +| Message field | JSON path for account message. Useful for provider errors, plan notes, or risk-control messages. | +| Test usage request | Requests and parses the usage endpoint before saving. | +| Response fields | Lists selectable paths from the response. Buttons such as `Balance rem`, `Balance total`, `Balance used`, `Sub rem`, `Sub limit`, and `Reset` fill the matching field. | + +Field paths use CCR's lightweight JSONPath syntax: + +| Syntax | Meaning | +| --- | --- | +| `$` | Whole response object | +| `$.balance.remaining` | Object field | +| `$.items[0].value` | Array index | +| `$["weird-key"]` | Field name with special characters | +| `$.limits[?(@.type=="TOKENS")].remaining` | First array item matching simple equality filters | +| `100 - $.data.percentage` | Numeric subtraction expression, often used to convert used percent into remaining percent | + +### Raw Connector JSON + +`Connectors JSON` edits the `account.connectors` array directly for more complex provider setups. + +| Connector type | Capability | +| --- | --- | +| `standard` | Uses CCR standard account endpoints. | +| `http-json` | Requests a JSON endpoint and maps balance, subscription, status, and message fields. | +| `plugin` | Calls an account usage connector registered by an installed plugin. | +| `local-estimate` | Shows estimated quota from local time-window config without a remote request. | + +`Insert example` fills an example connector array containing `standard`, `http-json`, `plugin`, and `local-estimate` connectors. diff --git a/docs/src/content/docs/en/configuration/routing.md b/docs/src/content/docs/en/configuration/routing.md new file mode 100644 index 0000000..f21a521 --- /dev/null +++ b/docs/src/content/docs/en/configuration/routing.md @@ -0,0 +1,196 @@ +--- +title: Routing Config +pageTitle: Routing Config +eyebrow: Detailed Configuration +lead: Choose the model for a request, then automatically retry or switch to fallback models when the request fails. +--- + +## Built-In Routing + +### Claude Code + +The built-in Claude Code route detects requests from Claude Code and routes main requests to the Claude Code Agent Config model. + +Claude Code **main requests** use the Claude Code Agent Config model. If that model is unset, the built-in route remains inactive. CCR also automatically removes the first `x-anthropic-billing-header` system message injected by Claude Code so that billing helper messages do not affect later routing decisions. Claude Code Subagent, Task, and Workflow-created agents can still choose different models through the tag mechanism below. + +#### Subagent / Workflow Auto-Routing + +Claude Code Agent / Task / Workflow can spawn additional model requests. CCR uses tag injection to let those spawned requests choose a more appropriate CCR model: + +```text +provider/model +``` + +The full flow is: + +1. A Claude Code main request matches the built-in route, so CCR inspects the current tool list. +2. If at least one model has a **Description**, CCR injects the available models and descriptions into the `Agent` / `Task` tool description and `prompt` field description. +3. If the tool list includes `Workflow`, CCR appends a Workflow-specific instruction: whenever the workflow creates an `Agent` / `Task`, each spawned agent prompt must start with the same model tag. +4. When Claude Code calls `Agent` / `Task`, or when a Workflow creates an agent, the prompt starts with `provider/model`. +5. When the spawned request reaches CCR, CCR extracts and removes the tag from the system prompt or the first two user messages, then routes that request to the tagged model. + +Subagent / Workflow auto-routing therefore does not use headers such as `x-claude-code-agent-id` as the model selector. Those headers can help with observation, but the actual model selection comes from the prompt tag. + +##### Pairing It With The Models Page + +The **Description** field on the Models page is both the enablement switch and the selection guide for this mechanism. If no model has a Description, CCR does not inject Agent / Task / Workflow routing instructions, so it does not write an empty model list into tool descriptions. + +Recommended setup: + +1. Add usable models under **Providers**, and verify that the model IDs can be requested. +2. Open **Models** and fill Description for the models you want Subagents to choose automatically. Describe task fit, speed, cost, and limits. +3. Enable a Claude Code config under **Agent Config**, and choose the main model. This model handles the main Claude Code conversation. +4. Confirm that the built-in **Claude Code** route is enabled on the **Routing** page. +5. Use Agent, Task, or Workflow in Claude Code. When Claude Code spawns an agent, it can choose a CCR model from the descriptions and write the tag. + +Write descriptions around tasks instead of only naming the provider. For example: + +| Model purpose | Description example | +| --- | --- | +| Fast low-cost model | Good for code search, file triage, summaries, small edits, and low-cost parallel Subagents. | +| Strong reasoning model | Good for complex architecture analysis, large refactor planning, cross-file reasoning, and high-risk code review. | +| Long-context model | Good for reading large logs, long documents, repository-scale context gathering, and Workflow summaries. | + +After saving, CCR formats those descriptions as “Configured CCR gateway models” in the injected Claude Code instructions. When Claude Code picks a model, request logs should show `builtin:claude-code-subagent`, and the tagged model becomes the final `resolved model`. + +### Codex + +The built-in Codex route adapts Codex's `apply_patch` file-editing tool for third-party or non-GPT models. The goal is for those models to edit files through the patch tool instead of generating commands or scripts such as `cat >`, `sed -i`, `python`, or `node`. + +Technically, this is a tool protocol bridge. Native Codex `apply_patch` is a custom/freeform tool whose input is raw patch text, while many OpenAI-compatible third-party models handle ordinary function tools more reliably. CCR rewrites `apply_patch` into an upstream-visible `virtual_apply_patch` function tool and injects the full `apply_patch.lark` grammar into the tool description, requiring the model to put the patch in the `patch` field. + +When the model returns `virtual_apply_patch`, CCR rewrites it back to Codex's expected shape: `custom_tool_call` with `name = apply_patch` and `input = raw patch text`. CCR does not edit files directly; Codex still executes the resulting patch. This adaptation follows the built-in **Codex** route and has no separate switch. GPT-named models keep using Codex's native freeform `apply_patch` path. + +## Custom Routing + +Custom routes are configured in the Routing page rule list. The top **Search routing rules** field filters by rule name, condition, request action, and related row text; the top-right **Add** button opens the **Add Routing Rule** dialog. The table shows each rule under **Name**, **Condition**, **Request action**, **Status**, and **Action**. + +Custom rules match in list order, and the first enabled matching rule rewrites the request. Use the move up and move down buttons to adjust priority. Use the edit button to open **Edit Routing Rule**, and the delete button to open a confirmation dialog. Turning off the **Status** toggle keeps the rule in the list but removes it from matching. + +### Add Or Edit A Rule + +The dialog fields map directly to the saved rule: + +| UI field | How to fill it | Saved meaning | +| --- | --- | --- | +| **Name** | Enter a recognizable rule name. This field is required. | Shown in the **Name** column and included in search. | +| **Condition** | Choose `request.header` or `request.body`, then fill in field, operator, and value. | Builds `condition.left`, `condition.operator`, and `condition.right`. | +| **Rewrite request parameters** | Keep at least one rewrite row. Each row chooses an operation, target key, and required value fields. | Builds `rewrites`, applied when the rule matches. | +| **Enabled** | Turn the rule on or off. | Controls `enabled`; disabled rules do not match. | +| **On failure** | Configure fallback behavior for this rule. | Overrides **Default on failure** when this rule matches. | + +The **Add** or **Save** button is enabled only when the form is valid: name, condition field, and condition value are required; every rewrite row must have a key. **Delete** only requires a key. **Replace in array** requires both **Match value** and **Value**. Other operations require **Value**. + +### Condition + +The **Condition** area has four controls: source, field, operator, and value. + +| Source | Field examples | Matched path | +| --- | --- | --- | +| `request.header` | `user-agent`, `x-api-key`, `x-client-name` | `request.header.user-agent` | +| `request.body` | `model`, `messages`, `messages.0.role`, `tools` | `request.body.model` | + +Header names are case-insensitive. Body fields use dot-path lookup, and numeric segments address array indexes; for example, `messages.0.role` reads the first message role. For nested arrays such as `messages` or `tools`, `contains deep` is usually more robust than a fixed index. + +The value field is parsed as a common literal when possible: `true`, `false`, `null`, numbers, JSON objects, and JSON arrays compare as their corresponding types. Other input is treated as a string. To force a value to stay string-like, wrap it as `"123"` or `'123'`. + +| Operator | Use | +| --- | --- | +| `==` / `!=` | Compare actual and expected values. Numbers compare numerically; other values compare by comparable text. | +| `>` / `>=` / `<` / `<=` | Compare numerically when both sides are numbers; otherwise compare text order. | +| `starts with` | Check whether the actual value starts with the input value. Useful for model-prefix routing. | +| `contains` | Check substring containment for strings; for arrays, check direct array elements. | +| `contains deep` | Recursively checks objects and arrays. Useful for searching `messages` and `tools`. | +| `not contains` | The inverse of `contains`. | + +### Rewrite Request Parameters + +The **Rewrite request parameters** area starts with one `request.body.model` row. This is the common model-routing path: choose **Set**, use key `request.body.model`, and set the value to a target `provider/model` or Fusion model. + +Click **Add parameter** to add more rewrite rows. The trash button removes a row, but the last row cannot be removed. When the rule matches, CCR applies the rewrite rows in order. + +| Operation | Required fields | Behavior | +| --- | --- | --- | +| **Set** | key, value | Sets a request field, such as `request.body.model = provider/model` or `request.body.temperature = 0.2`. | +| **Delete** | key | Deletes a request field. Deleting `request.header.x-test` removes that header; deleting `request.body.foo` removes that body field. | +| **Append to array** | key, value | Appends the value to the target array. If the target is not an array, CCR starts from an empty array. | +| **Prepend to array** | key, value | Prepends the value to the target array. | +| **Remove from array** | key, value | Removes array elements equal to the value. | +| **Replace in array** | key, match value, value | Replaces array elements matching **Match value** with the new value. | + +Rewrite values are also parsed as literals, so `0.2` becomes a number, `true` becomes a boolean, and `{"type":"web_search"}` becomes an object. Only `request.body.model` receives additional CCR model-selector normalization. + +### On Failure + +The dialog **On failure** control is the same control used by the page-level **Default on failure** setting. Choose **Off** to avoid fallback. Choose **Retry** to reveal **Retries**. Choose **Fallback targets** to reveal the **Fallback target** input and **Add** button. Added targets appear as tags with move up, move down, and remove buttons for ordering the fallback chain. + +When a rule matches, its **On failure** setting is used. Requests that do not match a rule continue to use the page-level default. + +### Examples + +| Goal | Condition source | Field | Operator | Value | Rewrite request parameters | +| --- | --- | --- | --- | --- | --- | +| Route by client header | `request.header` | `x-client-name` | `==` | `claude-code` | **Set** `request.body.model = provider/model` | +| Route by original model prefix | `request.body` | `model` | `starts with` | `claude-` | **Set** `request.body.model = provider/model` | +| Route message content to a vision model | `request.body` | `messages` | `contains deep` | `image` | **Set** `request.body.model = vision-provider/model` | +| Remove a debug header | `request.header` | `x-debug-route` | `==` | `1` | **Delete** `request.header.x-debug-route` | + +After saving, the rule appears in the list. Use request logs, especially `request model`, `resolved provider`, `resolved model`, and route reason, to verify that it matched. + +## Fallback Handling + +Fallback is the failure strategy after a model or upstream request fails. Routing picks the first model; Fallback decides whether CCR should keep trying after the current target fails. + +The **Default on failure** control at the top of the Routing page is the global Fallback. Each rule also has **On failure**. When a rule matches, its rule-level Fallback overrides the global Fallback. + +## Fallback Modes + +| Mode | Behavior | +| --- | --- | +| Off | Do not fallback; send the request once to the current model | +| Retry | Retry the same model up to `Retries` times | +| Fallback targets | Try the current model first, then switch through configured fallback models in order | + +Use **Retry** for transient timeout, rate-limit, or network failures. Use **Fallback targets** when the primary model or provider should fail over to another model or provider. + +## Failure Triggers + +Network errors move to the next attempt. Status-code fallback depends on the mode: + +| Mode | Triggering status codes | +| --- | --- | +| Retry | `408`, `409`, `429`, `5xx` | +| Fallback targets | Any `4xx` or `5xx` | + +Before moving to the next attempt, CCR waits for every fallback-triggering failure, including network errors. It honors a positive `Retry-After` header when the upstream provides one; otherwise it uses exponential backoff starting at 1 second and capped at 30 seconds per attempt. + +**Fallback targets** also switches on `4xx` because model-not-found, auth, or provider-side rejection errors may only affect the current target. If the fallback model works, the request can still succeed. + +## How To Configure + +### Global Fallback + +Configure **Default on failure** at the top of the Routing page: + +1. Choose **Retry** or **Fallback targets**. +2. If you choose **Retry**, set `Retries`. +3. If you choose **Fallback targets**, add backup models in priority order. + +Global Fallback applies to routing rules that do not define their own Fallback. + +### Rule-Level Fallback + +When adding or editing a routing rule, configure **On failure** for that rule. + +Rule-level Fallback is useful for high-risk or expensive targets. For example, route image tasks to a Fusion vision model first, then fall back to another multimodal model; or route complex tasks to a strong model first, then fall back to a stable model. + +## Verification + +After saving, send a request and inspect Logs: + +- `request model`: the original model from the client. +- `resolved provider`: the final provider. +- `resolved model`: the final model. +- status code and error details. + +When Fallback runs, response headers include `x-ccr-fallback-attempts`, `x-ccr-fallback-failures`, `x-ccr-fallback-delays-ms` for delayed attempts, and the final `x-ccr-fallback-model`. Request log details also show the related retry attempt list. diff --git a/docs/src/content/docs/en/configuration/server.md b/docs/src/content/docs/en/configuration/server.md new file mode 100644 index 0000000..c671b31 --- /dev/null +++ b/docs/src/content/docs/en/configuration/server.md @@ -0,0 +1,28 @@ +--- +title: Server +pageTitle: Server +eyebrow: Detailed Configuration +lead: Configure the CCR gateway host, port, and Proxy mode for MITM interception and proxying into CCR. +--- + +## Main Fields + +| Field | Capability | +| --- | --- | +| Host | Host address the CCR gateway listens on. Common values are `127.0.0.1` and `0.0.0.0`. | +| Port | Gateway listening port. Clients should point their API base URL to this port. | + +## Proxy Mode + +Proxy mode is the local proxy capability. When enabled, clients can send HTTP/HTTPS traffic to CCR. CCR uses MITM interception to identify and decrypt HTTPS requests, then proxies supported model requests into the CCR gateway path. + +| Field | Capability | +| --- | --- | +| Proxy mode | Enables Proxy mode. CCR can receive client traffic as an HTTP/HTTPS proxy and use MITM interception to proxy model requests into CCR. | +| System proxy | Points the system proxy at CCR so apps that honor system proxy settings can go through CCR automatically. | +| Capture network | Stores network requests that pass through proxy mode so the Networking page can show request and response details. | +| CA certificate | Trust status of the current proxy CA certificate. | +| Install CA | Installs the CCR proxy CA into the system or user trust store. Installation differs by OS. | +| Check Trust | Checks again whether the proxy CA is trusted by the system. | +| Proxy status | Shows whether the proxy service is running. | +| Restart Proxy | Restarts the proxy service when proxy mode is enabled. | diff --git a/docs/src/content/docs/en/configuration/toolhub.md b/docs/src/content/docs/en/configuration/toolhub.md new file mode 100644 index 0000000..c098456 --- /dev/null +++ b/docs/src/content/docs/en/configuration/toolhub.md @@ -0,0 +1,167 @@ +--- +title: ToolHub +pageTitle: ToolHub +eyebrow: Detailed Configuration +lead: Collapse many MCP servers into one compact entry point so agents lazy-load task-specific tools and save context. +--- + +## When To Use It + +As your MCP setup grows, exposing every tool directly to an agent makes the eager tool list large and easier to misuse. ToolHub exposes one `ccr-toolhub` MCP server with two meta tools: + +- `tool_hub.resolve`: searches the available MCP tool catalog for the current task. +- `tool_hub.invoke`: calls a real MCP tool that was selected for this task. + +Use ToolHub for tools that are not needed often but are still useful occasionally. It lazy-loads them only when a task actually needs them. The main value is saving context: large low-frequency tool catalogs do not have to stay in the agent's eager tool list, which reduces context use and the chance of selecting the wrong tool. Simple local code, file, or conversation tasks usually do not need ToolHub. + +## How It Works + +1. Enable ToolHub in **Settings → ToolHub**. +2. Select a configured model as the **Resolver model**. It reads the MCP tool catalog and chooses the tools needed for the task. Prefer `deepseek-v4-flash`, or another stable lightweight model in a similar flash-price tier. +3. Add or import backend MCP servers. ToolHub supports `stdio`, `streamable-http`, and `sse`. +4. Open Claude Code or Codex from CCR. CCR writes the `ccr-toolhub` MCP server into that agent config. +5. When the agent receives a request about external services, installed MCP capabilities, or business APIs, it calls `tool_hub.resolve` first, then uses `tool_hub.invoke` to run the selected tools. + +ToolHub combines MCP servers configured on the ToolHub page with compatible global Agent MCP servers from older configs, and excludes `ccr-toolhub` itself to avoid recursive calls. + +## Built-In Browser Automation + +When ToolHub is enabled in CCR Desktop and **Built-in browser automation** is turned on, agents can use the desktop built-in browser for web tasks. You do not need to add a browser backend on the ToolHub page, and you do not need a separate API key; CCR connects to it through the local gateway authentication path. + +To enable it: + +1. Open **Settings → ToolHub** and turn on **Enable ToolHub**. +2. Turn on **Built-in browser automation** on the same page. This switch is shown only after ToolHub is enabled. +3. After saving settings, reopen Claude Code or Codex from CCR so the new agent instance loads the latest configuration. + +> Already-running agent instances usually do not pick up this switch immediately. Restart the agent instance, or use the agent's own controls to restart ToolHub. + +Built-in browser automation is useful for tasks that need real browser state, such as opening sites, reading pages, filling forms, clicking buttons, scrolling, or completing web flows like ordering, booking, lookup, and checkout when no domain-specific capability exists. After it is enabled, the agent can: + +- Open or attach built-in browser tabs, then navigate to URLs or search queries. +- Read page content and find buttons, links, form fields, and other page elements. +- Click, type, select, press keys, and scroll page elements. +- Wait for page loads, navigation, dialogs, or human handoff results before continuing. +- Request human help for login, verification codes, CAPTCHA, human checks, or manual confirmation. + +When a web flow needs login, verification codes, CAPTCHA, a human check, or manual confirmation, CCR shows the built-in browser window and displays the requested action in the top toolbar. After the user clicks **Done** or **Hide**, the agent receives the result and continues. Handoff waits support up to 10 minutes. + +### Chrome Login Import Extension + +Built-in browser automation can also import login state for selected domains from system Chrome into CCR's in-app browser. This lets the agent reuse sites where you are already signed in to Chrome. It requires the unpacked Chrome extension in this repository: `extension/chrome`. + +Install it: + +1. Open `chrome://extensions` in Chrome. +2. Enable **Developer mode**. +3. Click **Load unpacked**. +4. Select the repository's `extension/chrome` directory. + +Import flow: + +1. When a task needs existing Chrome login state, the agent can request an import; the user can also click the key button in CCR's in-app browser toolbar. +2. CCR creates a one-time import job and opens a confirmation page. If your default browser is not Chrome, copy the confirmation URL into Chrome with the extension installed. +3. Review the requested domains on the confirmation page, then click **Confirm and Import**. +4. The Chrome extension reads cookies and localStorage for those domains and submits them to CCR. After it completes, the agent can continue the task in the built-in browser. + +The extension reads only the domains listed in the CCR import job. It does not enumerate every Chrome cookie. For localStorage, the extension temporarily opens non-active tabs for the selected origins, reads `localStorage`, and closes those tabs. If the confirmation page says the extension does not have site access, allow the extension to access the target domains in Chrome extension settings, reload the unpacked extension, and try again. + +> Note: Built-in browser automation depends on CCR Desktop's built-in browser and is only available in the desktop app. CLI, server deployments, and pure web environments do not include this built-in capability; use an external browser automation MCP server instead. + +## Options + +| Option | Description | +| --- | --- | +| Enable ToolHub | Exposes `ccr-toolhub` to agents. If no backend MCP server is available, CCR does not generate a ToolHub MCP config. | +| Built-in browser automation | Shown only after ToolHub is enabled. Lets agents use CCR Desktop's built-in browser for web tasks. | +| Resolver model | Choose from configured provider models. Prefer `deepseek-v4-flash`, or another stable lightweight model in a similar flash-price tier with enough tool-description understanding. | +| Max tools | Maximum tools returned by one resolve call. Range `1` to `20`, default `10`. | +| Timeout ms | Base timeout for ToolHub resolving and invocation. Range `8000` to `300000`, default `60000`. If a backend MCP server needs a longer request timeout, CCR raises the effective invocation timeout to match the backend. | +| MCP servers | Backend tool sources. Each server needs a unique name plus transport, command or URL, environment variables, headers, and timeouts. | +| Import JSON | Imports common MCP JSON shapes. Supports a root object, array, `mcpServers`, or `mcp_servers`. | + +## Add MCP Servers + +### stdio + +Use `stdio` for local command-line MCP servers. Configure: + +- **Command**: launch command, such as `npx`, `node`, or `python`. +- **Arguments**: command arguments. +- **Working directory**: optional working directory. +- **Stdio message mode**: keep `content-length` by default; use `newline-json` for line-delimited JSON servers. +- **Environment variables**: variables needed only by this MCP server. + +### streamable-http / sse + +Remote MCP servers need a URL. Authentication can use: + +- **API key**: stored directly in the config. +- **API key env**: read from an environment variable. +- **Headers**: custom request headers. + +If a remote server starts slowly or has long-running calls, adjust that server's **Startup timeout** or **Request timeout**. + +## JSON Example + +The desktop app's SQLite config is the effective source, so prefer editing through the UI. The fields below are useful for backups, migration, or troubleshooting: + +```json +{ + "toolHub": { + "enabled": true, + "browserAutomation": true, + "llm": { + "apiKey": "sk-...", + "baseUrl": "https://api.openai.com/v1", + "model": "gpt-5-mini" + }, + "maxTools": 10, + "requestTimeoutMs": 60000, + "mcpServers": [ + { + "name": "filesystem", + "transport": "stdio", + "command": "npx", + "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"], + "env": {}, + "stdioMessageMode": "content-length", + "requestTimeoutMs": 30000, + "startupTimeoutMs": 600000 + } + ] + } +} +``` + +The import dialog also accepts common MCP JSON: + +```json +{ + "mcpServers": { + "filesystem": { + "command": "npx", + "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"] + } + } +} +``` + +## ToolHub vs Fusion MCP + +| Capability | ToolHub | Fusion Custom MCP Tool | +| --- | --- | --- | +| Entry point | Agent-side `ccr-toolhub` MCP server | Capability inside one Fusion model | +| Tool selection | Dynamically resolves a tool bundle for each task | Fixed tools selected in the model config | +| Best for | Many MCP servers, changing tool catalogs, agent-led capability discovery | Adding a known tool set to one model | +| Visibility | Claude Code or Codex configs opened through CCR | Routes or agents that select that Fusion model | + +## Troubleshooting + +- Agent cannot see ToolHub: make sure ToolHub is enabled and at least one backend MCP server is configured or **Built-in browser automation** is turned on, then reopen Claude Code or Codex from CCR. +- Missing resolver model or API key: select a configured resolver model and confirm the provider credential works. +- The agent cannot use built-in browser automation: make sure you are using CCR Desktop, turned on **Built-in browser automation** in **Settings → ToolHub**, and reopened Claude Code or Codex from CCR. CLI, server deployments, and pure web environments do not include this built-in capability. +- Chrome login import confirmation keeps waiting for the extension: make sure the unpacked `extension/chrome` extension is loaded in Chrome and has site access for the target domains. If your default browser is not Chrome, copy the confirmation URL into Chrome manually. +- No tools are resolved: confirm the MCP server can list tools, improve tool names and descriptions, or increase **Max tools**. +- Calls time out: check ToolHub **Timeout ms** and the backend server request/startup timeouts. +- Import fails: validate JSON, avoid duplicate server names, make sure `stdio` entries have a command and remote entries have a URL. diff --git a/docs/src/content/docs/en/configuration/tray.md b/docs/src/content/docs/en/configuration/tray.md new file mode 100644 index 0000000..a09f199 --- /dev/null +++ b/docs/src/content/docs/en/configuration/tray.md @@ -0,0 +1,41 @@ +--- +title: Tray Configuration +pageTitle: Tray Configuration +eyebrow: Detailed Configuration +lead: Configure the CCR system tray icon, balance progress, and tray window widgets. +--- + +## Top Fields + +| Field | Capability | +| --- | --- | +| Tray mascot | Selects the tray icon style. Options include `Random`, `Auralis`, `Solara`, `Vesper`, and `Balance progress`. | +| Balance progress | Uses provider account usage as tray icon progress. Requires `Fetch usage` on a provider first. | +| Account | Selects the provider account used for balance progress. | +| Data | Selects the balance, subscription, or quota meter used as the progress source. | + +If no account data is available, the page shows `No account data is available. Enable account monitoring on a provider first.` This usually means no provider has `Fetch usage` enabled, or usage fetching has not succeeded yet. + +## Tray Window Layout + +| Area | Capability | +| --- | --- | +| Components | Left-side component palette for adding or enabling tray window widgets. | +| Preview | Middle preview area showing the current tray window layout. Widgets can be dragged to reorder. | +| Component properties | Right-side editor for the selected widget's `Style`, or for removing the widget. | + +## Component Types + +| Component | Capability | +| --- | --- | +| Provider component | Shows `Provider tabs` for switching provider data in the tray window. It is a singleton component and can be enabled only once. | +| Header component | Shows `Title and status`. It is a singleton component and can be enabled only once. | +| Account component | Shows `Account balance`. Multiple account components can be added with different styles. | +| Trend component | Shows `Token flow chart`. | +| Activity component | Shows `Token activity`. | +| Metric component | Shows `Token stats`. | +| Breakdown component | Shows `Token mix`, `Circular metrics`, or `Model share`. | + +## Styles + +Different components support different `Style` options. Common styles include `Cards`, `Compact`, `List`, `Pills`, `Line`, `Area`, `Bar`, `Ring`, `Donut`, `Gauges`, `Sparkline`, and `Stacked`. Style changes only affect the tray display; they do not change routing, providers, or usage stats. diff --git a/docs/src/content/docs/en/guides.md b/docs/src/content/docs/en/guides.md new file mode 100644 index 0000000..f554a27 --- /dev/null +++ b/docs/src/content/docs/en/guides.md @@ -0,0 +1,105 @@ +--- +title: Claude Code Router Quick Start +pageTitle: Quick Start +eyebrow: Getting Started +lead: Start from installation, connect a provider, let agents send requests through CCR, and confirm the path through logs and observability. +--- + +## Install And Start CCR + +### Download And Install + +1. Open the [GitHub Releases](https://github.com/musistudio/claude-code-router/releases) page. +2. Download the package for your system: `.dmg` or `.zip` for macOS, `.exe` for Windows, and `.AppImage` for Linux. +3. Install and open **Claude Code Router** like a normal desktop app. + +### Start The Service + +Open the **Server** page and click **Start**. After the page shows Running, CCR listens on the default local address `http://localhost:8080`. + +If you want the service to start when the app opens, enable **Auto start** on the Server page. + +## Add A Provider + +A provider is the upstream model service CCR forwards requests to, such as OpenRouter, DeepSeek, Z.AI, or any service compatible with the OpenAI, Anthropic, or Gemini protocols. + +### Add The Provider + +1. Open **Providers** and click **Add Provider**. +2. Choose a built-in preset under **Preset providers**. Presets fill common Base URLs, protocols, and icons automatically. +3. If the service is not listed, choose **Other / custom API endpoint**. +4. Fill in **Name**, **Base URL**, **Protocol**, **API Key**, and **Models**. + +### Choose A Protocol + +| Protocol | Best For | +| --- | --- | +| OpenAI Chat Completions | Most OpenAI-compatible services | +| OpenAI Responses | Services that support the Responses API | +| Anthropic Messages | Anthropic official or Anthropic-compatible services | +| Gemini Generate Content | Gemini official or Gemini-compatible services | + +If you are unsure, run protocol probing in the app first, then use the model connectivity check to confirm. + +### Check These Before Saving + +1. **Protocol probing**: confirm which protocols the Base URL supports. +2. **Model connectivity check**: send test requests to one or two models. +3. **Account usage test**: if you want balance or quota display, confirm the usage API and field mapping. + +Save the provider after these checks pass. + +### Multiple Keys And Usage Panel + +For teams or high-frequency usage, add multiple credentials in the provider form and configure priority, weight, and limits. After saving, filter request logs by credential to verify rotation. + +If you want the overview to show balance or remaining quota, open the provider's **Account / Usage** section, configure the usage integration, and test field mapping. + +## Connect Agent Config + +Agent Config lets Claude Code, Codex, ZCode, and other agents use CCR's providers, routing, and model selection. + +General guidance: + +- During trial, prefer **Only opened from CCR** so only agents launched from CCR are affected. +- After it is stable, consider **System default** if you want the agent's default config changed. +- After applying, launch the agent from CCR's **Open Agent** action when possible. + +### Claude Code + +In **Agent Config**, choose Claude Code, set the model, small fast model, and settings file, then click Apply. Open Claude Code from CCR and send one request to verify it in request logs. + +### Codex + +In **Agent Config**, choose Codex and confirm Provider ID, Provider Name, model, and config file. Only fill Codex CLI path and Codex home when you need a specific CLI or home directory. + +### ZCode + +ZCode mainly uses model, Provider ID, Provider Name, and whether it is launched from CCR. It uses the App surface and does not need Codex CLI path fields. + +### Reuse A Locally Logged-In Agent + +If Claude Code, Codex, or ZCode is already logged in on this machine, import it as a **Local Agent Provider** from **Providers** to reuse the existing authorization without applying for another key. + +## Logs & Observability + +### Enable The Switches + +Open **Settings → Logs & Observability**: + +1. Enable **Request logs**. +2. Enable **Agent observability**. + +### View The Observability Panel + +The observability panel is for inspecting an agent's execution trace and performance: when each step happened, which tool it called, what result the tool returned, how long it took, whether it failed, and how the following steps continued. + +It helps diagnose stuck agents, unexpected tool results, slow steps, or context flow that does not match expectations. Request logs provide request bodies, response bodies, and error details for individual model requests. + +### Request Logs + +Request logs record model request details passing through CCR, including request time, request ID, client, path, requested model, final provider and model, credential, status code, duration, tokens, cost estimate, request body, response body, and errors. + +The Logs page supports filtering by status, provider, model, credential, request ID, model name, request body, or response body. A single record shows the main request and response fields, including `request model`, `resolved provider`, `resolved model`, status code, response body, errors, duration, tokens, and cost estimate. + +Regular request logs are kept locally for the current day. When the local date changes, the next request-log read or write cleans up the previous day's regular logs. diff --git a/docs/src/content/docs/en/guides/agent-profile.md b/docs/src/content/docs/en/guides/agent-profile.md new file mode 100644 index 0000000..d38fb7e --- /dev/null +++ b/docs/src/content/docs/en/guides/agent-profile.md @@ -0,0 +1,32 @@ +--- +title: Connect Agent Config +pageTitle: Connect Agent Config +eyebrow: Quick Start +lead: Let Claude Code, Codex, ZCode, and other agents use CCR's providers, routing, and model selection. +--- + +## General Guidance + +- During trial, prefer **Only opened from CCR** so only agents launched from CCR are affected. +- After it is stable, consider **System default** if you want the agent's default config changed. +- After applying, launch the agent from CCR's **Open Agent** action when possible. + +## Claude Code + +In **Agent Config**, choose Claude Code, set the model, small fast model, and settings file, then click Apply. + +Open Claude Code from CCR and send one request to verify it in request logs. + +## Codex + +In **Agent Config**, choose Codex and confirm Provider ID, Provider Name, model, and config file. + +Only fill Codex CLI path and Codex home when you need a specific CLI or home directory. + +## ZCode + +ZCode mainly uses model, Provider ID, Provider Name, and whether it is launched from CCR. It uses the App surface and does not need Codex CLI path fields. + +## Reuse A Locally Logged-In Agent + +If Claude Code, Codex, or ZCode is already logged in on this machine, import it as a **Local Agent Provider** from **Providers** to reuse the existing authorization without applying for another key. diff --git a/docs/src/content/docs/en/guides/install.md b/docs/src/content/docs/en/guides/install.md new file mode 100644 index 0000000..cfafdb7 --- /dev/null +++ b/docs/src/content/docs/en/guides/install.md @@ -0,0 +1,18 @@ +--- +title: Install And Start CCR +pageTitle: Install And Start CCR +eyebrow: Quick Start +lead: Download the desktop app, install it, and start the local CCR service. +--- + +## Download And Install + +1. Open the [GitHub Releases](https://github.com/musistudio/claude-code-router/releases) page. +2. Download the package for your system: `.dmg` or `.zip` for macOS, `.exe` for Windows, and `.AppImage` for Linux. +3. Install and open **Claude Code Router** like a normal desktop app. + +## Start The Service + +Open the **Server** page and click **Start**. After the page shows Running, CCR listens on the default local address `http://localhost:8080`. + +If you want the service to start when the app opens, enable **Auto start** on the Server page. diff --git a/docs/src/content/docs/en/guides/observability.md b/docs/src/content/docs/en/guides/observability.md new file mode 100644 index 0000000..b47076a --- /dev/null +++ b/docs/src/content/docs/en/guides/observability.md @@ -0,0 +1,27 @@ +--- +title: Logs & Observability +pageTitle: Logs & Observability +eyebrow: Quick Start +lead: Enable request logs and Agent observability in settings, inspect request details, and analyze the agent execution trace and performance. +--- + +## Enable The Switches + +Open **Settings → Logs & Observability**: + +1. Enable **Request logs**. +2. Enable **Agent observability**. + +## View The Observability Panel + +The observability panel is for inspecting an agent's execution trace and performance: when each step happened, which tool it called, what result the tool returned, how long it took, whether it failed, and how the following steps continued. + +It helps diagnose stuck agents, unexpected tool results, slow steps, or context flow that does not match expectations. Request logs provide request bodies, response bodies, and error details for individual model requests. + +## Request Logs + +Request logs record model request details passing through CCR, including request time, request ID, client, path, requested model, final provider and model, credential, status code, duration, tokens, cost estimate, request body, response body, and errors. + +The Logs page supports filtering by status, provider, model, credential, request ID, model name, request body, or response body. A single record shows the main request and response fields, including `request model`, `resolved provider`, `resolved model`, status code, response body, errors, duration, tokens, and cost estimate. + +Regular request logs are kept locally for the current day. When the local date changes, the next request-log read or write cleans up the previous day's regular logs; they are useful for same-day troubleshooting, not long-term audit archiving. diff --git a/docs/src/content/docs/en/guides/provider.md b/docs/src/content/docs/en/guides/provider.md new file mode 100644 index 0000000..6e439a6 --- /dev/null +++ b/docs/src/content/docs/en/guides/provider.md @@ -0,0 +1,38 @@ +--- +title: Add A Provider +pageTitle: Add A Provider +eyebrow: Quick Start +lead: Add an upstream model service, then run protocol, model, and usage checks before saving. +--- + +## Add The Provider + +1. Open **Providers** and click **Add Provider**. +2. Choose a built-in preset under **Preset providers**. Presets fill common Base URLs, protocols, and icons automatically. +3. If the service is not listed, choose **Other / custom API endpoint**. +4. Fill in **Name**, **Base URL**, **Protocol**, **API Key**, and **Models**. + +## Choose A Protocol + +| Protocol | Best For | +| --- | --- | +| OpenAI Chat Completions | Most OpenAI-compatible services | +| OpenAI Responses | Services that support the Responses API | +| Anthropic Messages | Anthropic official or Anthropic-compatible services | +| Gemini Generate Content | Gemini official or Gemini-compatible services | + +If you are unsure, run protocol probing in the app first, then use the model connectivity check to confirm. + +## Check These Before Saving + +1. **Protocol probing**: confirm which protocols the Base URL supports. +2. **Model connectivity check**: send test requests to one or two models. +3. **Account usage test**: if you want balance or quota display, confirm the usage API and field mapping. + +Save the provider after these checks pass. + +## Multiple Keys And Usage Panel + +For teams or high-frequency usage, add multiple credentials in the provider form and configure priority, weight, and limits. + +If you want the overview to show balance or remaining quota, open the provider's **Account / Usage** section, configure the usage integration, and test field mapping. diff --git a/docs/src/content/docs/en/index.md b/docs/src/content/docs/en/index.md new file mode 100644 index 0000000..a9a08ba --- /dev/null +++ b/docs/src/content/docs/en/index.md @@ -0,0 +1,28 @@ +--- +title: Claude Code Router +pageTitle: Documentation +eyebrow: Product Documentation +lead: Learn what CCR is for, where its boundaries are, and how the docs are organized. Start with Quick Start when you want to configure it; use Detailed Configuration for fields, Bots, or Fusion. +--- + +## Documentation Structure + +The top navigation is split into four standalone pages: + +| Page | Contents | +| --- | --- | +| [Documentation](./) | Product positioning, architecture overview, and reading path | +| [Quick Start](guides/) | From installation and provider setup to connecting an agent | +| [Detailed Configuration](configuration/overview/) | Overview dashboard, API keys, server, providers, routing, Agent Config, Fusion, Bots, tray, and config database location | +| [Q&A](troubleshooting/) | Request logs, observability panel, and common questions | + +Bot platform guides are child pages under Detailed Configuration. Each platform has its own page so platform dashboard fields, callback URLs, signatures, and FAQs can be expanded independently. + +## Reading Path + +If this is your first time using CCR: + +1. Start with [Quick Start](guides/) to connect a provider and Agent Config. +2. Use the app's request logs to confirm whether requests are passing through CCR. +3. Open [Detailed Configuration](configuration/overview/) for the overview dashboard, API keys, server, providers, vision, web search, MCP tools, tray, and IM relay. +4. Use [Q&A](troubleshooting/) for 401, 404, timeout, wrong-routing, or Bot delivery questions. diff --git a/docs/src/content/docs/en/relay-agents-in-im-with-bots/dingtalk.md b/docs/src/content/docs/en/relay-agents-in-im-with-bots/dingtalk.md new file mode 100644 index 0000000..3966096 --- /dev/null +++ b/docs/src/content/docs/en/relay-agents-in-im-with-bots/dingtalk.md @@ -0,0 +1,96 @@ +--- +title: DingTalk Bot Setup +pageTitle: DingTalk Bot +eyebrow: Bots And IM Agent Relay +lead: Route agent messages into DingTalk's enterprise collaboration environment, with relay after your screen locks. This page walks you from creating an app in the DingTalk developer backend to a working setup in CCR. +--- + +## Who This Is For + +DingTalk is for bringing agent messages into an enterprise collaboration environment. CCR connects to DingTalk apps using App Secret auth. + +> New to bots? Start with the "Bots And IM Agent Relay" section in Detailed Configuration to understand the overall flow and the Forward agent messages and Handoff modes, then come back here. + +## The Fields You'll Use + +| Name in the DingTalk dashboard | CCR field | Required | Notes | +| --- | --- | --- | --- | +| Client ID / AppKey | App Key | Required | App identifier | +| Client Secret / AppSecret | App Secret | Required | App secret | +| RobotCode | Robot Code | Optional | May be needed for multi-bot or media scenarios | + +> Newer DingTalk configures the bot as an "app capability" — don't start from the old standalone "bot" entry. + +## Step 1: Create A DingTalk App + +1. Open the [DingTalk developer backend](https://open-dev.dingtalk.com/). +2. Log in with your DingTalk account. +3. Pick the dev organization to connect. +4. Open `应用开发` (App Development) at the top. +5. Click `创建应用` (Create App). +6. Name it, e.g. `CCR`. +7. Fill in the description; leave other options default. +8. Click create. + +## Step 2: Copy The App Key And App Secret + +1. Open the app you just created. +2. On the left, open `应用信息` (App Info) or `凭证与基础信息` (Credentials & Basic Info). +3. Copy `Client ID` for CCR's App Key. +4. Copy `Client Secret` for CCR's App Secret. + +> The dashboard may still show the old names `AppKey` / `AppSecret` — map them by field name. + +## Step 3: Enable The Bot Capability + +1. In the app, open `机器人与消息推送` (Bot & Message Push), or open `应用能力` (App Capabilities) and choose `机器人` (Bot). +2. Enable `机器人配置` (Bot Config). +3. Fill in the bot name, avatar, and description. +4. Choose **Stream mode** for message receiving. +5. Save. +6. If the page shows a `RobotCode`, copy it for CCR's Robot Code. + +## Step 4: Publish The App And Join A Chat + +1. Open `版本管理与发布` (Version Management & Release) and create a new version. +2. Set the visibility scope — for testing, choose just yourself or a test group. +3. Submit for release. +4. After release, search the bot name in the DingTalk client. +5. Open the bot chat, or add the bot to the target group via group settings. + +## Wire It Up In CCR + +1. Open CCR's **Bot Management** page and click **Add Bot**. +2. Pick **DingTalk** as the platform. +3. Auth is **App Secret**. +4. Paste the Client ID into **App Key**. +5. Paste the Client Secret into **App Secret**. +6. If you copied a RobotCode, paste it into **Robot Code**. +7. Save the bot. +8. Open **Agent Config** and edit the Agent Config you want to attach it to. +9. Turn on **Bot** and select the bot. +10. Optionally enable **Forward agent messages** or **Handoff**. +11. Reopen the agent from CCR. + +## Message Relay: Forward Or Handoff + +- **Forward agent messages**: forwards regardless of lock state. Good when you want full output in DingTalk. +- **Handoff**: only forwards after the screen locks. Pair with Idle seconds and a target device. + +> For lock-screen-only alerts, use **Handoff** without **Forward agent messages**. + +## Test It + +1. Open the agent from CCR and trigger a message. +2. Check DingTalk to confirm the app received it and replied. +3. For groups, confirm the app or bot is in the target group and can post. + +> **How to tell it worked:** DingTalk shows the agent's message, and replies keep the agent going. + +## Common Issues + +- **Auth fails**: re-copy App Key and App Secret. +- **Bot-identifier errors**: check that Robot Code matches the platform dashboard. +- **Bot receives nothing**: confirm the bot capability is enabled in the app and the receive mode matches CCR's config. +- **Users can't find the bot**: check that the app is published and the visibility scope includes the current user or group members. +- **Handoff doesn't trigger**: confirm the screen is locked, and check the Handoff toggle, idle time, and target device. diff --git a/docs/src/content/docs/en/relay-agents-in-im-with-bots/discord.md b/docs/src/content/docs/en/relay-agents-in-im-with-bots/discord.md new file mode 100644 index 0000000..bdc0e81 --- /dev/null +++ b/docs/src/content/docs/en/relay-agents-in-im-with-bots/discord.md @@ -0,0 +1,100 @@ +--- +title: Discord Bot Setup +pageTitle: Discord Bot +eyebrow: Bots And IM Agent Relay +lead: Route agent messages into Discord server channels or DMs, and relay them after your screen locks. This page walks you from creating the Discord app to a working setup in CCR. +--- + +## Who This Is For + +Discord is for routing agent messages into a server channel, a private collab server, or a personal DM. A Bot Token is the most common setup and is straightforward. + +> New to bots? Start with the "Bots And IM Agent Relay" section in Detailed Configuration to understand the overall flow and the Forward agent messages and Handoff modes, then come back here. + +## The Fields You'll Use + +| Name in the Discord dashboard | CCR field | Required | Notes | +| --- | --- | --- | --- | +| Token | Bot Token | Required | The bot token from the Bot page | +| Application ID | Application ID | Optional | App ID from General Information | +| Public Key | Public Key | Optional | May be needed for interaction callbacks | + +A Bot Token is usually enough. Only choose OAuth 2.0 if your flow explicitly requires it. + +## Step 1: Create The Discord App And Bot + +1. Open the [Discord Developer Portal](https://discord.com/developers/applications). +2. Click `New Application`. +3. Name it, e.g. `CCR`. +4. Open the app after it's created. +5. Open `Bot` on the left. +6. If there's no bot yet, click `Add Bot`. +7. Set the avatar and username. + +## Step 2: Enable The Required Intents + +1. Still on the `Bot` page, find `Privileged Gateway Intents`. +2. Enable **Message Content Intent**. Without it, the bot likely can't see message bodies. +3. Enable **Server Members Intent** if you gate on members, roles, or usernames. +4. **Presence Intent** is usually unnecessary unless you read online status. + +## Step 3: Copy The Bot Token + +1. On the `Bot` page, find `Token`. +2. Click `Reset Token` or `Copy`. +3. On first creation, `Reset Token` generates the first token — it doesn't mean you broke anything. +4. Copy the token for CCR's Bot Token. + +> This token is effectively the bot's password. Don't post it in Discord or paste it into an agent prompt. + +## Step 4: Invite The Bot Into A Server + +1. Open `OAuth2` on the left. +2. Open `URL Generator`. +3. In `Scopes`, tick `bot` and `applications.commands`. +4. In `Bot Permissions`, tick at least `View Channels`, `Send Messages`, `Read Message History`, `Embed Links`, `Attach Files`. +5. Tick `Add Reactions` if you want reactions on approval messages. +6. Copy the generated URL, open it in a browser, and authorize into the target server. + +## Step 5: Copy Optional Fields (If Needed) + +If something asks for Application ID or Public Key: + +1. Back in the Developer Portal, open `General Information`. +2. Copy `Application ID` and `Public Key`. + +## Wire It Up In CCR + +1. Open CCR's **Bot Management** page and click **Add Bot**. +2. Pick **Discord** as the platform. +3. Keep the default **Bot Token** auth. +4. Paste the token into **Bot Token**. +5. Add **Application ID** and **Public Key** if needed. +6. Save the bot. +7. Open **Agent Config** and edit the Agent Config you want to attach it to. +8. Turn on **Bot** and select the bot. +9. Optionally enable **Forward agent messages** or **Handoff**. +10. Reopen the agent from CCR. + +## Message Relay: Forward Or Handoff + +- **Forward agent messages**: forwards regardless of lock state. Good for debugging or full-record channels. +- **Handoff**: only forwards after the screen locks. Pair with Idle seconds and a target device. + +> For lock-screen-only alerts, use **Handoff** without **Forward agent messages**. + +## Test It + +1. Open the agent from CCR and trigger a message. +2. Check Discord to confirm the bot received it and replied. +3. For server channels, confirm the bot is in the server and can post. + +> **How to tell it worked:** Discord shows the agent's message, and replies keep the agent going. + +## Common Issues + +- **Bot doesn't respond**: confirm the Bot Token was copied correctly. +- **Bot is online but can't see your messages**: check that Message Content Intent is on. +- **No messages in a channel**: confirm the bot is in that server and channel permissions let it post. +- **No permission options in the invite URL**: make sure the OAuth2 URL Generator has `bot` scoped. +- **Handoff doesn't trigger**: confirm the screen is locked, Handoff is on, and idle time/target device are set. diff --git a/docs/src/content/docs/en/relay-agents-in-im-with-bots/feishu.md b/docs/src/content/docs/en/relay-agents-in-im-with-bots/feishu.md new file mode 100644 index 0000000..8f3b484 --- /dev/null +++ b/docs/src/content/docs/en/relay-agents-in-im-with-bots/feishu.md @@ -0,0 +1,111 @@ +--- +title: Feishu Bot Setup +pageTitle: Feishu Bot +eyebrow: Bots And IM Agent Relay +lead: Route agent messages into Feishu (Lark) groups or app chats, with relay after your screen locks. This page walks you from creating an enterprise self-built app on the Feishu Open Platform to a working setup in CCR. +--- + +## Who This Is For + +Feishu is for teams that want agent messages in a Feishu group or app chat. CCR connects to Feishu apps using App Secret auth. + +> New to bots? Start with the "Bots And IM Agent Relay" section in Detailed Configuration to understand the overall flow and the Forward agent messages and Handoff modes, then come back here. + +## The Fields You'll Use + +| Name in the Feishu dashboard | CCR field | Required | Notes | +| --- | --- | --- | --- | +| App ID | App ID | Required | App identifier, usually starts with `cli_` | +| App Secret | App Secret | Required | App secret | +| Feishu / Lark domain | Domain | Optional | Usually blank for mainland Feishu; fill for Lark or special domains | + +## Step 1: Create An Enterprise Self-Built App + +1. Open the [Feishu Open Platform](https://open.feishu.cn/). +2. Go to the developer backend. +3. Click `创建应用` (Create App). +4. Choose `企业自建应用` (Enterprise Self-Built App). +5. Name it, e.g. `CCR`. +6. Fill in the description and upload an icon. +7. Create the app. + +## Step 2: Copy The App ID And App Secret + +1. Open the app you just created. +2. Open `基础信息` (Basic Info). +3. Go to `凭证与基础信息` (Credentials & Basic Info). +4. Copy `App ID`. +5. Copy `App Secret`. + +These two are the required fields in CCR. + +## Step 3: Enable The Bot Capability + +1. In the app backend, open `应用能力` (App Capabilities). +2. Click `添加应用能力` (Add App Capability). +3. Find `机器人` (Bot) and add or enable it. +4. Set the bot name and avatar. + +> Without the bot capability, the Feishu chat may show no input box and won't receive user messages. + +## Step 4: Request Message Permissions + +1. Open `开发配置` (Development Config). +2. Go to `权限管理` (Permission Management). +3. Add application identity permissions. +4. At minimum, enable "read single-chat messages sent to the bot". +5. To support @-mentions in groups, enable "read group messages that @-mention the bot". +6. To let the agent reply, enable "send messages as the app". +7. Save. + +> Permission names vary slightly across tenants. When you see identifiers like `im:message.p2p_msg:readonly`, `im:message.group_at_msg:readonly`, `im:message:send_as_bot`, prefer those message-related ones. + +## Step 5: Configure Event Subscriptions + +1. Open `事件与回调` (Events & Callbacks). +2. Choose long-connection (or WebSocket) mode. +3. Add the event `im.message.receive_v1`. +4. Save. + +## Step 6: Publish Or Install The App + +1. Open `版本管理与发布` (Version Management & Release) and create a new version. +2. Confirm the visibility scope — for testing, choose just yourself or a small range. +3. Submit for release. +4. If the enterprise requires review, wait for approval. +5. Find the app in the Feishu client, or add the bot to the target group. + +## Wire It Up In CCR + +1. Open CCR's **Bot Management** page and click **Add Bot**. +2. Pick **Feishu** as the platform. +3. Auth is **App Secret**. +4. Fill in **App ID** and **App Secret**. +5. For Lark or a special domain, fill in **Domain**. +6. Save the bot. +7. Open **Agent Config** and edit the Agent Config you want to attach it to. +8. Turn on **Bot** and select the bot. +9. Optionally enable **Forward agent messages** or **Handoff**. +10. Reopen the agent from CCR. + +## Message Relay: Forward Or Handoff + +- **Forward agent messages**: forwards regardless of lock state. Good when you want full output in Feishu. +- **Handoff**: only forwards after the screen locks. Pair with Idle seconds and a target device. + +> For lock-screen-only alerts, use **Handoff** without **Forward agent messages**. + +## Test It + +1. Open the agent from CCR and trigger a message. +2. Check Feishu to confirm the app received it and replied. +3. For groups, add the app to the target group first and confirm members can see it. + +> **How to tell it worked:** Feishu shows the agent's message, and replies keep the agent going. + +## Common Issues + +- **Auth fails**: re-copy App ID and App Secret. +- **No input box in chat**: check the bot capability, event subscription, and that the app is published to the current member's visibility scope. +- **No response in a group**: @-mention the bot first, and confirm the event subscription includes `im.message.receive_v1`. +- **Lark / special domain**: confirm Domain is the value the platform requires. diff --git a/docs/src/content/docs/en/relay-agents-in-im-with-bots/line.md b/docs/src/content/docs/en/relay-agents-in-im-with-bots/line.md new file mode 100644 index 0000000..7a58fd0 --- /dev/null +++ b/docs/src/content/docs/en/relay-agents-in-im-with-bots/line.md @@ -0,0 +1,88 @@ +--- +title: LINE Bot Setup +pageTitle: LINE Bot +eyebrow: Bots And IM Agent Relay +lead: Route agent messages into LINE friends, groups, or an Official Account, and relay them after your screen locks. This page walks you from creating a LINE Messaging API channel to a working setup in CCR. +--- + +## Who This Is For + +LINE is for routing agent messages into an existing LINE friend list, group chat, or LINE Official Account. CCR uses a Channel Access Token as the primary auth field. + +> New to bots? Start with the "Bots And IM Agent Relay" section in Detailed Configuration to understand the overall flow and the Forward agent messages and Handoff modes, then come back here. + +## The Fields You'll Use + +In CCR, LINE's auth type is labeled **Bot Token**, but you don't paste a Telegram-style token — you fill in these two channel fields: + +| Name in the LINE dashboard | CCR field | Required | Notes | +| --- | --- | --- | --- | +| Channel access token | Channel Access Token | Required | Lets the bot call the LINE Messaging API | +| Channel secret | Channel Secret | Recommended | Used to verify requests from LINE | + +## Step 1: Create A Messaging API Channel + +1. Open the [LINE Developers Console](https://developers.line.biz/console/). +2. Log in with your LINE account. +3. Create a Provider, or pick an existing one. +4. Click `Create a new channel`. +5. Choose `Messaging API`. +6. Fill in the Channel name, description, icon, category, etc. +7. Open the channel after it's created. + +> If you already have a LINE Official Account, you can enable Messaging API in its settings, then come back to the console to copy credentials. + +## Step 2: Copy The Channel Secret + +1. Open the Messaging API channel you just created. +2. Open `Basic settings`. +3. Find `Channel secret` and copy it for CCR's Channel Secret. + +## Step 3: Issue A Channel Access Token + +1. Open the `Messaging API` tab. +2. Find `Channel access token`. +3. Click `Issue` or `Reissue`. +4. Copy the generated token for CCR's Channel Access Token. + +> Prefer a long-lived token. Reissuing invalidates the old token, so update CCR at the same time. + +## Step 4: Open The Chat Entry + +1. For groups, turn on `Allow bot to join group chats`. +2. Consider disabling the LINE Official Account auto-reply so users don't get both the default reply and the agent's. + +## Wire It Up In CCR + +1. Open CCR's **Bot Management** page and click **Add Bot**. +2. Pick **LINE** as the platform. +3. Auth is **Bot Token** (this is LINE's fixed auth type in CCR). +4. Paste the token into **Channel Access Token**. +5. Paste the secret into **Channel Secret**. +6. Save the bot. +7. Open **Agent Config** and edit the Agent Config you want to attach it to. +8. Turn on **Bot** and select the bot. +9. Optionally enable **Forward agent messages** or **Handoff**. +10. Reopen the agent from CCR. + +## Message Relay: Forward Or Handoff + +- **Forward agent messages**: forwards regardless of lock state. Good when you want full output in LINE. +- **Handoff**: only forwards after the screen locks. Pair with Idle seconds and a target device. + +> For lock-screen-only alerts, use **Handoff** without **Forward agent messages**. + +## Test It + +1. Open the agent from CCR and trigger a message. +2. Check LINE to confirm the bot received it and replied. +3. For groups, confirm the bot has joined and can post. + +> **How to tell it worked:** LINE shows the agent's message, and replies keep the agent going. + +## Common Issues + +- **Auth fails**: re-copy the Channel Access Token. +- **Can send but can't receive**: confirm the Channel Access Token is valid and CCR is running and connected to LINE. +- **Groups don't work**: confirm `Allow bot to join group chats` is on, then re-add the bot to the group. +- **Lock-screen-only alerts**: use Handoff without Forward agent messages. diff --git a/docs/src/content/docs/en/relay-agents-in-im-with-bots/slack.md b/docs/src/content/docs/en/relay-agents-in-im-with-bots/slack.md new file mode 100644 index 0000000..bdeee0a --- /dev/null +++ b/docs/src/content/docs/en/relay-agents-in-im-with-bots/slack.md @@ -0,0 +1,92 @@ +--- +title: Slack Bot Setup +pageTitle: Slack Bot +eyebrow: Bots And IM Agent Relay +lead: Route agent messages into Slack channels or DMs, and relay them to Slack after your screen locks. This page walks you from creating the Slack app all the way to a working setup in CCR. +--- + +## Who This Is For + +Slack is for teams that want agent messages in an existing channel, DM, or workspace app. You need a Bot Token and an App Token. + +> New to bots? Start with the "Bots And IM Agent Relay" section in Detailed Configuration to understand the overall flow and the Forward agent messages and Handoff modes, then come back here for a single platform. + +## The Fields You'll Use + +| Name in the Slack dashboard | CCR field | Looks like | When you need it | +| --- | --- | --- | --- | +| Bot User OAuth Token | Bot Token | `xoxb-...` | Required — lets the bot send and receive | +| App-Level Token | App Token | `xapp-...` | Lets Socket Mode establish the connection | + +## Step 1: Create The Slack App + +1. Open [Slack API Apps](https://api.slack.com/apps). +2. Click `Create New App`. +3. Choose `From scratch`. +4. Name it, e.g. `CCR`. +5. Pick the Slack workspace to connect. +6. Click `Create App`. + +## Step 2: Turn On Socket Mode + +1. Open `Socket Mode` on the left. +2. Enable `Socket Mode`. +3. When prompted for an App-Level Token, create one. +4. Name it anything, e.g. `ccr-socket`. +5. Choose the `connections:write` scope. +6. Copy the `xapp-...` App-Level Token for CCR's App Token. + +## Step 3: Add Bot Scopes And Install + +1. Open `OAuth & Permissions`. +2. Find `Bot Token Scopes` under `Scopes`. +3. Add at least: `app_mentions:read`, `channels:history`, `channels:read`, `chat:write`, `im:history`, `im:read`, `im:write`. +4. Add `files:read` and `files:write` to send/receive files. +5. Add `groups:history` and `groups:read` for private channels. +6. Click `Install to Workspace` at the top and authorize. +7. Copy the `Bot User OAuth Token` (starts with `xoxb-`) for CCR's Bot Token. + +## Step 4: Invite The Bot Into A Channel + +Skip this if you only use DMs. + +1. Open the target Slack channel. +2. Type `/invite @YourBotName` in the message box. +3. Send it and confirm the bot appears in the member list. + +> Without an invite, the bot usually only gets DMs — not channel messages. + +## Wire It Up In CCR + +1. Open CCR's **Bot Management** page and click **Add Bot**. +2. Pick **Slack** as the platform. +3. Keep the default **Bot Token** auth (unless you specifically need OAuth). +4. Paste `xoxb-...` into **Bot Token**. +5. Paste `xapp-...` into **App Token**. +6. Save the bot. +7. Open **Agent Config** and edit the Agent Config you want to attach it to. +8. Turn on **Bot** and select the bot you just saved. +9. Optionally enable **Forward agent messages** or **Handoff** (next section). +10. Reopen the agent from CCR. + +## Message Relay: Forward Or Handoff + +- **Forward agent messages**: forwards every new agent message to Slack regardless of screen lock. Good for full logs or debugging. +- **Handoff**: only forwards after the screen locks. Pair it with **Idle seconds** and a Wi-Fi/Bluetooth target device. + +> For lock-screen-only alerts, use **Handoff** without **Forward agent messages**. + +## Test It + +1. Open the agent from CCR and trigger a message. +2. Check Slack to confirm the bot received it and replied. +3. If you use a channel, make sure the bot is in it. + +> **How to tell it worked:** Slack shows the agent's message, and when you reply, the agent continues. + +## Common Issues + +- **No messages reach Slack**: confirm the Bot Token is still valid and the app is in the target channel. +- **Socket Mode won't connect**: check that the App Token starts with `xapp-` and has `connections:write`. +- **Channel silent but DMs work**: the bot isn't in the channel, or it lacks `channels:*` / `groups:*` scopes. Reinstall to the workspace after adding scopes. +- **Too many messages**: use Handoff without Forward agent messages. diff --git a/docs/src/content/docs/en/relay-agents-in-im-with-bots/telegram.md b/docs/src/content/docs/en/relay-agents-in-im-with-bots/telegram.md new file mode 100644 index 0000000..f20f38c --- /dev/null +++ b/docs/src/content/docs/en/relay-agents-in-im-with-bots/telegram.md @@ -0,0 +1,81 @@ +--- +title: Telegram Bot Setup +pageTitle: Telegram Bot +eyebrow: Bots And IM Agent Relay +lead: Route agent messages into Telegram and relay them after your screen locks. Telegram is the simplest platform of all — you only need a Bot Token, and you can be live in minutes. +--- + +## Who This Is For + +Telegram is for individuals or small teams who want agent messages fast. It has the fewest fields — just a `Bot Token`. If you want the quickest possible bot, start here. + +> New to bots? Start with the "Bots And IM Agent Relay" section in Detailed Configuration to understand the overall flow and the Forward agent messages and Handoff modes, then come back here. + +## The Fields You'll Use + +| Name in Telegram | CCR field | Required | Notes | +| --- | --- | --- | --- | +| HTTP API token | Bot Token | Required | The token `@BotFather` returns after creating the bot | + +## Step 1: Create The Bot With BotFather + +1. Open Telegram. +2. Search `@BotFather` and confirm the username matches exactly (the official bot). +3. In the chat, send `/newbot`. +4. Enter a display name when prompted, e.g. `CCR Assistant`. +5. Enter a username — it must end in `bot`, e.g. `ccr_demo_bot`. +6. On success, `@BotFather` returns an HTTP API token. +7. Copy it for CCR's Bot Token. + +> **Never share this token.** Anyone who has it has full control of your Telegram bot. + +## Step 2: Set Up Group Support (Optional) + +Skip this if you only use DMs. + +To use it in groups: + +1. Send `/setjoingroups` to `@BotFather`. +2. Pick your bot. +3. Choose to allow joining groups. +4. To let the bot see all group messages, send `/setprivacy`. +5. Pick the bot again. +6. Choose `Disable` to turn off privacy mode. +7. Add the bot to the target group. + +> With privacy mode on, the bot usually only sees commands, @-mentions, and some service messages. After disabling it, kick and re-add the bot so the change takes effect immediately. + +## Wire It Up In CCR + +1. Open CCR's **Bot Management** page and click **Add Bot**. +2. Pick **Telegram** as the platform. +3. Auth is **Bot Token**. +4. Paste the token into **Bot Token**. +5. Save the bot. +6. Open **Agent Config** and edit the Agent Config you want to attach it to. +7. Turn on **Bot** and select the bot. +8. Optionally enable **Forward agent messages** or **Handoff**. +9. Reopen the agent from CCR. + +## Message Relay: Forward Or Handoff + +- **Forward agent messages**: forwards regardless of lock state. Good when you want full output in Telegram. +- **Handoff**: only forwards after the screen locks. Pair with Idle seconds and a target device. + +> For lock-screen-only alerts, use **Handoff** without **Forward agent messages**. + +## Test It + +1. Open the agent from CCR and trigger a message. +2. Check Telegram to confirm the bot received it and replied. +3. For groups, confirm the bot is in the group and can read/write. + +> **How to tell it worked:** Telegram shows the agent's message, and replies keep the agent going. + +## Common Issues + +- **Auth fails**: re-copy the Bot Token. +- **DMs work but groups don't**: check that the bot is in the group and group permissions let it read. +- **Only `/command` triggers the bot in a group**: check `/setprivacy` in `@BotFather`, or promote the bot to group admin. +- **You reset the token**: the old token dies instantly — update CCR and restart. +- **Too many messages**: use Handoff without Forward agent messages. diff --git a/docs/src/content/docs/en/relay-agents-in-im-with-bots/wecom.md b/docs/src/content/docs/en/relay-agents-in-im-with-bots/wecom.md new file mode 100644 index 0000000..86ff50a --- /dev/null +++ b/docs/src/content/docs/en/relay-agents-in-im-with-bots/wecom.md @@ -0,0 +1,85 @@ +--- +title: WeCom Bot Setup +pageTitle: WeCom Bot +eyebrow: Bots And IM Agent Relay +lead: Route agent messages into WeCom (Enterprise WeChat) so your team can receive and reply in WeCom, with relay after your screen locks. This page walks you from creating a self-built app in the WeCom admin console to a working setup in CCR. +--- + +## Who This Is For + +WeCom is for bringing the agent into an enterprise messaging environment, so team members can receive and reply to agent messages inside WeCom. + +> New to bots? Start with the "Bots And IM Agent Relay" section in Detailed Configuration to understand the overall flow and the Forward agent messages and Handoff modes, then come back here. + +## The Fields You'll Use + +| Name in the WeCom dashboard | CCR field | Required | Notes | +| --- | --- | --- | --- | +| CorpID / 企业ID | Corp ID | Required | Enterprise-level ID, under "My Enterprise" | +| AgentId | Agent ID | Required | The self-built app's ID | +| Secret | Secret | Required | App secret — admins usually confirm on their phone to view it | + +> CCR exchanges Corp ID and the app Secret for a WeCom access_token for you — you don't fetch it manually. + +## Step 1: Get The Corp ID + +1. Open the [WeCom admin console](https://work.weixin.qq.com/wework_admin/frame). +2. Log in as an admin. +3. Open `我的企业` (My Enterprise) at the top. +4. Go to `企业信息` (Enterprise Info). +5. Find `企业ID` (CorpID) and copy it for CCR's Corp ID. + +## Step 2: Create A Self-Built App + +1. In the admin console, open `应用管理` (App Management). +2. Find the `自建` (Self-built) section. +3. Click `创建应用` (Create App). +4. Name it, e.g. `CCR`. +5. Upload a logo. +6. Pick a visibility scope — for testing, choose just yourself or a small test department. +7. Click create. + +## Step 3: Copy The Agent ID And Secret + +1. Open the self-built app you just created. +2. Copy `AgentId` for CCR's Agent ID. +3. Find `Secret` and click to view it. +4. Confirm on your phone's WeCom as prompted. +5. Copy the displayed `Secret`. + +> If WeCom asks for `企业可信IP` (Trusted Enterprise IPs), add the outbound public IP of the machine running the CCR Bot Gateway (or your relay service's outbound IP). + +## Wire It Up In CCR + +1. Open CCR's **Bot Management** page and click **Add Bot**. +2. Pick **WeCom** as the platform. +3. Auth is **App Secret**. +4. Fill in **Corp ID**, **Agent ID**, and **Secret**. +5. Save the bot. +6. Open **Agent Config** and edit the Agent Config you want to attach it to. +7. Turn on **Bot** and select the bot. +8. Optionally enable **Forward agent messages** or **Handoff**. +9. Reopen the agent from CCR. + +## Message Relay: Forward Or Handoff + +- **Forward agent messages**: forwards regardless of lock state. Increases message volume — use only for full logs or troubleshooting. +- **Handoff**: only forwards after the screen locks. Pair with Idle seconds and a target device. + +> For lock-screen-only alerts, use **Handoff** without **Forward agent messages**. + +## Test It + +1. Open the agent from CCR and trigger a message. +2. Check WeCom to confirm the app received it and replied. +3. Lock the screen, wait past your idle threshold, and confirm new agent messages arrive via handoff. + +> **How to tell it worked:** WeCom shows the agent's message, and replies keep the agent going. + +## Common Issues + +- **Auth fails**: re-copy Corp ID, Agent ID, and Secret. +- **Starts but receives nothing**: check that the WeCom app is allowed to receive messages and that the current member has access. +- **Send fails with an untrusted IP**: configure `企业可信IP` in the WeCom dashboard. +- **Some members can't see the app**: check the self-built app's visibility scope. +- **Handoff doesn't trigger**: confirm the screen is locked, and check the Handoff toggle, idle time, and target device. diff --git a/docs/src/content/docs/en/relay-agents-in-im-with-bots/weixin-ilink.md b/docs/src/content/docs/en/relay-agents-in-im-with-bots/weixin-ilink.md new file mode 100644 index 0000000..e2d6bdb --- /dev/null +++ b/docs/src/content/docs/en/relay-agents-in-im-with-bots/weixin-ilink.md @@ -0,0 +1,78 @@ +--- +title: Weixin Bot Setup +pageTitle: Weixin Bot +eyebrow: Bots And IM Agent Relay +lead: Route agent messages into WeChat (Weixin) and relay them after your screen locks. The easiest path is QR Login — you scan a code and you're in, no token copying required. +--- + +## Who This Is For + +Weixin is for individuals who want agent messages in their everyday chat window. The simplest method is QR Login, which needs no manual token. + +> New to bots? Start with the "Bots And IM Agent Relay" section in Detailed Configuration to understand the overall flow and the Forward agent messages and Handoff modes, then come back here. + +## Two Login Methods + +| Method | What you need | Who it's for | +| --- | --- | --- | +| QR Login | A WeChat account that can scan and confirm | Most individuals | +| Bot Token | A token from an external WeChat bot service or iLink plugin | Users who already run a third-party WeChat bot service | + +> **Prefer QR Login.** A WeChat session is tightly bound to account safety — use a dedicated bot account, not your main account that handles payments, customer service, or important contacts. + +## Method 1: QR Login (Recommended) + +1. Open CCR's **Bot Management** page and click **Add Bot**. +2. Pick **Weixin iLink** as the platform. +3. Choose **QR Login** (the default). +4. CCR opens a QR code window. +5. Scan the code with your phone's WeChat. +6. Confirm the login on your phone. +7. Wait for CCR to show login success. +8. Save the bot. + +> QR codes expire. If the scan page says it's expired, close the login window and start over. + +## Method 2: Bot Token + +Use this only if you already have a token from an external WeChat bot service, an iLink service, or a plugin. + +1. Copy the `Bot Token` from the provider's dashboard or local plugin output. +2. If the provider also gave an `Account ID`, copy it. +3. If it gave a `User ID`, copy that too. +4. Open CCR's **Bot Management** page and click **Add Bot**. +5. Pick **Weixin iLink** and choose **Bot Token** auth. +6. Fill in **Bot Token**, and **Account ID** / **User ID** if you have them. +7. Save the bot. + +## Bind It To An Agent In CCR + +Whichever login you used, bind the bot to Agent Config: + +1. Open **Agent Config** and edit the Agent Config you want to attach it to. +2. Turn on **Bot** and select the bot you just saved. +3. Optionally enable **Forward agent messages** or **Handoff** (next section). +4. Reopen the agent from CCR. + +## Message Relay: Forward Or Handoff + +- **Forward agent messages**: forwards every new agent message to WeChat regardless of lock state. Good when you want every line of output in WeChat. +- **Handoff**: only forwards after the screen locks. Pair with **Idle seconds** and a Wi-Fi/Bluetooth target device. + +> For lock-screen-only alerts, use **Handoff** without **Forward agent messages**. + +## Test It + +1. Open the agent from CCR and trigger a message. +2. Check WeChat to confirm the bot received it and replied. +3. Lock the screen, wait past your idle threshold, and confirm new agent messages arrive in WeChat. + +> **How to tell it worked:** WeChat shows the agent's message, and replies keep the agent going. + +## Common Issues + +- **QR code expired**: close the login window and scan again. +- **Scan succeeded but nothing forwards**: confirm the agent was reopened from CCR after Agent Config changes and the Bot toggle is still on. +- **Drops shortly after scanning**: check that phone and computer networks are stable; verify WeChat didn't log in elsewhere and invalidate the session. +- **Token mode won't connect**: re-copy the Bot Token — avoid expired values or stray spaces. +- **Third-party service needs Account ID / User ID**: make sure these come from the same account — don't mix a token and IDs from different accounts. diff --git a/docs/src/content/docs/en/troubleshooting.md b/docs/src/content/docs/en/troubleshooting.md new file mode 100644 index 0000000..8a8cae5 --- /dev/null +++ b/docs/src/content/docs/en/troubleshooting.md @@ -0,0 +1,48 @@ +--- +title: Claude Code Router Q&A +pageTitle: Q&A +eyebrow: Q&A +lead: Start here when an agent does not go through CCR, a provider fails, routing picks the wrong model, Fusion fails, or Bot messages do not arrive. +--- + +## Q&A + +### Q: The agent does not go through CCR. Where is the relevant information? + +A: Service status, agent launch method, Agent Config application status, and effect scope all affect whether the agent goes through CCR. + +### Q: What if a request hits the wrong model? + +A: Request logs show `request model`, `resolved provider`, and `resolved model`. The Routing Config page contains default routing, rule order, match conditions, and fallback. + +### Q: Why does a provider return 401 or 403? + +A: Related fields include API Key, credential enabled state, Base URL, protocol, and extra request headers. The provider page provides model connectivity checks. + +### Q: How do I diagnose `model not found`? + +A: The provider model list, the model selected by routing, and the model in Agent Config can all affect `model not found`. + +### Q: What if Fusion does not call a tool? + +A: Related information includes Fusion tool enabled state, Vision model or search-service key, MCP Discover tools, and timeout settings. + +### Q: What information is related to request timeout? + +A: Request logs record duration and error information. Upstream latency, Fusion tool duration, and timeout settings can also affect timeout behavior. + +### Q: How do I locate a sudden cost increase? + +A: Request logs support filtering by model, provider, or credential, and show token composition, request-body size, and the final model used. + +### Q: What if a specific key keeps failing? + +A: Request logs support filtering by credential. A credential's quota, permission, and provider-side account state can all affect whether a single key is usable. + +### Q: How do I diagnose a Bot not receiving messages? + +A: Related information includes the Bot switch, message-forwarding settings, platform token, callback configuration, and whether the agent was opened from CCR. + +### Q: What if the observability panel has no agent execution trace? + +A: Open **Settings → Logs & Observability** and confirm **Request logs** and **Agent observability** are enabled, then start a new agent task. The observability panel records steps, tool calls, tool results, and duration during new agent execution. diff --git a/docs/src/content/docs/zh/bot-与-im-接力-agent/dingtalk.md b/docs/src/content/docs/zh/bot-与-im-接力-agent/dingtalk.md new file mode 100644 index 0000000..744e114 --- /dev/null +++ b/docs/src/content/docs/zh/bot-与-im-接力-agent/dingtalk.md @@ -0,0 +1,96 @@ +--- +title: 钉钉 Bot 配置 +pageTitle: 钉钉 Bot +eyebrow: Bot 与 IM 接力 Agent +lead: 把 Agent 的消息接入钉钉的企业协作环境,并在电脑锁屏后接力。这一页从钉钉开发者后台创建应用开始,带你走到在 CCR 里跑通。 +--- + +## 这个方式适合谁 + +钉钉适合把 Agent 消息接入企业协作环境。CCR 用 App Secret 方式连接钉钉应用。 + +> 还没看过 Bot 总览?先回到主文档的「把 Agent 消息转发到 IM(Bot)」那一节,了解整体流程和转发 Agent 消息、接力的区别,再回来配单个平台。 + +## 你会用到哪些字段 + +| 钉钉后台里的名字 | CCR 字段 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| Client ID / AppKey | App Key | 必填 | 应用标识 | +| Client Secret / AppSecret | App Secret | 必填 | 应用密钥 | +| RobotCode | Robot Code | 可选 | 多机器人或媒体能力场景可能需要 | + +> 新版钉钉把机器人作为「应用能力」来配,别从旧的独立「机器人」入口开始。 + +## 第一步:创建钉钉应用 + +1. 打开 [钉钉开发者后台](https://open-dev.dingtalk.com/)。 +2. 登录钉钉账号。 +3. 选要接入的开发组织。 +4. 顶部打开 `应用开发`。 +5. 点 `创建应用`。 +6. 填应用名,比如 `CCR`。 +7. 填应用描述,其他先默认。 +8. 点创建。 + +## 第二步:复制 App Key 和 App Secret + +1. 进入刚创建的应用详情。 +2. 左侧打开 `应用信息` 或 `凭证与基础信息`。 +3. 复制 `Client ID`,对应 CCR 的 App Key。 +4. 复制 `Client Secret`,对应 CCR 的 App Secret。 + +> 钉钉后台可能还显示旧名 `AppKey` / `AppSecret`,按字段名对应复制即可。 + +## 第三步:开启机器人能力 + +1. 在应用详情打开 `机器人与消息推送`,或打开 `应用能力` 后选 `机器人`。 +2. 开启 `机器人配置`。 +3. 填机器人名称、头像、简介。 +4. 消息接收模式选 **Stream 模式**。 +5. 保存。 +6. 页面显示 `RobotCode` 的话,复制下来,待会儿填 Robot Code。 + +## 第四步:发布应用并加入会话 + +1. 打开 `版本管理与发布`,创建新版本。 +2. 设可见范围,测试时先选你自己或一个测试群。 +3. 提交发布。 +4. 发布后,在钉钉客户端搜机器人名称。 +5. 进机器人会话,或在目标群的群设置里加这个机器人。 + +## 在 CCR 中接入 + +1. 打开 CCR 的 **Bot 管理** 页面,点 **添加 Bot**。 +2. 平台选 **钉钉(DingTalk)**。 +3. 认证方式是 **App Secret**。 +4. 把 Client ID 填进 **App Key**。 +5. 把 Client Secret 填进 **App Secret**。 +6. 复制到了 RobotCode 就填 **Robot Code**。 +7. 保存这个 Bot。 +8. 打开 **Agent配置**,编辑你要接 Bot 的 Agent配置。 +9. 打开 **Bot** 开关,选刚保存的 Bot。 +10. 按需打开 **转发 Agent 消息** 或 **接力**(见下一节)。 +11. 从 CCR 重新打开 Agent。 + +## 消息接力:转发还是接力 + +- **转发 Agent 消息**:不管锁不锁屏都转发,适合要在钉钉里保留完整输出。 +- **接力**:只在电脑锁屏后转发,配合 **空闲秒数** 和目标设备。 + +> 只想锁屏后提醒,别开 **转发 Agent 消息**。 + +## 测试 + +1. 从 CCR 打开 Agent,触发一条消息。 +2. 到钉钉确认应用能收到并回复。 +3. 群聊用的话,确认应用或机器人已加进目标群、有发言权限。 + +> **怎么算成功:** 钉钉里能看到 Agent 消息,你回复后 Agent 也能继续。 + +## 常见问题 + +- **认证失败**:重新复制 App Key 和 App Secret。 +- **机器人标识相关错误**:检查 Robot Code 和平台后台一致。 +- **机器人收不到消息**:确认应用内开了机器人能力、消息接收模式和 CCR 配置一致。 +- **用户找不到机器人**:检查应用已发布、可见范围包含当前用户或群成员。 +- **接力不触发**:确认电脑已锁屏,检查 **接力** 开关、空闲时间和目标设备。 diff --git a/docs/src/content/docs/zh/bot-与-im-接力-agent/discord.md b/docs/src/content/docs/zh/bot-与-im-接力-agent/discord.md new file mode 100644 index 0000000..30943aa --- /dev/null +++ b/docs/src/content/docs/zh/bot-与-im-接力-agent/discord.md @@ -0,0 +1,101 @@ +--- +title: Discord Bot 配置 +pageTitle: Discord Bot +eyebrow: Bot 与 IM 接力 Agent +lead: 把 Agent 的消息接入 Discord 的服务器频道或私聊,并在电脑锁屏后把新消息接力到 Discord。这一页从创建 Discord 应用开始,带你一直走到在 CCR 里跑通。 +--- + +## 这个方式适合谁 + +Discord 适合把 Agent 消息接入服务器频道、私有协作服务器或个人 DM。最常用的是 Bot Token,配置直接。 + +> 还没看过 Bot 总览?先回到主文档的「把 Agent 消息转发到 IM(Bot)」那一节,了解整体流程和转发 Agent 消息、接力的区别,再回来配单个平台。 + +## 你会用到哪些字段 + +| Discord 后台里的名字 | CCR 字段 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| Token | Bot Token | 必填 | Bot 页里的机器人 token | +| Application ID | Application ID | 可选 | General Information 页里的应用 ID | +| Public Key | Public Key | 可选 | 交互回调场景可能会用到 | + +通常用 Bot Token 就够了。只有接入流程明确要求 OAuth 时,才选 OAuth 2.0。 + +## 第一步:创建 Discord 应用和 Bot + +1. 打开 [Discord Developer Portal](https://discord.com/developers/applications)。 +2. 点 `New Application`。 +3. 填名字,比如 `CCR`。 +4. 创建后进入应用详情。 +5. 左侧打开 `Bot`。 +6. 页面还没有 Bot 的话,点 `Add Bot`。 +7. 给机器人设头像和用户名。 + +## 第二步:打开必要权限 + +1. 仍在 `Bot` 页,找到 `Privileged Gateway Intents`。 +2. 打开 **Message Content Intent**。没有它,Bot 很可能看不到用户发的消息正文。 +3. 要按成员、角色或用户名做判断,再打开 **Server Members Intent**。 +4. **Presence Intent** 一般不用开,除非你要读在线状态。 + +## 第三步:复制 Bot Token + +1. 在 `Bot` 页找到 `Token`。 +2. 点 `Reset Token` 或 `Copy`。 +3. 第一次创建时 `Reset Token` 会生成第一个 token,不代表你弄坏了什么。 +4. 复制生成的 token,待会儿填进 CCR 的 Bot Token。 + +> 这个 token 等同于机器人密码。不要发进 Discord,也不要贴进 Agent 的 prompt。 + +## 第四步:邀请 Bot 进服务器 + +1. 左侧打开 `OAuth2`。 +2. 打开 `URL Generator`。 +3. `Scopes` 勾选 `bot` 和 `applications.commands`。 +4. `Bot Permissions` 至少勾选 `View Channels`、`Send Messages`、`Read Message History`、`Embed Links`、`Attach Files`。 +5. 想给审批消息加反应,再勾 `Add Reactions`。 +6. 复制底部生成的 URL,在浏览器打开,选目标服务器并授权。 + +## 第五步:复制可选字段(如需要) + +如果某处要求填 Application ID 或 Public Key: + +1. 回到 Discord Developer Portal。 +2. 打开应用的 `General Information`。 +3. 复制 `Application ID` 和 `Public Key`。 + +## 在 CCR 中接入 + +1. 打开 CCR 的 **Bot 管理** 页面,点 **添加 Bot**。 +2. 平台选 **Discord**。 +3. 认证方式默认是 **Bot Token**,保持即可。 +4. 把 Token 填进 **Bot Token**。 +5. 需要的话补上 **Application ID** 和 **Public Key**。 +6. 保存这个 Bot。 +7. 打开 **Agent配置**,编辑你要接 Bot 的 Agent配置。 +8. 打开 **Bot** 开关,选刚保存的 Bot。 +9. 按需打开 **转发 Agent 消息** 或 **接力**(见下一节)。 +10. 从 CCR 重新打开 Agent。 + +## 消息接力:转发还是接力 + +- **转发 Agent 消息**:不管锁不锁屏都转发,适合调试或要完整记录的频道。 +- **接力**:只在电脑锁屏后转发,配合 **空闲秒数** 和目标设备。 + +> 只想锁屏后提醒,别开 **转发 Agent 消息**。 + +## 测试 + +1. 从 CCR 打开 Agent,触发一条消息。 +2. 到 Discord 确认 Bot 能收到并回复。 +3. 用服务器频道的话,确认 Bot 在该服务器里、有发言权限。 + +> **怎么算成功:** Discord 里能看到 Agent 消息,回复后 Agent 也能继续。 + +## 常见问题 + +- **Bot 没响应**:先确认 Bot Token 复制对了。 +- **Bot 在线但看不到你发的内容**:检查 Message Content Intent 打开了没。 +- **频道里没消息**:确认 Bot 在该服务器里、频道权限允许它发言。 +- **邀请链接里看不到权限选项**:确认 OAuth2 URL Generator 勾了 `bot` scope。 +- **接力不触发**:确认电脑已锁屏、接力已开,检查空闲时间和目标设备。 diff --git a/docs/src/content/docs/zh/bot-与-im-接力-agent/feishu.md b/docs/src/content/docs/zh/bot-与-im-接力-agent/feishu.md new file mode 100644 index 0000000..7b1d3f1 --- /dev/null +++ b/docs/src/content/docs/zh/bot-与-im-接力-agent/feishu.md @@ -0,0 +1,111 @@ +--- +title: 飞书 Bot 配置 +pageTitle: 飞书 Bot +eyebrow: Bot 与 IM 接力 Agent +lead: 把 Agent 的消息接入飞书的群或应用会话,并在电脑锁屏后接力。这一页从飞书开放平台创建企业自建应用开始,带你走到在 CCR 里跑通。 +--- + +## 这个方式适合谁 + +飞书适合团队把 Agent 消息接入飞书群或应用会话。CCR 用 App Secret 方式连接飞书应用。 + +> 还没看过 Bot 总览?先回到主文档的「把 Agent 消息转发到 IM(Bot)」那一节,了解整体流程和转发 Agent 消息、接力的区别,再回来配单个平台。 + +## 你会用到哪些字段 + +| 飞书后台里的名字 | CCR 字段 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| App ID | App ID | 必填 | 应用标识,通常以 `cli_` 开头 | +| App Secret | App Secret | 必填 | 应用密钥 | +| 飞书 / Lark 域 | Domain | 可选 | 国内飞书一般不填;Lark 或特殊域环境再填 | + +## 第一步:创建企业自建应用 + +1. 打开 [飞书开放平台](https://open.feishu.cn/)。 +2. 进入 `开发者后台`。 +3. 点 `创建应用`。 +4. 选 `企业自建应用`。 +5. 填应用名,比如 `CCR`。 +6. 填应用描述并上传图标。 +7. 创建应用。 + +## 第二步:复制 App ID 和 App Secret + +1. 进入刚创建的应用。 +2. 打开 `基础信息`。 +3. 进入 `凭证与基础信息`。 +4. 复制 `App ID`。 +5. 复制 `App Secret`。 + +这两个就是 CCR 里的必填字段。 + +## 第三步:开启机器人能力 + +1. 在应用后台打开 `应用能力`。 +2. 点 `添加应用能力`。 +3. 找到 `机器人`,添加或启用。 +4. 设机器人名称和头像。 + +> 没开机器人能力,飞书聊天窗口可能看不到输入框,也收不到用户消息。 + +## 第四步:申请消息权限 + +1. 打开 `开发配置`。 +2. 进入 `权限管理`。 +3. 添加应用身份权限。 +4. 至少开通「读取用户发给机器人的单聊消息」权限。 +5. 要在群里 @ 机器人,开通「读取群聊中 @ 机器人消息」权限。 +6. 要让 Agent 回复,开通「以应用身份发送消息」权限。 +7. 保存。 + +> 不同租户后台权限名可能略有不同。看到 `im:message.p2p_msg:readonly`、`im:message.group_at_msg:readonly`、`im:message:send_as_bot` 这类标识时,优先选这些。 + +## 第五步:配置事件订阅 + +1. 打开 `事件与回调`。 +2. 选择长连接(或 WebSocket)模式。 +3. 添加事件 `im.message.receive_v1`。 +4. 保存。 + +## 第六步:发布或安装应用 + +1. 打开 `版本管理与发布`,创建新版本。 +2. 确认可见范围,测试时先选你自己或小范围。 +3. 提交发布。 +4. 企业要审核的话,等审核通过。 +5. 在飞书客户端找到这个应用,或把机器人加进目标群。 + +## 在 CCR 中接入 + +1. 打开 CCR 的 **Bot 管理** 页面,点 **添加 Bot**。 +2. 平台选 **飞书(Feishu)**。 +3. 认证方式是 **App Secret**。 +4. 填 **App ID** 和 **App Secret**。 +5. 用 Lark 或特殊域环境,再填 **Domain**。 +6. 保存这个 Bot。 +7. 打开 **Agent配置**,编辑你要接 Bot 的 Agent配置。 +8. 打开 **Bot** 开关,选刚保存的 Bot。 +9. 按需打开 **转发 Agent 消息** 或 **接力**(见下一节)。 +10. 从 CCR 重新打开 Agent。 + +## 消息接力:转发还是接力 + +- **转发 Agent 消息**:不管锁不锁屏都转发,适合要在飞书里保留完整输出。 +- **接力**:只在电脑锁屏后转发,配合 **空闲秒数** 和目标设备。 + +> 只想锁屏后提醒,别开 **转发 Agent 消息**。 + +## 测试 + +1. 从 CCR 打开 Agent,触发一条消息。 +2. 到飞书确认应用能收到并回复。 +3. 群里用的话,先把应用加进目标群、确认成员可见。 + +> **怎么算成功:** 飞书里能看到 Agent 消息,你回复后 Agent 也能继续。 + +## 常见问题 + +- **认证失败**:重新复制 App ID 和 App Secret。 +- **聊天窗口没输入框**:检查机器人能力开了没、事件订阅了没、应用发布到当前成员可见范围了没。 +- **群里没响应**:先 @ 机器人测,确认事件订阅含 `im.message.receive_v1`。 +- **Lark / 特殊域**:确认 Domain 填的是平台要求的值。 diff --git a/docs/src/content/docs/zh/bot-与-im-接力-agent/line.md b/docs/src/content/docs/zh/bot-与-im-接力-agent/line.md new file mode 100644 index 0000000..75040f8 --- /dev/null +++ b/docs/src/content/docs/zh/bot-与-im-接力-agent/line.md @@ -0,0 +1,88 @@ +--- +title: LINE Bot 配置 +pageTitle: LINE Bot +eyebrow: Bot 与 IM 接力 Agent +lead: 把 Agent 的消息接入 LINE 的好友、群聊或 Official Account,并在电脑锁屏后把新消息接力过去。这一页从创建 LINE Messaging API channel 开始,带你走到在 CCR 里跑通。 +--- + +## 这个方式适合谁 + +LINE 适合把 Agent 消息接入已有的 LINE 好友、群聊或 LINE Official Account。CCR 用 Channel Access Token 作为主要认证字段。 + +> 还没看过 Bot 总览?先回到主文档的「把 Agent 消息转发到 IM(Bot)」那一节,了解整体流程和转发 Agent 消息、接力的区别,再回来配单个平台。 + +## 你会用到哪些字段 + +CCR 里 LINE 的认证方式叫 **Bot Token**,这里需要填写下面这两个 channel 字段: + +| LINE 后台里的名字 | CCR 字段 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| Channel access token | Channel Access Token | 必填 | 让 Bot 调用 LINE Messaging API | +| Channel secret | Channel Secret | 建议填 | 用来校验 LINE 发来的请求 | + +## 第一步:创建 Messaging API channel + +1. 打开 [LINE Developers Console](https://developers.line.biz/console/)。 +2. 登录 LINE 账号。 +3. 创建一个供应商,或选已有的。 +4. 点 `Create a new channel`。 +5. 选 `Messaging API`。 +6. 按页面要求填 Channel 名称、描述、图标、分类等。 +7. 创建后进入这个 Messaging API channel。 + +> 已有 LINE Official Account 的话,也可以在该账号设置里启用 Messaging API,再回控制台复制凭证。 + +## 第二步:复制 Channel Secret + +1. 进入刚创建的 Messaging API channel。 +2. 打开 `Basic settings`。 +3. 找到 `Channel secret`,复制,待会儿填到 CCR 的 Channel Secret。 + +## 第三步:签发 Channel Access Token + +1. 打开 `Messaging API` 标签页。 +2. 找到 `Channel access token`。 +3. 点 `Issue` 或 `Reissue`。 +4. 复制生成的 token,待会儿填到 CCR 的 Channel Access Token。 + +> 优先用长效 token。重新签发会让旧 token 失效,要同步更新 CCR。 + +## 第四步:打开聊天入口 + +1. 要群聊就把 `Allow bot to join group chats` 打开。 +2. 建议关掉 LINE 官方账号的自动回复,免得用户同时收到默认回复和 Agent 回复。 + +## 在 CCR 中接入 + +1. 打开 CCR 的 **Bot 管理** 页面,点 **添加 Bot**。 +2. 平台选 **LINE**。 +3. 认证方式是 **Bot Token**(这就是 LINE 在 CCR 里的固定认证方式)。 +4. 把 token 填进 **Channel Access Token**。 +5. 把 secret 填进 **Channel Secret**。 +6. 保存这个 Bot。 +7. 打开 **Agent配置**,编辑你要接 Bot 的 Agent配置。 +8. 打开 **Bot** 开关,选刚保存的 Bot。 +9. 按需打开 **转发 Agent 消息** 或 **接力**(见下一节)。 +10. 从 CCR 重新打开 Agent。 + +## 消息接力:转发还是接力 + +- **转发 Agent 消息**:不管锁不锁屏都转发,适合要在 LINE 里看完整输出时。 +- **接力**:只在电脑锁屏后转发,配合 **空闲秒数** 和目标设备。 + +> 只想锁屏后提醒,别开 **转发 Agent 消息**。 + +## 测试 + +1. 从 CCR 打开 Agent,触发一条消息。 +2. 到 LINE 确认机器人能收到并回复。 +3. 群聊用的话,确认机器人已经进群、有发言权限。 + +> **怎么算成功:** LINE 里能看到 Agent 消息,你回复后 Agent 也能继续。 + +## 常见问题 + +- **认证失败**:重新复制 Channel Access Token。 +- **能发不能收**:确认 Channel Access Token 有效、CCR 已启动并连上 LINE。 +- **群聊不可用**:确认 `Allow bot to join group chats` 打开了,把 Bot 重新加进群。 +- **只想锁屏后提醒**:别开 **转发 Agent 消息**,只开 **接力**。 diff --git a/docs/src/content/docs/zh/bot-与-im-接力-agent/slack.md b/docs/src/content/docs/zh/bot-与-im-接力-agent/slack.md new file mode 100644 index 0000000..f1e7dbc --- /dev/null +++ b/docs/src/content/docs/zh/bot-与-im-接力-agent/slack.md @@ -0,0 +1,92 @@ +--- +title: Slack Bot 配置 +pageTitle: Slack Bot +eyebrow: Bot 与 IM 接力 Agent +lead: 把 Agent 的消息接入 Slack 的频道或私聊,并在电脑锁屏后把新消息接力到 Slack。这一页从创建 Slack 应用开始,一直带你走到在 CCR 里跑通。 +--- + +## 这个方式适合谁 + +Slack 适合团队把 Agent 消息接入已有的频道、私聊或工作区应用。你需要准备一个 Bot Token 和一个 App Token。 + +> 还没看过 Bot 总览?先回到主文档的「把 Agent 消息转发到 IM(Bot)」那一节,了解 Bot 的整体流程、转发 Agent 消息和接力的区别,再回来配单个平台。 + +## 你会用到哪些字段 + +| Slack 后台里的名字 | CCR 字段 | 长什么样 | 什么时候需要 | +| --- | --- | --- | --- | +| Bot User OAuth Token | Bot Token | `xoxb-...` | 必填,让 Bot 收发消息 | +| App-Level Token | App Token | `xapp-...` | 让 Socket Mode 建立连接 | + +## 第一步:创建 Slack 应用 + +1. 打开 [Slack API Apps](https://api.slack.com/apps)。 +2. 点 `Create New App`。 +3. 选 `From scratch`。 +4. 填应用名,比如 `CCR`。 +5. 选要接入的 Slack workspace。 +6. 点 `Create App`。 + +## 第二步:打开 Socket Mode + +1. 在应用左侧打开 `Socket Mode`。 +2. 打开 `Enable Socket Mode`。 +3. 页面提示需要 App-Level Token 时,点创建 token。 +4. Token 名字随便填,比如 `ccr-socket`。 +5. Scope 选 `connections:write`。 +6. 创建后复制 `xapp-...` 开头的 App-Level Token,待会儿填到 CCR 的 App Token。 + +## 第三步:添加 Bot 权限并安装 + +1. 左侧打开 `OAuth & Permissions`。 +2. 找到 `Scopes` 里的 `Bot Token Scopes`。 +3. 至少加这几个 scope:`app_mentions:read`、`channels:history`、`channels:read`、`chat:write`、`im:history`、`im:read`、`im:write`。 +4. 要收发文件再加 `files:read`、`files:write`。 +5. 要在私有频道用再加 `groups:history`、`groups:read`。 +6. 回到页面顶部点 `Install to Workspace`,授权。 +7. 安装后复制 `Bot User OAuth Token`(`xoxb-` 开头),待会儿填到 CCR 的 Bot Token。 + +## 第四步:把 Bot 拉进目标频道 + +只在私聊用的话可以跳过。 + +1. 打开 Slack 目标频道。 +2. 在消息框输入 `/invite @你的Bot名字`。 +3. 发送后确认成员列表里能看到这个 Bot。 + +> 没把 Bot 邀请进频道,它通常只能收到私聊,看不到频道消息。 + +## 在 CCR 中接入 + +1. 打开 CCR 的 **Bot 管理** 页面,点 **添加 Bot**。 +2. 平台选 **Slack**。 +3. 认证方式默认是 **Bot Token**,保持即可(除非你明确要走 OAuth 流程)。 +4. 把 `xoxb-...` 填进 **Bot Token**。 +5. 把 `xapp-...` 填进 **App Token**。 +6. 保存这个 Bot。 +7. 打开 **Agent配置**,编辑你要接 Bot 的那个 Agent配置。 +8. 打开 **Bot** 开关,选刚保存的 Bot。 +9. 按需打开 **转发 Agent 消息** 或 **接力**(见下一节)。 +10. 从 CCR 重新打开 Agent。 + +## 消息接力:转发还是接力 + +- **转发 Agent 消息**:不管电脑锁没锁屏,都把 Agent 的新消息转发到 Slack。适合要完整记录或调试时。 +- **接力**:只在电脑锁屏后才转发。配合 **空闲秒数**(锁屏后空闲多久才接力)和 Wi-Fi / 蓝牙目标设备一起用。 + +> 只想锁屏后收到提醒?打开 **接力** 就行,别开 **转发 Agent 消息**,否则消息会很密。 + +## 测试 + +1. 从 CCR 打开 Agent,触发一条消息。 +2. 到 Slack 里确认 Bot 能收到并回复。 +3. 用频道的话,先确认 Bot 已经在频道里。 + +> **怎么算成功:** Slack 里能看到 Agent 的消息,你回复后 Agent 也能接着处理。 + +## 常见问题 + +- **消息没进 Slack**:先确认 Bot Token 还有效,再确认应用在目标频道里。 +- **Socket Mode 连不上**:检查 App Token 是不是 `xapp-` 开头、有没有 `connections:write` scope。 +- **频道没响应、私聊有响应**:通常是 Bot 没进频道,或缺少 `channels:*` / `groups:*` 权限。补 scope 后要重新安装到 workspace。 +- **消息太多**:关掉 **转发 Agent 消息**,只保留 **接力**。 diff --git a/docs/src/content/docs/zh/bot-与-im-接力-agent/telegram.md b/docs/src/content/docs/zh/bot-与-im-接力-agent/telegram.md new file mode 100644 index 0000000..f01e000 --- /dev/null +++ b/docs/src/content/docs/zh/bot-与-im-接力-agent/telegram.md @@ -0,0 +1,81 @@ +--- +title: Telegram Bot 配置 +pageTitle: Telegram Bot +eyebrow: Bot 与 IM 接力 Agent +lead: 把 Agent 的消息接入 Telegram,并在电脑锁屏后把新消息接力过去。Telegram 是所有平台里配置最简单的——只需要一个 Bot Token,几分钟就能跑通。 +--- + +## 这个方式适合谁 + +Telegram 适合个人或小团队快速接收 Agent 消息。字段最少,只需要 `Bot Token`。如果你只想最快跑通一个 Bot,从 Telegram 开始最省事。 + +> 还没看过 Bot 总览?先回到主文档的「把 Agent 消息转发到 IM(Bot)」那一节,了解整体流程和转发 Agent 消息、接力的区别,再回来配单个平台。 + +## 你会用到哪些字段 + +| Telegram 里的名字 | CCR 字段 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| HTTP API token | Bot Token | 必填 | `@BotFather` 创建机器人后返回的 token | + +## 第一步:用 BotFather 创建机器人 + +1. 打开 Telegram。 +2. 搜索 `@BotFather`,确认用户名完全一致(官方机器人)。 +3. 进会话后发 `/newbot`。 +4. 按提示输入机器人显示名,比如 `CCR Assistant`。 +5. 再输入机器人用户名——必须以 `bot` 结尾,比如 `ccr_demo_bot`。 +6. 创建成功后,`@BotFather` 会返回一段 HTTP API token。 +7. 复制这段 token,待会儿填进 CCR 的 Bot Token。 + +> **别把 token 发给任何人。** 拿到 token 的人就能完全控制你的 Telegram Bot。 + +## 第二步:按需设置群聊能力 + +只用私聊的话可以跳过。 + +要在群里用: + +1. 在 `@BotFather` 发 `/setjoingroups`。 +2. 选你的机器人。 +3. 选允许加入群组。 +4. 想让 Bot 看到群里所有消息,发 `/setprivacy`。 +5. 再次选刚才的 Bot。 +6. 选 `Disable` 关闭隐私模式。 +7. 把 Bot 加进目标群。 + +> Telegram 隐私模式打开时,Bot 通常只能看到命令、@ 它的消息和部分服务消息。关掉隐私模式后,建议把 Bot 移出群再重新加,让设置立刻生效。 + +## 在 CCR 中接入 + +1. 打开 CCR 的 **Bot 管理** 页面,点 **添加 Bot**。 +2. 平台选 **Telegram**。 +3. 认证方式是 **Bot Token**。 +4. 把 token 填进 **Bot Token**。 +5. 保存这个 Bot。 +6. 打开 **Agent配置**,编辑你要接 Bot 的 Agent配置。 +7. 打开 **Bot** 开关,选刚保存的 Bot。 +8. 按需打开 **转发 Agent 消息** 或 **接力**(见下一节)。 +9. 从 CCR 重新打开 Agent。 + +## 消息接力:转发还是接力 + +- **转发 Agent 消息**:不管锁不锁屏都转发,适合要在 Telegram 里看完整输出时。 +- **接力**:只在电脑锁屏后转发,配合 **空闲秒数** 和目标设备。 + +> 只想锁屏后提醒,别开 **转发 Agent 消息**。 + +## 测试 + +1. 从 CCR 打开 Agent,触发一条消息。 +2. 到 Telegram 确认机器人能收到并回复。 +3. 群里用的话,先确认机器人已经进群、能读写消息。 + +> **怎么算成功:** Telegram 里能看到 Agent 消息,你回复后 Agent 也能继续。 + +## 常见问题 + +- **认证失败**:重新复制 Bot Token。 +- **私聊可用、群不可用**:检查机器人进群了没、群权限允不允许它读消息。 +- **群里只有 `/command` 能触发**:检查 `@BotFather` 的 `/setprivacy`,或把 Bot 设为群管理员。 +- **重置过 token**:旧 token 立刻失效,要回 CCR 更新并重启。 +- **消息太多**:关掉 **转发 Agent 消息**,只保留 **接力**。 diff --git a/docs/src/content/docs/zh/bot-与-im-接力-agent/wecom.md b/docs/src/content/docs/zh/bot-与-im-接力-agent/wecom.md new file mode 100644 index 0000000..5a8b975 --- /dev/null +++ b/docs/src/content/docs/zh/bot-与-im-接力-agent/wecom.md @@ -0,0 +1,85 @@ +--- +title: 企业微信 Bot 配置 +pageTitle: 企业微信 Bot +eyebrow: Bot 与 IM 接力 Agent +lead: 把 Agent 的消息接入企业微信,让团队成员在企业微信里接收并回复,并在电脑锁屏后接力。这一页从企业微信管理后台创建自建应用开始,带你走到在 CCR 里跑通。 +--- + +## 这个方式适合谁 + +企业微信适合把 Agent 接入企业内部消息环境,让团队成员在企业微信里接收 Agent 消息并回复。 + +> 还没看过 Bot 总览?先回到主文档的「把 Agent 消息转发到 IM(Bot)」那一节,了解整体流程和转发 Agent 消息、接力的区别,再回来配单个平台。 + +## 你会用到哪些字段 + +| 企业微信后台里的名字 | CCR 字段 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| 企业ID / CorpID | Corp ID | 必填 | 企业级标识,在「我的企业」里 | +| AgentId | Agent ID | 必填 | 自建应用的应用 ID | +| Secret | Secret | 必填 | 自建应用密钥,通常要管理员在手机端确认查看 | + +> CCR 会用 Corp ID 和应用 Secret 去换企业微信接口的 access_token,你不用自己手动获取。 + +## 第一步:获取 Corp ID + +1. 打开 [企业微信管理后台](https://work.weixin.qq.com/wework_admin/frame)。 +2. 用管理员账号登录。 +3. 顶部打开 `我的企业`。 +4. 进入 `企业信息`。 +5. 找到 `企业ID`,复制,待会儿填到 CCR 的 Corp ID。 + +## 第二步:创建自建应用 + +1. 在管理后台打开 `应用管理`。 +2. 找到 `自建` 区域。 +3. 点 `创建应用`。 +4. 填应用名,比如 `CCR`。 +5. 上传应用 Logo。 +6. 选可见范围。测试时先选你自己或一个小测试部门。 +7. 点创建。 + +## 第三步:复制 Agent ID 和 Secret + +1. 进入刚创建的自建应用详情。 +2. 复制 `AgentId`,待会儿填到 CCR 的 Agent ID。 +3. 找到 `Secret`,点查看。 +4. 按企业微信提示,在手机企业微信里确认。 +5. 复制显示出的 `Secret`。 + +> 如果企业微信要求配 `企业可信 IP`,需要把运行 CCR Bot Gateway 的出口公网 IP(或你用的中继服务出口 IP)加进去。 + +## 在 CCR 中接入 + +1. 打开 CCR 的 **Bot 管理** 页面,点 **添加 Bot**。 +2. 平台选 **企业微信(WeCom)**。 +3. 认证方式是 **App Secret**。 +4. 填 **Corp ID**、**Agent ID**、**Secret**。 +5. 保存这个 Bot。 +6. 打开 **Agent配置**,编辑你要接 Bot 的 Agent配置。 +7. 打开 **Bot** 开关,选刚保存的 Bot。 +8. 按需打开 **转发 Agent 消息** 或 **接力**(见下一节)。 +9. 从 CCR 重新打开 Agent。 + +## 消息接力:转发还是接力 + +- **转发 Agent 消息**:不管锁不锁屏都转发。会增加消息量,只在要完整记录或排查问题时用。 +- **接力**:只在电脑锁屏后转发,配合 **空闲秒数** 和目标设备。 + +> 只想锁屏后提醒,别开 **转发 Agent 消息**。 + +## 测试 + +1. 从 CCR 打开 Agent,触发一条消息。 +2. 到企业微信确认应用能收到并回复。 +3. 锁屏电脑,等过你设的空闲时间,确认接力触发后新消息会进企业微信。 + +> **怎么算成功:** 企业微信里能看到 Agent 消息,你回复后 Agent 也能继续。 + +## 常见问题 + +- **认证失败**:重新复制 Corp ID、Agent ID 和 Secret。 +- **能启动但收不到消息**:检查企业微信应用是否允许接收消息、当前成员有没有使用权限。 +- **发送失败提示 IP 不可信**:回企业微信后台配 `企业可信 IP`。 +- **部分成员看不到应用**:检查自建应用的可见范围。 +- **接力不触发**:确认电脑已锁屏,检查 **接力** 开关、空闲时间和目标设备。 diff --git a/docs/src/content/docs/zh/bot-与-im-接力-agent/weixin-ilink.md b/docs/src/content/docs/zh/bot-与-im-接力-agent/weixin-ilink.md new file mode 100644 index 0000000..f3e6db5 --- /dev/null +++ b/docs/src/content/docs/zh/bot-与-im-接力-agent/weixin-ilink.md @@ -0,0 +1,78 @@ +--- +title: 微信 Bot 配置 +pageTitle: 微信 Bot +eyebrow: Bot 与 IM 接力 Agent +lead: 把 Agent 的消息接入微信,并在电脑锁屏后把新消息接力过去。微信最简单的接法是二维码登录,不用手动复制任何 token,扫一下就行。 +--- + +## 这个方式适合谁 + +微信适合个人把 Agent 消息接入常用聊天窗口。最简单的方式是二维码登录,不需要手动复制 token。 + +> 还没看过 Bot 总览?先回到主文档的「把 Agent 消息转发到 IM(Bot)」那一节,了解整体流程和转发 Agent 消息、接力的区别,再回来配单个平台。 + +## 两种登录方式 + +| 方式 | 需要准备 | 适合谁 | +| --- | --- | --- | +| QR Login(二维码登录) | 能扫码确认的微信账号 | 大多数个人用户 | +| Bot Token | 外部微信 Bot 服务或 iLink 插件给的 token | 已经有第三方微信 Bot 服务的用户 | + +> **建议优先用二维码登录。** 微信登录态和账号安全强相关,建议用专门的 Bot 账号,别用绑定支付、客服或重要联系人的主账号。 + +## 方式一:二维码登录(推荐) + +1. 打开 CCR 的 **Bot 管理** 页面,点 **添加 Bot**。 +2. 平台选 **微信(Weixin iLink)**。 +3. 认证方式选 **QR Login**(这是默认项)。 +4. CCR 会弹出一个二维码窗口。 +5. 用手机微信扫这个码。 +6. 在手机上确认登录。 +7. 等 CCR 显示登录成功。 +8. 保存这个 Bot。 + +> 二维码会过期。如果扫码页提示过期,关掉登录窗口重新开始扫。 + +## 方式二:Bot Token + +只有当你已经有外部微信 Bot 服务、iLink 服务或插件提供的 token 时才用这个方式。 + +1. 在提供方后台或本地插件输出里复制 `Bot Token`。 +2. 提供方同时给了 `Account ID` 的话一起复制。 +3. 给了 `User ID` 的话也一起复制。 +4. 打开 CCR 的 **Bot 管理** 页面,点 **添加 Bot**。 +5. 平台选 **微信**,认证方式选 **Bot Token**。 +6. 填 **Bot Token**,按需填 **Account ID** 和 **User ID**。 +7. 保存这个 Bot。 + +## 在 CCR 中绑定到 Agent + +不管用哪种登录方式,都要再把 Bot 绑到 Agent配置上: + +1. 打开 **Agent配置**,编辑你要接 Bot 的 Agent配置。 +2. 打开 **Bot** 开关,选刚保存的 Bot。 +3. 按需打开 **转发 Agent 消息** 或 **接力**(见下一节)。 +4. 从 CCR 重新打开 Agent。 + +## 消息接力:转发还是接力 + +- **转发 Agent 消息**:不管锁不锁屏都转发,适合要在微信里看每条 Agent 输出。 +- **接力**:只在电脑锁屏后转发。配合 **空闲秒数**(锁屏后空闲多久才接力)和 Wi-Fi / 蓝牙目标设备。 + +> 只想锁屏后收到提醒?打开 **接力** 就行,别开 **转发 Agent 消息**。 + +## 测试 + +1. 从 CCR 打开 Agent,触发一条消息。 +2. 到微信确认 Bot 能收到并回复。 +3. 锁屏电脑,等过你设的空闲时间,确认 Agent 新消息会自动进微信。 + +> **怎么算成功:** 微信里能看到 Agent 消息,你回复后 Agent 也能继续。 + +## 常见问题 + +- **二维码过期**:关掉登录窗口重新扫码。 +- **扫码成功但消息没转发**:确认 Agent配置重启过、Bot 开关还开着。 +- **扫码后很快掉线**:确认手机和电脑网络稳定;检查微信是不是在别的设备上重新登录导致登录态失效。 +- **Token 方式连不上**:重新复制 Bot Token,避免复制到过期值或多余空格。 +- **第三方服务要 Account ID / User ID**:确认这些字段来自同一个账号,别混用不同账号的 token 和 ID。 diff --git a/docs/src/content/docs/zh/configuration.md b/docs/src/content/docs/zh/configuration.md new file mode 100644 index 0000000..c4db009 --- /dev/null +++ b/docs/src/content/docs/zh/configuration.md @@ -0,0 +1,38 @@ +--- +title: Claude Code Router 详细配置 +pageTitle: 详细配置 +eyebrow: 详细配置 +lead: 按应用中的实际顺序,将主页页面和设置页分开说明:主页覆盖概览、供应商、Agent配置、路由、Fusion、API 密钥、日志&观测、服务和扩展;设置页覆盖 ToolHub、Bot、数据和托盘。 +--- + +## 页面结构 + +详细配置文档已经拆成独立页面。左侧目录中的每一项都会进入一个页面;当前页面内的标题由右侧大纲负责。主页页面跟随应用左侧主导航顺序;设置页单独分组,并按设置弹窗顺序排列。 + +## 主页页面 + +| 页面 | 内容 | +| --- | --- | +| 概览仪表盘 | 系统状态、账户余额、用量组件、布局编辑和分享卡片 | +| 供应商配置 | 上游服务、协议、基础 URL、模型列表和凭据 | +| 一键导入供应商 | Provider deeplink 协议、Manifest 导入、一键导入按钮和安全边界 | +| Agent配置 | Agent 启动方式、模型、作用范围、多开和 Bot 绑定 | +| 路由配置 | 条件规则、fallback 和请求改写 | +| Fusion 组合模型 | 把基础模型与视觉、搜索、MCP 工具组合成新的可选模型 | +| API 密钥 | 客户端访问 Key、过期时间和本地限额 | +| 日志&观测 | 请求日志、Agent 执行追踪、工具调用和工具结果 | +| 服务配置 | Host、Port、代理模式、系统代理、网络捕获和 CA 证书 | +| 扩展机制 | Wrapper plugin、Core gateway plugin、自定义扩展创建和调试 | + +## 设置页 + +| 页面 | 内容 | +| --- | --- | +| ToolHub | 将多个 MCP server 收束成一个 Agent 可用的动态工具检索入口 | +| Bot 与 IM 接力 Agent | Bot 转发、接力模式和平台页面 | +| 配置数据库位置 | 桌面 App 维护的 SQLite 配置数据库位置 | +| 托盘配置 | 托盘图标、余额进度条和托盘窗口组件 | + +## 内容关系 + +概览仪表盘用于查看系统状态和用量;供应商配置和一键导入供应商页面覆盖上游模型服务如何进入 CCR;Agent配置页面覆盖 Claude Code、Codex 和 ZCode 的启动、多开与模型选择;路由决定模型请求的上游去向;Fusion 页面覆盖图像、搜索和 MCP 工具;API 密钥控制客户端访问 CCR;日志&观测覆盖请求日志和 Agent 执行链路;服务配置控制本地网关监听和代理能力;扩展机制覆盖本地插件的创建、安装和调试。ToolHub、Bot、配置数据库位置和托盘配置对应设置弹窗中的同名配置页。 diff --git a/docs/src/content/docs/zh/configuration/api-keys.md b/docs/src/content/docs/zh/configuration/api-keys.md new file mode 100644 index 0000000..d30604c --- /dev/null +++ b/docs/src/content/docs/zh/configuration/api-keys.md @@ -0,0 +1,46 @@ +--- +title: API 密钥 +pageTitle: API 密钥 +eyebrow: 详细配置 +lead: 管理客户端访问 CCR 网关时使用的 API Key,并为每个 Key 设置过期时间和本地限额。 +--- + +## 列表字段 + +| 字段 | 代表的能力 | +| --- | --- | +| 搜索 API 密钥 | 按名称或 Key 内容过滤列表。 | +| 添加 API 密钥 | 打开创建弹窗,生成新的客户端访问 Key。 | +| 名称 | API Key 的显示名,用于区分客户端、团队、用途或自动化来源。 | +| Key | 脱敏后的访问 Key。可以点击 `复制 API 密钥` 复制完整 Key。 | +| 过期 | 当前 Key 的过期时间。过期后客户端不能继续使用这个 Key 访问 CCR。 | +| 限制 | 当前 Key 的本地限额摘要。没有配置限额时显示“未配置限制”。 | +| 编辑 API 密钥 | 修改过期时间和限额。出于安全原因,已创建的 Key 本身不会重新明文展示。 | +| 移除 API 密钥 | 删除当前客户端访问 Key。删除后立即不能再用于请求。 | + +## 创建和编辑 + +| 字段 | 代表的能力 | +| --- | --- | +| 名称 | 新 Key 的显示名。建议写成客户端或用途,例如 `Claude Code - laptop`、`CI` 或团队名。 | +| 过期时间 | 选择 Key 的有效期:`永不`、`7 天`、`30 天`、`90 天` 或 `自定义`。 | +| 过期于 | 选择 `自定义` 时出现,用于填写精确的过期日期和时间。 | +| API 密钥已创建 | 创建成功后的确认弹窗。这里会显示完整 Key。 | +| 请现在复制保存这个密钥,之后可能不会再次完整显示。 | 提醒你立即复制 Key。关闭弹窗后,CCR 不会再次展示完整 Key。 | + +## 高级设置 + +`高级设置` 用于给单个客户端 Key 添加本地限额。限额命中后,使用这个 Key 的客户端请求会被拒绝或限制;它不会修改供应商侧额度。 + +| 字段 | 代表的能力 | +| --- | --- | +| 高级设置 | 展开或收起限额编辑区。 | +| 未配置限制 | 当前 Key 没有任何本地限额。 | +| 请求 | 按请求次数限制。 | +| 令牌 | 按 token 数量限制。 | +| 图片 | 按图片数量限制。 | +| 每分钟 | 限额窗口为 1 分钟。 | +| 每小时 | 限额窗口为 1 小时。 | +| 每天 | 限额窗口为 1 天。 | +| 添加限制 | 新增一条限额规则。 | +| 移除限制 | 删除当前限额规则。 | diff --git a/docs/src/content/docs/zh/configuration/bot-relay.md b/docs/src/content/docs/zh/configuration/bot-relay.md new file mode 100644 index 0000000..b5a40db --- /dev/null +++ b/docs/src/content/docs/zh/configuration/bot-relay.md @@ -0,0 +1,15 @@ +--- +title: Bot 与 IM 接力 Agent +pageTitle: Bot 与 IM 接力 Agent +eyebrow: 详细配置 +lead: 通过 IM Bot 转发 Agent 消息,或在桌面空闲后把任务接力到手机。 +--- + +## 常见模式 + +- **转发 Agent 消息**:把消息同步到 IM。 +- **接力**:桌面空闲后,把交互接力到 IM。 + +## 平台页面 + +Slack、Discord、Telegram、LINE、微信、企业微信、飞书和钉钉都有独立页面。 diff --git a/docs/src/content/docs/zh/configuration/bot-setup.md b/docs/src/content/docs/zh/configuration/bot-setup.md new file mode 100644 index 0000000..259c1d5 --- /dev/null +++ b/docs/src/content/docs/zh/configuration/bot-setup.md @@ -0,0 +1,18 @@ +--- +title: 配置步骤 +pageTitle: Bot 配置步骤 +eyebrow: Bot +lead: 添加 Bot、绑定 Agent配置,并选择消息转发或接力模式。 +--- + +## 操作流程 + +1. 打开 **Bot 管理**,点击 **添加 Bot**。 +2. 选择平台并填写 Token、Secret、Signing Secret、Robot Code 或 OAuth 信息。 +3. 保存 Bot。 +4. 打开目标 Agent配置,开启 **Bot**。 +5. 选择 **转发 Agent 消息** 或 **接力**,并重新从 CCR 打开 Agent。 + +## 验证方式 + +从 CCR 打开 Agent 后发一条测试消息,确认请求日志中有 Bot 相关记录,IM 端也能收到消息。 diff --git a/docs/src/content/docs/zh/configuration/config-file.md b/docs/src/content/docs/zh/configuration/config-file.md new file mode 100644 index 0000000..fe34677 --- /dev/null +++ b/docs/src/content/docs/zh/configuration/config-file.md @@ -0,0 +1,17 @@ +--- +title: 配置数据库位置 +pageTitle: 配置数据库位置 +eyebrow: 详细配置 +lead: 找到 CCR 桌面 App 默认维护的 SQLite 配置数据库。 +--- + +## 默认位置 + +- macOS/Linux:`~/.claude-code-router/config.sqlite` +- Windows:`%APPDATA%\Claude Code Router\config.sqlite` + +## 生效方式 + +CCR 的运行配置存储在 SQLite 中。旧版 `config.json` 只会在没有 SQLite 配置时作为迁移来源读取一次,迁移完成后继续编辑 `config.json` 不会影响当前配置。 + +建议通过桌面 UI 修改配置,或在 **Settings** 中导出备份。不要在 CCR 运行时直接编辑 `config.sqlite`;SQLite 还会维护同目录的 `config.sqlite-wal` 和 `config.sqlite-shm` 辅助文件。 diff --git a/docs/src/content/docs/zh/configuration/extensions.md b/docs/src/content/docs/zh/configuration/extensions.md new file mode 100644 index 0000000..04354bd --- /dev/null +++ b/docs/src/content/docs/zh/configuration/extensions.md @@ -0,0 +1,281 @@ +--- +title: 扩展机制 +pageTitle: 扩展机制 +eyebrow: 详细配置 +lead: 了解 CCR 扩展如何加载、能注册哪些能力,并从零创建、安装和调试自己的扩展。 +--- + +## 扩展类型 + +CCR 的扩展分为两层: + +| 类型 | 配置位置 | 运行位置 | 适合做什么 | +| --- | --- | --- | --- | +| Wrapper plugin | `plugins` | CCR Desktop 的 Electron wrapper 进程 | 注册本地 HTTP 路由、启动本地后端、拦截代理流量、添加内置浏览器入口、连接 Provider 账号用量 | +| Core gateway plugin | `providerPlugins` 或 `plugins[].coreGateway.providerPlugins` | core gateway runtime | 扩展上游 Provider、认证方式或 core gateway 内部能力 | + +多数用户自定义扩展应从 Wrapper plugin 开始。它能拿到 CCR 配置、私有数据目录和日志对象,并通过 `ctx` 注册能力。 + +## 加载机制 + +启动网关时,CCR 会读取配置里的 `plugins` 数组,并按顺序处理每个 `enabled !== false` 的扩展: + +1. 先应用配置中声明的 `apps`、`proxy.routes`、`coreGateway.providerPlugins`、`coreGateway.virtualModelProfiles` 和 `coreGateway.config`。 +2. 再加载扩展模块。`module` 可以是绝对路径、`~/` 开头路径、相对配置目录的 `./...` 路径,或 Node 可以解析到的包名。 +3. 如果没有配置 `module`,CCR 会尝试用扩展 `id` 匹配内置市场扩展,例如 `claude-design` 和 `cursor-proxy`。 +4. 模块可以导出函数,也可以导出包含 `setup(ctx)` 或 `activate(ctx)` 的对象。 +5. 扩展停止时,CCR 会反向执行 `stop`、`onStop` 钩子,并关闭该扩展注册的 HTTP 后端和 SQLite store。 + +扩展模块常见导出形式: + +```js +"use strict"; + +module.exports = { + async setup(ctx) { + ctx.logger.info("extension loaded"); + }, + async stop() { + // 可选:释放扩展自己持有的资源。 + } +}; +``` + +也可以直接导出函数: + +```js +"use strict"; + +module.exports = async function setup(ctx) { + ctx.logger.info(`loaded ${ctx.pluginId}`); +}; +``` + +`setup(ctx)` 或 `activate(ctx)` 可以直接调用 `ctx.register...` 方法,也可以返回注册对象。返回对象支持 `apps`、`gatewayRoutes`、`proxyRoutes`、`providerAccountConnectors`、`coreGateway`、`virtualModelProfiles`、`stop` 和 `onStop`。 + +## ctx 能力参考 + +`setup(ctx)` 的 `ctx` 包含这些常用字段和方法: + +| 字段或方法 | 说明 | +| --- | --- | +| `ctx.pluginId` | 当前扩展 ID | +| `ctx.pluginConfig` | `plugins[].config` 中的自定义配置 | +| `ctx.config` | 当前 CCR AppConfig 快照 | +| `ctx.logger` | 带 `[plugin:]` 前缀的 `debug/info/warn/error` 日志 | +| `ctx.paths.configDir` | CCR 配置目录 | +| `ctx.paths.dataDir` | CCR 数据目录 | +| `ctx.paths.pluginDataDir` | 当前扩展专属数据目录 | +| `ctx.registerGatewayRoute(route)` | 在 CCR 网关上注册本地 HTTP 路由 | +| `ctx.registerHttpBackend(backend)` | 启动一个本地 HTTP 后端,返回 `{ url, host, port }` | +| `ctx.registerProxyRoute(route)` | 把代理模式捕获到的某个 host/path 转发到扩展后端或其他 upstream | +| `ctx.registerApp(app)` | 在内置浏览器应用列表里添加入口 | +| `ctx.openSqliteStore(options)` | 在扩展数据目录打开 SQLite store | +| `ctx.registerProviderAccountConnector(connector)` | 注册 Provider 账号余额或额度读取器 | +| `ctx.registerCoreGatewayProviderPlugin(plugin)` | 向 core gateway 注入 provider plugin | +| `ctx.registerCoreGatewayVirtualModelProfile(profile)` | 向 core gateway 注入虚拟模型配置 | + +Gateway route handler 会额外收到 helper: + +| Helper | 说明 | +| --- | --- | +| `helpers.readBody(request)` | 读取请求 body,返回 `Buffer` | +| `helpers.readJson(request)` | 读取并解析 JSON body | +| `helpers.sendJson(response, statusCode, body)` | 返回 JSON 响应 | + +`registerGatewayRoute` 默认使用 `auth: "gateway"`。如果 CCR 配置了 API Key,请求必须带 `Authorization: Bearer ` 或 `x-api-key: `。仅调试或本地公开状态页建议使用 `auth: "none"`。 + +## 创建第一个扩展 + +创建一个目录,例如 `~/ccr-extensions/hello-extension`: + +```text +hello-extension/ + plugin.json + index.cjs +``` + +`plugin.json` 用于让 CCR 的本地扩展选择器识别扩展 ID、名称和入口文件: + +```json +{ + "id": "hello-extension", + "name": "Hello Extension", + "module": "index.cjs", + "apps": [ + { + "id": "hello-status", + "name": "Hello Status", + "url": "http://127.0.0.1:3456/plugins/hello" + } + ] +} +``` + +`index.cjs` 注册一个状态路由、一个 echo 后端,以及一个代理转发规则: + +```js +"use strict"; + +module.exports = { + async setup(ctx) { + ctx.registerGatewayRoute({ + auth: "none", + id: "hello-status", + method: "GET", + path: "/plugins/hello", + handler(_request, response, helpers) { + helpers.sendJson(response, 200, { + ok: true, + plugin: ctx.pluginId, + message: ctx.pluginConfig?.message || "hello from CCR" + }); + } + }); + + const backend = await ctx.registerHttpBackend({ + id: "hello-echo", + async handler(request, response, helpers) { + const body = request.method === "POST" + ? (await helpers.readBody(request)).toString("utf8") + : ""; + + helpers.sendJson(response, 200, { + method: request.method, + path: request.url, + body + }); + } + }); + + ctx.registerProxyRoute({ + host: "api.example.local", + id: "hello-example-api", + paths: ["/v1"], + preserveHost: true, + upstream: backend.url + }); + + ctx.logger.info(`hello backend listening at ${backend.url}`); + } +}; +``` + +这个扩展会暴露: + +- `GET /plugins/hello`:直接挂在 CCR 网关上,用来验证扩展是否加载。 +- 一个本地 echo 后端:由 CCR 自动分配端口。 +- 一个代理规则:当代理模式捕获到 `api.example.local/v1...` 时转发到 echo 后端。 + +## 安装扩展 + +推荐使用桌面 UI 安装本地扩展: + +1. 打开 **Extensions** 页面。 +2. 点击添加扩展,选择本地扩展目录。 +3. 选择刚创建的 `hello-extension` 目录。 +4. 保存配置。 +5. 打开 **Server** 页面,重启网关。 + +CCR 的运行配置存储在 SQLite 中。请通过 UI 添加扩展;旧版 JSON 配置文件仅用于参考。扩展条目的配置结构如下: + +```json +{ + "plugins": [ + { + "id": "hello-extension", + "enabled": true, + "module": "/Users/you/ccr-extensions/hello-extension/index.cjs", + "config": { + "message": "hello from my config" + } + } + ] +} +``` + +保存扩展配置后需要重启网关。配置数据库位置见 [配置数据库位置](/configuration/config-file/)。 + +本地目录选择器会按顺序识别这些入口信息: + +- `plugin.json` +- `ccr-plugin.json` +- `.ccr-plugin/plugin.json` +- `.codex-plugin/plugin.json` +- `package.json` 里的 `main`、`ccr.module` 或 `ccrPlugin.module` + +如果没有显式入口文件,CCR 会尝试目录里的 `index.cjs`、`index.mjs`、`index.js`、`plugin.cjs`、`plugin.mjs` 或 `plugin.js`。 + +## 调试扩展 + +### 1. 先做语法检查 + +CommonJS 扩展可以运行: + +```bash +node --check ~/ccr-extensions/hello-extension/index.cjs +``` + +如果扩展依赖 npm 包,先在扩展目录安装依赖,并确保入口文件能被 Node 解析。 + +### 2. 用源码模式启动 CCR + +在 CCR 仓库根目录运行: + +```bash +npm install +npm run dev +``` + +扩展里的 `ctx.logger.info/warn/error` 会出现在启动 CCR 的终端中,前缀类似 `[plugin:hello-extension]`。 + +### 3. 验证 Gateway route + +启动网关后,请求状态路由: + +```bash +curl http://127.0.0.1:3456/plugins/hello +``` + +如果路由使用默认的 `auth: "gateway"`,并且 CCR 已配置 API Key: + +```bash +curl -H "Authorization: Bearer " http://127.0.0.1:3456/plugins/hello +``` + +也可以使用: + +```bash +curl -H "x-api-key: " http://127.0.0.1:3456/plugins/hello +``` + +### 4. 验证 HTTP 后端和代理规则 + +`registerHttpBackend` 返回的 `backend.url` 会写入日志。先直接请求这个地址,确认后端工作正常;再开启代理模式,验证目标 host/path 是否被 `registerProxyRoute` 命中。 + +代理规则匹配逻辑: + +- `host` 必须匹配目标 hostname,支持精确 host、`.example.com` 后缀和 `*.example.com` 通配。 +- `paths` 为空时匹配该 host 的所有路径。 +- 多个路径匹配时,CCR 会选最长的 path prefix。 +- `stripPathPrefix` 会从转发路径中移除匹配前缀。 +- `rewritePathPrefix` 会把匹配前缀替换成指定前缀。 + +### 5. 常见问题 + +| 现象 | 排查方向 | +| --- | --- | +| 扩展没有加载 | 检查 `plugins[].enabled`、`plugins[].module` 路径和终端里的 `[plugin:]` 报错 | +| `GET /plugins/hello` 返回 404 | 确认网关已重启,路由 `path` 或 `pathPrefix` 是否以 `/` 开头 | +| 返回 401 | 路由默认需要 gateway API Key;调试路由可显式设置 `auth: "none"` | +| 修改代码不生效 | Wrapper plugin 不会热重载,修改后需要重启网关或重启 CCR | +| 端口被占用 | `registerHttpBackend` 不传 `port` 会自动分配端口;固定端口冲突时改回自动分配 | +| 代理规则不命中 | 检查代理模式是否开启、证书是否安装、host 是否匹配真实请求的 hostname | + +## 安全建议 + +- 只有状态页、健康检查或本机调试路由才使用 `auth: "none"`。 +- 不要在日志里打印 API Key、OAuth token、Cookie 或完整请求头。 +- 扩展写入文件时优先使用 `ctx.paths.pluginDataDir`。 +- 对 `readJson` 得到的外部输入做类型校验。 +- 代理转发到外部 upstream 时,明确处理 header 白名单,避免把本地鉴权信息转发到不可信服务。 diff --git a/docs/src/content/docs/zh/configuration/fusion-mcp-tool.md b/docs/src/content/docs/zh/configuration/fusion-mcp-tool.md new file mode 100644 index 0000000..b4aa6c2 --- /dev/null +++ b/docs/src/content/docs/zh/configuration/fusion-mcp-tool.md @@ -0,0 +1,21 @@ +--- +title: 自定义 MCP 工具 +pageTitle: 自定义 MCP 工具 +eyebrow: Fusion +lead: 将本地或远程 MCP 工具接入 Fusion 模型。 +--- + +## 添加入口 + +点击 **Add custom MCP** 后选择 transport。 + +## Transport + +- **stdio**:本地命令行工具。 +- **streamable-http / sse**:远程 MCP 服务。 +- **Discover tools**:读取 MCP server 暴露的工具。 + +## 验证建议 + +高风险或响应慢的 MCP 工具建议先在独立配置中验证。 + diff --git a/docs/src/content/docs/zh/configuration/fusion-vision.md b/docs/src/content/docs/zh/configuration/fusion-vision.md new file mode 100644 index 0000000..29c29e3 --- /dev/null +++ b/docs/src/content/docs/zh/configuration/fusion-vision.md @@ -0,0 +1,32 @@ +--- +title: 内置图像能力 +pageTitle: 内置图像能力 +eyebrow: Fusion +lead: 让不支持多模态的模型拥有视觉能力,例如 GLM-5.2 + GLM-5V-Turbo = GLM-5.2V。 +--- + +## 能力组合 + +内置图像能力会把视觉模型作为能力层接到基础模型前面,不需要替换你原本熟悉的文本模型。视觉模型负责理解图片、截图、图表或 OCR 内容,CCR 将视觉结果整理给基础模型,基础模型继续负责推理、写作、代码生成和最终输出。 + +组合后的 Fusion 模型可以像普通模型一样被路由或配置选择。典型形式是: + +```text +GLM-5.2 + GLM-5V-Turbo = GLM-5.2V +``` + +这类组合适合把熟悉的文本模型保留下来,同时补上视觉输入能力,让不支持多模态的模型也能处理图片上下文。 + +这个方法也适用于 Codex 的 computer use 场景。将 GLM-5.2 与 GLM-5V-Turbo 组合后,GLM-5.2 可以接收由视觉模型整理后的屏幕、截图和界面信息,从而使用 Codex 的 computer use 能力完成观察、判断和后续操作规划。 + +## 选择能力 + +选择 `ccr-fusion-builtins / vision_understand`,并为 Vision model 选择真正支持图像理解的模型。 + +## 模型要求 + +Vision model 决定图片、截图、图表和 OCR 内容的理解质量。基础模型决定最终回答的风格、推理能力和代码能力。 + +## 排查要点 + +图像请求失败时,相关信息包括 Vision model 是否支持视觉输入,以及请求日志中的 Fusion 工具调用报错。 diff --git a/docs/src/content/docs/zh/configuration/fusion-web-search.md b/docs/src/content/docs/zh/configuration/fusion-web-search.md new file mode 100644 index 0000000..a8be16c --- /dev/null +++ b/docs/src/content/docs/zh/configuration/fusion-web-search.md @@ -0,0 +1,31 @@ +--- +title: 内置联网搜索 +pageTitle: 内置联网搜索 +eyebrow: Fusion +lead: 使用 CCR 内置 Web Search 工具为模型提供联网检索能力。 +--- + +## 选择能力 + +选择 `ccr-fusion-builtins / web_search`。 + +## 搜索服务 + +支持 In-app Browser、Brave、Bing、Google CSE、Serper、SerpAPI、Tavily、Exa 等搜索服务。 + +## In-app Browser + +`In-app Browser` 会通过 CCR Desktop 的隐藏内置浏览器窗口执行搜索,打开搜索结果页面并提取可见内容,再把证据提供给 Fusion 模型。它不需要外部搜索 API Key,适合希望用桌面端内置浏览器完成联网检索的场景。 + +可配置项包括搜索引擎、语言、地区和安全搜索级别: + +- 搜索引擎:Bing、Google、DuckDuckGo。 +- 语言:例如 `en`、`zh-CN`。 +- 地区:例如 `US`、`CN`。 +- 安全搜索:默认、中等、严格或关闭。 + +> 注意:`In-app Browser` 依赖 CCR Desktop 的 Electron 内置浏览器能力,只在桌面端可用。CLI、服务器部署或纯 Web 环境没有内置浏览器集成,请改用 Brave、Bing、Google CSE、Serper、SerpAPI、Tavily 或 Exa 等搜索服务。 + +## 排查要点 + +搜索失败时,相关信息包括搜索服务 Key 和请求日志里的 Fusion 工具报错。 diff --git a/docs/src/content/docs/zh/configuration/fusion.md b/docs/src/content/docs/zh/configuration/fusion.md new file mode 100644 index 0000000..0d1eccf --- /dev/null +++ b/docs/src/content/docs/zh/configuration/fusion.md @@ -0,0 +1,26 @@ +--- +title: Fusion 组合模型 +pageTitle: Fusion 组合模型 +eyebrow: 详细配置 +lead: 把基础模型和能力模型组合成新的可选模型,让你已经稳定使用的文本模型升级为会看图、能搜索、可调用工具的增强版。 +--- + +## 工作方式 + +Fusion 的价值在于保留基础模型的手感,同时补齐它缺少的能力。基础模型继续负责推理、写作和代码生成;CCR 在需要时调用图像、搜索或 MCP 工具,把结果整理进上下文,再交给基础模型完成回答。 + +保存后的 Fusion 模型会像普通模型一样出现在路由和配置中。保存结果是一个可复用的新模型:把强文本模型升级成视觉模型,把稳定代码模型升级成可联网模型,也可以把 Agent 模型接入团队内部工具。 + +## 适用能力 + +- **内置图像能力**:让不支持多模态的模型拥有视觉能力,例如 `GLM-5.2 + GLM-5V-Turbo = GLM-5.2V`。 +- **内置联网搜索**:让模型获得实时检索能力,把最新信息带入上下文。 +- **自定义 MCP 工具**:把本地脚本、内部系统或远程服务包装成模型可调用的工具。 + +## 组合示例 + +用组合命名能让团队一眼看懂模型能力来源: + +- `GLM-5.2 + GLM-5V-Turbo = GLM-5.2V` +- `代码模型 + Web Search = 可检索最新资料的代码模型` +- `通用模型 + 自定义 MCP 工具 = 可访问内部系统的 Agent 模型` diff --git a/docs/src/content/docs/zh/configuration/observability.md b/docs/src/content/docs/zh/configuration/observability.md new file mode 100644 index 0000000..3d89243 --- /dev/null +++ b/docs/src/content/docs/zh/configuration/observability.md @@ -0,0 +1,27 @@ +--- +title: 日志&观测 +pageTitle: 日志&观测 +eyebrow: 详细配置 +lead: 在设置中开启请求日志和 Agent 观测,查看请求明细,并分析 Agent 的执行链路和性能。 +--- + +## 开启方式 + +到 **设置 → 日志与观测**: + +1. 打开 **请求日志**,记录当天经过 CCR 的请求明细。 +2. 打开 **Agent 观测**,让观测面板展示 Agent 的执行链路。 + +## 查看观测面板 + +观测面板用于查看 Agent 的执行链路和性能表现:每个步骤何时发生、调用了哪个工具、工具获得了什么结果、耗时多久、是否出错,以及后续步骤如何继续。 + +它可以帮助定位 Agent 卡住、工具结果异常、某一步耗时过长,或上下文流转不符合预期等问题。请求日志提供单条模型请求的请求体、响应体和错误信息。 + +## 请求日志 + +请求日志记录经过 CCR 的模型请求明细,包括请求时间、请求 ID、客户端、路径、请求模型、最终命中的供应商和模型、凭据、状态码、是否成功、耗时、token、成本估算,以及请求头、请求体、响应头、响应体和错误信息。 + +日志页支持按状态、供应商、模型、凭据、请求 ID、模型名、请求体或响应体筛选。单条记录会展示请求与响应的主要字段,包含 `request model`、`resolved provider`、`resolved model`、状态码、响应体、错误信息、耗时、token 和成本估算。 + +普通请求日志只保留本地当天的数据。以本地日期为界,进入第二天后,下一次读取或写入请求日志时会清理前一天的普通请求日志;它适合当日排查,不适合作为长期审计归档。 diff --git a/docs/src/content/docs/zh/configuration/overview.md b/docs/src/content/docs/zh/configuration/overview.md new file mode 100644 index 0000000..d7b4ff9 --- /dev/null +++ b/docs/src/content/docs/zh/configuration/overview.md @@ -0,0 +1,131 @@ +--- +title: 概览仪表盘 +pageTitle: 概览仪表盘 +eyebrow: 详细配置 +lead: 自定义 CCR 首页仪表盘,查看系统状态、账户余额、请求量、令牌、成本和模型分布。 +--- + +## 适用场景 + +| 场景 | 看什么 | +| --- | --- | +| 检查网关是否正常 | 系统状态、成功率、错误数、平均延迟 | +| 估算今日或近期消耗 | 请求数、输入 / 输出 / 缓存令牌、估算成本 | +| 比较上游使用情况 | 供应商分析、模型分布、客户端分析 | +| 关注账户额度 | 账户余额、套餐额度、剩余额度、账户状态 | +| 汇报或分享用量 | AI 用量年报、CCR 路由图、模型排行榜、消费小票等分享卡片 | + +## 时间范围 + +顶部的 `按时间查看用量` 控制所有依赖用量统计的组件。切换后,请求、令牌、成本、趋势、分布和分享卡片会按新的窗口重新聚合。 + +| 选项 | 统计窗口 | +| --- | --- | +| `今天` | 当前本地日期从 00:00 到现在,按小时分桶。 | +| `24 小时` | 最近 24 小时,按小时分桶。 | +| `7 天` | 最近 7 天,按天分桶。 | +| `30 天` | 最近 30 天,按天分桶。 | + +账户余额组件不按这个时间窗口重算,它展示供应商账户连接器最近一次获取到的快照。 + +## 编辑布局 + +点击右上角铅笔按钮进入编辑模式。编辑模式分为三栏: + +| 区域 | 作用 | +| --- | --- | +| 组件 | 左侧组件库,点击任一组件即可添加到当前仪表盘。 | +| 预览 | 中间布局预览。可以拖拽组件排序,也可以点击组件选中它。 | +| 组件属性 | 右侧属性面板,用于修改类型、数据、尺寸、样式或移除组件。 | + +常用操作: + +1. 添加组件:在左侧 `组件` 中点击组件模板。 +2. 调整顺序:在 `预览` 中拖拽组件。 +3. 调整尺寸:选中组件后拖动右侧、底部或右下角的缩放手柄。 +4. 修改数据:在 `组件属性` 里切换 `组件类型` 和 `数据`。 +5. 修改展示:在 `组件大小` 和 `样式` 中选择合适的布局。 +6. 保存结果:点击 `完成` 退出编辑模式;布局会保存在应用配置中。 +7. 恢复默认:编辑模式下点击 `重置布局`。 + +移除组件只会从概览布局中删除该卡片,不会删除请求日志、供应商、账户连接器或任何上游配置。如果所有组件都被移除,页面会显示 `未配置组件`。 + +## 组件目录 + +尺寸使用 `宽:高` 表示,宽高范围都是 `1` 到 `4`。概览网格在桌面端最多 4 列,在窄屏上会自动折叠。 + +| 组件 | 可选数据 | 默认尺寸 | 默认样式 | 可选样式 | +| --- | --- | --- | --- | --- | +| 状态组件 | 系统状态 | `4:1` | 时间线 | 时间线、紧凑 | +| 账户组件 | 所有账户或指定账户 | `4:2` | 卡片 | 卡片、紧凑、横条、圆环、半圆、弧形、内外圆 | +| 指标组件 | 请求、Token、成本 | `1:1` | 卡片 | 卡片、紧凑、柱状图、圆环 | +| 趋势组件 | 按时间查看用量 | `3:2` | 组合图 | 组合图、面积图、折线图、柱状图 | +| 活跃度组件 | Token 活跃度 | `4:2` | 热力图 | 热力图 | +| 构成组件 | Token 分布 / 模型分布 | Token 分布:`1:2`;模型分布:`2:2` | Token 分布:横条;模型分布:饼图 | 横条、堆叠、环形图、饼图 | +| 分析组件 | 客户端分析 / 供应商分析 | `2:2` | 表格 | 表格、紧凑 | +| 分享卡片 | AI 用量年报、CCR 路由图、模型排行榜、AI 燃料仪表、Token 日历海报、消费小票 | `1:4` | 卡片 | 卡片 | + +尺寸约束: + +| 规则 | 原因 | +| --- | --- | +| 分享卡片最小高度是 `1:4`。 | 导出图片使用竖版海报比例,需要足够高度。 | +| 账户组件在展示所有账户且使用“紧凑”样式时,最小尺寸是 `2:2`。 | 多账户列表需要保留可读空间。 | +| 旧版尺寸别名仍可被解析:`small` -> `1:1`,`medium` / `large` -> `2:2`,`wide` -> `3:2`,`full` -> `4:1` 或 `4:2`。 | 用于兼容旧配置。 | + +## 指标数据 + +`metric` 组件通过 `metric` 字段选择要展示的指标。 + +| `metric` | 含义 | +| --- | --- | +| `requests` | 请求数 | +| `total-tokens` | 总令牌 | +| `input-tokens` | 输入令牌 | +| `output-tokens` | 输出令牌 | +| `cache-tokens` | 缓存令牌 | +| `cache-ratio` | 缓存率 | +| `estimated-cost` | 估算成本,按模型价格信息计算 | +| `success-rate` | 成功率 | +| `errors` | 错误数 | +| `avg-latency` | 平均延迟 | + +## 账户组件 + +账户组件读取供应商配置里的账户 / 用量连接器。要让它显示余额或剩余额度,需要先在供应商配置中启用并测试 `获取用量`。 + +| 数据选择 | 行为 | +| --- | --- | +| `所有账户` | 展示所有可用账户快照。 | +| 指定账户 | 只展示某个供应商或某个凭据的账户快照。内部配置值格式通常是 `provider` 或 `provider::credentialId`。 | + +如果账户组件为空,优先检查: + +1. 供应商是否配置了账户 / 用量连接器。 +2. `获取用量` 测试是否成功。 +3. API Key 或账户接口是否仍有效。 +4. 当前选择的指定账户是否已经被删除或重命名。 + +## 分享卡片 + +分享卡片组件可以通过右上角下载按钮导出 PNG。桌面 App 会优先使用原生导出能力,浏览器环境会退回到前端 canvas 导出。导出图片尺寸为 `1080 x 1350`。 + +| 卡片 | `type` | 内容 | +| --- | --- | --- | +| AI 用量年报 | `share-usage-wrapped` | 总令牌、请求数、估算成本、缓存率、最长连续、最高频模型、最高频供应商、峰值日期。 | +| CCR 路由图 | `share-route-map` | 客户端到供应商 / 模型的主要路由关系,以及客户端、供应商、模型数量。 | +| 模型排行榜 | `share-model-leaderboard` | 按令牌排序的模型排行榜。 | +| AI 燃料仪表 | `share-fuel-cockpit` | 最多 3 个账户额度仪表,依赖账户 / 用量连接器。 | +| Token 日历海报 | `share-token-calendar` | 类似贡献日历的 Token 活跃度海报。 | +| 消费小票 | `share-spend-receipt` | 当前时间范围内的估算成本、请求、令牌、延迟和成功率小票。 | + +## 数据来源与排障 + +| 现象 | 可能原因 | 处理方式 | +| --- | --- | --- | +| 请求、令牌或成本为 0 | 当前时间范围内没有经过 CCR 的请求,或用量捕获尚未记录。 | 切换到 `24h` / `7d`,确认客户端请求确实走 CCR。 | +| 成本显示为 `$0.00` | 模型没有价格信息,或用量过小。 | 检查模型目录和供应商模型名是否能匹配价格;低于 0.01 美元会显示更多小数。 | +| 成功率、错误数不符合预期 | 只统计 CCR 捕获到的请求结果。 | 对照日志页面中的请求记录。 | +| 账户余额为空 | 没有账户连接器,或 `获取用量` 失败。 | 到供应商配置中测试账户 / 用量字段映射。 | +| 分布图没有数据 | 请求日志里缺少模型、供应商或 token 信息。 | 确认请求经过 CCR,并检查上游响应是否返回 token usage。 | +| PNG 导出失败 | 浏览器不支持 canvas 导出、元素尺寸为空,或用户取消了保存。 | 在桌面 App 中重试,确保卡片可见且没有被缩到过小。 | diff --git a/docs/src/content/docs/zh/configuration/profile.md b/docs/src/content/docs/zh/configuration/profile.md new file mode 100644 index 0000000..6a7c91c --- /dev/null +++ b/docs/src/content/docs/zh/configuration/profile.md @@ -0,0 +1,128 @@ +--- +title: Agent配置 +pageTitle: Agent配置 +eyebrow: 详细配置 +lead: 为 Claude Code、Codex、ZCode 创建可复用的启动配置,并通过不同配置打开不同的 Agent 实例。 +--- + +## 配置流程 + +1. 先在 **供应商配置** 中添加至少一个可用供应商和模型,或先创建需要使用的 Fusion 模型。 +2. 打开 **Agent配置**,点击 **添加配置**。 +3. 选择 Agent 类型,填写配置名称,并选择作用范围和入口模式。 +4. 选择模型。模型值通常是 `供应商名称/模型名称`,也可以选择 Fusion 模型。 +5. 如果入口模式包含 App,可以绑定 Bot,并选择是否转发 Agent 消息或开启接力。 +6. 保存后,从 Agent配置卡片打开:终端图标会复制 CLI 命令,播放图标会启动 App 实例。 + +试用阶段建议选择 **仅从 CCR 打开时生效**,并且总是从 CCR 打开 Agent。这样配置只影响 CCR 启动的实例,不会改掉你系统里原本直接打开的 Claude Code、Codex 或 ZCode。 + +## 多开机制 + +每个 Agent配置都有自己的 `id` 和名称。CCR 打开 Agent 时会按名称或 `id` 找到启用的配置,再根据配置生成对应的启动计划。 + +| 机制 | 实际行为 | +| --- | --- | +| 独立配置文件 | 选择“仅从 CCR 打开时生效”时,Claude Code 和 Codex 会写入 CCR 管理的独立配置目录,路径按配置 `id` 区分 | +| 独立启动器 | Claude Code 使用独立启动包装器,Codex 和 ZCode 使用独立中间层启动器,文件名同样按配置 `id` 或名称区分 | +| 独立 App 数据目录 | 从 App 打开时,Claude App、ChatGPT(Codex 桌面端的新名称)、ZCode App 都会使用按配置 `id` 区分的用户数据目录 | +| 运行状态 | CCR 按打开入口和配置 `id` 记录运行中的 App 实例;同一个配置再次打开会激活已有窗口,不同配置可以打开不同实例 | + +这意味着你可以为同一个 Agent 建多个配置,例如“Claude Code - 工作项目”“Claude Code - 测试模型”“Codex - Fusion 图像能力”。它们可以选择不同模型、不同作用范围和不同 Bot,打开后就是不同的 Agent 实例。 + +## 常用选项 + +| 选项 | 适用范围 | 说明 | +| --- | --- | --- | +| Agent | 全部 | 选择 Claude Code、Codex 或 ZCode。ZCode 只支持 App。 | +| 配置名称 | 全部 | 用于在 CCR 中识别配置,也会作为 `ccr <配置名称>` 的打开目标。名称可以有空格,复制命令时 CCR 会自动加引号。 | +| 启用开关 | 全部 | 关闭后该配置不会出现在打开入口中,也不会被应用为有效启动配置。 | +| 作用范围 | 全部 | **仅从 CCR 打开时生效** 会使用 CCR 管理的独立配置;**系统默认** 会写入对应 Agent 的默认配置。同一个 Agent 同时只能有一个启用的系统默认配置。 | +| 入口模式 | Claude Code、Codex | `CLI & APP` 同时显示 CLI 和 App 打开入口;`CLI only` 只生成 CLI 命令;`App only` 只显示 App 打开入口。 | +| 模型 | 全部 | 该 Agent 打开后的默认模型,可以选择普通供应商模型或 Fusion 模型。Claude Code 留空表示保留 Claude Code 默认模型。 | +| Bot | App 入口 | 只有从 CCR 打开的 App 模式会转发 Bot 消息。CLI 当前不转发 Bot 消息。 | +| 环境变量 | 全部 | 为该配置注入额外环境变量。Claude Code 默认带 `CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1`,用于启用网关模型发现。 | + +## 各 Agent 的配置项 + +### Claude Code + +| 配置项 | 作用 | +| --- | --- | +| 模型覆盖 | 写入 Claude Code 使用的 `ANTHROPIC_MODEL`。留空时不覆盖 Claude Code 自己的默认模型。 | +| 小模型 | 写入 `ANTHROPIC_SMALL_FAST_MODEL`,供 Claude Code 的轻量任务使用。留空时保留 Claude Code 默认值。 | +| 设置文件 | 系统默认模式使用 Claude Code 默认设置文件;仅从 CCR 打开时生效会在 CCR 配置目录下按 Agent配置 `id` 生成独立设置文件。 | +| 环境变量 | 会合并到 Claude Code 设置文件的 `env` 中。CCR 同时写入网关地址、API Key helper 和启动包装器。 | +| Bot | 只在 Claude App 入口生效,可选择已保存 Bot,并配置转发 Agent 消息或接力。 | + +Claude Code CLI 从 CCR 打开后,会通过 CCR 网关获取模型发现信息。进入 Claude Code CLI 后可以输入 `/model` 查看并切换 CCR 暴露的模型列表,包括普通供应商模型和可见的 Fusion 模型。 + +Claude App 是 **零配置(zero-config)**:从 CCR 桌面 App 打开 Claude App 时,CCR 会自动写入 Claude App 网关配置、API Key、模型发现列表和独立用户数据目录。用户不需要增加额外操作,直接使用 CCR 打开就会自动完成所有必要配置;如果 Claude App 已经打开,按提示重启或从 CCR 重新打开即可。 + +Claude App 和 Claude Code CLI 的模型列表适配方式不同: + +| 入口 | 模型列表来源 | 说明 | +| --- | --- | --- | +| Claude Code CLI | CCR 网关模型发现 | CLI 内使用 `/model` 查看列表;选择后请求仍走 CCR 的供应商、路由和 Fusion。 | +| Claude App | CCR 生成的 Claude App inference models | Claude App 需要 Claude 兼容的模型名。CCR 会把 `供应商/模型` 和 Fusion 模型映射成 Claude App 可识别的模型项,并用显示名称保留真实模型含义。 | + +### Codex + +| 配置项 | 作用 | +| --- | --- | +| Provider ID | 写入 Codex 的 `model_provider`,默认是 `claude-code-router`。建议保持稳定,只使用字母、数字、点、下划线或短横线。 | +| Provider name | Codex 中展示的供应商名称,默认是 `Claude Code Router`。 | +| Codex model | 写入 Codex 默认模型。可以选择普通供应商模型或 Fusion 模型;留空时 CCR 使用可用模型中的默认值。 | +| Show all sessions | 让 Codex 显示所有会话。ZCode 不提供该项。 | +| 配置文件 | 默认是 `~/.codex/config.toml`。仅从 CCR 打开时生效会写入 CCR 管理的独立配置目录。 | +| 环境变量 | 注入 Codex CLI 或 ChatGPT。Claude Code 专用的模型发现变量不会传给 Codex。 | +| Bot | 只在 ChatGPT App 入口生效。 | + +保存后,Codex CLI 使用配置卡片里的终端图标复制命令,例如 `ccr "Codex - Work"`。ChatGPT 使用播放图标打开。CCR 按照 CodexL 的启动方式,直接运行 ChatGPT App bundle 内的 Electron 可执行文件,为它设置隔离的用户数据目录,并把 `CODEX_CLI_PATH` 指向 CCR 中间层。中间层把 app-server 流量转发给 ChatGPT 内置的 Codex CLI,只适配账号展示:隔离目录已有有效 ChatGPT token 时显示真实账号;没有凭据时使用无 token、ChatGPT 形态的虚拟工作区身份,让桌面端在不保存真实用户登录的情况下仍可使用模型选择。为让原生 app-server 选择官方 API marketplace,CCR 只在进程启动阶段创建精确的 `ccr-local-profile` 引导标记,收到第一条原生响应后立即删除;正常启动后或异常退出时也会清理,不会把它保留成登录状态。其他认证文件全部保留。旧版 `Codex.app` 仍然兼容。 + +模型和公共插件列表不再由中间层合成。原生 Codex app-server 读取生成的 `model_catalog_json`,并原样处理 `model/list` 与公共 `plugin/list` 请求,因此 Codex 可以自行联网刷新官方公开 [`openai/plugins`](https://github.com/openai/plugins) Git marketplace。虚拟 workspace 中,只有必须使用真实 ChatGPT 鉴权的账号私有 marketplace 请求会得到明确空结果,绝不会用本地插件替代。下载后的 Git checkout 只作为 Codex 自己的常规 last-known-good 数据,CCR 不会拿它替代远端目录。 + +### ZCode + +| 配置项 | 作用 | +| --- | --- | +| Provider ID | 写入 ZCode 供应商引用,默认是 `claude-code-router`。 | +| Provider name | ZCode 中展示的供应商名称,默认是 `Claude Code Router`。 | +| ZCode model | ZCode App 打开后的默认模型。可以选择普通供应商模型或 Fusion 模型。 | +| 配置文件 | 默认是 `~/.zcode/cli/config.json`,CCR 还会写入 ZCode v2 配置和模型缓存。 | +| 环境变量 | 注入 ZCode App 和中间层启动器。 | +| Bot | 只在 ZCode App 入口生效。 | + +ZCode 只支持 App 打开,因此入口模式固定为 `App only`,也不会显示 `Show all sessions`。 + +## CLI 与 App 模式区别 + +| 模式 | 如何打开 | 适合场景 | 主要差异 | +| --- | --- | --- | --- | +| CLI | 点击终端图标复制命令,然后在终端运行 `ccr <配置名称>` | 在项目目录中运行 Agent、需要 shell 工作流、需要把命令放进脚本 | 使用对应配置的包装器或中间层启动;通常不启动桌面窗口;当前不转发 Bot 消息。 | +| App | 点击播放图标从 CCR 桌面 App 启动 | 需要桌面窗口、多实例并存、Bot 消息转发或接力 | 每个 Agent配置使用独立用户数据目录;同一配置重复打开会激活已有窗口,不同配置可以并行打开。 | +| CLI & APP | 同一个配置同时提供 CLI 和 App 入口 | 同一套模型配置既用于终端,也用于桌面 App | 两个入口共用配置名称、模型、作用范围和环境变量,但启动方式不同。 | + +## 各 Agent 的差异 + +### Claude Code + +Claude Code CLI 配置会写入设置文件。选择“仅从 CCR 打开时生效”时,CCR 会在自己的配置目录下为这个 Agent配置生成独立设置文件,并通过独立启动包装器打开 Claude Code。 + +从桌面 App 打开 Claude App 时,CCR 还会为该配置准备独立用户数据目录。不同 Agent配置使用不同目录,因此可以同时打开多个 Claude App 实例。 + +### Codex + +Codex 配置会写入 `config.toml`,并生成模型目录文件。选择“仅从 CCR 打开时生效”时,CCR 会把这些文件放在按配置 `id` 区分的目录中。 + +Codex 支持 CLI 和 App。CLI 会通过对应配置的启动器打开;App 会启动 ChatGPT、使用独立用户数据目录,并把当前配置中的模型和供应商信息带入 App。 + +### ZCode + +ZCode 只支持 App 打开。CCR 会根据 ZCode home 或自定义配置文件写入 ZCode 的 CLI 配置、v2 配置和模型缓存,并在 App 启动时使用当前 Agent配置的模型、供应商和独立用户数据目录。 + +## 多开建议 + +1. 为每个需要独立运行的 Agent 实例创建一个 Agent配置。 +2. 试用阶段优先选择“仅从 CCR 打开时生效”,避免影响系统默认 Agent。 +3. 需要桌面窗口并存时,把入口模式设为 `App only` 或 `CLI & APP`,然后从 CCR 打开 App。 +4. 如果同一个配置已经在运行,再次打开会激活已有窗口;需要第二个实例时,创建另一个 Agent配置。 diff --git a/docs/src/content/docs/zh/configuration/provider-deeplink.md b/docs/src/content/docs/zh/configuration/provider-deeplink.md new file mode 100644 index 0000000..a281471 --- /dev/null +++ b/docs/src/content/docs/zh/configuration/provider-deeplink.md @@ -0,0 +1,303 @@ +--- +title: 一键导入供应商 +pageTitle: 一键导入供应商 +eyebrow: 详细配置 +lead: 快速添加常见模型供应商,确认无误后即可保存,减少手动配置的繁琐步骤。 +--- + +## 一键导入 + +选择下面的供应商即可开始添加。CCR 会先显示即将添加的内容,确认无误后再保存;使用自定义入口时,请确保来源可信。 + + + +## 嵌入式按钮组件 + +CCR 也提供了一个无框架的按钮脚本,供应商可以嵌入到自己的网页,让用户一键把该供应商导入 CCR。脚本会自动注册 Web Components。 + +### HTML 写法 + +```html + + + +``` + +如果配置较大,可以只传 manifest: + +```html + + + +``` + +### JS 写法 + +```html +
+ + +``` + +### render 参数 + +`CCRProviderButtons.render(target, options)` 和 `` 支持同一组参数,参数名与 `ccr://provider` 协议保持一致: + +| 参数 | 说明 | +| --- | --- | +| `name` | Provider 展示名称 | +| `base_url` | Provider API Base URL,直链导入时必填 | +| `api_key` | 可选 Provider API Key | +| `protocol` | 协议类型,支持 `openai_chat_completions`、`openai_responses`、`anthropic_messages`、`gemini_generate_content`、`gemini_interactions` | +| `models` | 模型列表。HTML 中用逗号或换行分隔,JS 中可传字符串或数组 | +| `icon` | Provider 图标 URL | +| `source` | Provider 官网或配置来源 | +| `manifest` | 远程 manifest URL。传入后按钮会生成 manifest 导入链接 | +| `payload` | JSON 或 base64url JSON 配置。JS 中也可以传对象 | +| `usage_url` | 可选账号用量接口 | +| `fetch_usage` | 是否启用账号用量读取 | +| `usage_method` | 用量接口请求方法,`GET` 或 `POST` | +| `usage_headers` | 用量接口请求头。JS 中可传对象,HTML 中传 JSON 字符串 | +| `usage_body` | 用量接口请求体。JS 中可传对象,HTML 中传 JSON 字符串 | +| `balance` | 余额字段路径 | +| `balance_unit` | 余额单位 | +| `subscription` | 订阅剩余额度字段路径 | +| `subscription_limit` | 订阅总额度字段路径 | +| `subscription_reset` | 订阅重置时间字段路径 | +| `subscription_unit` | 订阅额度单位 | +| `subscription_window` | 订阅窗口,例如 `monthly` | + +## 协议格式 + +CCR 支持两种写法,推荐使用 host 写法: + +```text +ccr://provider?name=Example%20AI&base_url=https%3A%2F%2Fapi.example.com%2Fv1&protocol=openai_chat_completions&models=example-chat%2Cexample-coder +``` + +路径写法也可以被识别: + +```text +ccr:///provider?name=Example%20AI&base_url=https%3A%2F%2Fapi.example.com%2Fv1 +``` + +如果配置较大,可以把 JSON 放入 `payload` 参数。值可以是 URL 编码 JSON,也可以是 base64url JSON: + +```text +ccr://provider?payload=%7B%22name%22%3A%22Example%20AI%22%2C%22base_url%22%3A%22https%3A%2F%2Fapi.example.com%2Fv1%22%2C%22models%22%3A%5B%22example-chat%22%5D%7D +``` + +## Manifest 导入 + +供应商也可以只传一个 manifest URL: + +```text +ccr://provider?manifest=https%3A%2F%2Fexample.com%2Fccr-provider.json +``` + +Manifest 必须使用 HTTPS,返回 JSON,不能指向本地或内网地址,体积不能超过 128 KB。CCR 会在 App 内拉取 manifest,展示确认页,然后再写入配置。 + +Manifest 可以把供应商信息放在顶层 `provider` 对象中: + +| 字段 | 说明 | +| --- | --- | +| `provider.name` | Provider 展示名称 | +| `provider.base_url` | Provider API Base URL,必填 | +| `provider.protocol` | 协议类型 | +| `provider.models` | 模型列表,字符串数组 | +| `provider.icon` | Provider 图标 URL | +| `provider.source` | Provider 官网或配置来源 | +| `provider.account.enabled` | 是否启用账号用量读取 | +| `provider.account.refreshIntervalMs` | 用量刷新间隔,单位毫秒 | +| `provider.account.connectors` | 用量读取 connector 列表 | +| `provider.account.connectors[].type` | Connector 类型,常用 `http-json` | +| `provider.account.connectors[].auth` | 认证方式,常用 `provider-api-key` | +| `provider.account.connectors[].endpoint` | 用量接口 URL | +| `provider.account.connectors[].method` | 请求方法,`GET` 或 `POST` | +| `provider.account.connectors[].headers` | 请求头,不能包含敏感认证头 | +| `provider.account.connectors[].body` | 可选请求体 | +| `provider.account.connectors[].mapping.meters` | 用量指标映射列表 | + +完整 manifest 示例: + +```json +{ + "provider": { + "name": "Example AI", + "base_url": "https://api.example.com/v1", + "protocol": "openai_chat_completions", + "models": ["example-chat", "example-coder"], + "icon": "https://example.com/icon.png", + "source": "https://example.com", + "account": { + "enabled": true, + "refreshIntervalMs": 300000, + "connectors": [ + { + "type": "http-json", + "auth": "provider-api-key", + "endpoint": "https://api.example.com/v1/account/usage", + "method": "GET", + "headers": { + "accept": "application/json" + }, + "mapping": { + "meters": [ + { + "id": "balance", + "kind": "balance", + "label": "Balance", + "remaining": "data.balance.remaining", + "unit": "USD" + }, + { + "id": "subscription", + "kind": "subscription", + "label": "Monthly quota", + "remaining": "data.quota.remaining", + "limit": "data.quota.limit", + "resetAt": "data.quota.reset_at", + "unit": "tokens", + "window": "monthly" + } + ] + } + } + ] + } + } +} +``` + +## 支持的参数 + +| 参数 | 说明 | +| --- | --- | +| `name` | Provider 展示名称 | +| `base_url` | Provider API Base URL,必填 | +| `api_key` | 可选 Provider API Key | +| `protocol` | 协议类型,支持 `openai_chat_completions`、`openai_responses`、`anthropic_messages`、`gemini_generate_content`、`gemini_interactions` | +| `models` | 模型列表,支持逗号或换行分隔,也可以重复传入 | +| `icon` | Provider 图标 URL | +| `source` | Provider 官网或配置来源 | +| `manifest` | 远程 manifest URL | +| `payload` | JSON 或 base64url JSON 配置 | +| `usage_url` | 可选账号用量接口 | +| `fetch_usage` | 是否启用账号用量读取 | +| `usage_method` | 用量接口请求方法,`GET` 或 `POST` | +| `usage_headers` | 用量接口请求头,JSON 字符串 | +| `usage_body` | 用量接口请求体,JSON 字符串 | +| `balance` | 余额字段路径 | +| `balance_unit` | 余额单位 | +| `subscription` | 订阅剩余额度字段路径 | +| `subscription_limit` | 订阅总额度字段路径 | +| `subscription_reset` | 订阅重置时间字段路径 | +| `subscription_unit` | 订阅额度单位 | +| `subscription_window` | 订阅窗口,例如 `monthly` | + +参数名和协议值必须使用上表中的完整规范名。不再接受 `baseUrl`、`apiKey`、`model`、`type` 或 `openai` 等别名。 diff --git a/docs/src/content/docs/zh/configuration/provider.md b/docs/src/content/docs/zh/configuration/provider.md new file mode 100644 index 0000000..292ce5e --- /dev/null +++ b/docs/src/content/docs/zh/configuration/provider.md @@ -0,0 +1,170 @@ +--- +title: 供应商配置 +pageTitle: 供应商配置 +eyebrow: 详细配置 +lead: 配置 CCR 的上游模型服务,包括协议、基础 URL、模型列表和凭据。 +--- + +## 导入本机 Agent 登录态 + +添加供应商时,CCR 会扫描本机已有的 Agent 登录状态。检测到可复用凭据后,添加弹窗会显示对应导入入口。导入会创建一个普通供应商和配套 provider plugin,让 CCR 复用本机 Agent 授权访问上游服务,不需要再手动粘贴常规 API Key。 + +### Claude Code + +Claude Code 导入会读取本机 Claude Code OAuth 凭据。检测到可用 access token 时,可以导入为 `Claude Code API` 供应商。 + +导入后: + +1. 协议使用 `anthropic_messages`。 +2. 默认模型包含 `claude-sonnet-4-20250514`,后续可以在供应商模型列表中增减模型。 +3. CCR 会创建 OAuth provider plugin,把请求认证转换为 Claude Code 登录态。 +4. 账号用量会使用 Anthropic OAuth 用量接口,适合在供应商列表、托盘或账号面板里查看额度状态。 + +如果只检测到登录痕迹但没有可用 access token,导入入口会显示不可导入原因。此时先在 Claude Code 中重新登录,再回到 CCR 添加供应商。 + +### Codex + +Codex 导入会读取本机 Codex 登录文件和模型缓存。检测到 Codex access token 或 refresh token 时,可以导入为 `Codex API` 供应商。 + +导入后: + +1. 协议使用 `openai_responses`。 +2. API 地址指向 Codex 后端,默认模型至少包含 `gpt-5-codex`,也会合并本机模型缓存中的模型和显示名。 +3. CCR 会创建 Codex OAuth provider plugin,并在需要时刷新访问凭据。 +4. 账号用量会读取 Codex 额度、余额和 token 统计接口。 + +导入后可以直接在路由或 Agent配置中选择 `Codex API/模型名`。如果模型缓存较旧,可以先打开 Codex 让它刷新模型列表,再回到 CCR 重新导入或编辑模型。 + +### ZCode + +ZCode 导入会读取本机 ZCode 配置中的供应商 API Key、API 地址和模型列表。只有检测到可用供应商 Key 和 Base URL 时,才能导入为 `ZCode API` 供应商。 + +导入后: + +1. 协议使用 `anthropic_messages`。 +2. 模型优先来自 ZCode 本机配置;没有配置时会使用 ZCode 运行缓存或默认模型。 +3. CCR 会创建 API Key provider plugin,把 ZCode 本机配置中的 Key 用于请求认证。 +4. 如果 API 地址命中 CCR 内置预设,账号用量配置会复用对应预设。 + +如果只检测到 ZCode 登录态,但没有检测到可用供应商 API Key,导入入口会显示不可导入。此时需要先在 ZCode 中配置可用模型供应商,再回到 CCR 添加供应商。 + +## 主字段 + +| 字段 | 代表的能力 | +| --- | --- | +| 选择 预设供应商 | 套用 CCR 内置供应商模板,包括默认 API 地址、可用协议、默认模型、图标、官网链接和部分供应商的用量读取配置。选择 `其他 / 自定义 API 地址` 时,可以接入任意兼容 OpenAI、Anthropic 或 Gemini 协议的上游服务。 | +| 名称 | CCR 内部显示名,也是路由、模型选择、日志和配置中识别供应商的名字。名称必须唯一,建议短且稳定。 | +| API 地址 | 上游 API Base URL。它决定请求实际发往哪里,也用于协议探测、模型列表探测、图标探测和安全校验。预设供应商添加时默认隐藏该字段,可在高级设置里覆盖。自定义供应商必须填写。 | +| API 密钥 | 默认供应商凭据。没有配置凭据池时,模型请求会使用这条 Key;协议探测、模型探测、连通性检测和默认用量读取也会使用它。只填写由当前 API 地址对应供应商签发的 Key。 | +| 模型 | 暴露给 CCR 的模型 ID 列表。路由规则、Profile 模型选择、模型目录和客户端 `/models` 响应都会基于这里的模型。 | +| 搜索模型 / 全部 / 清除 | 当 CCR 能从上游或模型目录拿到模型列表时,可以搜索、全选、清除并勾选模型。勾选结果会保存到供应商的模型列表。 | +| 自定义模型 | 手动添加没有被探测出来的模型 ID。适合供应商没有 `/models` 接口,或新模型还未进入模型目录的情况。 | +| 检测连通性 | 用当前 API 地址、API 密钥、协议和所选模型发送真实测试请求。它可以验证 Key、模型名和协议是否真的可调用。 | +| 要检测的模型 | 连接检查确认弹窗中的模型选择。用于控制只测试部分模型,避免一次性检查全部模型造成额外消耗。 | +| 检测结果 | 展示每个模型是否可用、命中的协议和上游返回的诊断信息。可用结果不会自动增加模型,仍以弹窗主表单中的模型选择为准。 | + +## 连通性检测 + +`检测连通性` 会对你选择的模型发送真实的模型请求,用来确认 API 地址、API 密钥、协议和模型 ID 是否可用。检测请求会限制输出长度,但仍然可能产生额外 token 消耗或计入供应商侧请求次数。 + +如果供应商按请求、输入 token 或输出 token 计费,建议只勾选需要确认的模型,不要一次性检查全部模型。检测结果只用于诊断连通性,不会自动修改模型列表或用量读取配置。 + +## 凭据 + +`API 密钥` 是最简单的单 Key 配置。需要管理多条上游 Key 时,展开“高级设置”中的“凭据池”。 + +| 字段 | 代表的能力 | +| --- | --- | +| 显示凭据配置 | 展开或收起凭据池配置。未展开不影响已保存的凭据,只是隐藏编辑区域。 | +| 导入 JSON | 从 JSON 文件批量导入凭据。支持顶层数组,或对象中的 `credentials`、`keys`、`apiKeys` 数组。 | +| 添加 Key | 新增一条上游 API Key。 | +| 启用 | 控制单条凭据是否参与请求转发和用量读取。关闭后保留配置,但不会被选中。 | +| 名称 | 单条凭据的显示名。会出现在账号用量、日志和内部诊断里,建议写成可识别的用途或额度来源。 | +| API 密钥 | 该凭据实际发送给上游的 Key。配置了凭据池后,CCR 会把启用的凭据展开成多个内部上游目标,并优先使用凭据池中的 Key。主表单的默认 `API 密钥` 只作为单 Key 配置使用。 | +| 移除 | 删除当前凭据行。 | +| Key 高级选项 | 展开单条凭据的调度和限额字段。 | +| 优先级 | 凭据优先级,数字越小越优先。未填写时按凭据行顺序作为优先级。 | +| 权重 | 同优先级、相近使用率下的排序权重,数字越大越优先。未填写时为 `1`。 | +| 限制 JSON | 该 Key 的本地限额规则。CCR 会按请求、tokens 或图片数量统计窗口使用量,达到上限后自动跳过该 Key,尝试同供应商的其他可用 Key。 | + +`限制 JSON` 支持的常用字段: + +| 字段 | 含义 | +| --- | --- | +| `rpm` / `rph` / `rpd` | 每分钟 / 每小时 / 每天最多请求数 | +| `tpm` / `tph` / `tpd` | 每分钟 / 每小时 / 每天最多 tokens | +| `ipm` / `iph` / `ipd` | 每分钟 / 每小时 / 每天最多图片数 | +| `maxRequests` + `windowMs` | 自定义时间窗口内最多请求数 | +| `maxTokens` + `quotaWindowMs` | 自定义时间窗口内最多 tokens | + +示例: + +```json +{ + "rpm": 60, + "tpm": 100000 +} +``` + +凭据池的作用是“上游 Key 池”,不同于“API 密钥”页面里的 CCR 客户端访问 Key。前者控制 CCR 调用供应商时使用哪个 Key,后者控制客户端访问 CCR 时使用哪个 Key。 + +## 用量读取 + +“获取用量”用于让 CCR 在供应商列表、托盘或账号面板中展示余额、套餐额度、状态和错误信息。它不会影响模型是否能请求,只影响账号用量展示。 + +| 字段 | 代表的能力 | +| --- | --- | +| 获取用量 | 启用或关闭该供应商的账号用量读取。关闭后不请求用量接口。 | +| 用量模式 | 用量读取方式。`标准用量端点` 使用 CCR 标准账号端点;`HTTP JSON 请求` 手动配置一个 JSON 接口;`原始连接器 JSON` 直接编辑 connector 数组。 | +| 刷新间隔(毫秒) | 用量刷新间隔,单位毫秒。未填写时使用默认刷新间隔,最小有效间隔为 30000ms。 | + +### 标准用量端点 + +该模式会尝试供应商侧的 CCR 标准账号端点,例如 `/.well-known/ccr/account` 和 `/v1/account/limits`。适合已经适配 CCR 标准格式的供应商或内置预设。 + +### HTTP JSON 请求 + +该模式适合供应商已有自己的余额或额度接口,且返回自定义 JSON 格式的情况。 + +| 字段 | 代表的能力 | +| --- | --- | +| 方法 | 用量请求方法,支持 `GET` 或 `POST`。 | +| 用量请求 URL | 用量接口地址。可以是完整 URL。请求会附带供应商 API Key,除非在 raw connector 中改成其他认证方式。 | +| 请求头 | 用量接口需要的额外请求头。不要在这里写固定的敏感认证头,优先使用供应商 API Key 认证。 | +| 请求体 | `POST` 请求体,必须是合法 JSON。 | +| 余额剩余字段 | 余额剩余值在响应 JSON 中的路径。 | +| 余额总额字段 | 余额总量或充值总额在响应 JSON 中的路径。 | +| 余额已用字段 | 已用余额在响应 JSON 中的路径。 | +| 余额单位 | 余额单位,例如 `USD`、`CNY` 或 `%`。 | +| 订阅剩余字段 | 套餐、订阅、tokens 或配额剩余量路径。 | +| 订阅上限字段 | 套餐、订阅、tokens 或配额总量路径。 | +| 订阅重置字段 | 套餐重置时间路径。可以返回 ISO 时间,也可以返回秒级或毫秒级时间戳。 | +| 订阅单位 | 套餐单位,例如 `tokens`、`requests`、`hours`。 | +| 状态字段 | 账号状态路径。支持 `ok`、`warning`、`critical`、`error`、`unsupported`。 | +| 消息字段 | 账号提示信息路径。适合展示供应商返回的错误、套餐说明或风控提示。 | +| 测试用量请求 | 立即请求用量接口并解析映射结果,方便在保存前验证字段路径。 | +| 响应字段 | 测试后列出响应 JSON 中可选字段。点击 `余额剩余`、`余额总额`、`余额已用`、`订阅剩余`、`订阅上限`、`重置时间` 可以把该路径快速填入对应字段。 | + +字段路径支持 CCR 的轻量 JSONPath 语法: + +| 写法 | 说明 | +| --- | --- | +| `$` | 整个响应对象 | +| `$.balance.remaining` | 读取对象字段 | +| `$.items[0].value` | 读取数组下标 | +| `$["weird-key"]` | 读取包含特殊字符的字段名 | +| `$.limits[?(@.type=="TOKENS")].remaining` | 在数组中查找第一个满足简单等值条件的对象 | +| `100 - $.data.percentage` | 数值字段支持简单减法表达式,常用于把“已用百分比”转换成“剩余百分比” | + +### 原始连接器 JSON + +`连接器 JSON` 允许直接编辑 `account.connectors` 数组,适合需要更复杂能力的供应商。 + +| 连接器类型 | 能力 | +| --- | --- | +| `standard` | 使用 CCR 标准账号端点。 | +| `http-json` | 请求一个 JSON 接口,并用 mapping 字段映射余额、套餐、状态和消息。 | +| `plugin` | 调用已安装插件注册的账号用量 connector。 | +| `local-estimate` | 不请求远程接口,基于本地窗口配置展示估算额度。 | + +点击 `插入示例` 会填入一个包含 `standard`、`http-json`、`plugin` 和 `local-estimate` 的示例 connector 数组。 diff --git a/docs/src/content/docs/zh/configuration/routing.md b/docs/src/content/docs/zh/configuration/routing.md new file mode 100644 index 0000000..332eda9 --- /dev/null +++ b/docs/src/content/docs/zh/configuration/routing.md @@ -0,0 +1,196 @@ +--- +title: 路由配置 +pageTitle: 路由配置 +eyebrow: 详细配置 +lead: 设置请求如何选择模型,并在失败时通过 Fallback 自动重试或切换到备用模型。 +--- + +## 内置路由 + +### Claude Code + +Claude Code 内置路由的作用是识别 Claude Code 发来的请求,并把主请求路由到 Claude Code Agent 配置中的模型。 + +Claude Code **主请求** 使用 Claude Code Agent 配置中的模型;如果未设置,该内置路由不会生效。CCR 也会自动删除 Claude Code 注入的第一条 `x-anthropic-billing-header` system 消息,避免这类计费辅助消息影响后续路由判断。Claude Code 创建的 Subagent、Task 或 Workflow 内部 Agent 可以继续用下面的标签机制自动选择不同模型。 + +#### Subagent / Workflow 自动路由 + +Claude Code 的 Agent / Task / Workflow 可以派生新的模型请求。CCR 使用标签注入来让这些派生请求选择更合适的 CCR 模型: + +```text +供应商/模型 +``` + +完整流程如下: + +1. Claude Code 主请求命中内置路由后,CCR 会检查当前工具列表。 +2. 如果至少有一个模型配置了 **Description**,CCR 会把可用模型及其说明注入到 `Agent` / `Task` 工具说明和 `prompt` 字段说明里。 +3. 如果工具列表里有 `Workflow`,CCR 会给 Workflow 工具说明追加要求:workflow 内部创建 `Agent` / `Task` 时,每个派生 Agent 的 prompt 第一行都要带同样的模型标签。 +4. Claude Code 调用 `Agent` / `Task`,或 Workflow 内部创建 Agent 时,prompt 第一行会携带 `供应商/模型`。 +5. 派生请求进入 CCR 后,CCR 从 system 或前两条 user message 中提取并删除这个标签,然后把该请求路由到标签里的模型。 + +因此,Subagent / Workflow 的自动路由不是靠 `x-claude-code-agent-id` 之类的 Header 决定模型,而是靠 prompt 标签。Header 只能作为观测线索,真正的模型选择来自标签。 + +##### 与模型页配合 + +模型页里的 **Description** 是这套机制的开关和选择依据。没有任何模型 Description 时,CCR 不会注入 Agent / Task / Workflow 路由提示词,避免把空模型列表写进工具说明。 + +推荐配置步骤: + +1. 在 **供应商** 中添加可用模型,确认模型 ID 可以真实请求。 +2. 打开 **模型** 页面,为希望 Subagent 自动选择的模型填写 Description。说明要写清模型适合的任务、速度、成本和限制。 +3. 在 **Agent配置** 中启用 Claude Code 配置,并设置主模型。这个模型负责 Claude Code 主会话。 +4. 在 **路由** 页面确认 **Claude Code** 内置路由已启用。 +5. 在 Claude Code 中使用 Agent、Task 或 Workflow。需要派生 Agent 时,Claude Code 会根据模型 Description 选择一个 CCR 模型并写入标签。 + +Description 建议写成任务导向,而不是只写模型厂商名。例如: + +| 模型用途 | Description 示例 | +| --- | --- | +| 快速便宜模型 | 适合代码搜索、文件梳理、摘要、简单修改和低成本并行 Subagent。 | +| 强推理模型 | 适合复杂架构分析、大规模重构计划、跨文件推理和高风险代码审查。 | +| 长上下文模型 | 适合读取大量日志、长文档、仓库级上下文整理和 Workflow 汇总。 | + +保存后,CCR 会把这些 Description 组织成 “Configured CCR gateway models” 注入给 Claude Code。Claude Code 选择模型后,CCR 会在派生请求上看到 `builtin:claude-code-subagent`,并把标签里的模型作为最终 `resolved model`。 + +### Codex + +Codex 内置路由会为第三方或非 GPT 模型适配 Codex 的 `apply_patch` 文件编辑工具。目标是让这些模型通过 patch 工具完成文件修改,而不是生成 `cat >`、`sed -i`、`python`、`node` 等命令或脚本来编辑文件。 + +技术原理是做一次工具协议桥接:Codex 原生的 `apply_patch` 是 custom/freeform 工具,入参是原始 patch 文本;很多 OpenAI-compatible 三方模型更擅长普通 function tool。CCR 会在上游请求中把 `apply_patch` 转成 `virtual_apply_patch` function tool,并在工具说明里注入完整的 `apply_patch.lark` 语法,要求模型把 patch 写入 `patch` 字段。 + +模型返回 `virtual_apply_patch` 后,CCR 会把它转换回 Codex 期望的 `custom_tool_call`:`name = apply_patch`,`input = 原始 patch 文本`。CCR 不直接修改文件,真正执行 patch 的仍然是 Codex 客户端。这个适配跟随 **Codex** 内置路由启用或关闭,没有单独开关;GPT 命名模型继续使用 Codex 原生 freeform `apply_patch` 路径。 + +## 自定义路由 + +自定义路由在路由页的规则列表中配置。页面顶部的 **搜索路由规则** 可以按名称、条件、请求动作等文本过滤列表;右上角 **添加** 按钮打开 **添加路由规则** 弹窗。规则表格按 **名称**、**条件**、**请求动作**、**状态**、**操作** 展示每条规则。 + +自定义规则按列表顺序匹配,第一条命中的启用规则会改写请求。表格右侧的上移、下移按钮用来调整优先级,编辑按钮打开 **编辑路由规则**,删除按钮会先弹出确认框。**状态** 列的开关关闭后,规则保留在列表里,但不会参与匹配。 + +### 添加或编辑规则 + +弹窗里的字段和保存后的配置一一对应: + +| UI 字段 | 填写方式 | 保存后的含义 | +| --- | --- | --- | +| **名称** | 填一个便于识别的规则名。该字段不能为空。 | 显示在列表 **名称** 列,也参与搜索。 | +| **条件** | 选择 `request.header` 或 `request.body`,填写字段名、操作符和值。 | 生成 `condition.left`、`condition.operator` 和 `condition.right`。 | +| **改写请求参数** | 至少保留一行 rewrite。每行选择操作、目标 key 和需要的值。 | 生成 `rewrites`,规则命中后按行改写请求。 | +| **启用** | 打开或关闭规则。 | 控制 `enabled`,关闭时不会匹配。 | +| **失败时** | 配置这条规则自己的 Fallback。 | 规则命中后覆盖页面顶部的 **默认失败处理**。 | + +**添加** 或 **保存** 按钮只有在表单有效时才可点击:名称、条件字段、条件值都必须填写;每条 rewrite 都必须有 key。`删除` 操作只需要 key;`替换数组元素` 需要同时填写 **匹配值** 和 **值**;其他操作需要填写 **值**。 + +### 条件 + +**条件** 区域有四个输入:来源、字段、操作符和值。 + +| 来源 | 字段示例 | 实际匹配路径 | +| --- | --- | --- | +| `request.header` | `user-agent`、`x-api-key`、`x-client-name` | `request.header.user-agent` | +| `request.body` | `model`、`messages`、`messages.0.role`、`tools` | `request.body.model` | + +Header 名不区分大小写。Body 字段按点号路径读取,数字片段表示数组下标;例如 `messages.0.role` 读取第一条 message 的 role。对于 messages、tools 这类嵌套数组,通常用 `contains deep` 比固定下标更稳。 + +值输入框会按常见字面量解析:`true`、`false`、`null`、数字、JSON 对象或数组会按对应类型比较;其他内容按字符串处理。需要强制作为字符串时,可以写成 `"123"` 或 `'123'`。 + +| 操作符 | 用法 | +| --- | --- | +| `==` / `!=` | 比较实际值和输入值。数字会按数字比较,其他值按可比较文本比较。 | +| `>` / `>=` / `<` / `<=` | 两边都是数字时按数字比较,否则按文本顺序比较。 | +| `starts with` | 判断实际值是否以输入值开头,适合模型前缀分流。 | +| `contains` | 对字符串做包含判断;对数组只检查数组元素。 | +| `contains deep` | 递归检查对象和数组,适合在 `messages`、`tools` 中查找内容。 | +| `not contains` | `contains` 的反向判断。 | + +### 改写请求参数 + +**改写请求参数** 区域默认给出一行 `request.body.model`。这也是最常用的模型路由写法:选择 **设置**,key 填 `request.body.model`,值填目标 `供应商/模型` 或 Fusion 模型。 + +点击 **添加参数** 可以追加多行 rewrite;垃圾桶按钮删除当前行,最后一行不能删除。规则命中后,CCR 会按列表顺序应用这些 rewrite。 + +| 操作 | 需要填写 | 行为 | +| --- | --- | --- | +| **设置** | key、值 | 设置请求里的字段,例如 `request.body.model = provider/model` 或 `request.body.temperature = 0.2`。 | +| **删除** | key | 删除请求字段。删除 `request.header.x-test` 会移除对应 Header;删除 `request.body.foo` 会移除 body 字段。 | +| **追加到数组** | key、值 | 把值追加到目标数组末尾。目标不是数组时按空数组开始。 | +| **插入到数组开头** | key、值 | 把值插到目标数组开头。 | +| **从数组移除** | key、值 | 从目标数组中移除等于该值的元素。 | +| **替换数组元素** | key、匹配值、值 | 把数组中匹配 **匹配值** 的元素替换为新值。 | + +Rewrite 的值也会按字面量解析,所以 `0.2` 会变成数字,`true` 会变成布尔值,`{"type":"web_search"}` 会变成对象。只有 `request.body.model` 的值会额外按 CCR 的模型选择器格式规范化。 + +### 失败时 + +弹窗底部的 **失败时** 和页面顶部的 **默认失败处理** 是同一套控件。选择 **关闭** 时不降级;选择 **继续重试** 时会出现 **重试次数**;选择 **失败降级目标** 时会出现 **失败降级目标** 输入框和 **添加** 按钮。添加后的目标会以标签形式显示,标签上的上移、下移、移除按钮用于调整降级顺序。 + +规则命中时会使用这条规则自己的 **失败时** 设置;没有命中的请求才继续使用页面顶部的默认设置。 + +### 配置示例 + +| 目标 | 条件来源 | 字段 | 操作符 | 值 | 改写请求参数 | +| --- | --- | --- | --- | --- | --- | +| 按客户端 Header 分流 | `request.header` | `x-client-name` | `==` | `claude-code` | **设置** `request.body.model = 供应商/模型` | +| 按原始模型前缀分流 | `request.body` | `model` | `starts with` | `claude-` | **设置** `request.body.model = 供应商/模型` | +| 按消息内容分流到视觉模型 | `request.body` | `messages` | `contains deep` | `image` | **设置** `request.body.model = 视觉供应商/模型` | +| 删除调试 Header | `request.header` | `x-debug-route` | `==` | `1` | **删除** `request.header.x-debug-route` | + +保存后,规则会出现在列表中。请求日志里的 `request model`、`resolved provider`、`resolved model` 和路由原因可以用来确认规则是否命中。 + +## Fallback 处理 + +Fallback 处理请求失败后的降级。第一次选模型由路由完成;当前模型或上游失败时,Fallback 决定是否继续尝试。 + +路由页面顶部的 **默认失败处理** 是全局 Fallback。每条路由规则里的 **失败时** 是规则级 Fallback:当某条规则命中时,规则级配置会覆盖全局配置。 + +## Fallback 模式 + +| 模式 | 行为 | +| --- | --- | +| 关闭 | 不做失败降级,只请求一次当前模型 | +| 继续重试 | 继续请求当前模型,最多重试 `Retries` 次 | +| 失败降级目标 | 先请求当前模型,失败后按配置顺序切换到备用模型 | + +**继续重试** 适合上游偶发超时、限流或网络抖动。**失败降级目标** 适合主模型不可用时切到另一个模型或供应商。 + +## 失败触发条件 + +网络错误会进入下一次尝试。状态码是否触发 Fallback 取决于模式: + +| 模式 | 触发状态码 | +| --- | --- | +| 继续重试 | `408`、`409`、`429`、`5xx` | +| 失败降级目标 | 任意 `4xx` 或 `5xx` | + +进入下一次尝试前,CCR 会对每个触发 Fallback 的失败进行等待,包括网络错误。上游提供正数 `Retry-After` 时会优先遵守;否则使用从 1 秒开始、单次最多 30 秒的指数退避。 + +**失败降级目标** 对 `4xx` 也会切换,是因为模型不存在、鉴权或供应商侧拒绝等错误可能只影响当前目标。切换后如果备用模型可用,请求仍然可以成功。 + +## 如何配置 + +### 全局失败降级 + +在路由页面顶部配置 **默认失败处理**: + +1. 选择 **继续重试** 或 **失败降级目标**。 +2. 如果选择 **继续重试**,填写 `Retries`。 +3. 如果选择 **失败降级目标**,按优先级添加备用模型。 + +全局 Fallback 会应用到没有单独配置 Fallback 的规则。 + +### 规则级失败降级 + +添加或编辑路由规则时,可以在 **失败时** 中配置这条规则自己的 Fallback。 + +规则级 Fallback 适合高风险或高成本模型。例如:图片任务先走 Fusion 视觉模型,失败后切到另一个多模态模型;复杂任务先走强模型,失败后切到稳定模型。 + +## 验证方式 + +保存后发一次请求,到请求日志里检查: + +- `request model`:客户端原始请求模型。 +- `resolved provider`:最终命中的供应商。 +- `resolved model`:最终请求的模型。 +- 状态码和错误信息。 + +如果发生了 Fallback,响应头里会带有 `x-ccr-fallback-attempts`、`x-ccr-fallback-failures`、延迟尝试的 `x-ccr-fallback-delays-ms`,以及最终命中的 `x-ccr-fallback-model`。请求日志详情里也会显示关联的重试尝试列表。 diff --git a/docs/src/content/docs/zh/configuration/server.md b/docs/src/content/docs/zh/configuration/server.md new file mode 100644 index 0000000..3942239 --- /dev/null +++ b/docs/src/content/docs/zh/configuration/server.md @@ -0,0 +1,28 @@ +--- +title: 服务配置 +pageTitle: 服务配置 +eyebrow: 详细配置 +lead: 配置 CCR 网关监听地址、端口,以及通过代理模式进行 MITM 劫持并代理到 CCR 的能力。 +--- + +## 主字段 + +| 字段 | 代表的能力 | +| --- | --- | +| Host | CCR 网关监听的主机地址。常见值是 `127.0.0.1` 或 `0.0.0.0`。 | +| Port | CCR 网关监听端口。客户端需要把 API Base URL 指向这个端口。 | + +## 代理模式 + +代理模式是本地代理能力。开启后,客户端可以把 HTTP/HTTPS 流量交给 CCR;CCR 会通过 MITM 劫持识别和解密 HTTPS 请求,并把可处理的模型请求代理到 CCR 网关链路。 + +| 字段 | 代表的能力 | +| --- | --- | +| 代理模式 | 启用本地代理能力。开启后 CCR 可以作为 HTTP/HTTPS 代理接收客户端流量,并通过 MITM 劫持把模型请求代理到 CCR。 | +| 系统代理 | 将系统代理指向 CCR。适合让支持系统代理的应用自动经过 CCR。 | +| 捕获网络 | 保存代理模式下经过 CCR 的网络请求,用于“网络”页面查看请求和响应详情。 | +| CA 证书 | 当前代理 CA 证书的信任状态。 | +| 安装 CA | 将 CCR 代理 CA 安装到系统或当前用户信任存储中。不同系统的安装方式不同。 | +| 检查信任 | 重新检测代理 CA 是否已被系统信任。 | +| 代理状态 | 显示代理服务当前是否运行。 | +| 重启代理 | 代理模式开启时,重新启动代理服务。 | diff --git a/docs/src/content/docs/zh/configuration/toolhub.md b/docs/src/content/docs/zh/configuration/toolhub.md new file mode 100644 index 0000000..defadd0 --- /dev/null +++ b/docs/src/content/docs/zh/configuration/toolhub.md @@ -0,0 +1,167 @@ +--- +title: ToolHub +pageTitle: ToolHub +eyebrow: 详细配置 +lead: 将多个 MCP server 收束成一个紧凑入口,让 Agent 按任务懒加载需要的工具,减少工具列表占用的上下文。 +--- + +## 适用场景 + +当你接入的 MCP server 越来越多时,直接把所有工具暴露给 Agent 会让工具列表变长,也更容易选错工具。ToolHub 会向 Agent 暴露一个 `ccr-toolhub` MCP server,里面只有两个元工具: + +- `tool_hub.resolve`:根据用户任务和上下文检索可用 MCP 工具。 +- `tool_hub.invoke`:调用已经被本轮任务选中的真实 MCP 工具。 + +它适合把不常用但偶尔会用到的工具统一懒加载,在任务真正需要时才交给 Agent 使用。核心价值是节省上下文:避免把大量低频工具常驻在 Agent 的工具列表里,减少上下文占用和选错工具的概率。简单本地代码、文件或普通聊天任务通常不需要经过 ToolHub。 + +## 工作方式 + +1. 在 **设置 → ToolHub** 中启用 ToolHub。 +2. 选择一个已配置模型作为 **检索模型**。它负责阅读 MCP 工具目录并挑选本轮任务需要的工具;建议使用 `deepseek-v4-flash`,或同等 Flash 价位、响应稳定的轻量模型。 +3. 添加或导入后端 MCP server。ToolHub 支持 `stdio`、`streamable-http` 和 `sse`。 +4. 从 CCR 打开 Claude Code 或 Codex。CCR 会在对应 Agent 配置中写入 `ccr-toolhub`。 +5. Agent 遇到外部服务、已安装 MCP 能力或业务 API 相关请求时,先调用 `tool_hub.resolve`,再用 `tool_hub.invoke` 执行选中的工具。 + +ToolHub 会合并 **ToolHub 页面配置的 MCP servers** 和兼容旧配置中的全局 Agent MCP servers,并自动排除 `ccr-toolhub` 自身,避免递归调用。 + +## 内置浏览器自动化 + +在 CCR Desktop 中启用 ToolHub,并打开 **内置浏览器自动化** 开关后,Agent 可以使用桌面端内置浏览器完成网页操作。不需要在 ToolHub 页面手动添加浏览器后端,也不需要额外 API Key;CCR 会使用本地网关鉴权连接它。 + +启用步骤: + +1. 打开 **设置 → ToolHub**,先开启 **启用 ToolHub**。 +2. 在同一页打开 **内置浏览器自动化** 开关。该开关只会在 ToolHub 已启用时显示。 +3. 保存设置后,从 CCR 重新打开 Claude Code 或 Codex,让新的 Agent 实例加载最新配置。 + +> 已经运行中的 Agent 实例通常不会立即拿到这个开关变化。要让现有会话生效,请重启该 Agent 实例,或使用 Agent 自身能力重启 ToolHub。 + +内置浏览器自动化适合让 Agent 处理需要真实浏览器状态的任务,例如打开网站、读取页面、填写表单、点击按钮、在页面中滚动,或在没有专用业务能力时完成下单、预约、查询、结账等网页流程。开启后 Agent 可以: + +- 打开或附加内置浏览器标签页、导航 URL 或搜索词。 +- 读取页面内容,并找到按钮、链接、输入框等页面元素。 +- 点击、输入、选择、按键和滚动页面元素。 +- 等待页面加载、跳转、弹窗或人类接管结果,再继续后续步骤。 +- 在登录、验证码、CAPTCHA、人机验证或人工确认时请求用户接管。 + +当网页流程需要登录、验证码、CAPTCHA、人机验证或人工确认时,CCR 会显示内置浏览器窗口,并在顶部工具栏提示用户需要完成的步骤。用户点击 **Done** 或 **Hide** 后,Agent 会收到结果并继续执行。接管等待最长支持 10 分钟。 + +### Chrome 登录态导入扩展 + +内置浏览器自动化还支持把系统 Chrome 中指定域名的登录状态导入 CCR 内置浏览器。这样 Agent 处理网页任务时,可以复用你已经在 Chrome 中登录过的网站状态。该能力需要安装仓库里的 Chrome 解包扩展:`extension/chrome`。 + +安装方式: + +1. 在 Chrome 打开 `chrome://extensions`。 +2. 开启 **Developer mode**。 +3. 点击 **Load unpacked**。 +4. 选择仓库中的 `extension/chrome` 目录。 + +导入流程: + +1. 当任务需要复用 Chrome 登录状态时,Agent 会请求导入;用户也可以在 CCR 内置浏览器工具栏点击钥匙按钮主动发起。 +2. CCR 创建一次性导入任务,并打开确认页。如果默认浏览器不是 Chrome,请把确认页 URL 复制到已安装扩展的 Chrome 中打开。 +3. 用户在确认页检查要导入的域名,点击 **Confirm and Import**。 +4. Chrome 扩展读取这些域名的 cookies 和 localStorage,提交给 CCR;完成后 Agent 可以继续使用内置浏览器执行任务。 + +扩展只读取 CCR 导入任务列出的域名,不会枚举 Chrome 中的全部 cookies。读取 localStorage 时,扩展会临时打开对应 origin 的非激活标签页,读取后自动关闭。若确认页提示扩展没有站点访问权限,请在 Chrome 扩展设置中允许该扩展访问目标域名,然后重新加载解包扩展再重试。 + +> 注意:内置浏览器自动化依赖 CCR Desktop 的内置浏览器,只在桌面端可用。CLI、服务器部署或纯 Web 环境没有这项内置能力,请改用外部浏览器自动化 MCP server。 + +## 配置项 + +| 配置项 | 说明 | +| --- | --- | +| 启用 ToolHub | 开启后才会向 Agent 暴露 `ccr-toolhub`。如果没有可用后端 MCP server,CCR 不会生成 ToolHub MCP 配置。 | +| 内置浏览器自动化 | 仅在启用 ToolHub 后显示。开启后让 Agent 可以使用 CCR Desktop 的内置浏览器完成网页操作。 | +| 检索模型 | 从已配置供应商模型中选择。建议使用 `deepseek-v4-flash`,或同等 Flash 价位、响应稳定、工具理解能力足够的轻量模型。 | +| 最大工具数 | 单次解析最多返回的工具数量,范围 `1` 到 `20`,默认 `10`。 | +| 超时毫秒 | ToolHub 解析和调用的基础超时时间,范围 `8000` 到 `300000`,默认 `60000`。如果后端 MCP server 需要更长 request timeout,CCR 会按后端超时自动抬高实际调用超时。 | +| MCP servers | 后端工具来源。每个 server 需要唯一名称,并配置 transport、命令或 URL、环境变量、headers 和超时。 | +| Import JSON | 导入常见 MCP JSON。支持根对象、数组、`mcpServers` 或 `mcp_servers`。 | + +## 添加 MCP Server + +### stdio + +`stdio` 适合本地命令行 MCP server。需要填写: + +- **Command**:启动命令,例如 `npx`、`node`、`python`。 +- **Arguments**:命令参数。 +- **Working directory**:可选工作目录。 +- **Stdio message mode**:默认 `content-length`,如果 server 使用逐行 JSON,选择 `newline-json`。 +- **Environment variables**:只放这个 MCP server 需要的变量。 + +### streamable-http / sse + +远程 MCP server 需要填写 URL。鉴权可以使用: + +- **API key**:直接保存在配置中。 +- **API key env**:从环境变量读取。 +- **Headers**:添加自定义请求头。 + +如果远程服务启动慢或请求耗时长,可以单独调高该 server 的 **Startup timeout** 或 **Request timeout**。 + +## JSON 示例 + +桌面 App 的 SQLite 配置是当前生效来源,建议优先通过 UI 修改。下面字段适用于备份、迁移或排查时理解 ToolHub 配置结构: + +```json +{ + "toolHub": { + "enabled": true, + "browserAutomation": true, + "llm": { + "apiKey": "sk-...", + "baseUrl": "https://api.openai.com/v1", + "model": "gpt-5-mini" + }, + "maxTools": 10, + "requestTimeoutMs": 60000, + "mcpServers": [ + { + "name": "filesystem", + "transport": "stdio", + "command": "npx", + "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"], + "env": {}, + "stdioMessageMode": "content-length", + "requestTimeoutMs": 30000, + "startupTimeoutMs": 600000 + } + ] + } +} +``` + +导入 MCP JSON 时也可以使用常见格式: + +```json +{ + "mcpServers": { + "filesystem": { + "command": "npx", + "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"] + } + } +} +``` + +## 与 Fusion MCP 的区别 + +| 能力 | ToolHub | Fusion 自定义 MCP 工具 | +| --- | --- | --- | +| 使用入口 | Agent 侧的 `ccr-toolhub` MCP server | 某个 Fusion 模型内部能力 | +| 工具选择 | 每个任务动态检索并返回工具包 | 模型配置中固定选择工具 | +| 适合场景 | MCP server 很多、工具目录经常变化、希望 Agent 自主发现能力 | 给某个模型补一组明确工具 | +| 可见范围 | 通过 CCR 打开的 Claude Code 或 Codex 配置 | 选择该 Fusion 模型的路由或 Agent | + +## 排查 + +- Agent 看不到 ToolHub:确认已启用 ToolHub,并且至少配置了一个后端 MCP server 或开启了 **内置浏览器自动化**,然后从 CCR 重新打开 Claude Code 或 Codex。 +- 提示缺少检索模型或 API Key:在 **检索模型** 中选择已配置模型,并确认供应商凭据可用。 +- Agent 无法使用内置浏览器自动化:确认正在使用 CCR Desktop,并且已在 **设置 → ToolHub** 中开启 **内置浏览器自动化**,然后从 CCR 重新打开 Claude Code 或 Codex。CLI、服务器部署或纯 Web 环境没有这项内置能力。 +- Chrome 登录态导入确认页一直等待扩展:确认已在 Chrome 中加载 `extension/chrome` 解包扩展,并允许扩展访问要导入的目标域名。如果默认浏览器不是 Chrome,请手动把确认页 URL 复制到 Chrome。 +- 解析不到工具:检查 MCP server 是否能正常列出工具,工具名称和描述是否足够清楚,必要时提高 **最大工具数**。 +- 调用超时:分别检查 ToolHub 的 **超时毫秒** 和单个 MCP server 的 request/startup timeout。 +- 导入失败:检查 JSON 是否有效、server 名称是否重复、`stdio` 是否有 command,远程 transport 是否有 URL。 diff --git a/docs/src/content/docs/zh/configuration/tray.md b/docs/src/content/docs/zh/configuration/tray.md new file mode 100644 index 0000000..48fc932 --- /dev/null +++ b/docs/src/content/docs/zh/configuration/tray.md @@ -0,0 +1,41 @@ +--- +title: 托盘配置 +pageTitle: 托盘配置 +eyebrow: 详细配置 +lead: 配置 CCR 系统托盘图标、余额进度条和托盘窗口组件。 +--- + +## 顶部字段 + +| 字段 | 代表的能力 | +| --- | --- | +| 托盘小精灵 | 选择托盘图标样式。可选“随机”“晴岚”“暖阳”“星澜”和“余额进度条”。 | +| 余额进度条 | 使用供应商账户用量作为托盘图标进度。需要先为供应商启用“获取用量”。 | +| 账户 | 选择用于余额进度条的供应商账户。 | +| 数据 | 选择账户里的余额、套餐或额度数据作为进度来源。 | + +如果没有可用账户数据,页面会提示“暂无可用账户数据,请先为供应商启用账户监控。”这通常意味着还没有供应商开启“获取用量”,或用量读取尚未成功。 + +## 托盘窗口布局 + +| 区域 | 代表的能力 | +| --- | --- | +| 组件区 | 左侧组件库,用于添加或启用托盘窗口组件。 | +| 预览 | 中间预览区,展示当前托盘窗口布局。组件可以拖拽排序。 | +| 组件属性 | 右侧配置区,用于调整选中组件的“样式”,或移除当前组件。 | + +## 组件类型 + +| 组件 | 代表的能力 | +| --- | --- | +| 供应商组件 | 显示“供应商切换”,用于在托盘窗口中按供应商查看数据。该组件是单例组件,只能启用一次。 | +| 标题组件 | 显示“标题和状态”。该组件是单例组件,只能启用一次。 | +| 账户组件 | 显示“账户余额”。可以添加多个账户组件,并选择不同样式。 | +| 趋势组件 | 显示“Token 趋势图”。 | +| 活跃度组件 | 显示“Token 活跃度”。 | +| 指标组件 | 显示“Token 指标”。 | +| 构成组件 | 显示“Token 构成”“环形指标”或“模型占比”。 | + +## 样式 + +不同组件支持不同“样式”。常见样式包括“卡片”“紧凑”“列表”“胶囊”“折线图”“面积图”“柱状图”“圆环”“环形图”“仪表盘”“迷你折线”“堆叠”等。样式只影响托盘窗口展示方式,不改变请求路由、供应商配置或用量统计。 diff --git a/docs/src/content/docs/zh/guides.md b/docs/src/content/docs/zh/guides.md new file mode 100644 index 0000000..82d5b31 --- /dev/null +++ b/docs/src/content/docs/zh/guides.md @@ -0,0 +1,105 @@ +--- +title: Claude Code Router 快速开始 +pageTitle: 快速开始 +eyebrow: 快速开始 +lead: 从安装开始,逐步接入供应商、让 Agent 通过 CCR 发请求,并通过日志与观测确认链路生效。 +--- + +## 安装并启动 CCR + +### 下载安装 + +1. 打开 [GitHub Releases](https://github.com/musistudio/claude-code-router/releases) 页面。 +2. 按你的系统下载安装包:macOS 使用 `.dmg` 或 `.zip`,Windows 使用 `.exe`,Linux 使用 `.AppImage`。 +3. 像普通桌面软件一样安装并打开 **Claude Code Router**。 + +### 启动服务 + +进入 **服务** 页面,点击 **启动**。页面显示运行中后,CCR 会在本机监听默认地址 `http://localhost:8080`。 + +如果希望打开 App 后自动启动服务,可以在服务页面开启自动启动。 + +## 接入供应商 + +供应商是 CCR 转发请求的上游模型服务,比如 OpenRouter、DeepSeek、Z.AI,或者任何兼容 OpenAI / Anthropic / Gemini 协议的服务。 + +### 添加供应商 + +1. 进入 **供应商** 页面,点击 **添加供应商**。 +2. 在 **预设供应商** 中选择内置预设。预设会自动填入常见的基础 URL、协议和图标。 +3. 如果服务不在预设里,选择 **其他 / 自定义 API 端点**。 +4. 填写 **名称**、**基础 URL**、**协议**、**API Key** 和 **模型**。 + +### 协议怎么选 + +| 协议 | 适用场景 | +| --- | --- | +| OpenAI Chat Completions | 绝大多数 OpenAI 兼容服务 | +| OpenAI Responses | 支持 Responses API 的服务 | +| Anthropic Messages | Anthropic 官方或兼容 Anthropic 协议的服务 | +| Gemini Generate Content | Gemini 官方或兼容 Gemini 协议的服务 | + +拿不准时,先使用 App 里的协议探测,再用模型连通性检查确认。 + +### 保存前做这三项检查 + +1. **协议探测**:确认基础 URL 支持哪些协议。 +2. **模型连通性检查**:选一两个模型实际发测试请求。 +3. **账户用量测试**:如果要展示余额或配额,确认用量接口能读到数据。 + +这些检查通过后再保存供应商。 + +### 多 Key 与用量面板 + +如果是团队或高频调用,可以在供应商表单里添加多条凭据,并设置优先级、权重和限额。保存后到请求日志里按凭据筛选,确认轮换符合预期。 + +如果希望概览显示余额或剩余配额,打开供应商的 **账户 / 用量**,配置用量接入方式并测试字段映射。 + +## 接入 Agent配置 + +Agent配置让 Claude Code、Codex、ZCode 等 Agent 使用 CCR 的供应商、路由和模型选择配置。 + +通用建议: + +- 试用阶段优先选择“仅从 CCR 打开时生效”,只影响从 CCR 打开的 Agent。 +- 稳定后再考虑系统默认配置。 +- 应用后尽量使用 CCR 里的“打开 Agent”启动 Agent。 + +### Claude Code + +在 **Agent配置** 中选择 Claude Code,设置模型、小型快速模型和设置文件,然后点击应用。从 CCR 打开 Claude Code 后,发一次请求到请求日志里验证。 + +### Codex + +在 **Agent配置** 中选择 Codex,确认供应商 ID、供应商名称、模型和配置文件。需要特定 CLI 时再填写 Codex CLI path 和 Codex home。 + +### ZCode + +ZCode 主要关注模型、供应商 ID、供应商名称,以及是否从 CCR 启动。它走 App surface,不需要 Codex CLI 的路径字段。 + +### 复用本机已登录的 Agent + +如果本机已经登录过 Claude Code、Codex 或 ZCode,可以在 **供应商** 中导入为 **本机 Agent 供应商**,复用已有授权,不必额外申请 Key。 + +## 日志&观测 + +### 先把开关打开 + +到 **设置 → 日志与观测**: + +1. 打开 **请求日志**。 +2. 打开 **Agent 观测**。 + +### 查看观测面板 + +观测面板用于查看 Agent 的执行链路和性能表现:每个步骤何时发生、调用了哪个工具、工具获得了什么结果、耗时多久、是否出错,以及后续步骤如何继续。 + +它可以帮助定位 Agent 卡住、工具结果异常、某一步耗时过长,或上下文流转不符合预期等问题。请求日志提供单条模型请求的请求体、响应体和错误信息。 + +### 请求日志 + +请求日志记录经过 CCR 的模型请求明细,包括请求时间、请求 ID、客户端、路径、请求模型、最终命中的供应商和模型、凭据、状态码、耗时、token、成本估算、请求体、响应体和错误信息。 + +日志页支持按状态、供应商、模型、凭据、请求 ID、模型名、请求体或响应体筛选。单条记录会展示请求与响应的主要字段,包含 `request model`、`resolved provider`、`resolved model`、状态码、响应体、错误信息、耗时、token 和成本估算。 + +普通请求日志只保留本地当天的数据。以本地日期为界,进入第二天后,下一次读取或写入请求日志时会清理前一天的普通请求日志。 diff --git a/docs/src/content/docs/zh/guides/agent-profile.md b/docs/src/content/docs/zh/guides/agent-profile.md new file mode 100644 index 0000000..d6acfee --- /dev/null +++ b/docs/src/content/docs/zh/guides/agent-profile.md @@ -0,0 +1,32 @@ +--- +title: 接入 Agent配置 +pageTitle: 接入 Agent配置 +eyebrow: 快速开始 +lead: 让 Claude Code、Codex、ZCode 等 Agent 使用 CCR 的供应商、路由和模型选择配置。 +--- + +## 通用建议 + +- 试用阶段优先选择“仅从 CCR 打开时生效”,只影响从 CCR 打开的 Agent。 +- 稳定后再考虑系统默认配置。 +- 应用后尽量使用 CCR 里的“打开 Agent”启动 Agent。 + +## Claude Code + +在 **Agent配置** 中选择 Claude Code,设置模型、小型快速模型和设置文件,然后点击应用。 + +从 CCR 打开 Claude Code 后,发一次请求到请求日志里验证。 + +## Codex + +在 **Agent配置** 中选择 Codex,确认供应商 ID、供应商名称、模型和配置文件。 + +需要特定 CLI 时再填写 Codex CLI path 和 Codex home。 + +## ZCode + +ZCode 主要关注模型、供应商 ID、供应商名称,以及是否从 CCR 启动。它走 App surface,不需要 Codex CLI 的路径字段。 + +## 复用本机已登录的 Agent + +如果本机已经登录过 Claude Code、Codex 或 ZCode,可以在 **供应商** 中导入为 **本机 Agent 供应商**,复用已有授权,不必额外申请 Key。 diff --git a/docs/src/content/docs/zh/guides/install.md b/docs/src/content/docs/zh/guides/install.md new file mode 100644 index 0000000..02bf0dc --- /dev/null +++ b/docs/src/content/docs/zh/guides/install.md @@ -0,0 +1,18 @@ +--- +title: 安装并启动 CCR +pageTitle: 安装并启动 CCR +eyebrow: 快速开始 +lead: 下载桌面应用,安装后启动本地 CCR 服务。 +--- + +## 下载安装 + +1. 打开 [GitHub Releases](https://github.com/musistudio/claude-code-router/releases) 页面。 +2. 按你的系统下载安装包:macOS 使用 `.dmg` 或 `.zip`,Windows 使用 `.exe`,Linux 使用 `.AppImage`。 +3. 像普通桌面软件一样安装并打开 **Claude Code Router**。 + +## 启动服务 + +进入 **Server** 页面,点击 **Start**。页面显示 Running 后,CCR 会在本机监听默认地址 `http://localhost:8080`。 + +如果希望打开 App 后自动启动服务,可以在 Server 页面开启 **Auto start**。 diff --git a/docs/src/content/docs/zh/guides/observability.md b/docs/src/content/docs/zh/guides/observability.md new file mode 100644 index 0000000..19e931a --- /dev/null +++ b/docs/src/content/docs/zh/guides/observability.md @@ -0,0 +1,27 @@ +--- +title: 日志&观测 +pageTitle: 日志&观测 +eyebrow: 快速开始 +lead: 在设置中开启请求日志和 Agent 观测,查看请求明细,并分析 Agent 的执行链路和性能。 +--- + +## 先把开关打开 + +到 **设置 → 日志与观测**: + +1. 打开 **请求日志**。 +2. 打开 **Agent 观测**。 + +## 查看观测面板 + +观测面板用于查看 Agent 的执行链路和性能表现:每个步骤何时发生、调用了哪个工具、工具获得了什么结果、耗时多久、是否出错,以及后续步骤如何继续。 + +它可以帮助定位 Agent 卡住、工具结果异常、某一步耗时过长,或上下文流转不符合预期等问题。请求日志提供单条模型请求的请求体、响应体和错误信息。 + +## 请求日志 + +请求日志记录经过 CCR 的模型请求明细,包括请求时间、请求 ID、客户端、路径、请求模型、最终命中的供应商和模型、凭据、状态码、耗时、token、成本估算、请求体、响应体和错误信息。 + +日志页支持按状态、供应商、模型、凭据、请求 ID、模型名、请求体或响应体筛选。单条记录会展示请求与响应的主要字段,包含 `request model`、`resolved provider`、`resolved model`、状态码、响应体、错误信息、耗时、token 和成本估算。 + +普通请求日志只保留本地当天的数据。以本地日期为界,进入第二天后,下一次读取或写入请求日志时会清理前一天的普通请求日志;长期留存依赖导出或另行归档。 diff --git a/docs/src/content/docs/zh/guides/provider.md b/docs/src/content/docs/zh/guides/provider.md new file mode 100644 index 0000000..8985814 --- /dev/null +++ b/docs/src/content/docs/zh/guides/provider.md @@ -0,0 +1,38 @@ +--- +title: 接入供应商 +pageTitle: 接入供应商 +eyebrow: 快速开始 +lead: 添加上游模型服务,并在保存前完成协议、模型和用量检查。 +--- + +## 添加供应商 + +1. 进入 **供应商** 页面,点击 **添加供应商**。 +2. 在 **预设供应商** 中选择内置预设。预设会自动填入常见的基础 URL、协议和图标。 +3. 如果服务不在预设里,选择 **其他 / 自定义 API 端点**。 +4. 填写 **名称**、**基础 URL**、**协议**、**API Key** 和 **模型**。 + +## 协议怎么选 + +| 协议 | 适用场景 | +| --- | --- | +| OpenAI Chat Completions | 绝大多数 OpenAI 兼容服务 | +| OpenAI Responses | 支持 Responses API 的服务 | +| Anthropic Messages | Anthropic 官方或兼容 Anthropic 协议的服务 | +| Gemini Generate Content | Gemini 官方或兼容 Gemini 协议的服务 | + +拿不准时,先使用 App 里的协议探测,再用模型连通性检查确认。 + +## 保存前做这三项检查 + +1. **协议探测**:确认基础 URL 支持哪些协议。 +2. **模型连通性检查**:选一两个模型实际发测试请求。 +3. **账户用量测试**:如果要展示余额或配额,确认用量接口能读到数据。 + +这些检查通过后再保存供应商。 + +## 多 Key 与用量面板 + +如果是团队或高频调用,可以在供应商表单里添加多条凭据,并设置优先级、权重和限额。 + +如果希望概览显示余额或剩余配额,打开供应商的 **账户 / 用量**,配置用量接入方式并测试字段映射。 diff --git a/docs/src/content/docs/zh/index.md b/docs/src/content/docs/zh/index.md new file mode 100644 index 0000000..45caad3 --- /dev/null +++ b/docs/src/content/docs/zh/index.md @@ -0,0 +1,30 @@ +--- +title: Claude Code Router 文档 +pageTitle: 文档 +eyebrow: 产品文档 +lead: 了解 CCR 的定位、能力边界和文档结构。需要动手配置时,从顶部的「快速开始」开始;需要查字段、Bot 或 Fusion 时,进入「详细配置」。 +--- + +## 文档结构 + +顶部栏现在对应四个独立页面: + +| 分类 | 内容 | +| --- | --- | +| [文档](./) | 产品定位、架构概览、阅读路径 | +| [快速开始](guides/) | 从安装、接供应商,到接入 Agent 的上手流程 | +| [详细配置](configuration/overview/) | 概览仪表盘、API 密钥、服务、供应商、路由、Agent配置、Fusion、Bot、托盘和配置数据库位置 | +| [Q&A](troubleshooting/) | 请求日志、观测面板和常见问题 | + +Bot 平台教程是「详细配置」分类下的子页面,每个平台有独立页面,方便逐步补齐平台后台字段、回调 URL、签名和 FAQ。 + +## 阅读路径 + +第一次使用时可以从这些页面了解 CCR 的主要流程: + +1. [快速开始](guides/) 覆盖供应商接入和 Agent配置。 +2. App 的请求日志页面展示请求是否经过 CCR。 +3. [详细配置](configuration/overview/) 覆盖概览仪表盘、API 密钥、服务、供应商、图像、联网搜索、MCP 工具、托盘和 IM 接力。 +4. [Q&A](troubleshooting/) 覆盖 401、404、超时、路由不对或 Bot 收不到消息等常见问题。 + +这样文档不会挤在一个长页面里,后续也能按顶部分类逐步扩展。 diff --git a/docs/src/content/docs/zh/troubleshooting.md b/docs/src/content/docs/zh/troubleshooting.md new file mode 100644 index 0000000..f37bc12 --- /dev/null +++ b/docs/src/content/docs/zh/troubleshooting.md @@ -0,0 +1,48 @@ +--- +title: Claude Code Router Q&A +pageTitle: Q&A +eyebrow: Q&A +lead: 遇到 Agent 没走 CCR、供应商报错、路由不对、Fusion 失败或 Bot 收不到消息时,从这里开始定位。 +--- + +## Q&A + +### Q: Agent 没有走 CCR,相关信息在哪里? + +A: 服务运行状态、Agent 启动方式、配置应用状态和作用范围会影响 Agent 是否经过 CCR。 + +### Q: 请求命中了错误模型怎么办? + +A: 请求日志会展示 `request model`、`resolved provider` 和 `resolved model`。路由配置页包含规则顺序、匹配条件和 fallback。 + +### Q: 供应商返回 401 或 403 怎么处理? + +A: 相关字段包括 API Key、凭据启用状态、基础 URL、协议和额外请求头。供应商页面提供模型连通性检查。 + +### Q: 出现 `model not found` 怎么排查? + +A: 供应商模型列表、路由选择的模型名和配置中的模型名都会影响 `model not found`。 + +### Q: Fusion 没调用工具怎么办? + +A: 相关信息包括 Fusion 工具启用状态、Vision model 或搜索服务 Key、MCP 的 Discover tools 和 timeout 设置。 + +### Q: 请求超时有哪些相关信息? + +A: 请求日志会记录耗时和错误信息;上游服务延迟、Fusion 工具耗时和 timeout 设置也会影响超时表现。 + +### Q: 成本突然变高怎么定位? + +A: 请求日志支持按模型、供应商或凭据筛选,并展示 token 组成、请求体大小和最终命中的模型。 + +### Q: 某条 Key 一直失败怎么办? + +A: 请求日志支持按凭据筛选。凭据的额度、权限和供应商后台状态都会影响单条 Key 的可用性。 + +### Q: Bot 收不到消息怎么排查? + +A: 相关信息包括 Bot 开关、消息转发设置、平台 Token、回调配置,以及 Agent 是否从 CCR 打开。 + +### Q: 观测面板没有 Agent 执行链路怎么办? + +A: 到 **设置 → 日志与观测** 确认 **请求日志** 和 **Agent 观测** 已开启,然后重新发起一次 Agent 任务。观测面板会在新的 Agent 执行过程中记录步骤、工具调用、工具结果和耗时。 diff --git a/docs/src/i18n/content.ts b/docs/src/i18n/content.ts new file mode 100644 index 0000000..58a9dc1 --- /dev/null +++ b/docs/src/i18n/content.ts @@ -0,0 +1,314 @@ +export type Locale = "zh" | "en"; +export type DocPageKey = "documentation" | "guides" | "configuration" | "troubleshooting"; + +const languageOptions = [ + { locale: "zh", label: "中文", href: "/" }, + { locale: "en", label: "English", href: "/en/" }, +] as const; + +export const docsContent = { + zh: { + htmlLang: "zh-CN", + pageTitle: "文档", + languageLabel: "中文", + languageOptions, + navItems: [ + { label: "文档", href: "/", pageKey: "documentation" }, + { label: "快速开始", href: "/guides/", pageKey: "guides" }, + { label: "详细配置", href: "/configuration/overview/", pageKey: "configuration" }, + { label: "Q&A", href: "/troubleshooting/", pageKey: "troubleshooting" }, + ], + pages: { + documentation: { + sidebarGroups: [ + { + label: "文档", + icon: "rocket", + items: ["CCR 能帮你做什么", "文档结构", "阅读路径"], + active: "CCR 能帮你做什么", + }, + ], + expandableSidebarItems: [], + sidebarChildren: {}, + sidebarLinks: {}, + sidebarTargets: {}, + }, + guides: { + sidebarGroups: [ + { + label: "快速开始", + icon: "book", + items: [ + "安装并启动 CCR", + "接入供应商", + "接入 Agent配置", + "日志&观测", + ], + active: "安装并启动 CCR", + }, + ], + expandableSidebarItems: [], + sidebarChildren: {}, + sidebarLinks: { + "安装并启动 CCR": "/guides/install/", + 接入供应商: "/guides/provider/", + "接入 Agent配置": "/guides/agent-profile/", + "日志&观测": "/guides/observability/", + }, + sidebarTargets: {}, + }, + configuration: { + sidebarGroups: [ + { + label: "主页页面", + icon: "wand", + items: [ + "概览仪表盘", + "供应商配置", + "一键导入供应商", + "Agent配置", + "路由配置", + "Fusion 组合模型", + "API 密钥", + "日志&观测", + "服务配置", + "扩展机制", + ], + active: "概览仪表盘", + }, + { + label: "设置页", + icon: "book", + items: [ + "ToolHub", + "Bot 与 IM 接力 Agent", + "配置数据库位置", + "托盘配置", + ], + active: "", + }, + ], + expandableSidebarItems: ["Fusion 组合模型", "Bot 与 IM 接力 Agent"], + sidebarChildren: { + "Fusion 组合模型": ["内置图像能力", "内置联网搜索", "自定义 MCP 工具"], + "Bot 与 IM 接力 Agent": [ + "配置步骤", + "Slack", + "Discord", + "Telegram", + "LINE", + "微信", + "企业微信", + "飞书", + "钉钉", + ], + }, + sidebarLinks: { + 概览仪表盘: "/configuration/overview/", + 供应商配置: "/configuration/provider/", + "一键导入供应商": "/configuration/provider-deeplink/", + 路由配置: "/configuration/routing/", + "日志&观测": "/configuration/observability/", + "Fusion 组合模型": "/configuration/fusion/", + 内置图像能力: "/configuration/fusion-vision/", + 内置联网搜索: "/configuration/fusion-web-search/", + "自定义 MCP 工具": "/configuration/fusion-mcp-tool/", + ToolHub: "/configuration/toolhub/", + Agent配置: "/configuration/profile/", + "API 密钥": "/configuration/api-keys/", + 服务配置: "/configuration/server/", + 托盘配置: "/configuration/tray/", + 扩展机制: "/configuration/extensions/", + "Bot 与 IM 接力 Agent": "/configuration/bot-relay/", + 配置步骤: "/configuration/bot-setup/", + Slack: "/bot-与-im-接力-agent/slack/", + Discord: "/bot-与-im-接力-agent/discord/", + Telegram: "/bot-与-im-接力-agent/telegram/", + LINE: "/bot-与-im-接力-agent/line/", + 微信: "/bot-与-im-接力-agent/weixin-ilink/", + 企业微信: "/bot-与-im-接力-agent/wecom/", + 飞书: "/bot-与-im-接力-agent/feishu/", + 钉钉: "/bot-与-im-接力-agent/dingtalk/", + 配置数据库位置: "/configuration/config-file/", + }, + sidebarTargets: {}, + }, + troubleshooting: { + sidebarGroups: [ + { + label: "Q&A", + icon: "pen", + items: [], + active: "", + }, + ], + expandableSidebarItems: [], + sidebarChildren: {}, + sidebarLinks: {}, + sidebarTargets: {}, + }, + }, + tocTitle: "本页内容", + ui: { + searchLabel: "搜索文档", + searchPlaceholder: "搜索...", + copyPage: "复制页面", + copied: "已复制", + copyFailed: "复制失败", + downloadLabel: "下载", + githubLabel: "GitHub 仓库", + themeLabel: "主题", + starsFallback: "Stars", + copyCode: "复制代码", + copiedCode: "代码已复制", + copyCodeFailed: "代码复制失败", + }, + }, + en: { + htmlLang: "en", + pageTitle: "Documentation", + languageLabel: "English", + languageOptions, + navItems: [ + { label: "Documentation", href: "/en/", pageKey: "documentation" }, + { label: "Quick Start", href: "/en/guides/", pageKey: "guides" }, + { label: "Detailed Configuration", href: "/en/configuration/overview/", pageKey: "configuration" }, + { label: "Q&A", href: "/en/troubleshooting/", pageKey: "troubleshooting" }, + ], + pages: { + documentation: { + sidebarGroups: [ + { + label: "Documentation", + icon: "rocket", + items: ["What CCR Can Do", "Documentation Structure", "Reading Path"], + active: "What CCR Can Do", + }, + ], + expandableSidebarItems: [], + sidebarChildren: {}, + sidebarLinks: {}, + sidebarTargets: {}, + }, + guides: { + sidebarGroups: [ + { + label: "Quick Start", + icon: "book", + items: [ + "Install And Start CCR", + "Add A Provider", + "Connect Agent Config", + "Logs & Observability", + ], + active: "Install And Start CCR", + }, + ], + expandableSidebarItems: [], + sidebarChildren: {}, + sidebarLinks: { + "Install And Start CCR": "/en/guides/install/", + "Add A Provider": "/en/guides/provider/", + "Connect Agent Config": "/en/guides/agent-profile/", + "Logs & Observability": "/en/guides/observability/", + }, + sidebarTargets: {}, + }, + configuration: { + sidebarGroups: [ + { + label: "Main Pages", + icon: "wand", + items: [ + "Overview Dashboard", + "Provider Config", + "One click import", + "Agent Config", + "Routing Config", + "Fusion Models", + "API Keys", + "Logs & Observability", + "Server", + "Extension Mechanism", + ], + active: "Overview Dashboard", + }, + { + label: "Settings Pages", + icon: "book", + items: [ + "ToolHub", + "Bots And IM Agent Relay", + "Config Database Location", + "Tray Configuration", + ], + active: "", + }, + ], + expandableSidebarItems: ["Fusion Models", "Bots And IM Agent Relay"], + sidebarChildren: { + "Fusion Models": ["Built-In Vision", "Built-In Web Search", "Custom MCP Tool"], + "Bots And IM Agent Relay": ["Setup", "Slack", "Discord", "Telegram", "LINE", "Weixin", "WeCom", "Feishu", "DingTalk"], + }, + sidebarLinks: { + "Overview Dashboard": "/en/configuration/overview/", + "Provider Config": "/en/configuration/providers/", + "One click import": "/en/configuration/provider-deeplink/", + "Routing Config": "/en/configuration/routing/", + "Logs & Observability": "/en/configuration/observability/", + "Fusion Models": "/en/configuration/fusion-models/", + "Built-In Vision": "/en/configuration/fusion-vision/", + "Built-In Web Search": "/en/configuration/fusion-web-search/", + "Custom MCP Tool": "/en/configuration/fusion-mcp-tool/", + ToolHub: "/en/configuration/toolhub/", + "Agent Config": "/en/configuration/profiles/", + "API Keys": "/en/configuration/api-keys/", + Server: "/en/configuration/server/", + "Tray Configuration": "/en/configuration/tray/", + "Extension Mechanism": "/en/configuration/extensions/", + "Bots And IM Agent Relay": "/en/configuration/bots/", + Setup: "/en/configuration/bot-setup/", + Slack: "/en/relay-agents-in-im-with-bots/slack/", + Discord: "/en/relay-agents-in-im-with-bots/discord/", + Telegram: "/en/relay-agents-in-im-with-bots/telegram/", + LINE: "/en/relay-agents-in-im-with-bots/line/", + Weixin: "/en/relay-agents-in-im-with-bots/weixin-ilink/", + WeCom: "/en/relay-agents-in-im-with-bots/wecom/", + Feishu: "/en/relay-agents-in-im-with-bots/feishu/", + DingTalk: "/en/relay-agents-in-im-with-bots/dingtalk/", + "Config Database Location": "/en/configuration/configuration-file/", + }, + sidebarTargets: {}, + }, + troubleshooting: { + sidebarGroups: [ + { + label: "Q&A", + icon: "pen", + items: [], + active: "", + }, + ], + expandableSidebarItems: [], + sidebarChildren: {}, + sidebarLinks: {}, + sidebarTargets: {}, + }, + }, + tocTitle: "On this page", + ui: { + searchLabel: "Search docs", + searchPlaceholder: "Search...", + copyPage: "Copy page", + copied: "Copied", + copyFailed: "Copy failed", + downloadLabel: "Download", + githubLabel: "GitHub repository", + themeLabel: "Theme", + starsFallback: "Stars", + copyCode: "Copy code", + copiedCode: "Copied code", + copyCodeFailed: "Copy failed", + }, + }, +} as const; diff --git a/docs/src/layouts/DocsLayout.astro b/docs/src/layouts/DocsLayout.astro new file mode 100644 index 0000000..60d714c --- /dev/null +++ b/docs/src/layouts/DocsLayout.astro @@ -0,0 +1,724 @@ +--- +import "../styles/global.css"; +import { + BookOpen, + ChevronDown, + ChevronRight, + Download, + Github, + List, + Moon, + PenLine, + Rocket, + Search, + Sun, + WandSparkles, +} from "lucide-astro"; + +const { + title = "Documentation", + htmlLang = "zh-CN", + locale = "zh", + languageLabel = "中文", + languageOptions = [ + { locale: "zh", label: "中文", href: "/" }, + { locale: "en", label: "English", href: "/en/" }, + ], + navItems = ["Documentation", "Guides", "API reference", "Changelog"], + sidebarTree = [], + sidebarGroups = [], + expandableSidebarItems = [], + sidebarChildren = {}, + sidebarLinks = {}, + tocTitle = "On this page", + tocItems = [], + ui = { + searchLabel: "Search docs", + searchPlaceholder: "Search...", + downloadLabel: "Download", + githubLabel: "GitHub repository", + themeLabel: "Theme", + starsFallback: "Stars", + }, +} = Astro.props; + +const baseUrl = import.meta.env.BASE_URL ?? "/"; +const absoluteUrlPattern = /^[a-z][a-z\d+.-]*:/i; +const withBase = (href) => { + if (!href || href.startsWith("#") || href.startsWith("//") || absoluteUrlPattern.test(href)) { + return href; + } + + const basePath = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`; + if (href === "/") { + return basePath; + } + + const normalizedHref = href.startsWith("/") ? href.slice(1) : href; + return `${basePath}${normalizedHref}`; +}; +const absoluteHref = (href) => { + const resolvedHref = withBase(href); + if (absoluteUrlPattern.test(resolvedHref) || !Astro.site) { + return resolvedHref; + } + + return new URL(resolvedHref, Astro.site).toString(); +}; +const resolvedLanguageOptions = languageOptions.map((option) => ({ + ...option, + href: withBase(option.href), + absoluteHref: absoluteHref(option.href), +})); +const resolvedNavItems = navItems.map((item, index) => { + const navItem = typeof item === "string" ? { label: item, href: "#" } : item; + + return { + ...navItem, + href: withBase(navItem.href ?? "#"), + active: navItem.active ?? index === 0, + }; +}); +const homeHref = withBase(locale === "en" ? "/en/" : "/"); +const faviconHref = withBase("/ccr-icon.png"); +const logoSrc = withBase("/logo.png"); +const sidebarIcons = { + rocket: Rocket, + book: BookOpen, + wand: WandSparkles, + pen: PenLine, +}; +const searchEntryKeys = new Set(); +const searchEntries = []; +const addSearchEntry = (entry) => { + const label = String(entry.label ?? "").trim(); + const href = String(entry.href ?? "").trim(); + + if (!label || !href || href === "#") return; + + const resolvedHref = withBase(href); + const key = `${label}\n${resolvedHref}`; + + if (searchEntryKeys.has(key)) return; + + searchEntryKeys.add(key); + searchEntries.push({ + label, + href: resolvedHref, + section: String(entry.section ?? "").trim(), + }); +}; + +if (sidebarTree.length > 0) { + for (const section of sidebarTree) { + addSearchEntry({ label: section.label, href: section.href, section: section.label }); + + for (const group of section.groups ?? []) { + for (const item of group.items ?? []) { + addSearchEntry({ label: item.label, href: item.href, section: section.label }); + + for (const child of item.children ?? []) { + addSearchEntry({ label: child.label, href: child.href, section: `${section.label} / ${item.label}` }); + } + } + } + } +} else { + for (const group of sidebarGroups) { + for (const item of group.items ?? []) { + addSearchEntry({ label: item, href: sidebarLinks[item], section: group.label }); + + for (const child of sidebarChildren[item] ?? []) { + addSearchEntry({ label: child, href: sidebarLinks[child], section: `${group.label} / ${item}` }); + } + } + } +} + +for (const item of tocItems) { + if (typeof item !== "string") { + addSearchEntry({ label: item.label, href: item.href, section: tocTitle }); + } +} + +const searchNoResults = locale === "zh" ? "没有匹配结果" : "No results"; +const sidebarToggleLabel = locale === "zh" ? "打开目录" : "Open navigation"; +const sidebarCloseLabel = locale === "zh" ? "关闭目录" : "Close navigation"; +--- + + + + + + + + + + { + resolvedLanguageOptions.map((option) => ( + + )) + } + {title} | Claude Code Router Docs + + +
+
+ + + CCR docs + + +
+ + {languageLabel} + +
+ { + resolvedLanguageOptions.map((option) => ( + + {option.label} + + )) + } +
+
+ +
+ + + + + + + +
+
+ + + +
+ + +
+ +
+ + +
+
+ + + + + diff --git a/docs/src/pages/bot-与-im-接力-agent/[platform].astro b/docs/src/pages/bot-与-im-接力-agent/[platform].astro new file mode 100644 index 0000000..e0bb449 --- /dev/null +++ b/docs/src/pages/bot-与-im-接力-agent/[platform].astro @@ -0,0 +1,22 @@ +--- +import DocPage from "../../components/DocPage.astro"; +import { BOT_PLATFORM_LABELS_ZH, zhBotDocs, botPlatformFromPath } from "../../bot-platforms"; + +export function getStaticPaths() { + return Object.entries(zhBotDocs).map(([filePath, mod]) => { + const platform = botPlatformFromPath(filePath) as keyof typeof BOT_PLATFORM_LABELS_ZH; + + return { + params: { platform }, + props: { + mod, + activeSidebarItem: BOT_PLATFORM_LABELS_ZH[platform], + }, + }; + }); +} + +const { mod, activeSidebarItem } = Astro.props; +--- + + diff --git a/docs/src/pages/configuration.astro b/docs/src/pages/configuration.astro new file mode 100644 index 0000000..5484cef --- /dev/null +++ b/docs/src/pages/configuration.astro @@ -0,0 +1,17 @@ +--- +const target = "/configuration/overview/"; +--- + + + + + + + + + + 概览仪表盘 + + diff --git a/docs/src/pages/configuration/[slug].astro b/docs/src/pages/configuration/[slug].astro new file mode 100644 index 0000000..6f2271f --- /dev/null +++ b/docs/src/pages/configuration/[slug].astro @@ -0,0 +1,40 @@ +--- +import DocPage from "../../components/DocPage.astro"; +import { configurationSlugFromPath, zhConfigurationDocs } from "../../configuration-docs"; + +export function getStaticPaths() { + const activeLabels: Record = { + "api-keys": "API 密钥", + overview: "概览仪表盘", + provider: "供应商配置", + "provider-deeplink": "一键导入供应商", + routing: "路由配置", + profile: "Agent配置", + observability: "日志&观测", + fusion: "Fusion 组合模型", + "fusion-vision": "内置图像能力", + "fusion-web-search": "内置联网搜索", + "fusion-mcp-tool": "自定义 MCP 工具", + toolhub: "ToolHub", + extensions: "扩展机制", + server: "服务配置", + tray: "托盘配置", + "bot-relay": "Bot 与 IM 接力 Agent", + "bot-setup": "配置步骤", + "config-file": "配置数据库位置", + }; + + return Object.entries(zhConfigurationDocs).map(([filePath, mod]) => { + const slug = configurationSlugFromPath(filePath); + + return { + params: { slug }, + props: { mod, activeSidebarItem: activeLabels[slug] }, + }; + }); +} + +const { mod, activeSidebarItem } = Astro.props; +--- + + diff --git a/docs/src/pages/en/configuration.astro b/docs/src/pages/en/configuration.astro new file mode 100644 index 0000000..e77c3b1 --- /dev/null +++ b/docs/src/pages/en/configuration.astro @@ -0,0 +1,17 @@ +--- +const target = "/en/configuration/overview/"; +--- + + + + + + + + + + Overview Dashboard + + diff --git a/docs/src/pages/en/configuration/[slug].astro b/docs/src/pages/en/configuration/[slug].astro new file mode 100644 index 0000000..fbc4927 --- /dev/null +++ b/docs/src/pages/en/configuration/[slug].astro @@ -0,0 +1,40 @@ +--- +import DocPage from "../../../components/DocPage.astro"; +import { configurationSlugFromPath, enConfigurationDocs } from "../../../configuration-docs"; + +export function getStaticPaths() { + const activeLabels: Record = { + "api-keys": "API Keys", + overview: "Overview Dashboard", + providers: "Provider Config", + "provider-deeplink": "One click import", + routing: "Routing Config", + profiles: "Agent Config", + observability: "Logs & Observability", + "fusion-models": "Fusion Models", + "fusion-vision": "Built-In Vision", + "fusion-web-search": "Built-In Web Search", + "fusion-mcp-tool": "Custom MCP Tool", + toolhub: "ToolHub", + extensions: "Extension Mechanism", + server: "Server", + tray: "Tray Configuration", + bots: "Bots And IM Agent Relay", + "bot-setup": "Setup", + "configuration-file": "Config Database Location", + }; + + return Object.entries(enConfigurationDocs).map(([filePath, mod]) => { + const slug = configurationSlugFromPath(filePath); + + return { + params: { slug }, + props: { mod, activeSidebarItem: activeLabels[slug] }, + }; + }); +} + +const { mod, activeSidebarItem } = Astro.props; +--- + + diff --git a/docs/src/pages/en/guides.astro b/docs/src/pages/en/guides.astro new file mode 100644 index 0000000..3d54ad4 --- /dev/null +++ b/docs/src/pages/en/guides.astro @@ -0,0 +1,6 @@ +--- +import DocPage from "../../components/DocPage.astro"; +import * as doc from "../../content/docs/en/guides.md"; +--- + + diff --git a/docs/src/pages/en/guides/[slug].astro b/docs/src/pages/en/guides/[slug].astro new file mode 100644 index 0000000..8ed6b4e --- /dev/null +++ b/docs/src/pages/en/guides/[slug].astro @@ -0,0 +1,26 @@ +--- +import DocPage from "../../../components/DocPage.astro"; +import { enGuideDocs, sectionSlugFromPath } from "../../../section-docs"; + +export function getStaticPaths() { + const activeLabels: Record = { + install: "Install And Start CCR", + provider: "Add A Provider", + "agent-profile": "Connect Agent Config", + observability: "Logs & Observability", + }; + + return Object.entries(enGuideDocs).map(([filePath, mod]) => { + const slug = sectionSlugFromPath(filePath); + + return { + params: { slug }, + props: { mod, activeSidebarItem: activeLabels[slug] }, + }; + }); +} + +const { mod, activeSidebarItem } = Astro.props; +--- + + diff --git a/docs/src/pages/en/index.astro b/docs/src/pages/en/index.astro new file mode 100644 index 0000000..1b14892 --- /dev/null +++ b/docs/src/pages/en/index.astro @@ -0,0 +1,5 @@ +--- +import DocPage from "../../components/DocPage.astro"; +--- + + diff --git a/docs/src/pages/en/relay-agents-in-im-with-bots/[platform].astro b/docs/src/pages/en/relay-agents-in-im-with-bots/[platform].astro new file mode 100644 index 0000000..9d3ff87 --- /dev/null +++ b/docs/src/pages/en/relay-agents-in-im-with-bots/[platform].astro @@ -0,0 +1,22 @@ +--- +import DocPage from "../../../components/DocPage.astro"; +import { BOT_PLATFORM_LABELS_EN, enBotDocs, botPlatformFromPath } from "../../../bot-platforms"; + +export function getStaticPaths() { + return Object.entries(enBotDocs).map(([filePath, mod]) => { + const platform = botPlatformFromPath(filePath) as keyof typeof BOT_PLATFORM_LABELS_EN; + + return { + params: { platform }, + props: { + mod, + activeSidebarItem: BOT_PLATFORM_LABELS_EN[platform], + }, + }; + }); +} + +const { mod, activeSidebarItem } = Astro.props; +--- + + diff --git a/docs/src/pages/en/troubleshooting.astro b/docs/src/pages/en/troubleshooting.astro new file mode 100644 index 0000000..9b55a83 --- /dev/null +++ b/docs/src/pages/en/troubleshooting.astro @@ -0,0 +1,6 @@ +--- +import DocPage from "../../components/DocPage.astro"; +import * as doc from "../../content/docs/en/troubleshooting.md"; +--- + + diff --git a/docs/src/pages/guides.astro b/docs/src/pages/guides.astro new file mode 100644 index 0000000..b648609 --- /dev/null +++ b/docs/src/pages/guides.astro @@ -0,0 +1,6 @@ +--- +import DocPage from "../components/DocPage.astro"; +import * as doc from "../content/docs/zh/guides.md"; +--- + + diff --git a/docs/src/pages/guides/[slug].astro b/docs/src/pages/guides/[slug].astro new file mode 100644 index 0000000..c90b781 --- /dev/null +++ b/docs/src/pages/guides/[slug].astro @@ -0,0 +1,26 @@ +--- +import DocPage from "../../components/DocPage.astro"; +import { sectionSlugFromPath, zhGuideDocs } from "../../section-docs"; + +export function getStaticPaths() { + const activeLabels: Record = { + install: "安装并启动 CCR", + provider: "接入供应商", + "agent-profile": "接入 Agent配置", + observability: "日志&观测", + }; + + return Object.entries(zhGuideDocs).map(([filePath, mod]) => { + const slug = sectionSlugFromPath(filePath); + + return { + params: { slug }, + props: { mod, activeSidebarItem: activeLabels[slug] }, + }; + }); +} + +const { mod, activeSidebarItem } = Astro.props; +--- + + diff --git a/docs/src/pages/index.astro b/docs/src/pages/index.astro new file mode 100644 index 0000000..821533e --- /dev/null +++ b/docs/src/pages/index.astro @@ -0,0 +1,5 @@ +--- +import DocPage from "../components/DocPage.astro"; +--- + + diff --git a/docs/src/pages/troubleshooting.astro b/docs/src/pages/troubleshooting.astro new file mode 100644 index 0000000..c06aa5b --- /dev/null +++ b/docs/src/pages/troubleshooting.astro @@ -0,0 +1,6 @@ +--- +import DocPage from "../components/DocPage.astro"; +import * as doc from "../content/docs/zh/troubleshooting.md"; +--- + + diff --git a/docs/src/section-docs.ts b/docs/src/section-docs.ts new file mode 100644 index 0000000..ef54b38 --- /dev/null +++ b/docs/src/section-docs.ts @@ -0,0 +1,27 @@ +export type SectionDocModule = { + Content: any; + frontmatter: { + title?: string; + pageTitle?: string; + eyebrow?: string; + lead?: string; + [key: string]: unknown; + }; + getHeadings: () => { depth: number; slug: string; text: string }[]; + rawContent: () => string; +}; + +export const zhGuideDocs = import.meta.glob( + "./content/docs/zh/guides/*.md", + { eager: true } +); + +export const enGuideDocs = import.meta.glob( + "./content/docs/en/guides/*.md", + { eager: true } +); + +export function sectionSlugFromPath(filePath: string): string { + const file = filePath.split("/").pop() ?? filePath; + return file.replace(/\.md$/, ""); +} diff --git a/docs/src/styles/global.css b/docs/src/styles/global.css new file mode 100644 index 0000000..094438b --- /dev/null +++ b/docs/src/styles/global.css @@ -0,0 +1,1865 @@ +:root { + color-scheme: light; + --bg: #ffffff; + --shell-bg: linear-gradient(90deg, #f8faf8 0, #ffffff 17%, #ffffff 83%, #fbfcfb 100%); + --surface: #ffffff; + --surface-muted: #f7f8f7; + --surface-soft: #f6f8f6; + --surface-raised: rgba(255, 255, 255, 0.92); + --panel: #fbfbfa; + --panel-strong: #f5f6f4; + --text: #1d201f; + --heading: #171d1b; + --body: #404742; + --muted: #5f6661; + --subtle: #8b938e; + --border: #e6e8e5; + --border-soft: #eef1ee; + --border-strong: #d8ddd9; + --green: #0a7f48; + --green-soft: #e8f6ef; + --green-border: #cce5d7; + --danger: #b03a2e; + --button-text: #3d4440; + --button-hover-text: #18201c; + --nav-text: #3e4641; + --nav-active-bg: #f5f5f4; + --nav-active-text: #111413; + --nav-active-border: #f0f1ef; + --menu-text: #4d554f; + --kbd-bg: #eef2ef; + --kbd-text: #757d78; + --kbd-border: #e3e8e4; + --sidebar-bg: rgba(250, 251, 250, 0.92); + --sidebar-heading: #202522; + --sidebar-text: #4c534f; + --sidebar-icon: #111513; + --sidebar-subtle: #a0a7a3; + --sidebar-line: #e3e7e4; + --article-text: #3f4742; + --article-muted: #424b45; + --lead: #4c524f; + --code-bg: #f5f7f5; + --code-panel-bg: #ffffff; + --code-toolbar-bg: #f4f6f4; + --code-text: #18201c; + --code-border: #e5e8e4; + --table-bg: #ffffff; + --table-head-bg: #f6f8f6; + --table-text: #4b554f; + --quote-bg: #f4faf6; + --quote-text: #34423a; + --step-text: #555e58; + --toc-heading: #313834; + --toc-text: #626a65; + --scrollbar-thumb: #c7ccc8; + --focus-border: #dfe6e1; + --tiny-shadow: 0 1px 2px rgba(31, 40, 35, 0.05); + --shadow: 0 18px 48px rgba(31, 40, 35, 0.08); + font-family: + Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", + sans-serif; +} + +@media (prefers-color-scheme: dark) { + :root:not([data-theme]) { + color-scheme: dark; + --bg: #0f1210; + --shell-bg: linear-gradient(90deg, #0d100e 0, #111512 17%, #111512 83%, #0f1310 100%); + --surface: #151a17; + --surface-muted: #1a201c; + --surface-soft: #181e1a; + --surface-raised: rgba(17, 21, 18, 0.9); + --panel: #141915; + --panel-strong: #1a211c; + --text: #e8ede9; + --heading: #f4f7f5; + --body: #cbd4ce; + --muted: #a8b2ac; + --subtle: #78837d; + --border: #26302a; + --border-soft: #202923; + --border-strong: #344139; + --green: #4ed08d; + --green-soft: #143424; + --green-border: #245a3a; + --danger: #f07468; + --button-text: #d3dbd6; + --button-hover-text: #f5f8f6; + --nav-text: #b8c2bc; + --nav-active-bg: #1c251f; + --nav-active-text: #f5f8f6; + --nav-active-border: #28332c; + --menu-text: #c4cec7; + --kbd-bg: #1d261f; + --kbd-text: #9ca8a1; + --kbd-border: #2b362f; + --sidebar-bg: rgba(15, 19, 16, 0.92); + --sidebar-heading: #e4ebe6; + --sidebar-text: #b6c0ba; + --sidebar-icon: #d9e2dc; + --sidebar-subtle: #6f7a73; + --sidebar-line: #28322b; + --article-text: #cad4ce; + --article-muted: #c1cbc5; + --lead: #b5c1ba; + --code-bg: #141a16; + --code-panel-bg: #111713; + --code-toolbar-bg: #172019; + --code-text: #dbe6df; + --code-border: #2a352e; + --table-bg: #121713; + --table-head-bg: #18211b; + --table-text: #c2ccc6; + --quote-bg: #13261b; + --quote-text: #cce0d2; + --step-text: #b2beb7; + --toc-heading: #d8e0db; + --toc-text: #a0aba4; + --scrollbar-thumb: #455149; + --focus-border: #3a493f; + --tiny-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); + --shadow: 0 22px 52px rgba(0, 0, 0, 0.42); + } +} + +:root[data-theme="dark"] { + color-scheme: dark; + --bg: #0f1210; + --shell-bg: linear-gradient(90deg, #0d100e 0, #111512 17%, #111512 83%, #0f1310 100%); + --surface: #151a17; + --surface-muted: #1a201c; + --surface-soft: #181e1a; + --surface-raised: rgba(17, 21, 18, 0.9); + --panel: #141915; + --panel-strong: #1a211c; + --text: #e8ede9; + --heading: #f4f7f5; + --body: #cbd4ce; + --muted: #a8b2ac; + --subtle: #78837d; + --border: #26302a; + --border-soft: #202923; + --border-strong: #344139; + --green: #4ed08d; + --green-soft: #143424; + --green-border: #245a3a; + --danger: #f07468; + --button-text: #d3dbd6; + --button-hover-text: #f5f8f6; + --nav-text: #b8c2bc; + --nav-active-bg: #1c251f; + --nav-active-text: #f5f8f6; + --nav-active-border: #28332c; + --menu-text: #c4cec7; + --kbd-bg: #1d261f; + --kbd-text: #9ca8a1; + --kbd-border: #2b362f; + --sidebar-bg: rgba(15, 19, 16, 0.92); + --sidebar-heading: #e4ebe6; + --sidebar-text: #b6c0ba; + --sidebar-icon: #d9e2dc; + --sidebar-subtle: #6f7a73; + --sidebar-line: #28322b; + --article-text: #cad4ce; + --article-muted: #c1cbc5; + --lead: #b5c1ba; + --code-bg: #141a16; + --code-panel-bg: #111713; + --code-toolbar-bg: #172019; + --code-text: #dbe6df; + --code-border: #2a352e; + --table-bg: #121713; + --table-head-bg: #18211b; + --table-text: #c2ccc6; + --quote-bg: #13261b; + --quote-text: #cce0d2; + --step-text: #b2beb7; + --toc-heading: #d8e0db; + --toc-text: #a0aba4; + --scrollbar-thumb: #455149; + --focus-border: #3a493f; + --tiny-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); + --shadow: 0 22px 52px rgba(0, 0, 0, 0.42); +} + +* { + box-sizing: border-box; +} + +html { + min-width: 320px; + scroll-behavior: smooth; +} + +body { + margin: 0; + background: var(--bg); + color: var(--text); + font-size: 15px; + line-height: 1.7; +} + +a { + color: inherit; + text-decoration: none; +} + +button, +input { + font: inherit; +} + +svg { + display: block; + fill: none; + stroke: currentColor; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 1.8; +} + +code, +kbd, +pre { + font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace; +} + +.shell { + min-height: 100vh; + background: var(--shell-bg); +} + +.topbar { + position: sticky; + top: 0; + z-index: 10; + display: grid; + grid-template-columns: auto auto minmax(0, 1fr); + align-items: center; + gap: 18px; + height: 66px; + padding: 0 34px; + border-bottom: 1px solid var(--border); + background: var(--surface-raised); + backdrop-filter: blur(14px); +} + +.brand { + display: inline-flex; + align-items: center; + gap: 9px; + min-width: max-content; + font-size: 24px; + font-weight: 760; + letter-spacing: 0; +} + +.brand-logo { + width: 27px; + height: 27px; + border-radius: 7px; +} + +.language-switcher { + position: relative; + min-width: 86px; + color: var(--button-text); +} + +.language-switcher summary { + display: inline-flex; + align-items: center; + gap: 6px; + min-height: 38px; + padding: 0 8px; + border-radius: 10px; + cursor: pointer; + list-style: none; + user-select: none; +} + +.language-switcher summary::-webkit-details-marker { + display: none; +} + +.language-switcher summary:hover { + background: var(--surface-muted); +} + +.language-switcher svg { + width: 13px; + height: 13px; + color: var(--subtle); +} + +.language-menu { + position: absolute; + top: calc(100% + 8px); + left: 0; + display: grid; + min-width: 136px; + padding: 6px; + border: 1px solid var(--border); + border-radius: 12px; + background: var(--surface); + box-shadow: var(--shadow); +} + +.language-menu a { + display: flex; + align-items: center; + min-height: 34px; + padding: 0 10px; + border-radius: 8px; + color: var(--menu-text); +} + +.language-menu a:hover { + background: var(--surface-soft); +} + +.language-menu a.active { + color: var(--green); + font-weight: 720; +} + +.top-actions { + justify-self: end; + display: inline-flex; + align-items: center; + gap: 6px; + min-width: 0; + height: 44px; + padding: 0; + border: 0; + border-radius: 0; + background: transparent; + box-shadow: none; +} + +.search { + position: relative; + display: inline-flex; + align-items: center; + gap: 8px; + width: 194px; + height: 38px; + padding: 0 12px; + border: 1px solid var(--border); + border-radius: 999px; + background: transparent; + color: var(--muted); + transition: + border-color 140ms ease, + background 140ms ease, + box-shadow 140ms ease; +} + +.search:focus-within { + border-color: var(--focus-border); + background: var(--surface); + box-shadow: var(--tiny-shadow); +} + +.search svg { + width: 17px; + height: 17px; + flex: 0 0 auto; +} + +.search input { + min-width: 0; + width: 100%; + border: 0; + outline: 0; + background: transparent; + color: var(--text); +} + +.search kbd { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 28px; + height: 20px; + padding: 0 5px; + border-radius: 7px; + background: var(--kbd-bg); + color: var(--kbd-text); + font-size: 12px; + line-height: 1; + box-shadow: inset 0 0 0 1px var(--kbd-border); +} + +.search-results { + position: absolute; + top: calc(100% + 8px); + right: 0; + z-index: 30; + display: grid; + gap: 4px; + width: min(360px, calc(100vw - 32px)); + max-height: min(420px, calc(100vh - 96px)); + padding: 7px; + border: 1px solid var(--border); + border-radius: 12px; + background: var(--surface); + box-shadow: var(--shadow); + overflow: auto; +} + +.search-results[hidden] { + display: none; +} + +.search-result { + display: grid; + gap: 3px; + min-width: 0; + padding: 9px 10px; + border-radius: 8px; + color: var(--text); + text-decoration: none; +} + +.search-result:hover, +.search-result.active { + background: var(--green-soft); +} + +.search-result span, +.search-result small { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.search-result span { + font-size: 13px; + font-weight: 720; +} + +.search-result small { + color: var(--muted); + font-size: 11px; + font-weight: 620; +} + +.search-empty { + padding: 12px 10px; + color: var(--muted); + font-size: 13px; +} + +.soft-button, +.primary-button, +.icon-button, +.copy-page { + display: inline-flex; + align-items: center; + justify-content: center; + border: 1px solid var(--border); + cursor: pointer; + white-space: nowrap; +} + +.soft-button { + gap: 8px; + height: 38px; + padding: 0 14px; + border-radius: 999px; + border-color: var(--border); + background: transparent; + color: var(--button-text); + transition: + border-color 140ms ease, + background 140ms ease, + color 140ms ease, + box-shadow 140ms ease; +} + +.soft-button:hover { + border-color: var(--focus-border); + background: var(--surface); + color: var(--button-hover-text); + box-shadow: var(--tiny-shadow); +} + +.soft-button svg { + width: 17px; + height: 17px; +} + +.icon-link { + width: 38px; + padding: 0; +} + +.sidebar-toggle { + display: none; +} + +.sidebar-backdrop { + display: none; +} + +.github-button { + gap: 4px; +} + +.github-button strong { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 34px; + height: 22px; + padding: 0 2px; + border-radius: 999px; + color: var(--green); + font-size: 12px; + font-weight: 720; + line-height: 1; +} + +.primary-button { + height: 38px; + padding: 0 17px; + border-color: var(--green); + border-radius: 999px; + background: var(--green); + color: var(--bg); + font-weight: 650; +} + +.icon-button { + width: 38px; + height: 38px; + border-color: var(--border); + border-radius: 50%; + background: transparent; + color: var(--muted); + transition: + border-color 140ms ease, + background 140ms ease, + color 140ms ease, + box-shadow 140ms ease; +} + +.icon-button:hover { + border-color: var(--focus-border); + background: var(--surface); + color: var(--button-hover-text); + box-shadow: var(--tiny-shadow); +} + +.icon-button svg { + width: 19px; + height: 19px; +} + +.theme-icon { + display: none; + align-items: center; + justify-content: center; +} + +:root[data-theme="light"] .theme-icon-sun, +:root:not([data-theme]) .theme-icon-sun { + display: inline-flex; +} + +:root[data-theme="dark"] .theme-icon-moon { + display: inline-flex; +} + +@media (prefers-color-scheme: dark) { + :root:not([data-theme]) .theme-icon-sun { + display: none; + } + + :root:not([data-theme]) .theme-icon-moon { + display: inline-flex; + } +} + +.content-grid { + display: grid; + grid-template-columns: 240px minmax(0, 1fr) 260px; + min-height: calc(100vh - 66px); +} + +.sidebar { + position: sticky; + top: 66px; + height: calc(100vh - 66px); + border-right: 1px solid var(--border); + background: var(--sidebar-bg); + overflow: hidden; +} + +.sidebar-inner { + height: 100%; + overflow: auto; + padding: 20px 13px 34px 28px; + scrollbar-color: var(--scrollbar-thumb) transparent; + scrollbar-width: thin; +} + +.sidebar-group { + margin: 0 0 26px; +} + +.sidebar-directory { + margin: 0 0 24px; +} + +.sidebar-directory ul, +.directory-list, +.directory-group ul { + display: grid; + gap: 1px; + margin: 0; + padding: 0; + list-style: none; +} + +.directory-details { + margin: 0 0 4px; +} + +.directory-summary { + min-height: 37px; + padding: 7px 8px 7px 0; + color: var(--nav-text); + font-weight: 700; +} + +.directory-summary.active { + color: var(--green); + font-weight: 760; +} + +.directory-group { + margin: 8px 0 14px; +} + +.directory-group:last-child { + margin-bottom: 4px; +} + +.directory-group + .directory-group { + margin-top: 20px; +} + +.directory-group-label { + display: block; + min-height: 20px; + padding: 2px 8px 5px 0; + color: var(--sidebar-subtle); + font-size: 11px; + font-weight: 760; + letter-spacing: 0.04em; + line-height: 1.3; +} + +.sidebar-group h2 { + display: flex; + align-items: center; + gap: 9px; + margin: 0 0 7px; + font-size: 13px; + line-height: 1.3; + font-weight: 720; + color: var(--sidebar-heading); +} + +.group-icon { + width: 16px; + height: 16px; + color: var(--sidebar-icon); + flex: 0 0 auto; +} + +.sidebar-group ul { + display: grid; + gap: 1px; + margin: 0; + padding: 0; + list-style: none; +} + +.sidebar-link { + display: flex; + align-items: flex-start; + justify-content: space-between; + min-height: 33px; + gap: 8px; + padding: 6px 8px 6px 0; + color: var(--sidebar-text); + line-height: 1.35; +} + +.sidebar-link span { + min-width: 0; + overflow: visible; + text-overflow: clip; + white-space: normal; + overflow-wrap: break-word; +} + +.sidebar-link svg { + width: 13px; + height: 13px; + margin-top: 3px; + color: var(--sidebar-subtle); + flex: 0 0 auto; + transition: transform 150ms ease; +} + +.sidebar-link.active { + color: var(--green); + font-weight: 720; +} + +.sidebar-details { + margin: 0; +} + +.sidebar-details summary { + list-style: none; + cursor: pointer; + user-select: none; + border-radius: 7px; +} + +.sidebar-details summary::-webkit-details-marker { + display: none; +} + +.sidebar-details summary:hover { + color: var(--sidebar-heading); +} + +.sidebar-details[open] > summary { + color: var(--sidebar-heading); + font-weight: 620; +} + +.sidebar-details[open] > summary svg { + transform: rotate(90deg); +} + +.sidebar-details:not([open]) > .sidebar-children { + display: none; +} + +.sidebar-children { + display: grid; + gap: 2px; + position: relative; + margin: 1px 0 0; + padding: 0 0 0 20px; + border-left: 0; + overflow: visible; +} + +.sidebar-directory .sidebar-children { + padding-left: 18px; +} + +.sidebar-children::before { + position: absolute; + top: 4px; + bottom: 6px; + left: 5px; + width: 1px; + content: ""; + border-radius: 999px; + background: var(--sidebar-line); +} + +.sidebar-directory .sidebar-children::before { + left: 8px; +} + +.sidebar-directory .directory-children { + padding-left: 13px; +} + +.sidebar-directory .directory-children::before { + display: none; +} + +.sidebar-details[open] > .sidebar-children { + margin-bottom: 7px; +} + +.sidebar-child-link { + display: block; + min-height: 29px; + padding: 5px 8px 5px 0; + color: var(--muted); + font-size: 14px; + line-height: 1.5; + overflow: visible; + text-overflow: clip; + white-space: normal; + overflow-wrap: break-word; +} + +.sidebar-child-link:hover { + color: var(--green); +} + +.sidebar-child-link.active { + color: var(--green); + font-weight: 720; +} + +@media (prefers-reduced-motion: reduce) { + .sidebar-link svg { + transition: none; + } +} + +.doc-main { + min-width: 0; + padding: 62px 44px 56px; +} + +.doc-article { + width: min(100%, 760px); + margin: 0 auto; + color: var(--body); +} + +.article-header { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 28px; + align-items: start; + margin-bottom: 34px; +} + +.eyebrow { + margin: 0 0 8px; + color: var(--green); + font-size: 13px; + font-weight: 650; +} + +h1, +h2, +h3, +h4, +h5, +p { + overflow-wrap: anywhere; +} + +h1 { + margin: 0; + color: var(--heading); + font-size: 32px; + line-height: 1.18; + font-weight: 760; + letter-spacing: 0; +} + +.lead { + margin: 10px 0 0; + color: var(--lead); + font-size: 20px; + line-height: 1.48; +} + +.copy-page { + gap: 9px; + height: 40px; + min-width: 118px; + margin-top: 31px; + padding: 0 13px; + border-radius: 12px; + background: var(--surface); + color: var(--button-text); + box-shadow: var(--tiny-shadow); +} + +.copy-page.copied { + border-color: var(--green-border); + background: var(--green-soft); + color: var(--green); +} + +.copy-page svg { + width: 17px; + height: 17px; +} + +.doc-markdown { + color: var(--article-text); + font-size: 16px; + line-height: 1.78; +} + +.doc-article > p, +.doc-article section > p, +.doc-markdown > p { + margin: 0 0 18px; + color: var(--article-muted); + font-size: 16px; + line-height: 1.78; +} + +.doc-markdown a { + color: var(--green); + font-weight: 640; + text-decoration: underline; + text-decoration-thickness: 1px; + text-underline-offset: 3px; +} + +.doc-article :not(pre) > code, +.doc-markdown :not(pre) > code { + padding: 2px 6px; + border: 1px solid var(--code-border); + border-radius: 6px; + background: var(--code-bg); + color: var(--code-text); + font-size: 0.88em; + white-space: break-spaces; +} + +.doc-article section, +.doc-markdown > h2 { + scroll-margin-top: 88px; +} + +.doc-article h2, +.doc-markdown > h2 { + margin: 52px 0 18px; + padding-top: 10px; + border-top: 1px solid var(--border-soft); + color: var(--heading); + font-size: 25px; + line-height: 1.28; + font-weight: 760; + letter-spacing: 0; +} + +.doc-markdown > h2:first-child { + margin-top: 0; + padding-top: 0; + border-top: 0; +} + +.doc-article h3, +.doc-markdown > h3 { + margin: 30px 0 9px; + color: var(--heading); + font-size: 17px; + line-height: 1.4; + font-weight: 720; +} + +.doc-article h4, +.doc-markdown > h4 { + margin: 24px 0 8px; + color: var(--heading); + font-size: 15px; + line-height: 1.45; + font-weight: 700; +} + +.doc-article h5, +.doc-markdown > h5 { + margin: 18px 0 6px; + color: var(--heading); + font-size: 14px; + line-height: 1.45; + font-weight: 680; +} + +.doc-markdown > ul, +.doc-markdown > ol { + margin: 0 0 22px; + padding-left: 24px; + color: var(--article-text); +} + +.doc-markdown > ul { + list-style: disc; +} + +.doc-markdown > ol { + list-style: decimal; +} + +.doc-markdown li { + margin: 7px 0; + padding-left: 2px; +} + +.doc-markdown li::marker { + color: var(--green); + font-weight: 720; +} + +.doc-markdown > table { + width: 100%; + max-width: 100%; + margin: 18px 0 30px; + border: 1px solid var(--border); + border-radius: 12px; + border-spacing: 0; + border-collapse: separate; + table-layout: fixed; + background: var(--table-bg); + box-shadow: var(--tiny-shadow); + overflow: hidden; +} + +.doc-markdown th, +.doc-markdown td { + padding: 11px 14px; + border-right: 1px solid var(--border); + border-bottom: 1px solid var(--border); + text-align: left; + vertical-align: top; + overflow-wrap: anywhere; +} + +.doc-markdown th:first-child, +.doc-markdown td:first-child { + width: 28%; +} + +.doc-markdown th { + background: var(--table-head-bg); + color: var(--heading); + font-size: 13px; + font-weight: 740; + line-height: 1.45; +} + +.doc-markdown td { + color: var(--table-text); + font-size: 14px; + line-height: 1.62; +} + +.doc-markdown tr:last-child td { + border-bottom: 0; +} + +.doc-markdown th:last-child, +.doc-markdown td:last-child { + border-right: 0; +} + +.doc-markdown > hr { + margin: 42px 0; + border: 0; + border-top: 1px solid var(--border); +} + +.doc-markdown > blockquote { + margin: 22px 0; + padding: 12px 16px; + border-left: 3px solid var(--green); + border-radius: 0 10px 10px 0; + background: var(--quote-bg); + color: var(--quote-text); +} + +.provider-import-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 14px; + margin: 24px 0 34px; +} + +.doc-markdown a.provider-import-button { + --provider-brand: #17201c; + --provider-brand-2: #36624d; + --provider-brand-3: #dff8eb; + --provider-accent: rgba(255, 255, 255, 0.72); + position: relative; + isolation: isolate; + display: grid; + grid-template-columns: 48px minmax(0, 1fr); + column-gap: 14px; + align-items: center; + min-height: 86px; + padding: 13px 16px 13px 12px; + overflow: hidden; + border: 1px solid color-mix(in srgb, var(--provider-brand-2) 42%, transparent); + border-radius: 12px; + background: + radial-gradient(circle at 14% 22%, color-mix(in srgb, var(--provider-brand-3) 34%, transparent) 0, transparent 30%), + radial-gradient(circle at 96% 96%, color-mix(in srgb, var(--provider-brand-2) 44%, transparent) 0, transparent 46%), + linear-gradient(135deg, var(--provider-brand), color-mix(in srgb, var(--provider-brand-2) 88%, #111 12%)); + box-shadow: + 0 10px 26px color-mix(in srgb, var(--provider-brand) 22%, transparent), + inset 0 1px 0 rgba(255, 255, 255, 0.16); + color: #fff; + text-decoration: none; + text-decoration-thickness: 0; + transform: translateY(0); + transition: + border-color 180ms ease, + box-shadow 220ms ease, + transform 220ms ease; +} + +.doc-markdown a.provider-import-button::before { + content: ""; + position: absolute; + inset: -40% auto -40% -70%; + z-index: -1; + width: 58%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.26), transparent); + transform: skewX(-18deg); + transition: transform 620ms ease; +} + +.doc-markdown a.provider-import-button::after { + content: ""; + position: absolute; + right: -38px; + bottom: -52px; + z-index: -2; + width: 132px; + height: 132px; + border-radius: 999px; + background: radial-gradient(circle, color-mix(in srgb, var(--provider-brand-3) 38%, transparent), transparent 68%); + opacity: 0.82; + transform: scale(0.96); + transition: + opacity 220ms ease, + transform 220ms ease; +} + +.doc-markdown a.provider-import-button:hover, +.doc-markdown a.provider-import-button:focus-visible { + border-color: color-mix(in srgb, var(--provider-brand-3) 68%, rgba(255, 255, 255, 0.34)); + box-shadow: + 0 16px 34px color-mix(in srgb, var(--provider-brand) 30%, transparent), + 0 0 0 1px color-mix(in srgb, var(--provider-brand-3) 26%, transparent), + inset 0 1px 0 rgba(255, 255, 255, 0.22); + color: #fff; + transform: translateY(-3px); + text-decoration: none; +} + +.doc-markdown a.provider-import-button:hover::before, +.doc-markdown a.provider-import-button:focus-visible::before { + transform: translateX(320%) skewX(-18deg); +} + +.doc-markdown a.provider-import-button:hover::after, +.doc-markdown a.provider-import-button:focus-visible::after { + opacity: 1; + transform: scale(1.08); +} + +.doc-markdown a.provider-import-button:active { + transform: translateY(-1px) scale(0.992); +} + +.provider-import-icon-shell { + position: relative; + z-index: 1; + grid-column: 1; + grid-row: 1; + justify-self: start; + display: grid; + place-items: center; + width: 48px; + height: 48px; + border: 0; + background: transparent; + box-shadow: none; + transform: rotate(0) scale(1); + transition: transform 220ms ease; +} + +.provider-import-icon-shell::before { + content: none; +} + +.provider-import-icon-shell img { + box-sizing: border-box; + display: block; + width: 48px; + height: 48px; + border: 1px solid rgba(255, 255, 255, 0.46); + border-radius: 12px; + background: color-mix(in srgb, #ffffff 84%, var(--provider-brand-3)); + box-shadow: + 0 8px 18px rgba(0, 0, 0, 0.14), + inset 0 1px 0 rgba(255, 255, 255, 0.6); + object-fit: contain; + filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.12)); + transition: + border-color 180ms ease, + box-shadow 220ms ease; +} + +.provider-import-mark { + box-sizing: border-box; + display: grid; + place-items: center; + width: 48px; + height: 48px; + border: 1px solid rgba(255, 255, 255, 0.46); + border-radius: 12px; + background: linear-gradient( + 135deg, + color-mix(in srgb, var(--provider-brand-3) 36%, rgba(255, 255, 255, 0.88)), + color-mix(in srgb, var(--provider-brand-2) 72%, #111111 28%) + ); + box-shadow: + 0 8px 18px rgba(0, 0, 0, 0.14), + inset 0 1px 0 rgba(255, 255, 255, 0.52); + color: #ffffff; + font-size: 14px; + font-weight: 820; + letter-spacing: 0; + line-height: 1; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.34); + transition: + border-color 180ms ease, + box-shadow 220ms ease; +} + +.doc-markdown a.provider-import-button:hover .provider-import-icon-shell, +.doc-markdown a.provider-import-button:focus-visible .provider-import-icon-shell { + transform: rotate(-3deg) scale(1.06); +} + +.doc-markdown a.provider-import-button:hover .provider-import-icon-shell img, +.doc-markdown a.provider-import-button:focus-visible .provider-import-icon-shell img, +.doc-markdown a.provider-import-button:hover .provider-import-mark, +.doc-markdown a.provider-import-button:focus-visible .provider-import-mark { + border-color: color-mix(in srgb, var(--provider-brand-3) 74%, rgba(255, 255, 255, 0.54)); + box-shadow: + 0 12px 24px rgba(0, 0, 0, 0.18), + 0 0 0 4px color-mix(in srgb, var(--provider-brand-3) 16%, transparent), + inset 0 1px 0 rgba(255, 255, 255, 0.72); +} + +.provider-import-copy { + display: grid; + min-width: 0; + gap: 2px; + padding: 0; +} + +.provider-import-name { + display: block; + overflow: hidden; + color: #fff; + font-size: 15px; + font-weight: 780; + line-height: 1.25; + text-overflow: ellipsis; + white-space: nowrap; +} + +.provider-import-meta { + display: block; + overflow: hidden; + color: rgba(255, 255, 255, 0.74); + font-size: 11px; + font-weight: 650; + letter-spacing: 0; + line-height: 1.35; + text-overflow: ellipsis; + white-space: nowrap; +} + +.doc-markdown a.provider-import-button.provider-openai { + --provider-brand: #0b0f0e; + --provider-brand-2: #39413e; + --provider-brand-3: #f2f5f1; +} + +.doc-markdown a.provider-import-button.provider-anthropic { + --provider-brand: #3f2118; + --provider-brand-2: #c56a4b; + --provider-brand-3: #ffd1bf; +} + +.doc-markdown a.provider-import-button.provider-gemini { + --provider-brand: #1a73e8; + --provider-brand-2: #a142f4; + --provider-brand-3: #fbbc04; +} + +.doc-markdown a.provider-import-button.provider-openrouter { + --provider-brand: #111722; + --provider-brand-2: #66758c; + --provider-brand-3: #d9e3f1; +} + +.doc-markdown a.provider-import-button.provider-runapi { + --provider-brand: #070707; + --provider-brand-2: #747474; + --provider-brand-3: #f3f3f3; +} + +.doc-markdown a.provider-import-button.provider-teamorouter { + --provider-brand: #0c0c0f; + --provider-brand-2: #555b64; + --provider-brand-3: #f4f4f5; +} + +.doc-markdown a.provider-import-button.provider-code0 { + --provider-brand: #101214; + --provider-brand-2: #267dff; + --provider-brand-3: #d8e8ff; +} + +.doc-markdown a.provider-import-button.provider-claudeapi { + --provider-brand: #0d1b2a; + --provider-brand-2: #2f8f83; + --provider-brand-3: #d7fff8; +} + +.doc-markdown a.provider-import-button.provider-deepseek { + --provider-brand: #173aa8; + --provider-brand-2: #4e69ff; + --provider-brand-3: #d6deff; +} + +.doc-markdown a.provider-import-button.provider-zhipu-coding { + --provider-brand: #0d4fd7; + --provider-brand-2: #22b8f0; + --provider-brand-3: #d7f2ff; +} + +.doc-markdown a.provider-import-button.provider-zhipu-general { + --provider-brand: #1728a6; + --provider-brand-2: #5f6dff; + --provider-brand-3: #e0e4ff; +} + +.doc-markdown a.provider-import-button.provider-zai-coding { + --provider-brand: #111111; + --provider-brand-2: #49515d; + --provider-brand-3: #f2f5f8; +} + +.doc-markdown a.provider-import-button.provider-zai-general { + --provider-brand: #0d1424; + --provider-brand-2: #3267ac; + --provider-brand-3: #dce8ff; +} + +.doc-markdown a.provider-import-button.provider-mistral { + --provider-brand: #581900; + --provider-brand-2: #ff8a00; + --provider-brand-3: #ffd84f; +} + +.doc-markdown a.provider-import-button.provider-moonshot { + --provider-brand: #10133a; + --provider-brand-2: #7465ff; + --provider-brand-3: #e4ddff; +} + +.doc-markdown a.provider-import-button.provider-moonshot-global { + --provider-brand: #0f1f42; + --provider-brand-2: #4f7cff; + --provider-brand-3: #dce7ff; +} + +.doc-markdown a.provider-import-button.provider-kimi-coding { + --provider-brand: #111237; + --provider-brand-2: #5c6bff; + --provider-brand-3: #dfe4ff; +} + +.doc-markdown a.provider-import-button.provider-bailian { + --provider-brand: #5a2300; + --provider-brand-2: #ff6a00; + --provider-brand-3: #ffd1a3; +} + +.doc-markdown a.provider-import-button.provider-siliconflow { + --provider-brand: #041f1b; + --provider-brand-2: #00c2a8; + --provider-brand-3: #b4fff4; +} + +.doc-markdown > pre, +.doc-markdown > .code-panel { + margin: 22px 0 32px; +} + +.code-panel { + margin: 22px 0 32px; + overflow: hidden; + border: 1px solid var(--border-strong); + border-radius: 16px; + background: var(--code-panel-bg); + box-shadow: var(--tiny-shadow); +} + +.code-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + height: 38px; + padding: 0 17px; + border-bottom: 1px solid var(--border); + background: var(--code-toolbar-bg); + color: var(--article-text); + font-size: 12px; +} + +.code-copy { + display: inline-flex; + align-items: center; + justify-content: center; + position: relative; + width: 18px; + height: 18px; + margin: 0; + padding: 0; + border: 0; + background: transparent; + color: var(--muted); + cursor: pointer; +} + +.code-copy:hover { + color: var(--button-hover-text); +} + +.code-copy.copied { + color: var(--green); +} + +.code-copy.copy-failed { + color: var(--danger); +} + +.code-copy .copy-icon, +.code-copy .success-icon { + position: absolute; + inset: 0; + display: inline-flex; + align-items: center; + justify-content: center; + transition: + opacity 160ms ease, + transform 160ms ease, + color 160ms ease; +} + +.code-copy svg { + width: 18px; + height: 18px; +} + +.code-copy .success-icon { + opacity: 0; + transform: scale(0.72); +} + +.code-copy.copied .copy-icon { + opacity: 0; + transform: scale(0.72); +} + +.code-copy.copied .success-icon { + opacity: 1; + transform: scale(1); +} + +pre, +.code-content { + margin: 0; + padding: 18px 18px 20px; + overflow-x: auto; + background: var(--code-panel-bg) !important; + color: var(--code-text); + font-size: 14px; + line-height: 1.7; +} + +pre.astro-code, +pre.astro-code span { + color: var(--shiki-light, var(--code-text)); +} + +:root[data-theme="dark"] pre.astro-code, +:root[data-theme="dark"] pre.astro-code span { + color: var(--shiki-dark, var(--code-text)); +} + +@media (prefers-color-scheme: dark) { + :root:not([data-theme]) pre.astro-code, + :root:not([data-theme]) pre.astro-code span { + color: var(--shiki-dark, var(--code-text)); + } +} + +.code-content code, +pre code { + display: block; + padding: 0; + border: 0; + border-radius: 0; + background: transparent; + box-shadow: none; + color: inherit; + font-size: inherit; + line-height: inherit; + white-space: pre; +} + +.code-content code span, +pre code span { + padding: 0; + border: 0; + border-radius: 0; + background: transparent; + box-shadow: none; +} + +.steps { + display: grid; + gap: 12px; + margin: 22px 0 30px; +} + +.step { + display: grid; + grid-template-columns: 32px minmax(0, 1fr); + gap: 13px; + align-items: start; + padding: 15px 16px; + border: 1px solid var(--border); + border-radius: 14px; + background: var(--surface); +} + +.step > span { + display: inline-flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border-radius: 50%; + background: var(--green-soft); + color: var(--green); + font-size: 14px; + font-weight: 760; +} + +.step p { + margin: 0; + color: var(--step-text); +} + +.toc { + position: sticky; + top: 66px; + height: calc(100vh - 66px); + padding: 21px 34px 0 20px; + border-left: 1px solid var(--border); +} + +.toc-card { + position: sticky; + top: 87px; +} + +.toc h2 { + display: flex; + align-items: center; + gap: 9px; + margin: 0 0 6px; + color: var(--toc-heading); + font-size: 14px; + font-weight: 560; +} + +.toc h2 svg { + width: 16px; + height: 16px; +} + +.toc nav { + display: grid; + gap: 4px; +} + +.toc a { + --toc-dot-left: 0px; + position: relative; + display: block; + padding: 5px 0 5px 21px; + color: var(--toc-text); + line-height: 1.35; +} + +.toc a.toc-depth-3 { + --toc-dot-left: 12px; + padding-left: 33px; + font-size: 13.5px; +} + +.toc a.toc-depth-4 { + --toc-dot-left: 24px; + padding-left: 45px; + font-size: 13px; +} + +.toc a.toc-depth-5, +.toc a.toc-depth-6 { + --toc-dot-left: 36px; + padding-left: 57px; + font-size: 12.5px; +} + +.toc a.active { + color: var(--green); + font-weight: 720; +} + +.toc a.active::before { + position: absolute; + left: var(--toc-dot-left); + top: 13px; + width: 5px; + height: 5px; + content: ""; + border-radius: 50%; + background: var(--green); +} + +@media (max-width: 1220px) { + .topbar { + grid-template-columns: auto auto 1fr; + } + + .content-grid { + grid-template-columns: 228px minmax(0, 1fr); + } + + .toc { + display: none; + } +} + +@media (max-width: 920px) { + .topbar { + grid-template-columns: auto 1fr auto; + padding: 0 18px; + } + + .hide-small { + display: none; + } + + .search { + width: min(100%, 230px); + } + + .sidebar-toggle { + display: inline-flex; + } + + .content-grid { + display: block; + } + + body.sidebar-open { + overflow: hidden; + } + + .sidebar-backdrop { + position: fixed; + inset: 66px 0 0; + z-index: 18; + display: block; + padding: 0; + border: 0; + background: rgba(0, 0, 0, 0.28); + opacity: 0; + pointer-events: none; + transition: opacity 160ms ease; + } + + body.sidebar-open .sidebar-backdrop { + opacity: 1; + pointer-events: auto; + } + + .sidebar { + position: fixed; + top: 66px; + bottom: 0; + left: 0; + z-index: 19; + width: min(324px, calc(100vw - 48px)); + height: auto; + border-right: 1px solid var(--border); + border-bottom: 0; + box-shadow: var(--shadow); + transform: translateX(calc(-100% - 10px)); + transition: transform 180ms cubic-bezier(0.2, 0, 0.13, 1); + } + + body.sidebar-open .sidebar { + transform: translateX(0); + } + + .sidebar-inner { + display: block; + height: 100%; + padding: 20px 18px 28px 24px; + overflow: auto; + } + + .sidebar-group { + min-width: 0; + margin: 0 0 24px; + } + + .doc-main { + padding: 44px 22px 48px; + } + + .article-header { + grid-template-columns: 1fr; + } + + .copy-page { + width: max-content; + margin-top: 0; + } +} + +@media (max-width: 640px) { + .topbar { + height: auto; + min-height: 64px; + grid-template-columns: auto auto 1fr; + gap: 10px; + padding: 12px 16px; + } + + .brand { + font-size: 20px; + } + + .top-actions { + justify-self: end; + height: 40px; + padding: 2px; + } + + .search { + display: none; + } + + .sidebar-backdrop { + top: 64px; + } + + .sidebar { + top: 64px; + } + + .soft-button { + width: 36px; + height: 36px; + padding: 0; + } + + .icon-button { + width: 36px; + height: 36px; + } + + .soft-button span { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + clip: rect(0 0 0 0); + white-space: nowrap; + } + + .github-button strong { + display: none; + } + + .content-grid { + min-height: calc(100vh - 64px); + } + + h1 { + font-size: 29px; + } + + .lead { + font-size: 18px; + } + + .doc-main { + padding-inline: 18px; + } + +} + +@media (max-width: 520px) { + .provider-import-grid { + grid-template-columns: 1fr; + gap: 12px; + } + + .doc-markdown a.provider-import-button { + grid-template-columns: 44px minmax(0, 1fr); + column-gap: 12px; + min-height: 92px; + padding: 12px; + } + + .provider-import-icon-shell { + width: 44px; + height: 44px; + } + + .provider-import-icon-shell img, + .provider-import-mark { + width: 44px; + height: 44px; + border-radius: 11px; + } + +} + +@media (prefers-reduced-motion: reduce) { + .doc-markdown a.provider-import-button, + .doc-markdown a.provider-import-button::before, + .doc-markdown a.provider-import-button::after, + .provider-import-icon-shell { + transition: none; + } + + .doc-markdown a.provider-import-button:hover, + .doc-markdown a.provider-import-button:focus-visible, + .doc-markdown a.provider-import-button:hover .provider-import-icon-shell, + .doc-markdown a.provider-import-button:focus-visible .provider-import-icon-shell { + transform: none; + } +} diff --git a/docs/tsconfig.json b/docs/tsconfig.json new file mode 100644 index 0000000..8bf91d3 --- /dev/null +++ b/docs/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] +} diff --git a/electron-builder.json b/electron-builder.json new file mode 100644 index 0000000..3455751 --- /dev/null +++ b/electron-builder.json @@ -0,0 +1,79 @@ +{ + "appId": "com.claudecoderouter.desktop", + "productName": "Claude Code Router", + "asar": true, + "asarUnpack": [ + "**/*.node" + ], + "electronLanguages": ["en-US", "zh-CN", "zh-TW", "zh_CN", "zh_TW"], + "npmRebuild": true, + "publish": [ + { + "provider": "github", + "owner": "musistudio", + "repo": "claude-code-router", + "releaseType": "release" + } + ], + "directories": { + "app": "packages/electron", + "output": "release/${version}" + }, + "afterPack": "build/verify-packaged-app.cjs", + "afterAllArtifactBuild": "build/verify-update-metadata.cjs", + "protocols": [ + { + "name": "Claude Code Router Provider Import", + "schemes": ["ccr"] + } + ], + "files": [ + "dist", + "package.json", + "!node_modules/better-sqlite3/deps/**", + "!node_modules/better-sqlite3/src/**", + "!node_modules/better-sqlite3/binding.gyp", + "!node_modules/better-sqlite3/README.md", + "!node_modules/better-sqlite3/docs/**", + "!node_modules/better-sqlite3/benchmark/**", + "!node_modules/better-sqlite3/test/**" + ], + "mac": { + "icon": "build/icon.icns", + "type": "distribution", + "hardenedRuntime": true, + "forceCodeSigning": true, + "entitlements": "build/entitlements.mac.plist", + "entitlementsInherit": "build/entitlements.mac.inherit.plist", + "notarize": true, + "target": ["dmg", "zip"], + "artifactName": "Claude-Code-Router_${version}.${ext}" + }, + "afterSign": "build/verify-macos-notarization.cjs", + "win": { + "icon": "build/icon.ico", + "target": [ + { + "target": "nsis", + "arch": ["x64"] + } + ], + "artifactName": "Claude-Code-Router_${version}.${ext}" + }, + "linux": { + "executableName": "claude-code-router", + "target": ["AppImage"], + "artifactName": "Claude-Code-Router_${version}.${ext}" + }, + "nsis": { + "oneClick": false, + "allowElevation": true, + "perMachine": false, + "allowToChangeInstallationDirectory": true, + "deleteAppDataOnUninstall": false, + "createDesktopShortcut": true, + "createStartMenuShortcut": true, + "runAfterFinish": true, + "shortcutName": "Claude Code Router" + } +} diff --git a/examples/plugins/claude-design-plugin.cjs b/examples/plugins/claude-design-plugin.cjs new file mode 100644 index 0000000..63d3522 --- /dev/null +++ b/examples/plugins/claude-design-plugin.cjs @@ -0,0 +1,8216 @@ +"use strict"; + +const crypto = require("node:crypto"); +const fs = require("node:fs"); +const http = require("node:http"); +const https = require("node:https"); +const os = require("node:os"); +const pathModule = require("node:path"); +const zlib = require("node:zlib"); + +const DEFAULT_HOST = "claude.ai"; +const DEFAULT_GATEWAY_URL = "http://127.0.0.1:3456"; +const DEFAULT_GATEWAY_MODEL = "claude-sonnet-4-20250514"; +const DEFAULT_UPSTREAM_ORIGIN = "https://claude.ai"; +const DEFAULT_DESIGN_ORIGIN = "https://claude.ai"; +const DEFAULT_DESIGN_REFERRER = "https://claude.ai/design"; +const DEFAULT_FALLBACK_ROUTE_HOSTS = ["claude.com", "www.anthropic.com", "anthropic.com"]; +const CLAUDE_APP_ION_DIST_ENV_KEYS = ["CCR_CLAUDE_APP_ION_DIST_DIR", "CLAUDE_APP_ION_DIST_DIR"]; +const CLAUDE_APP_PATH_ENV_KEYS = ["CCR_CLAUDE_APP_PATH", "CLAUDE_APP_PATH"]; +const CLAUDE_APP_DESIGN_IFRAME_QUERY = "__ccr_design_iframe"; +const CLAUDE_APP_DESIGN_PATH_QUERY = "path"; +const CLAUDE_APP_DESIGN_SHELL_PATH = "/desktop-design"; +const CLAUDE_APP_SPA_ROUTE_PATHS = [ + CLAUDE_APP_DESIGN_SHELL_PATH, + "/discover/design", + "/admin-settings/claude-design" +]; +const OMELETTE_RPC_PATH_PREFIX = "/design/anthropic.omelette.api.v1alpha.OmeletteService"; +const AUTH_ESCAPE_ROUTE_PATHS = ["/login", "/auth", "/oauth"]; +const BOOTSTRAP_ROUTE_PATHS = ["/_bootstrap", "/api/bootstrap", "/edge-api/bootstrap"]; +const REQUIRED_ROUTE_PATHS = ["/", OMELETTE_RPC_PATH_PREFIX, "/v1/design", ...CLAUDE_APP_SPA_ROUTE_PATHS, ...BOOTSTRAP_ROUTE_PATHS, ...AUTH_ESCAPE_ROUTE_PATHS]; +const DEFAULT_ROUTE_PATHS = ["/design", "/v1/design", "/api", "/organizations", "/cdn-cgi", ...BOOTSTRAP_ROUTE_PATHS, ...AUTH_ESCAPE_ROUTE_PATHS]; +const FALLBACK_ROUTE_PATHS = ["/app-unavailable-in-region", "/cdn-cgi", "/design", ...AUTH_ESCAPE_ROUTE_PATHS]; +const DEFAULT_SCRIPT_PATH = "/design/assets/v1/index-C0BEUHEw.js"; +const DEFAULT_STYLE_PATH = "/design/assets/v1/index-CqhNJH1o.css"; +const DEFAULT_DESIGN_CRITICAL_MODULE_PRELOAD_PATHS = [ + "/design/assets/v1/rolldown-runtime-CMxvf4Kt.js", + "/design/assets/v1/preload-helper-7XptfjGJ.js", + "/design/assets/v1/react-BthIFXYf.js", + "/design/assets/v1/client-lite-CK-dmuh6.js", + "/design/assets/v1/useOrg-DmMewMgN.js", + "/design/assets/v1/cn-BvRk9kiK.js", + "/design/assets/v1/cn-D-uX0T7P.js", + "/design/assets/v1/Button-XfKvB69T.js" +]; +const DEFAULT_DESIGN_LAZY_MODULE_PRELOAD_PATHS = [ + "/design/assets/v1/Button-BtUXY0oi.js", + "/design/assets/v1/DsBrowseModal-hSTModTp.js", + "/design/assets/v1/Form-B3y7m-2_.js", + "/design/assets/v1/FormList-Bv2urBSD.js", + "/design/assets/v1/Kbd-CLyZAmwA.js", + "/design/assets/v1/MetaText-DDKRoRv8.js", + "/design/assets/v1/ModalHeader-Jq2fIJBg.js", + "/design/assets/v1/ProjectsPage-PDmge7e_.js", + "/design/assets/v1/SegmentedControl-oWx7ZWcd.js", + "/design/assets/v1/SpinnerCursorContext-FnwGR7gg.js", + "/design/assets/v1/Switch-C1hJI3Wa.js", + "/design/assets/v1/TextInput-DBxrS72B.js", + "/design/assets/v1/TextLink-CSMbfMRn.js", + "/design/assets/v1/Tooltip-DkOyUUQf.js", + "/design/assets/v1/client-CoyioTSK.js", + "/design/assets/v1/client-event-bus-CUOhmLFi.js", + "/design/assets/v1/completion-BAv5dQBO.js", + "/design/assets/v1/components-CiWVw_5Z.js", + "/design/assets/v1/connectrpc-B0zPEr5l.js", + "/design/assets/v1/data-C1nvXn42.js", + "/design/assets/v1/ds-contract-C8bG_fzg.js", + "/design/assets/v1/ds-manifest-guards-CDOctgob.js", + "/design/assets/v1/home-analytics-EoW6gFrM.js", + "/design/assets/v1/host-BwlQdwMG.js", + "/design/assets/v1/platform-BJ0ekVkb.js", + "/design/assets/v1/registry-DDfaFazS.js", + "/design/assets/v1/useLabelableId-YQk8Dx5K.js", + "/design/assets/v1/useModelSelection-DahB-QBH.js", + "/design/assets/v1/useMutation-ndQNPSAH.js", + "/design/assets/v1/viewer-handle-BbaClWB_.js" +]; +const DEFAULT_DESIGN_STYLE_PRELOAD_PATHS = [ + "/design/assets/v1/Button-C3hHoRdu.css", + "/design/assets/v1/FormList-DPI5FmbR.css", + "/design/assets/v1/ProjectsPage-CRTuKvXp.css", + "/design/assets/v1/components-DnFFPXN_.css", + "/design/assets/v1/home-analytics-DAgH1hGY.css" +]; +const LEGACY_SCRIPT_PATHS = new Set([ + "/design/assets/index-DWa5J5J9.js", + "/design/assets/index-DYd5ifc6.js", + "/design/assets/index-BxFzSrWf.js" +]); +const LEGACY_STYLE_PATHS = new Set([ + "/design/assets/index-DZOB93ZB.css", + "/design/assets/index-j8_-aIUE.css" +]); +const DEFAULT_EXTERNAL_ASSET_BASE_URLS = ["https://assets-proxy.anthropic.com/claude-ai/v2/assets/v1/"]; +const DESIGN_INDEX_ASSET_DISCOVERY_TTL_MS = 5 * 60 * 1000; +const MAX_UPSTREAM_ASSET_REDIRECTS = 5; +const MAX_LOG_BODY_CHARS = 128 * 1024; +const COMMENT_COLLECTION = "comments"; +const DESIGN_SYSTEM_COLLECTION = "design_systems"; +const EVENT_COLLECTION = "events"; +const PROJECT_COLLECTION = "projects"; +const SESSION_COLLECTION = "sessions"; +const THUMBNAIL_COLLECTION = "thumbnails"; +const PROJECT_TYPE_PROJECT = 1; +const PROJECT_TYPE_TEMPLATE = 2; +const PROJECT_TYPE_DESIGN_SYSTEM = 3; +const TRANSPARENT_SVG = `\n`; +const QUESTION_TOOL_NAMES = new Set(["questions", "questions_v2"]); +const CLAUDE_DESIGN_ROUTE_TYPES = new Set(["always", "image", "long-context", "model", "model-prefix", "thinking", "web-search"]); +const CLAUDE_DESIGN_MODEL_ALIASES = new Map([ + ["claude-haiku-4-5-20251001", DEFAULT_GATEWAY_MODEL], + ["claude-opus-4-6", DEFAULT_GATEWAY_MODEL], + ["claude-opus-4-7", DEFAULT_GATEWAY_MODEL], + ["claude-opus-4-8", DEFAULT_GATEWAY_MODEL], + ["claude-sonnet-4-6", DEFAULT_GATEWAY_MODEL] +]); +const FALLBACK_ASSET_CACHE_PREFIX = "fallback:claude-design-v1:"; +const FALLBACK_ASSET_CACHE_TTL_MS = 60 * 60 * 1000; +const OMELETTE_PREVIEW_EVAL_BRIDGE_SCRIPT = `(function(){ + if (window.__omEvalBridgeInstalled) return; + window.__omEvalBridgeInstalled = true; + window.addEventListener('message', function(event) { + var message = event && event.data; + if (!message || !message.__om_eval || typeof message.code !== 'string') return; + if (event.source !== window.parent) return; + var targetOrigin = event.origin && event.origin !== 'null' ? event.origin : '*'; + var reply = function(payload) { + try { + event.source.postMessage(Object.assign({ __om_eval_r: true, id: message.id }, payload), targetOrigin); + } catch (_) { + window.parent.postMessage(Object.assign({ __om_eval_r: true, id: message.id }, payload), '*'); + } + }; + Promise.resolve() + .then(function() { return (0, eval)(message.code); }) + .then(function(value) { + var serialized; + if (value !== undefined) { + try { + serialized = JSON.stringify(value); + } catch (_) { + serialized = JSON.stringify(String(value)); + } + } + reply(serialized === undefined ? { ok: true } : { ok: true, v: serialized }); + }) + .catch(function(error) { + reply({ ok: false, e: error && error.message ? String(error.message) : String(error) }); + }); + }); +})();`; + +const DEFAULT_ME = { + accountUuid: "12345678", + organizationUuid: "87654321", + email: "aa@example.com", + displayName: "aa", + orgName: "aa's Organization", + growthbookPayload: "{}", + modelPresets: [ + { + id: DEFAULT_GATEWAY_MODEL, + label: "Claude Sonnet 4", + maxTokens: 1000000, + supportsAdaptiveThinking: true, + description: "Most efficient for everyday tasks" + }, + { + id: "claude-3-5-haiku-20241022", + label: "Claude Haiku 3.5", + maxTokens: 200000, + description: "Fast for quick answers" + }, + { + id: "claude-3-5-sonnet-20241022", + label: "Claude Sonnet 3.5", + maxTokens: 200000, + supportsAdaptiveThinking: true, + overflow: true + }, + { + id: "claude-3-opus-20240229", + label: "Claude Opus 3", + maxTokens: 200000, + supportsAdaptiveThinking: true, + overflow: true + } + ], + defaultModelId: DEFAULT_GATEWAY_MODEL, + overrideStickyModel: true, + isPersonalOrg: true, + accessLevel: "ACCESS_LEVEL_FULL", + hasOauthTokens: true, + canManageDs: true, + memberships: [ + { + uuid: "123456787", + name: "aa's Organization" + } + ] +}; + +module.exports = { + async setup(ctx) { + const options = isRecord(ctx.pluginConfig) ? ctx.pluginConfig : {}; + const routeHost = stringValue(options.host) || DEFAULT_HOST; + const configuredRoutePaths = stringArray(options.paths) || DEFAULT_ROUTE_PATHS; + const routePaths = Array.from(new Set([...REQUIRED_ROUTE_PATHS, ...configuredRoutePaths])); + const fallbackRouteHosts = normalizeFallbackRouteHosts(options.fallbackHosts, routeHost); + const upstreamOrigin = stringValue(options.upstreamOrigin) || DEFAULT_UPSTREAM_ORIGIN; + const assetProxy = options.assetProxy !== false; + const configuredAssetDir = stringValue(options.assetDir); + const claudeAppAssetDir = (configuredAssetDir || options.claudeAppAssets === false) + ? "" + : resolveClaudeAppIonDistDir(options, ctx.logger); + const assetDir = configuredAssetDir || claudeAppAssetDir; + const usingClaudeAppAssets = Boolean(claudeAppAssetDir) || + Boolean(configuredAssetDir && isClaudeAppIonDistDir(expandHomePath(configuredAssetDir))); + const assetSource = usingClaudeAppAssets ? "claude-app" : configuredAssetDir ? "configured" : "none"; + const assetPassthrough = usingClaudeAppAssets + ? false + : options.assetPassthrough === true || + (options.assetPassthrough !== false && !localAssetDirExists(assetDir)); + if (usingClaudeAppAssets && options.assetPassthrough === true) { + ctx.logger.info("Claude Design disabled assetPassthrough because Claude app ion-dist assets must be served locally."); + } + const configuredScriptPath = normalizePath(stringValue(options.scriptPath) || DEFAULT_SCRIPT_PATH); + const configuredStylePath = normalizePath(stringValue(options.stylePath) || DEFAULT_STYLE_PATH); + const scriptPath = shouldKeepCurrentScriptPath(configuredScriptPath) ? configuredScriptPath : DEFAULT_SCRIPT_PATH; + const stylePath = shouldKeepCurrentStylePath(configuredStylePath) ? configuredStylePath : DEFAULT_STYLE_PATH; + const assetAutoUpdate = options.assetAutoUpdate !== false; + const autoAnswerQuestions = options.autoAnswerQuestions !== false; + const gatewayUrl = stringValue(options.gatewayUrl) || DEFAULT_GATEWAY_URL; + const gatewayApiKey = stringValue(options.gatewayApiKey) || configuredGatewayApiKey(ctx.config); + const gatewayConfigPath = stringValue(options.gatewayConfigPath) || + stringValue(ctx.config?.gateway?.generatedConfigFile) || + defaultClaudeDesignGatewayConfigPath(); + const gatewayConfig = loadClaudeDesignGatewayConfig(gatewayConfigPath, ctx.logger); + const modelSourceConfig = claudeDesignModelSourceConfig(ctx.config, gatewayConfig); + const configuredDefaultGatewayModel = normalizeRouteTarget( + stringValue(options.defaultGatewayModel) || + stringValue(options.gatewayModel) + ); + const defaultGatewayModel = configuredDefaultGatewayModel || + normalizeRouteTarget(stringValue(ctx.config?.Router?.default)) || + DEFAULT_GATEWAY_MODEL; + const frontendDefaultModel = normalizeRouteTarget( + stringValue(options.frontendDefaultModel) || + stringValue(options.defaultModelId) || + configuredDefaultGatewayModel + ) || DEFAULT_GATEWAY_MODEL; + const availableProviderNames = claudeDesignProviderSelectorNames(modelSourceConfig); + const gatewayModelPresets = claudeDesignGatewayModelPresets(modelSourceConfig, frontendDefaultModel); + const routing = normalizeClaudeDesignRouting(options.routing, options); + const upstreamOrigins = normalizeUpstreamOrigins(options.upstreamOrigins, upstreamOrigin); + const me = normalizeMe(options.me, frontendDefaultModel, gatewayModelPresets); + const store = await ctx.openSqliteStore({ + filename: "claude-design.sqlite", + migrate(database) { + database.run(` + CREATE TABLE IF NOT EXISTS claude_design_requests ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + created_at TEXT NOT NULL, + method TEXT NOT NULL, + path TEXT NOT NULL, + search TEXT NOT NULL DEFAULT '', + request_headers TEXT NOT NULL DEFAULT '{}', + request_body TEXT NOT NULL DEFAULT '', + response_status INTEGER NOT NULL, + response_body TEXT NOT NULL DEFAULT '' + ); + CREATE INDEX IF NOT EXISTS claude_design_requests_created_at_idx + ON claude_design_requests(created_at); + CREATE INDEX IF NOT EXISTS claude_design_requests_path_idx + ON claude_design_requests(method, path); + + CREATE TABLE IF NOT EXISTS claude_design_assets ( + path TEXT PRIMARY KEY, + upstream_url TEXT NOT NULL, + content_type TEXT NOT NULL, + body_base64 TEXT NOT NULL, + fetched_at TEXT NOT NULL + ); + + CREATE TABLE IF NOT EXISTS claude_design_responses ( + method TEXT NOT NULL, + path TEXT NOT NULL, + status INTEGER NOT NULL DEFAULT 200, + headers_json TEXT NOT NULL DEFAULT '{}', + body TEXT NOT NULL DEFAULT '{}', + updated_at TEXT NOT NULL, + PRIMARY KEY (method, path) + ); + + CREATE TABLE IF NOT EXISTS claude_design_items ( + collection TEXT NOT NULL, + uuid TEXT NOT NULL, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL, + title TEXT NOT NULL, + model TEXT NOT NULL, + data_json TEXT NOT NULL DEFAULT '{}', + messages_json TEXT NOT NULL DEFAULT '[]', + PRIMARY KEY (collection, uuid) + ); + CREATE INDEX IF NOT EXISTS claude_design_items_updated_at_idx + ON claude_design_items(collection, updated_at); + + CREATE TABLE IF NOT EXISTS claude_design_files ( + project_id TEXT NOT NULL, + path TEXT NOT NULL, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL, + content_type TEXT NOT NULL DEFAULT 'text/plain', + body_base64 TEXT NOT NULL DEFAULT '', + version INTEGER NOT NULL DEFAULT 1, + PRIMARY KEY (project_id, path) + ); + CREATE INDEX IF NOT EXISTS claude_design_files_project_updated_at_idx + ON claude_design_files(project_id, updated_at); + `); + } + }); + purgeBadCachedAssets(store); + + const runtime = { + autoAnswerQuestions, + assetProxy, + assetAutoUpdate, + assetDir, + assetSource, + assetPassthrough, + designIndexAssets: { + checkedAt: 0, + html: "", + scriptPath, + source: "configured", + stylePath + }, + standaloneDesignIndexAssets: { + checkedAt: 0, + html: "", + scriptPath: DEFAULT_SCRIPT_PATH, + source: "default", + stylePath: DEFAULT_STYLE_PATH + }, + gatewayApiKey, + gatewayConfigPath, + defaultGatewayModel, + frontendDefaultModel, + gatewayModelPresets, + gatewayUrl, + logger: ctx.logger, + me, + routing, + availableProviderNames, + unavailableRouteTargetWarnings: new Set(), + routeHost, + fallbackRouteHosts, + routePaths, + scriptPath, + store, + stylePath, + upstreamOrigin, + upstreamOrigins + }; + + const backend = await ctx.registerHttpBackend({ + id: "claude-design-mock", + async handler(request, response) { + await handleMockRequest(runtime, request, response); + } + }); + + if (assetPassthrough) { + ctx.registerProxyRoute({ + host: routeHost, + id: "claude-design-assets-passthrough", + paths: ["/design/assets", "/assets"], + preserveHost: false, + upstream: upstreamOrigin + }); + } + + ctx.registerProxyRoute({ + host: routeHost, + id: "claude-design-proxy", + paths: routePaths, + preserveHost: true, + upstream: backend.url + }); + + for (const fallbackHost of fallbackRouteHosts) { + ctx.registerProxyRoute({ + host: fallbackHost, + id: `claude-design-fallback-${fallbackHost}`, + paths: FALLBACK_ROUTE_PATHS, + preserveHost: true, + upstream: backend.url + }); + } + + ctx.registerGatewayRoute({ + auth: "none", + handler(request, response, helpers) { + return handleAdminRequest(runtime, backend, request, response, helpers); + }, + id: "claude-design-admin", + methods: ["DELETE", "GET", "POST", "PUT"], + pathPrefix: "/plugins/claude-design" + }); + + ctx.logger.info(`Claude Design mock listening at ${backend.url} for ${routeHost} ${routePaths.join(", ")}`); + } +}; + +async function handleMockRequest(runtime, request, response) { + const url = new URL(request.url || "/", "http://claude-design.local"); + const method = (request.method || "GET").toUpperCase(); + const requestBody = await readRequestBody(request); + let result; + + try { + if (method === "OPTIONS") { + result = { + body: "", + headers: corsHeaders({ "access-control-max-age": "86400" }), + status: 204 + }; + } else if (method === "HEAD") { + const getResult = await routeMockRequest(runtime, "GET", url, request, requestBody); + result = { ...getResult, body: "" }; + } else { + result = await routeMockRequest(runtime, method, url, request, requestBody); + } + } catch (error) { + result = jsonResponse(500, { + error: { + message: error instanceof Error ? error.message : String(error) + } + }); + } + + sendResponse(response, result); + logRequest(runtime.store, { + method, + path: url.pathname, + requestBody, + requestHeaders: request.headers, + responseBody: result.body, + responseStatus: result.status, + search: url.search + }); +} + +async function routeMockRequest(runtime, method, url, request, requestBody) { + const path = normalizePath(url.pathname); + + if (method === "GET" && path === "/health") { + return jsonResponse(200, { ok: true, plugin: "claude-design" }); + } + + if (isDesignAuthEscapeRoute(path)) { + if (method === "GET" || method === "HEAD") { + return redirectResponse(302, "/design"); + } + return jsonResponse(200, authSessionPayload(runtime.me)); + } + + if (method === "GET" && runtime.assetSource === "claude-app" && isDesignSpaRoute(path)) { + if (isClaudeAppDesignIframeRequest(url, request)) { + const assets = await resolveStandaloneDesignIndexAssets(runtime, request); + return htmlResponse(renderDefaultDesignIndex(runtime.me, assets.scriptPath, assets.stylePath)); + } + const redirectUrl = claudeAppDesignEntrypointRedirectUrl(url); + if (redirectUrl) { + return redirectResponse(302, redirectUrl); + } + } + + if (method === "GET" && runtime.assetSource === "claude-app" && isClaudeAppSpaRoute(path)) { + const assets = await resolveDesignIndexAssets(runtime, request); + return htmlResponse(renderDesignIndex(runtime.me, assets.scriptPath, assets.stylePath, assets.html)); + } + + if (method === "GET" && (path === "/" || isDesignSpaRoute(path))) { + const assets = await resolveDesignIndexAssets(runtime, request); + return htmlResponse(renderDesignIndex(runtime.me, assets.scriptPath, assets.stylePath, assets.html)); + } + + if (method === "GET" && path === "/app-unavailable-in-region") { + const assets = await resolveDesignIndexAssets(runtime, request); + return htmlResponse(renderDesignIndex(runtime.me, assets.scriptPath, assets.stylePath, assets.html)); + } + + if (method === "GET" && path === "/design/favicon.png") { + return binaryResponse(200, Buffer.from(FAVICON_PNG_BASE64, "base64"), { + "cache-control": "public, max-age=86400", + "content-type": "image/png" + }); + } + + if (method === "GET" && path === "/design/introvid.html") { + return htmlResponse("\n"); + } + + if (method === "GET" && path.startsWith("/assets/")) { + return serveAsset(runtime, `/design${path}`, request); + } + + if (method === "GET" && path.startsWith("/design/assets/")) { + return serveAsset(runtime, path, request); + } + + if (method === "GET" && isClaudeAppStaticRoutePath(path)) { + return serveAsset(runtime, path, request); + } + + if (method === "GET" && isDesignStaticAsset(path)) { + return serveAsset(runtime, path, request); + } + + if (method === "GET" && path.startsWith("/cdn-cgi/")) { + return textResponse(200, "/* Cloudflare challenge disabled by Claude Design mock. */\n", { + "cache-control": "no-store", + "content-type": "application/javascript; charset=utf-8" + }); + } + + const storedResponse = readStoredResponse(runtime.store, method, path) || readStoredResponse(runtime.store, "ANY", path); + if (storedResponse) { + return storedResponse; + } + + if (path.startsWith("/design/anthropic.omelette.api.v1alpha.OmeletteService/")) { + return handleOmeletteConnectRpc(runtime, method, path, request, requestBody); + } + + if (path.startsWith("/design/v1/design/") || path.startsWith("/v1/design/")) { + return await handleDesignRestApi(runtime, method, path, request, requestBody); + } + + if (isBootstrapRoutePath(path)) { + return jsonResponse(200, bootstrapPayload(runtime.me)); + } + + const bootstrapSubresource = handleBootstrapSubresource(runtime, method, path); + if (bootstrapSubresource) { + return bootstrapSubresource; + } + + if (path === "/api/auth/session" || path === "/api/session") { + return jsonResponse(200, authSessionPayload(runtime.me)); + } + + if (path === "/api/me" || path === "/api/user" || path === "/api/account") { + return jsonResponse(200, accountPayload(runtime.me)); + } + + if (path === "/api/organizations") { + return jsonResponse(200, organizationsPayload(runtime.me)); + } + + if (path.startsWith("/api/organizations/")) { + return handleOrganizationApi(runtime, method, path, request, requestBody); + } + + if (path.startsWith("/api/")) { + return handleGenericApi(method, path, requestBody); + } + + return jsonResponse(404, { + error: { + message: `Claude Design mock has no route for ${method} ${path}` + } + }); +} + +async function handleOmeletteConnectRpc(runtime, method, path, request, requestBody) { + if (method !== "POST") { + return jsonResponse(405, { + error: { + message: `Claude Design mock only supports POST for ${path}` + } + }); + } + + const rpcName = path.split("/").pop(); + const isConnectProtoRequest = headerIncludes(request.headers["content-type"], "application/connect+proto"); + const rpcBody = rpcName === "Chat" || isConnectProtoRequest + ? decodeConnectEnvelope(requestBody) + : requestBody; + switch (rpcName) { + case "CreateProject": { + const project = createOmeletteProject(runtime, rpcBody); + return protoResponse(encodeCreateProjectResponse(project.uuid)); + } + case "UpdateProject": + updateOmeletteProject(runtime, rpcBody); + return protoResponse(Buffer.alloc(0)); + case "DeleteProject": + deleteOmeletteProject(runtime, rpcBody); + return protoResponse(Buffer.alloc(0)); + case "BundleProject": + return protoResponse(bundleProject(runtime, rpcBody)); + case "GetProject": { + const projectId = decodeProtoStringField(rpcBody, 1); + const project = getOmeletteProject(runtime, projectId); + return protoResponse(encodeGetProjectResponse(project, runtime.me, getProjectDataBytes(runtime, project.projectId))); + } + case "GetProjectData": { + const projectId = decodeProtoStringField(rpcBody, 1); + return protoResponse(encodeGetProjectDataResponse(getProjectDataBytes(runtime, projectId))); + } + case "UpdateProjectData": + return protoResponse(updateProjectDataBytes(runtime, rpcBody)); + case "GetChatMessages": + return protoResponse(encodeGetChatMessagesResponse(runtime, rpcBody)); + case "ListChatsForExport": + return protoResponse(listChatsForExport(runtime, rpcBody)); + case "ExportChatMessages": + return protoResponse(exportChatMessages(runtime, rpcBody)); + case "CreateClaudeCodeSession": + return protoResponse(createClaudeCodeSession(runtime, rpcBody)); + case "UpdateSharing": + return protoResponse(updateOmeletteProjectSharing(runtime, rpcBody)); + case "DuplicateProject": + return protoResponse(duplicateOmeletteProject(runtime, rpcBody, {})); + case "RemixProject": + return protoResponse(duplicateOmeletteProject(runtime, rpcBody, { includeChats: decodeProtoBoolField(rpcBody, 2) })); + case "CreateTemplateFromProject": + return protoResponse(duplicateOmeletteProject(runtime, rpcBody, { type: PROJECT_TYPE_TEMPLATE })); + case "UpdateProjectType": + return protoResponse(updateProjectType(runtime, rpcBody)); + case "SetProjectPublished": + return protoResponse(setProjectPublished(runtime, rpcBody)); + case "UpdateProjectInfo": + updateProjectInfo(runtime, rpcBody); + return protoResponse(Buffer.alloc(0)); + case "UpdateProjectDesignSystems": + return protoResponse(updateProjectDesignSystems(runtime, rpcBody)); + case "PatchDesignSystemBinding": + return protoResponse(patchDesignSystemBinding(runtime, rpcBody)); + case "RefreshBoundDesignSystem": + return protoResponse(protoInt32(1, 0)); + case "SetProjectFavorite": + updateProjectFavorite(runtime, rpcBody); + return protoResponse(Buffer.alloc(0)); + case "SetProjectThumbnail": + setProjectThumbnail(runtime, rpcBody); + return protoResponse(Buffer.alloc(0)); + case "ListFiles": + return protoResponse(encodeListFilesResponse(runtime, rpcBody)); + case "GetFile": + return protoResponse(encodeGetFileResponse(runtime, rpcBody)); + case "WriteFiles": + return protoResponse(writeProjectFiles(runtime, rpcBody)); + case "DeleteFile": + return protoResponse(deleteProjectFile(runtime, rpcBody)); + case "DeleteFiles": + return protoResponse(deleteProjectFiles(runtime, rpcBody)); + case "CopyFile": + return protoResponse(copyProjectFile(runtime, rpcBody)); + case "EditFile": + return protoResponse(editProjectFile(runtime, rpcBody)); + case "GrepFiles": + return protoResponse(grepProjectFiles(runtime, rpcBody)); + case "CreateFileStream": + return protoResponse(createFileStream(runtime, rpcBody)); + case "WriteFileStream": + return protoResponse(writeFileStream(runtime, rpcBody)); + case "AbortFileStream": + return protoResponse(Buffer.alloc(0)); + case "UploadFile": { + const responseBody = uploadFile(runtime, rpcBody); + return isConnectProtoRequest ? connectStreamResponse([responseBody]) : protoResponse(responseBody); + } + case "ListProjectAssets": + return protoResponse(listProjectAssets(runtime, rpcBody)); + case "RecordAsset": + recordProjectAsset(runtime, rpcBody); + return protoResponse(Buffer.alloc(0)); + case "SetAssetStatus": + setProjectAssetStatus(runtime, rpcBody); + return protoResponse(Buffer.alloc(0)); + case "DeleteAsset": + deleteProjectAsset(runtime, rpcBody); + return protoResponse(Buffer.alloc(0)); + case "GetMe": + return protoResponse(encodeGetMeResponse(runtime.me)); + case "GetUsageStatus": + return protoResponse(Buffer.alloc(0)); + case "UpdateOrgSettings": + updateOrgSettings(runtime, rpcBody); + return protoResponse(Buffer.alloc(0)); + case "GetOrgSettings": + return protoResponse(encodeGetOrgSettingsResponse(runtime)); + case "ListOrgProjects": + return protoResponse(encodeListProjectsResponse(runtime, decodeProtoEnumField(rpcBody, 1), decodeProtoBoolField(rpcBody, 2))); + case "ListProjects": + return protoResponse(encodeListProjectsResponse(runtime)); + case "MintPreviewToken": + return protoResponse(encodeMintPreviewTokenResponse(runtime)); + case "MintHandoffToken": + case "MintDesignSyncCode": + return protoResponse(encodeTokenResponse()); + case "CountTokens": + return protoResponse(await countGatewayTokens(runtime, rpcBody)); + case "Chat": + return await chatWithGateway(runtime, rpcBody); + case "TrackEvent": + recordTrackEvent(runtime, rpcBody); + return protoResponse(Buffer.alloc(0)); + case "CreateComment": + return protoResponse(createComment(runtime, rpcBody)); + case "UpdateComment": + return protoResponse(updateComment(runtime, rpcBody)); + case "DeleteComment": + deleteComment(runtime, rpcBody); + return protoResponse(Buffer.alloc(0)); + case "ListComments": + return protoResponse(listComments(runtime, rpcBody)); + case "CreateCommentReply": + return protoResponse(createCommentReply(runtime, rpcBody)); + case "UpdateCommentReply": + return protoResponse(updateCommentReply(runtime, rpcBody)); + case "DeleteCommentReply": + deleteCommentReply(runtime, rpcBody); + return protoResponse(Buffer.alloc(0)); + case "SendCommentsToChat": + return protoResponse(sendCommentsToChat(runtime, rpcBody)); + case "SendMultiplayerMessage": + return protoResponse(sendMultiplayerMessage(runtime, rpcBody)); + case "DeleteAccount": + case "DeleteOrganization": + return protoResponse(Buffer.alloc(0)); + case "FigmaCallTool": + case "McpCallTool": + return protoResponse(encodeToolCallResponse(rpcName, rpcBody)); + case "FigmaDisconnect": + case "FigmaExchangeCode": + case "FigmaStartAuth": + case "GithubDisconnect": + case "GithubExchangeCode": + case "GithubStartAuth": + return protoResponse(encodeIntegrationAuthResponse(rpcName)); + case "FigmaListTools": + case "GithubListRepos": + case "GithubGetTree": + case "GithubReadFile": + case "GithubImportRepo": + return protoResponse(encodeIntegrationListResponse(rpcName, rpcBody)); + case "RenewTurn": + case "ReleaseTurn": + return protoResponse(Buffer.alloc(0)); + case "MarkCommentsRead": + return protoResponse(markCommentsRead(runtime, rpcBody)); + case "ListExperiences": + case "TrackExperience": + case "ExecuteExperienceAction": + case "LintFiles": + case "FigmaGetStatus": + case "GithubGetStatus": + case "McpListConnected": + case "McpListConnectors": + case "McpListDesignImportPartners": + case "McpListTools": + return protoResponse(Buffer.alloc(0)); + default: + return protoResponse(Buffer.alloc(0)); + } +} + +async function serveAsset(runtime, path, request) { + const cached = readCachedAsset(runtime.store, path); + if (cached) { + const cachedBody = Buffer.from(cached.bodyBase64, "base64"); + const reusableFallback = isReusableFallbackAsset(cached, path); + if ((!isFallbackAsset(cached) || reusableFallback) && isUsableServedAssetBody(path, cached.contentType, cachedBody)) { + if (!reusableFallback) { + recordDesignIndexAssetHint(runtime, path, "cache"); + } + return binaryResponse(200, cachedBody, { + "cache-control": reusableFallback ? "no-store" : "public, max-age=86400", + "content-type": cached.contentType, + "x-claude-design-asset-source": cached.upstreamUrl || "cache" + }); + } + deleteCachedAsset(runtime.store, path); + } + + const localAsset = readLocalAsset(runtime.assetDir, path); + if (localAsset && isUsableServedAssetBody(path, localAsset.contentType, localAsset.body)) { + writeCachedAsset(runtime.store, path, localAsset.source, localAsset.contentType, localAsset.body); + recordDesignIndexAssetHint(runtime, path, "local"); + return binaryResponse(200, localAsset.body, { + "cache-control": "public, max-age=86400", + "content-type": localAsset.contentType, + "x-claude-design-asset-source": "local" + }); + } + + if (runtime.assetProxy) { + for (const origin of runtime.upstreamOrigins) { + for (const upstreamUrl of upstreamAssetUrlCandidates(path, origin)) { + const fetched = await fetchUpstreamAsset(upstreamUrl, request).catch((error) => { + runtime.logger?.warn?.( + `Claude Design failed to fetch upstream asset ${upstreamUrl.toString()}: ${ + error instanceof Error ? error.message : String(error) + }` + ); + return undefined; + }); + if (fetched && fetched.status >= 200 && fetched.status < 300 && isUsableServedAssetBody(path, fetched.contentType, fetched.body)) { + writeCachedAsset(runtime.store, path, fetched.url || upstreamUrl.toString(), fetched.contentType, fetched.body); + recordDesignIndexAssetHint(runtime, path, "remote"); + return binaryResponse(200, fetched.body, { + "cache-control": "public, max-age=86400", + "content-type": fetched.contentType, + "x-claude-design-asset-source": fetched.url || upstreamUrl.toString() + }); + } + if (fetched) { + logRejectedUpstreamAsset(runtime, path, upstreamUrl, fetched); + } + } + } + } + + const refreshedIndexAsset = await serveRefreshedDesignIndexAsset(runtime, path, request); + if (refreshedIndexAsset) { + return refreshedIndexAsset; + } + + if (path === "/design/pictogram-bookapple.svg") { + return textResponse(200, TRANSPARENT_SVG, { + "cache-control": "public, max-age=86400", + "content-type": "image/svg+xml" + }); + } + + const fallback = fallbackDesignAsset(path); + if (fallback) { + if (isCacheableFallbackAsset(path)) { + writeCachedAsset(runtime.store, path, fallbackAssetCacheSource(path), fallback.contentType, fallback.body); + } + return binaryResponse(200, fallback.body, { + "cache-control": "no-store", + "content-type": fallback.contentType, + "x-claude-design-asset-source": "fallback" + }); + } + + return jsonResponse(502, { + error: { + message: `Claude Design asset is not cached and upstream fetch failed: ${path}`, + hint: "Provide the real Claude Design asset through config.assetDir or allow upstream asset proxying." + } + }); +} + +function logRejectedUpstreamAsset(runtime, path, upstreamUrl, fetched) { + const message = `Claude Design rejected upstream asset ${upstreamUrl.toString()}: status=${fetched.status} content-type=${ + fetched.contentType || "unknown" + } bytes=${fetched.body.length} final-url=${fetched.url || upstreamUrl.toString()}`; + if (isCacheableFallbackAsset(path)) { + runtime.logger?.debug?.(`${message}; using local fallback`); + return; + } + runtime.logger?.warn?.(message); +} + +async function serveRefreshedDesignIndexAsset(runtime, path, request) { + const requestPath = normalizePath(path); + const isScript = isDesignIndexScriptPath(requestPath); + const isStyle = isDesignIndexStylePath(requestPath); + if (!runtime.assetAutoUpdate || (!isScript && !isStyle)) { + return undefined; + } + + const refreshed = await resolveDesignIndexAssets(runtime, request, { force: true }); + const replacementPath = isScript ? refreshed.scriptPath : refreshed.stylePath; + if (!replacementPath || replacementPath === requestPath) { + return undefined; + } + + const replacement = readResolvedDesignIndexAsset(runtime, replacementPath); + if (!replacement || !isUsableDesignIndexAssetResponse(replacementPath, replacement.contentType, replacement.body)) { + return undefined; + } + + return binaryResponse(200, replacement.body, { + "cache-control": "no-store", + "content-type": replacement.contentType, + "x-claude-design-asset-source": `${replacement.source}; replacement=${replacementPath}` + }); +} + +function readResolvedDesignIndexAsset(runtime, path) { + const cached = runtime.store ? readCachedAsset(runtime.store, path) : undefined; + if (cached) { + return { + body: Buffer.from(cached.bodyBase64 || "", "base64"), + contentType: cached.contentType, + source: cached.upstreamUrl || "cache" + }; + } + const local = readLocalAsset(runtime.assetDir, path); + return local + ? { + body: local.body, + contentType: local.contentType, + source: local.source + } + : undefined; +} + +function fallbackDesignAsset(path) { + if (!path.startsWith("/design/")) { + return undefined; + } + if (!path.startsWith("/design/assets/") && !/\.(?:gif|png|webp|jpe?g|svg|ico)$/i.test(path)) { + return undefined; + } + if (/\/QuestionsViewer-[^/]+\.js$/i.test(path)) { + return { + body: Buffer.from(questionsViewerFallbackModule(), "utf8"), + contentType: "application/javascript; charset=utf-8" + }; + } + if (isDesignIndexScriptPath(path)) { + return undefined; + } + if (path.endsWith(".js")) { + return { + body: Buffer.from( + [ + "export function HandoffModal(){ return null; }", + "export default function ClaudeDesignMissingChunk(){ return null; }" + ].join("\n"), + "utf8" + ), + contentType: "application/javascript; charset=utf-8" + }; + } + if (path.endsWith(".css")) { + return { + body: Buffer.alloc(0), + contentType: "text/css; charset=utf-8" + }; + } + if (/\.(?:gif|png|webp|jpe?g|svg|ico)$/i.test(path)) { + return { + body: Buffer.from(TRANSPARENT_SVG, "utf8"), + contentType: "image/svg+xml" + }; + } + return undefined; +} + +function isCacheableFallbackAsset(path) { + return path.startsWith("/design/assets/") && + !isDesignIndexScriptPath(path) && + !isDesignIndexStylePath(path) && + /\.(?:js|mjs|gif|png|webp|jpe?g|svg|ico)$/i.test(path); +} + +function fallbackAssetCacheSource(path) { + return `${FALLBACK_ASSET_CACHE_PREFIX}${path}`; +} + +function isUsableAssetBody(path, contentType, body) { + const payload = Buffer.isBuffer(body) ? body : Buffer.from(body || []); + const normalizedContentType = stringValue(contentType)?.toLowerCase() || ""; + if (payload.length === 0 && /\.(?:js|mjs|css|json|wasm|png|jpe?g|gif|webp|svg|ico)$/i.test(path)) { + return false; + } + if (normalizedContentType.includes("text/html") && !/\.html?$/i.test(path)) { + return false; + } + if (/\.(?:js|mjs)$/i.test(path)) { + return !normalizedContentType.includes("text/html"); + } + if (/\.css$/i.test(path)) { + return !normalizedContentType.includes("text/html"); + } + return true; +} + +function isUsableServedAssetBody(path, contentType, body) { + if (!isUsableAssetBody(path, contentType, body)) { + return false; + } + if (isDesignIndexScriptPath(path)) { + return isUsableDesignIndexScriptBody(path, contentType, body); + } + return true; +} + +function normalizeUpstreamOrigins(value, primaryOrigin) { + const origins = []; + const addOrigin = (origin) => { + const raw = stringValue(origin); + if (!raw) { + return; + } + try { + const parsed = new URL(raw); + const normalized = `${parsed.protocol}//${parsed.host}`; + if (!origins.includes(normalized)) { + origins.push(normalized); + } + } catch { + // Ignore malformed source origins; they cannot be used for asset proxying. + } + }; + addOrigin(primaryOrigin); + if (Array.isArray(value)) { + value.forEach(addOrigin); + } else { + addOrigin(value); + } + return origins.length > 0 ? origins : [DEFAULT_UPSTREAM_ORIGIN]; +} + +function upstreamAssetUrlCandidates(path, origin) { + const requestPath = normalizePath(path); + const candidates = [new URL(requestPath, origin)]; + if (requestPath.startsWith("/design/assets/")) { + candidates.push(new URL(requestPath.replace(/^\/design\/assets\//, "/assets/"), origin)); + const assetName = requestPath.split("/").pop(); + if (assetName) { + for (const baseUrl of DEFAULT_EXTERNAL_ASSET_BASE_URLS) { + candidates.push(new URL(assetName, baseUrl)); + } + } + } + const seen = new Set(); + return candidates.filter((url) => { + const key = url.toString(); + if (seen.has(key)) { + return false; + } + seen.add(key); + return true; + }); +} + +function normalizeFallbackRouteHosts(value, primaryHost) { + const hosts = []; + const addHost = (host) => { + const raw = stringValue(host); + if (!raw) { + return; + } + const normalized = raw.replace(/^https?:\/\//i, "").replace(/\/.*$/, "").toLowerCase(); + if (normalized && normalized !== primaryHost.toLowerCase() && !hosts.includes(normalized)) { + hosts.push(normalized); + } + }; + DEFAULT_FALLBACK_ROUTE_HOSTS.forEach(addHost); + if (Array.isArray(value)) { + value.forEach(addHost); + } else { + addHost(value); + } + return hosts; +} + +async function resolveDesignIndexAssets(runtime, request, options = {}) { + const current = runtime.designIndexAssets || { + checkedAt: 0, + html: "", + scriptPath: runtime.scriptPath || DEFAULT_SCRIPT_PATH, + source: "default", + stylePath: runtime.stylePath || DEFAULT_STYLE_PATH + }; + if (!runtime.assetAutoUpdate) { + return current; + } + + const now = Date.now(); + const forceRefresh = options.force === true || requestHasNoCache(request); + const hasRenderableIndex = isUsableDesignShellHtml(current.html) || Boolean(current.scriptPath || current.stylePath); + if (!forceRefresh && hasRenderableIndex && current.checkedAt && now - current.checkedAt < DESIGN_INDEX_ASSET_DISCOVERY_TTL_MS) { + return current; + } + + const fromRequests = discoverRequestedDesignIndexAssets(runtime.store); + const fromLocal = discoverLocalDesignIndexAssets(runtime.assetDir); + const fromCache = discoverCachedDesignIndexAssets(runtime.store); + const shouldDiscoverRemote = runtime.assetSource !== "claude-app"; + const fromRemote = shouldDiscoverRemote ? await discoverRemoteDesignIndexAssets(runtime, request) : undefined; + const fromRemoteCache = shouldDiscoverRemote ? await cacheRemoteDesignIndexAssets(runtime, fromRemote, request) : undefined; + const fallback = mergeDesignIndexAssetPartials(fromLocal, fromCache) || {}; + const seeded = { + html: isUsableDesignShellHtml(fromLocal?.html) ? fromLocal.html : current.html, + scriptPath: fallback.scriptPath || current.scriptPath, + source: fallback.source || current.source || "current", + stylePath: fallback.stylePath || current.stylePath + }; + const discovered = mergeDesignIndexAssets(seeded, fromRequests, fromRemoteCache || fromRemote, fromLocal); + const safeDiscovered = selectUsableDesignIndexAssets(runtime, discovered, fallback, current); + return updateDesignIndexAssets(runtime, safeDiscovered, safeDiscovered.source || "discovered", { checkedAt: now }); +} + +async function resolveStandaloneDesignIndexAssets(runtime, request) { + if (runtime.assetSource !== "claude-app") { + return resolveDesignIndexAssets(runtime, request); + } + + const current = runtime.standaloneDesignIndexAssets || { + checkedAt: 0, + html: "", + scriptPath: DEFAULT_SCRIPT_PATH, + source: "default", + stylePath: DEFAULT_STYLE_PATH + }; + if (!runtime.assetAutoUpdate) { + return current; + } + + const now = Date.now(); + const forceRefresh = requestHasNoCache(request); + if (!forceRefresh && current.checkedAt && now - current.checkedAt < DESIGN_INDEX_ASSET_DISCOVERY_TTL_MS) { + return current; + } + + const fromCache = discoverCachedStandaloneDesignIndexAssets(runtime.store); + const fromRemote = await discoverRemoteDesignIndexAssets(runtime, request); + const fromRemoteCache = await cacheRemoteDesignIndexAssets(runtime, fromRemote, request); + const discovered = mergeDesignIndexAssets(current, fromCache, fromRemoteCache || fromRemote); + const assets = { + checkedAt: now, + html: "", + scriptPath: shouldKeepCurrentScriptPath(discovered.scriptPath) ? discovered.scriptPath : DEFAULT_SCRIPT_PATH, + source: discovered.source || current.source || "standalone", + stylePath: shouldKeepCurrentStylePath(discovered.stylePath) ? discovered.stylePath : DEFAULT_STYLE_PATH, + upstreamUrls: { + ...(current.upstreamUrls || {}), + ...(discovered.upstreamUrls || {}) + } + }; + runtime.standaloneDesignIndexAssets = assets; + return assets; +} + +function requestHasNoCache(request) { + return headerIncludes(request?.headers?.["cache-control"], "no-cache") || + headerIncludes(request?.headers?.pragma, "no-cache"); +} + +function updateDesignIndexAssets(runtime, assets, source, options = {}) { + const current = runtime.designIndexAssets || { + checkedAt: 0, + html: "", + scriptPath: runtime.scriptPath || DEFAULT_SCRIPT_PATH, + source: "default", + stylePath: runtime.stylePath || DEFAULT_STYLE_PATH + }; + const candidateScriptPath = normalizePath(stringValue(assets?.scriptPath) || current.scriptPath || DEFAULT_SCRIPT_PATH); + const candidateStylePath = normalizePath(stringValue(assets?.stylePath) || current.stylePath || DEFAULT_STYLE_PATH); + const scriptPath = shouldKeepCurrentScriptPath(candidateScriptPath) ? candidateScriptPath : DEFAULT_SCRIPT_PATH; + const stylePath = shouldKeepCurrentStylePath(candidateStylePath) ? candidateStylePath : DEFAULT_STYLE_PATH; + const html = isUsableDesignShellHtml(assets?.html) + ? String(assets.html) + : isUsableDesignShellHtml(current.html) + ? String(current.html) + : ""; + runtime.scriptPath = scriptPath; + runtime.stylePath = stylePath; + runtime.designIndexAssets = { + checkedAt: options.checkedAt ?? Date.now(), + html, + scriptPath, + source, + stylePath, + upstreamUrls: { + ...(current.upstreamUrls || {}), + ...(assets?.upstreamUrls || {}) + } + }; + return runtime.designIndexAssets; +} + +function mergeDesignIndexAssets(current, ...candidates) { + const merged = { + html: isUsableDesignShellHtml(current.html) ? String(current.html) : "", + scriptPath: shouldKeepCurrentScriptPath(current.scriptPath) ? current.scriptPath : DEFAULT_SCRIPT_PATH, + source: current.source || "current", + stylePath: shouldKeepCurrentStylePath(current.stylePath) ? current.stylePath : DEFAULT_STYLE_PATH, + upstreamUrls: { ...(current.upstreamUrls || {}) } + }; + for (const candidate of candidates) { + if (!candidate) { + continue; + } + if (candidate.upstreamUrls) { + merged.upstreamUrls = { + ...merged.upstreamUrls, + ...candidate.upstreamUrls + }; + } + if (isUsableDesignShellHtml(candidate.html)) { + merged.html = String(candidate.html); + merged.source = candidate.source || merged.source; + } + if (candidate.scriptPath) { + merged.scriptPath = candidate.scriptPath; + merged.source = candidate.source || merged.source; + } + if (candidate.stylePath) { + merged.stylePath = candidate.stylePath; + merged.source = candidate.source || merged.source; + } + } + return merged; +} + +function mergeDesignIndexAssetPartials(...candidates) { + const merged = { source: "remote", upstreamUrls: {} }; + for (const candidate of candidates) { + if (!candidate) { + continue; + } + if (candidate.upstreamUrls) { + merged.upstreamUrls = { + ...merged.upstreamUrls, + ...candidate.upstreamUrls + }; + } + if (candidate.scriptPath) { + merged.scriptPath = candidate.scriptPath; + merged.source = candidate.source || merged.source; + } + if (candidate.stylePath) { + merged.stylePath = candidate.stylePath; + merged.source = candidate.source || merged.source; + } + } + return merged.scriptPath || merged.stylePath ? merged : undefined; +} + +function selectUsableDesignIndexAssets(runtime, discovered, fallback, current) { + const currentScriptPath = shouldKeepCurrentScriptPath(current.scriptPath) ? current.scriptPath : DEFAULT_SCRIPT_PATH; + const currentStylePath = shouldKeepCurrentStylePath(current.stylePath) ? current.stylePath : DEFAULT_STYLE_PATH; + const html = isUsableDesignShellHtml(discovered.html) + ? discovered.html + : isUsableDesignShellHtml(current.html) + ? current.html + : ""; + const scriptPath = isUsableDesignIndexScript(runtime, discovered.scriptPath) + ? discovered.scriptPath + : isUsableDesignIndexScript(runtime, fallback.scriptPath) + ? fallback.scriptPath + : currentScriptPath; + const stylePath = isUsableDesignIndexStyle(runtime, discovered.stylePath) + ? discovered.stylePath + : isUsableDesignIndexStyle(runtime, fallback.stylePath) + ? fallback.stylePath + : currentStylePath; + const source = scriptPath === discovered.scriptPath || stylePath === discovered.stylePath + ? discovered.source + : fallback.source || current.source || "current"; + return { html, scriptPath, source, stylePath }; +} + +function recordDesignIndexAssetHint(runtime, path, source) { + if (!runtime.assetAutoUpdate) { + return; + } + const normalizedPath = normalizePath(path); + if (isDesignIndexScriptPath(normalizedPath)) { + if (!LEGACY_SCRIPT_PATHS.has(normalizedPath) && isAcceptableRequestedEntryScript(runtime, normalizedPath)) { + updateDesignIndexAssets(runtime, { scriptPath: normalizedPath }, source); + } + return; + } + if (isDesignIndexStylePath(normalizedPath)) { + if (!LEGACY_STYLE_PATHS.has(normalizedPath)) { + updateDesignIndexAssets(runtime, { stylePath: normalizedPath }, source); + } + } +} + +async function discoverRemoteDesignIndexAssets(runtime, request) { + for (const origin of runtime.upstreamOrigins) { + for (const shellUrl of upstreamDesignShellUrlCandidates(origin, runtime)) { + const shell = await fetchUpstreamDesignShell(shellUrl, request).catch((error) => { + runtime.logger?.warn?.( + `Claude Design failed to discover upstream design assets from ${shellUrl.toString()}: ${ + error instanceof Error ? error.message : String(error) + }` + ); + return undefined; + }); + if (!shell) { + continue; + } + logRemoteDesignShell(runtime, shellUrl, shell); + const assets = mergeDesignIndexAssetPartials( + extractDesignIndexAssetsFromLinkHeaders(shell.linkHeaders, shell.url), + extractDesignIndexAssetsFromHtml(shell.body, shell.url) + ); + const html = isUsableDesignShellHtml(shell.body) ? shell.body : ""; + if (html || assets?.scriptPath || assets?.stylePath) { + return { + html, + origin, + scriptPath: assets?.scriptPath, + source: "remote", + stylePath: assets?.stylePath, + upstreamUrls: assets?.upstreamUrls + }; + } + } + } + return undefined; +} + +function logRemoteDesignShell(runtime, shellUrl, shell) { + const summary = summarizeRemoteDesignShell(shell); + runtime.logger?.warn?.( + [ + "Claude Design upstream /design raw HTML:", + `request-url=${shellUrl.toString()}`, + `final-url=${shell.url || shellUrl.toString()}`, + `status=${shell.status}`, + `content-type=${shell.contentType || "unknown"}`, + "----- BEGIN RAW HTML -----", + shell.body || "", + "----- END RAW HTML -----", + "Claude Design upstream /design raw HTML summary:", + `title=${summary.title || "unknown"}`, + `has-assets-proxy=${summary.hasAssetsProxy}`, + `has-design-assets=${summary.hasDesignAssets}`, + `has-app-unavailable=${summary.hasAppUnavailable}`, + `has-cloudflare-challenge=${summary.hasCloudflareChallenge}`, + `module-scripts=${summary.moduleScripts.join(", ") || "none"}`, + `stylesheets=${summary.stylesheets.join(", ") || "none"}` + ].join("\n") + ); +} + +function summarizeRemoteDesignShell(shell) { + const html = String(shell?.body || ""); + return { + hasAppUnavailable: /App unavailable in region/i.test(html), + hasAssetsProxy: /https:\/\/assets-proxy\.anthropic\.com\/claude-ai\/v2\/assets\/v1\//i.test(html), + hasCloudflareChallenge: /\bJust a moment\b|cf_chl|Performing security verification/i.test(html), + hasDesignAssets: /(?:src|href)=["'][^"']*(?:\/design)?\/assets\//i.test(html), + moduleScripts: firstMatches(html, /]*\bsrc=["']([^"']+)["'][^>]*>/gi, 5), + stylesheets: firstMatches(html, /]*rel=["']stylesheet["'][^>]*href=["']([^"']+)["'][^>]*>/gi, 5), + title: firstMatch(html, /]*>([^<]*)<\/title>/i) + }; +} + +function firstMatch(value, pattern) { + const match = pattern.exec(String(value || "")); + return match?.[1]?.trim() || ""; +} + +function firstMatches(value, pattern, limit) { + const matches = []; + let match; + while ((match = pattern.exec(String(value || ""))) && matches.length < limit) { + matches.push(match[1]); + } + return matches; +} + +function upstreamDesignShellUrlCandidates(origin, runtime) { + const paths = ["/design"]; + const seen = new Set(); + return paths.map((path) => new URL(path, origin)).filter((url) => { + const key = url.toString(); + if (seen.has(key)) { + return false; + } + seen.add(key); + return true; + }); +} + +function resolveClaudeAppIonDistDir(options, logger) { + const configured = [ + stringValue(options.claudeAppIonDistDir), + stringValue(options.claudeAppAssetDir), + stringValue(options.claudeAppPath), + ...CLAUDE_APP_ION_DIST_ENV_KEYS.map((key) => stringValue(process.env[key])), + ...CLAUDE_APP_PATH_ENV_KEYS.map((key) => stringValue(process.env[key])), + ...defaultClaudeAppPathCandidates() + ].filter(Boolean); + + const checked = []; + for (const candidate of configured) { + for (const ionDistDir of claudeAppIonDistCandidates(candidate)) { + if (checked.includes(ionDistDir)) { + continue; + } + checked.push(ionDistDir); + if (isClaudeAppIonDistDir(ionDistDir)) { + logger?.info?.(`Claude Design using Claude app assets from ${ionDistDir}`); + return ionDistDir; + } + } + } + return ""; +} + +function defaultClaudeAppPathCandidates() { + if (process.platform === "darwin") { + return [ + "/Applications/Claude.app", + "/Applications/Claude Desktop.app", + pathModule.join(os.homedir(), "Applications", "Claude.app"), + pathModule.join(os.homedir(), "Applications", "Claude Desktop.app") + ]; + } + if (process.platform === "win32") { + const localAppData = process.env.LOCALAPPDATA || pathModule.join(os.homedir(), "AppData", "Local"); + const programFiles = [process.env.ProgramFiles, process.env["ProgramFiles(x86)"]].filter(Boolean); + return [ + pathModule.join(localAppData, "Programs", "Claude"), + pathModule.join(localAppData, "Programs", "Claude Desktop"), + ...programFiles.flatMap((root) => [ + pathModule.join(root, "Claude"), + pathModule.join(root, "Claude Desktop") + ]) + ]; + } + return [ + "/opt/Claude", + "/opt/Claude/resources", + pathModule.join(os.homedir(), ".local", "share", "Claude") + ]; +} + +function claudeAppIonDistCandidates(candidate) { + const expanded = expandHomePath(candidate); + const resolved = pathModule.resolve(expanded); + const candidates = [ + resolved, + pathModule.join(resolved, "ion-dist"), + pathModule.join(resolved, "resources", "ion-dist"), + pathModule.join(resolved, "Resources", "ion-dist"), + pathModule.join(resolved, "Contents", "Resources", "ion-dist") + ]; + if (resolved.includes(`${pathModule.sep}Contents${pathModule.sep}MacOS${pathModule.sep}`)) { + candidates.push(pathModule.resolve(resolved, "..", "..", "Resources", "ion-dist")); + } + if (resolved.endsWith(".app")) { + candidates.push(pathModule.join(resolved, "Contents", "Resources", "ion-dist")); + } + return Array.from(new Set(candidates)); +} + +function expandHomePath(value) { + const trimmed = stringValue(value); + if (trimmed === "~") { + return os.homedir(); + } + if (trimmed.startsWith("~/") || trimmed.startsWith("~\\")) { + return pathModule.join(os.homedir(), trimmed.slice(2)); + } + return trimmed; +} + +function isClaudeAppIonDistDir(dir) { + try { + const root = pathModule.resolve(dir); + return fs.statSync(root).isDirectory() && + fs.statSync(pathModule.join(root, "index.html")).isFile() && + fs.statSync(pathModule.join(root, "assets")).isDirectory(); + } catch { + return false; + } +} + +async function cacheRemoteDesignIndexAssets(runtime, assets, request) { + if (!assets || !runtime.assetProxy) { + return undefined; + } + + const cached = { + html: isUsableDesignShellHtml(assets.html) ? assets.html : "", + source: assets.source || "remote" + }; + const scriptPath = normalizePath(assets.scriptPath); + if (scriptPath) { + if ( + isUsableDesignIndexScript(runtime, scriptPath) || + await fetchAndCacheRemoteDesignIndexAsset(runtime, scriptPath, request, assets.origin, assets.upstreamUrls?.[scriptPath]) + ) { + cached.scriptPath = scriptPath; + } + } + + const stylePath = normalizePath(assets.stylePath); + if (stylePath) { + if ( + isUsableDesignIndexStyle(runtime, stylePath) || + await fetchAndCacheRemoteDesignIndexAsset(runtime, stylePath, request, assets.origin, assets.upstreamUrls?.[stylePath]) + ) { + cached.stylePath = stylePath; + } + } + + if (cached.html || cached.scriptPath || cached.stylePath) { + cached.upstreamUrls = assets.upstreamUrls; + return cached; + } + return undefined; +} + +async function fetchAndCacheRemoteDesignIndexAsset(runtime, path, request, preferredOrigin, preferredAssetUrl) { + const origins = preferredOrigin + ? [preferredOrigin, ...runtime.upstreamOrigins.filter((origin) => origin !== preferredOrigin)] + : runtime.upstreamOrigins; + const explicitUrl = parseAbsoluteHttpUrl(preferredAssetUrl); + if (explicitUrl) { + const fetched = await fetchAndMaybeCacheDesignIndexAsset(runtime, path, explicitUrl, request); + if (fetched) { + return true; + } + } + for (const origin of origins) { + for (const upstreamUrl of upstreamAssetUrlCandidates(path, origin)) { + const fetched = await fetchAndMaybeCacheDesignIndexAsset(runtime, path, upstreamUrl, request); + if (fetched) { + return true; + } + } + } + return false; +} + +async function fetchAndMaybeCacheDesignIndexAsset(runtime, path, upstreamUrl, request) { + const fetched = await fetchUpstreamAsset(upstreamUrl, request).catch((error) => { + runtime.logger?.warn?.( + `Claude Design failed to fetch upstream index asset ${upstreamUrl.toString()}: ${ + error instanceof Error ? error.message : String(error) + }` + ); + return undefined; + }); + if (fetched && fetched.status >= 200 && fetched.status < 300 && isUsableDesignIndexAssetResponse(path, fetched.contentType, fetched.body)) { + writeCachedAsset(runtime.store, path, fetched.url || upstreamUrl.toString(), fetched.contentType, fetched.body); + return true; + } + if (fetched) { + logRejectedUpstreamAsset(runtime, path, upstreamUrl, fetched); + } + return false; +} + +function isUsableDesignIndexAssetResponse(path, contentType, body) { + if (!isUsableAssetBody(path, contentType, body)) { + return false; + } + if (isDesignIndexScriptPath(path)) { + return isUsableDesignIndexScriptBody(path, contentType, body); + } + return isDesignIndexStylePath(path); +} + +function discoverRequestedDesignIndexAssets(store) { + const rows = queryRows( + store.database, + `SELECT path + FROM claude_design_requests + WHERE path LIKE '/design/assets/index-%' + OR path LIKE '/design/assets/%/index-%' + ORDER BY id DESC + LIMIT 100`, + [] + ); + const assets = { source: "request-hint" }; + for (const row of rows) { + const requestPath = normalizePath(row.path); + if (!assets.scriptPath && isDesignIndexScriptPath(requestPath) && !LEGACY_SCRIPT_PATHS.has(requestPath) && isUsableCachedEntryScript(store, requestPath)) { + assets.scriptPath = requestPath; + } + if (!assets.stylePath && isDesignIndexStylePath(requestPath) && !LEGACY_STYLE_PATHS.has(requestPath) && isUsableCachedEntryStyle(store, requestPath)) { + assets.stylePath = requestPath; + } + if (assets.scriptPath && assets.stylePath) { + return assets; + } + } + return assets.scriptPath || assets.stylePath ? assets : undefined; +} + +function discoverCachedDesignIndexAssets(store) { + const rows = queryRows( + store.database, + `SELECT path, content_type, body_base64, fetched_at + FROM claude_design_assets + WHERE path LIKE '/design/assets/index-%' + OR path LIKE '/design/assets/%/index-%' + ORDER BY fetched_at DESC`, + [] + ); + const assets = { source: "cache" }; + for (const row of rows) { + const requestPath = normalizePath(row.path); + const body = Buffer.from(row.body_base64 || "", "base64"); + if (!isUsableAssetBody(requestPath, row.content_type, body)) { + continue; + } + if (!assets.scriptPath && isUsableDesignIndexScriptBody(requestPath, row.content_type, body)) { + assets.scriptPath = requestPath; + } + if (!assets.stylePath && isDesignIndexStylePath(requestPath)) { + assets.stylePath = requestPath; + } + if (assets.scriptPath && assets.stylePath) { + return assets; + } + } + return assets.scriptPath || assets.stylePath ? assets : undefined; +} + +function discoverCachedStandaloneDesignIndexAssets(store) { + const rows = queryRows( + store.database, + `SELECT path, content_type, body_base64, fetched_at + FROM claude_design_assets + WHERE path LIKE '/design/assets/index-%' + OR path LIKE '/design/assets/%/index-%' + ORDER BY fetched_at DESC`, + [] + ); + const assets = { source: "standalone-cache" }; + for (const row of rows) { + const requestPath = normalizePath(row.path); + const body = Buffer.from(row.body_base64 || "", "base64"); + if (!isUsableAssetBody(requestPath, row.content_type, body)) { + continue; + } + if (!assets.scriptPath && isStandaloneDesignIndexScriptBody(requestPath, row.content_type, body)) { + assets.scriptPath = requestPath; + } + if (!assets.stylePath && isDesignIndexStylePath(requestPath)) { + assets.stylePath = requestPath; + } + if (assets.scriptPath && assets.stylePath) { + return assets; + } + } + return assets.scriptPath || assets.stylePath ? assets : undefined; +} + +function discoverLocalDesignIndexAssets(assetDir) { + if (!assetDir) { + return undefined; + } + const localRoot = localAssetRootInfo(assetDir); + const assetRoot = localRoot.kind === "claude-app-ion-dist" + ? pathModule.join(localRoot.root, "assets") + : localRoot.root; + const scripts = []; + const styles = []; + for (const entry of listLocalAssetFiles(assetRoot)) { + const requestPath = `/design/assets/${entry.relativePath}`; + if (!isDesignIndexScriptPath(requestPath) && !isDesignIndexStylePath(requestPath)) { + continue; + } + if (isDesignIndexStylePath(requestPath)) { + styles.push({ mtimeMs: entry.stat.mtimeMs, path: requestPath, size: entry.stat.size }); + continue; + } + let body; + try { + body = fs.readFileSync(entry.file); + } catch { + continue; + } + scripts.push({ + mtimeMs: entry.stat.mtimeMs, + path: requestPath, + score: designEntryScriptScore(requestPath, body, entry.stat), + size: entry.stat.size + }); + } + scripts.sort((a, b) => b.score - a.score || b.mtimeMs - a.mtimeMs || b.size - a.size); + styles.sort((a, b) => b.mtimeMs - a.mtimeMs || b.size - a.size); + const assets = { + html: localRoot.kind === "claude-app-ion-dist" ? readLocalClaudeAppShellHtml(localRoot.root) : "", + scriptPath: scripts[0]?.path, + source: localRoot.kind === "claude-app-ion-dist" ? "claude-app" : "local", + stylePath: styles[0]?.path + }; + return assets.html || assets.scriptPath || assets.stylePath ? assets : undefined; +} + +function localAssetDirExists(assetDir) { + if (!assetDir) { + return false; + } + try { + return fs.statSync(pathModule.resolve(expandHomePath(assetDir))).isDirectory(); + } catch { + return false; + } +} + +function localAssetRootInfo(assetDir) { + const root = pathModule.resolve(expandHomePath(assetDir)); + return isClaudeAppIonDistDir(root) + ? { kind: "claude-app-ion-dist", root } + : { kind: "design-assets", root }; +} + +function readLocalClaudeAppShellHtml(root) { + const indexPath = pathModule.join(root, "index.html"); + try { + const html = fs.readFileSync(indexPath, "utf8"); + return isUsableDesignShellHtml(html) ? html : ""; + } catch { + return ""; + } +} + +function listLocalAssetFiles(assetRoot) { + const files = []; + const stack = [""]; + while (stack.length) { + const relativeDir = stack.pop(); + const absoluteDir = pathModule.join(assetRoot, relativeDir); + let entries; + try { + entries = fs.readdirSync(absoluteDir, { withFileTypes: true }); + } catch { + continue; + } + for (const entry of entries) { + const relativePath = pathModule.join(relativeDir, entry.name); + const file = pathModule.join(assetRoot, relativePath); + if (entry.isDirectory()) { + stack.push(relativePath); + continue; + } + if (!entry.isFile()) { + continue; + } + let stat; + try { + stat = fs.statSync(file); + } catch { + continue; + } + files.push({ + file, + relativePath: relativePath.split(pathModule.sep).join("/"), + stat + }); + } + } + return files; +} + +function isDesignIndexScriptPath(path) { + return /^\/design\/assets\/(?:v\d+\/)?index-[^/]+\.js$/i.test(path); +} + +function isDesignIndexStylePath(path) { + return /^\/design\/assets\/(?:v\d+\/)?index-[^/]+\.css$/i.test(path); +} + +function shouldKeepCurrentScriptPath(path) { + const normalizedPath = normalizePath(path); + return isDesignIndexScriptPath(normalizedPath) && !LEGACY_SCRIPT_PATHS.has(normalizedPath); +} + +function shouldKeepCurrentStylePath(path) { + const normalizedPath = normalizePath(path); + return isDesignIndexStylePath(normalizedPath) && !LEGACY_STYLE_PATHS.has(normalizedPath); +} + +function isUsableDesignIndexScript(runtime, path) { + const normalizedPath = normalizePath(path); + if (!isDesignIndexScriptPath(normalizedPath)) { + return false; + } + if (LEGACY_SCRIPT_PATHS.has(normalizedPath)) { + return false; + } + if (runtime?.store && isUsableCachedEntryScript(runtime.store, normalizedPath)) { + return true; + } + return isUsableLocalEntryScript(runtime?.assetDir, normalizedPath); +} + +function isUsableDesignIndexStyle(runtime, path) { + const normalizedPath = normalizePath(path); + if (!isDesignIndexStylePath(normalizedPath)) { + return false; + } + if (LEGACY_STYLE_PATHS.has(normalizedPath)) { + return false; + } + if (runtime?.store && isUsableCachedEntryStyle(runtime.store, normalizedPath)) { + return true; + } + return Boolean(readLocalAsset(runtime?.assetDir, normalizedPath)); +} + +function isUsableCachedEntryScript(store, path) { + const cached = readCachedAsset(store, path); + if (!cached) { + return false; + } + const body = Buffer.from(cached.bodyBase64 || "", "base64"); + return !isFallbackAsset(cached) && isUsableDesignIndexScriptBody(path, cached.contentType, body); +} + +function isUsableCachedEntryStyle(store, path) { + const cached = readCachedAsset(store, path); + if (!cached) { + return false; + } + const body = Buffer.from(cached.bodyBase64 || "", "base64"); + return !isFallbackAsset(cached) && isUsableAssetBody(path, cached.contentType, body) && isDesignIndexStylePath(path); +} + +function isUsableLocalEntryScript(assetDir, path) { + const localAsset = readLocalAsset(assetDir, path); + return Boolean(localAsset && isUsableDesignIndexScriptBody(path, localAsset.contentType, localAsset.body)); +} + +function isAcceptableRequestedEntryScript(runtime, path) { + const cached = runtime?.store ? readCachedAsset(runtime.store, path) : undefined; + if (!cached) { + return true; + } + const body = Buffer.from(cached.bodyBase64 || "", "base64"); + if (!isUsableAssetBody(path, cached.contentType, body)) { + return true; + } + return isUsableDesignIndexScriptBody(path, cached.contentType, body); +} + +function isUsableDesignIndexScriptBody(path, contentType, body) { + return isDesignIndexScriptPath(path) && isUsableAssetBody(path, contentType, body); +} + +function isStandaloneDesignIndexScriptBody(path, contentType, body) { + if (!isUsableDesignIndexScriptBody(path, contentType, body)) { + return false; + } + const text = body.toString("utf8", 0, Math.min(body.length, 2 * 1024 * 1024)); + return [ + "anthropic.omelette.api.v1alpha.OmeletteService", + "/v1/design", + "/design/v1/design", + "__OMELETTE_ME__" + ].some((marker) => text.includes(marker)); +} + +function isDesignEntryScriptBuffer(path, body) { + return isDesignIndexScriptPath(path) && designEntryScriptScore(path, body, { mtimeMs: 0, size: body.length }) > 1_000_000; +} + +function designEntryScriptScore(path, body, stat) { + if (!isDesignIndexScriptPath(path)) { + return 0; + } + const text = body.toString("utf8", 0, Math.min(body.length, 2 * 1024 * 1024)); + const designMarkers = [ + "anthropic.omelette.api.v1alpha.OmeletteService", + "/v1/design", + "/design/v1/design", + "__OMELETTE_ME__", + "desktop_design_entrypoint", + "DiscoverDesignRoute", + "claude_ai_omelette_enabled", + "path:\"design\"", + "OmeletteService" + ]; + if (!designMarkers.some((marker) => text.includes(marker))) { + return 0; + } + let score = Number(stat.size || body.length); + if (text.includes("__vite__mapDeps")) { + score += 1_000_000; + } + if (text.includes("createRoot")) { + score += 1_000_000; + } + if (text.includes("document.getElementById")) { + score += 500_000; + } + if (text.includes("ProjectPage") || text.includes("ProjectsPage")) { + score += 250_000; + } + return score; +} + +function extractDesignIndexAssetsFromHtml(body, baseUrl) { + const html = String(body || ""); + const assets = { source: "remote-html", upstreamUrls: {} }; + const pattern = /\b(?:src|href)=["']([^"']+)["']/gi; + let match; + while ((match = pattern.exec(html))) { + const asset = normalizeDesignAssetReference(match[1], baseUrl); + if (asset.upstreamUrl) { + assets.upstreamUrls[asset.path] = asset.upstreamUrl; + } + if (isDesignIndexScriptPath(asset.path)) { + assets.scriptPath = asset.path; + } else if (isDesignIndexStylePath(asset.path)) { + assets.stylePath = asset.path; + } + } + return assets.scriptPath || assets.stylePath ? assets : undefined; +} + +function extractDesignIndexAssetsFromLinkHeaders(linkHeaders, baseUrl) { + const headers = Array.isArray(linkHeaders) ? linkHeaders : linkHeaders ? [linkHeaders] : []; + const assets = { source: "remote-link", upstreamUrls: {} }; + for (const header of headers) { + const pattern = /<([^>]+)>/g; + let match; + while ((match = pattern.exec(String(header)))) { + const asset = normalizeDesignAssetReference(match[1], baseUrl); + if (asset.upstreamUrl) { + assets.upstreamUrls[asset.path] = asset.upstreamUrl; + } + if (isDesignIndexScriptPath(asset.path)) { + assets.scriptPath = asset.path; + } else if (isDesignIndexStylePath(asset.path)) { + assets.stylePath = asset.path; + } + } + } + return assets.scriptPath || assets.stylePath ? assets : undefined; +} + +function normalizeDesignAssetPath(value, baseUrl) { + return normalizeDesignAssetReference(value, baseUrl).path; +} + +function normalizeDesignAssetReference(value, baseUrl) { + const raw = stringValue(value); + if (!raw) { + return { path: "" }; + } + try { + const parsed = new URL(raw, normalizeDesignAssetBaseUrl(baseUrl)); + const path = normalizeDesignAssetRequestPath(parsed.pathname); + return { + path, + ...(isDesignAssetFilePath(path) && /^https?:$/i.test(parsed.protocol) ? { upstreamUrl: parsed.toString() } : {}) + }; + } catch { + return { path: normalizeDesignAssetRequestPath(raw.split("?")[0]) }; + } +} + +function normalizeDesignAssetBaseUrl(baseUrl) { + const value = stringValue(baseUrl) || DEFAULT_UPSTREAM_ORIGIN; + try { + const parsed = new URL(value); + if (parsed.pathname === "/design") { + parsed.pathname = "/design/"; + } + return parsed.toString(); + } catch { + return value; + } +} + +function normalizeDesignAssetRequestPath(value) { + const normalizedPath = normalizePath(value); + if (normalizedPath.startsWith("/design/assets/")) { + return normalizedPath; + } + if (normalizedPath.startsWith("/assets/")) { + return `/design${normalizedPath}`; + } + const assetPath = designAssetFileName(normalizedPath); + if (assetPath) { + return `/design/assets/${assetPath}`; + } + return normalizedPath; +} + +function designAssetFileName(path) { + const match = normalizePath(path).match(/\/assets\/((?:v\d+\/)?[^/?#]+\.(?:css|js|mjs|avif|gif|ico|jpe?g|json|png|svg|webp|woff2?))$/i); + return match?.[1]; +} + +function isDesignAssetFilePath(path) { + return /^\/design\/assets\/(?:[^/?#]+\/)*[^/?#]+\.(?:css|js|mjs|avif|gif|ico|jpe?g|json|png|svg|webp|woff2?)$/i.test(normalizePath(path)); +} + +function questionsViewerFallbackModule() { + return ` +const REACT_ELEMENT = Symbol.for("react.transitional.element"); + +function e(type, props, ...children) { + const nextProps = { ...(props || {}) }; + if (children.length === 1) { + nextProps.children = children[0]; + } else if (children.length > 1) { + nextProps.children = children; + } + return { + $$typeof: REACT_ELEMENT, + key: nextProps.key == null ? null : String(nextProps.key), + props: nextProps, + ref: nextProps.ref == null ? null : nextProps.ref, + type + }; +} + +const styles = { + button: { + background: "#1f1e1d", + border: "0", + borderRadius: 6, + color: "#fff", + cursor: "pointer", + fontSize: 13, + fontWeight: 600, + padding: "9px 12px" + }, + form: { + boxSizing: "border-box", + color: "#1f1e1d", + display: "flex", + flexDirection: "column", + fontFamily: "Inter, system-ui, -apple-system, BlinkMacSystemFont, sans-serif", + gap: 16, + height: "100%", + overflow: "auto", + padding: 24 + }, + option: { + alignItems: "center", + border: "1px solid #dedbd4", + borderRadius: 6, + display: "flex", + gap: 8, + padding: "8px 10px" + }, + question: { + background: "#fff", + border: "1px solid #e8e3db", + borderRadius: 8, + display: "flex", + flexDirection: "column", + gap: 10, + padding: 14 + }, + secondaryButton: { + background: "transparent", + border: "1px solid #cfc9bf", + borderRadius: 6, + color: "#403d39", + cursor: "pointer", + fontSize: 13, + fontWeight: 600, + padding: "9px 12px" + } +}; + +function normalizeSpec(spec) { + const record = spec && typeof spec === "object" && !Array.isArray(spec) ? spec : {}; + const questions = Array.isArray(record.questions) ? record.questions : []; + return { + title: typeof record.title === "string" && record.title.trim() ? record.title : "Claude has some questions", + questions: questions.map((question, index) => normalizeQuestion(question, index)).filter(Boolean) + }; +} + +function normalizeQuestion(question, index) { + const record = question && typeof question === "object" && !Array.isArray(question) ? question : {}; + const title = String(record.title || record.question || record.label || "Question " + (index + 1)); + const rawOptions = Array.isArray(record.options) ? record.options : []; + const options = rawOptions.map((option) => String(option)).filter(Boolean); + let kind = String(record.kind || "").trim(); + if (!["text-options", "svg-options", "slider", "file", "freeform"].includes(kind)) { + kind = record.isSvg ? "svg-options" : options.length > 0 ? "text-options" : "freeform"; + } + if ((kind === "text-options" || kind === "svg-options") && options.length === 0) { + kind = "freeform"; + } + return { + accept: typeof record.accept === "string" ? record.accept : undefined, + default: record.default, + id: String(record.id || record.name || title).toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "") || "question_" + (index + 1), + kind, + max: record.max, + min: record.min, + multi: record.multi === true, + options, + step: record.step, + subtitle: typeof record.subtitle === "string" ? record.subtitle : "", + title + }; +} + +function field(question) { + if (question.kind === "slider") { + return e("input", { + defaultValue: question.default ?? question.min ?? 0, + max: question.max ?? 100, + min: question.min ?? 0, + name: question.id, + step: question.step ?? 1, + style: { width: "100%" }, + type: "range" + }); + } + if (question.kind === "file") { + return e("input", { + accept: question.accept || undefined, + name: question.id, + type: "file" + }); + } + if (question.kind === "freeform") { + return e("textarea", { + name: question.id, + placeholder: "Type your answer", + rows: 4, + style: { border: "1px solid #d8d2c8", borderRadius: 6, font: "inherit", padding: 10, resize: "vertical" } + }); + } + const type = question.multi ? "checkbox" : "radio"; + return e( + "div", + { style: { display: "flex", flexDirection: "column", gap: 8 } }, + ...question.options.map((option, index) => + e( + "label", + { key: question.id + "-" + index, style: styles.option }, + e("input", { + defaultChecked: index === 0, + name: question.id, + type, + value: option + }), + question.kind === "svg-options" + ? e("span", { dangerouslySetInnerHTML: { __html: option }, style: { display: "inline-flex", height: 52, width: 72 } }) + : e("span", { style: { lineHeight: 1.35 } }, option) + ) + ) + ); +} + +export function QuestionsViewer(props) { + const spec = normalizeSpec(props && props.spec); + const submit = (event) => { + event.preventDefault(); + const form = event.currentTarget; + const data = new FormData(form); + const answers = {}; + for (const question of spec.questions) { + const values = data.getAll(question.id).map((value) => String(value)).filter(Boolean); + answers[question.id] = question.multi ? values.join(", ") : values[0] || ""; + } + props && typeof props.onSubmit === "function" && props.onSubmit(answers, []); + }; + return e( + "form", + { onSubmit: submit, style: styles.form }, + e("div", { style: { display: "flex", flexDirection: "column", gap: 4 } }, + e("h2", { style: { fontSize: 20, lineHeight: 1.2, margin: 0 } }, spec.title), + props && props.streaming ? e("p", { style: { color: "#766f65", fontSize: 13, margin: 0 } }, "Claude is preparing questions...") : null + ), + ...spec.questions.map((question) => + e( + "section", + { key: question.id, style: styles.question }, + e("div", null, + e("div", { style: { fontSize: 14, fontWeight: 650, lineHeight: 1.3 } }, question.title), + question.subtitle ? e("div", { style: { color: "#766f65", fontSize: 12, marginTop: 3 } }, question.subtitle) : null + ), + field(question) + ) + ), + e("div", { style: { display: "flex", gap: 8, justifyContent: "flex-end" } }, + e("button", { + onClick: () => props && typeof props.onTimeout === "function" && props.onTimeout(), + style: styles.secondaryButton, + type: "button" + }, "Use defaults"), + e("button", { style: styles.button, type: "submit" }, "Submit answers") + ) + ); +} + +export default QuestionsViewer; +`; +} + +function handleOrganizationApi(runtime, method, path, request, requestBody) { + const parts = path.split("/").filter(Boolean); + const organizationUuid = parts[2] || runtime.me.organizationUuid; + const tail = parts.slice(3); + + if (tail.length === 0) { + return jsonResponse(200, organizationPayload(runtime.me, organizationUuid)); + } + + const first = tail[0]; + if (["members", "memberships"].includes(first)) { + return jsonResponse(200, runtime.me.memberships || []); + } + if (["models", "model_presets", "model-presets"].includes(first)) { + return jsonResponse(200, runtime.me.modelPresets || []); + } + if (["features", "feature_flags", "growthbook", "experiments"].includes(first)) { + return jsonResponse(200, featureFlagsPayload(runtime.me)); + } + if (["settings", "billing", "oauth_tokens", "oauth-tokens"].includes(first)) { + return jsonResponse(200, { ok: true, organization_uuid: organizationUuid }); + } + + const collection = canonicalCollection(first); + if (collection && tail.length === 1) { + if (method === "GET") { + return jsonResponse(200, listItems(runtime.store, collection, organizationUuid)); + } + if (method === "POST") { + return jsonResponse(201, createItem(runtime.store, collection, organizationUuid, parseJsonBody(requestBody), runtime.me)); + } + } + + if (collection && tail.length >= 2) { + const itemUuid = tail[1]; + const subresource = tail[2]; + + if (subresource === "messages" || subresource === "turns") { + if (method === "GET") { + return jsonResponse(200, getItemMessages(runtime.store, collection, itemUuid)); + } + if (method === "POST") { + return jsonResponse(201, appendItemMessage(runtime.store, collection, organizationUuid, itemUuid, parseJsonBody(requestBody), runtime.me)); + } + } + + if (["completion", "completions", "generate", "run"].includes(subresource)) { + const wantsSse = headerIncludes(request.headers.accept, "text/event-stream"); + if (wantsSse) { + return sseCompletionResponse(itemUuid); + } + return jsonResponse(200, completionPayload(itemUuid)); + } + + if (method === "GET") { + return jsonResponse(200, getItem(runtime.store, collection, organizationUuid, itemUuid, runtime.me)); + } + if (method === "PATCH" || method === "PUT") { + return jsonResponse(200, updateItem(runtime.store, collection, organizationUuid, itemUuid, parseJsonBody(requestBody), runtime.me)); + } + if (method === "DELETE") { + deleteItem(runtime.store, collection, itemUuid); + return jsonResponse(200, { deleted: true, id: itemUuid, uuid: itemUuid }); + } + } + + return handleGenericApi(method, path, requestBody); +} + +function handleGenericApi(method, path, requestBody) { + if (method === "GET") { + return jsonResponse(200, { + count: 0, + data: [], + items: [], + ok: true, + path, + results: [] + }); + } + + if (method === "DELETE") { + return jsonResponse(200, { deleted: true, ok: true, path }); + } + + const payload = parseJsonBody(requestBody); + return jsonResponse(200, { + created_at: new Date().toISOString(), + id: randomUuid(), + ok: true, + path, + request: payload, + uuid: randomUuid() + }); +} + +async function handleAdminRequest(runtime, backend, request, response, helpers) { + const url = new URL(request.url || "/", "http://127.0.0.1"); + const method = (request.method || "GET").toUpperCase(); + const path = normalizePath(url.pathname); + + if (method === "GET" && path === "/plugins/claude-design") { + helpers.sendJson(response, 200, { + autoAnswerQuestions: runtime.autoAnswerQuestions, + backend: backend.url, + dbFile: runtime.store.dbFile, + defaultGatewayModel: runtime.defaultGatewayModel, + designIndexAssets: runtime.designIndexAssets, + frontendDefaultModel: runtime.frontendDefaultModel, + gatewayConfigPath: runtime.gatewayConfigPath, + gatewayModels: runtime.gatewayModelPresets, + plugin: "claude-design", + proxy: { + assetDir: runtime.assetDir, + assetPassthrough: runtime.assetPassthrough, + assetSource: runtime.assetSource, + fallbackHosts: runtime.fallbackRouteHosts, + host: runtime.routeHost, + paths: runtime.routePaths + }, + upstreamOrigins: runtime.upstreamOrigins, + routes: { + assets: "/plugins/claude-design/assets", + projects: "/plugins/claude-design/projects", + requests: "/plugins/claude-design/requests", + responses: "/plugins/claude-design/responses" + } + }); + return; + } + + if (method === "GET" && path === "/plugins/claude-design/requests") { + helpers.sendJson(response, 200, { + requests: listRequests(runtime.store, numberValue(url.searchParams.get("limit")) || 100) + }); + return; + } + + if (method === "GET" && path === "/plugins/claude-design/assets") { + helpers.sendJson(response, 200, { + assets: listCachedAssets(runtime.store) + }); + return; + } + + if (method === "GET" && path === "/plugins/claude-design/projects") { + helpers.sendJson(response, 200, { + projects: listOmeletteProjects(runtime) + }); + return; + } + + if (method === "DELETE" && path === "/plugins/claude-design/assets") { + runtime.store.database.run("DELETE FROM claude_design_assets"); + runtime.store.persist(); + helpers.sendJson(response, 200, { cleared: true }); + return; + } + + if (method === "DELETE" && path === "/plugins/claude-design/requests") { + runtime.store.database.run("DELETE FROM claude_design_requests"); + runtime.store.persist(); + helpers.sendJson(response, 200, { cleared: true }); + return; + } + + if (method === "GET" && path === "/plugins/claude-design/responses") { + helpers.sendJson(response, 200, { + responses: listStoredResponses(runtime.store) + }); + return; + } + + if ((method === "POST" || method === "PUT") && path === "/plugins/claude-design/responses") { + const body = await helpers.readJson(request); + const record = isRecord(body) ? body : {}; + const mockMethod = stringValue(record.method)?.toUpperCase() || "ANY"; + const mockPath = normalizePath(stringValue(record.path) || ""); + if (!mockPath) { + helpers.sendJson(response, 400, { error: { message: "path is required." } }); + return; + } + + const status = numberValue(record.status) || 200; + const headers = isRecord(record.headers) ? record.headers : { "content-type": "application/json; charset=utf-8" }; + const responseBody = record.body === undefined ? {} : record.body; + upsertStoredResponse(runtime.store, mockMethod, mockPath, status, headers, responseBody); + helpers.sendJson(response, 200, { + method: mockMethod, + path: mockPath, + stored: true + }); + return; + } + + if (method === "DELETE" && path === "/plugins/claude-design/responses") { + const mockMethod = (url.searchParams.get("method") || "ANY").toUpperCase(); + const mockPath = normalizePath(url.searchParams.get("path") || ""); + if (!mockPath) { + helpers.sendJson(response, 400, { error: { message: "path query parameter is required." } }); + return; + } + runtime.store.database.run("DELETE FROM claude_design_responses WHERE method = ? AND path = ?", [mockMethod, mockPath]); + runtime.store.persist(); + helpers.sendJson(response, 200, { + deleted: true, + method: mockMethod, + path: mockPath + }); + return; + } + + helpers.sendJson(response, 404, { + error: { + message: `Unknown Claude Design admin route: ${method} ${path}` + } + }); +} + +function bootstrapPayload(me) { + const account = accountPayload(me); + const organization = organizationPayload(me, me.organizationUuid); + const featureFlags = featureFlagsPayload(me); + const growthbook = featureFlags.growthbook; + const statsig = statsigPayload(); + return { + account, + accountUuid: me.accountUuid, + activeOrganizationUuid: me.organizationUuid, + canManageDs: me.canManageDs, + cowork_sysprompt_map: null, + current_user_access: currentUserAccessPayload(me), + defaultModelId: me.defaultModelId, + displayName: me.displayName, + email: me.email, + featureFlagsOrgUuid: me.organizationUuid, + features: featureFlags.features, + gated_imports: {}, + gated_imports_build_id: "", + gated_messages: null, + growthbook, + growthbookPayload: growthbook, + me, + memberships: me.memberships || [], + memory_mode: "off", + model_selector_config: {}, + model_selector_state: {}, + modelPresets: me.modelPresets || [], + org_growthbook: growthbook, + org_statsig: statsig, + organization, + organizationUuid: me.organizationUuid, + organizations: organizationsPayload(me), + server_localizations: {}, + settings: organization.settings, + statsig, + system_prompts: {}, + user: account + }; +} + +function accountPayload(me) { + const organizations = organizationsPayload(me); + return { + account_uuid: me.accountUuid, + accountUuid: me.accountUuid, + display_name: me.displayName, + displayName: me.displayName, + email: me.email, + has_oauth_tokens: me.hasOauthTokens, + hasOauthTokens: me.hasOauthTokens, + memberships: organizations.map((organization) => ({ + organization, + organization_uuid: organization.uuid, + organizationUuid: organization.uuid, + role: "owner" + })), + name: me.displayName, + settings: accountSettingsPayload(), + uuid: me.accountUuid + }; +} + +function authSessionPayload(me) { + return { + account: accountPayload(me), + active_organization_uuid: me.organizationUuid, + activeOrganizationUuid: me.organizationUuid, + authenticated: true, + email: me.email, + expires: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(), + me: accountPayload(me), + ok: true, + organization: organizationPayload(me, me.organizationUuid), + organization_uuid: me.organizationUuid, + organizationUuid: me.organizationUuid, + session: { + account_uuid: me.accountUuid, + organization_uuid: me.organizationUuid, + user_uuid: me.accountUuid + }, + user: accountPayload(me), + user_uuid: me.accountUuid, + userUuid: me.accountUuid + }; +} + +function organizationPayload(me, organizationUuid) { + const settings = organizationSettingsPayload(me); + return { + access_level: me.accessLevel, + accessLevel: me.accessLevel, + capabilities: ["chat", "omelette", "raven"], + default_model_id: me.defaultModelId, + defaultModelId: me.defaultModelId, + entitlements: ["omelette"], + features: { + claude_design: true, + design: true, + omelette: true + }, + is_personal: me.isPersonalOrg, + isPersonalOrg: me.isPersonalOrg, + name: me.orgName, + organization_uuid: organizationUuid, + orgName: me.orgName, + rbac_entitlements: ["omelette"], + rbacEntitlements: ["omelette"], + settings, + uuid: organizationUuid + }; +} + +function accountSettingsPayload() { + return { + preview_feature_uses_artifacts: true + }; +} + +function organizationSettingsPayload(me) { + return { + claude_ai_omelette_enabled: true, + default_model_id: me.defaultModelId, + defaultModelId: me.defaultModelId, + omelette: true + }; +} + +function organizationsPayload(me) { + return [ + organizationPayload(me, me.organizationUuid), + ...(me.memberships || []) + .filter((membership) => membership && membership.uuid !== me.organizationUuid) + .map((membership) => ({ + ...organizationPayload(me, membership.uuid), + name: membership.name || me.orgName + })) + ]; +} + +function featureFlagsPayload(me) { + const features = claudeDesignFeatureValues(); + const growthbook = claudeDesignGrowthbookPayload(me, features); + return { + experiments: {}, + feature_flags: features, + features, + growthbook, + growthbookPayload: growthbook + }; +} + +function claudeDesignFeatureValues() { + return { + admin_settings_chicago: true, + claude_ai_omelette_enabled: true, + claude_design: true, + design: true, + desktop_design_entrypoint: { + openBehavior: "embed", + showOnTabs: ["chat", "cowork"] + }, + omelette: true, + omelette_admin_settings: true, + trellis: true + }; +} + +function claudeDesignGrowthbookPayload(me, featureValues = claudeDesignFeatureValues()) { + const configured = parseMaybeJson(me?.growthbookPayload, {}); + const configuredFeatures = isRecord(configured.features) ? configured.features : {}; + const features = { ...configuredFeatures }; + for (const [name, value] of Object.entries(featureValues)) { + features[growthbookFeatureKey(name)] = growthbookFeatureDefinition(value); + } + return { + ...configured, + features + }; +} + +function growthbookFeatureDefinition(value) { + return { + defaultValue: value + }; +} + +function growthbookFeatureKey(name) { + const value = stringValue(name) || ""; + if (value.startsWith("__gb__")) { + return value.slice(6); + } + let hash = 0; + for (let index = 0; index < value.length; index += 1) { + hash = (hash << 5) - hash + value.charCodeAt(index); + hash &= hash; + } + return String((0xffffffff & hash) >>> 0); +} + +function statsigPayload() { + return { + dynamic_configs: {}, + feature_gates: {}, + layer_configs: {}, + sdkParams: {} + }; +} + +function currentUserAccessPayload(me) { + return { + account_uuid: me.accountUuid, + accountUuid: me.accountUuid, + account_permissions: claudeDesignAccountPermissions(), + features: claudeDesignAccessFeatures(), + organization_uuid: me.organizationUuid, + organizationUuid: me.organizationUuid, + permissions: ["admin", "owner", "omelette", "claude_design:manage"], + role: "owner" + }; +} + +function claudeDesignAccessFeatures() { + return [ + "chat", + "claude_api_in_artifacts", + "claude_code", + "claude_code_desktop", + "claude_code_web", + "cowork", + "interactive_content", + "mcp_artifacts", + "omelette", + "skills", + "wiggle", + "work_across_apps" + ].map((feature) => ({ + feature, + status: "available" + })); +} + +function claudeDesignAccountPermissions() { + return [ + "admin", + "claude_design:manage", + "members:view", + "organization:manage_settings", + "owner", + "workspaces:view" + ]; +} + +function handleBootstrapSubresource(runtime, method, path) { + if (method !== "GET") { + return undefined; + } + const match = path.match(/^\/(?:api|edge-api)\/bootstrap\/[^/]+\/([^/]+)\/?$/) || + path.match(/^\/_bootstrap\/[^/]+\/([^/]+)\/?$/); + if (!match) { + return undefined; + } + switch (match[1]) { + case "current_user_access": + return jsonResponse(200, currentUserAccessPayload(runtime.me)); + case "cowork_sysprompt_map": + return jsonResponse(200, null); + case "gated_messages": + return jsonResponse(200, null); + case "model_selector_config": + case "model_selector_state": + case "server_localizations": + case "system_prompts": + return jsonResponse(200, {}); + default: + return undefined; + } +} + +function canonicalCollection(value) { + const normalized = String(value || "").toLowerCase(); + const aliases = { + artifacts: "artifacts", + chat_conversations: "chat_conversations", + conversations: "chat_conversations", + design: "designs", + design_projects: "design_projects", + design_sessions: "design_sessions", + designs: "designs", + documents: "documents", + files: "files", + projects: "projects", + sessions: "design_sessions" + }; + return aliases[normalized]; +} + +function listItems(store, collection, organizationUuid) { + return queryRows( + store.database, + "SELECT collection, uuid, created_at, updated_at, title, model, data_json, messages_json FROM claude_design_items WHERE collection = ? ORDER BY updated_at DESC", + [collection] + ).map((row) => itemFromRow(row, organizationUuid)); +} + +function createItem(store, collection, organizationUuid, body, me) { + const now = new Date().toISOString(); + const uuid = stringValue(body.uuid) || stringValue(body.id) || randomUuid(); + const title = stringValue(body.title) || stringValue(body.name) || "Untitled design"; + const model = stringValue(body.model) || me.defaultModelId; + const data = { + ...body, + organization_uuid: organizationUuid + }; + + store.database.run( + "INSERT OR REPLACE INTO claude_design_items (collection, uuid, created_at, updated_at, title, model, data_json, messages_json) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", + [collection, uuid, now, now, title, model, JSON.stringify(data), JSON.stringify([])] + ); + store.persist(); + return getItem(store, collection, organizationUuid, uuid, me); +} + +function getItem(store, collection, organizationUuid, uuid, me) { + const row = queryRows( + store.database, + "SELECT collection, uuid, created_at, updated_at, title, model, data_json, messages_json FROM claude_design_items WHERE collection = ? AND uuid = ? LIMIT 1", + [collection, uuid] + )[0]; + if (row) { + return itemFromRow(row, organizationUuid); + } + + const created = createItem(store, collection, organizationUuid, { title: "Untitled design", uuid }, me); + return { + ...created, + createdByFallback: true + }; +} + +function getExistingItem(store, collection, organizationUuid, uuid) { + const row = queryRows( + store.database, + "SELECT collection, uuid, created_at, updated_at, title, model, data_json, messages_json FROM claude_design_items WHERE collection = ? AND uuid = ? LIMIT 1", + [collection, uuid] + )[0]; + return row ? itemFromRow(row, organizationUuid) : undefined; +} + +function updateItem(store, collection, organizationUuid, uuid, body, me) { + const existing = getItem(store, collection, organizationUuid, uuid, me); + const now = new Date().toISOString(); + const title = stringValue(body.title) || stringValue(body.name) || existing.title || "Untitled design"; + const model = stringValue(body.model) || existing.model || me.defaultModelId; + const data = { + ...existing, + ...body, + organization_uuid: organizationUuid + }; + delete data.messages; + + store.database.run( + "UPDATE claude_design_items SET updated_at = ?, title = ?, model = ?, data_json = ? WHERE collection = ? AND uuid = ?", + [now, title, model, JSON.stringify(data), collection, uuid] + ); + store.persist(); + return getItem(store, collection, organizationUuid, uuid, me); +} + +function deleteItem(store, collection, uuid) { + store.database.run("DELETE FROM claude_design_items WHERE collection = ? AND uuid = ?", [collection, uuid]); + store.persist(); +} + +function getItemMessages(store, collection, uuid) { + const row = queryRows(store.database, "SELECT messages_json FROM claude_design_items WHERE collection = ? AND uuid = ? LIMIT 1", [ + collection, + uuid + ])[0]; + return parseMaybeJson(row?.messages_json, []); +} + +function appendItemMessage(store, collection, organizationUuid, uuid, body, me) { + const item = getItem(store, collection, organizationUuid, uuid, me); + const now = new Date().toISOString(); + const messages = Array.isArray(item.messages) ? item.messages : []; + const content = body.content || body.text || body.prompt || body.message || ""; + const message = { + content, + created_at: now, + id: randomUuid(), + role: stringValue(body.role) || stringValue(body.sender) || "user", + uuid: randomUuid() + }; + messages.push(message); + store.database.run("UPDATE claude_design_items SET updated_at = ?, messages_json = ? WHERE collection = ? AND uuid = ?", [ + now, + JSON.stringify(messages), + collection, + uuid + ]); + store.persist(); + return { + conversation: getItem(store, collection, organizationUuid, uuid, me), + message + }; +} + +function itemFromRow(row, organizationUuid) { + const data = parseMaybeJson(row.data_json, {}); + const messages = sanitizeStoredMessages(parseMaybeJson(row.messages_json, [])); + return { + ...data, + collection: row.collection, + created_at: row.created_at, + id: row.uuid, + messages, + model: row.model, + name: row.title, + organization_uuid: organizationUuid, + title: row.title, + updated_at: row.updated_at, + uuid: row.uuid + }; +} + +function createOmeletteProject(runtime, requestBody) { + const request = decodeCreateProjectRequest(requestBody); + const now = new Date().toISOString(); + const uuid = randomUuid(); + const name = request.name || request.templateTitle || "Untitled design"; + const type = normalizeProjectTypeNumber(request.type); + const data = { + can_edit: true, + description: request.description || "", + intro_text: request.introText || "", + is_owned: true, + name, + organization_uuid: runtime.me.organizationUuid, + owner_display_name: runtime.me.displayName, + owner_email: runtime.me.email, + owner_uuid: runtime.me.accountUuid, + project_id: uuid, + project_type: type, + sharing: { + team_can_comment: false, + team_can_edit: false, + view_mode: "private" + }, + source: "omelette-connect-rpc", + template_id: request.templateId || "", + template_title: request.templateTitle || "", + title: name, + type, + uuid + }; + + runtime.store.database.run( + "INSERT OR REPLACE INTO claude_design_items (collection, uuid, created_at, updated_at, title, model, data_json, messages_json) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", + [PROJECT_COLLECTION, uuid, now, now, name, runtime.me.defaultModelId, JSON.stringify(data), JSON.stringify([])] + ); + runtime.store.persist(); + + return { + ...data, + created_at: now, + updated_at: now + }; +} + +function getOmeletteProject(runtime, projectId) { + const uuid = stringValue(projectId) || randomUuid(); + if (uuid) { + const row = queryRows( + runtime.store.database, + "SELECT collection, uuid, created_at, updated_at, title, model, data_json, messages_json FROM claude_design_items WHERE collection = ? AND uuid = ? LIMIT 1", + [PROJECT_COLLECTION, uuid] + )[0]; + if (row) { + return omeletteProjectFromRow(row, runtime.me); + } + } + + const now = new Date().toISOString(); + const name = "Untitled design"; + const data = { + can_edit: true, + is_owned: true, + name, + organization_uuid: runtime.me.organizationUuid, + owner_display_name: runtime.me.displayName, + owner_email: runtime.me.email, + owner_uuid: runtime.me.accountUuid, + project_id: uuid, + project_type: PROJECT_TYPE_PROJECT, + sharing: { + view_mode: "private" + }, + source: "omelette-connect-rpc-fallback", + title: name, + type: PROJECT_TYPE_PROJECT, + uuid + }; + + runtime.store.database.run( + "INSERT OR REPLACE INTO claude_design_items (collection, uuid, created_at, updated_at, title, model, data_json, messages_json) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", + [PROJECT_COLLECTION, uuid, now, now, name, runtime.me.defaultModelId, JSON.stringify(data), JSON.stringify([])] + ); + runtime.store.persist(); + + return omeletteProjectFromRow( + { + collection: PROJECT_COLLECTION, + created_at: now, + data_json: JSON.stringify(data), + messages_json: "[]", + model: runtime.me.defaultModelId, + title: name, + updated_at: now, + uuid + }, + runtime.me + ); +} + +function listOmeletteProjects(runtime, typeFilter, publishedOnly) { + const projects = queryRows( + runtime.store.database, + "SELECT collection, uuid, created_at, updated_at, title, model, data_json, messages_json FROM claude_design_items WHERE collection = ? ORDER BY updated_at DESC", + [PROJECT_COLLECTION] + ).map((row) => omeletteProjectFromRow(row, runtime.me)); + return projects.filter((project) => { + if (typeFilter && project.type !== typeFilter) { + return false; + } + if (publishedOnly && !project.publishedAt) { + return false; + } + return true; + }); +} + +function getProjectRow(runtime, projectId) { + const uuid = stringValue(projectId); + if (!uuid) { + return undefined; + } + return queryRows( + runtime.store.database, + "SELECT collection, uuid, created_at, updated_at, title, model, data_json, messages_json FROM claude_design_items WHERE collection = ? AND uuid = ? LIMIT 1", + [PROJECT_COLLECTION, uuid] + )[0]; +} + +function saveProjectData(runtime, projectId, updater) { + const row = getProjectRow(runtime, projectId); + if (!row) { + return undefined; + } + const current = parseMaybeJson(row.data_json, {}); + const next = updater(current, row) || current; + const title = stringValue(next.name) || stringValue(next.title) || row.title || "Untitled design"; + runtime.store.database.run( + "UPDATE claude_design_items SET updated_at = ?, title = ?, data_json = ? WHERE collection = ? AND uuid = ?", + [new Date().toISOString(), title, JSON.stringify(next), PROJECT_COLLECTION, row.uuid] + ); + runtime.store.persist(); + return getProjectRow(runtime, row.uuid); +} + +function updateOmeletteProject(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const name = decodeProtoStringField(requestBody, 2); + if (!projectId || !name) { + return; + } + saveProjectData(runtime, projectId, (data) => ({ + ...data, + name, + title: name + })); +} + +function deleteOmeletteProject(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + if (!projectId) { + return; + } + runtime.store.database.run("DELETE FROM claude_design_items WHERE collection = ? AND uuid = ?", [PROJECT_COLLECTION, projectId]); + runtime.store.database.run("DELETE FROM claude_design_files WHERE project_id = ?", [projectId]); + runtime.store.persist(); +} + +function normalizeProjectStoreData(runtime, row, value) { + const record = isRecord(value) ? value : {}; + const project = omeletteProjectFromRow(row, runtime.me); + const created = stringValue(record.created) || project.createdAt || row.created_at || new Date().toISOString(); + const lastOpened = stringValue(record.lastOpened) || project.updatedAt || row.updated_at || created; + const sourceChats = isRecord(record.chats) ? record.chats : {}; + const chats = {}; + for (const [chatId, chat] of Object.entries(sourceChats)) { + if (isRecord(chat)) { + chats[chatId] = normalizeProjectChat(chat, chatId, created, lastOpened); + } + } + + const viewState = isRecord(record.viewState) ? record.viewState : {}; + let activeChatId = stringValue(viewState.activeChatId); + const fallbackChatId = activeChatId || Object.keys(chats)[0] || defaultProjectChatId(project.projectId || row.uuid); + const mergedStoredChats = mergeStoredMessagesIntoProjectChats(chats, row, created, lastOpened, fallbackChatId); + if (!activeChatId || !isRecord(chats[activeChatId]) || (isEmptyProjectChat(chats[activeChatId]) && mergedStoredChats.lastChatId)) { + activeChatId = mergedStoredChats.lastChatId || Object.keys(chats)[0] || defaultProjectChatId(project.projectId || row.uuid); + } + if (!isRecord(chats[activeChatId])) { + chats[activeChatId] = normalizeProjectChat({}, activeChatId, created, lastOpened); + } + + return { + ...record, + activeSkills: Array.isArray(record.activeSkills) ? record.activeSkills : [], + chats, + closedChats: Array.isArray(record.closedChats) ? record.closedChats : [], + created, + lastOpened, + name: stringValue(record.name) || project.name, + viewState: { + ...viewState, + activeChatId, + activeFileTab: numberValue(viewState.activeFileTab) ?? -1, + activeProjectTab: numberValue(viewState.activeProjectTab) ?? 0, + folderHistory: Array.isArray(viewState.folderHistory) ? viewState.folderHistory : [""], + folderHistoryIndex: numberValue(viewState.folderHistoryIndex) ?? 0, + folderPath: typeof viewState.folderPath === "string" ? viewState.folderPath : "", + openFiles: Array.isArray(viewState.openFiles) ? viewState.openFiles : [] + } + }; +} + +function mergeStoredMessagesIntoProjectChats(chats, row, created, lastOpened, fallbackChatId) { + const storedMessages = sanitizeStoredMessages(parseMaybeJson(row?.messages_json, [])); + const grouped = new Map(); + const orderedChatIds = []; + let lastChatId; + + for (const message of storedMessages) { + if (!isRecord(message)) { + continue; + } + const chatId = stringValue(message.chat_id) || stringValue(message.chatId) || fallbackChatId; + if (!chatId) { + continue; + } + if (!grouped.has(chatId)) { + grouped.set(chatId, []); + orderedChatIds.push(chatId); + } + grouped.get(chatId).push(message); + lastChatId = chatId; + } + + for (const chatId of orderedChatIds) { + const chat = normalizeProjectChat(chats[chatId] || {}, chatId, created, lastOpened); + const mergedMessages = Array.isArray(chat.messages) ? [...chat.messages] : []; + const seenKeys = new Set(); + const existingLooseKeys = new Set(); + for (const message of mergedMessages) { + for (const key of projectChatMessageKeys(message)) { + seenKeys.add(key); + } + for (const key of projectChatMessageLooseKeys(message)) { + existingLooseKeys.add(key); + } + } + + for (const storedMessage of grouped.get(chatId) || []) { + const projectMessage = projectChatMessageFromStoredMessage(storedMessage, lastOpened); + const keys = projectChatMessageKeys(projectMessage); + const looseKeys = projectChatMessageLooseKeys(projectMessage); + if (keys.some((key) => seenKeys.has(key)) || looseKeys.some((key) => existingLooseKeys.has(key))) { + continue; + } + mergedMessages.push(projectMessage); + for (const key of keys) { + seenKeys.add(key); + } + } + + chats[chatId] = { + ...chat, + lastOpened: latestProjectChatTimestamp(mergedMessages) || chat.lastOpened, + messages: sortProjectChatMessages(mergedMessages) + }; + } + + return { + lastChatId + }; +} + +function projectChatMessageFromStoredMessage(message, fallbackTimestamp) { + const projectMessage = { + ...message + }; + delete projectMessage.chat_id; + delete projectMessage.chatId; + + const timestamp = stringValue(message.timestamp) || stringValue(message.created_at) || stringValue(message.createdAt) || fallbackTimestamp; + if (timestamp) { + projectMessage.timestamp = timestamp; + } + const role = stringValue(message.role); + if (role) { + projectMessage.role = role; + } + if (Array.isArray(message.contentBlocks) && !Array.isArray(projectMessage.content_blocks)) { + projectMessage.content_blocks = message.contentBlocks; + } + if (Array.isArray(message.content_blocks) && !Array.isArray(projectMessage.contentBlocks)) { + projectMessage.contentBlocks = message.content_blocks; + } + return projectMessage; +} + +function projectChatMessageKeys(message) { + if (!isRecord(message)) { + return [`raw:${JSON.stringify(message)}`]; + } + + const keys = []; + const id = stringValue(message.id); + if (id) { + keys.push(`id:${id}`); + } + const uuid = stringValue(message.uuid); + if (uuid) { + keys.push(`uuid:${uuid}`); + } + + const role = stringValue(message.role) || ""; + const timestamp = stringValue(message.timestamp) || stringValue(message.created_at) || stringValue(message.createdAt) || ""; + const content = projectChatMessageContentKey(message); + if (role || timestamp || content) { + keys.push(`content:${role}\n${timestamp}\n${content}`); + } + return keys; +} + +function projectChatMessageLooseKeys(message) { + if (!isRecord(message)) { + return []; + } + const role = stringValue(message.role) || ""; + const content = projectChatMessageContentKey(message); + return role || content ? [`content-loose:${role}\n${content}`] : []; +} + +function projectChatMessageContentKey(message) { + if (!isRecord(message)) { + return JSON.stringify(message); + } + const blocks = Array.isArray(message.contentBlocks) + ? message.contentBlocks + : Array.isArray(message.content_blocks) + ? message.content_blocks + : undefined; + return JSON.stringify({ + blocks, + content: message.content, + role: message.role + }); +} + +function sortProjectChatMessages(messages) { + return messages + .map((message, index) => ({ + index, + message, + timestamp: projectChatMessageTimestamp(message) + })) + .sort((left, right) => { + if (left.timestamp !== undefined && right.timestamp !== undefined && left.timestamp !== right.timestamp) { + return left.timestamp - right.timestamp; + } + if (left.timestamp !== undefined && right.timestamp === undefined) { + return -1; + } + if (left.timestamp === undefined && right.timestamp !== undefined) { + return 1; + } + return left.index - right.index; + }) + .map((entry) => entry.message); +} + +function latestProjectChatTimestamp(messages) { + let latest; + for (const message of messages) { + const timestamp = projectChatMessageTimestamp(message); + if (timestamp === undefined || (latest !== undefined && timestamp <= latest.timestamp)) { + continue; + } + latest = { + iso: stringValue(message.timestamp) || stringValue(message.created_at) || stringValue(message.createdAt), + timestamp + }; + } + return latest?.iso; +} + +function projectChatMessageTimestamp(message) { + if (!isRecord(message)) { + return undefined; + } + const value = stringValue(message.timestamp) || stringValue(message.created_at) || stringValue(message.createdAt); + if (!value) { + return undefined; + } + const timestamp = Date.parse(value); + return Number.isFinite(timestamp) ? timestamp : undefined; +} + +function isEmptyProjectChat(chat) { + return !isRecord(chat) || !Array.isArray(chat.messages) || chat.messages.length === 0; +} + +function normalizeProjectChat(value, chatId, created, lastOpened) { + const chat = isRecord(value) ? value : {}; + const name = stringValue(chat.name) || stringValue(chat.title) || "Chat"; + const composer = isRecord(chat.composer) ? chat.composer : {}; + return { + ...chat, + composer: { + ...composer, + activeSkills: Array.isArray(composer.activeSkills) ? composer.activeSkills : [], + attachments: Array.isArray(composer.attachments) ? composer.attachments : [], + text: typeof composer.text === "string" ? composer.text : "" + }, + created: stringValue(chat.created) || created, + id: stringValue(chat.id) || chatId, + lastOpened: stringValue(chat.lastOpened) || lastOpened, + messages: sanitizeStoredMessages(Array.isArray(chat.messages) ? chat.messages : []), + name, + title: stringValue(chat.title) || name, + todos: Array.isArray(chat.todos) ? chat.todos : [] + }; +} + +function defaultProjectChatId(projectId) { + const normalized = String(projectId || "").replace(/[^a-zA-Z0-9_-]/g, "").slice(0, 36); + return normalized ? `chat-${normalized}` : "chat-default"; +} + +function getProjectDataBytes(runtime, projectId) { + let row = getProjectRow(runtime, projectId); + if (!row && projectId) { + getOmeletteProject(runtime, projectId); + row = getProjectRow(runtime, projectId); + } + if (!row) { + return Buffer.alloc(0); + } + + const record = parseMaybeJson(row.data_json, {}); + const base64 = stringValue(record.project_data_base64); + const decoded = base64 ? parseMaybeJson(Buffer.from(base64, "base64").toString("utf8"), {}) : record; + const normalized = normalizeProjectStoreData(runtime, row, decoded); + const bytes = Buffer.from(JSON.stringify(normalized), "utf8"); + const normalizedBase64 = bytes.toString("base64"); + if (base64 !== normalizedBase64) { + runtime.store.database.run( + "UPDATE claude_design_items SET data_json = ? WHERE collection = ? AND uuid = ?", + [JSON.stringify({ ...record, project_data_base64: normalizedBase64 }), PROJECT_COLLECTION, row.uuid] + ); + runtime.store.persist(); + } + return bytes; +} + +function updateProjectDataBytes(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const data = decodeProtoBytesField(requestBody, 2) || Buffer.alloc(0); + if (projectId) { + saveProjectData(runtime, projectId, (record, row) => { + const decoded = data.length ? parseMaybeJson(data.toString("utf8"), undefined) : undefined; + if (!isRecord(decoded)) { + return { + ...record, + project_data_base64: data.toString("base64") + }; + } + const normalized = normalizeProjectStoreData(runtime, row, decoded); + return { + ...record, + project_data_base64: Buffer.from(JSON.stringify(normalized), "utf8").toString("base64") + }; + }); + } + return protoInt32(1, 5); +} + +function encodeGetChatMessagesResponse(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const chatId = decodeProtoStringField(requestBody, 2); + const row = getProjectRow(runtime, projectId); + const messages = parseMaybeJson(row?.messages_json, []); + const sanitized = sanitizeStoredMessages(messages); + const filtered = chatId ? sanitized.filter((message) => !message.chat_id || message.chat_id === chatId) : sanitized; + return protoBytes(1, Buffer.from(JSON.stringify(filtered), "utf8"), true); +} + +function updateOmeletteProjectSharing(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const sharing = { + view_mode: decodeProtoStringField(requestBody, 2) || "private", + team_can_edit: decodeProtoBoolField(requestBody, 3), + team_can_comment: decodeProtoBoolField(requestBody, 4) + }; + if (projectId) { + saveProjectData(runtime, projectId, (data) => ({ + ...data, + sharing + })); + } + return protoMessage(1, encodeSharing(sharing)); +} + +function duplicateOmeletteProject(runtime, requestBody, options) { + const projectId = decodeProtoStringField(requestBody, 1); + const row = getProjectRow(runtime, projectId); + const source = row ? omeletteProjectFromRow(row, runtime.me) : getOmeletteProject(runtime, projectId); + const now = new Date().toISOString(); + const uuid = randomUuid(); + const sourceData = parseMaybeJson(row?.data_json, {}); + const type = normalizeProjectTypeNumber(options.type || source.type); + const name = type === PROJECT_TYPE_TEMPLATE && !source.name.toLowerCase().includes("template") + ? `${source.name} Template` + : `${source.name} Copy`; + const data = { + ...sourceData, + name, + project_id: uuid, + project_type: type, + source_project_uuid: source.projectId, + title: name, + type, + uuid + }; + if (!options.includeChats) { + delete data.project_data_base64; + } + runtime.store.database.run( + "INSERT OR REPLACE INTO claude_design_items (collection, uuid, created_at, updated_at, title, model, data_json, messages_json) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", + [PROJECT_COLLECTION, uuid, now, now, name, runtime.me.defaultModelId, JSON.stringify(data), options.includeChats ? row?.messages_json || "[]" : "[]"] + ); + for (const file of listProjectFileRows(runtime, source.projectId, "")) { + runtime.store.database.run( + "INSERT OR REPLACE INTO claude_design_files (project_id, path, created_at, updated_at, content_type, body_base64, version) VALUES (?, ?, ?, ?, ?, ?, ?)", + [uuid, file.path, now, now, file.content_type, file.body_base64, 1] + ); + } + runtime.store.persist(); + return protoString(1, uuid); +} + +function updateProjectType(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const type = normalizeProjectTypeNumber(decodeProtoEnumField(requestBody, 2)); + if (projectId) { + saveProjectData(runtime, projectId, (data) => ({ + ...data, + project_type: type, + type + })); + } + return protoEnum(1, type); +} + +function setProjectPublished(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const published = decodeProtoBoolField(requestBody, 2); + const publishedAt = published ? new Date().toISOString() : ""; + if (projectId) { + saveProjectData(runtime, projectId, (data) => ({ + ...data, + published_at: publishedAt + })); + } + return published ? protoTimestamp(1, publishedAt) : Buffer.alloc(0); +} + +function updateProjectInfo(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + if (!projectId) { + return; + } + const templateTitle = decodeProtoStringField(requestBody, 2); + const description = decodeProtoStringField(requestBody, 3); + const introText = decodeProtoStringField(requestBody, 4); + saveProjectData(runtime, projectId, (data) => ({ + ...data, + description: description ?? data.description ?? "", + intro_text: introText ?? data.intro_text ?? "", + template_title: templateTitle ?? data.template_title ?? "" + })); +} + +function updateProjectDesignSystems(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const bindings = decodeDesignSystemBindings(decodeProtoMessageFields(requestBody, 2)); + if (projectId) { + saveProjectData(runtime, projectId, (data) => ({ + ...data, + design_systems: bindings + })); + } + return Buffer.concat(bindings.map((binding) => protoMessage(1, encodeDesignSystemBinding(binding)))); +} + +function patchDesignSystemBinding(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const dsProjectId = decodeProtoStringField(requestBody, 2); + const syncedAtVersion = decodeProtoIntField(requestBody, 3); + let bindings = []; + if (projectId && dsProjectId) { + const row = getProjectRow(runtime, projectId); + const data = parseMaybeJson(row?.data_json, {}); + bindings = Array.isArray(data.design_systems) ? data.design_systems : []; + const existing = bindings.find((binding) => binding.ds_project_id === dsProjectId); + if (existing) { + existing.synced_at_version = syncedAtVersion; + } else { + bindings.push({ ds_project_id: dsProjectId, synced_at_version: syncedAtVersion }); + } + saveProjectData(runtime, projectId, (record) => ({ + ...record, + design_systems: bindings + })); + } + return Buffer.concat(bindings.map((binding) => protoMessage(1, encodeDesignSystemBinding(binding)))); +} + +function updateProjectFavorite(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const favorite = decodeProtoBoolField(requestBody, 2); + if (projectId) { + saveProjectData(runtime, projectId, (data) => ({ + ...data, + is_favorite: favorite + })); + } +} + +function decodeDesignSystemBindings(messages) { + return messages + .map((message) => ({ + ds_project_id: decodeProtoStringField(message, 1) || "", + has_v2_layout: decodeProtoBoolField(message, 3), + synced_at_version: decodeProtoIntField(message, 2) + })) + .filter((binding) => binding.ds_project_id); +} + +function encodeDesignSystemBinding(binding) { + return Buffer.concat([ + protoString(1, binding.ds_project_id || binding.dsProjectId), + protoInt64(2, binding.synced_at_version ?? binding.syncedAtVersion ?? 0), + protoBool(3, binding.has_v2_layout === true || binding.hasV2Layout === true) + ]); +} + +function listProjectFileRows(runtime, projectId, prefix) { + const address = normalizeProjectFileAddress(runtime, projectId, prefix || ""); + const normalizedProjectId = address.projectId; + if (!normalizedProjectId) { + return []; + } + const rows = queryRows( + runtime.store.database, + "SELECT project_id, path, created_at, updated_at, content_type, body_base64, version FROM claude_design_files WHERE project_id = ? ORDER BY path ASC", + [normalizedProjectId] + ); + const normalizedPrefix = address.path; + if (!normalizedPrefix) { + return rows; + } + const prefixWithSlash = `${normalizedPrefix.replace(/\/+$/, "")}/`; + return rows.filter((row) => row.path === normalizedPrefix || row.path.startsWith(prefixWithSlash)); +} + +function encodeListFilesResponse(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const directory = sanitizeProjectFilePath(decodeProtoStringField(requestBody, 2) || ""); + const depth = decodeProtoIntField(requestBody, 3) || 1; + const offset = decodeProtoIntField(requestBody, 4) || 0; + const filter = decodeProtoStringField(requestBody, 5); + const allEntries = listProjectDirectoryEntries(runtime, projectId, directory, depth, filter); + const limit = 200; + const visible = allEntries.slice(offset, offset + limit); + return Buffer.concat([ + ...visible.map((entry) => protoMessage(1, encodeFileEntry(entry))), + protoInt32(2, allEntries.length), + protoInt32(3, offset), + protoInt32(4, limit), + protoBool(5, offset + limit < allEntries.length) + ]); +} + +function listProjectDirectoryEntries(runtime, projectId, directory, depth, filter) { + const address = normalizeProjectFileAddress(runtime, projectId, directory || ""); + const normalizedDirectory = address.path; + const rows = listProjectFileRows(runtime, address.projectId, normalizedDirectory); + const prefix = normalizedDirectory ? `${normalizedDirectory.replace(/\/+$/, "")}/` : ""; + const directories = new Map(); + const files = []; + const normalizedFilter = stringValue(filter)?.toLowerCase(); + + for (const row of rows) { + if (normalizedDirectory && row.path === normalizedDirectory) { + continue; + } + const relative = prefix ? row.path.slice(prefix.length) : row.path; + if (!relative || relative.startsWith("../")) { + continue; + } + const slashIndex = relative.indexOf("/"); + if (slashIndex >= 0 && depth <= 1) { + const name = relative.slice(0, slashIndex); + const path = prefix ? `${prefix}${name}` : name; + const existing = directories.get(path); + if (!existing || String(row.updated_at) > String(existing.updatedAt)) { + directories.set(path, { + contentType: "inode/directory", + name, + path, + size: 0, + type: "directory", + updatedAt: row.updated_at, + version: 0 + }); + } + continue; + } + if (normalizedFilter && !row.path.toLowerCase().includes(normalizedFilter)) { + continue; + } + files.push(fileEntryFromRow(row)); + } + + return [...directories.values(), ...files].sort((left, right) => { + if (left.type !== right.type) { + return left.type === "directory" ? -1 : 1; + } + return left.path.localeCompare(right.path); + }); +} + +function fileEntryFromRow(row) { + return { + contentType: row.content_type || guessContentType(row.path), + name: row.path.split("/").pop() || row.path, + path: row.path, + size: Buffer.from(row.body_base64 || "", "base64").length, + type: "file", + updatedAt: row.updated_at, + version: Number(row.version) || 1 + }; +} + +function encodeFileEntry(entry) { + return Buffer.concat([ + protoString(1, entry.name), + protoString(2, entry.path), + protoString(3, entry.type), + protoInt64(4, entry.size || 0), + protoString(5, entry.contentType), + protoTimestamp(6, entry.updatedAt), + protoInt64(7, entry.version || 0) + ]); +} + +function encodeGetFileResponse(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const filePath = sanitizeProjectFilePath(decodeProtoStringField(requestBody, 2) || ""); + const row = getProjectFileRow(runtime, projectId, filePath); + if (!row) { + return Buffer.alloc(0); + } + const body = Buffer.from(row.body_base64 || "", "base64"); + return Buffer.concat([ + protoBytes(1, body, true), + protoString(2, row.content_type || guessContentType(filePath)), + protoBool(3, false), + protoInt64(4, Number(row.version) || 1) + ]); +} + +function writeProjectFiles(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const fileMessages = decodeProtoMessageFields(requestBody, 2); + const deletePaths = decodeProtoStringFields(requestBody, 6); + const mutationMessages = decodeProtoMessageFields(requestBody, 7); + const written = []; + + for (const fileMessage of fileMessages) { + const file = decodeFileToWrite(fileMessage); + if (!file.path) { + continue; + } + const row = upsertProjectFile(runtime, projectId, file.path, file.body, file.mimeType); + written.push(fileEntryFromRow(row)); + } + + for (const deletePath of deletePaths) { + deleteProjectFileByPath(runtime, projectId, deletePath); + } + + for (const mutation of mutationMessages) { + const result = applyFileMutation(runtime, projectId, mutation); + if (result?.entry) { + written.push(result.entry); + } + } + + runtime.store.persist(); + return Buffer.concat(written.map((file) => protoMessage(1, encodeWrittenFile(file)))); +} + +function decodeFileToWrite(message) { + const path = sanitizeProjectFilePath(decodeProtoStringField(message, 1) || ""); + const data = decodeProtoStringField(message, 2) || ""; + const mimeType = decodeProtoStringField(message, 3) || guessContentType(path); + const encoding = decodeProtoStringField(message, 4) || ""; + const body = encoding.toLowerCase() === "base64" ? Buffer.from(data, "base64") : Buffer.from(data, "utf8"); + return { + body, + encoding, + mimeType, + path + }; +} + +function applyFileMutation(runtime, projectId, mutation) { + const path = sanitizeProjectFilePath(decodeProtoStringField(mutation, 1) || ""); + if (!path) { + return undefined; + } + const write = decodeProtoMessageFields(mutation, 4)[0]; + if (write) { + const data = decodeProtoStringField(write, 1) || ""; + const mimeType = decodeProtoStringField(write, 2) || guessContentType(path); + const encoding = decodeProtoStringField(write, 3) || ""; + const body = encoding.toLowerCase() === "base64" ? Buffer.from(data, "base64") : Buffer.from(data, "utf8"); + return { entry: fileEntryFromRow(upsertProjectFile(runtime, projectId, path, body, mimeType)) }; + } + + if (decodeProtoMessageFields(mutation, 6)[0]) { + deleteProjectFileByPath(runtime, projectId, path); + return { deleted: true }; + } + + const move = decodeProtoMessageFields(mutation, 8)[0]; + if (move) { + const fromPath = sanitizeProjectFilePath(decodeProtoStringField(move, 1) || ""); + const source = getProjectFileRow(runtime, projectId, fromPath); + if (source) { + const row = upsertProjectFile(runtime, projectId, path, Buffer.from(source.body_base64 || "", "base64"), source.content_type); + deleteProjectFileByPath(runtime, projectId, fromPath); + return { entry: fileEntryFromRow(row) }; + } + } + + const edit = decodeProtoMessageFields(mutation, 5)[0]; + if (edit) { + return { entry: editProjectFileByMessages(runtime, projectId, path, decodeProtoMessageFields(edit, 1)) }; + } + + return undefined; +} + +function encodeWrittenFile(entry) { + return Buffer.concat([ + protoString(1, entry.name), + protoString(2, entry.path), + protoString(3, entry.contentType), + protoInt64(4, entry.version || 1) + ]); +} + +function deleteProjectFile(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const filePath = decodeProtoStringField(requestBody, 2); + const deleted = deleteProjectFileByPath(runtime, projectId, filePath); + runtime.store.persist(); + return protoInt32(1, deleted); +} + +function deleteProjectFiles(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const paths = decodeProtoStringFields(requestBody, 2); + let deleted = 0; + for (const filePath of paths) { + deleted += deleteProjectFileByPath(runtime, projectId, filePath); + } + runtime.store.persist(); + return protoInt32(1, deleted); +} + +function copyProjectFile(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const src = sanitizeProjectFilePath(decodeProtoStringField(requestBody, 2) || ""); + const dest = sanitizeProjectFilePath(decodeProtoStringField(requestBody, 3) || ""); + const move = decodeProtoBoolField(requestBody, 4); + const srcProjectId = decodeProtoStringField(requestBody, 5) || projectId; + const sourceAddress = normalizeProjectFileAddress(runtime, srcProjectId, src); + const targetAddress = normalizeProjectFileAddress(runtime, projectId, dest); + const normalizedSrcProjectId = sourceAddress.projectId; + const normalizedTargetProjectId = targetAddress.projectId || normalizedSrcProjectId || projectId; + const normalizedSrc = sourceAddress.path; + const normalizedDest = targetAddress.path; + const copied = []; + for (const row of listProjectFileRows(runtime, normalizedSrcProjectId, normalizedSrc)) { + const suffix = row.path === normalizedSrc ? "" : row.path.slice(normalizedSrc.length).replace(/^\/+/, ""); + const target = suffix ? `${normalizedDest.replace(/\/+$/, "")}/${suffix}` : normalizedDest; + const written = upsertProjectFile(runtime, normalizedTargetProjectId, target, Buffer.from(row.body_base64 || "", "base64"), row.content_type); + copied.push(written.path); + if (move && normalizedSrcProjectId === normalizedTargetProjectId) { + deleteProjectFileByPath(runtime, normalizedSrcProjectId, row.path); + } + } + runtime.store.persist(); + return Buffer.concat(copied.map((filePath) => protoString(1, filePath))); +} + +function editProjectFile(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const filePath = sanitizeProjectFilePath(decodeProtoStringField(requestBody, 2) || ""); + const replacements = decodeProtoMessageFields(requestBody, 3); + const entry = editProjectFileByMessages(runtime, projectId, filePath, replacements); + return Buffer.concat([protoString(1, entry.path), protoInt32(2, replacements.length), protoInt64(3, entry.version)]); +} + +function editProjectFileByMessages(runtime, projectId, filePath, replacements) { + const row = getProjectFileRow(runtime, projectId, filePath); + let text = row ? Buffer.from(row.body_base64 || "", "base64").toString("utf8") : ""; + let applied = 0; + for (const replacement of replacements) { + const oldString = decodeProtoStringField(replacement, 1) || ""; + const newString = decodeProtoStringField(replacement, 2) || ""; + if (oldString && text.includes(oldString)) { + text = text.replace(oldString, newString); + applied += 1; + } + } + const written = upsertProjectFile(runtime, projectId, filePath, Buffer.from(text, "utf8"), row?.content_type || guessContentType(filePath)); + runtime.store.persist(); + return { + ...fileEntryFromRow(written), + editsApplied: applied + }; +} + +function grepProjectFiles(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const pattern = decodeProtoStringField(requestBody, 2); + const directory = decodeProtoStringField(requestBody, 3) || ""; + if (!pattern) { + return Buffer.alloc(0); + } + let regex; + try { + regex = new RegExp(pattern, "i"); + } catch { + regex = new RegExp(escapeRegExp(pattern), "i"); + } + const matches = []; + for (const row of listProjectFileRows(runtime, projectId, directory)) { + const text = Buffer.from(row.body_base64 || "", "base64").toString("utf8"); + const lines = text.split(/\r?\n/); + for (let index = 0; index < lines.length; index += 1) { + if (regex.test(lines[index])) { + matches.push(protoMessage(1, encodeGrepMatch(row.path, index + 1, lines[index]))); + } + } + } + return Buffer.concat(matches); +} + +function encodeGrepMatch(path, line, text) { + return Buffer.concat([protoString(1, path), protoInt32(2, line), protoString(3, text)]); +} + +function createFileStream(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const streamId = randomUuid(); + const paths = decodeProtoStringFields(requestBody, 2); + runtime.store.database.run( + "INSERT OR REPLACE INTO claude_design_items (collection, uuid, created_at, updated_at, title, model, data_json, messages_json) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", + ["file_streams", streamId, new Date().toISOString(), new Date().toISOString(), streamId, runtime.me.defaultModelId, JSON.stringify({ projectId, paths }), "[]"] + ); + runtime.store.persist(); + return protoString(1, streamId); +} + +function writeFileStream(runtime, requestBody) { + const streamId = decodeProtoStringField(requestBody, 1); + const stream = getItem(runtime.store, "file_streams", runtime.me.organizationUuid, streamId, runtime.me); + const projectId = stream.projectId; + for (const op of decodeProtoMessageFields(requestBody, 2)) { + const path = sanitizeProjectFilePath(decodeProtoStringField(op, 1) || ""); + const operation = decodeProtoStringField(op, 2) || ""; + const delta = decodeProtoStringField(op, 3) || ""; + const reset = decodeProtoBoolField(op, 4); + if (!path || operation === "delete") { + if (operation === "delete") { + deleteProjectFileByPath(runtime, projectId, path); + } + continue; + } + const existing = reset ? "" : getProjectFileText(runtime, projectId, path); + upsertProjectFile(runtime, projectId, path, Buffer.from(`${existing}${delta}`, "utf8"), guessContentType(path)); + } + runtime.store.persist(); + return Buffer.alloc(0); +} + +function getProjectFileRow(runtime, projectId, filePath) { + const address = normalizeProjectFileAddress(runtime, projectId, filePath || ""); + const normalizedProjectId = address.projectId; + const normalizedPath = address.path; + if (!normalizedProjectId || !normalizedPath) { + return undefined; + } + return queryRows( + runtime.store.database, + "SELECT project_id, path, created_at, updated_at, content_type, body_base64, version FROM claude_design_files WHERE project_id = ? AND path = ? LIMIT 1", + [normalizedProjectId, normalizedPath] + )[0]; +} + +function getProjectFileText(runtime, projectId, filePath) { + const row = getProjectFileRow(runtime, projectId, filePath); + return row ? Buffer.from(row.body_base64 || "", "base64").toString("utf8") : ""; +} + +function upsertProjectFile(runtime, projectId, filePath, body, contentType) { + const address = normalizeProjectFileAddress(runtime, projectId, filePath || ""); + const normalizedProjectId = address.projectId; + const normalizedPath = address.path; + if (!normalizedProjectId || !normalizedPath) { + throw new Error("project_id and path are required to write a Claude Design file."); + } + const now = new Date().toISOString(); + const existing = getProjectFileRow(runtime, normalizedProjectId, normalizedPath); + const version = existing ? Number(existing.version || 0) + 1 : 1; + runtime.store.database.run( + "INSERT OR REPLACE INTO claude_design_files (project_id, path, created_at, updated_at, content_type, body_base64, version) VALUES (?, ?, ?, ?, ?, ?, ?)", + [ + normalizedProjectId, + normalizedPath, + existing?.created_at || now, + now, + contentType || guessContentType(normalizedPath), + Buffer.isBuffer(body) ? body.toString("base64") : Buffer.from(String(body || ""), "utf8").toString("base64"), + version + ] + ); + return getProjectFileRow(runtime, normalizedProjectId, normalizedPath); +} + +function deleteProjectFileByPath(runtime, projectId, filePath) { + const address = normalizeProjectFileAddress(runtime, projectId, filePath || ""); + const normalizedProjectId = address.projectId; + const normalizedPath = address.path; + if (!normalizedProjectId || !normalizedPath) { + return 0; + } + const existing = getProjectFileRow(runtime, normalizedProjectId, normalizedPath); + runtime.store.database.run("DELETE FROM claude_design_files WHERE project_id = ? AND path = ?", [normalizedProjectId, normalizedPath]); + return existing ? 1 : 0; +} + +function normalizeProjectFileAddress(runtime, projectId, filePath) { + let normalizedProjectId = stringValue(projectId); + let normalizedPath = sanitizeProjectFilePath(filePath || ""); + + if (normalizedProjectId) { + if (normalizedPath === normalizedProjectId) { + normalizedPath = ""; + } else if (normalizedPath.startsWith(`${normalizedProjectId}/`)) { + normalizedPath = sanitizeProjectFilePath(normalizedPath.slice(normalizedProjectId.length + 1)); + } + } + + if (!normalizedProjectId && normalizedPath) { + const split = splitProjectPrefixedFilePath(runtime, normalizedPath); + if (split) { + normalizedProjectId = split.projectId; + normalizedPath = split.path; + } + } + + return { + path: normalizedPath, + projectId: normalizedProjectId + }; +} + +function splitProjectPrefixedFilePath(runtime, filePath) { + const slashIndex = filePath.indexOf("/"); + if (slashIndex < 0 && getProjectRow(runtime, filePath)) { + return { path: "", projectId: filePath }; + } + if (slashIndex <= 0) { + return undefined; + } + const projectId = filePath.slice(0, slashIndex); + const path = sanitizeProjectFilePath(filePath.slice(slashIndex + 1)); + if (!projectId || !path || !getProjectRow(runtime, projectId)) { + return undefined; + } + return { path, projectId }; +} + +function sanitizeProjectFilePath(value) { + const normalized = String(value || "").replace(/\\/g, "/").replace(/^\/+/, ""); + const parts = []; + for (const part of normalized.split("/")) { + if (!part || part === ".") { + continue; + } + if (part === "..") { + continue; + } + parts.push(part); + } + return parts.join("/"); +} + +function listProjectAssets(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const assets = listItems(runtime.store, "assets", runtime.me.organizationUuid).filter((asset) => asset.project_id === projectId); + return Buffer.concat(assets.map((asset) => protoMessage(1, encodeProjectAsset(asset)))); +} + +function recordProjectAsset(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const name = decodeProtoStringField(requestBody, 2); + const filePath = decodeProtoStringField(requestBody, 3); + if (!projectId || !filePath) { + return; + } + const uuid = assetUuid(projectId, name, filePath); + const body = { + chat_id: decodeProtoStringField(requestBody, 6) || "", + name: name || filePath, + path: filePath, + project_id: projectId, + section: decodeProtoStringField(requestBody, 8) || "", + status: decodeProtoEnumField(requestBody, 7) || 0, + subtitle: decodeProtoStringField(requestBody, 4) || "", + uuid + }; + upsertGenericRecord(runtime.store, "assets", uuid, body.name, runtime.me.defaultModelId, body); +} + +function setProjectAssetStatus(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const name = decodeProtoStringField(requestBody, 2); + const filePath = decodeProtoStringField(requestBody, 3); + const status = decodeProtoEnumField(requestBody, 4) || 0; + const uuid = assetUuid(projectId, name, filePath); + const item = getItem(runtime.store, "assets", runtime.me.organizationUuid, uuid, runtime.me); + upsertGenericRecord(runtime.store, "assets", uuid, item.name || name || filePath || "asset", runtime.me.defaultModelId, { + ...item, + project_id: projectId, + status, + status_changed_at: new Date().toISOString() + }); +} + +function deleteProjectAsset(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1); + const name = decodeProtoStringField(requestBody, 2); + const filePath = decodeProtoStringField(requestBody, 3); + deleteItem(runtime.store, "assets", assetUuid(projectId, name, filePath)); +} + +function encodeProjectAsset(asset) { + return Buffer.concat([ + protoString(1, asset.name), + protoString(2, asset.path), + protoEnum(3, asset.status || 0), + protoString(4, asset.subtitle), + protoBool(6, asset.pinned === true), + protoString(7, asset.chat_id), + protoTimestamp(8, asset.created_at || asset.createdAt), + protoTimestamp(9, asset.status_changed_at), + protoString(11, asset.section) + ]); +} + +function assetUuid(projectId, name, filePath) { + return `${projectId || ""}:${name || ""}:${filePath || ""}`; +} + +function bundleProject(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1) || firstUuidLikeString(requestBody) || ""; + if (projectId) { + const project = getOmeletteProject(runtime, projectId); + const files = listProjectFileRows(runtime, projectId, "").map((row) => ({ + contentType: row.content_type, + path: row.path, + text: Buffer.from(row.body_base64 || "", "base64").toString("utf8"), + version: row.version + })); + upsertGenericRecord(runtime.store, "bundles", projectId, project.name || projectId, runtime.me.defaultModelId, { + files, + project, + project_id: projectId + }); + } + return Buffer.alloc(0); +} + +function uploadFile(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1) || firstUuidLikeString(requestBody) || ""; + const directFilePath = decodeProtoStringField(requestBody, 2); + const fileMessages = decodeProtoMessageFields(requestBody, 2); + if (!directFilePath && fileMessages.length > 0) { + return writeProjectFiles(runtime, requestBody); + } + + const strings = decodeAllProtoStrings(requestBody); + const filePath = sanitizeProjectFilePath( + directFilePath || + strings.find((item) => item.value && item.value !== projectId && !item.value.includes("{"))?.value || + `uploads/upload-${Date.now()}.txt` + ); + const mimeType = decodeProtoStringField(requestBody, 4) || guessContentType(filePath); + const data = decodeProtoBytesField(requestBody, 3) || Buffer.from(decodeProtoStringField(requestBody, 3) || "", "utf8"); + const row = upsertProjectFile(runtime, projectId, filePath, Buffer.from(data), mimeType); + runtime.store.persist(); + return protoMessage(1, encodeWrittenFile(fileEntryFromRow(row))); +} + +function setProjectThumbnail(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1) || firstUuidLikeString(requestBody) || ""; + const dataUrl = decodeProtoStringField(requestBody, 2) || decodeAllProtoStrings(requestBody).find((item) => item.value.startsWith("data:"))?.value || ""; + storeProjectThumbnail(runtime, projectId, dataUrl); +} + +function storeProjectThumbnail(runtime, projectId, dataUrl) { + if (!projectId || !dataUrl) { + return; + } + const decoded = decodeDataUrl(dataUrl); + if (!decoded) { + return; + } + upsertGenericRecord(runtime.store, THUMBNAIL_COLLECTION, projectId, projectId, runtime.me.defaultModelId, { + body_base64: decoded.body.toString("base64"), + content_type: decoded.contentType, + project_id: projectId + }); +} + +function readProjectThumbnail(runtime, projectId) { + if (!projectId) { + return undefined; + } + const row = queryRows( + runtime.store.database, + "SELECT data_json FROM claude_design_items WHERE collection = ? AND uuid = ? LIMIT 1", + [THUMBNAIL_COLLECTION, projectId] + )[0]; + const data = parseMaybeJson(row?.data_json, {}); + if (!data.body_base64) { + return undefined; + } + return { + body: Buffer.from(data.body_base64, "base64"), + contentType: data.content_type || "image/png" + }; +} + +function decodeDataUrl(dataUrl) { + const match = /^data:([^;,]+)?(;base64)?,(.*)$/s.exec(String(dataUrl || "")); + if (!match) { + return undefined; + } + const contentType = match[1] || "application/octet-stream"; + const body = match[2] ? Buffer.from(match[3], "base64") : Buffer.from(decodeURIComponent(match[3]), "utf8"); + return { body, contentType }; +} + +function createClaudeCodeSession(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1) || firstUuidLikeString(requestBody) || ""; + const sessionId = randomUuid(); + upsertGenericRecord(runtime.store, SESSION_COLLECTION, sessionId, "Claude Code Session", runtime.me.defaultModelId, { + project_id: projectId, + session_id: sessionId, + source: "claude-design-mock" + }); + if (projectId) { + saveProjectData(runtime, projectId, (data) => ({ + ...data, + has_claude_code_session: true + })); + } + return protoString(1, sessionId); +} + +function listChatsForExport(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1) || firstUuidLikeString(requestBody) || ""; + const chats = getProjectChats(runtime, projectId); + return Buffer.concat(chats.map((chat) => protoMessage(1, encodeExportChatSummary(chat)))); +} + +function exportChatMessages(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1) || firstUuidLikeString(requestBody) || ""; + const chatId = decodeProtoStringField(requestBody, 2) || decodeAllProtoStrings(requestBody).find((item) => item.value !== projectId)?.value || ""; + const chat = getProjectChats(runtime, projectId).find((item) => item.id === chatId) || { id: chatId, messages: [] }; + upsertGenericRecord(runtime.store, "chat_exports", randomUuid(), chat.id || "chat", runtime.me.defaultModelId, { + chat_id: chat.id, + exported_at: new Date().toISOString(), + messages: chat.messages || [], + project_id: projectId + }); + return Buffer.alloc(0); +} + +function getProjectChats(runtime, projectId) { + const data = parseMaybeJson(getProjectDataBytes(runtime, projectId).toString("utf8"), {}); + const openChats = Object.values(isRecord(data.chats) ? data.chats : {}); + const closedChats = Array.isArray(data.closedChats) ? data.closedChats : []; + return [...openChats, ...closedChats].filter(isRecord).map((chat) => ({ + closedAt: chat.closedAt || "", + id: stringValue(chat.id) || randomUuid(), + lastOpened: chat.lastOpened || "", + messageCount: Array.isArray(chat.messages) ? chat.messages.length : Number(chat.messageCount) || 0, + messages: Array.isArray(chat.messages) ? chat.messages : [], + name: stringValue(chat.name) || "Chat" + })); +} + +function encodeExportChatSummary(chat) { + return Buffer.concat([ + protoString(1, chat.id), + protoString(2, chat.name), + protoInt32(3, chat.messageCount || 0), + protoTimestamp(4, chat.lastOpened || chat.closedAt) + ]); +} + +function recordTrackEvent(runtime, requestBody) { + const strings = decodeAllProtoStrings(requestBody); + const eventName = decodeProtoStringField(requestBody, 1) || strings[0]?.value || "event"; + upsertGenericRecord(runtime.store, EVENT_COLLECTION, randomUuid(), eventName, runtime.me.defaultModelId, { + event_name: eventName, + fields: strings, + recorded_at: new Date().toISOString() + }); +} + +function createComment(runtime, requestBody) { + const comment = commentFromRequest(runtime, requestBody, {}, "create"); + upsertComment(runtime, comment); + return protoMessage(1, encodeComment(comment)); +} + +function updateComment(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1) || ""; + const commentId = decodeProtoStringField(requestBody, 2) || firstUuidLikeString(requestBody) || ""; + const existing = getComment(runtime, commentId); + const updated = commentFromRequest(runtime, requestBody, existing || { id: commentId, project_id: projectId }, "update"); + upsertComment(runtime, { ...existing, ...updated, id: commentId || updated.id }); + return protoMessage(1, encodeComment(getComment(runtime, commentId || updated.id) || updated)); +} + +function deleteComment(runtime, requestBody) { + const commentId = decodeProtoStringField(requestBody, 2) || firstUuidLikeString(requestBody) || ""; + if (commentId) { + deleteItem(runtime.store, COMMENT_COLLECTION, commentId); + } +} + +function listComments(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1) || firstUuidLikeString(requestBody) || ""; + const comments = listItems(runtime.store, COMMENT_COLLECTION, runtime.me.organizationUuid) + .filter((comment) => !projectId || comment.project_id === projectId) + .map(normalizeCommentRecord); + return Buffer.concat([ + ...comments.map((comment) => protoMessage(1, encodeComment(comment))), + getCommentsReadAt(runtime, projectId) ? protoTimestamp(2, getCommentsReadAt(runtime, projectId)) : Buffer.alloc(0) + ]); +} + +function markCommentsRead(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1) || firstUuidLikeString(requestBody) || ""; + const readAt = new Date().toISOString(); + if (projectId) { + upsertGenericRecord(runtime.store, "comment_state", projectId, projectId, runtime.me.defaultModelId, { + comments_read_at: readAt, + project_id: projectId + }); + } + return protoTimestamp(1, readAt); +} + +function getCommentsReadAt(runtime, projectId) { + if (!projectId) { + return ""; + } + const state = getExistingItem(runtime.store, "comment_state", runtime.me.organizationUuid, projectId); + return stringValue(state?.comments_read_at); +} + +function createCommentReply(runtime, requestBody) { + const commentId = decodeProtoStringField(requestBody, 2) || ""; + const comment = getComment(runtime, commentId) || { id: commentId || randomUuid(), replies: [] }; + const strings = decodeAllProtoStrings(requestBody).map((item) => item.value); + const text = decodeProtoStringField(requestBody, 3) || strings.find((value) => value !== comment.project_id && value !== commentId) || ""; + const reply = { + author_account_uuid: runtime.me.accountUuid, + author_display_name: runtime.me.displayName, + author_email: runtime.me.email, + author_name: runtime.me.displayName, + body: text, + comment_id: comment.id, + created_at: new Date().toISOString(), + id: randomUuid(), + text + }; + comment.replies = [...(Array.isArray(comment.replies) ? comment.replies : []), reply]; + upsertComment(runtime, comment); + return protoMessage(1, encodeCommentReply(reply)); +} + +function updateCommentReply(runtime, requestBody) { + const commentId = decodeProtoStringField(requestBody, 2) || ""; + const replyId = decodeProtoStringField(requestBody, 3) || ""; + const text = decodeProtoStringField(requestBody, 4) || ""; + const comment = getComment(runtime, commentId); + if (comment && Array.isArray(comment.replies)) { + comment.replies = comment.replies.map((reply) => reply.id === replyId ? { ...reply, body: text, text, updated_at: new Date().toISOString() } : reply); + upsertComment(runtime, comment); + const reply = comment.replies.find((item) => item.id === replyId); + return protoMessage(1, encodeCommentReply(reply || {})); + } + return Buffer.alloc(0); +} + +function deleteCommentReply(runtime, requestBody) { + const commentId = decodeProtoStringField(requestBody, 2) || ""; + const replyId = decodeProtoStringField(requestBody, 3) || ""; + const comment = getComment(runtime, commentId); + if (comment && Array.isArray(comment.replies)) { + comment.replies = comment.replies.filter((reply) => reply.id !== replyId); + upsertComment(runtime, comment); + } +} + +function sendCommentsToChat(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1) || firstUuidLikeString(requestBody) || ""; + const chatId = decodeProtoStringField(requestBody, 3) || randomUuid(); + const messageId = randomUuid(); + saveProjectData(runtime, projectId, (data) => { + const chats = isRecord(data.chats) ? { ...data.chats } : {}; + const chat = isRecord(chats[chatId]) ? { ...chats[chatId] } : { id: chatId, messages: [] }; + const messages = Array.isArray(chat.messages) ? [...chat.messages] : []; + messages.push({ + content: "Attached comments were sent to chat.", + id: messageId, + role: "user", + timestamp: new Date().toISOString() + }); + chats[chatId] = { ...chat, messages }; + return { ...data, chats }; + }); + const commentIds = decodeProtoStringFields(requestBody, 2); + return Buffer.concat((commentIds.length > 0 ? commentIds : [messageId]).map((commentId) => protoString(1, commentId))); +} + +function sendMultiplayerMessage(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1) || ""; + const chatId = decodeProtoStringField(requestBody, 2) || randomUuid(); + const embeddedRequest = extractGatewayMessagesRequestFromProto(requestBody); + const embeddedUserText = cleanVisibleUserText(textFromMessageContent(lastGatewayUserMessage(embeddedRequest)?.content)); + const content = decodeProtoStringField(requestBody, 3) || embeddedUserText || ""; + const role = decodeProtoStringField(requestBody, 4) || "user"; + const clientMessageId = decodeProtoStringField(requestBody, 7) || randomUuid(); + const epoch = Date.now(); + saveProjectData(runtime, projectId, (data) => { + const chats = isRecord(data.chats) ? { ...data.chats } : {}; + const chat = isRecord(chats[chatId]) ? { ...chats[chatId] } : { id: chatId, messages: [] }; + const messages = Array.isArray(chat.messages) ? [...chat.messages] : []; + if (content) { + messages.push({ + content, + id: clientMessageId, + role, + timestamp: new Date().toISOString() + }); + } + chats[chatId] = { ...chat, messages }; + return { ...data, chats }; + }); + return Buffer.concat([ + protoString(1, clientMessageId), + protoInt64(2, epoch), + protoString(4, "") + ]); +} + +function commentFromRequest(runtime, requestBody, fallback, mode) { + const strings = decodeAllProtoStrings(requestBody).map((item) => item.value); + const projectId = decodeProtoStringField(requestBody, 1) || fallback.project_id || firstUuidLikeString(requestBody) || ""; + const id = mode === "update" ? decodeProtoStringField(requestBody, 2) || fallback.id || fallback.commentId || randomUuid() : fallback.id || fallback.commentId || randomUuid(); + const bodyField = mode === "create" ? 2 : 3; + const filePathField = mode === "create" ? 3 : 0; + const selectorField = mode === "create" ? 4 : 0; + const descriptorField = mode === "create" ? 5 : 0; + const text = + decodeProtoStringField(requestBody, bodyField) || + strings.find((value) => value && value !== projectId && value !== id) || + fallback.text || + fallback.body || + ""; + const filePath = sanitizeProjectFilePath((filePathField ? decodeProtoStringField(requestBody, filePathField) : "") || fallback.path || fallback.filePath || ""); + const elementSelector = (selectorField ? decodeProtoStringField(requestBody, selectorField) : "") || fallback.element_selector || fallback.elementSelector || ""; + const elementDescriptor = (descriptorField ? decodeProtoStringField(requestBody, descriptorField) : "") || fallback.element_descriptor || fallback.elementDescriptor || ""; + const now = new Date().toISOString(); + return { + author_email: runtime.me.email, + author_account_uuid: runtime.me.accountUuid, + author_display_name: runtime.me.displayName, + author_name: runtime.me.displayName, + body: text, + created_at: fallback.created_at || now, + element_descriptor: elementDescriptor, + element_selector: elementSelector, + id, + path: filePath, + project_id: projectId, + replies: Array.isArray(fallback.replies) ? fallback.replies : [], + resolved: mode === "update" ? decodeProtoBoolField(requestBody, 4) || fallback.resolved === true : fallback.resolved === true, + text, + updated_at: now + }; +} + +function getComment(runtime, commentId) { + if (!commentId) { + return undefined; + } + const row = queryRows( + runtime.store.database, + "SELECT collection, uuid, created_at, updated_at, title, model, data_json, messages_json FROM claude_design_items WHERE collection = ? AND uuid = ? LIMIT 1", + [COMMENT_COLLECTION, commentId] + )[0]; + return row ? normalizeCommentRecord(itemFromRow(row, runtime.me.organizationUuid)) : undefined; +} + +function upsertComment(runtime, comment) { + const normalized = normalizeCommentRecord(comment); + upsertGenericRecord(runtime.store, COMMENT_COLLECTION, normalized.id, normalized.text || "Comment", runtime.me.defaultModelId, normalized); +} + +function normalizeCommentRecord(comment) { + const id = stringValue(comment.commentId) || stringValue(comment.id) || stringValue(comment.uuid) || randomUuid(); + const text = stringValue(comment.body) || stringValue(comment.text) || ""; + return { + ...comment, + author_account_uuid: stringValue(comment.author_account_uuid) || stringValue(comment.authorAccountUuid), + author_display_name: stringValue(comment.author_display_name) || stringValue(comment.authorDisplayName) || stringValue(comment.author_name), + body: text, + commentId: id, + element_descriptor: stringValue(comment.element_descriptor) || stringValue(comment.elementDescriptor), + element_selector: stringValue(comment.element_selector) || stringValue(comment.elementSelector), + filePath: stringValue(comment.filePath) || stringValue(comment.path), + id, + replies: Array.isArray(comment.replies) ? comment.replies : [] + }; +} + +function encodeComment(comment) { + const normalized = normalizeCommentRecord(comment); + return Buffer.concat([ + protoString(1, normalized.id), + protoString(2, normalized.project_id), + protoString(3, normalized.author_account_uuid), + protoString(4, normalized.author_display_name), + protoString(5, normalized.body), + protoString(9, "mock"), + ...normalized.replies.map((reply) => protoMessage(12, encodeCommentReply(reply))) + ]); +} + +function encodeCommentReply(reply) { + const normalized = { + ...reply, + author_account_uuid: stringValue(reply.author_account_uuid) || stringValue(reply.authorAccountUuid), + author_display_name: stringValue(reply.author_display_name) || stringValue(reply.authorDisplayName) || stringValue(reply.author_name), + body: stringValue(reply.body) || stringValue(reply.text), + comment_id: stringValue(reply.comment_id) || stringValue(reply.commentId), + id: stringValue(reply.replyId) || stringValue(reply.id) || randomUuid() + }; + return Buffer.concat([ + protoString(1, normalized.id), + protoString(2, normalized.comment_id), + protoString(3, normalized.author_account_uuid), + protoString(4, normalized.author_display_name), + protoString(5, normalized.body) + ]); +} + +function encodeToolCallResponse(rpcName, requestBody) { + const strings = decodeAllProtoStrings(requestBody); + const payload = { + mock: true, + method: rpcName, + request: strings + }; + return Buffer.concat([ + protoString(1, JSON.stringify(payload)), + protoBool(2, false) + ]); +} + +function encodeIntegrationAuthResponse(rpcName) { + if (!rpcName.endsWith("StartAuth")) { + return Buffer.alloc(0); + } + return Buffer.concat([ + protoString(1, `${rpcName}:mock`), + protoString(2, "mock-connected") + ]); +} + +function encodeIntegrationListResponse(rpcName, requestBody) { + return Buffer.alloc(0); +} + +function updateOrgSettings(runtime, requestBody) { + const defaultDesignSystemProjectUuid = decodeProtoStringField(requestBody, 1) || ""; + upsertGenericRecord(runtime.store, "org_settings", "default", "default", runtime.me.defaultModelId, { + default_design_system_project_uuid: defaultDesignSystemProjectUuid + }); +} + +function encodeGetOrgSettingsResponse(runtime) { + const settings = getItem(runtime.store, "org_settings", runtime.me.organizationUuid, "default", runtime.me); + return Buffer.concat([ + protoString(1, settings.default_design_system_project_uuid), + protoTimestamp(2, settings.updated_at) + ]); +} + +function encodeGetMeResponse(me) { + return Buffer.concat([ + protoString(1, me.accountUuid), + protoString(2, me.organizationUuid), + protoString(3, me.email), + protoString(4, me.displayName), + protoString(5, me.orgName), + protoString(6, me.growthbookPayload), + ...((me.modelPresets || []).map((preset) => protoMessage(8, encodeModelPreset(preset)))), + protoString(9, me.defaultModelId), + protoBool(10, me.overrideStickyModel), + protoBool(11, me.isPersonalOrg), + protoEnum(12, me.accessLevel === "ACCESS_LEVEL_VIEWER" ? 2 : 1), + protoBool(14, me.hasOauthTokens), + protoBool(15, Boolean(me.dsManageEnforced)), + protoBool(16, me.canManageDs), + ...((me.memberships || []).map((membership) => protoMessage(17, Buffer.concat([protoString(1, membership.uuid), protoString(2, membership.name)])))) + ]); +} + +function encodeModelPreset(preset) { + return Buffer.concat([ + protoString(1, preset.id), + protoString(2, preset.label), + protoInt32(3, preset.maxTokens || 0), + protoString(4, preset.description), + protoBool(5, preset.overflow === true), + protoBool(6, preset.supportsAdaptiveThinking === true) + ]); +} + +function encodeMintPreviewTokenResponse(runtime) { + return Buffer.concat([ + protoString(1, runtime.upstreamOrigin), + protoString(2, randomUuid()), + protoInt64(3, Math.floor(Date.now() / 1000) + 3600) + ]); +} + +function encodeTokenResponse() { + return Buffer.concat([protoString(1, randomUuid()), protoInt64(2, Math.floor(Date.now() / 1000) + 3600)]); +} + +function designSettingsPayload(runtime) { + const item = getExistingItem(runtime.store, "settings", runtime.me.organizationUuid, "default"); + const model = normalizeClaudeDesignSelectableModel(runtime, stringValue(item?.model) || stringValue(item?.selected_model)) || + runtime.me.defaultModelId; + return { + defaultModelId: model, + default_model_id: model, + model, + selectedModel: model, + selected_model: model + }; +} + +function persistDesignSelectedModel(runtime, modelValue) { + const model = normalizeClaudeDesignSelectableModel(runtime, modelValue) || runtime.me.defaultModelId; + runtime.me.defaultModelId = model; + upsertGenericRecord(runtime.store, "settings", "default", "Claude Design Settings", model, { + default_model_id: model, + defaultModelId: model, + model, + selected_model: model, + selectedModel: model + }); + return designSettingsPayload(runtime); +} + +function normalizeClaudeDesignSelectableModel(runtime, value) { + const normalized = normalizeRouteTarget(value); + if (!normalized) { + return undefined; + } + const presets = Array.isArray(runtime?.gatewayModelPresets) ? runtime.gatewayModelPresets : []; + const direct = findGatewayModelPresetId(presets, normalized); + if (direct) { + return direct; + } + const publicModel = publicGatewayModelSelector(normalized); + return findGatewayModelPresetId(presets, publicModel) || publicModel || normalized; +} + +function findGatewayModelPresetId(presets, model) { + const normalized = stringValue(model)?.toLowerCase(); + if (!normalized) { + return undefined; + } + const preset = presets.find((preset) => isRecord(preset) && stringValue(preset.id)?.toLowerCase() === normalized); + return stringValue(preset?.id); +} + +function upsertGenericRecord(store, collection, uuid, title, model, data) { + const now = new Date().toISOString(); + const existing = queryRows( + store.database, + "SELECT created_at FROM claude_design_items WHERE collection = ? AND uuid = ? LIMIT 1", + [collection, uuid] + )[0]; + store.database.run( + "INSERT OR REPLACE INTO claude_design_items (collection, uuid, created_at, updated_at, title, model, data_json, messages_json) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", + [collection, uuid, existing?.created_at || now, now, title || uuid, model || "", JSON.stringify(data || {}), "[]"] + ); + store.persist(); +} + +async function handleDesignRestApi(runtime, method, path, request, requestBody) { + const restPath = normalizeDesignRestPath(path); + + if (method === "POST" && restPath === "/v1/design/telemetry") { + return jsonResponse(200, { ok: true }); + } + + if (method === "GET" && (restPath === "/v1/design/settings" || restPath === "/v1/design/model-selection")) { + return jsonResponse(200, designSettingsPayload(runtime)); + } + + if (method === "POST" && (restPath === "/v1/design/settings" || restPath === "/v1/design/model-selection")) { + const payload = parseJsonBody(requestBody); + const settings = persistDesignSelectedModel(runtime, stringValue(payload.model) || stringValue(payload.defaultModelId)); + return jsonResponse(200, { + ok: true, + ...settings + }); + } + + if (method === "POST" && restPath === "/v1/design/turn-title") { + const payload = parseJsonBody(requestBody); + const message = stringValue(payload.message) || stringValue(payload.title) || stringValue(payload.prompt) || ""; + const title = titleFromTurnMessage(message); + return jsonResponse(200, { + kind: stringValue(payload.kind) || "chat", + ok: true, + title + }); + } + + if (method === "POST" && restPath === "/v1/design/artifact-proxy/v1/messages") { + return await proxyArtifactMessages(runtime, requestBody); + } + + const serveMatch = restPath.match(/^\/v1\/design\/projects\/([^/]+)\/serve\/(.+)$/); + if (method === "GET" && serveMatch) { + const projectId = decodeURIComponent(serveMatch[1]); + const filePath = sanitizeProjectFilePath(decodeURIComponent(serveMatch[2])); + const row = getProjectFileRow(runtime, projectId, filePath); + if (!row) { + return jsonResponse(404, { error: { message: `File not found: ${filePath}` } }); + } + return serveProjectFileResponse(runtime, projectId, row, filePath); + } + + const dataMatch = restPath.match(/^\/v1\/design\/projects\/([^/]+)\/data$/); + if (method === "PUT" && dataMatch) { + const projectId = decodeURIComponent(dataMatch[1]); + const payload = parseJsonBody(requestBody); + const base64 = stringValue(payload.data); + if (base64) { + saveProjectData(runtime, projectId, (data) => ({ + ...data, + project_data_base64: base64 + })); + } + return jsonResponse(200, { ok: true, project_id: projectId }); + } + + const thumbnailPutMatch = restPath.match(/^\/v1\/design\/projects\/([^/]+)\/thumbnail$/); + if (method === "PUT" && thumbnailPutMatch) { + const projectId = decodeURIComponent(thumbnailPutMatch[1]); + const payload = parseJsonBody(requestBody); + storeProjectThumbnail(runtime, projectId, stringValue(payload.thumbnail_data_url) || stringValue(payload.thumbnailDataUrl) || ""); + return jsonResponse(200, { ok: true, project_id: projectId }); + } + + const thumbnailGetMatch = restPath.match(/^\/v1\/design\/projects\/([^/]+)\/thumbnail(?:\/[^/]+)?$/); + if (method === "GET" && thumbnailGetMatch) { + const projectId = decodeURIComponent(thumbnailGetMatch[1]); + const thumbnail = readProjectThumbnail(runtime, projectId); + if (thumbnail) { + return binaryResponse(200, thumbnail.body, { + "cache-control": "no-store", + "content-type": thumbnail.contentType + }); + } + return textResponse(200, TRANSPARENT_SVG, { + "cache-control": "no-store", + "content-type": "image/svg+xml" + }); + } + + const downloadMatch = restPath.match(/^\/v1\/design\/projects\/([^/]+)\/download$/); + if (method === "GET" && downloadMatch) { + const projectId = decodeURIComponent(downloadMatch[1]); + const manifest = listProjectFileRows(runtime, projectId, "").map((row) => ({ + content_type: row.content_type, + path: row.path, + size: Buffer.from(row.body_base64 || "", "base64").length, + version: row.version + })); + return textResponse(200, JSON.stringify({ files: manifest, project_id: projectId }, null, 2), { + "content-disposition": `attachment; filename="${projectId}.json"`, + "content-type": "application/json; charset=utf-8" + }); + } + + if (method === "POST" && restPath === "/v1/design/drop-suggestions") { + return jsonResponse(200, { suggestions: [] }); + } + + return jsonResponse(404, { + error: { + message: `Claude Design REST mock has no route for ${method} ${path}` + } + }); +} + +async function proxyArtifactMessages(runtime, requestBody) { + const payload = parseJsonBody(requestBody); + const gatewayBody = normalizeGatewayMessagesRequest(runtime, payload); + const routingDecision = applyClaudeDesignRouting(runtime, gatewayBody); + const sessionContext = claudeDesignSessionContext({ + chatId: readClaudeDesignChatId(payload), + projectId: readClaudeDesignProjectId(payload) + }); + let response; + try { + response = await fetchGateway(runtime, "/v1/messages", gatewayBody, routingDecision, sessionContext); + } catch (error) { + return textResponse(200, artifactProxySseError(error instanceof Error ? error.message : String(error)), { + "cache-control": "no-store", + "content-type": "text/event-stream; charset=utf-8" + }); + } + const bodyText = await response.text(); + if ( + headerIncludes(response.headers.get("content-type"), "text/event-stream") || + bodyText.startsWith("data: ") || + bodyText.includes("\ndata: ") || + bodyText.includes("\r\ndata: ") + ) { + return textResponse(response.status, bodyText, { + "cache-control": "no-store", + "content-type": response.headers.get("content-type") || "text/event-stream; charset=utf-8" + }); + } + + const body = parseMaybeJson(bodyText, {}); + if (!response.ok) { + const message = body?.error?.message || bodyText || `Gateway request failed with HTTP ${response.status}`; + return textResponse(200, artifactProxySseError(message), { + "cache-control": "no-store", + "content-type": "text/event-stream; charset=utf-8" + }); + } + + return textResponse(200, artifactProxySseText(extractGatewayAssistantText(body)), { + "cache-control": "no-store", + "content-type": "text/event-stream; charset=utf-8" + }); +} + +function artifactProxySseText(text) { + const value = stringValue(text); + const events = []; + if (value) { + events.push({ + delta: { + text: value, + type: "text_delta" + }, + type: "content_block_delta" + }); + } + return `${events.map((event) => `data: ${JSON.stringify(event)}\n\n`).join("")}data: [DONE]\n\n`; +} + +function artifactProxySseError(message) { + return `data: ${JSON.stringify({ error: { message: message || "Unknown gateway error." }, type: "error" })}\n\ndata: [DONE]\n\n`; +} + +function normalizeDesignRestPath(path) { + if (path.startsWith("/design/v1/design/")) { + return path.slice("/design".length); + } + return path; +} + +function serveProjectFileResponse(runtime, projectId, row, filePath) { + const body = Buffer.from(row.body_base64 || "", "base64"); + const contentType = row.content_type || guessContentType(filePath); + if (isHtmlProjectFile(filePath, contentType)) { + const html = body.toString("utf8"); + const normalizedHtml = normalizeBabelJsxScriptTags(html); + const inlinedHtml = inlineLocalBabelJsxScriptTags(runtime, projectId, filePath, normalizedHtml); + return textResponse(200, injectOmelettePreviewEvalBridge(inlinedHtml), { + "cache-control": "no-store", + "content-type": "text/html; charset=utf-8" + }); + } + return binaryResponse(200, body, { + "cache-control": "no-store", + "content-type": contentType + }); +} + +function isHtmlProjectFile(filePath, contentType) { + return /\.html?$/i.test(filePath) || headerIncludes(contentType, "text/html"); +} + +function injectOmelettePreviewEvalBridge(html) { + const source = String(html || ""); + if (source.includes("__om_eval") || source.includes("__omEvalBridgeInstalled")) { + return source; + } + const scriptTag = ``; + if (/]*>/i.test(source)) { + return source.replace(/]*)>/i, (tag) => `${tag}\n${scriptTag}`); + } + if (/]*>/i.test(source)) { + return source.replace(/]*)>/i, (tag) => `${tag}\n${scriptTag}`); + } + return `${scriptTag}\n${source}`; +} + +function normalizeBabelJsxScriptTags(html) { + if (!/(?:@babel\/standalone|babel\.min\.js|type=["']text\/babel["'])/i.test(html)) { + return html; + } + return String(html).replace(/]*)>/gi, (tag, attrs) => { + if (/\btype\s*=/.test(attrs)) { + return tag; + } + const srcMatch = /\bsrc\s*=\s*(["'])([^"']+)\1/i.exec(attrs); + if (!srcMatch || !/\.jsx(?:[?#].*)?$/i.test(srcMatch[2])) { + return tag; + } + return ``; + }); +} + +function resolveLocalProjectScriptPath(filePath, src) { + const rawSrc = String(src || "").trim(); + if (!rawSrc || rawSrc.startsWith("/") || rawSrc.startsWith("//") || /^[a-z][a-z0-9+.-]*:/i.test(rawSrc)) { + return ""; + } + const pathOnly = rawSrc.split("#", 1)[0].split("?", 1)[0]; + let decodedPath = pathOnly; + try { + decodedPath = decodeURIComponent(pathOnly); + } catch { + decodedPath = pathOnly; + } + const baseDir = pathModule.posix.dirname(sanitizeProjectFilePath(filePath)); + return sanitizeProjectFilePath(pathModule.posix.join(baseDir === "." ? "" : baseDir, decodedPath)); +} + +function escapeInlineScriptBody(body) { + return String(body || "").replace(/<\/script/gi, "<\\/script"); +} + +function titleFromTurnMessage(message) { + const text = String(message || "") + .replace(/\s+/g, " ") + .trim(); + if (!text) { + return "New turn"; + } + if (/questions timed out/i.test(text)) { + return "Continue with defaults"; + } + return text.length > 60 ? `${text.slice(0, 57).trim()}...` : text; +} + +async function countGatewayTokens(runtime, requestBody) { + const messagesRequest = decodeProtoBytesField(requestBody, 1) || Buffer.alloc(0); + const body = parseGatewayMessagesRequestBuffer(messagesRequest) || + extractGatewayMessagesRequestFromProto(requestBody) || + {}; + const normalized = normalizeGatewayMessagesRequest(runtime, body); + const routingDecision = applyClaudeDesignRouting(runtime, normalized); + try { + const response = await fetchGateway(runtime, "/v1/messages/count_tokens", normalized, routingDecision); + if (response.ok) { + const payload = await response.json(); + return protoInt32(1, Number(payload.input_tokens) || estimateTokenCount(normalized)); + } + } catch { + // Fall through to local estimate. + } + return protoInt32(1, estimateTokenCount(normalized)); +} + +async function chatWithGateway(runtime, requestBody) { + const projectId = decodeProtoStringField(requestBody, 1) || ""; + const chatId = decodeProtoStringField(requestBody, 3) || (projectId ? defaultProjectChatId(projectId) : randomUuid()); + const request = { + assistantMessageId: decodeProtoStringField(requestBody, 4) || randomUuid(), + chatId, + messagesRequest: decodeProtoBytesField(requestBody, 2) || Buffer.alloc(0), + projectId + }; + const originalBody = parseGatewayMessagesRequestBuffer(request.messagesRequest) || + extractGatewayMessagesRequestFromProto(requestBody) || + gatewayMessagesRequestFromProjectChat(runtime, request) || + {}; + if (!hasGatewayMessagesInput(originalBody)) { + return connectStreamResponse([ + encodeChatResponseMessageStart(request.assistantMessageId), + encodeChatResponseError("Claude Design chat request did not include a messages payload.") + ]); + } + const gatewayBody = normalizeGatewayMessagesRequest(runtime, { + ...originalBody, + stream: false + }); + const routingDecision = applyClaudeDesignRouting(runtime, gatewayBody); + const sessionContext = claudeDesignSessionContext(request); + + let assistantText = ""; + let toolCalls = []; + let stopReason = "end_turn"; + let messageId = request.assistantMessageId; + let model = gatewayBody.model || runtime.me.defaultModelId; + const events = [encodeChatResponseMessageStart(messageId), encodeChatResponseRaw("message_start", { message: { content: [], id: messageId, model, role: "assistant" } })]; + + try { + const response = await fetchGateway(runtime, "/v1/messages", gatewayBody, routingDecision, sessionContext); + const payloadText = await response.text(); + const payload = parseMaybeJson(payloadText, {}); + if (!response.ok) { + const message = payload?.error?.message || payloadText || `Gateway request failed with HTTP ${response.status}`; + events.push(encodeChatResponseError(message)); + return connectStreamResponse(events); + } + assistantText = extractGatewayAssistantText(payload); + toolCalls = extractGatewayToolCalls(payload); + const gatewayStopReason = extractGatewayStopReason(payload, stopReason); + if (runtime.autoAnswerQuestions) { + const absorbed = absorbQuestionToolCalls(assistantText, toolCalls); + assistantText = absorbed.assistantText; + toolCalls = absorbed.toolCalls; + } + stopReason = toolCalls.length > 0 ? "tool_use" : gatewayStopReason === "tool_use" ? "end_turn" : gatewayStopReason; + messageId = stringValue(payload.id) || messageId; + model = publicGatewayModelSelector(routingDecision.routedModel || gatewayBody.model || model) || model; + } catch (error) { + events.push(encodeChatResponseError(error instanceof Error ? error.message : String(error))); + return connectStreamResponse(events); + } + + if (!assistantText && toolCalls.length === 0) { + assistantText = "Claude Design gateway returned an empty response."; + } + if (assistantText) { + events.push(encodeChatResponseTextDelta(assistantText)); + events.push(encodeChatResponseRaw("text_block", { index: 0, text: assistantText })); + } + const firstToolIndex = assistantText ? 1 : 0; + toolCalls.forEach((toolCall, index) => { + const blockIndex = firstToolIndex + index; + events.push( + encodeChatResponseRaw("tool_delta", { + id: toolCall.id, + index: blockIndex, + partial_json: JSON.stringify(toolCall.input || {}), + tool: toolCall.name + }) + ); + events.push( + encodeChatResponseRaw("tool_block_complete", { + id: toolCall.id, + index: blockIndex, + input: toolCall.input || {}, + name: toolCall.name + }) + ); + }); + const messageContent = gatewayMessageContent(assistantText, toolCalls); + events.push( + encodeChatResponseRaw("done", { + message: { + content: messageContent, + id: messageId, + model, + role: "assistant", + stop_reason: stopReason + } + }) + ); + events.push(encodeChatResponseMessageStop(stopReason)); + appendChatExchange(runtime, request, gatewayBody, assistantText, messageId, gatewayContentBlocks(assistantText, toolCalls)); + return connectStreamResponse(events); +} + +function parseGatewayMessagesRequestBuffer(buffer) { + if (!Buffer.isBuffer(buffer) || buffer.length === 0) { + return undefined; + } + const text = buffer.toString("utf8").trim(); + if (!text || !text.startsWith("{")) { + return undefined; + } + const body = parseMaybeJson(text, undefined); + return hasGatewayMessagesInput(body) ? body : undefined; +} + +function extractGatewayMessagesRequestFromProto(buffer, depth = 0, seen = new Set()) { + if (!Buffer.isBuffer(buffer) || buffer.length === 0 || depth > 6 || seen.has(buffer)) { + return undefined; + } + seen.add(buffer); + + const direct = parseGatewayMessagesRequestBuffer(buffer); + if (direct) { + return direct; + } + + let found; + forEachProtoField(buffer, (field) => { + if (found || field.wireType !== 2 || !Buffer.isBuffer(field.value) || field.value.length === 0) { + return; + } + const directValue = parseGatewayMessagesRequestBuffer(field.value); + if (directValue) { + found = directValue; + return; + } + const textValue = field.value.toString("utf8"); + const embeddedValue = extractGatewayMessagesRequestFromText(textValue); + if (embeddedValue) { + found = embeddedValue; + return; + } + if (field.value.length <= 512 * 1024) { + found = extractGatewayMessagesRequestFromProto(field.value, depth + 1, seen); + } + }); + return found; +} + +function extractGatewayMessagesRequestFromText(text) { + if (typeof text !== "string" || !text.includes("messages")) { + return undefined; + } + const start = text.indexOf("{"); + const end = text.lastIndexOf("}"); + if (start < 0 || end <= start) { + return undefined; + } + const body = parseMaybeJson(text.slice(start, end + 1), undefined); + return hasGatewayMessagesInput(body) ? body : undefined; +} + +function hasGatewayMessagesInput(body) { + if (!isRecord(body)) { + return false; + } + if (stringValue(body.message) || stringValue(body.prompt)) { + return true; + } + if (!Array.isArray(body.messages) || body.messages.length === 0) { + return false; + } + return body.messages.some((message) => { + if (!isRecord(message)) { + return false; + } + return Boolean(stringValue(message.content) || storedProjectMessageText(message) || + (Array.isArray(message.content) && message.content.some((block) => + typeof block === "string" || + (isRecord(block) && (stringValue(block.text) || stringValue(block.content) || stringValue(block.output_text))) + ))); + }); +} + +function gatewayMessagesRequestFromProjectChat(runtime, request) { + const row = getProjectRow(runtime, request.projectId); + if (!row) { + return undefined; + } + const data = normalizedProjectDataFromRow(runtime, row); + const chatId = request.chatId || stringValue(data.viewState?.activeChatId) || defaultProjectChatId(row.uuid); + const chat = isRecord(data.chats) ? data.chats[chatId] : undefined; + const messages = Array.isArray(chat?.messages) ? chat.messages : []; + const gatewayMessages = messages + .map(gatewayMessageFromStoredProjectMessage) + .filter(Boolean); + return gatewayMessages.length > 0 ? { messages: gatewayMessages, model: runtime.me.defaultModelId } : undefined; +} + +function normalizedProjectDataFromRow(runtime, row) { + const record = parseMaybeJson(row?.data_json, {}); + const base64 = stringValue(record.project_data_base64); + const decoded = base64 ? parseMaybeJson(Buffer.from(base64, "base64").toString("utf8"), record) : record; + return normalizeProjectStoreData(runtime, row, decoded); +} + +function gatewayMessageFromStoredProjectMessage(message) { + if (!isRecord(message)) { + return undefined; + } + const role = stringValue(message.role); + if (role !== "user" && role !== "assistant") { + return undefined; + } + const content = cleanVisibleUserText(storedProjectMessageText(message)); + if (!content) { + return undefined; + } + return { + content, + role + }; +} + +function storedProjectMessageText(message) { + const parts = []; + const content = stringValue(message.content); + if (content) { + parts.push(content); + } + const blocks = Array.isArray(message.contentBlocks) + ? message.contentBlocks + : Array.isArray(message.content_blocks) + ? message.content_blocks + : undefined; + const blockText = textFromMessageContent(blocks); + if (blockText) { + parts.push(blockText); + } + if (Array.isArray(message.attachments)) { + for (const attachment of message.attachments) { + if (!isRecord(attachment)) { + continue; + } + const attachmentContent = stringValue(attachment.content) || stringValue(attachment.text); + if (!attachmentContent) { + continue; + } + const attachmentName = stringValue(attachment.name); + parts.push(attachmentName ? `${attachmentName}\n${attachmentContent}` : attachmentContent); + } + } + return parts.join("\n\n"); +} + +function normalizeGatewayMessagesRequest(runtime, body) { + const record = isRecord(body) ? body : {}; + const text = stringValue(record.message) || stringValue(record.prompt) || ""; + const normalizedMessages = Array.isArray(record.messages) ? normalizeGatewayMessagesForRequest(record.messages) : []; + const messages = normalizedMessages.length > 0 + ? normalizedMessages + : text + ? [{ content: text, role: "user" }] + : [{ content: "Continue.", role: "user" }]; + const maxTokens = Math.max(128, Number(record.max_tokens || record.maxTokens) || 4096); + return { + ...record, + max_tokens: maxTokens, + messages, + model: publicGatewayModelSelector(stringValue(record.model) || runtime.me.defaultModelId) || runtime.me.defaultModelId, + stream: false + }; +} + +function normalizeGatewayMessagesForRequest(messages) { + return messages + .map((message) => { + if (!isRecord(message)) { + return undefined; + } + const role = stringValue(message.role) || "user"; + if (role !== "system" && role !== "user" && role !== "assistant") { + return undefined; + } + if (stringValue(message.content) || Array.isArray(message.content)) { + return { + ...message, + role + }; + } + const content = cleanVisibleUserText(storedProjectMessageText(message)); + return content ? { content, role } : undefined; + }) + .filter(Boolean); +} + +function applyClaudeDesignRouting(runtime, body) { + const requestedModel = stringValue(body?.model) || runtime.me.defaultModelId; + const routing = runtime.routing; + if (!routing || routing.enabled === false) { + return { requestedModel }; + } + + const route = resolveClaudeDesignRoute(routing, body, requestedModel, runtime.defaultGatewayModel, runtime.gatewayModelPresets); + if (!route?.target) { + return { requestedModel }; + } + + const target = usableClaudeDesignRouteTarget(runtime, route.target); + if (!target) { + return { requestedModel }; + } + + body.model = target; + return { + requestedModel, + reason: target === route.target ? route.reason : `${route.reason}:fallback`, + routedModel: target + }; +} + +function resolveClaudeDesignRoute(routing, body, requestedModel, defaultGatewayModel, gatewayModelPresets) { + for (const rule of routing.rules || []) { + if (rule.enabled === false || !rule.target) { + continue; + } + if (matchesClaudeDesignRouteRule(rule, body, requestedModel)) { + return { + reason: rule.id ? `plugin-rule:${rule.id}` : `plugin-rule:${rule.type}`, + target: rule.target + }; + } + } + + const aliasedModel = claudeDesignModelAliasTarget(requestedModel, defaultGatewayModel); + if (aliasedModel) { + return { + reason: "plugin-model-alias", + target: aliasedModel + }; + } + + if (routing.defaultTarget && !isKnownClaudeDesignGatewayModel(gatewayModelPresets, requestedModel)) { + return { + reason: "plugin-default", + target: routing.defaultTarget + }; + } + + return undefined; +} + +function claudeDesignModelAliasTarget(requestedModel, defaultGatewayModel) { + const normalizedModel = stringValue(requestedModel); + if (!normalizedModel) { + return undefined; + } + const target = CLAUDE_DESIGN_MODEL_ALIASES.get(normalizedModel); + if (!target) { + return undefined; + } + return normalizeRouteTarget(defaultGatewayModel) || target; +} + +function isKnownClaudeDesignGatewayModel(gatewayModelPresets, requestedModel) { + const publicModel = publicGatewayModelSelector(requestedModel); + if (!publicModel || !Array.isArray(gatewayModelPresets)) { + return false; + } + return gatewayModelPresets.some((preset) => isRecord(preset) && stringValue(preset.id)?.toLowerCase() === publicModel.toLowerCase()); +} + +function usableClaudeDesignRouteTarget(runtime, target) { + const normalized = normalizeRouteTarget(target); + if (!normalized) { + return undefined; + } + if (routeTargetProviderAvailable(runtime.availableProviderNames, normalized)) { + return normalized; + } + + const fallback = usableClaudeDesignFallbackTarget(runtime); + warnUnavailableClaudeDesignRouteTarget(runtime, normalized, fallback); + return fallback; +} + +function usableClaudeDesignFallbackTarget(runtime) { + const configured = normalizeRouteTarget(runtime?.defaultGatewayModel); + if (configured && routeTargetProviderAvailable(runtime?.availableProviderNames, configured)) { + return configured; + } + return DEFAULT_GATEWAY_MODEL; +} + +function routeTargetProviderAvailable(availableProviderNames, target) { + if (!(availableProviderNames instanceof Set) || availableProviderNames.size === 0) { + return true; + } + const provider = routeTargetProviderName(target); + return !provider || availableProviderNames.has(provider.toLowerCase()); +} + +function routeTargetProviderName(target) { + const normalized = normalizeRouteTarget(target); + if (!normalized) { + return undefined; + } + const separator = normalized.indexOf("/"); + if (separator <= 0 || separator >= normalized.length - 1) { + return undefined; + } + return normalized.slice(0, separator).trim(); +} + +function warnUnavailableClaudeDesignRouteTarget(runtime, target, fallback) { + const key = `${target}\n${fallback}`; + if (runtime?.unavailableRouteTargetWarnings?.has(key)) { + return; + } + runtime?.unavailableRouteTargetWarnings?.add(key); + runtime?.logger?.warn?.( + `Claude Design routing target "${target}" references a provider that is not configured in CCR; using "${fallback}" instead.` + ); +} + +function matchesClaudeDesignRouteRule(rule, body, requestedModel) { + switch (rule.type) { + case "always": + return true; + case "image": + return hasImageContent(body?.messages); + case "long-context": + return estimateTokenCount(body) > (rule.threshold || 200000); + case "model": + return Boolean(rule.model && requestedModel === rule.model); + case "model-prefix": + return Boolean(rule.pattern && requestedModel?.startsWith(rule.pattern)); + case "thinking": + return Boolean(body?.thinking); + case "web-search": + return hasWebSearchTool(body?.tools); + default: + return false; + } +} + +function normalizeClaudeDesignRouting(value, options = {}) { + const fallbackTarget = normalizeRouteTarget(composeRouteTarget(options.targetProvider, options.targetModel) || stringValue(options.targetModel)); + const record = isRecord(value) ? value : {}; + const rules = []; + + if (isRecord(record.modelMap)) { + for (const [model, target] of Object.entries(record.modelMap)) { + const normalizedTarget = normalizeRouteTarget(stringValue(target)); + const normalizedModel = stringValue(model); + if (!normalizedModel || !normalizedTarget) { + continue; + } + rules.push({ + enabled: true, + id: `model-${sanitizeRouteId(normalizedModel)}`, + model: normalizedModel, + name: normalizedModel, + target: normalizedTarget, + type: "model" + }); + } + } + + if (Array.isArray(record.rules)) { + record.rules.forEach((rule, index) => { + const normalized = normalizeClaudeDesignRoutingRule(rule, index); + if (normalized) { + rules.push(normalized); + } + }); + } + + return { + defaultTarget: normalizeRouteTarget(stringValue(record.default) || stringValue(record.defaultTarget)) || fallbackTarget, + enabled: value === false ? false : record.enabled !== false, + rules + }; +} + +function normalizeClaudeDesignRoutingRule(value, index) { + if (!isRecord(value)) { + return undefined; + } + + const type = stringValue(value.type) || "model"; + if (!CLAUDE_DESIGN_ROUTE_TYPES.has(type)) { + return undefined; + } + + const target = normalizeRouteTarget( + stringValue(value.target) || + composeRouteTarget(value.targetProvider, value.targetModel) || + stringValue(value.targetModel) + ); + if (!target) { + return undefined; + } + + const model = stringValue(value.model) || stringValue(value.sourceModel); + const pattern = stringValue(value.pattern) || (type === "model-prefix" ? model : undefined); + const threshold = positiveNumber(value.threshold) || positiveNumber(value.tokenThreshold); + const id = stringValue(value.id) || `${type}-${index + 1}`; + return { + enabled: value.enabled !== false, + id, + name: stringValue(value.name) || id, + ...(model ? { model } : {}), + ...(pattern ? { pattern } : {}), + target, + ...(threshold ? { threshold } : {}), + type + }; +} + +function normalizeRouteTarget(value) { + const raw = stringValue(value); + if (!raw) { + return undefined; + } + + const commaIndex = raw.indexOf(","); + if (commaIndex > 0 && commaIndex < raw.length - 1) { + const provider = raw.slice(0, commaIndex).trim(); + const model = raw.slice(commaIndex + 1).trim(); + return provider && model ? `${provider}/${model}` : undefined; + } + + return raw; +} + +function composeRouteTarget(providerValue, modelValue) { + const provider = stringValue(providerValue); + const model = stringValue(modelValue); + if (provider && model) { + return `${provider}/${model}`; + } + return model || provider; +} + +function claudeDesignProviderSelectorNames(config) { + const names = new Set(); + const providers = claudeDesignProviderConfigs(config); + for (const provider of providers) { + if (!isRecord(provider)) { + continue; + } + const name = stringValue(provider.name); + if (!name) { + continue; + } + addProviderSelectorName(names, name); + addProviderSelectorName(names, provider.provider); + + const capabilities = Array.isArray(provider.capabilities) ? provider.capabilities : []; + for (const capability of capabilities) { + if (!isRecord(capability)) { + continue; + } + const protocol = normalizeGatewayProviderProtocol(capability.type || capability.protocol); + if (protocol && stringValue(capability.baseUrl || capability.base_url)) { + addProviderSelectorName(names, `${name}::${protocol}`); + } + } + + const credentialProtocols = claudeDesignProviderProtocols(provider); + providerCredentials(provider).forEach((credential, index) => { + if (!providerCredentialApiKey(credential)) { + return; + } + const credentialSlug = providerCredentialSlug(providerCredentialRuntimeId(credential, index)); + for (const protocol of credentialProtocols) { + addProviderSelectorName(names, `${name}::${protocol}::cred:${credentialSlug}`); + } + }); + } + return names; +} + +function defaultClaudeDesignGatewayConfigPath() { + const home = stringValue(process.env.HOME) || stringValue(process.env.USERPROFILE); + return home ? pathModule.join(home, ".claude-code-router", "gateway.config.json") : undefined; +} + +function loadClaudeDesignGatewayConfig(file, logger) { + const configFile = stringValue(file); + if (!configFile || !fs.existsSync(configFile)) { + return {}; + } + try { + return parseMaybeJson(fs.readFileSync(configFile, "utf8"), {}); + } catch (error) { + logger?.warn?.(`Claude Design could not read gateway config ${configFile}: ${error?.message || error}`); + return {}; + } +} + +function claudeDesignModelSourceConfig(config, gatewayConfig) { + return { + ...(isRecord(config) ? config : {}), + Providers: uniqueProviderRecords([ + ...claudeDesignProviderConfigs(config), + ...claudeDesignProviderConfigs(gatewayConfig) + ]), + virtualModelProfiles: uniqueVirtualModelProfiles([ + ...claudeDesignVirtualModelProfilesForConfig(config), + ...claudeDesignVirtualModelProfilesForConfig(gatewayConfig) + ]) + }; +} + +function claudeDesignProviderConfigs(config) { + if (!isRecord(config)) { + return []; + } + return [ + ...(Array.isArray(config.Providers) ? config.Providers : []), + ...(Array.isArray(config.providers) ? config.providers : []) + ].filter(isRecord); +} + +function claudeDesignVirtualModelProfilesForConfig(config) { + if (!isRecord(config)) { + return []; + } + return [ + ...(Array.isArray(config.virtualModelProfiles) ? config.virtualModelProfiles : []), + ...(Array.isArray(config.virtual_model_profiles) ? config.virtual_model_profiles : []) + ].filter(isRecord); +} + +function uniqueProviderRecords(providers) { + const seen = new Set(); + const result = []; + for (const provider of providers) { + const name = stringValue(provider.name); + const key = `${name}\n${JSON.stringify(Array.isArray(provider.models) ? provider.models : [])}`; + if (!name || seen.has(key)) { + continue; + } + seen.add(key); + result.push(provider); + } + return result; +} + +function uniqueVirtualModelProfiles(profiles) { + const seen = new Set(); + const result = []; + for (const profile of profiles) { + const key = stringValue(profile.id) || stringValue(profile.name) || JSON.stringify(profile.match || profile); + if (!key || seen.has(key)) { + continue; + } + seen.add(key); + result.push(profile); + } + return result; +} + +function claudeDesignGatewayModelPresets(config, defaultGatewayModel) { + const defaultModel = publicGatewayModelSelector(defaultGatewayModel) || DEFAULT_GATEWAY_MODEL; + const selectors = uniqueCaseInsensitiveStrings([ + defaultModel, + ...claudeDesignProviderModelSelectors(config), + ...claudeDesignVirtualModelSelectors(config), + ...DEFAULT_ME.modelPresets.map((preset) => preset.id) + ]); + return selectors.map((selector, index) => claudeDesignGatewayModelPreset(selector, index === 0)); +} + +function claudeDesignProviderModelSelectors(config) { + const providers = claudeDesignProviderConfigs(config); + const selectors = []; + for (const provider of providers) { + if (!Array.isArray(provider.models)) { + continue; + } + const providerSelectors = claudeDesignProviderModelProviderSelectors(provider); + for (const model of provider.models) { + const modelName = stringValue(model); + if (!modelName) { + continue; + } + for (const providerSelector of providerSelectors) { + selectors.push(normalizeRouteTarget(`${providerSelector}/${modelName}`)); + } + } + } + return selectors.filter(Boolean); +} + +function claudeDesignProviderModelProviderSelectors(provider) { + const selectors = []; + addProviderModelSelector(selectors, publicGatewayProviderName(provider.name)); + addProviderModelSelector(selectors, provider.name); + addProviderModelSelector(selectors, provider.provider); + + const name = stringValue(provider.name); + const publicName = publicGatewayProviderName(name); + const capabilities = Array.isArray(provider.capabilities) ? provider.capabilities : []; + for (const capability of capabilities) { + const protocol = isRecord(capability) ? normalizeGatewayProviderProtocol(capability.type || capability.protocol) : undefined; + if (publicName && protocol) { + addProviderModelSelector(selectors, `${publicName}::${protocol}`); + } + if (name && protocol) { + addProviderModelSelector(selectors, `${name}::${protocol}`); + } + } + + providerCredentials(provider).forEach((credential, index) => { + if (!providerCredentialApiKey(credential)) { + return; + } + const credentialSlug = providerCredentialSlug(providerCredentialRuntimeId(credential, index)); + for (const protocol of claudeDesignProviderProtocols(provider)) { + if (publicName) { + addProviderModelSelector(selectors, `${publicName}::${protocol}::cred:${credentialSlug}`); + } + if (name) { + addProviderModelSelector(selectors, `${name}::${protocol}::cred:${credentialSlug}`); + } + } + }); + + return uniqueCaseInsensitiveStrings(selectors); +} + +function addProviderModelSelector(selectors, value) { + const normalized = stringValue(value); + if (normalized) { + selectors.push(normalized); + } +} + +function claudeDesignVirtualModelSelectors(config) { + const profiles = claudeDesignVirtualModelProfilesForConfig(config); + const selectors = []; + for (const profile of profiles) { + if (!isRecord(profile) || profile.enabled === false) { + continue; + } + const materialization = isRecord(profile.materialization) ? profile.materialization : {}; + if (materialization.enabled === false || materialization.includeInGatewayModels === false) { + continue; + } + const match = isRecord(profile.match) ? profile.match : {}; + const aliases = Array.isArray(match.exactAliases) ? match.exactAliases : []; + for (const alias of aliases) { + const normalizedAlias = stringValue(alias); + if (!normalizedAlias) { + continue; + } + selectors.push(normalizedAlias.toLowerCase().startsWith("fusion/") ? normalizedAlias : `Fusion/${normalizedAlias}`); + } + } + return selectors; +} + +function claudeDesignGatewayModelPreset(selector, isDefault) { + return { + id: selector, + label: gatewayModelPresetLabel(selector), + maxTokens: 1000000, + supportsAdaptiveThinking: true, + description: isDefault ? "CCR gateway default" : "CCR gateway model" + }; +} + +function gatewayModelPresetLabel(selector) { + const value = stringValue(selector) || DEFAULT_GATEWAY_MODEL; + const separator = value.indexOf("/"); + if (separator <= 0 || separator >= value.length - 1) { + return value; + } + const provider = value.slice(0, separator); + const model = value.slice(separator + 1); + return `${model} (${provider})`; +} + +function publicGatewayModelSelector(value) { + const normalized = normalizeRouteTarget(value); + if (!normalized) { + return undefined; + } + const separator = normalized.indexOf("/"); + if (separator <= 0 || separator >= normalized.length - 1) { + return normalized; + } + const provider = normalized.slice(0, separator).trim(); + const model = normalized.slice(separator + 1).trim(); + const protocolSeparator = provider.indexOf("::"); + const publicProvider = protocolSeparator > 0 ? provider.slice(0, protocolSeparator) : provider; + return publicProvider && model ? `${publicProvider}/${model}` : normalized; +} + +function publicGatewayProviderName(value) { + const name = stringValue(value); + if (!name) { + return undefined; + } + const protocolSeparator = name.indexOf("::"); + return protocolSeparator > 0 ? name.slice(0, protocolSeparator) : name; +} + +function uniqueCaseInsensitiveStrings(values) { + const seen = new Set(); + const result = []; + for (const value of values) { + const normalized = stringValue(value); + if (!normalized) { + continue; + } + const key = normalized.toLowerCase(); + if (seen.has(key)) { + continue; + } + seen.add(key); + result.push(normalized); + } + return result; +} + +function addProviderSelectorName(names, value) { + const name = stringValue(value); + if (name) { + names.add(name.toLowerCase()); + const publicName = publicGatewayProviderName(name); + if (publicName) { + names.add(publicName.toLowerCase()); + } + } +} + +function claudeDesignProviderProtocols(provider) { + const protocols = []; + const seen = new Set(); + const capabilities = Array.isArray(provider.capabilities) ? provider.capabilities : []; + for (const capability of capabilities) { + if (!isRecord(capability)) { + continue; + } + const protocol = normalizeGatewayProviderProtocol(capability.type || capability.protocol); + if (protocol && stringValue(capability.baseUrl || capability.base_url) && !seen.has(protocol)) { + seen.add(protocol); + protocols.push(protocol); + } + } + + const direct = normalizeGatewayProviderProtocol(provider.type) || + normalizeGatewayProviderProtocol(provider.provider) || + inferGatewayProviderProtocol(provider); + if (direct && !seen.has(direct)) { + protocols.push(direct); + } + return protocols; +} + +function normalizeGatewayProviderProtocol(value) { + const normalized = stringValue(value)?.toLowerCase(); + if (normalized === "openai" || normalized === "openai_responses") { + return "openai_responses"; + } + if (normalized === "openai_chat" || normalized === "openai_chat_completions") { + return "openai_chat_completions"; + } + if (normalized === "anthropic" || normalized === "anthropic_messages") { + return "anthropic_messages"; + } + if (normalized === "gemini" || normalized === "gemini_generate_content") { + return "gemini_generate_content"; + } + return undefined; +} + +function inferGatewayProviderProtocol(provider) { + const url = stringValue(provider.baseurl || provider.baseUrl || provider.api_base_url)?.toLowerCase() || ""; + const transformerNames = JSON.stringify(provider.transformer ?? "").toLowerCase(); + if (url.includes("generativelanguage.googleapis.com") || transformerNames.includes("gemini")) { + return "gemini_generate_content"; + } + if (url.includes("anthropic") || transformerNames.includes("anthropic")) { + return "anthropic_messages"; + } + return "openai_chat_completions"; +} + +function providerCredentials(provider) { + return Array.isArray(provider?.credentials) + ? provider.credentials.filter((credential) => isRecord(credential) && credential.enabled !== false) + : []; +} + +function providerCredentialApiKey(credential) { + return stringValue(credential.api_key) || stringValue(credential.apiKey) || stringValue(credential.apikey); +} + +function providerCredentialRuntimeId(credential, index) { + const explicitId = stringValue(credential.id); + if (explicitId) { + return explicitId; + } + const oneBasedIndex = index >= 0 ? index + 1 : 1; + const label = stringValue(credential.name) || stringValue(credential.label); + return label ? `${providerCredentialSlug(label)}-${oneBasedIndex}` : `key-${oneBasedIndex}`; +} + +function providerCredentialSlug(value) { + return stringValue(value) + .toLowerCase() + .replace(/[^a-z0-9_.-]+/g, "-") + .replace(/^-+|-+$/g, "") || "key"; +} + +function positiveNumber(value) { + const number = Number(value); + return Number.isFinite(number) && number > 0 ? number : undefined; +} + +function hasWebSearchTool(tools) { + return Array.isArray(tools) && tools.some((tool) => isRecord(tool) && stringValue(tool.type)?.startsWith("web_search")); +} + +function hasImageContent(messages) { + return Array.isArray(messages) && messages.some((message) => JSON.stringify(message).includes("\"image\"")); +} + +function sanitizeRouteId(value) { + return String(value || "") + .toLowerCase() + .replace(/[^a-z0-9._-]+/g, "-") + .replace(/^-+|-+$/g, "") + .slice(0, 80) || "route"; +} + +function fetchGateway(runtime, path, body, routingDecision, sessionContext) { + const url = new URL(path, runtime.gatewayUrl.replace(/\/+$/, "")); + const headers = { + "anthropic-version": "2023-06-01", + "content-type": "application/json", + "x-ccr-client": "Claude Design", + "x-claude-design-proxy": "1" + }; + if (runtime.gatewayApiKey) { + headers.authorization = `Bearer ${runtime.gatewayApiKey}`; + headers["x-api-key"] = runtime.gatewayApiKey; + } + if (routingDecision?.requestedModel) { + headers["x-claude-design-requested-model"] = routingDecision.requestedModel; + } + if (routingDecision?.routedModel) { + headers["x-claude-design-routed-model"] = routingDecision.routedModel; + } + if (routingDecision?.reason) { + headers["x-claude-design-route-reason"] = routingDecision.reason; + } + if (sessionContext?.sessionId) { + headers["x-agent-session-id"] = sessionContext.sessionId; + } + if (sessionContext?.projectId) { + headers["x-claude-design-project-id"] = sessionContext.projectId; + } + if (sessionContext?.chatId) { + headers["x-claude-design-chat-id"] = sessionContext.chatId; + } + return fetch(url, { + body: `${JSON.stringify(body)}\n`, + headers, + method: "POST" + }); +} + +function claudeDesignSessionContext(value) { + const projectId = stringValue(value?.projectId); + const chatId = stringValue(value?.chatId); + const sessionId = projectId && chatId + ? `${projectId}:${chatId}` + : chatId || projectId; + return { + chatId, + projectId, + sessionId + }; +} + +function readClaudeDesignProjectId(value) { + if (!isRecord(value)) { + return undefined; + } + const metadata = isRecord(value.metadata) ? value.metadata : undefined; + return ( + stringValue(value.project_id) || + stringValue(value.projectId) || + stringValue(metadata?.project_id) || + stringValue(metadata?.projectId) + ); +} + +function readClaudeDesignChatId(value) { + if (!isRecord(value)) { + return undefined; + } + const metadata = isRecord(value.metadata) ? value.metadata : undefined; + return ( + stringValue(value.chat_id) || + stringValue(value.chatId) || + stringValue(metadata?.chat_id) || + stringValue(metadata?.chatId) || + stringValue(value.conversation_id) || + stringValue(value.conversationId) || + stringValue(metadata?.conversation_id) || + stringValue(metadata?.conversationId) + ); +} + +function extractGatewayAssistantText(payload) { + if (typeof payload === "string") { + return payload; + } + if (!isRecord(payload)) { + return ""; + } + if (typeof payload.completion === "string") { + return payload.completion; + } + if (typeof payload.output_text === "string") { + return payload.output_text; + } + if (Array.isArray(payload.content)) { + return textFromMessageContent(payload.content); + } + if (Array.isArray(payload.output)) { + return textFromMessageContent(payload.output); + } + if (Array.isArray(payload.choices)) { + return payload.choices + .map((choice) => { + if (!isRecord(choice)) { + return ""; + } + const message = isRecord(choice.message) ? choice.message : {}; + const delta = isRecord(choice.delta) ? choice.delta : {}; + return textFromMessageContent(message.content) || textFromMessageContent(delta.content) || stringValue(choice.text) || ""; + }) + .filter(Boolean) + .join("\n"); + } + return ""; +} + +function extractGatewayToolCalls(payload) { + const toolCalls = []; + const addToolCall = (value, fallbackIndex) => { + const toolCall = normalizeGatewayToolCall(value, fallbackIndex); + if (toolCall) { + toolCalls.push(toolCall); + } + }; + + if (!isRecord(payload)) { + return toolCalls; + } + if (Array.isArray(payload.content)) { + payload.content.forEach(addToolCall); + } + if (Array.isArray(payload.output)) { + payload.output.forEach(addToolCall); + } + if (Array.isArray(payload.tool_calls)) { + payload.tool_calls.forEach(addToolCall); + } + if (Array.isArray(payload.choices)) { + for (const choice of payload.choices) { + if (!isRecord(choice)) { + continue; + } + const message = isRecord(choice.message) ? choice.message : {}; + const delta = isRecord(choice.delta) ? choice.delta : {}; + if (Array.isArray(message.tool_calls)) { + message.tool_calls.forEach(addToolCall); + } + if (Array.isArray(delta.tool_calls)) { + delta.tool_calls.forEach(addToolCall); + } + if (Array.isArray(message.content)) { + message.content.forEach(addToolCall); + } + } + } + return toolCalls; +} + +function normalizeGatewayToolCall(value, fallbackIndex) { + if (!isRecord(value)) { + return undefined; + } + const fn = isRecord(value.function) ? value.function : {}; + const name = stringValue(value.name) || stringValue(fn.name) || stringValue(value.tool); + if (!name) { + return undefined; + } + const inputSource = value.input ?? value.arguments ?? fn.arguments ?? {}; + const input = normalizeToolInput(inputSource); + return { + id: stringValue(value.id) || `toolu_${String(fallbackIndex || 0)}_${randomUuid().replace(/-/g, "").slice(0, 18)}`, + input: normalizeGatewayToolInput(name, input), + name + }; +} + +function normalizeGatewayToolInput(name, input) { + if (name === "questions_v2") { + return normalizeQuestionsV2Input(input); + } + if (name === "questions") { + return normalizeLegacyQuestionsInput(input); + } + return input; +} + +function absorbQuestionToolCalls(assistantText, toolCalls) { + const kept = []; + const questions = []; + for (const toolCall of Array.isArray(toolCalls) ? toolCalls : []) { + if (isQuestionToolName(toolCall?.name)) { + questions.push(toolCall); + } else { + kept.push(toolCall); + } + } + if (questions.length === 0) { + return { + assistantText, + toolCalls: kept + }; + } + + const questionText = questionToolCallsToText(questions); + return { + assistantText: [assistantText, questionText].filter(Boolean).join("\n\n"), + toolCalls: kept + }; +} + +function questionToolCallsToText(toolCalls) { + const summaries = []; + for (const toolCall of Array.isArray(toolCalls) ? toolCalls : []) { + const input = isRecord(toolCall?.input) ? toolCall.input : {}; + const title = stringValue(input.title); + const questions = Array.isArray(input.questions) ? input.questions : []; + const questionTitles = questions + .map((question, index) => { + if (!isRecord(question)) { + return ""; + } + return stringValue(question.title) || stringValue(question.question) || `Question ${index + 1}`; + }) + .filter(Boolean); + if (title || questionTitles.length > 0) { + summaries.push([title, ...questionTitles].filter(Boolean).join(": ")); + } + } + const suffix = summaries.length > 0 ? ` (${summaries.join("; ")})` : ""; + return `Claude Design questions were skipped; continuing with default answers.${suffix}`; +} + +function isQuestionToolName(name) { + return QUESTION_TOOL_NAMES.has(String(name || "")); +} + +function normalizeToolInput(value) { + if (typeof value === "string") { + const parsed = parseMaybeJson(value, undefined); + if (isRecord(parsed)) { + return parsed; + } + if (Array.isArray(parsed)) { + return { value: parsed }; + } + return value.trim() ? { arguments: value } : {}; + } + if (isRecord(value)) { + return value; + } + if (Array.isArray(value)) { + return { value }; + } + return value === undefined || value === null ? {} : { value }; +} + +function normalizeQuestionsV2Input(value) { + const record = isRecord(value) ? value : {}; + const rawQuestions = Array.isArray(record.questions) ? record.questions : []; + const questions = rawQuestions.map(normalizeQuestionsV2Question).filter(Boolean); + const title = stringValue(record.title) || "Claude has some questions"; + return { + ...record, + questions: questions.length > 0 ? questions : [defaultQuestionsV2Question()], + title + }; +} + +function normalizeLegacyQuestionsInput(value) { + const record = isRecord(value) ? value : {}; + const rawQuestions = Array.isArray(record.questions) ? record.questions : []; + return { + ...record, + questions: rawQuestions.map((question, index) => { + if (isRecord(question)) { + return { + ...question, + options: plainStringArray(question.options), + question: stringValue(question.question) || stringValue(question.title) || `Question ${index + 1}` + }; + } + return { + options: [], + question: stringValue(question) || `Question ${index + 1}` + }; + }) + }; +} + +function normalizeQuestionsV2Question(question, index) { + const record = isRecord(question) ? question : {}; + const options = plainStringArray(record.options); + const title = stringValue(record.title) || stringValue(record.question) || stringValue(record.label) || `Question ${index + 1}`; + let kind = stringValue(record.kind); + if (!["text-options", "svg-options", "slider", "file", "freeform"].includes(kind)) { + if (record.isSvg === true) { + kind = "svg-options"; + } else if (options.length > 0) { + kind = "text-options"; + } else if (record.min !== undefined || record.max !== undefined || record.step !== undefined) { + kind = "slider"; + } else if (stringValue(record.accept)) { + kind = "file"; + } else { + kind = "freeform"; + } + } + if ((kind === "text-options" || kind === "svg-options") && options.length === 0) { + kind = "freeform"; + } + const normalized = { + id: normalizeQuestionId(stringValue(record.id) || stringValue(record.name) || title, index), + kind, + title + }; + const subtitle = stringValue(record.subtitle); + if (subtitle) { + normalized.subtitle = subtitle; + } + if (options.length > 0) { + normalized.options = options; + } + if (record.multi === true) { + normalized.multi = true; + } + if (kind === "slider") { + const min = numberValue(record.min); + const max = numberValue(record.max); + const step = numberValue(record.step); + const defaultValue = numberValue(record.default); + if (min !== undefined) { + normalized.min = min; + } + if (max !== undefined) { + normalized.max = max; + } + if (step !== undefined) { + normalized.step = step; + } + if (defaultValue !== undefined) { + normalized.default = defaultValue; + } + } + if (kind === "file") { + const accept = stringValue(record.accept); + if (accept) { + normalized.accept = accept; + } + } + return normalized; +} + +function plainStringArray(value) { + if (!Array.isArray(value)) { + return []; + } + return value.map((item) => String(item ?? "").trim()).filter(Boolean); +} + +function defaultQuestionsV2Question() { + return { + id: "details", + kind: "freeform", + title: "What should Claude know before continuing?" + }; +} + +function normalizeQuestionId(value, index) { + const normalized = stringValue(value) + .toLowerCase() + .replace(/[^a-z0-9]+/g, "_") + .replace(/^_+|_+$/g, "") + .slice(0, 64); + return normalized || `question_${index + 1}`; +} + +function extractGatewayStopReason(payload, fallback) { + if (!isRecord(payload)) { + return fallback; + } + const direct = stringValue(payload.stop_reason) || stringValue(payload.stopReason); + if (direct) { + return direct; + } + if (Array.isArray(payload.choices)) { + for (const choice of payload.choices) { + const mapped = mapGatewayFinishReason(isRecord(choice) ? stringValue(choice.finish_reason) || stringValue(choice.finishReason) : undefined); + if (mapped) { + return mapped; + } + } + } + return fallback; +} + +function mapGatewayFinishReason(reason) { + switch (reason) { + case "tool_calls": + case "function_call": + return "tool_use"; + case "length": + return "max_tokens"; + case "stop": + return "end_turn"; + default: + return reason; + } +} + +function textFromMessageContent(content) { + if (typeof content === "string") { + return content; + } + if (!Array.isArray(content)) { + return ""; + } + return content + .map((block) => { + if (typeof block === "string") { + return block; + } + if (!isRecord(block)) { + return ""; + } + if (block.type === "tool_use" || block.type === "function_call" || isToolResultContentBlock(block)) { + return ""; + } + return stringValue(block.text) || stringValue(block.content) || stringValue(block.output_text) || ""; + }) + .filter(Boolean) + .join("\n"); +} + +function gatewayMessageContent(assistantText, toolCalls) { + const content = []; + if (assistantText) { + content.push({ text: assistantText, type: "text" }); + } + for (const toolCall of toolCalls) { + content.push({ + id: toolCall.id, + input: toolCall.input || {}, + name: toolCall.name, + type: "tool_use" + }); + } + return content; +} + +function gatewayContentBlocks(assistantText, toolCalls) { + const blocks = []; + if (assistantText) { + blocks.push({ text: assistantText, type: "text" }); + } + for (const toolCall of toolCalls) { + blocks.push({ + toolCall: { + id: toolCall.id, + input: toolCall.input || {}, + name: toolCall.name, + serverSide: false, + type: gatewayToolKind(toolCall.name) + }, + type: "tool_call" + }); + } + return blocks; +} + +function sanitizeStoredMessages(messages) { + if (!Array.isArray(messages)) { + return []; + } + return dedupeStoredMessages(messages + .map(sanitizeStoredMessage) + .filter(isVisibleStoredMessage)); +} + +function dedupeStoredMessages(messages) { + const result = []; + let previousKey; + for (const message of messages) { + const key = storedMessageDedupeKey(message); + if (key && key === previousKey) { + continue; + } + result.push(message); + previousKey = key; + } + return result; +} + +function storedMessageDedupeKey(message) { + if (!isRecord(message)) { + return `raw:${JSON.stringify(message)}`; + } + const role = stringValue(message.role) || ""; + const chatId = stringValue(message.chat_id) || stringValue(message.chatId) || ""; + const text = role === "user" ? cleanVisibleUserText(storedMessageDisplayText(message)) : storedMessageDisplayText(message); + const blocks = Array.isArray(message.contentBlocks) + ? message.contentBlocks + : Array.isArray(message.content_blocks) + ? message.content_blocks + : []; + return JSON.stringify({ + blocks: role === "user" ? [] : blocks, + chatId, + role, + text + }); +} + +function sanitizeStoredMessage(message) { + if (!isRecord(message)) { + return message; + } + const sourceBlocks = Array.isArray(message.contentBlocks) + ? message.contentBlocks + : Array.isArray(message.content_blocks) + ? message.content_blocks + : []; + if (sourceBlocks.length === 0) { + return sanitizeStoredMessageDisplayContent(message); + } + + const keptBlocks = []; + const questionBlocks = []; + for (const block of sourceBlocks) { + if (isQuestionContentBlock(block)) { + questionBlocks.push(block); + } else { + keptBlocks.push(block); + } + } + if (questionBlocks.length === 0) { + return sanitizeStoredMessageDisplayContent(message); + } + + const existingContent = stringValue(message.content); + const content = existingContent || questionToolBlocksToText(questionBlocks); + const blocks = keptBlocks.length > 0 + ? keptBlocks + : content + ? [{ text: content, type: "text" }] + : []; + return sanitizeStoredMessageDisplayContent({ + ...message, + content, + contentBlocks: blocks, + content_blocks: blocks + }); +} + +function isQuestionContentBlock(block) { + if (!isRecord(block)) { + return false; + } + if (isQuestionToolName(block.name)) { + return true; + } + const toolCall = isRecord(block.toolCall) ? block.toolCall : isRecord(block.tool_call) ? block.tool_call : undefined; + if (toolCall && isQuestionToolName(toolCall.name)) { + return true; + } + return false; +} + +function questionToolBlocksToText(blocks) { + const toolCalls = []; + for (const block of Array.isArray(blocks) ? blocks : []) { + if (!isRecord(block)) { + continue; + } + const toolCall = isRecord(block.toolCall) ? block.toolCall : isRecord(block.tool_call) ? block.tool_call : block; + toolCalls.push({ + input: isRecord(toolCall.input) ? toolCall.input : {}, + name: stringValue(toolCall.name) || "questions_v2" + }); + } + return questionToolCallsToText(toolCalls); +} + +function isToolResultOnlyMessage(message) { + if (!isRecord(message)) { + return false; + } + const role = stringValue(message.role); + if (role && role !== "user" && role !== "tool") { + return false; + } + const content = message.content; + if (Array.isArray(content) && content.length > 0) { + return content.every(isToolResultContentBlock); + } + const blocks = Array.isArray(message.contentBlocks) + ? message.contentBlocks + : Array.isArray(message.content_blocks) + ? message.content_blocks + : []; + if (blocks.length > 0) { + return blocks.every(isToolResultContentBlock); + } + return role === "tool"; +} + +function isToolResultContentBlock(block) { + if (!isRecord(block)) { + return false; + } + const type = stringValue(block.type); + return ( + type === "tool_result" || + type === "tool_result_error" || + type === "function_result" || + isRecord(block.toolResult) || + isRecord(block.tool_result) + ); +} + +function sanitizeStoredMessageDisplayContent(message) { + if (!isRecord(message)) { + return message; + } + const role = stringValue(message.role); + if (role === "user") { + const content = cleanVisibleUserText(storedProjectMessageText(message)); + const sanitized = { + ...message, + content + }; + if (Array.isArray(message.contentBlocks) || Array.isArray(message.content_blocks)) { + const blocks = content ? [{ text: content, type: "text" }] : []; + sanitized.contentBlocks = blocks; + sanitized.content_blocks = blocks; + } + return sanitized; + } + if (role === "assistant") { + const sourceBlocks = Array.isArray(message.contentBlocks) + ? message.contentBlocks + : Array.isArray(message.content_blocks) + ? message.content_blocks + : []; + if (sourceBlocks.length === 0) { + return message; + } + const blocks = sourceBlocks.filter((block) => !isToolResultContentBlock(block)); + if (blocks.length === sourceBlocks.length) { + return message; + } + const content = stringValue(message.content) || textFromMessageContent(blocks); + return { + ...message, + content, + contentBlocks: blocks, + content_blocks: blocks + }; + } + return message; +} + +function isVisibleStoredMessage(message) { + if (!isRecord(message)) { + return true; + } + if (isToolResultOnlyMessage(message)) { + return false; + } + const role = stringValue(message.role); + const text = storedMessageDisplayText(message); + if (isInternalChatStatusText(text)) { + return false; + } + if (role === "user") { + return Boolean(cleanVisibleUserText(text)); + } + if (role === "tool") { + return false; + } + if (role === "assistant" && !text) { + const blocks = Array.isArray(message.contentBlocks) + ? message.contentBlocks + : Array.isArray(message.content_blocks) + ? message.content_blocks + : []; + return blocks.some((block) => isToolCallContentBlock(block) || !isToolResultContentBlock(block)); + } + return true; +} + +function storedMessageDisplayText(message) { + if (!isRecord(message)) { + return ""; + } + return storedProjectMessageText(message); +} + +function cleanVisibleUserText(text) { + let value = (stringValue(text) || "") + .replace(/]*>[\s\S]*?<\/system-info>/gi, "\n") + .replace(/]*>[\s\S]*?<\/default\s+aesthetic_system_instructions>/gi, "\n") + .replace(/]*>[\s\S]*?<\/system-reminder>/gi, "\n") + .replace(/\s*\[id:m[0-9a-z_-]+\]\s*$/i, "") + .replace(/[ \t]+\n/g, "\n") + .replace(/\n{3,}/g, "\n\n") + .trim(); + if (isInternalChatStatusText(value)) { + value = ""; + } + return value; +} + +function isInternalChatStatusText(text) { + const normalized = (stringValue(text) || "").replace(/\s+/g, " ").trim(); + return ( + /^Questions timed out;\s*go with defaults\.?$/i.test(normalized) || + /^Claude Design questions were skipped;\s*continuing with default answers\./i.test(normalized) || + /^Wrote \d+ characters to .+$/i.test(normalized) || + /^Opened .+ for the user\./i.test(normalized) || + /^Error:\s*(screenshot capture failed:)?\s*Error at step \d+:/i.test(normalized) || + /^Error:\s*\[internal\]/i.test(normalized) || + /^--- Script output ---/i.test(normalized) || + /^(Edited|Created|Deleted|Renamed|Moved|Copied) .+/i.test(normalized) || + /No preview pane available/i.test(normalized) || + /^\[File:\s+.+\]/i.test(normalized) || + /^\(no webview logs\)$/i.test(normalized) || + /^Make sure your design supports Tweaks\./i.test(normalized) || + /^Verifier subagent forked\b/i.test(normalized) || + /^=== FORK BOUNDARY ===/i.test(normalized) + ); +} + +function isToolCallContentBlock(block) { + if (!isRecord(block)) { + return false; + } + const type = stringValue(block.type); + return type === "tool_call" || type === "tool_use" || type === "function_call" || isRecord(block.toolCall) || isRecord(block.tool_call); +} + +function gatewayToolKind(name) { + if (name === "Read") { + return "read"; + } + if (String(name || "").startsWith("mcp__")) { + return "mcp"; + } + return "edit"; +} + +function appendChatExchange(runtime, request, gatewayBody, assistantText, assistantMessageId, contentBlocks) { + const row = getProjectRow(runtime, request.projectId); + if (!row) { + return; + } + const parsedMessages = parseMaybeJson(row.messages_json, []); + const messages = Array.isArray(parsedMessages) ? parsedMessages : []; + const assistantContentBlocks = Array.isArray(contentBlocks) ? contentBlocks : gatewayContentBlocks(assistantText, []); + const now = new Date().toISOString(); + const lastUserText = cleanVisibleUserText(textFromMessageContent(lastGatewayUserMessage(gatewayBody)?.content)); + if (lastUserText) { + const lastMessage = messages[messages.length - 1]; + if (!lastMessage || lastMessage.role !== "user" || lastMessage.chat_id !== request.chatId || lastMessage.content !== lastUserText) { + messages.push({ + chat_id: request.chatId, + content: lastUserText, + created_at: now, + id: randomUuid(), + role: "user" + }); + } + } + const assistantMessage = { + chat_id: request.chatId, + content: assistantText, + contentBlocks: assistantContentBlocks, + content_blocks: assistantContentBlocks, + created_at: now, + id: assistantMessageId, + role: "assistant" + }; + const existingAssistantIndex = messages.findIndex((message) => message?.id === assistantMessageId); + if (existingAssistantIndex >= 0) { + messages[existingAssistantIndex] = assistantMessage; + } else { + messages.push(assistantMessage); + } + runtime.store.database.run("UPDATE claude_design_items SET updated_at = ?, messages_json = ? WHERE collection = ? AND uuid = ?", [ + now, + JSON.stringify(messages), + PROJECT_COLLECTION, + row.uuid + ]); + appendChatExchangeToProjectData(runtime, row, request, lastUserText, assistantText, assistantMessageId, assistantContentBlocks, now); + runtime.store.persist(); +} + +function lastGatewayUserMessage(gatewayBody) { + if (!isRecord(gatewayBody) || !Array.isArray(gatewayBody.messages)) { + return undefined; + } + let sawNonHumanTail = false; + for (let index = gatewayBody.messages.length - 1; index >= 0; index--) { + const message = gatewayBody.messages[index]; + if (!isRecord(message)) { + continue; + } + const role = stringValue(message.role); + if (role === "user") { + if (isToolResultOnlyMessage(message)) { + sawNonHumanTail = true; + continue; + } + if (sawNonHumanTail) { + return undefined; + } + return message; + } + if (role === "assistant" || role === "tool") { + sawNonHumanTail = true; + } + } + return undefined; +} + +function appendChatExchangeToProjectData(runtime, row, request, userText, assistantText, assistantMessageId, contentBlocks, now) { + saveProjectData(runtime, row.uuid, (record, currentRow) => { + const base64 = stringValue(record.project_data_base64); + const decoded = base64 ? parseMaybeJson(Buffer.from(base64, "base64").toString("utf8"), {}) : record; + const normalized = normalizeProjectStoreData(runtime, currentRow || row, decoded); + const chatId = request.chatId || stringValue(normalized.viewState?.activeChatId) || defaultProjectChatId(row.uuid); + const chats = { ...(isRecord(normalized.chats) ? normalized.chats : {}) }; + const chat = normalizeProjectChat(chats[chatId] || {}, chatId, normalized.created, now); + const chatMessages = Array.isArray(chat.messages) ? [...chat.messages] : []; + + if (userText) { + const lastMessage = chatMessages[chatMessages.length - 1]; + if (!lastMessage || lastMessage.role !== "user" || lastMessage.content !== userText) { + chatMessages.push({ + content: userText, + id: randomUuid(), + role: "user", + timestamp: now + }); + } + } + + const assistantMessage = { + content: assistantText, + contentBlocks, + id: assistantMessageId, + role: "assistant", + timestamp: now + }; + const existingAssistantIndex = chatMessages.findIndex((message) => message?.id === assistantMessageId); + if (existingAssistantIndex >= 0) { + chatMessages[existingAssistantIndex] = assistantMessage; + } else { + chatMessages.push(assistantMessage); + } + + chats[chatId] = { + ...chat, + lastOpened: now, + messages: chatMessages + }; + + const nextProjectData = { + ...normalized, + chats, + lastOpened: now, + viewState: { + ...normalized.viewState, + activeChatId: chatId + } + }; + return { + ...record, + project_data_base64: Buffer.from(JSON.stringify(nextProjectData), "utf8").toString("base64") + }; + }); +} + +function estimateTokenCount(body) { + return Math.max(1, Math.ceil(JSON.stringify(body || {}).length / 4)); +} + +function encodeChatResponseTextDelta(text) { + return protoMessage(2, protoString(1, text)); +} + +function encodeChatResponseMessageStart(messageId) { + return protoMessage(3, protoString(1, messageId)); +} + +function encodeChatResponseMessageStop(stopReason) { + return protoMessage(4, protoString(1, stopReason || "end_turn")); +} + +function encodeChatResponseError(message) { + return protoMessage(5, protoString(1, message || "Unknown gateway error.")); +} + +function encodeChatResponseRaw(eventType, payload) { + return protoMessage(6, Buffer.concat([protoString(1, eventType), protoBytes(2, Buffer.from(JSON.stringify(payload), "utf8"), true)])); +} + +function connectStreamResponse(messages) { + const body = Buffer.concat([...messages.map((message) => connectEnvelope(0, message)), connectEnvelope(0x02, Buffer.from("{}", "utf8"))]); + return binaryResponse(200, body, { + "cache-control": "no-store", + "connect-content-encoding": "identity", + "connect-protocol-version": "1", + "content-type": "application/connect+proto" + }); +} + +function connectEnvelope(flags, data) { + const payload = Buffer.isBuffer(data) ? data : Buffer.from(data || []); + const header = Buffer.alloc(5); + header[0] = flags; + header.writeUInt32BE(payload.length, 1); + return Buffer.concat([header, payload]); +} + +function decodeConnectEnvelope(buffer) { + if (!Buffer.isBuffer(buffer) || buffer.length < 5) { + return buffer; + } + + const frames = []; + let offset = 0; + while (offset + 5 <= buffer.length) { + const flags = buffer[offset]; + const length = buffer.readUInt32BE(offset + 1); + const start = offset + 5; + const end = start + length; + if (end > buffer.length) { + return frames[0] || buffer; + } + if ((flags & 0x02) === 0 && length > 0) { + frames.push(buffer.subarray(start, end)); + } + offset = end; + } + if (frames.length === 0) { + return Buffer.alloc(0); + } + if (frames.length === 1) { + return frames[0]; + } + return Buffer.concat(frames); +} + +function omeletteProjectFromRow(row, me) { + const data = parseMaybeJson(row.data_json, {}); + const uuid = stringValue(data.project_id) || stringValue(data.uuid) || row.uuid; + const name = stringValue(data.name) || stringValue(data.title) || row.title || "Untitled design"; + return { + canEdit: data.can_edit !== false, + createdAt: row.created_at, + description: stringValue(data.description) || "", + designSystems: Array.isArray(data.design_systems) ? data.design_systems : [], + introText: stringValue(data.intro_text) || "", + isFavorite: data.is_favorite === true, + isOwned: data.is_owned !== false, + name, + ownerDisplayName: stringValue(data.owner_display_name) || me.displayName, + ownerEmail: stringValue(data.owner_email) || me.email, + ownerUuid: stringValue(data.owner_uuid) || me.accountUuid, + publishedAt: stringValue(data.published_at) || "", + projectId: uuid, + sharing: isRecord(data.sharing) ? data.sharing : {}, + templateTitle: stringValue(data.template_title) || "", + type: normalizeProjectTypeNumber(data.project_type ?? data.type), + updatedAt: row.updated_at, + uuid, + viewedAt: stringValue(data.viewed_at) || row.updated_at + }; +} + +function decodeCreateProjectRequest(buffer) { + return { + description: decodeProtoStringField(buffer, 5), + introText: decodeProtoStringField(buffer, 6), + name: decodeProtoStringField(buffer, 1), + templateId: decodeProtoStringField(buffer, 9), + templateTitle: decodeProtoStringField(buffer, 4), + type: decodeProtoEnumField(buffer, 3) + }; +} + +function encodeCreateProjectName(name) { + return protoString(1, name); +} + +function encodeCreateProjectResponse(projectId) { + return protoString(1, projectId); +} + +function encodeListProjectsResponse(runtime) { + const typeFilter = arguments.length > 1 ? arguments[1] : undefined; + const publishedOnly = arguments.length > 2 ? arguments[2] : undefined; + const items = listOmeletteProjects(runtime, typeFilter, publishedOnly).map((project) => protoMessage(1, encodeProjectListItem(project))); + return Buffer.concat(items); +} + +function encodeProjectListItem(project) { + return Buffer.concat([ + protoString(1, project.projectId), + protoString(2, project.name), + protoTimestamp(3, project.viewedAt), + protoString(4, project.ownerUuid), + protoString(5, project.ownerEmail), + protoBool(6, project.isOwned), + protoMessage(7, encodeSharing(project.sharing)), + protoEnum(8, project.type), + protoTimestamp(9, project.publishedAt), + protoString(10, project.templateTitle), + protoString(11, project.description), + protoString(12, project.introText), + protoTimestamp(14, project.updatedAt), + protoString(15, project.ownerDisplayName), + protoBool(17, project.isFavorite), + protoBool(18, project.canEdit), + ...((Array.isArray(project.designSystems) ? project.designSystems : []).map((binding) => protoMessage(19, encodeDesignSystemBinding(binding)))) + ]); +} + +function encodeGetProjectResponse(project, me, projectDataBytes) { + return Buffer.concat([ + protoString(1, project.projectId), + protoString(2, project.name), + protoString(3, project.ownerUuid || me.accountUuid), + protoString(4, project.ownerEmail || me.email), + protoTimestamp(5, project.createdAt), + protoTimestamp(6, project.updatedAt), + protoMessage(7, encodeSharing(project.sharing)), + protoBytes(9, projectDataBytes || Buffer.alloc(0), true), + protoEnum(10, project.type), + protoTimestamp(11, project.publishedAt), + protoString(12, project.templateTitle), + protoString(13, project.description), + protoString(14, project.introText), + protoString(18, project.ownerDisplayName || me.displayName), + ...((Array.isArray(project.designSystems) ? project.designSystems : []).map((binding) => protoMessage(19, encodeDesignSystemBinding(binding)))) + ]); +} + +function encodeGetProjectDataResponse(data) { + return protoBytes(1, data || Buffer.alloc(0), true); +} + +function encodeSharing(sharing) { + const record = isRecord(sharing) ? sharing : {}; + return Buffer.concat([ + protoString(1, stringValue(record.view_mode) || stringValue(record.viewMode) || "private"), + protoBool(2, record.team_can_edit === true || record.teamCanEdit === true), + protoBool(3, record.team_can_comment === true || record.teamCanComment === true) + ]); +} + +function normalizeProjectTypeNumber(value) { + if (typeof value === "string") { + const normalized = value.trim().toLowerCase(); + if (normalized === "template") { + return 2; + } + if (normalized === "design_system" || normalized === "design-system") { + return 3; + } + if (normalized === "project") { + return PROJECT_TYPE_PROJECT; + } + } + + const number = Number(value); + return [1, 2, 3].includes(number) ? number : PROJECT_TYPE_PROJECT; +} + +function protoString(fieldNumber, value) { + const text = stringValue(value); + if (!text) { + return Buffer.alloc(0); + } + return protoBytes(fieldNumber, Buffer.from(text, "utf8"), true); +} + +function protoBytes(fieldNumber, value, includeEmpty) { + const payload = Buffer.isBuffer(value) ? value : Buffer.from(value || []); + if (!includeEmpty && payload.length === 0) { + return Buffer.alloc(0); + } + return Buffer.concat([protoTag(fieldNumber, 2), protoVarint(payload.length), payload]); +} + +function protoBool(fieldNumber, value) { + return value === true ? Buffer.concat([protoTag(fieldNumber, 0), protoVarint(1)]) : Buffer.alloc(0); +} + +function protoEnum(fieldNumber, value) { + const number = Number(value); + return Number.isFinite(number) && number !== 0 + ? Buffer.concat([protoTag(fieldNumber, 0), protoVarint(number)]) + : Buffer.alloc(0); +} + +function protoInt32(fieldNumber, value) { + const number = Number(value); + return Number.isFinite(number) && number !== 0 + ? Buffer.concat([protoTag(fieldNumber, 0), protoVarint(number)]) + : Buffer.alloc(0); +} + +function protoInt64(fieldNumber, value) { + const number = Number(value); + return Number.isFinite(number) && number !== 0 + ? Buffer.concat([protoTag(fieldNumber, 0), protoVarint(number)]) + : Buffer.alloc(0); +} + +function protoMessage(fieldNumber, body) { + const payload = Buffer.isBuffer(body) ? body : Buffer.from(body || []); + return Buffer.concat([protoTag(fieldNumber, 2), protoVarint(payload.length), payload]); +} + +function protoTimestamp(fieldNumber, value) { + if (!value) { + return Buffer.alloc(0); + } + const date = new Date(value || Date.now()); + const milliseconds = Number.isFinite(date.getTime()) ? date.getTime() : Date.now(); + const seconds = Math.floor(milliseconds / 1000); + return protoMessage(fieldNumber, Buffer.concat([protoTag(1, 0), protoVarint(seconds)])); +} + +function protoTag(fieldNumber, wireType) { + return protoVarint((Number(fieldNumber) << 3) | Number(wireType)); +} + +function protoVarint(value) { + let number = typeof value === "bigint" ? value : BigInt(Math.max(0, Math.trunc(Number(value) || 0))); + const bytes = []; + while (number >= 0x80n) { + bytes.push(Number((number & 0x7fn) | 0x80n)); + number >>= 7n; + } + bytes.push(Number(number)); + return Buffer.from(bytes); +} + +function decodeProtoStringField(buffer, fieldNumber) { + const field = readProtoField(buffer, fieldNumber); + return field?.wireType === 2 ? stringValue(field.value.toString("utf8")) : undefined; +} + +function decodeProtoStringFields(buffer, fieldNumber) { + return readProtoFields(buffer, fieldNumber) + .filter((field) => field.wireType === 2) + .map((field) => field.value.toString("utf8")) + .filter((value) => value.length > 0); +} + +function decodeAllProtoStrings(buffer) { + if (!Buffer.isBuffer(buffer)) { + return []; + } + const values = []; + forEachProtoField(buffer, (field) => { + if (field.wireType !== 2 || !Buffer.isBuffer(field.value) || field.value.length === 0) { + return; + } + const value = field.value.toString("utf8"); + if (isPlausibleProtoString(value)) { + values.push({ + fieldNumber: field.fieldNumber, + value + }); + } + }); + return values; +} + +function isPlausibleProtoString(value) { + if (!value) { + return false; + } + let printable = 0; + for (const char of value) { + const code = char.charCodeAt(0); + if (code === 9 || code === 10 || code === 13 || (code >= 32 && code !== 127)) { + printable += 1; + } + } + return printable / value.length > 0.85; +} + +function firstUuidLikeString(buffer) { + return decodeAllProtoStrings(buffer) + .map((item) => item.value) + .find((value) => /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value)); +} + +function decodeProtoBytesField(buffer, fieldNumber) { + const field = readProtoField(buffer, fieldNumber); + return field?.wireType === 2 ? field.value : undefined; +} + +function decodeProtoMessageFields(buffer, fieldNumber) { + return readProtoFields(buffer, fieldNumber) + .filter((field) => field.wireType === 2) + .map((field) => field.value); +} + +function decodeProtoEnumField(buffer, fieldNumber) { + const field = readProtoField(buffer, fieldNumber); + return field?.wireType === 0 ? Number(field.value) : undefined; +} + +function decodeProtoIntField(buffer, fieldNumber) { + const field = readProtoField(buffer, fieldNumber); + return field?.wireType === 0 ? Number(field.value) : 0; +} + +function decodeProtoBoolField(buffer, fieldNumber) { + const field = readProtoField(buffer, fieldNumber); + return field?.wireType === 0 ? Number(field.value) !== 0 : false; +} + +function readProtoFields(buffer, targetFieldNumber) { + if (!Buffer.isBuffer(buffer)) { + return []; + } + const matches = []; + forEachProtoField(buffer, (field) => { + if (field.fieldNumber === targetFieldNumber) { + matches.push({ + value: field.value, + wireType: field.wireType + }); + } + }); + return matches; +} + +function readProtoField(buffer, targetFieldNumber) { + return readProtoFields(buffer, targetFieldNumber)[0]; +} + +function forEachProtoField(buffer, visitor) { + if (!Buffer.isBuffer(buffer)) { + return; + } + + let offset = 0; + while (offset < buffer.length) { + const tag = readProtoVarint(buffer, offset); + if (!tag) { + return; + } + + offset = tag.offset; + const fieldNumber = Number(tag.value >> 3n); + const wireType = Number(tag.value & 0x07n); + + if (wireType === 0) { + const value = readProtoVarint(buffer, offset); + if (!value) { + return; + } + offset = value.offset; + visitor({ fieldNumber, value: value.value, wireType }); + continue; + } + + if (wireType === 1) { + if (offset + 8 > buffer.length) { + return; + } + const value = buffer.subarray(offset, offset + 8); + offset += 8; + visitor({ fieldNumber, value, wireType }); + continue; + } + + if (wireType === 2) { + const length = readProtoVarint(buffer, offset); + if (!length) { + return; + } + offset = length.offset; + const end = offset + Number(length.value); + if (end > buffer.length) { + return; + } + const value = buffer.subarray(offset, end); + offset = end; + visitor({ fieldNumber, value, wireType }); + continue; + } + + if (wireType === 5) { + if (offset + 4 > buffer.length) { + return; + } + const value = buffer.subarray(offset, offset + 4); + offset += 4; + visitor({ fieldNumber, value, wireType }); + continue; + } + + return; + } +} + +function readProtoVarint(buffer, offset) { + let result = 0n; + let shift = 0n; + for (let index = offset; index < buffer.length; index += 1) { + const byte = buffer[index]; + result |= BigInt(byte & 0x7f) << shift; + if ((byte & 0x80) === 0) { + return { + offset: index + 1, + value: result + }; + } + shift += 7n; + if (shift > 70n) { + return undefined; + } + } + return undefined; +} + +function completionPayload(itemUuid) { + return { + completion: { + id: randomUuid(), + item_uuid: itemUuid, + role: "assistant", + text: "Claude Design mock response.", + type: "message" + }, + done: true, + id: randomUuid(), + stop_reason: "end_turn" + }; +} + +function sseCompletionResponse(itemUuid) { + const payload = completionPayload(itemUuid); + return textResponse( + 200, + [ + `event: message`, + `data: ${JSON.stringify({ type: "message", message: payload.completion })}`, + "", + "event: done", + "data: {}", + "", + "" + ].join("\n"), + { + "cache-control": "no-cache", + "connection": "keep-alive", + "content-type": "text/event-stream; charset=utf-8" + } + ); +} + +function readStoredResponse(store, method, path) { + const row = queryRows( + store.database, + "SELECT status, headers_json, body FROM claude_design_responses WHERE method = ? AND path = ? LIMIT 1", + [method, path] + )[0]; + if (!row) { + return undefined; + } + + const headers = parseMaybeJson(row.headers_json, {}); + const contentType = stringValue(headers["content-type"]) || stringValue(headers["Content-Type"]) || "application/json; charset=utf-8"; + const bodyText = String(row.body || ""); + if (contentType.includes("application/json")) { + return jsonResponse(Number(row.status) || 200, parseMaybeJson(bodyText, {}), headers); + } + return textResponse(Number(row.status) || 200, bodyText, headers); +} + +function upsertStoredResponse(store, method, path, status, headers, body) { + const bodyText = typeof body === "string" ? body : JSON.stringify(body); + store.database.run( + "INSERT OR REPLACE INTO claude_design_responses (method, path, status, headers_json, body, updated_at) VALUES (?, ?, ?, ?, ?, ?)", + [method, path, status, JSON.stringify(headers), bodyText, new Date().toISOString()] + ); + store.persist(); +} + +function listStoredResponses(store) { + return queryRows( + store.database, + "SELECT method, path, status, headers_json, body, updated_at FROM claude_design_responses ORDER BY updated_at DESC", + [] + ).map((row) => ({ + body: parseMaybeJson(row.body, row.body), + headers: parseMaybeJson(row.headers_json, {}), + method: row.method, + path: row.path, + status: row.status, + updatedAt: row.updated_at + })); +} + +function readCachedAsset(store, path) { + const row = queryRows( + store.database, + "SELECT path, upstream_url, content_type, body_base64, fetched_at FROM claude_design_assets WHERE path = ? LIMIT 1", + [path] + )[0]; + if (!row) { + return undefined; + } + return { + bodyBase64: row.body_base64, + contentType: row.content_type, + fetchedAt: row.fetched_at, + path: row.path, + upstreamUrl: row.upstream_url + }; +} + +function isFallbackAsset(asset) { + return stringValue(asset?.upstreamUrl)?.startsWith("fallback:") === true; +} + +function isReusableFallbackAsset(asset, path) { + const upstreamUrl = stringValue(asset?.upstreamUrl); + if (!upstreamUrl?.startsWith(FALLBACK_ASSET_CACHE_PREFIX) || !isCacheableFallbackAsset(path)) { + return false; + } + const fetchedAt = Date.parse(stringValue(asset?.fetchedAt) || ""); + return Number.isFinite(fetchedAt) && Date.now() - fetchedAt < FALLBACK_ASSET_CACHE_TTL_MS; +} + +function writeCachedAsset(store, path, upstreamUrl, contentType, body) { + store.database.run( + "INSERT OR REPLACE INTO claude_design_assets (path, upstream_url, content_type, body_base64, fetched_at) VALUES (?, ?, ?, ?, ?)", + [path, upstreamUrl, contentType || guessContentType(path), body.toString("base64"), new Date().toISOString()] + ); + store.persist(); +} + +function deleteCachedAsset(store, path) { + store.database.run("DELETE FROM claude_design_assets WHERE path = ?", [path]); + store.persist(); +} + +function purgeBadCachedAssets(store) { + store.database.run(` + DELETE FROM claude_design_assets + WHERE (upstream_url LIKE 'fallback:%' AND upstream_url NOT LIKE ?) + OR body_base64 = '' + OR (lower(content_type) LIKE '%text/html%' AND lower(path) NOT LIKE '%.html') + `, [`${FALLBACK_ASSET_CACHE_PREFIX}%`]); + store.persist(); +} + +function listCachedAssets(store) { + return queryRows( + store.database, + "SELECT path, upstream_url, content_type, length(body_base64) AS body_base64_length, fetched_at FROM claude_design_assets ORDER BY fetched_at DESC", + [] + ).map((row) => ({ + bodyBase64Length: row.body_base64_length, + contentType: row.content_type, + fetchedAt: row.fetched_at, + path: row.path, + upstreamUrl: row.upstream_url + })); +} + +function readLocalAsset(assetDir, requestPath) { + if (!assetDir) { + return undefined; + } + + const localRoot = localAssetRootInfo(assetDir); + for (const relativePath of localAssetRelativePathCandidates(localRoot, requestPath)) { + if (!relativePath || relativePath.includes("\0")) { + continue; + } + + const file = pathModule.resolve(localRoot.root, relativePath); + if (file !== localRoot.root && !file.startsWith(`${localRoot.root}${pathModule.sep}`)) { + continue; + } + if (!fs.existsSync(file) || !fs.statSync(file).isFile()) { + continue; + } + + return { + body: fs.readFileSync(file), + contentType: guessContentType(file), + source: file + }; + } + return undefined; +} + +function localAssetRelativePathCandidates(localRoot, requestPath) { + const normalizedPath = normalizePath(requestPath); + if (localRoot.kind === "claude-app-ion-dist") { + if (normalizedPath.startsWith("/design/assets/")) { + return [`assets/${normalizedPath.slice("/design/assets/".length)}`]; + } + if (normalizedPath.startsWith("/assets/")) { + return [normalizedPath.slice(1)]; + } + if (normalizedPath === "/design" || normalizedPath === "/design/") { + return ["index.html"]; + } + if (normalizedPath.startsWith("/design/")) { + return [normalizedPath.slice("/design/".length)]; + } + if (isClaudeAppStaticRoutePath(normalizedPath)) { + return [normalizedPath.slice(1)]; + } + return []; + } + + return [ + normalizedPath + .replace(/^\/design\/assets\//, "") + .replace(/^\/assets\//, "") + .replace(/^\/design\//, "") + ]; +} + +function isClaudeAppStaticRoutePath(path) { + return path === "/favicon.ico" || + path === "/manifest.json" || + path === "/robots.txt" || + path === "/frame-shell.html" || + path.startsWith("/assets/") || + path.startsWith("/images/") || + path.startsWith("/i18n/") || + path.startsWith("/captions/") || + path.startsWith("/descriptions/"); +} + +function isDesignStaticAsset(path) { + return /^\/design\/[^/?#]+\.(?:avif|gif|html|ico|jpeg|jpg|json|png|svg|webp|woff2?)$/i.test(path); +} + +function isClaudeAppSpaRoute(path) { + return CLAUDE_APP_SPA_ROUTE_PATHS.includes(path) || + CLAUDE_APP_SPA_ROUTE_PATHS.includes(path.replace(/\/$/, "")); +} + +function isClaudeAppDesignIframeRequest(url, request) { + if (url.searchParams.get(CLAUDE_APP_DESIGN_IFRAME_QUERY) === "1") { + return true; + } + const fetchDest = (stringValue(headerValue(request?.headers?.["sec-fetch-dest"])) || "").toLowerCase(); + if (fetchDest === "iframe" || fetchDest === "frame") { + return true; + } + return refererIsClaudeAppDesignShell(request?.headers?.referer); +} + +function refererIsClaudeAppDesignShell(value) { + const referer = stringValue(value); + if (!referer) { + return false; + } + try { + const parsed = new URL(referer, "https://claude.ai"); + return isClaudeAppSpaRoute(normalizePath(parsed.pathname)) && + parsed.searchParams.has(CLAUDE_APP_DESIGN_PATH_QUERY); + } catch { + return false; + } +} + +function claudeAppDesignEntrypointRedirectUrl(url) { + const path = normalizePath(url.pathname); + if (!isDesignSpaRoute(path)) { + return ""; + } + if (path === "/design" && url.searchParams.get(CLAUDE_APP_DESIGN_IFRAME_QUERY) === "1") { + return ""; + } + + const pathParam = stringValue(url.searchParams.get(CLAUDE_APP_DESIGN_PATH_QUERY)); + if (path === "/design" && pathParam) { + const markedPath = withClaudeAppDesignIframeMarker(pathParam); + return `${CLAUDE_APP_DESIGN_SHELL_PATH}?${CLAUDE_APP_DESIGN_PATH_QUERY}=${encodeURIComponent(markedPath)}`; + } + + const targetPath = withClaudeAppDesignIframeMarker(`${path}${url.search || ""}${url.hash || ""}`); + return `${CLAUDE_APP_DESIGN_SHELL_PATH}?${CLAUDE_APP_DESIGN_PATH_QUERY}=${encodeURIComponent(targetPath)}`; +} + +function withClaudeAppDesignIframeMarker(value) { + const raw = stringValue(value) || "/design"; + let parsed; + try { + parsed = new URL(raw, "https://claude.ai"); + } catch { + return raw; + } + const path = normalizePath(parsed.pathname); + if (!isDesignSpaRoute(path)) { + return raw; + } + if (parsed.searchParams.get(CLAUDE_APP_DESIGN_IFRAME_QUERY) !== "1") { + parsed.searchParams.set(CLAUDE_APP_DESIGN_IFRAME_QUERY, "1"); + } + return `${parsed.pathname}${parsed.search}${parsed.hash}`; +} + +function isDesignSpaRoute(path) { + if (path === "/design" || path === "/design/" || path === "/design/index.html") { + return true; + } + return /^\/design\/(?:p|fromcc)(?:\/|$)/.test(path); +} + +function isBootstrapRoutePath(path) { + return BOOTSTRAP_ROUTE_PATHS.includes(path) || + /^\/(?:api|edge-api)\/bootstrap(?:\/[^/]+\/app_start)?\/?$/.test(path) || + /^\/_bootstrap(?:\/[^/]+\/app_start)?\/?$/.test(path); +} + +function isDesignAuthEscapeRoute(path) { + return AUTH_ESCAPE_ROUTE_PATHS.some((prefix) => path === prefix || path.startsWith(`${prefix}/`)); +} + +function listRequests(store, limit) { + const safeLimit = Math.max(1, Math.min(Number(limit) || 100, 500)); + return queryRows( + store.database, + `SELECT id, created_at, method, path, search, request_headers, request_body, response_status, response_body + FROM claude_design_requests + ORDER BY id DESC + LIMIT ${safeLimit}`, + [] + ).map((row) => ({ + createdAt: row.created_at, + id: row.id, + method: row.method, + path: row.path, + requestBody: parseMaybeJson(row.request_body, row.request_body), + requestHeaders: parseMaybeJson(row.request_headers, {}), + responseBody: parseMaybeJson(row.response_body, row.response_body), + responseStatus: row.response_status, + search: row.search + })); +} + +function logRequest(store, entry) { + const responseBody = bodyToLogText(entry.responseBody); + store.database.run( + "INSERT INTO claude_design_requests (created_at, method, path, search, request_headers, request_body, response_status, response_body) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", + [ + new Date().toISOString(), + entry.method, + entry.path, + entry.search || "", + truncateText(JSON.stringify(entry.requestHeaders || {})), + truncateText(bodyToLogText(entry.requestBody)), + entry.responseStatus, + truncateText(responseBody) + ] + ); + store.persist(); +} + +function queryRows(database, sql, params) { + const statement = database.prepare(sql); + try { + if (params && params.length) { + statement.bind(params); + } + const rows = []; + while (statement.step()) { + rows.push(statement.getAsObject()); + } + return rows; + } finally { + statement.free(); + } +} + +function fetchUpstreamAsset(upstreamUrl, request, redirectsRemaining = MAX_UPSTREAM_ASSET_REDIRECTS) { + return new Promise((resolve, reject) => { + const transport = upstreamUrl.protocol === "http:" ? http : https; + const upstreamRequest = transport.request( + upstreamUrl, + { + headers: upstreamAssetHeaders(upstreamUrl, request), + method: "GET", + timeout: 12000 + }, + (upstreamResponse) => { + const redirectLocation = headerValue(upstreamResponse.headers.location); + if ( + redirectLocation && + upstreamResponse.statusCode && + upstreamResponse.statusCode >= 300 && + upstreamResponse.statusCode < 400 && + redirectsRemaining > 0 + ) { + upstreamResponse.resume(); + const redirectedUrl = new URL(redirectLocation, upstreamUrl); + resolve(fetchUpstreamAsset(redirectedUrl, request, redirectsRemaining - 1)); + return; + } + + const chunks = []; + upstreamResponse.on("data", (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))); + upstreamResponse.on("end", () => { + resolve({ + body: Buffer.concat(chunks), + contentType: headerValue(upstreamResponse.headers["content-type"]) || guessContentType(upstreamUrl.pathname), + status: upstreamResponse.statusCode || 502, + url: upstreamUrl.toString() + }); + }); + } + ); + upstreamRequest.on("timeout", () => upstreamRequest.destroy(new Error(`Timed out fetching ${upstreamUrl.toString()}`))); + upstreamRequest.on("error", reject); + upstreamRequest.end(); + }); +} + +function fetchUpstreamDesignShell(upstreamUrl, request, redirectsRemaining = MAX_UPSTREAM_ASSET_REDIRECTS) { + return new Promise((resolve, reject) => { + const transport = upstreamUrl.protocol === "http:" ? http : https; + const linkHeaders = []; + const upstreamRequest = transport.request( + upstreamUrl, + { + headers: upstreamDesignShellHeaders(upstreamUrl, request), + method: "GET", + timeout: 4000 + }, + (upstreamResponse) => { + const redirectLocation = headerValue(upstreamResponse.headers.location); + if ( + redirectLocation && + upstreamResponse.statusCode && + upstreamResponse.statusCode >= 300 && + upstreamResponse.statusCode < 400 && + redirectsRemaining > 0 + ) { + upstreamResponse.resume(); + const redirectedUrl = new URL(redirectLocation, upstreamUrl); + resolve(fetchUpstreamDesignShell(redirectedUrl, request, redirectsRemaining - 1)); + return; + } + + linkHeaders.push(...headerValues(upstreamResponse.headers.link)); + const chunks = []; + let totalBytes = 0; + upstreamResponse.on("data", (chunk) => { + const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); + totalBytes += buffer.length; + if (totalBytes <= 512 * 1024) { + chunks.push(buffer); + } + }); + upstreamResponse.on("end", () => { + resolve({ + body: Buffer.concat(chunks).toString("utf8"), + contentType: headerValue(upstreamResponse.headers["content-type"]) || "", + linkHeaders, + status: upstreamResponse.statusCode || 502, + url: upstreamUrl.toString() + }); + }); + } + ); + upstreamRequest.on("information", (info) => { + linkHeaders.push(...headerValues(info.headers?.link)); + }); + upstreamRequest.on("timeout", () => upstreamRequest.destroy(new Error(`Timed out discovering ${upstreamUrl.toString()}`))); + upstreamRequest.on("error", reject); + upstreamRequest.end(); + }); +} + +function upstreamDesignShellHeaders(upstreamUrl, request) { + const cookie = headerValue(request.headers.cookie); + return { + accept: "*/*", + ...(cookie ? { cookie } : {}), + origin: DEFAULT_DESIGN_ORIGIN, + referer: DEFAULT_DESIGN_REFERRER, + "user-agent": + headerValue(request.headers["user-agent"]) || + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" + }; +} + +function upstreamAssetHeaders(upstreamUrl, request) { + const cookie = shouldForwardCookieToAsset(upstreamUrl) ? headerValue(request.headers.cookie) : undefined; + return { + accept: headerValue(request.headers.accept) || defaultAssetAccept(upstreamUrl.pathname), + "accept-encoding": "identity", + "accept-language": headerValue(request.headers["accept-language"]) || "en-US,en;q=0.9", + "cache-control": "no-cache", + ...(cookie ? { cookie } : {}), + pragma: "no-cache", + referer: DEFAULT_DESIGN_REFERRER, + "sec-fetch-dest": assetFetchDest(upstreamUrl.pathname), + "sec-fetch-mode": "no-cors", + "sec-fetch-site": "same-origin", + "user-agent": + headerValue(request.headers["user-agent"]) || + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" + }; +} + +function shouldForwardCookieToAsset(upstreamUrl) { + return upstreamUrl.hostname === DEFAULT_HOST; +} + +function defaultAssetAccept(path) { + if (/\.(?:js|mjs)$/i.test(path)) { + return "*/*"; + } + if (/\.css$/i.test(path)) { + return "text/css,*/*;q=0.1"; + } + if (/\.(?:avif|gif|jpe?g|png|svg|webp|ico)$/i.test(path)) { + return "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8"; + } + if (/\.woff2?$/i.test(path)) { + return "*/*"; + } + return "*/*"; +} + +function assetFetchDest(path) { + if (/\.(?:js|mjs)$/i.test(path)) { + return "script"; + } + if (/\.css$/i.test(path)) { + return "style"; + } + if (/\.(?:avif|gif|jpe?g|png|svg|webp|ico)$/i.test(path)) { + return "image"; + } + if (/\.woff2?$/i.test(path)) { + return "font"; + } + return "empty"; +} + +function sendResponse(response, result) { + const headers = result.headers || {}; + const body = result.body === undefined || result.body === null ? "" : result.body; + const normalizedBody = Buffer.isBuffer(body) ? body : typeof body === "string" ? body : JSON.stringify(body); + response.writeHead(result.status || 200, { + ...headers, + "content-length": Buffer.byteLength(normalizedBody) + }); + response.end(normalizedBody); +} + +function jsonResponse(status, body, headers) { + return { + body, + headers: corsHeaders({ + "cache-control": "no-store", + "content-type": "application/json; charset=utf-8", + ...(headers || {}) + }), + status + }; +} + +function htmlResponse(body) { + return { + body, + headers: corsHeaders({ + "cache-control": "no-store", + "content-type": "text/html; charset=utf-8" + }), + status: 200 + }; +} + +function textResponse(status, body, headers) { + return { + body, + headers: corsHeaders(headers || { "content-type": "text/plain; charset=utf-8" }), + status + }; +} + +function redirectResponse(status, location) { + return { + body: "", + headers: corsHeaders({ + "cache-control": "no-store", + location + }), + status + }; +} + +function protoResponse(body, headers) { + return binaryResponse(200, body || Buffer.alloc(0), { + "cache-control": "no-store", + "connect-protocol-version": "1", + "content-type": "application/proto", + ...(headers || {}) + }); +} + +function binaryResponse(status, body, headers) { + return { + body, + headers: corsHeaders(headers || { "content-type": "application/octet-stream" }), + status + }; +} + +function corsHeaders(headers) { + return { + "access-control-allow-headers": + "authorization, connect-protocol-version, content-type, x-client-version, x-omelette-tab-id, x-organization-uuid, x-requested-with", + "access-control-allow-methods": "DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT", + "access-control-allow-origin": "*", + ...headers + }; +} + +function readRequestBody(request) { + return new Promise((resolve, reject) => { + const chunks = []; + request.on("data", (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))); + request.once("end", () => resolve(decodeRequestBodyEncoding(Buffer.concat(chunks), request.headers?.["content-encoding"]))); + request.once("error", reject); + }); +} + +function decodeRequestBodyEncoding(body, encodingValue) { + if (!Buffer.isBuffer(body) || body.length === 0) { + return body; + } + const encodings = stringValue(headerValue(encodingValue))?.toLowerCase() + .split(",") + .map((item) => item.trim()) + .filter(Boolean) || []; + if (encodings.length === 0 && body[0] === 0x1f && body[1] === 0x8b) { + encodings.push("gzip"); + } + if (encodings.length === 0 || encodings.every((encoding) => encoding === "identity")) { + return body; + } + + try { + return encodings + .reverse() + .reduce((current, encoding) => decodeSingleRequestBodyEncoding(current, encoding), body); + } catch { + return body; + } +} + +function decodeSingleRequestBodyEncoding(body, encoding) { + if (encoding === "gzip" || encoding === "x-gzip") { + return zlib.gunzipSync(body); + } + if (encoding === "br") { + return zlib.brotliDecompressSync(body); + } + if (encoding === "deflate") { + try { + return zlib.inflateSync(body); + } catch { + return zlib.inflateRawSync(body); + } + } + return body; +} + +function renderDesignIndex(me, scriptPath, stylePath, html) { + if (isUsableDesignShellHtml(html)) { + return injectDesignMeIntoHtml(String(html), me); + } + return renderDefaultDesignIndex(me, scriptPath, stylePath); +} + +function renderDefaultDesignIndex(me, scriptPath, stylePath, options = {}) { + const defaultAssetPreloads = options.defaultAssetPreloads !== false; + const normalizedScriptPath = normalizePath(scriptPath) || DEFAULT_SCRIPT_PATH; + const normalizedStylePath = normalizePath(stylePath) || (defaultAssetPreloads ? DEFAULT_STYLE_PATH : ""); + const criticalModulePreloads = defaultAssetPreloads + ? renderModulePreloadLinks(DEFAULT_DESIGN_CRITICAL_MODULE_PRELOAD_PATHS) + : ""; + const lazyModulePreloads = defaultAssetPreloads + ? renderModulePreloadLinks(DEFAULT_DESIGN_LAZY_MODULE_PRELOAD_PATHS, true) + : ""; + const stylePreloads = defaultAssetPreloads + ? DEFAULT_DESIGN_STYLE_PRELOAD_PATHS + .map((href) => ` `) + .join("\n") + : ""; + const stylesheetLink = normalizedStylePath + ? ` ` + : ""; + return ` + + + + + Claude Design + + ${claudeAppDesktopFeaturesScript()} + + +${criticalModulePreloads} +${stylesheetLink} +${lazyModulePreloads} +${stylePreloads} + + + ${designMeJsonScript(me)} + ${designModelPreferenceResetScript(me)} + ${designMeGlobalScript(me)} +
+ + +`; +} + +function renderModulePreloadLinks(paths, lowPriority = false) { + return paths + .map((href) => { + const priority = lowPriority ? " fetchpriority=\"low\"" : ""; + return ` `; + }) + .join("\n"); +} + +function injectDesignMeIntoHtml(html, me) { + let nextHtml = html; + const meJsonScript = designMeJsonScript(me); + const meJsonPattern = /]*\bid=["']omelette-me["'])[^>]*>[\s\S]*?<\/script>/i; + if (meJsonPattern.test(nextHtml)) { + nextHtml = nextHtml.replace(meJsonPattern, meJsonScript); + } + + const earlySnippets = []; + const snippets = []; + if (!nextHtml.includes("ccr-claude-app-desktop-features")) { + earlySnippets.push(claudeAppDesktopFeaturesScript()); + } + if (!meJsonPattern.test(nextHtml)) { + snippets.push(meJsonScript); + } + if (!nextHtml.includes("ccr-claude-design-model-reset")) { + snippets.push(designModelPreferenceResetScript(me)); + } + if (!nextHtml.includes("__OMELETTE_ME__")) { + snippets.push(designMeGlobalScript(me)); + } + if (earlySnippets.length) { + nextHtml = injectHtmlAfterHeadOpen(nextHtml, earlySnippets.join("\n ")); + } + if (!snippets.length) { + return nextHtml; + } + return injectHtmlAfterBodyOpen(nextHtml, snippets.join("\n ")); +} + +function injectHtmlAfterHeadOpen(html, snippet) { + if (/]*>/i.test(html)) { + return html.replace(/]*)>/i, `\n ${snippet}`); + } + return injectHtmlAfterBodyOpen(html, snippet); +} + +function injectHtmlAfterBodyOpen(html, snippet) { + if (/]*>/i.test(html)) { + return html.replace(/]*)>/i, `\n ${snippet}`); + } + return `${snippet}\n${html}`; +} + +function designMeJsonScript(me) { + return ``; +} + +function designMeGlobalScript(me) { + return ``; +} + +function claudeAppDesktopFeaturesScript() { + return ``; +} + +function designModelPreferenceResetScript(me) { + const defaultModelId = stringValue(me?.defaultModelId) || DEFAULT_GATEWAY_MODEL; + return ``; +} + +function designMePayload(me) { + return { + ...me, + canManageBilling: true + }; +} + +function isUsableDesignShellHtml(value) { + const html = stringValue(value); + if (!html) { + return false; + } + if (!/]/i.test(html) || !/]*\bsrc=/i.test(html)) { + return false; + } + if (/\bJust a moment\b|cf_chl|Performing security verification|App unavailable in region/i.test(html)) { + return false; + } + const hasAssetReferences = /(?:src|href)=["'][^"']*(?:\/design)?\/assets\//i.test(html); + const hasDesignShellMarkers = /anthropic\.omelette|OmeletteService|__OMELETTE_ME__|\/v1\/design/i.test(html); + const hasClaudeAppShellMarkers = /]*\bid=["']root["'][^>]*>/i.test(html) && + /\/assets\/v\d+\/index-[^"']+\.js/i.test(html) && + /data-build-id=|data-color-version=|Claude is Anthropic/i.test(html); + return hasAssetReferences && (hasDesignShellMarkers || hasClaudeAppShellMarkers); +} + +function normalizeMe(value, defaultGatewayModel = DEFAULT_GATEWAY_MODEL, gatewayModelPresets = undefined) { + const overrides = isRecord(value) ? value : {}; + const defaultModelId = publicGatewayModelSelector(defaultGatewayModel) || DEFAULT_GATEWAY_MODEL; + const me = { + ...DEFAULT_ME, + ...overrides + }; + if (!stringValue(overrides.defaultModelId)) { + me.defaultModelId = defaultModelId; + } + if (!Array.isArray(me.memberships) || me.memberships.length === 0) { + me.memberships = [ + { + name: me.orgName, + uuid: me.organizationUuid + } + ]; + } + if (!Array.isArray(overrides.modelPresets)) { + me.modelPresets = Array.isArray(gatewayModelPresets) && gatewayModelPresets.length > 0 + ? gatewayModelPresets + : defaultClaudeDesignModelPresets(me.defaultModelId); + } else if (!me.modelPresets.some((preset) => isRecord(preset) && stringValue(preset.id) === me.defaultModelId)) { + me.modelPresets = [defaultClaudeDesignModelPreset(me.defaultModelId), ...me.modelPresets]; + } + return me; +} + +function defaultClaudeDesignModelPresets(defaultModelId) { + const presets = DEFAULT_ME.modelPresets.map((preset) => ({ ...preset })); + if (defaultModelId === DEFAULT_GATEWAY_MODEL) { + return presets; + } + return [ + defaultClaudeDesignModelPreset(defaultModelId), + ...presets.filter((preset) => preset.id !== defaultModelId) + ]; +} + +function defaultClaudeDesignModelPreset(defaultModelId) { + if (defaultModelId === DEFAULT_GATEWAY_MODEL) { + return { ...DEFAULT_ME.modelPresets[0] }; + } + return { + id: defaultModelId, + label: "Default Gateway Model", + maxTokens: 1000000, + supportsAdaptiveThinking: true, + description: "Uses the CCR gateway default" + }; +} + +function stringArray(value) { + if (!Array.isArray(value)) { + return undefined; + } + const values = value.map((item) => normalizePath(String(item || ""))).filter(Boolean); + return values.length ? values : undefined; +} + +function parseJsonBody(buffer) { + return parseMaybeJson(buffer.toString("utf8") || "{}", {}); +} + +function parseMaybeJson(value, fallback) { + if (typeof value !== "string") { + return value === undefined ? fallback : value; + } + try { + return JSON.parse(value); + } catch { + return fallback; + } +} + +function bodyToLogText(value) { + if (Buffer.isBuffer(value)) { + const text = value.toString("utf8"); + return looksBinary(text) ? `` : text; + } + if (typeof value === "string") { + return value; + } + return JSON.stringify(value); +} + +function looksBinary(value) { + return value.includes("\u0000"); +} + +function truncateText(value) { + const text = String(value || ""); + return text.length > MAX_LOG_BODY_CHARS ? `${text.slice(0, MAX_LOG_BODY_CHARS)}...` : text; +} + +function normalizePath(value) { + if (!value) { + return ""; + } + const trimmed = String(value).trim(); + if (!trimmed) { + return ""; + } + return trimmed.startsWith("/") ? trimmed : `/${trimmed}`; +} + +function parseAbsoluteHttpUrl(value) { + const raw = stringValue(value); + if (!raw) { + return undefined; + } + try { + const parsed = new URL(raw); + return parsed.protocol === "http:" || parsed.protocol === "https:" ? parsed : undefined; + } catch { + return undefined; + } +} + +function stringValue(value) { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function configuredGatewayApiKey(config) { + if (!isRecord(config)) { + return undefined; + } + const legacy = stringValue(config.APIKEY); + if (legacy) { + return legacy; + } + const apiKeys = Array.isArray(config.APIKEYS) ? config.APIKEYS : []; + for (const apiKey of apiKeys) { + if (isRecord(apiKey)) { + const key = stringValue(apiKey.key); + if (key) { + return key; + } + } + } + return undefined; +} + +function numberValue(value) { + const number = Number(value); + return Number.isFinite(number) ? number : undefined; +} + +function headerValue(value) { + if (Array.isArray(value)) { + return value[0]; + } + return typeof value === "string" ? value : undefined; +} + +function headerValues(value) { + if (Array.isArray(value)) { + return value.filter((item) => typeof item === "string" && item); + } + return typeof value === "string" && value ? [value] : []; +} + +function headerIncludes(value, token) { + return Boolean(headerValue(value)?.toLowerCase().includes(token.toLowerCase())); +} + +function randomUuid() { + return crypto.randomUUID(); +} + +function guessContentType(path) { + if (path.endsWith(".html") || path.endsWith(".htm")) { + return "text/html; charset=utf-8"; + } + if (path.endsWith(".css")) { + return "text/css; charset=utf-8"; + } + if (path.endsWith(".jsx")) { + return "text/jsx; charset=utf-8"; + } + if (path.endsWith(".js") || path.endsWith(".mjs")) { + return "application/javascript; charset=utf-8"; + } + if (path.endsWith(".png")) { + return "image/png"; + } + if (path.endsWith(".svg")) { + return "image/svg+xml"; + } + if (path.endsWith(".json")) { + return "application/json; charset=utf-8"; + } + if (path.endsWith(".woff2")) { + return "font/woff2"; + } + return "application/octet-stream"; +} + +function escapeJsonForScript(value) { + return JSON.stringify(value, null, 16) + .replace(//g, "\\u003e") + .replace(/&/g, "\\u0026") + .replace(/\u2028/g, "\\u2028") + .replace(/\u2029/g, "\\u2029"); +} + +function escapeHtmlAttribute(value) { + return String(value).replace(/&/g, "&").replace(/"/g, """).replace(/.js", + // "stylePath": "/design/assets/v1/index-.css", + "upstreamOrigin": "https://claude.ai", + // Optional. Missing lazy-loaded assets are fetched from these origins in order. + "upstreamOrigins": ["https://claude.ai"], + "gatewayUrl": "http://127.0.0.1:3456", + // Optional. Required only when CCR has API keys configured. + "gatewayApiKey": "", + // Optional. Used when old Claude Design model ids need a gateway-safe fallback. + // Defaults to Router.default, then claude-sonnet-4-20250514. + "defaultGatewayModel": "claude-sonnet-4-20250514", + // Optional. Controls the model selected by Claude Design on first load. + // Defaults to claude-sonnet-4-20250514 instead of Router.default. + "frontendDefaultModel": "claude-sonnet-4-20250514", + // Optional. Also configurable from the Extensions page. Targets use CCR provider/model selectors. + "routing": { + "enabled": true, + // Add rules here only when the target provider name exists in your Providers config. + // Example target formats: "your-provider,model-id" or "your-provider/model-id". + "rules": [] + }, + "me": { + "accountUuid": "12345678", + "organizationUuid": "87654321", + "email": "aa@example.com", + "displayName": "aa", + "orgName": "aa's Organization" + } + } + } + ] +} diff --git a/examples/plugins/cursor-proxy-plugin.cjs b/examples/plugins/cursor-proxy-plugin.cjs new file mode 100644 index 0000000..94f20d0 --- /dev/null +++ b/examples/plugins/cursor-proxy-plugin.cjs @@ -0,0 +1,7080 @@ +"use strict"; + +const http = require("node:http"); +const https = require("node:https"); +const fs = require("node:fs"); +const os = require("node:os"); +const path = require("node:path"); +const zlib = require("node:zlib"); + +const DEFAULT_CURSOR_HOSTS = [ + "api.cursor.sh", + "api2.cursor.sh", + "api3.cursor.sh", + "api4.cursor.sh", + "api.cursor.com", + "api2.cursor.com", + "*.cursor.sh", + "*.cursor.com", + "*.cursorapi.com" +]; + +const HOP_BY_HOP_HEADERS = new Set([ + "connection", + "keep-alive", + "proxy-authenticate", + "proxy-authorization", + "proxy-connection", + "te", + "trailer", + "transfer-encoding", + "upgrade" +]); + +const INTERNAL_HEADER_PREFIX = "x-ccr-"; +const DEFAULT_GATEWAY_URL = "http://127.0.0.1:3456"; +const MAX_JSON_SCAN_DEPTH = 8; +const DEFAULT_BIDI_WAIT_MS = 15000; +const DEFAULT_BIDI_SETTLE_MS = 500; +const DEFAULT_BIDI_MAX_SETTLE_MS = 2000; +const DEFAULT_BIDI_MISSING_CONTEXT_WAIT_MS = 6000; +const DEFAULT_BIDI_SESSION_TTL_MS = 10 * 60 * 1000; +const DEFAULT_CURSOR_CONTEXT_TTL_MS = 2 * 60 * 1000; +const DEFAULT_CURSOR_CONTEXT_MAX_ENTRIES = 64; +const DEFAULT_GATEWAY_TIMEOUT_MS = 10 * 60 * 1000; +const DEFAULT_CURSOR_TOOL_BRIDGE_TIMEOUT_MS = 2 * 60 * 1000; +const DEFAULT_CURSOR_TOOL_BRIDGE_MAX_ROUNDS = 8; +const DEFAULT_PASSTHROUGH_LOG_LIMIT = 3; +const DEFAULT_DECODE_DIAGNOSTIC_SAMPLE_LIMIT = 8; +const DEFAULT_DECODE_DIAGNOSTIC_SAMPLE_CHARS = 180; +const DEFAULT_DECODE_DUMP_DIR = path.join(os.tmpdir(), "ccr-cursor-decode-dumps"); +const DEFAULT_DECODE_TREE_DEPTH = 12; +const CURSOR_PROXY_ROUTE_TYPES = new Set(["always", "image", "long-context", "model", "model-prefix", "thinking", "web-search"]); +const CURSOR_NATIVE_RPC_PATH_PATTERN = /^\/(?:aiserver|agent)\.v\d+\.[^/]+\/[^/]+$/i; +const CURSOR_NATIVE_LLM_SERVICE_PATTERN = + /^(?:AiService|AgentService|ChatService|ComposerService|CppService|TerminalService)$/i; +const CURSOR_NATIVE_LLM_METHOD_PATTERN = + /^(?:(?:Stream|Run|Generate|Create|Submit|Start).*(?:Agent|Chat|Completion|Completions|Composer|Cpp|Edit|Edits|Inline|Message|Prompt|Response|Terminal)|Complete(?:Chat|Completion|Edit|Inline|Terminal).*)$/i; +const CURSOR_NATIVE_SUPPORTED_TOOL_FIELDS = new Set([29, 51]); +const CURSOR_NATIVE_SUPPORTED_TOOL_ENUM_NAMES = new Map([ + [1, "READ_SEMSEARCH_FILES"], + [3, "RIPGREP_SEARCH"], + [5, "READ_FILE"], + [6, "LIST_DIR"], + [8, "FILE_SEARCH"], + [9, "SEMANTIC_SEARCH_FULL"], + [39, "LIST_DIR_V2"], + [40, "READ_FILE_V2"], + [41, "RIPGREP_RAW_SEARCH"], + [42, "GLOB_FILE_SEARCH"] +]); +const CURSOR_NATIVE_SUPPORTED_TOOL_TO_SPEC_NAME = new Map([ + [3, "grep_search"], + [5, "read_file"], + [6, "list_dir"], + [8, "glob_file_search"], + [9, "codebase_search"], + [39, "list_dir"], + [40, "read_file"], + [41, "grep_search"], + [42, "glob_file_search"] +]); +const CURSOR_NATIVE_BUILTIN_TOOL_NAMES = [ + "read_file", + "list_dir", + "grep_search", + "glob_file_search", + "codebase_search", + "shell", + "delete_file", + "edit_file", + "read_lints", + "web_search", + "web_fetch", + "task", + "await_task", + "todo_read", + "todo_write", + "ask_question", + "switch_mode", + "generate_image", + "list_mcp_resources", + "read_mcp_resource", + "get_mcp_tools", + "call_mcp_tool", + "set_active_branch" +]; +const CURSOR_SYSTEM_PROMPT_KEYS = [ + "customInstruction", + "customInstructions", + "developer", + "developerInstruction", + "developerInstructions", + "developerPrompt", + "globalInstruction", + "globalInstructions", + "instructions", + "roleInstruction", + "roleInstructions", + "system", + "systemInstruction", + "systemInstructions", + "systemPrompt", + "system_prompt" +]; +const CURSOR_TOOL_KEYS = [ + "availableTools", + "available_tools", + "availableToolSchemas", + "available_tool_schemas", + "clientSideToolDefinitions", + "clientSideTools", + "functionDefinitions", + "function_definitions", + "functions", + "mcpTools", + "mcp_tools", + "toolSchemas", + "tool_schemas", + "toolDefinitions", + "tool_definitions", + "tools" +]; +const CURSOR_TOOL_CHOICE_KEYS = [ + "toolChoice", + "toolSelection", + "tool_choice", + "tool_selection" +]; +const UUID_PATTERN = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i; + +module.exports = { + async setup(ctx) { + const options = isRecord(ctx.pluginConfig) ? ctx.pluginConfig : {}; + const gatewayUrl = trimTrailingSlash(stringValue(options.gatewayUrl) || configuredGatewayUrl(ctx.config)); + const gatewayApiKey = stringValue(options.gatewayApiKey) || configuredGatewayApiKey(ctx.config); + const hosts = normalizeStringList(options.hosts, options.host) || DEFAULT_CURSOR_HOSTS; + const paths = options.paths === false ? undefined : normalizePathList(options.paths); + + const runtime = { + bidiSessionTtlMs: numberOption(options.bidiSessionTtlMs, DEFAULT_BIDI_SESSION_TTL_MS), + bidiMaxSettleMs: numberOption(options.bidiMaxSettleMs, DEFAULT_BIDI_MAX_SETTLE_MS), + bidiMissingContextWaitMs: numberOption(options.bidiMissingContextWaitMs, DEFAULT_BIDI_MISSING_CONTEXT_WAIT_MS), + bidiSettleMs: numberOption(options.bidiSettleMs, DEFAULT_BIDI_SETTLE_MS), + bidiSessions: new Map(), + bidiWaitMs: numberOption(options.bidiWaitMs, DEFAULT_BIDI_WAIT_MS), + cursorContextCollector: options.cursorContextCollector !== false, + cursorContextMaxEntries: numberOption(options.cursorContextMaxEntries, DEFAULT_CURSOR_CONTEXT_MAX_ENTRIES), + cursorContextTtlMs: numberOption(options.cursorContextTtlMs, DEFAULT_CURSOR_CONTEXT_TTL_MS), + cursorContexts: new Map(), + cursorBidiProto: options.cursorBidiProto !== false, + cursorConnectJson: options.cursorConnectJson !== false, + cursorNativeProto: options.cursorNativeProto !== false, + cursorNativeLlmMethods: normalizeStringList(options.cursorNativeLlmMethods, options.cursorNativeLlmMethod) || [], + decodeDiagnosticSampleChars: numberOption( + options.decodeDiagnosticSampleChars ?? options.cursorDecodeDiagnosticSampleChars, + DEFAULT_DECODE_DIAGNOSTIC_SAMPLE_CHARS + ), + decodeDiagnosticSampleLimit: numberOption( + options.decodeDiagnosticSampleLimit ?? options.cursorDecodeDiagnosticSampleLimit, + DEFAULT_DECODE_DIAGNOSTIC_SAMPLE_LIMIT + ), + decodeDumpDir: stringValue(options.decodeDumpDir) || + stringValue(options.cursorDecodeDumpDir) || + stringValue(process.env.CCR_CURSOR_DECODE_DUMP_DIR) || + DEFAULT_DECODE_DUMP_DIR, + decodeDumpFull: options.decodeDumpFull !== false && options.cursorDecodeDumpFull !== false, + decodeDiagnostics: options.decodeDiagnostics !== false && options.cursorDecodeDiagnostics !== false, + decodeTreeDepth: numberOption(options.decodeTreeDepth ?? options.cursorDecodeTreeDepth, DEFAULT_DECODE_TREE_DEPTH), + forwardDecodedCursorTools: options.forwardDecodedCursorTools !== false && options.cursorForwardDecodedTools !== false, + forwardCursorNativeBuiltinTools: options.forwardCursorNativeBuiltinTools !== false && + options.cursorForwardNativeBuiltinTools !== false, + bridgeOpenAIToolCalls: options.bridgeOpenAIToolCalls !== false && options.cursorBridgeOpenAIToolCalls !== false, + showUnbridgedToolCallWarning: options.showUnbridgedToolCallWarning === true || + options.cursorShowUnbridgedToolCallWarning === true, + toolCallBridgeTimeoutMs: numberOption( + options.toolCallBridgeTimeoutMs ?? options.cursorToolCallBridgeTimeoutMs, + DEFAULT_CURSOR_TOOL_BRIDGE_TIMEOUT_MS + ), + maxToolCallRounds: numberOption( + options.maxToolCallRounds ?? options.cursorMaxToolCallRounds, + DEFAULT_CURSOR_TOOL_BRIDGE_MAX_ROUNDS + ), + inlineToolCallContinuation: options.inlineToolCallContinuation === true || + options.cursorInlineToolCallContinuation === true, + cursorMcpSkipApproval: options.cursorMcpSkipApproval === true || options.mcpSkipApproval === true, + chatCompletionSystemPrompt: stringValue(options.systemPrompt) || + stringValue(options.openaiSystemPrompt) || + stringValue(options.defaultSystemPrompt), + chatCompletionToolChoice: normalizeToolChoice( + options.toolChoice ?? options.openaiToolChoice ?? options.defaultToolChoice + ), + chatCompletionTools: normalizeConfiguredTools(options.tools ?? options.openaiTools ?? options.defaultTools), + defaultModel: stringValue(options.defaultModel) || configuredDefaultModel(ctx.config), + fallbackToCursor: options.fallbackToCursor !== false, + gatewayApiKey, + gatewayTimeoutMs: numberOption(options.gatewayTimeoutMs, DEFAULT_GATEWAY_TIMEOUT_MS), + gatewayUrl, + logger: ctx.logger, + options, + passthroughLogCounts: new Map(), + passthroughLogLimit: numberOption(options.passthroughLogLimit, DEFAULT_PASSTHROUGH_LOG_LIMIT), + routing: normalizeCursorProxyRouting(options.routing, options), + targetModel: stringValue(options.targetModel), + targetProvider: stringValue(options.targetProvider), + targetProviders: stringValue(options.targetProviders), + warnedMissingChatContext: false, + warnedSuppressedDecodedCursorTools: false + }; + + const backend = await ctx.registerHttpBackend({ + id: "cursor-proxy-adapter", + async handler(request, response) { + await handleCursorProxyRequest(runtime, request, response); + } + }); + + hosts.forEach((host, index) => { + ctx.registerProxyRoute({ + host, + id: `cursor-proxy-${host.replace(/[^a-z0-9]+/gi, "-") || index}`, + paths, + preserveHost: true, + upstream: backend.url + }); + }); + + ctx.registerGatewayRoute({ + auth: "none", + handler(_request, response, helpers) { + helpers.sendJson(response, 200, { + backend: backend.url, + bidiMaxSettleMs: runtime.bidiMaxSettleMs, + bidiMissingContextWaitMs: runtime.bidiMissingContextWaitMs, + bidiSettleMs: runtime.bidiSettleMs, + cursorBidiProto: runtime.cursorBidiProto, + cursorConnectJson: runtime.cursorConnectJson, + cursorNativeProto: runtime.cursorNativeProto, + fallbackToCursor: runtime.fallbackToCursor, + gatewayUrl, + hosts, + collector: { + auth: options.collectorAuth === "gateway" ? "gateway" : "none", + contexts: runtime.cursorContexts.size, + enabled: runtime.cursorContextCollector, + endpoints: runtime.cursorContextCollector ? ["POST /plugins/cursor-proxy/collector"] : [], + maxEntries: runtime.cursorContextMaxEntries, + ttlMs: runtime.cursorContextTtlMs + }, + debug: { + auth: options.debugAuth === "gateway" ? "gateway" : "none", + endpoints: ["GET /plugins/cursor-proxy/debug/sessions"] + }, + openaiCompatContext: { + systemPrompt: Boolean(runtime.chatCompletionSystemPrompt), + toolChoice: runtime.chatCompletionToolChoice !== undefined, + tools: runtime.chatCompletionTools.length + }, + agentRunToolForwarding: { + bridgeOpenAIToolCalls: runtime.bridgeOpenAIToolCalls, + cursorMcpSkipApproval: runtime.cursorMcpSkipApproval, + forwardDecodedCursorTools: runtime.forwardDecodedCursorTools, + forwardCursorNativeBuiltinTools: runtime.forwardCursorNativeBuiltinTools, + inlineToolCallContinuation: runtime.inlineToolCallContinuation, + maxToolCallRounds: runtime.maxToolCallRounds, + toolCallBridgeTimeoutMs: runtime.toolCallBridgeTimeoutMs, + showUnbridgedToolCallWarning: runtime.showUnbridgedToolCallWarning + }, + paths: paths || ["*"], + plugin: "cursor-proxy", + routing: { + defaultTarget: runtime.routing.defaultTarget || undefined, + enabled: runtime.routing.enabled, + rules: runtime.routing.rules.length + }, + sessions: runtime.bidiSessions.size, + targetModel: runtime.targetModel || undefined, + targetProvider: runtime.targetProvider || undefined, + targetProviders: runtime.targetProviders || undefined + }); + }, + id: "cursor-proxy-status", + method: "GET", + path: "/plugins/cursor-proxy" + }); + + ctx.registerGatewayRoute({ + auth: options.debugAuth === "gateway" ? "gateway" : "none", + handler(_request, response, helpers) { + helpers.sendJson(response, 200, { + collector: { + contexts: runtime.cursorContexts.size, + ttlMs: runtime.cursorContextTtlMs + }, + plugin: "cursor-proxy", + sessions: describeBidiSessions(runtime) + }); + }, + id: "cursor-proxy-debug-sessions", + method: "GET", + path: "/plugins/cursor-proxy/debug/sessions" + }); + + if (runtime.cursorContextCollector) { + ctx.registerGatewayRoute({ + auth: options.collectorAuth === "gateway" ? "gateway" : "none", + handler(request, response, helpers) { + return handleCursorContextCollector(runtime, request, response, helpers); + }, + id: "cursor-proxy-context-collector", + method: "POST", + pathPrefix: "/plugins/cursor-proxy/collector" + }); + } + + ctx.logger.info( + `Cursor proxy adapter listening at ${backend.url} for ${hosts.join(", ")} ` + + `(${paths?.join(", ") || "all paths"}) and forwarding JSON and Cursor Agent LLM traffic to ${gatewayUrl}` + ); + } +}; + +async function handleCursorProxyRequest(runtime, request, response) { + const originalUrl = originalRequestUrl(request); + const url = new URL(request.url || "/", "http://cursor-proxy.local"); + const method = (request.method || "GET").toUpperCase(); + + if (method === "OPTIONS") { + response.writeHead(204, corsHeaders()); + response.end(); + return; + } + + const requestBody = await readRequestBody(request); + if (runtime.cursorBidiProto) { + const handled = await handleCursorBidiProtoRequest(runtime, request, response, url, requestBody, originalUrl); + if (handled) { + return; + } + } + if (runtime.cursorNativeProto) { + const handled = await handleCursorNativeProtoRequest(runtime, request, response, url, requestBody); + if (handled) { + return; + } + } + + const route = resolveGatewayRoute(runtime, request, url, requestBody); + + if (!route) { + if (runtime.fallbackToCursor && originalUrl) { + logCursorPassthrough(runtime, method, url.pathname, request.headers); + await forwardToUrl({ + body: requestBody, + headers: buildPassthroughHeaders(request.headers, originalUrl), + method, + response, + url: originalUrl + }); + return; + } + + sendJson(response, 415, { + error: { + code: "unsupported_cursor_request", + message: + "Cursor proxy could not map this request to a CCR gateway protocol. " + + "OpenAI, Anthropic, Gemini JSON requests and Cursor Agent RunSSE protobuf requests are supported; other native Cursor RPC is passed through when fallbackToCursor is enabled." + } + }); + return; + } + + await forwardToUrl({ + body: route.body, + headers: buildGatewayHeaders(runtime, request.headers, route, route.body), + method: route.method, + response, + url: new URL(route.path, runtime.gatewayUrl) + }); +} + +async function handleCursorContextCollector(runtime, request, response, helpers) { + const body = await helpers.readBody(request); + const payload = readJsonLikePayload(body); + if (!isRecord(payload)) { + helpers.sendJson(response, 400, { + error: { + code: "invalid_cursor_context", + message: "Cursor context collector expects a JSON object." + } + }); + return; + } + + const chatRequest = normalizeCollectedCursorChatRequest(runtime, payload); + if (!chatRequest) { + helpers.sendJson(response, 400, { + error: { + code: "unsupported_cursor_context", + message: + "Cursor context collector could not find chat messages, system instructions, or tools in this payload." + } + }); + return; + } + + const keys = collectCursorContextKeys(payload, chatRequest); + const stored = storeCursorContext(runtime, { + chatRequest, + createdAt: Date.now(), + keys, + summary: summarizeChatRequest(chatRequest) + }); + + helpers.sendJson(response, 200, { + contextKeys: stored.keys, + stored: true, + summary: formatChatSummary(stored.summary) + }); +} + +async function handleCursorBidiProtoRequest(runtime, request, response, url, requestBody) { + const method = (request.method || "GET").toUpperCase(); + const path = normalizePath(url.pathname); + if (method !== "POST") { + return false; + } + + if (path === "/aiserver.v1.BidiService/BidiAppend") { + const append = decodeBidiAppendRequest(requestBody); + if (!append.requestId) { + const waitingSession = findSingleWaitingBidiSession(runtime); + if (!waitingSession) { + return false; + } + append.requestId = waitingSession.requestId; + runtime.logger?.debug?.( + `Cursor proxy inferred BidiAppend request id ${append.requestId} from the only waiting RunSSE session ` + + `(seq=${append.appendSeqno}, body=${requestBody.length}, body_hex=${append.bodyHex}, decoded_body=${append.rpcBodyEncoding}, ` + + `decoded_hex=${append.rpcBodyHex}, fields=${formatProtoFieldSummary(append.rpcBody)}).` + ); + } + + const session = getBidiSession(runtime, append.requestId, true); + const runRequest = appendBidiSessionRequest(session, append); + if (runRequest) { + setBidiSessionRunRequest(session, runRequest); + runtime.logger?.debug?.( + `Cursor proxy captured AgentRunRequest for Bidi request ${append.requestId} ` + + `(seq=${append.appendSeqno}, appends=${session.appends.size}, ${formatAgentRunRequestSummary(runtime, runRequest)}).` + ); + } else if (session.waiters.length > 0) { + runtime.logger?.debug?.( + `Cursor proxy buffered BidiAppend for ${append.requestId} but has not decoded AgentRunRequest yet ` + + `(seq=${append.appendSeqno}, body=${requestBody.length}, body_hex=${append.bodyHex}, decoded_body=${append.rpcBodyEncoding}, ` + + `decoded_hex=${append.rpcBodyHex}, data=${append.data.length}, ` + + `data_bytes=${append.dataBytes.length}, data_hex=${append.dataHex}, data_binary=${append.dataBinary.length}, appends=${session.appends.size}, ` + + `combined_data=${combinedAppendDataLength(session)}, combined_data_bytes=${combinedAppendDataBytesLength(session)}, combined_data_binary=${combinedAppendDataBinaryLength(session)}, ` + + `fields=${formatProtoFieldSummary(append.rpcBody)}, data_binary_fields=${formatProtoFieldSummary(append.dataBinary)}).` + ); + logCursorDecodeDiagnostics( + runtime, + "debug", + `Cursor proxy BidiAppend decode diagnostics for ${append.requestId}: ` + + formatBidiSessionDecodeDiagnostic(runtime, session) + ); + } + + sendBinary(response, 200, Buffer.alloc(0), protoHeaders()); + return true; + } + + if (path === "/agent.v1.AgentService/RunSSE") { + const runSse = decodeRunSseRequest(requestBody); + const requestId = runSse.requestId || (runSse.runRequest ? createSyntheticBidiRequestId() : ""); + if (!requestId) { + logCursorDecodeDiagnostics( + runtime, + "warn", + `Cursor proxy could not identify AgentService/RunSSE request id ` + + `(body=${requestBody.length}, decoded_body=${runSse.rpcBodyEncoding}, fields=${formatProtoFieldSummary(runSse.rpcBody)}, ` + + `candidates=${formatCandidateBufferSummary(runtime, runSse.candidates)}).` + ); + return false; + } + + const session = getBidiSession(runtime, requestId, true); + session.lastSeen = Date.now(); + if (runSse.runRequest) { + setBidiSessionRunRequest(session, runSse.runRequest); + runtime.logger?.debug?.( + `Cursor proxy captured AgentRunRequest from AgentService/RunSSE body for Bidi request ${requestId} ` + + `(body=${requestBody.length}, fields=${formatProtoFieldSummary(runSse.rpcBody)}, ` + + `${formatAgentRunRequestSummary(runtime, runSse.runRequest)}).` + ); + const chatRequest = convertAgentRunRequestToOpenAIChat(runtime, runSse.runRequest); + if (chatRequest && isSimplifiedAgentChatRequest(chatRequest)) { + logCursorDecodeDiagnostics( + runtime, + "warn", + `Cursor proxy RunSSE AgentRunRequest decoded without Cursor context for ${requestId}: ` + + formatAgentRunRequestDecodeDiagnostic(runtime, runSse.runRequest, chatRequest) + + `; runsse_candidates=${formatCandidateBufferSummary(runtime, runSse.candidates)}` + ); + } else { + logCursorDecodeDiagnostics( + runtime, + "debug", + `Cursor proxy RunSSE decode diagnostics for ${requestId}: ` + + formatAgentRunRequestDecodeDiagnostic(runtime, runSse.runRequest, chatRequest) + + `; runsse_candidates=${formatCandidateBufferSummary(runtime, runSse.candidates)}` + ); + } + } + if (!session.runRequest) { + const runRequest = extractAgentRunRequestFromBidiSession(session); + if (runRequest) { + setBidiSessionRunRequest(session, runRequest); + } + } + runtime.logger?.debug?.(`Cursor proxy handling AgentService/RunSSE for Bidi request ${requestId}.`); + await handleAgentRunSse(runtime, request, response, session); + return true; + } + + return false; +} + +async function handleAgentRunSse(runtime, request, response, session) { + response.writeHead(200, corsHeaders(connectProtoHeaders())); + + const initialRunRequest = session.runRequest || await waitForBidiRunRequest(session, runtime.bidiWaitMs); + if (!initialRunRequest) { + runtime.logger?.warn?.( + `Cursor proxy timed out waiting for BidiAppend AgentRunRequest for ${session.requestId} ` + + `(${formatBidiSessionDiagnostic(session)}).` + ); + writeCursorConnectMessage(response, encodeCursorAgentTextDelta( + "Cursor proxy did not receive the AgentRunRequest payload for this RunSSE request." + )); + writeCursorConnectMessage(response, encodeCursorAgentTurnEnded()); + finishCursorConnectStream(response); + return; + } + + await waitForBidiRunRequestSettle(session, runtime.bidiSettleMs, runtime.bidiMaxSettleMs); + const runRequest = session.runRequest || initialRunRequest; + let chatRequest = convertAgentRunRequestToOpenAIChat(runtime, runRequest); + if (!chatRequest) { + runtime.logger?.warn?.(`Cursor proxy could not decode AgentRunRequest ${session.requestId} into chat messages.`); + writeCursorConnectMessage(response, encodeCursorAgentTextDelta( + "Cursor proxy could not decode this Cursor Agent request into a gateway chat request." + )); + writeCursorConnectMessage(response, encodeCursorAgentTurnEnded()); + finishCursorConnectStream(response); + return; + } + + chatRequest = applyCollectedCursorContext(runtime, session, runRequest, chatRequest); + + if (isSimplifiedAgentChatRequest(chatRequest) && runtime.bidiMissingContextWaitMs > 0) { + const richer = await waitForRicherBidiChatRequest(runtime, session, runtime.bidiMissingContextWaitMs, chatRequest); + if (richer) { + chatRequest = richer.chatRequest; + } + } + + chatRequest = applyCollectedCursorContext(runtime, session, session.runRequest || runRequest, chatRequest); + logAgentChatConversion(runtime, session, chatRequest); + await streamAgentChatWithCursorToolBridge(runtime, request, response, session, chatRequest); +} + +async function streamAgentChatWithCursorToolBridge(runtime, request, response, session, initialChatRequest) { + let chatRequest = initialChatRequest; + let runRequest = session.runRequest; + let observedRunRequestVersion = session.runRequestVersion || 0; + const maxRounds = Math.max(1, Math.trunc(Number(runtime.maxToolCallRounds) || DEFAULT_CURSOR_TOOL_BRIDGE_MAX_ROUNDS)); + + for (let round = 0; round < maxRounds; round += 1) { + const bridgeContext = buildCursorToolBridgeContext(runtime, session, runRequest, chatRequest, round); + const outcome = await streamGatewayChatToCursor(runtime, request, response, chatRequest, bridgeContext); + if (!outcome || outcome.type !== "tool_calls") { + return; + } + if (runtime.inlineToolCallContinuation !== true) { + runtime.logger?.debug?.( + `Cursor proxy handed bridged tool_calls to Cursor Agent for ${session.requestId}; ` + + `ending this RunSSE so Cursor can execute tools and send the next AgentRunRequest ` + + `(${summarizeGatewayToolCalls(outcome.toolCalls)}).` + ); + writeCursorConnectMessage(response, encodeCursorAgentTurnEnded()); + finishCursorConnectStream(response); + return; + } + + const nextRunRequest = await waitForBidiRunRequestAfter( + session, + observedRunRequestVersion, + runtime.toolCallBridgeTimeoutMs + ); + if (!nextRunRequest) { + runtime.logger?.warn?.( + `Cursor proxy bridged upstream tool_calls to Cursor Agent for ${session.requestId}, ` + + `but did not receive a follow-up AgentRunRequest with tool results within ` + + `${runtime.toolCallBridgeTimeoutMs}ms (${summarizeGatewayToolCalls(outcome.toolCalls)}).` + ); + writeCursorConnectMessage(response, encodeCursorAgentTextDelta( + "\n\n[Cursor proxy] Cursor did not return tool results after the proxy emitted Cursor Agent tool events." + )); + writeCursorConnectMessage(response, encodeCursorAgentTurnEnded()); + finishCursorConnectStream(response); + return; + } + + observedRunRequestVersion = session.runRequestVersion || observedRunRequestVersion; + await waitForBidiRunRequestSettle(session, runtime.bidiSettleMs, runtime.bidiMaxSettleMs); + runRequest = session.runRequest || nextRunRequest; + + let nextChatRequest = convertAgentRunRequestToOpenAIChat(runtime, runRequest); + if (!nextChatRequest) { + runtime.logger?.warn?.( + `Cursor proxy received follow-up AgentRunRequest for ${session.requestId}, ` + + "but could not decode it into OpenAI chat messages after tool execution." + ); + writeCursorConnectMessage(response, encodeCursorAgentTextDelta( + "\n\n[Cursor proxy] Cursor returned a follow-up payload, but the proxy could not decode the tool result context." + )); + writeCursorConnectMessage(response, encodeCursorAgentTurnEnded()); + finishCursorConnectStream(response); + return; + } + + nextChatRequest = applyCollectedCursorContext(runtime, session, runRequest, nextChatRequest); + const resultMessages = findToolResultMessages(nextChatRequest?.messages, outcome.toolCalls); + logCursorToolBridgeFollowUp( + runtime, + session, + runRequest, + nextChatRequest, + outcome.toolCalls, + resultMessages, + round + 1 + ); + if (resultMessages.length === 0) { + runtime.logger?.warn?.( + `Cursor proxy received a follow-up AgentRunRequest for ${session.requestId} after bridging ` + + `tool_calls, but decoded no matching tool result messages; stopping instead of repeating the ` + + `same tool call (${summarizeGatewayToolCalls(outcome.toolCalls)}, ${formatChatRequestSummary(nextChatRequest)}).` + ); + writeCursorConnectMessage(response, encodeCursorAgentTextDelta( + "\n\n[Cursor proxy] Cursor returned a follow-up request, but the proxy decoded no matching tool result message. " + + "Stopped before repeating the same tool call; check cursor-proxy decode dumps/logs for the follow-up payload." + )); + writeCursorConnectMessage(response, encodeCursorAgentTurnEnded()); + finishCursorConnectStream(response); + return; + } + writeCursorMcpToolResultEvents(runtime, response, outcome.toolCalls, bridgeContext, nextChatRequest, outcome.modelCallId); + chatRequest = mergeToolCallContinuationChatRequest(chatRequest, outcome.toolCalls, nextChatRequest); + logAgentToolContinuation(runtime, session, outcome.toolCalls, chatRequest, round + 1); + } + + runtime.logger?.warn?.( + `Cursor proxy stopped tool-call bridge for ${session.requestId} after ${maxRounds} rounds ` + + `(${formatChatRequestSummary(chatRequest)}).` + ); + writeCursorConnectMessage(response, encodeCursorAgentTextDelta( + `\n\n[Cursor proxy] Stopped after ${maxRounds} tool-call bridge rounds.` + )); + writeCursorConnectMessage(response, encodeCursorAgentTurnEnded()); + finishCursorConnectStream(response); +} + +async function handleCursorNativeProtoRequest(runtime, request, response, url, requestBody) { + const method = (request.method || "GET").toUpperCase(); + const path = normalizePath(url.pathname); + if (method !== "POST" || !isCursorNativeLlmRpcPath(runtime, path) || requestBody.length === 0) { + return false; + } + + const chatRequest = convertCursorNativeRequestToOpenAIChat(runtime, path, requestBody); + if (!chatRequest) { + return false; + } + + runtime.logger?.debug?.( + `Cursor proxy converted native Cursor RPC ${path} to OpenAI chat ` + + `(messages=${Array.isArray(chatRequest.messages) ? chatRequest.messages.length : 0}, ` + + `tools=${Array.isArray(chatRequest.tools) ? chatRequest.tools.length : 0}).` + ); + if (isSimplifiedAgentChatRequest(chatRequest)) { + logCursorDecodeDiagnostics( + runtime, + "warn", + `Cursor proxy native Cursor RPC ${path} decoded without system/tools: ` + + formatCursorNativeProtoDecodeDiagnostic(runtime, path, requestBody, chatRequest) + ); + } + response.writeHead(200, corsHeaders(connectProtoHeaders())); + await streamGatewayChatToCursor(runtime, request, response, chatRequest); + return true; +} + +function convertCursorNativeRequestToOpenAIChat(runtime, path, requestBody) { + const candidateBuffers = cursorNativeCandidateBuffers(requestBody); + const runRequest = extractAgentRunRequestFromCandidates(candidateBuffers); + if (runRequest) { + return convertAgentRunRequestToOpenAIChat(runtime, runRequest); + } + + const decodedValues = collectCursorNativeDecodedValues(candidateBuffers); + const fromDecodedValues = convertCursorDecodedValuesToOpenAIChat(runtime, path, decodedValues, { + loosePromptFallback: false, + requireInteractiveMessage: true + }); + if (fromDecodedValues) { + return fromDecodedValues; + } + + const jsonPayload = readJsonLikePayload(requestBody); + if (jsonPayload !== undefined) { + return convertCursorJsonPayloadToOpenAIChat(runtime, path, jsonPayload); + } + + return undefined; +} + +function cursorNativeCandidateBuffers(body) { + const candidates = []; + const decoded = decodeCursorProtoBody(body); + candidates.push(decoded.body); + candidates.push(...binaryCandidateBuffers(body)); + if (decoded.body && !decoded.body.equals?.(body)) { + candidates.push(...binaryCandidateBuffers(decoded.body)); + } + return uniqueBuffers(candidates); +} + +function collectCursorNativeDecodedValues(candidateBuffers) { + const values = []; + for (const buffer of candidateBuffers) { + if (!Buffer.isBuffer(buffer) || buffer.length === 0) { + continue; + } + if (looksLikeTextBuffer(buffer)) { + values.push(buffer.toString("utf8")); + const parsed = readJsonText(buffer.toString("utf8")); + if (parsed !== undefined) { + values.push(parsed); + } + } + for (const item of decodeAllProtoStrings(buffer)) { + if (!item.value || looksLikeNoiseString(item.value)) { + continue; + } + values.push(item.value); + const parsed = readJsonText(item.value); + if (parsed !== undefined) { + values.push(parsed); + } + for (const decoded of decodeEmbeddedStringValues(item.value)) { + values.push(decoded); + } + } + } + return uniqueDecodedValues(values); +} + +function convertCursorDecodedValuesToOpenAIChat(runtime, path, values, options = {}) { + if (!Array.isArray(values) || values.length === 0) { + return undefined; + } + + const messages = extractMessagesFromValues(values); + if (messages.length === 0) { + const prompt = findFirstStringFromValues(values, [ + "input", + "instruction", + "message", + "prompt", + "query", + "text", + "userMessage", + "user_message" + ]) || (options.loosePromptFallback === false ? undefined : findBestPromptStringFromValues(values)); + if (prompt) { + messages.push({ content: prompt, role: "user" }); + } + } + if (messages.length === 0) { + return undefined; + } + + const systemPrompt = selectPreferredSystemPrompt( + extractSystemPromptFromValues(values), + findBestSystemPromptStringFromValues(values) + ); + if (systemPrompt && !messages.some((message) => message.role === "system")) { + messages.unshift({ content: systemPrompt, role: "system" }); + } + + const compactedMessages = compactChatMessages(messages); + if (compactedMessages.length === 0) { + return undefined; + } + if (options.requireInteractiveMessage !== false && !hasInteractiveChatMessage(compactedMessages)) { + return undefined; + } + + const tools = extractToolsFromValues(values); + const toolChoice = extractToolChoiceFromValues(values); + const model = + findFirstStringFromValues(values, ["model", "modelName", "selectedModel", "intentModel", "chatModel"]) || + runtime.defaultModel || + "cursor-proxy"; + + return compactObject({ + frequency_penalty: findFirstNumberFromValues(values, ["frequency_penalty", "frequencyPenalty"]), + max_tokens: findFirstNumberFromValues(values, ["max_tokens", "maxTokens", "maxOutputTokens", "output_tokens"]), + messages: compactedMessages, + model, + presence_penalty: findFirstNumberFromValues(values, ["presence_penalty", "presencePenalty"]), + stream: path.toLowerCase().includes("stream") || findFirstBooleanFromValues(values, ["stream", "shouldStream"]) !== false, + temperature: findFirstNumberFromValues(values, ["temperature"]), + tool_choice: toolChoice, + tools: tools.length > 0 ? tools : undefined, + top_p: findFirstNumberFromValues(values, ["top_p", "topP"]) + }); +} + +function hasInteractiveChatMessage(messages) { + return messages.some((message) => ["assistant", "tool", "user"].includes(message.role)); +} + +function normalizeCollectedCursorChatRequest(runtime, payload) { + const candidates = collectCursorContextPayloadCandidates(payload); + for (const candidate of candidates) { + const direct = normalizeCollectedOpenAIChatPayload(runtime, candidate); + if (direct) { + return direct; + } + + const converted = convertCursorDecodedValuesToOpenAIChat(runtime, "/collector", [candidate], { + loosePromptFallback: false, + requireInteractiveMessage: false + }); + if (converted) { + return converted; + } + } + return undefined; +} + +function collectCursorContextPayloadCandidates(payload) { + const candidates = []; + const add = (value) => { + if (value === undefined || value === null) { + return; + } + if (typeof value === "string") { + const parsed = readJsonText(value); + if (parsed !== undefined) { + candidates.push(parsed); + } + return; + } + candidates.push(value); + }; + + if (isRecord(payload)) { + for (const key of [ + "openai", + "openaiRequest", + "openai_request", + "chat", + "chatRequest", + "chat_request", + "request", + "body", + "payload", + "message" + ]) { + add(payload[key]); + } + } + add(payload); + return uniqueDecodedValues(candidates); +} + +function normalizeCollectedOpenAIChatPayload(runtime, payload) { + if (!isRecord(payload)) { + return undefined; + } + + const messages = Array.isArray(payload.messages) + ? compactChatMessages(payload.messages.map((message) => isRecord(message) ? message : undefined).filter(Boolean)) + : extractMessages(payload); + const systemPrompt = extractSystemPrompt(payload); + if (systemPrompt && !messages.some((message) => message.role === "system")) { + messages.unshift({ content: systemPrompt, role: "system" }); + } + + const compactedMessages = compactChatMessages(messages); + const tools = Array.isArray(payload.tools) ? normalizeToolList(payload.tools) : extractTools(payload); + const toolChoice = normalizeToolChoice(payload.tool_choice ?? payload.toolChoice) ?? extractToolChoice(payload); + + if ( + compactedMessages.length === 0 && + tools.length === 0 && + !systemPrompt && + toolChoice === undefined + ) { + return undefined; + } + + return compactObject({ + frequency_penalty: numberFromParameter(payload.frequency_penalty ?? payload.frequencyPenalty), + max_tokens: numberFromParameter(payload.max_tokens ?? payload.maxTokens ?? payload.maxOutputTokens ?? payload.output_tokens), + messages: compactedMessages.length > 0 ? compactedMessages : undefined, + model: stringValue(payload.model) || + stringValue(payload.modelName) || + stringValue(payload.selectedModel) || + runtime.defaultModel || + "cursor-proxy", + parallel_tool_calls: typeof payload.parallel_tool_calls === "boolean" ? payload.parallel_tool_calls : undefined, + presence_penalty: numberFromParameter(payload.presence_penalty ?? payload.presencePenalty), + reasoning_effort: payload.reasoning_effort, + reasoning_split: payload.reasoning_split, + response_format: isRecord(payload.response_format) ? payload.response_format : undefined, + stream: payload.stream === undefined ? true : Boolean(payload.stream), + temperature: numberFromParameter(payload.temperature), + tool_choice: toolChoice, + tools: tools.length > 0 ? tools : undefined, + top_p: numberFromParameter(payload.top_p ?? payload.topP) + }); +} + +function convertCursorJsonPayloadToOpenAIChat(runtime, path, payload) { + const unwrapped = unwrapCursorJson(payload); + if (unwrapped === undefined) { + return undefined; + } + const converted = convertCursorDecodedValuesToOpenAIChat(runtime, path, [unwrapped], { + loosePromptFallback: false, + requireInteractiveMessage: true + }); + if (converted) { + return converted; + } + const body = Buffer.from(`${JSON.stringify(unwrapped)}\n`, "utf8"); + return convertCursorJsonToOpenAIChat(runtime, path, body); +} + +function decodeBidiAppendRequest(body) { + const decodedBody = decodeCursorProtoBody(body); + const rpcBody = decodedBody.body; + const dataBytes = concatProtoBytesFields(rpcBody, 1); + const dataBinary = concatProtoBytesFields(rpcBody, 4); + return { + appendSeqno: decodeProtoIntField(rpcBody, 3), + bodyHex: body.subarray(0, 32).toString("hex"), + data: dataBytes.length > 0 ? dataBytes.toString("utf8") : "", + dataBytes, + dataHex: dataBytes.subarray(0, 32).toString("hex"), + dataBinary, + rawBody: body, + rpcBody, + rpcBodyEncoding: decodedBody.encoding, + rpcBodyHex: rpcBody.subarray(0, 32).toString("hex"), + requestId: decodeBidiAppendRequestId(rpcBody) + }; +} + +function decodeBidiAppendRequestId(rpcBody) { + const requestIdMessage = decodeProtoMessageFields(rpcBody, 2)[0]; + return decodeProtoStringField(requestIdMessage, 1) || + decodeProtoStringField(rpcBody, 2) || + findFirstUuidString(requestIdMessage) || + findFirstUuidString(rpcBody) || + ""; +} + +function decodeRunSseRequest(body) { + const decodedBody = decodeCursorProtoBody(body); + const rpcBody = decodedBody.body; + const candidates = runSseCandidateBuffers(body, rpcBody); + return { + candidates, + rpcBodyEncoding: decodedBody.encoding, + requestId: decodeBidiRequestId(rpcBody), + rpcBody, + runRequest: extractAgentRunRequestFromCandidates(candidates) + }; +} + +function decodeBidiRequestId(body) { + return decodeProtoStringField(body, 1) || + decodeProtoStringField(decodeProtoMessageFields(body, 1)[0], 1) || + findFirstUuidString(body) || + ""; +} + +function findFirstUuidString(buffer) { + for (const item of decodeAllProtoStrings(buffer)) { + const match = item.value.match(UUID_PATTERN); + if (match) { + return match[0]; + } + } + return ""; +} + +function createSyntheticBidiRequestId() { + return `runsse-${Date.now()}-${Math.random().toString(16).slice(2)}`; +} + +function decodeCursorProtoBody(body) { + const fallbackBody = decodeConnectEnvelope(body); + const candidates = []; + const addCandidate = (buffer, encoding) => { + if (Buffer.isBuffer(buffer) && buffer.length > 0) { + candidates.push({ body: buffer, encoding }); + } + }; + + addCandidate(fallbackBody, "connect"); + for (const frame of decodeConnectMessages(body)) { + addCandidate(frame, "connect-frame"); + } + + const decompressedBody = decompressConnectPayload(body); + if (decompressedBody) { + addCandidate(decompressedBody, "compressed"); + for (const frame of decodeConnectMessages(decompressedBody)) { + addCandidate(frame, "compressed-connect-frame"); + } + } + + for (const candidate of candidates) { + if (hasReadableProtoFields(candidate.body)) { + return candidate; + } + } + return { body: fallbackBody, encoding: "raw" }; +} + +function appendBidiSessionRequest(session, append) { + session.lastSeen = Date.now(); + session.appendSeqno = append.appendSeqno; + let key = append.appendSeqno || session.appends.size + 1; + while (session.appends.has(key)) { + key += 1e-6; + } + session.appends.set(key, append); + while (session.appends.size > 128) { + const firstKey = session.appends.keys().next().value; + session.appends.delete(firstKey); + } + return extractAgentRunRequestFromBidiSession(session); +} + +function extractAgentRunRequestFromBidiSession(session) { + return extractAgentRunRequestFromCandidates(bidiSessionCandidateBuffers(session)); +} + +function bidiSessionCandidateBuffers(session) { + const appends = sortedBidiAppends(session); + const candidates = []; + + const combinedDataBinary = Buffer.concat(appends.map((append) => append.dataBinary).filter((buffer) => buffer.length > 0)); + if (combinedDataBinary.length > 0) { + candidates.push(combinedDataBinary); + candidates.push(...decodeConnectMessages(combinedDataBinary)); + } + + const combinedDataBytes = Buffer.concat(appends.map((append) => append.dataBytes).filter((buffer) => buffer.length > 0)); + if (combinedDataBytes.length > 0) { + candidates.push(combinedDataBytes); + candidates.push(...decodeConnectMessages(combinedDataBytes)); + } + + const combinedData = appends.map((append) => append.data || "").join(""); + if (combinedData) { + candidates.push(...stringCandidateBuffers(combinedData)); + candidates.push(...stringCandidateBuffers(combinedData.replace(/\s+/g, ""))); + } + + for (const append of appends) { + candidates.push(...bidiAppendCandidateBuffers(append)); + } + + return candidates; +} + +function runSseCandidateBuffers(body, rpcBody) { + const candidates = []; + candidates.push(...binaryCandidateBuffers(rpcBody)); + candidates.push(...binaryCandidateBuffers(body)); + return candidates; +} + +function sortedBidiAppends(session) { + return [...session.appends.entries()] + .sort((left, right) => Number(left[0]) - Number(right[0])) + .map((entry) => entry[1]); +} + +function combinedAppendDataLength(session) { + return sortedBidiAppends(session).reduce((total, append) => total + append.data.length, 0); +} + +function combinedAppendDataBytesLength(session) { + return sortedBidiAppends(session).reduce((total, append) => total + append.dataBytes.length, 0); +} + +function combinedAppendDataBinaryLength(session) { + return sortedBidiAppends(session).reduce((total, append) => total + append.dataBinary.length, 0); +} + +function formatBidiSessionDiagnostic(session) { + const appends = sortedBidiAppends(session); + const lastAppend = appends[appends.length - 1]; + return [ + `appends=${session.appends.size}`, + `last_seq=${lastAppend?.appendSeqno || session.appendSeqno || 0}`, + `combined_data=${combinedAppendDataLength(session)}`, + `combined_data_bytes=${combinedAppendDataBytesLength(session)}`, + `combined_data_binary=${combinedAppendDataBinaryLength(session)}`, + `last_data=${lastAppend?.data.length || 0}`, + `last_data_bytes=${lastAppend?.dataBytes.length || 0}`, + `last_data_hex=${lastAppend?.dataHex || ""}`, + `last_data_binary=${lastAppend?.dataBinary.length || 0}`, + `last_fields=${lastAppend ? formatProtoFieldSummary(lastAppend.rpcBody) : "empty"}`, + `last_data_binary_fields=${lastAppend ? formatProtoFieldSummary(lastAppend.dataBinary) : "empty"}`, + `append_details=${formatBidiAppendDetails(appends)}` + ].join(", "); +} + +function formatBidiAppendDetails(appends) { + if (!appends.length) { + return "empty"; + } + return appends.slice(-16).map((append) => { + return [ + `seq:${append.appendSeqno || 0}`, + `data:${append.data.length}`, + `data_bytes:${append.dataBytes.length}`, + `data_hex:${append.dataHex}`, + `data_binary:${append.dataBinary.length}`, + `fields:${formatProtoFieldSummary(append.rpcBody)}`, + `data_binary_fields:${formatProtoFieldSummary(append.dataBinary)}` + ].join("/"); + }).join("|"); +} + +function extractAgentRunRequestFromBidiAppend(append) { + return extractAgentRunRequestFromCandidates(bidiAppendCandidateBuffers(append)); +} + +function bidiAppendCandidateBuffers(append) { + const candidates = []; + candidates.push(...binaryCandidateBuffers(append.rawBody)); + candidates.push(...binaryCandidateBuffers(append.rpcBody)); + if (append.dataBinary.length > 0) { + candidates.push(...binaryCandidateBuffers(append.dataBinary)); + } + if (append.dataBytes.length > 0) { + candidates.push(...binaryCandidateBuffers(append.dataBytes)); + } + if (append.data) { + candidates.push(...stringCandidateBuffers(append.data)); + } + return candidates; +} + +function binaryCandidateBuffers(buffer) { + if (!Buffer.isBuffer(buffer) || buffer.length === 0) { + return []; + } + const candidates = [buffer]; + const framed = decodeConnectMessages(buffer); + if (framed.length > 0 && !(framed.length === 1 && framed[0] === buffer)) { + candidates.push(...framed); + } + const decompressed = decompressConnectPayload(buffer); + if (decompressed && decompressed.length > 0 && !decompressed.equals(buffer)) { + candidates.push(decompressed); + candidates.push(...decodeConnectMessages(decompressed)); + } + candidates.push(...lengthPrefixedCandidateBuffers(buffer)); + + if (looksLikeTextBuffer(buffer)) { + candidates.push(...stringCandidateBuffers(buffer.toString("utf8"))); + } + return candidates; +} + +function lengthPrefixedCandidateBuffers(buffer) { + const candidates = []; + const varintLength = readProtoVarint(buffer, 0); + if (varintLength) { + const start = varintLength.offset; + const end = start + Number(varintLength.value); + if (end > start && end <= buffer.length) { + candidates.push(buffer.subarray(start, end)); + } + } + + if (buffer.length >= 4) { + const bigEndianLength = buffer.readUInt32BE(0); + if (bigEndianLength > 0 && bigEndianLength <= buffer.length - 4) { + candidates.push(buffer.subarray(4, 4 + bigEndianLength)); + } + const littleEndianLength = buffer.readUInt32LE(0); + if (littleEndianLength > 0 && littleEndianLength <= buffer.length - 4) { + candidates.push(buffer.subarray(4, 4 + littleEndianLength)); + } + } + + return candidates; +} + +function looksLikeTextBuffer(buffer) { + const sampleLength = Math.min(buffer.length, 512); + if (sampleLength === 0) { + return false; + } + let textLike = 0; + for (let index = 0; index < sampleLength; index += 1) { + const byte = buffer[index]; + if (byte === 9 || byte === 10 || byte === 13 || (byte >= 32 && byte <= 126)) { + textLike += 1; + } + } + return textLike / sampleLength > 0.9; +} + +function stringCandidateBuffers(value) { + const candidates = []; + const text = String(value || ""); + if (!text) { + return candidates; + } + candidates.push(Buffer.from(text, "utf8")); + const trimmed = text.trim(); + if (!trimmed) { + return candidates; + } + for (const candidate of base64CandidateBuffers(trimmed)) { + candidates.push(candidate); + } + if (/^(?:[0-9a-f]{2})+$/i.test(trimmed)) { + candidates.push(Buffer.from(trimmed, "hex")); + } + if (/%[0-9a-f]{2}/i.test(trimmed)) { + try { + candidates.push(...stringCandidateBuffers(decodeURIComponent(trimmed))); + } catch { + // Not URI encoded. + } + } + const parsed = readJsonText(trimmed); + if (parsed) { + for (const item of findStringValuesByKeys(parsed, ["data", "dataBinary", "data_binary", "payload", "message"])) { + candidates.push(...stringCandidateBuffers(item)); + } + } + return candidates; +} + +function decodeEmbeddedStringValues(value, depth = 0) { + if (depth > 3 || typeof value !== "string") { + return []; + } + const trimmed = value.trim(); + if (!trimmed || looksLikeNoiseString(trimmed)) { + return []; + } + + const decoded = []; + const parsed = readJsonText(trimmed); + if (parsed !== undefined) { + decoded.push(parsed); + for (const item of findStringValuesByKeys(parsed, ["body", "data", "dataBinary", "data_binary", "message", "payload", "request"])) { + decoded.push(...decodeEmbeddedStringValues(item, depth + 1)); + } + } + + if (/%[0-9a-f]{2}/i.test(trimmed)) { + try { + const uriDecoded = decodeURIComponent(trimmed); + if (uriDecoded !== trimmed) { + decoded.push(uriDecoded); + decoded.push(...decodeEmbeddedStringValues(uriDecoded, depth + 1)); + } + } catch { + // Not URI encoded. + } + } + + for (const buffer of base64CandidateBuffers(trimmed)) { + if (!Buffer.isBuffer(buffer) || buffer.length === 0) { + continue; + } + if (looksLikeTextBuffer(buffer)) { + const text = buffer.toString("utf8").trim(); + if (text && text !== trimmed && !looksLikeNoiseString(text)) { + decoded.push(text); + decoded.push(...decodeEmbeddedStringValues(text, depth + 1)); + } + } + for (const item of decodeAllProtoStrings(buffer)) { + if (item.value && !looksLikeNoiseString(item.value)) { + decoded.push(item.value); + decoded.push(...decodeEmbeddedStringValues(item.value, depth + 1)); + } + } + } + + return uniqueDecodedValues(decoded); +} + +function uniqueBuffers(buffers) { + const result = []; + const seen = new Set(); + for (const buffer of buffers) { + if (!Buffer.isBuffer(buffer) || buffer.length === 0) { + continue; + } + const key = `${buffer.length}:${buffer.subarray(0, 32).toString("hex")}`; + if (seen.has(key)) { + continue; + } + seen.add(key); + result.push(buffer); + } + return result; +} + +function uniqueDecodedValues(values) { + const result = []; + const seen = new Set(); + for (const value of values) { + if (value === undefined || value === null) { + continue; + } + const key = typeof value === "string" ? `s:${value}` : `j:${safeJsonStringify(value)}`; + if (seen.has(key)) { + continue; + } + seen.add(key); + result.push(value); + } + return result; +} + +function safeJsonStringify(value) { + try { + return JSON.stringify(value); + } catch { + return String(value); + } +} + +function base64CandidateBuffers(text) { + const candidates = []; + const compact = text.replace(/\s+/g, ""); + if (!compact || compact.length < 4) { + return candidates; + } + if (/^[A-Za-z0-9+/]+={0,2}$/.test(compact)) { + candidates.push(Buffer.from(padBase64(compact), "base64")); + } + if (/^[A-Za-z0-9_-]+={0,2}$/.test(compact)) { + candidates.push(Buffer.from(padBase64(compact), "base64url")); + } + return candidates; +} + +function padBase64(value) { + const remainder = value.length % 4; + return remainder === 0 ? value : `${value}${"=".repeat(4 - remainder)}`; +} + +function extractAgentRunRequestFromCandidates(candidates) { + const uniqueCandidates = []; + const seen = new Set(); + for (const candidate of candidates) { + if (!Buffer.isBuffer(candidate) || candidate.length === 0) { + continue; + } + const key = `${candidate.length}:${candidate.subarray(0, 16).toString("hex")}`; + if (seen.has(key)) { + continue; + } + seen.add(key); + uniqueCandidates.push(candidate); + const runRequest = extractAgentRunRequest(candidate, 0); + if (runRequest) { + return runRequest; + } + } + for (const candidate of uniqueCandidates) { + const runRequest = extractAgentRunRequestFromOffsets(candidate); + if (runRequest) { + return runRequest; + } + } + return undefined; +} + +function extractAgentRunRequest(message, depth) { + if (!Buffer.isBuffer(message) || message.length === 0 || depth > 8) { + return undefined; + } + + if (looksLikeAgentRunRequest(message)) { + return message; + } + + const runRequest = decodeProtoMessageFields(message, 1)[0]; + if (looksLikeAgentRunRequest(runRequest)) { + return runRequest; + } + + for (const field of readLengthDelimitedProtoFields(message)) { + const nested = extractAgentRunRequest(field.value, depth + 1); + if (nested) { + return nested; + } + } + return undefined; +} + +function extractAgentRunRequestFromOffsets(message) { + if (!Buffer.isBuffer(message) || message.length < 2) { + return undefined; + } + const maxOffset = Math.min(16, message.length - 1); + for (let offset = 1; offset <= maxOffset; offset += 1) { + const nested = extractAgentRunRequest(message.subarray(offset), 1); + if (nested) { + return nested; + } + } + return undefined; +} + +function looksLikeAgentRunRequest(message) { + if (!Buffer.isBuffer(message) || message.length === 0) { + return false; + } + return Boolean( + looksLikeConversationState(decodeProtoMessageFields(message, 1)[0]) || + looksLikeConversationAction(decodeProtoMessageFields(message, 2)[0]) || + looksLikeModelDetails(decodeProtoMessageFields(message, 3)[0]) || + looksLikeRequestedModel(decodeProtoMessageFields(message, 9)[0]) || + decodeProtoStringField(message, 5) || + decodeProtoStringField(message, 8) || + decodeProtoStringField(message, 18) + ); +} + +function looksLikeConversationState(message) { + return Buffer.isBuffer(message) && ( + decodeProtoStringFields(message, 1).length > 0 || + decodeProtoMessageFields(message, 8).length > 0 + ); +} + +function looksLikeConversationAction(message) { + if (!Buffer.isBuffer(message)) { + return false; + } + const userMessageAction = decodeProtoMessageFields(message, 1)[0]; + const startPlanAction = decodeProtoMessageFields(message, 6)[0]; + return Boolean( + decodeUserMessage(decodeProtoMessageFields(userMessageAction, 1)[0]) || + decodeProtoMessageFields(userMessageAction, 4).some((item) => decodeUserMessage(item)) || + decodeUserMessage(decodeProtoMessageFields(startPlanAction, 1)[0]) + ); +} + +function looksLikeModelDetails(message) { + return Buffer.isBuffer(message) && Boolean(decodeProtoStringField(message, 1)); +} + +function looksLikeRequestedModel(message) { + return Buffer.isBuffer(message) && Boolean(decodeProtoStringField(message, 1)); +} + +function getBidiSession(runtime, requestId, create) { + cleanupBidiSessions(runtime); + let session = runtime.bidiSessions.get(requestId); + if (!session && create) { + session = { + createdAt: Date.now(), + lastSeen: Date.now(), + lastRunRequestAt: 0, + requestId, + runRequest: undefined, + appends: new Map(), + waiters: [] + }; + runtime.bidiSessions.set(requestId, session); + } + return session; +} + +function findSingleWaitingBidiSession(runtime) { + cleanupBidiSessions(runtime); + const waitingSessions = [...runtime.bidiSessions.values()].filter((session) => session.waiters.length > 0); + return waitingSessions.length === 1 ? waitingSessions[0] : undefined; +} + +function cleanupBidiSessions(runtime) { + const now = Date.now(); + for (const [requestId, session] of runtime.bidiSessions) { + if (now - session.lastSeen > runtime.bidiSessionTtlMs) { + runtime.bidiSessions.delete(requestId); + } + } +} + +function describeBidiSessions(runtime) { + cleanupBidiSessions(runtime); + return [...runtime.bidiSessions.values()] + .map((session) => describeBidiSession(runtime, session)) + .sort((left, right) => right.lastSeenAt - left.lastSeenAt) + .slice(0, 25); +} + +function describeBidiSession(runtime, session) { + const appends = sortedBidiAppends(session); + const chatRequest = session.runRequest ? convertAgentRunRequestToOpenAIChat(runtime, session.runRequest) : undefined; + return { + ageMs: Date.now() - session.createdAt, + appendDetails: formatBidiAppendDetails(appends), + appendSeqno: session.appendSeqno || 0, + appends: appends.length, + chat: chatRequest ? summarizeChatRequest(chatRequest) : undefined, + combinedDataBinaryBytes: combinedAppendDataBinaryLength(session), + combinedDataBytes: combinedAppendDataBytesLength(session), + combinedDataTextBytes: combinedAppendDataLength(session), + decodedHints: summarizeBidiDecodedHints(session), + lastRunRequestAt: session.lastRunRequestAt || 0, + lastSeenAgoMs: Date.now() - session.lastSeen, + lastSeenAt: session.lastSeen, + requestId: session.requestId, + waiters: session.waiters.length + }; +} + +function summarizeBidiDecodedHints(session) { + const strings = []; + const addStringsFromBuffer = (buffer) => { + if (!Buffer.isBuffer(buffer) || buffer.length === 0) { + return; + } + if (looksLikeTextBuffer(buffer)) { + strings.push(buffer.toString("utf8")); + } + for (const item of decodeAllProtoStrings(buffer)) { + strings.push(item.value); + } + }; + + for (const append of sortedBidiAppends(session)) { + addStringsFromBuffer(append.rpcBody); + addStringsFromBuffer(append.dataBytes); + addStringsFromBuffer(append.dataBinary); + } + + const uniqueStrings = [...new Set(strings.filter((value) => value && !looksLikeNoiseString(value)))]; + const toolKeyPattern = new RegExp(`\\b(?:${CURSOR_TOOL_KEYS.map(escapeRegExp).join("|")})\\b`, "i"); + return { + jsonLikeStrings: uniqueStrings.filter((value) => readJsonText(value) !== undefined).length, + maxStringLength: uniqueStrings.reduce((max, value) => Math.max(max, value.length), 0), + strings: uniqueStrings.length, + systemLikeStrings: uniqueStrings.filter(looksLikeSystemPromptText).length, + toolLikeStrings: uniqueStrings.filter((value) => toolKeyPattern.test(value)).length + }; +} + +function setBidiSessionRunRequest(session, runRequest) { + session.runRequest = runRequest; + session.lastRunRequestAt = Date.now(); + session.runRequestVersion = (session.runRequestVersion || 0) + 1; + const waiters = session.waiters.splice(0); + waiters.forEach((resolve) => resolve(runRequest)); +} + +function waitForBidiRunRequest(session, timeoutMs) { + if (session.runRequest) { + return Promise.resolve(session.runRequest); + } + return new Promise((resolve) => { + const timer = setTimeout(() => { + const index = session.waiters.indexOf(done); + if (index >= 0) { + session.waiters.splice(index, 1); + } + resolve(undefined); + }, timeoutMs); + const done = (runRequest) => { + clearTimeout(timer); + resolve(runRequest); + }; + session.waiters.push(done); + }); +} + +function waitForBidiRunRequestAfter(session, runRequestVersion, timeoutMs) { + const observedVersion = Math.max(0, Number(runRequestVersion) || 0); + if ((session.runRequestVersion || 0) > observedVersion && session.runRequest) { + return Promise.resolve(session.runRequest); + } + + return new Promise((resolve) => { + const timer = setTimeout(() => { + const index = session.waiters.indexOf(done); + if (index >= 0) { + session.waiters.splice(index, 1); + } + resolve(undefined); + }, timeoutMs); + const done = (runRequest) => { + clearTimeout(timer); + if ((session.runRequestVersion || 0) > observedVersion) { + resolve(runRequest); + } else { + resolve(undefined); + } + }; + session.waiters.push(done); + }); +} + +async function waitForBidiRunRequestSettle(session, settleMs, maxSettleMs) { + const settleWindow = Math.max(0, Number(settleMs) || 0); + const maxWindow = Math.max(settleWindow, Number(maxSettleMs) || 0); + if (!session.runRequest || settleWindow <= 0 || maxWindow <= 0) { + return; + } + + const startedAt = Date.now(); + while (Date.now() - startedAt < maxWindow) { + const updatedAt = session.lastRunRequestAt || startedAt; + const quietFor = Date.now() - updatedAt; + if (quietFor >= settleWindow) { + return; + } + const remainingSettle = settleWindow - quietFor; + const remainingMax = maxWindow - (Date.now() - startedAt); + await sleep(Math.max(1, Math.min(remainingSettle, remainingMax))); + } +} + +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +async function waitForRicherBidiChatRequest(runtime, session, timeoutMs, baseChatRequest) { + const startedAt = Date.now(); + const deadline = startedAt + Math.max(0, Number(timeoutMs) || 0); + let observedRunRequestAt = session.lastRunRequestAt || startedAt; + let currentChatRequest = baseChatRequest; + + while (Date.now() < deadline) { + if (session.runRequest) { + const decoded = convertAgentRunRequestToOpenAIChat(runtime, session.runRequest); + if (decoded) { + currentChatRequest = decoded; + } + } + + const collected = findCollectedCursorContext(runtime, session, session.runRequest, currentChatRequest); + if (collected) { + runtime.logger?.debug?.( + `Cursor proxy found collected Cursor context for ${session.requestId} after ` + + `${Date.now() - startedAt}ms (${formatChatRequestSummary(collected.chatRequest)}).` + ); + return { chatRequest: collected.chatRequest, runRequest: session.runRequest }; + } + + if ((session.lastRunRequestAt || 0) > observedRunRequestAt && session.runRequest) { + observedRunRequestAt = session.lastRunRequestAt; + const chatRequest = currentChatRequest || convertAgentRunRequestToOpenAIChat(runtime, session.runRequest); + if (chatRequest && !isSimplifiedAgentChatRequest(chatRequest)) { + runtime.logger?.debug?.( + `Cursor proxy found richer AgentRunRequest for ${session.requestId} after ` + + `${Date.now() - startedAt}ms (${formatChatRequestSummary(chatRequest)}).` + ); + return { chatRequest, runRequest: session.runRequest }; + } + } + await sleep(Math.min(100, Math.max(1, deadline - Date.now()))); + } + + return undefined; +} + +function collectCursorContextKeys(payload, chatRequest) { + const keys = new Set(); + const add = (value) => { + const text = stringValue(value); + if (!text) { + return; + } + keys.add(text); + for (const match of text.matchAll(new RegExp(UUID_PATTERN.source, "ig"))) { + keys.add(match[0]); + } + }; + + if (isRecord(payload)) { + for (const key of [ + "requestId", + "request_id", + "bidiRequestId", + "bidi_request_id", + "runId", + "run_id", + "conversationId", + "conversation_id", + "clientRequestId", + "client_request_id", + "chatId", + "chat_id", + "threadId", + "thread_id", + "sessionId", + "session_id", + "traceId", + "trace_id" + ]) { + add(payload[key]); + } + } + + for (const value of findStringValuesByKeys(payload, [ + "requestId", + "request_id", + "bidiRequestId", + "bidi_request_id", + "conversationId", + "conversation_id", + "clientRequestId", + "client_request_id" + ])) { + add(value); + } + + add(lastUserMessageText(chatRequest)); + if (keys.size === 0) { + keys.add("__latest__"); + } + keys.add("__latest__"); + return [...keys]; +} + +function storeCursorContext(runtime, context) { + cleanupCursorContexts(runtime); + const keys = context.keys.length > 0 ? context.keys : ["__latest__"]; + const stored = { ...context, keys }; + for (const key of keys) { + runtime.cursorContexts.set(key, stored); + } + trimCursorContexts(runtime); + return stored; +} + +function cleanupCursorContexts(runtime) { + const ttlMs = Math.max(0, Number(runtime.cursorContextTtlMs) || 0); + if (ttlMs <= 0) { + return; + } + const now = Date.now(); + for (const [key, context] of runtime.cursorContexts) { + if (now - context.createdAt > ttlMs) { + runtime.cursorContexts.delete(key); + } + } +} + +function trimCursorContexts(runtime) { + const maxEntries = Math.max(1, Number(runtime.cursorContextMaxEntries) || DEFAULT_CURSOR_CONTEXT_MAX_ENTRIES); + while (runtime.cursorContexts.size > maxEntries) { + let oldestKey; + let oldestAt = Infinity; + for (const [key, context] of runtime.cursorContexts) { + if (context.createdAt < oldestAt) { + oldestAt = context.createdAt; + oldestKey = key; + } + } + if (!oldestKey) { + return; + } + runtime.cursorContexts.delete(oldestKey); + } +} + +function findCollectedCursorContext(runtime, session, runRequest, chatRequest) { + if (!runtime.cursorContextCollector || !runtime.cursorContexts?.size) { + return undefined; + } + cleanupCursorContexts(runtime); + + const keys = new Set([session?.requestId]); + if (runRequest) { + for (const item of decodeAllProtoStrings(runRequest)) { + for (const match of item.value.matchAll(new RegExp(UUID_PATTERN.source, "ig"))) { + keys.add(match[0]); + } + } + } + for (const key of keys) { + const context = key ? runtime.cursorContexts.get(key) : undefined; + if (context) { + return context; + } + } + + if (chatRequest) { + const matchedByPrompt = findCollectedCursorContextByPrompt(runtime, chatRequest); + if (matchedByPrompt) { + return matchedByPrompt; + } + } + + if (!chatRequest) { + const latest = runtime.cursorContexts.get("__latest__"); + return latest && Date.now() - latest.createdAt <= runtime.cursorContextTtlMs ? latest : undefined; + } + return undefined; +} + +function findCollectedCursorContextByPrompt(runtime, chatRequest) { + const prompt = lastUserMessageText(chatRequest); + if (!prompt) { + return undefined; + } + + const uniqueContexts = uniqueContextsNewestFirst(runtime.cursorContexts); + return uniqueContexts.find((context) => chatRequestContainsUserText(context.chatRequest, prompt)); +} + +function uniqueContextsNewestFirst(contextsByKey) { + const seen = new Set(); + const contexts = []; + for (const context of contextsByKey.values()) { + if (seen.has(context)) { + continue; + } + seen.add(context); + contexts.push(context); + } + return contexts.sort((left, right) => right.createdAt - left.createdAt); +} + +function chatRequestContainsUserText(chatRequest, text) { + const normalizedNeedle = normalizePromptFingerprint(text); + if (!normalizedNeedle) { + return false; + } + return (Array.isArray(chatRequest?.messages) ? chatRequest.messages : []).some((message) => { + if (message.role !== "user") { + return false; + } + const normalizedContent = normalizePromptFingerprint(stringifyContent(message.content)); + return normalizedContent === normalizedNeedle || + normalizedContent.includes(normalizedNeedle) || + normalizedNeedle.includes(normalizedContent); + }); +} + +function normalizePromptFingerprint(value) { + return String(value || "").replace(/\s+/g, " ").trim().slice(-4000); +} + +function lastUserMessageText(chatRequest) { + const messages = Array.isArray(chatRequest?.messages) ? chatRequest.messages : []; + for (let index = messages.length - 1; index >= 0; index -= 1) { + if (messages[index]?.role === "user") { + return stringifyContent(messages[index].content) || ""; + } + } + return ""; +} + +function applyCollectedCursorContext(runtime, session, runRequest, chatRequest) { + const collected = findCollectedCursorContext(runtime, session, runRequest, chatRequest); + if (!collected) { + return chatRequest; + } + + const merged = mergeCollectedCursorChatRequest(chatRequest, collected.chatRequest); + runtime.logger?.debug?.( + `Cursor proxy applied collected Cursor context for ${session.requestId} ` + + `(${formatChatRequestSummary(merged)}).` + ); + return merged; +} + +function mergeCollectedCursorChatRequest(baseRequest, collectedRequest) { + const baseMessages = Array.isArray(baseRequest?.messages) ? baseRequest.messages : []; + const collectedMessages = Array.isArray(collectedRequest?.messages) ? collectedRequest.messages : []; + const collectedHasInteractiveMessage = hasInteractiveChatMessage(collectedMessages); + const messages = collectedHasInteractiveMessage + ? collectedMessages + : compactChatMessages([ + ...collectedMessages, + ...baseMessages + ]); + + return compactObject({ + ...baseRequest, + ...collectedRequest, + messages: messages.length > 0 ? messages : baseMessages, + model: stringValue(collectedRequest?.model) || stringValue(baseRequest?.model) || "cursor-proxy", + stream: true, + tool_choice: collectedRequest?.tool_choice ?? baseRequest?.tool_choice, + tools: Array.isArray(collectedRequest?.tools) && collectedRequest.tools.length > 0 + ? collectedRequest.tools + : baseRequest?.tools + }); +} + +function convertAgentRunRequestToOpenAIChat(runtime, runRequest) { + const messages = []; + const contextValues = decodeAgentRunRequestContextValues(runRequest); + const fallbackSystemPrompt = decodeProtoStringField(runRequest, 5); + const systemPrompt = composeAgentSystemPrompt( + contextValues, + selectPreferredSystemPrompt( + decodeProtoStringField(runRequest, 8), + extractSystemPromptFromValues(contextValues), + findBestSystemPromptStringFromValues(contextValues), + looksLikeSystemPromptText(fallbackSystemPrompt) ? fallbackSystemPrompt : undefined + ) + ); + if (systemPrompt) { + messages.push({ content: systemPrompt, role: "system" }); + } + + const conversationState = decodeProtoMessageFields(runRequest, 1)[0]; + if (conversationState) { + messages.push(...decodeConversationStateMessages(conversationState)); + } + + const action = decodeProtoMessageFields(runRequest, 2)[0]; + if (action) { + messages.push(...decodeConversationActionMessages(action)); + } + + const compactedMessages = compactChatMessages(messages); + if (compactedMessages.length === 0) { + const fallbackPrompt = decodeAllProtoStrings(runRequest) + .map((item) => item.value) + .filter((value) => value.length > 3 && !looksLikeNoiseString(value)) + .sort((a, b) => b.length - a.length)[0]; + if (fallbackPrompt) { + compactedMessages.push({ content: fallbackPrompt, role: "user" }); + } + } + if (compactedMessages.length === 0) { + return undefined; + } + + const requestedModel = decodeProtoMessageFields(runRequest, 9)[0]; + const modelDetails = decodeProtoMessageFields(runRequest, 3)[0]; + const parameters = decodeRequestedModelParameters(requestedModel); + const decodedTools = uniqueTools([ + ...extractToolsFromValues(contextValues), + ...extractCursorNativeToolsFromRunRequest(runtime, runRequest, contextValues, systemPrompt) + ]); + const tools = shouldForwardDecodedCursorTools(runtime) ? decodedTools : []; + const toolChoice = tools.length > 0 ? extractToolChoiceFromValues(contextValues) : undefined; + const model = + decodeProtoStringField(requestedModel, 1) || + decodeProtoStringField(modelDetails, 1) || + decodeProtoStringField(runRequest, 18) || + runtime.defaultModel || + "cursor-proxy"; + + return compactObject({ + max_tokens: numberFromParameter(parameters.max_tokens || parameters.maxTokens || parameters.output_tokens), + messages: compactedMessages, + model, + stream: true, + temperature: numberFromParameter(parameters.temperature), + tool_choice: toolChoice, + tools: tools.length > 0 ? tools : undefined, + top_p: numberFromParameter(parameters.top_p || parameters.topP) + }); +} + +function logAgentChatConversion(runtime, session, chatRequest) { + const summary = summarizeChatRequest(chatRequest); + const decodedToolSummary = summarizeDecodedCursorToolForwarding(runtime, session?.runRequest, chatRequest); + const diagnostic = + `${formatChatSummary(summary)}, ` + + `decoded_tools=${decodedToolSummary.decodedTools}, ` + + `native_tool_enums=${decodedToolSummary.nativeToolEnums}, ` + + `suppressed_decoded_tools=${decodedToolSummary.suppressedTools}, ` + + `appends=${session.appends.size}, last_seq=${session.appendSeqno || 0}`; + const dumpPath = writeAgentRunRequestDecodeDump(runtime, session, session.runRequest, chatRequest, "initial"); + const dumpSuffix = dumpPath ? ` decode_dump=${dumpPath}` : ""; + const missingSystem = summary.system === 0; + const missingTools = summary.tools === 0 && decodedToolSummary.suppressedTools === 0; + + if (decodedToolSummary.suppressedTools > 0 && runtime.warnedSuppressedDecodedCursorTools !== true) { + runtime.warnedSuppressedDecodedCursorTools = true; + runtime.logger?.warn?.( + `Cursor proxy decoded ${decodedToolSummary.suppressedTools} Cursor tools from AgentRunRequest, ` + + "but did not forward them to the upstream model because config.forwardDecodedCursorTools=false. " + + "OpenAI tool_calls -> Cursor Agent tool events bridge is available when decoded tools are forwarded." + + dumpSuffix + ); + } + + if (summary.simplified || missingSystem || missingTools) { + const missingContext = [ + missingSystem ? "system" : "", + missingTools ? "tools" : "" + ].filter(Boolean).join("/") || "context"; + runtime.logger?.warn?.( + `Cursor proxy decoded AgentRunRequest ${session.requestId} without ${missingContext} (${diagnostic}). ` + + "The decoded Cursor payload does not expose Agent context; post full Cursor hook context to " + + "/plugins/cursor-proxy/collector, or configure cursor-proxy config.systemPrompt/config.tools " + + `for static fallback context if this Cursor flow omits it.${dumpSuffix}` + ); + logCursorDecodeDiagnostics( + runtime, + "warn", + `Cursor proxy AgentRunRequest detailed decode diagnostics for ${session.requestId}: ` + + formatAgentRunRequestDecodeDiagnostic(runtime, session.runRequest, chatRequest) + + `; bidi_session=${formatBidiSessionDecodeDiagnostic(runtime, session)}` + ); + return; + } + + runtime.logger?.debug?.(`Cursor proxy decoded AgentRunRequest ${session.requestId} (${diagnostic}).${dumpSuffix}`); + if (Buffer.isBuffer(session.runRequest)) { + const contextValues = decodeAgentRunRequestContextValues(session.runRequest); + const systemPrompt = chatRequest?.messages?.find((message) => message?.role === "system")?.content; + const nativeExtraction = describeCursorNativeToolExtraction(runtime, session.runRequest, contextValues, systemPrompt); + runtime.logger?.debug?.( + `Cursor proxy native tool extraction for ${session.requestId}: ` + + safeJsonStringify(nativeExtraction) + ); + } +} + +function formatAgentRunRequestSummary(runtime, runRequest) { + const chatRequest = convertAgentRunRequestToOpenAIChat(runtime, runRequest); + return chatRequest ? formatChatRequestSummary(chatRequest) : "chat=unavailable"; +} + +function formatChatRequestSummary(chatRequest) { + return formatChatSummary(summarizeChatRequest(chatRequest)); +} + +function formatChatSummary(summary) { + return [ + `messages=${summary.messages}`, + `system=${summary.system}`, + `user=${summary.user}`, + `assistant=${summary.assistant}`, + `tools=${summary.tools}`, + `roles=${summary.roles.join(",") || "none"}` + ].join(", "); +} + +function summarizeChatRequest(chatRequest) { + const messages = Array.isArray(chatRequest?.messages) ? chatRequest.messages : []; + const roles = messages.map((message) => normalizeRole(stringValue(message.role)) || "unknown"); + const system = roles.filter((role) => role === "system").length; + const user = roles.filter((role) => role === "user").length; + const assistant = roles.filter((role) => role === "assistant").length; + const tools = Array.isArray(chatRequest?.tools) ? chatRequest.tools.length : 0; + return { + assistant, + messages: messages.length, + roles, + simplified: messages.length > 0 && system === 0 && tools === 0 && roles.every((role) => role === "user"), + system, + tools, + user + }; +} + +function shouldForwardDecodedCursorTools(runtime) { + return runtime?.forwardDecodedCursorTools === true; +} + +function summarizeDecodedCursorToolForwarding(runtime, runRequest, chatRequest) { + const contextValues = Buffer.isBuffer(runRequest) ? decodeAgentRunRequestContextValues(runRequest) : []; + const decodedTools = Buffer.isBuffer(runRequest) + ? uniqueTools([ + ...extractToolsFromValues(contextValues), + ...extractCursorNativeToolsFromRunRequest(runtime, runRequest, contextValues) + ]) + : []; + const forwardedTools = Array.isArray(chatRequest?.tools) ? chatRequest.tools.length : 0; + const forwardDecodedCursorTools = shouldForwardDecodedCursorTools(runtime); + return { + decodedTools: decodedTools.length, + forwardDecodedCursorTools, + forwardedTools, + nativeToolEnums: Buffer.isBuffer(runRequest) ? extractCursorSupportedToolEnums(runRequest).length : 0, + suppressedTools: forwardDecodedCursorTools ? 0 : decodedTools.length + }; +} + +function shouldLogDecodeDiagnostics(runtime) { + return runtime?.decodeDiagnostics !== false; +} + +function logCursorDecodeDiagnostics(runtime, level, message) { + if (!shouldLogDecodeDiagnostics(runtime)) { + return; + } + const logger = runtime?.logger; + if (level === "warn") { + logger?.warn?.(message); + return; + } + logger?.debug?.(message); +} + +function formatAgentRunRequestDecodeDiagnostic(runtime, runRequest, chatRequest) { + if (!Buffer.isBuffer(runRequest)) { + return safeJsonStringify({ error: "missing-run-request" }); + } + + const embeddedPayloads = decodeJsonPayloadsFromProtoStrings(runRequest); + const contextValues = decodeAgentRunRequestContextValues(runRequest); + const fallbackSystemPrompt = decodeProtoStringField(runRequest, 5); + const systemPrompt = composeAgentSystemPrompt( + contextValues, + selectPreferredSystemPrompt( + decodeProtoStringField(runRequest, 8), + extractSystemPromptFromValues(contextValues), + findBestSystemPromptStringFromValues(contextValues), + looksLikeSystemPromptText(fallbackSystemPrompt) ? fallbackSystemPrompt : undefined + ) + ); + const tools = extractToolsFromValues(contextValues); + const toolChoice = extractToolChoiceFromValues(contextValues); + const toolFilePaths = extractCursorToolFilePaths(contextValues); + const instructionFilePaths = extractCursorInstructionFilePaths(contextValues); + const instructionTexts = extractCursorInstructionTexts(contextValues); + const nativeSupportedTools = extractCursorSupportedToolEnums(runRequest); + const nativeTools = extractCursorNativeToolsFromRunRequest(runtime, runRequest, contextValues, systemPrompt); + const decodedTools = uniqueTools([...tools, ...nativeTools]); + const toolForwarding = summarizeDecodedCursorToolForwarding(runtime, runRequest, chatRequest); + const nativeExtraction = describeCursorNativeToolExtraction(runtime, runRequest, contextValues, systemPrompt); + + return safeJsonStringify(compactObject({ + bytes: runRequest.length, + chat: chatRequest ? summarizeChatRequest(chatRequest) : undefined, + contextValues: summarizeDecodedValuesForDiagnostics(runtime, contextValues), + directStrings: compactObject({ + field5: summarizeLogString(runtime, fallbackSystemPrompt), + field8: summarizeLogString(runtime, decodeProtoStringField(runRequest, 8)), + field18: summarizeLogString(runtime, decodeProtoStringField(runRequest, 18)) + }), + embeddedJson: summarizeJsonPayloadsForDiagnostics(runtime, embeddedPayloads), + extracted: compactObject({ + instructionFiles: instructionFilePaths.length, + instructionFileSamples: instructionFilePaths.slice(0, decodeDiagnosticSampleLimit(runtime)), + instructionTexts: instructionTexts.length, + nativeExtraction, + nativeSupportedToolEnums: summarizeCursorSupportedToolEnums(runtime, nativeSupportedTools), + nativeToolNames: summarizeToolNamesForDiagnostics(runtime, nativeTools), + nativeTools: nativeTools.length, + systemPrompt: summarizeLogString(runtime, systemPrompt), + toolFiles: toolFilePaths.length, + toolFileSamples: toolFilePaths.slice(0, decodeDiagnosticSampleLimit(runtime)), + toolChoice, + toolForwarding, + toolNames: summarizeToolNamesForDiagnostics(runtime, decodedTools), + tools: decodedTools.length + }), + fields: formatProtoFieldSummary(runRequest), + shapeReasons: agentRunRequestShapeReasons(runRequest), + strings: summarizeProtoStringsForDiagnostics(runtime, decodeAllProtoStrings(runRequest)), + topLevel: summarizeAgentRunRequestTopLevel(runRequest) + })); +} + +function formatBidiSessionDecodeDiagnostic(runtime, session) { + if (!session) { + return safeJsonStringify({ error: "missing-session" }); + } + const appends = sortedBidiAppends(session); + return safeJsonStringify({ + appendDetails: formatBidiAppendDetails(appends), + appends: appends.length, + candidates: summarizeCandidateBuffersForDiagnostics(runtime, bidiSessionCandidateBuffers(session)), + combinedDataBinaryBytes: combinedAppendDataBinaryLength(session), + combinedDataBytes: combinedAppendDataBytesLength(session), + combinedDataTextBytes: combinedAppendDataLength(session), + decodedHints: summarizeBidiDecodedHints(session), + lastRunRequestAt: session.lastRunRequestAt || 0, + requestId: session.requestId + }); +} + +function formatCursorNativeProtoDecodeDiagnostic(runtime, path, requestBody, chatRequest) { + const candidates = cursorNativeCandidateBuffers(requestBody); + const runRequest = extractAgentRunRequestFromCandidates(candidates); + return safeJsonStringify(compactObject({ + candidates: summarizeCandidateBuffersForDiagnostics(runtime, candidates), + chat: summarizeChatRequest(chatRequest), + path, + requestBytes: Buffer.isBuffer(requestBody) ? requestBody.length : 0, + runRequest: runRequest ? JSON.parse(formatAgentRunRequestDecodeDiagnostic(runtime, runRequest, chatRequest)) : undefined + })); +} + +function writeAgentRunRequestDecodeDump(runtime, session, runRequest, chatRequest, label = "") { + if (!shouldLogDecodeDiagnostics(runtime) || runtime?.decodeDumpFull === false || !Buffer.isBuffer(runRequest)) { + return ""; + } + const dumpDir = stringValue(runtime.decodeDumpDir) || DEFAULT_DECODE_DUMP_DIR; + try { + fs.mkdirSync(dumpDir, { recursive: true }); + const labelSuffix = label ? `-${sanitizeRouteId(label)}` : ""; + const fileName = `${sanitizeRouteId(session?.requestId || "agent-run")}${labelSuffix}-${Date.now()}.json`; + const filePath = path.join(dumpDir, fileName); + fs.writeFileSync( + filePath, + `${JSON.stringify(buildAgentRunRequestDecodeDump(runtime, session, runRequest, chatRequest, label), null, 2)}\n`, + "utf8" + ); + return filePath; + } catch (error) { + runtime?.logger?.warn?.(`Cursor proxy failed to write full decode dump: ${formatError(error)}`); + return ""; + } +} + +function buildAgentRunRequestDecodeDump(runtime, session, runRequest, chatRequest, label = "") { + const contextValues = decodeAgentRunRequestContextValues(runRequest); + const embeddedPayloads = decodeJsonPayloadsFromProtoStrings(runRequest); + const toolFilePaths = extractCursorToolFilePaths(contextValues); + const instructionFilePaths = extractCursorInstructionFilePaths(contextValues); + const tools = extractToolsFromValues(contextValues); + const nativeSupportedTools = extractCursorSupportedToolEnums(runRequest); + const nativeTools = extractCursorNativeToolsFromRunRequest( + runtime, + runRequest, + contextValues, + chatRequest?.messages?.find((message) => message?.role === "system")?.content + ); + const appends = session ? sortedBidiAppends(session) : []; + const toolForwarding = summarizeDecodedCursorToolForwarding(runtime, runRequest, chatRequest); + + return { + appends: appends.map((append) => ({ + appendSeqno: append.appendSeqno, + dataBase64: append.dataBytes.length > 0 ? append.dataBytes.toString("base64") : undefined, + dataBinaryBase64: append.dataBinary.length > 0 ? append.dataBinary.toString("base64") : undefined, + dataBytes: append.dataBytes.length, + dataText: append.data || undefined, + requestId: append.requestId, + rpcBodyBase64: append.rpcBody.length > 0 ? append.rpcBody.toString("base64") : undefined, + rpcBodyBytes: append.rpcBody.length, + rpcBodyEncoding: append.rpcBodyEncoding + })), + chatRequest, + contextValues: contextValues.map((value) => serializeDiagnosticValue(value)), + embeddedJsonPayloads: embeddedPayloads.map((value) => serializeDiagnosticValue(value)), + extracted: { + instructionFileContents: instructionFilePaths.map((filePath) => ({ + content: readTextFileIfSmall(filePath, 256 * 1024), + path: filePath + })), + instructionFilePaths, + nativeSupportedTools, + nativeExtraction: describeCursorNativeToolExtraction( + runtime, + runRequest, + contextValues, + chatRequest?.messages?.find((message) => message?.role === "system")?.content + ), + nativeToolNames: nativeTools.map((tool) => stringValue(tool?.function?.name) || stringValue(tool?.name) || "unknown"), + nativeTools, + systemPrompt: chatRequest?.messages?.find((message) => message?.role === "system")?.content, + toolFileContents: toolFilePaths.map((filePath) => ({ + json: readJsonText(readTextFileIfSmall(filePath, 256 * 1024)), + path: filePath + })), + toolFilePaths, + toolForwarding, + toolNames: uniqueTools([...tools, ...nativeTools]) + .map((tool) => stringValue(tool?.function?.name) || stringValue(tool?.name) || stringValue(tool?.type) || "unknown"), + tools: uniqueTools([...tools, ...nativeTools]) + }, + label, + proto: decodeProtoTree(runRequest, { + maxDepth: Math.max(1, Math.trunc(Number(runtime?.decodeTreeDepth) || DEFAULT_DECODE_TREE_DEPTH)), + path: "" + }), + raw: { + base64: runRequest.toString("base64"), + bytes: runRequest.length, + fieldSummary: formatProtoFieldSummary(runRequest), + hex: runRequest.toString("hex") + }, + requestId: session?.requestId || "", + strings: decodeAllProtoStringsWithPaths(runRequest), + summary: { + chat: chatRequest ? summarizeChatRequest(chatRequest) : undefined, + contextValues: summarizeDecodedValuesForDiagnostics(runtime, contextValues), + embeddedJson: summarizeJsonPayloadsForDiagnostics(runtime, embeddedPayloads), + fields: formatProtoFieldSummary(runRequest), + shapeReasons: agentRunRequestShapeReasons(runRequest) + }, + timestamp: new Date().toISOString() + }; +} + +function decodeProtoTree(buffer, options = {}, depth = 0, seen = new Set()) { + if (!Buffer.isBuffer(buffer)) { + return { error: "not-buffer" }; + } + const maxDepth = Math.max(0, Math.trunc(Number(options.maxDepth) || DEFAULT_DECODE_TREE_DEPTH)); + const currentPath = stringValue(options.path) || ""; + const key = `${buffer.length}:${buffer.subarray(0, 32).toString("hex")}`; + if (seen.has(key)) { + return { bytes: buffer.length, circular: true, path: currentPath }; + } + seen.add(key); + + const fields = []; + forEachProtoField(buffer, (field) => { + const fieldPath = currentPath ? `${currentPath}.${field.fieldNumber}` : String(field.fieldNumber); + fields.push(decodeProtoFieldForDump(field, fieldPath, maxDepth, depth, seen)); + }); + seen.delete(key); + + return { + bytes: buffer.length, + fields, + path: currentPath + }; +} + +function decodeProtoFieldForDump(field, fieldPath, maxDepth, depth, seen) { + const base = { + fieldNumber: field.fieldNumber, + path: fieldPath, + wireType: field.wireType, + wireTypeName: protoWireTypeName(field.wireType) + }; + if (field.wireType === 0) { + return { ...base, value: field.value.toString() }; + } + if (field.wireType === 1 || field.wireType === 5) { + return { + ...base, + base64: field.value.toString("base64"), + bytes: field.value.length, + hex: field.value.toString("hex") + }; + } + if (field.wireType !== 2) { + return base; + } + + const text = field.value.length > 0 && looksLikeTextBuffer(field.value) ? field.value.toString("utf8") : undefined; + const parsedJson = text !== undefined ? readJsonText(text) : undefined; + const canNest = depth < maxDepth && field.value.length > 0 && hasReadableProtoFields(field.value); + return compactObject({ + ...base, + base64: field.value.toString("base64"), + bytes: field.value.length, + children: canNest ? decodeProtoTree(field.value, { maxDepth, path: fieldPath }, depth + 1, seen).fields : undefined, + json: parsedJson !== undefined ? serializeDiagnosticValue(parsedJson) : undefined, + text + }); +} + +function decodeAllProtoStringsWithPaths(buffer, pathPrefix = "", depth = 0) { + if (!Buffer.isBuffer(buffer) || depth > 12) { + return []; + } + const values = []; + forEachProtoField(buffer, (field) => { + const fieldPath = pathPrefix ? `${pathPrefix}.${field.fieldNumber}` : String(field.fieldNumber); + if (field.wireType !== 2 || field.value.length === 0) { + return; + } + if (looksLikeTextBuffer(field.value)) { + const text = field.value.toString("utf8"); + values.push({ + fieldNumber: field.fieldNumber, + length: text.length, + path: fieldPath, + value: text + }); + } + values.push(...decodeAllProtoStringsWithPaths(field.value, fieldPath, depth + 1)); + }); + return values; +} + +function protoWireTypeName(wireType) { + if (wireType === 0) { + return "varint"; + } + if (wireType === 1) { + return "fixed64"; + } + if (wireType === 2) { + return "length-delimited"; + } + if (wireType === 5) { + return "fixed32"; + } + return "unknown"; +} + +function serializeDiagnosticValue(value, seen = new Set()) { + if (typeof value === "bigint") { + return value.toString(); + } + if (Buffer.isBuffer(value)) { + return { + base64: value.toString("base64"), + bytes: value.length, + hex: value.toString("hex") + }; + } + if (Array.isArray(value)) { + return value.map((item) => serializeDiagnosticValue(item, seen)); + } + if (isRecord(value)) { + if (seen.has(value)) { + return "[Circular]"; + } + seen.add(value); + const result = {}; + for (const [key, rawValue] of Object.entries(value)) { + result[key] = serializeDiagnosticValue(rawValue, seen); + } + seen.delete(value); + return result; + } + return value; +} + +function formatCandidateBufferSummary(runtime, candidates) { + return safeJsonStringify(summarizeCandidateBuffersForDiagnostics(runtime, candidates)); +} + +function summarizeCandidateBuffersForDiagnostics(runtime, candidates) { + const unique = uniqueBuffers(Array.isArray(candidates) ? candidates : []); + return { + samples: unique + .slice(0, decodeDiagnosticSampleLimit(runtime)) + .map((buffer, index) => summarizeBufferForDiagnostics(runtime, buffer, index)), + total: Array.isArray(candidates) ? candidates.length : 0, + unique: unique.length + }; +} + +function summarizeBufferForDiagnostics(runtime, buffer, index) { + const strings = decodeAllProtoStrings(buffer); + return compactObject({ + bytes: Buffer.isBuffer(buffer) ? buffer.length : 0, + fields: formatProtoFieldSummary(buffer), + headHex: Buffer.isBuffer(buffer) ? buffer.subarray(0, 32).toString("hex") : undefined, + index, + shapeReasons: agentRunRequestShapeReasons(buffer), + strings: summarizeProtoStringsForDiagnostics(runtime, strings), + textSample: Buffer.isBuffer(buffer) && looksLikeTextBuffer(buffer) + ? truncateForLog(runtime, buffer.toString("utf8")) + : undefined + }); +} + +function summarizeAgentRunRequestTopLevel(runRequest) { + const conversationState = decodeProtoMessageFields(runRequest, 1)[0]; + const action = decodeProtoMessageFields(runRequest, 2)[0]; + const modelDetails = decodeProtoMessageFields(runRequest, 3)[0]; + const requestedModel = decodeProtoMessageFields(runRequest, 9)[0]; + return compactObject({ + action: summarizeProtoBufferForDiagnostics(action), + conversationActionMessages: action ? decodeConversationActionMessages(action).length : 0, + conversationState: summarizeProtoBufferForDiagnostics(conversationState), + conversationStateMessages: conversationState ? decodeConversationStateMessages(conversationState).length : 0, + modelDetails: summarizeProtoBufferForDiagnostics(modelDetails), + requestedModel: summarizeProtoBufferForDiagnostics(requestedModel) + }); +} + +function summarizeProtoBufferForDiagnostics(buffer) { + if (!Buffer.isBuffer(buffer) || buffer.length === 0) { + return undefined; + } + return { + bytes: buffer.length, + fields: formatProtoFieldSummary(buffer), + strings: decodeAllProtoStrings(buffer).length + }; +} + +function agentRunRequestShapeReasons(buffer) { + if (!Buffer.isBuffer(buffer) || buffer.length === 0) { + return []; + } + const reasons = []; + const conversationState = decodeProtoMessageFields(buffer, 1)[0]; + const conversationAction = decodeProtoMessageFields(buffer, 2)[0]; + const modelDetails = decodeProtoMessageFields(buffer, 3)[0]; + const requestedModel = decodeProtoMessageFields(buffer, 9)[0]; + const field5 = decodeProtoStringField(buffer, 5); + const field8 = decodeProtoStringField(buffer, 8); + const field18 = decodeProtoStringField(buffer, 18); + if (looksLikeConversationState(conversationState)) { + reasons.push("field1:conversation_state"); + } + if (looksLikeConversationAction(conversationAction)) { + reasons.push("field2:conversation_action"); + } + if (looksLikeModelDetails(modelDetails)) { + reasons.push("field3:model_details"); + } + if (looksLikeRequestedModel(requestedModel)) { + reasons.push("field9:requested_model"); + } + if (field5) { + reasons.push(`field5:string:${field5.length}`); + } + if (field8) { + reasons.push(`field8:string:${field8.length}`); + } + if (field18) { + reasons.push(`field18:string:${field18.length}`); + } + return reasons; +} + +function summarizeProtoStringsForDiagnostics(runtime, strings) { + const values = Array.isArray(strings) + ? strings.filter((item) => item && typeof item.value === "string" && item.value.length > 0) + : []; + const unique = []; + const seen = new Set(); + const toolKeyPattern = new RegExp(`\\b(?:${CURSOR_TOOL_KEYS.map(escapeRegExp).join("|")})\\b`, "i"); + for (const item of values) { + const key = `${item.fieldNumber}:${item.value}`; + if (seen.has(key)) { + continue; + } + seen.add(key); + unique.push(item); + } + return { + count: values.length, + jsonLike: values.filter((item) => readJsonText(item.value) !== undefined).length, + jsonLikeSamples: sampleProtoStringItemsForDiagnostics( + runtime, + unique.filter((item) => readJsonText(item.value) !== undefined) + ), + maxLength: values.reduce((max, item) => Math.max(max, item.value.length), 0), + samples: unique + .filter((item) => !looksLikeNoiseString(item.value)) + .slice(0, decodeDiagnosticSampleLimit(runtime)) + .map((item) => ({ + field: item.fieldNumber, + length: item.value.length, + sample: truncateForLog(runtime, item.value) + })), + systemLike: values.filter((item) => looksLikeSystemPromptText(item.value)).length, + systemLikeSamples: sampleProtoStringItemsForDiagnostics( + runtime, + unique.filter((item) => looksLikeSystemPromptText(item.value)) + ), + toolKeyLike: values.filter((item) => toolKeyPattern.test(item.value)).length, + toolKeyLikeSamples: sampleProtoStringItemsForDiagnostics( + runtime, + unique.filter((item) => toolKeyPattern.test(item.value)) + ), + unique: unique.length + }; +} + +function sampleProtoStringItemsForDiagnostics(runtime, items) { + return (Array.isArray(items) ? items : []) + .filter((item) => item && typeof item.value === "string" && !looksLikeNoiseString(item.value)) + .slice(0, decodeDiagnosticSampleLimit(runtime)) + .map((item) => ({ + field: item.fieldNumber, + length: item.value.length, + sample: truncateForLog(runtime, item.value) + })); +} + +function summarizeDecodedValuesForDiagnostics(runtime, values) { + const list = Array.isArray(values) ? values : []; + const strings = list.filter((value) => typeof value === "string"); + const records = list.filter(isRecord); + const arrays = list.filter(Array.isArray); + const toolKeyPattern = new RegExp(`\\b(?:${CURSOR_TOOL_KEYS.map(escapeRegExp).join("|")})\\b`, "i"); + return { + arrays: arrays.length, + records: records.length, + samples: list + .filter((value) => typeof value === "string" && !looksLikeNoiseString(value)) + .slice(0, decodeDiagnosticSampleLimit(runtime)) + .map((value) => ({ + length: value.length, + sample: truncateForLog(runtime, value) + })), + strings: strings.length, + systemLike: strings.filter(looksLikeSystemPromptText).length, + systemLikeSamples: strings + .filter(looksLikeSystemPromptText) + .slice(0, decodeDiagnosticSampleLimit(runtime)) + .map((value) => ({ + length: value.length, + sample: truncateForLog(runtime, value) + })), + toolKeyLike: strings.filter((value) => toolKeyPattern.test(value)).length, + toolKeyLikeSamples: strings + .filter((value) => toolKeyPattern.test(value)) + .slice(0, decodeDiagnosticSampleLimit(runtime)) + .map((value) => ({ + length: value.length, + sample: truncateForLog(runtime, value) + })), + total: list.length + }; +} + +function summarizeJsonPayloadsForDiagnostics(runtime, payloads) { + const values = Array.isArray(payloads) ? payloads : []; + return { + count: values.length, + samples: values + .slice(0, decodeDiagnosticSampleLimit(runtime)) + .map((value) => summarizeJsonPayloadForDiagnostics(runtime, value)) + }; +} + +function summarizeJsonPayloadForDiagnostics(runtime, value) { + const tools = extractTools(value); + const messages = extractMessages(value); + return compactObject({ + keys: isRecord(value) ? Object.keys(value).slice(0, 24) : undefined, + messageRoles: messages.map((message) => normalizeRole(stringValue(message.role)) || "unknown").slice(0, 16), + messages: messages.length, + systemPrompt: summarizeLogString(runtime, extractSystemPrompt(value)), + toolChoice: extractToolChoice(value), + toolNames: summarizeToolNamesForDiagnostics(runtime, tools), + tools: tools.length, + type: Array.isArray(value) ? "array" : typeof value + }); +} + +function summarizeToolNamesForDiagnostics(runtime, tools) { + if (!Array.isArray(tools) || tools.length === 0) { + return []; + } + return tools + .slice(0, decodeDiagnosticSampleLimit(runtime)) + .map((tool) => stringValue(tool?.function?.name) || stringValue(tool?.name) || stringValue(tool?.type) || "unknown"); +} + +function summarizeLogString(runtime, value) { + if (typeof value !== "string" || value.length === 0) { + return undefined; + } + return { + length: value.length, + sample: truncateForLog(runtime, value) + }; +} + +function truncateForLog(runtime, value) { + const text = String(value || "").replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f]/g, "?"); + const maxLength = Math.max(16, Math.trunc(Number(runtime?.decodeDiagnosticSampleChars) || DEFAULT_DECODE_DIAGNOSTIC_SAMPLE_CHARS)); + return text.length > maxLength ? `${text.slice(0, maxLength)}...<${text.length}>` : text; +} + +function decodeDiagnosticSampleLimit(runtime) { + return Math.max(1, Math.trunc(Number(runtime?.decodeDiagnosticSampleLimit) || DEFAULT_DECODE_DIAGNOSTIC_SAMPLE_LIMIT)); +} + +function isSimplifiedAgentChatRequest(chatRequest) { + return summarizeChatRequest(chatRequest).simplified; +} + +function decodeConversationStateMessages(conversationState) { + const messages = []; + for (const rawJson of decodeProtoStringFields(conversationState, 1)) { + const parsed = readJsonText(rawJson); + const normalized = normalizeMessages(parsed); + if (normalized.length > 0) { + messages.push(...normalized); + } else if (parsed !== undefined && typeof parsed !== "string") { + const embeddedMessages = extractMessages(parsed); + const systemPrompt = extractSystemPrompt(parsed); + if (systemPrompt) { + messages.push({ content: systemPrompt, role: "system" }); + } + if (embeddedMessages.length > 0) { + messages.push(...embeddedMessages); + } + } else if (typeof parsed === "string" && parsed.trim()) { + messages.push({ content: parsed.trim(), role: "system" }); + } else if (rawJson.trim()) { + messages.push({ content: rawJson.trim(), role: "system" }); + } + } + + for (const turn of decodeProtoMessageFields(conversationState, 8)) { + messages.push(...decodeConversationTurnMessages(turn)); + } + return messages; +} + +function decodeConversationTurnMessages(turn) { + const messages = []; + const agentTurn = decodeProtoMessageFields(turn, 1)[0]; + if (!agentTurn) { + return messages; + } + + const userMessage = decodeUserMessage(decodeProtoMessageFields(agentTurn, 1)[0]); + if (userMessage) { + messages.push({ content: userMessage, role: "user" }); + } + + const assistantChunks = []; + for (const step of decodeProtoMessageFields(agentTurn, 2)) { + const assistantMessage = decodeProtoMessageFields(step, 1)[0]; + const text = decodeProtoStringField(assistantMessage, 1); + if (text) { + assistantChunks.push(text); + } + } + if (assistantChunks.length > 0) { + messages.push({ content: assistantChunks.join("\n"), role: "assistant" }); + } + return messages; +} + +function decodeConversationActionMessages(action) { + const messages = []; + const userMessageAction = decodeProtoMessageFields(action, 1)[0]; + if (userMessageAction) { + for (const prepend of decodeProtoMessageFields(userMessageAction, 4)) { + const text = decodeUserMessage(prepend); + if (text) { + messages.push({ content: text, role: "user" }); + } + } + const text = decodeUserMessage(decodeProtoMessageFields(userMessageAction, 1)[0]); + if (text) { + messages.push({ content: text, role: "user" }); + } + } + + const startPlanAction = decodeProtoMessageFields(action, 6)[0]; + const startPlanUserMessage = decodeUserMessage(decodeProtoMessageFields(startPlanAction, 1)[0]); + if (startPlanUserMessage) { + messages.push({ content: startPlanUserMessage, role: "user" }); + } + + return messages; +} + +function decodeUserMessage(message) { + return decodeProtoStringField(message, 1) || decodeProtoStringField(message, 8) || ""; +} + +function decodeRequestedModelParameters(requestedModel) { + const result = {}; + for (const parameter of decodeProtoMessageFields(requestedModel, 3)) { + const id = decodeProtoStringField(parameter, 1); + const value = decodeProtoStringField(parameter, 2); + if (id && value) { + result[id] = value; + } + } + return result; +} + +function compactChatMessages(messages) { + const result = []; + for (const message of messages) { + if (!message?.role) { + continue; + } + const content = normalizeChatMessageContent(message.content); + const toolCalls = Array.isArray(message.tool_calls) ? message.tool_calls.filter(Boolean) : undefined; + const functionCall = isRecord(message.function_call) ? message.function_call : undefined; + if (!hasChatMessageContent(content) && (!toolCalls || toolCalls.length === 0) && !functionCall) { + continue; + } + const compacted = compactObject({ + ...message, + content: hasChatMessageContent(content) ? content : message.role === "assistant" ? "" : undefined, + function_call: functionCall, + tool_calls: toolCalls && toolCalls.length > 0 ? toolCalls : undefined + }); + const last = result[result.length - 1]; + if (isDuplicateSystemMessage(last, compacted)) { + continue; + } + if (canMergeChatMessages(last, compacted)) { + last.content = `${last.content}\n\n${compacted.content.trim()}`; + } else { + result.push(compacted); + } + } + return result; +} + +function isDuplicateSystemMessage(left, right) { + return left?.role === "system" && + right?.role === "system" && + typeof left.content === "string" && + typeof right.content === "string" && + left.content.trim() === right.content.trim() && + !hasChatToolFields(left) && + !hasChatToolFields(right); +} + +function canMergeChatMessages(left, right) { + return left?.role === right?.role && + typeof left.content === "string" && + typeof right.content === "string" && + !hasChatToolFields(left) && + !hasChatToolFields(right); +} + +function hasChatToolFields(message) { + return Boolean( + message?.function_call || + message?.name || + message?.tool_call_id || + (Array.isArray(message?.tool_calls) && message.tool_calls.length > 0) + ); +} + +function hasChatMessageContent(content) { + if (typeof content === "string") { + return content.trim().length > 0; + } + if (Array.isArray(content)) { + return content.length > 0; + } + return content !== undefined && content !== null; +} + +function normalizeChatMessageContent(content) { + if (typeof content === "string") { + return content.trim(); + } + if (Array.isArray(content)) { + return content.filter((item) => item !== undefined && item !== null); + } + return content; +} + +function numberFromParameter(value) { + if (value === undefined) { + return undefined; + } + const number = Number(value); + return Number.isFinite(number) ? number : undefined; +} + +function looksLikeNoiseString(value) { + return /^[0-9a-f-]{16,}$/i.test(value) || + /^cursor[-_a-z0-9.]*$/i.test(value) || + value.startsWith("data:") || + value.startsWith("file:") || + value.startsWith("vscode:"); +} + +function looksLikeSystemPromptText(value) { + if (!value || value.length < 20 || looksLikeNoiseString(value)) { + return false; + } + return /\b(system|developer|instruction|assistant|rules?|tools?|you are|you should|must)\b/i.test(value) || + /你是|系统|规则|工具|助手|必须|请遵守/.test(value); +} + +function routeJsonRequestBody(runtime, requestBody) { + const payload = readJsonLikePayload(requestBody); + if (!isRecord(payload)) { + return { body: requestBody, routed: false }; + } + + const routedPayload = { ...payload }; + const decision = applyCursorProxyRouting(runtime, routedPayload); + if (!decision.routed) { + return { body: requestBody, routed: false }; + } + + return { + body: Buffer.from(`${JSON.stringify(routedPayload)}\n`, "utf8"), + routed: true + }; +} + +function prepareOpenAIChatRequestBody(runtime, requestBody) { + const payload = readJsonLikePayload(requestBody); + if (!isRecord(payload)) { + return { body: requestBody, routed: false }; + } + + const preparedPayload = { ...payload }; + const contextChanged = applyOpenAICompatChatContext(runtime, preparedPayload); + const usageChanged = ensureOpenAIStreamUsage(preparedPayload); + const changed = contextChanged || usageChanged; + const decision = applyCursorProxyRouting(runtime, preparedPayload); + if (!changed && !decision.routed) { + return { body: requestBody, routed: false }; + } + + return { + body: Buffer.from(`${JSON.stringify(preparedPayload)}\n`, "utf8"), + routed: decision.routed + }; +} + +function ensureOpenAIStreamUsage(body) { + if (body.stream !== true) { + return false; + } + + const streamOptions = isRecord(body.stream_options) ? { ...body.stream_options } : {}; + if (streamOptions.include_usage === true) { + return false; + } + body.stream_options = { ...streamOptions, include_usage: true }; + return true; +} + +function applyOpenAICompatChatContext(runtime, body) { + if (!Array.isArray(body.messages)) { + return false; + } + + let changed = applyCollectedOpenAICompatChatContext(runtime, body); + const messages = body.messages.filter((message) => isRecord(message)); + const missingSystem = !hasSystemInstruction(body, messages); + const missingTools = !Array.isArray(body.tools) || body.tools.length === 0; + const missingToolChoice = body.tool_choice === undefined && body.toolChoice === undefined; + const simplified = isSimplifiedOpenAICompatChat(body, messages); + + if (missingSystem && runtime.chatCompletionSystemPrompt) { + body.messages = [ + { content: runtime.chatCompletionSystemPrompt, role: "system" }, + ...body.messages + ]; + changed = true; + } + + if (missingTools && runtime.chatCompletionTools.length > 0) { + body.tools = runtime.chatCompletionTools; + changed = true; + } + + if (missingToolChoice && body.tools && runtime.chatCompletionToolChoice !== undefined) { + body.tool_choice = runtime.chatCompletionToolChoice; + changed = true; + } + + if (simplified && !changed && runtime.warnedMissingChatContext !== true) { + runtime.warnedMissingChatContext = true; + runtime.logger?.warn?.( + "Cursor proxy received an OpenAI-compatible chat request with only user messages and no system/tools. " + + "The incoming request does not contain Cursor Agent context; configure cursor-proxy config.systemPrompt/config.tools " + + "or use Cursor's native Agent traffic so the proxy can forward tools and system prompts." + ); + } + + return changed; +} + +function applyCollectedOpenAICompatChatContext(runtime, body) { + const collected = findCollectedCursorContext(runtime, undefined, undefined, body); + if (!collected) { + return false; + } + + const merged = mergeCollectedCursorChatRequest(body, collected.chatRequest); + for (const key of Object.keys(body)) { + delete body[key]; + } + Object.assign(body, merged); + runtime.logger?.debug?.( + `Cursor proxy applied collected Cursor context to OpenAI-compatible request ` + + `(${formatChatRequestSummary(body)}).` + ); + return true; +} + +function hasSystemInstruction(body, messages) { + return Boolean( + body.system !== undefined || + body.systemPrompt !== undefined || + body.instructions !== undefined || + messages.some((message) => normalizeRole(stringValue(message.role)) === "system") + ); +} + +function isSimplifiedOpenAICompatChat(body, messages) { + return messages.length > 0 && + messages.every((message) => normalizeRole(stringValue(message.role)) === "user") && + !hasSystemInstruction(body, messages) && + (!Array.isArray(body.tools) || body.tools.length === 0); +} + +function applyCursorProxyRouting(runtime, body) { + if (!isRecord(body)) { + return { requestedModel: "", routed: false }; + } + + const requestedModel = stringValue(body.model) || runtime.defaultModel || "cursor-proxy"; + const routing = runtime.routing; + if (routing && routing.enabled !== false) { + const route = resolveCursorProxyRoute(routing, body, requestedModel); + if (route?.target) { + body.model = route.target; + runtime.logger?.debug?.( + `Cursor proxy routed model ${requestedModel || ""} to ${route.target} (${route.reason}).` + ); + return { + requestedModel, + reason: route.reason, + routed: true, + routedModel: route.target + }; + } + } + + const legacyTarget = normalizeRouteTarget( + composeRouteTarget(runtime.targetProvider, runtime.targetModel) || + stringValue(runtime.targetModel) + ); + if (legacyTarget) { + body.model = legacyTarget; + return { + requestedModel, + reason: "legacy-target", + routed: true, + routedModel: legacyTarget + }; + } + + if (isCursorDefaultModel(requestedModel) && runtime.defaultModel && runtime.defaultModel !== requestedModel) { + body.model = runtime.defaultModel; + return { + requestedModel, + reason: "configured-default-model", + routed: true, + routedModel: runtime.defaultModel + }; + } + + return { requestedModel, routed: false }; +} + +function resolveCursorProxyRoute(routing, body, requestedModel) { + for (const rule of routing.rules || []) { + if (rule.enabled === false || !rule.target) { + continue; + } + if (matchesCursorProxyRouteRule(rule, body, requestedModel)) { + return { + reason: rule.id ? `plugin-rule:${rule.id}` : `plugin-rule:${rule.type}`, + target: rule.target + }; + } + } + + if (routing.defaultTarget) { + return { + reason: "plugin-default", + target: routing.defaultTarget + }; + } + + return undefined; +} + +function matchesCursorProxyRouteRule(rule, body, requestedModel) { + switch (rule.type) { + case "always": + return true; + case "image": + return hasImageContent(body?.messages) || hasImageContent(body?.input); + case "long-context": + return estimateTokenCount(body) > (rule.threshold || 200000); + case "model": + return Boolean(rule.model && requestedModel === rule.model); + case "model-prefix": + return Boolean(rule.pattern && requestedModel?.startsWith(rule.pattern)); + case "thinking": + return Boolean(body?.thinking || body?.reasoning || body?.reasoning_effort); + case "web-search": + return hasWebSearchTool(body?.tools); + default: + return false; + } +} + +function normalizeCursorProxyRouting(value, options = {}) { + const fallbackTarget = normalizeRouteTarget( + composeRouteTarget(options.targetProvider, options.targetModel) || + stringValue(options.targetModel) + ); + const record = isRecord(value) ? value : {}; + const rules = []; + + if (isRecord(record.modelMap)) { + for (const [model, target] of Object.entries(record.modelMap)) { + const normalizedTarget = normalizeRouteTarget(stringValue(target)); + const normalizedModel = stringValue(model); + if (!normalizedModel || !normalizedTarget) { + continue; + } + rules.push({ + enabled: true, + id: `model-${sanitizeRouteId(normalizedModel)}`, + model: normalizedModel, + name: normalizedModel, + target: normalizedTarget, + type: "model" + }); + } + } + + if (Array.isArray(record.rules)) { + record.rules.forEach((rule, index) => { + const normalized = normalizeCursorProxyRoutingRule(rule, index); + if (normalized) { + rules.push(normalized); + } + }); + } + + return { + defaultTarget: normalizeRouteTarget(stringValue(record.default) || stringValue(record.defaultTarget)) || fallbackTarget, + enabled: value === false ? false : record.enabled !== false, + rules + }; +} + +function normalizeCursorProxyRoutingRule(value, index) { + if (!isRecord(value)) { + return undefined; + } + + const type = stringValue(value.type) || "model"; + if (!CURSOR_PROXY_ROUTE_TYPES.has(type)) { + return undefined; + } + + const target = normalizeRouteTarget( + stringValue(value.target) || + composeRouteTarget(value.targetProvider, value.targetModel) || + stringValue(value.targetModel) + ); + if (!target) { + return undefined; + } + + const model = stringValue(value.model) || stringValue(value.sourceModel); + const pattern = stringValue(value.pattern) || (type === "model-prefix" ? model : undefined); + const threshold = positiveNumber(value.threshold) || positiveNumber(value.tokenThreshold); + const id = stringValue(value.id) || `${type}-${index + 1}`; + return { + enabled: value.enabled !== false, + id, + name: stringValue(value.name) || id, + ...(model ? { model } : {}), + ...(pattern ? { pattern } : {}), + target, + ...(threshold ? { threshold } : {}), + type + }; +} + +function normalizeRouteTarget(value) { + const raw = stringValue(value); + if (!raw) { + return undefined; + } + + const commaIndex = raw.indexOf(","); + if (commaIndex > 0 && commaIndex < raw.length - 1) { + const provider = raw.slice(0, commaIndex).trim(); + const model = raw.slice(commaIndex + 1).trim(); + return provider && model ? `${provider}/${model}` : undefined; + } + + return raw; +} + +function composeRouteTarget(providerValue, modelValue) { + const provider = stringValue(providerValue); + const model = stringValue(modelValue); + if (provider && model) { + return `${provider}/${model}`; + } + return model || provider; +} + +function positiveNumber(value) { + const number = Number(value); + return Number.isFinite(number) && number > 0 ? number : undefined; +} + +function hasWebSearchTool(tools) { + return Array.isArray(tools) && tools.some((tool) => isRecord(tool) && stringValue(tool.type)?.startsWith("web_search")); +} + +function hasImageContent(value) { + return value !== undefined && JSON.stringify(value).includes("\"image\""); +} + +function estimateTokenCount(body) { + return Math.max(1, Math.ceil(JSON.stringify(body || {}).length / 4)); +} + +function isCursorDefaultModel(model) { + const normalized = stringValue(model).toLowerCase(); + return normalized === "default" || normalized === "auto" || normalized === "cursor-default"; +} + +function sanitizeRouteId(value) { + return String(value || "") + .toLowerCase() + .replace(/[^a-z0-9._-]+/g, "-") + .replace(/^-+|-+$/g, "") + .slice(0, 80) || "route"; +} + +function escapeRegExp(value) { + return String(value).replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); +} + +async function streamGatewayChatToCursor(runtime, request, response, chatRequest, bridgeContext) { + const requestBody = { ...chatRequest, stream: true }; + ensureOpenAIStreamUsage(requestBody); + const routingDecision = applyCursorProxyRouting(runtime, requestBody); + const body = Buffer.from(`${JSON.stringify(requestBody)}\n`, "utf8"); + const headers = buildGatewayHeaders( + runtime, + {}, + { body, method: "POST", path: "/v1/chat/completions", protocol: "openai", skipRuntimeTargetHeaders: routingDecision.routed }, + body + ); + const targetUrl = new URL("/v1/chat/completions", runtime.gatewayUrl); + const transport = targetUrl.protocol === "https:" ? https : http; + + return await new Promise((resolve) => { + let settled = false; + const streamState = createGatewayStreamState(); + const finishTurn = (outcome = { type: "done" }) => { + if (!settled) { + settled = true; + writeCursorConnectMessage(response, encodeCursorAgentTurnEnded()); + finishCursorConnectStream(response); + resolve(outcome); + } + }; + const finishToolBridge = () => { + if (settled) { + return; + } + + const toolCalls = finalizeGatewayToolCalls(streamState); + if (toolCalls.length === 0 && streamState.finishReason !== "tool_calls") { + finishTurn({ type: "done" }); + return; + } + + const summary = summarizeGatewayToolCalls(toolCalls); + const canBridge = bridgeContext && runtime.bridgeOpenAIToolCalls === true && toolCalls.length > 0; + if (!canBridge) { + handleUnbridgedGatewayToolCalls(runtime, response, toolCalls, streamState, bridgeContext); + finishTurn({ finishReason: streamState.finishReason, toolCalls, type: "done" }); + return; + } + + const bridgeResult = bridgeGatewayToolCallsToCursor(runtime, response, toolCalls, bridgeContext, streamState); + if (bridgeResult.sent !== toolCalls.length || bridgeResult.missing.length > 0) { + handleUnbridgedGatewayToolCalls(runtime, response, toolCalls, streamState, bridgeContext, bridgeResult); + finishTurn({ finishReason: streamState.finishReason, toolCalls, type: "done" }); + return; + } + + settled = true; + runtime.logger?.debug?.( + `Cursor proxy bridged upstream tool_calls to Cursor Agent ` + + `(${summary || "tool_calls requested"}, model_call_id=${streamState.modelCallId || "unknown"}).` + ); + resolve({ + finishReason: streamState.finishReason, + modelCallId: streamState.modelCallId, + toolCalls, + type: "tool_calls" + }); + }; + + const upstreamRequest = transport.request( + { + headers, + hostname: targetUrl.hostname, + method: "POST", + path: `${targetUrl.pathname}${targetUrl.search}`, + port: targetUrl.port || (targetUrl.protocol === "https:" ? 443 : 80), + protocol: targetUrl.protocol + }, + (upstreamResponse) => { + const chunks = []; + let sseBuffer = ""; + const statusCode = upstreamResponse.statusCode || 502; + const contentType = readHeader(upstreamResponse.headers["content-type"]).toLowerCase(); + + upstreamResponse.on("data", (chunk) => { + const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); + if (statusCode >= 400 || !contentType.includes("event-stream")) { + chunks.push(buffer); + return; + } + sseBuffer += buffer.toString("utf8"); + const lines = sseBuffer.split(/\r?\n/); + sseBuffer = lines.pop() || ""; + for (const line of lines) { + handleGatewayStreamLine(response, line, streamState); + } + }); + + upstreamResponse.once("end", () => { + if (statusCode >= 400) { + const message = Buffer.concat(chunks).toString("utf8").trim() || `Gateway returned HTTP ${statusCode}.`; + writeCursorConnectMessage(response, encodeCursorAgentTextDelta(message)); + finishTurn({ statusCode, type: "done" }); + return; + } else if (!contentType.includes("event-stream")) { + const text = Buffer.concat(chunks).toString("utf8"); + collectGatewayToolCallsFromJsonText(text, streamState); + const message = extractTextFromGatewayJson(text); + if (message) { + writeCursorConnectMessage(response, encodeCursorAgentTextDelta(message)); + } + finishToolBridge(); + return; + } else if (sseBuffer.trim()) { + handleGatewayStreamLine(response, sseBuffer, streamState); + } + finishToolBridge(); + }); + + upstreamResponse.once("error", (error) => { + writeCursorConnectMessage(response, encodeCursorAgentTextDelta(formatError(error))); + finishTurn({ error, type: "done" }); + }); + } + ); + + upstreamRequest.once("error", (error) => { + writeCursorConnectMessage(response, encodeCursorAgentTextDelta(formatError(error))); + finishTurn({ error, type: "done" }); + }); + upstreamRequest.setTimeout(runtime.gatewayTimeoutMs, () => { + upstreamRequest.destroy(new Error(`Cursor proxy gateway request to ${targetUrl.toString()} timed out.`)); + }); + upstreamRequest.end(body); + }); +} + +function createGatewayStreamState() { + return { + finishReason: "", + modelCallId: "", + toolCallIndexKeys: new Map(), + toolCallParts: new Map(), + toolCalls: [] + }; +} + +function handleGatewayStreamLine(response, line, streamState) { + const trimmed = line.trim(); + if (!trimmed.startsWith("data:")) { + return; + } + const data = trimmed.slice(5).trim(); + if (!data || data === "[DONE]") { + return; + } + const payload = readJsonText(data); + if (!payload) { + return; + } + const text = extractTextFromGatewayPayload(payload); + if (text) { + writeCursorConnectMessage(response, encodeCursorAgentTextDelta(text)); + } + collectGatewayToolCallsFromPayload(payload, streamState); +} + +function extractTextFromGatewayPayload(payload) { + return stringifyContent(payload.choices?.[0]?.delta?.content) || + stringifyContent(payload.choices?.[0]?.message?.content) || + stringifyContent(payload.delta) || + stringifyContent(payload.output_text) || + ""; +} + +function collectGatewayToolCallsFromJsonText(text, streamState) { + const payload = readJsonText(text); + if (!payload) { + return; + } + collectGatewayToolCallsFromPayload(payload, streamState); +} + +function collectGatewayToolCallsFromPayload(payload, streamState) { + if (!isRecord(payload) || !streamState) { + return; + } + if (typeof payload.id === "string" && payload.id) { + streamState.modelCallId = payload.id; + } + const choices = Array.isArray(payload.choices) ? payload.choices : []; + choices.forEach((choice) => { + if (!isRecord(choice)) { + return; + } + const finishReason = stringValue(choice.finish_reason); + if (finishReason) { + streamState.finishReason = finishReason; + } + const indexOffset = streamState.toolCallParts.size; + collectGatewayToolCallDeltas(choice.delta?.tool_calls, streamState, indexOffset); + collectGatewayToolCallDeltas(choice.message?.tool_calls, streamState, indexOffset); + collectGatewayToolCallDeltas(choice.tool_calls, streamState, indexOffset); + }); + collectGatewayToolCallDeltas(payload.tool_calls, streamState, streamState.toolCallParts.size); +} + +function collectGatewayToolCallDeltas(value, streamState, indexOffset) { + const values = Array.isArray(value) ? value : value ? [value] : []; + values.forEach((item, index) => { + applyGatewayToolCallDelta(item, streamState, indexOffset + index); + }); +} + +function applyGatewayToolCallDelta(value, streamState, fallbackIndex) { + if (!isRecord(value)) { + return; + } + const raw = unwrapToolCall(value); + if (!isRecord(raw)) { + return; + } + const fn = isRecord(raw.function) ? raw.function : raw; + const rawIndex = Number(raw.index); + const index = Number.isInteger(rawIndex) ? rawIndex : fallbackIndex; + const id = stringValue(raw.id) || stringValue(raw.tool_call_id) || stringValue(raw.toolCallId) || stringValue(raw.callId); + const indexKey = `index:${index}`; + const mappedKey = streamState.toolCallIndexKeys.get(indexKey); + let key = id || mappedKey || indexKey; + let part = streamState.toolCallParts.get(key); + if (id && mappedKey && mappedKey !== id && streamState.toolCallParts.has(mappedKey)) { + part = streamState.toolCallParts.get(mappedKey); + streamState.toolCallParts.delete(mappedKey); + } else if (id && !mappedKey && streamState.toolCallParts.has(indexKey)) { + part = streamState.toolCallParts.get(indexKey); + streamState.toolCallParts.delete(indexKey); + } + if (id) { + key = id; + streamState.toolCallIndexKeys.set(indexKey, id); + } + part = part || { + arguments: "", + id: id || `call_${index + 1}`, + index, + name: "", + type: stringValue(raw.type) || "function" + }; + + if (id) { + part.id = id; + } + const name = + stringValue(fn.name) || + stringValue(raw.name) || + stringValue(raw.toolName) || + stringValue(raw.functionName); + if (name) { + part.name = name; + } + const rawArguments = firstDefined(fn.arguments, raw.arguments, fn.input, raw.input, raw.args, fn.parameters, raw.parameters); + if (typeof rawArguments === "string") { + part.arguments += rawArguments; + } else if (rawArguments !== undefined) { + part.arguments = normalizeToolArguments(rawArguments); + } + if (part.type !== "function") { + part.type = "function"; + } + streamState.toolCallParts.set(key, part); +} + +function finalizeGatewayToolCalls(streamState) { + const parts = [...(streamState?.toolCallParts?.values?.() || [])] + .sort((left, right) => (left.index || 0) - (right.index || 0)); + const calls = parts + .filter((part) => part.name) + .map((part, index) => ({ + function: { + arguments: part.arguments || "{}", + name: part.name + }, + id: part.id || `call_${index + 1}`, + type: "function" + })); + const normalized = uniqueToolCalls([ + ...normalizeToolCallList(streamState?.toolCalls), + ...calls + ]); + if (streamState) { + streamState.toolCalls = normalized; + } + return normalized; +} + +function summarizeGatewayToolCalls(toolCalls) { + const calls = Array.isArray(toolCalls) ? toolCalls : []; + return calls + .slice(0, 5) + .map((call) => { + const name = stringValue(call?.function?.name) || stringValue(call?.name) || "unknown"; + const args = stringValue(call?.function?.arguments) || stringValue(call?.arguments) || ""; + return args ? `${name}(${truncateForLog(undefined, args)})` : name; + }) + .join(", "); +} + +function buildCursorToolBridgeContext(runtime, session, runRequest, chatRequest, round) { + const contextValues = Buffer.isBuffer(runRequest) ? decodeAgentRunRequestContextValues(runRequest) : []; + const toolIndex = buildCursorMcpToolIndex(contextValues); + const decodedTools = Array.isArray(chatRequest?.tools) ? chatRequest.tools.length : 0; + const nativeToolNames = (Array.isArray(chatRequest?.tools) ? chatRequest.tools : []) + .map((tool) => stringValue(tool?.function?.name) || stringValue(tool?.name)) + .filter((name) => lookupCursorNativeToolSpec(name)); + runtime.logger?.debug?.( + `Cursor proxy prepared tool bridge context for ${session.requestId} ` + + `(round=${round}, decoded_tools=${decodedTools}, cursor_native_tools=${nativeToolNames.length}, ` + + `cursor_native_names=${nativeToolNames.slice(0, decodeDiagnosticSampleLimit(runtime)).join(",") || "none"}, ` + + `cursor_mcp_tools=${toolIndex.tools.length}, ` + + `providers=${[...new Set(toolIndex.tools.map((tool) => tool.providerIdentifier))].join(",") || "none"}).` + ); + return { + chatRequest, + round, + runRequest, + session, + toolIndex + }; +} + +function buildCursorMcpToolIndex(values) { + const byName = new Map(); + const tools = []; + for (const filePath of extractCursorToolFilePaths(values)) { + const metadata = readCursorMcpToolMetadata(filePath); + if (!metadata) { + continue; + } + tools.push(metadata); + addCursorMcpToolIndexEntry(byName, metadata.name, metadata); + addCursorMcpToolIndexEntry(byName, metadata.toolName, metadata); + addCursorMcpToolIndexEntry(byName, `${metadata.providerIdentifier}.${metadata.toolName}`, metadata); + addCursorMcpToolIndexEntry(byName, `${metadata.providerIdentifier}_${metadata.toolName}`, metadata); + addCursorMcpToolIndexEntry(byName, `${metadata.providerIdentifier}:${metadata.toolName}`, metadata); + } + return { byName, tools }; +} + +function addCursorMcpToolIndexEntry(index, name, metadata) { + const key = normalizeToolBridgeName(name); + if (!key || index.has(key)) { + return; + } + index.set(key, metadata); +} + +function lookupCursorMcpToolMetadata(bridgeContext, name) { + const index = bridgeContext?.toolIndex?.byName; + if (!(index instanceof Map)) { + return undefined; + } + return index.get(normalizeToolBridgeName(name)); +} + +function normalizeToolBridgeName(value) { + return String(value || "").trim().toLowerCase(); +} + +function readCursorMcpToolMetadata(filePath) { + const pathMetadata = parseCursorMcpToolFilePath(filePath); + if (!pathMetadata) { + return undefined; + } + const text = readTextFileIfSmall(filePath, 512 * 1024); + const parsed = readJsonText(text); + if (!isRecord(parsed)) { + return { + ...pathMetadata, + name: pathMetadata.toolName + }; + } + const name = stringValue(parsed.name) || pathMetadata.toolName; + return { + ...pathMetadata, + description: stringValue(parsed.description), + name, + schema: isRecord(parsed.arguments) ? parsed.arguments : isRecord(parsed.parameters) ? parsed.parameters : undefined + }; +} + +function parseCursorMcpToolFilePath(filePath) { + const normalized = normalizeCursorMcpFilePath(filePath); + if (!normalized) { + return undefined; + } + const parts = normalized.split(path.sep); + const markerIndex = parts.lastIndexOf("mcps"); + if (markerIndex < 0 || parts[markerIndex + 2] !== "tools") { + return undefined; + } + const providerIdentifier = parts[markerIndex + 1]; + const fileName = parts[markerIndex + 3] || ""; + const toolName = fileName.endsWith(".json") ? fileName.slice(0, -".json".length) : path.basename(fileName, ".json"); + if (!providerIdentifier || !toolName) { + return undefined; + } + return { + filePath: normalized, + providerIdentifier, + toolName + }; +} + +function bridgeGatewayToolCallsToCursor(runtime, response, toolCalls, bridgeContext, streamState) { + const missing = []; + let sent = 0; + toolCalls.forEach((call, index) => { + const name = stringValue(call?.function?.name) || stringValue(call?.name); + const nativeSpec = lookupCursorNativeToolSpec(name); + if (nativeSpec) { + runtime.logger?.debug?.( + `Cursor proxy bridging OpenAI tool_call ${name || `call_${index + 1}`} ` + + `to Cursor native ${nativeSpec.name} (field=${nativeSpec.toolCallField}).` + ); + writeCursorConnectMessage( + response, + encodeCursorAgentNativeToolCallStarted(call, nativeSpec, { + modelCallId: streamState?.modelCallId + }) + ); + sent += 1; + return; + } + const metadata = lookupCursorMcpToolMetadata(bridgeContext, name); + if (!metadata) { + missing.push(name || `call_${index + 1}`); + return; + } + runtime.logger?.debug?.( + `Cursor proxy bridging OpenAI tool_call ${name || `call_${index + 1}`} ` + + `to Cursor MCP ${metadata.providerIdentifier}/${metadata.toolName}.` + ); + writeCursorConnectMessage( + response, + encodeCursorAgentMcpToolCallStarted(call, metadata, { + modelCallId: streamState?.modelCallId, + skipApproval: runtime.cursorMcpSkipApproval + }) + ); + sent += 1; + }); + return { missing, sent }; +} + +function handleUnbridgedGatewayToolCalls(runtime, response, toolCalls, streamState, bridgeContext, bridgeResult) { + const summary = summarizeGatewayToolCalls(toolCalls); + const missing = Array.isArray(bridgeResult?.missing) ? bridgeResult.missing : []; + const reason = runtime.bridgeOpenAIToolCalls !== true + ? "tool bridge disabled" + : !bridgeContext + ? "no Cursor Agent bridge context" + : toolCalls.length === 0 + ? "finish_reason=tool_calls but no complete tool_calls were decoded" + : missing.length > 0 + ? `missing Cursor tool metadata for ${missing.join(", ")}` + : "tool bridge could not emit all tool events"; + runtime.logger?.warn?.( + `Cursor proxy received upstream tool_calls but could not bridge them to Cursor Agent ` + + `(${reason}; ${summary || "tool_calls requested"}; model_call_id=${streamState?.modelCallId || "unknown"}).` + ); + if (runtime?.showUnbridgedToolCallWarning === true) { + writeCursorConnectMessage(response, encodeCursorAgentTextDelta( + `\n\n[Cursor proxy] Upstream requested tool execution (${summary || "tool_calls"}), ` + + `but the proxy could not emit Cursor Agent tool events: ${reason}.` + )); + } +} + +function writeCursorMcpToolResultEvents(runtime, response, toolCalls, bridgeContext, chatRequest, modelCallId) { + const resultMessages = findToolResultMessages(chatRequest?.messages, toolCalls); + if (resultMessages.length === 0) { + runtime.logger?.debug?.( + `Cursor proxy did not find decoded tool result messages for completed Cursor MCP tool events ` + + `(${summarizeGatewayToolCalls(toolCalls)}).` + ); + return; + } + + for (const call of toolCalls) { + const name = stringValue(call?.function?.name); + const metadata = lookupCursorMcpToolMetadata(bridgeContext, name); + if (!metadata) { + continue; + } + const resultMessage = findToolResultMessageForCall(resultMessages, call); + if (!resultMessage) { + continue; + } + writeCursorConnectMessage( + response, + encodeCursorAgentMcpToolCallCompleted(call, metadata, resultMessage, { + modelCallId, + skipApproval: runtime.cursorMcpSkipApproval + }) + ); + } +} + +function findToolResultMessages(messages, toolCalls) { + const ids = new Set((Array.isArray(toolCalls) ? toolCalls : []).map((call) => call.id).filter(Boolean)); + const names = new Set((Array.isArray(toolCalls) ? toolCalls : []) + .map((call) => stringValue(call?.function?.name)) + .filter(Boolean)); + return (Array.isArray(messages) ? messages : []) + .filter((message) => message?.role === "tool") + .filter((message) => { + const id = stringValue(message.tool_call_id); + const name = stringValue(message.name); + return (id && ids.has(id)) || (name && names.has(name)) || (ids.size === 0 && names.size === 0); + }); +} + +function findToolResultMessageForCall(messages, call) { + const id = stringValue(call?.id); + const name = stringValue(call?.function?.name); + return (Array.isArray(messages) ? messages : []).find((message) => { + const messageId = stringValue(message.tool_call_id); + const messageName = stringValue(message.name); + return (id && messageId === id) || (name && messageName === name); + }) || (Array.isArray(messages) ? messages[0] : undefined); +} + +function mergeToolCallContinuationChatRequest(previousRequest, toolCalls, nextRequest) { + const previousMessages = Array.isArray(previousRequest?.messages) ? previousRequest.messages : []; + const nextMessages = Array.isArray(nextRequest?.messages) ? nextRequest.messages : []; + const assistantToolCallMessage = createAssistantToolCallMessage(toolCalls); + const mergedMessages = []; + appendUniqueChatMessages(mergedMessages, previousMessages); + if (!hasAssistantToolCallsForIds(mergedMessages, toolCalls)) { + appendUniqueChatMessages(mergedMessages, [assistantToolCallMessage]); + } + appendUniqueChatMessages(mergedMessages, nextMessages); + + return compactObject({ + ...previousRequest, + ...nextRequest, + messages: compactChatMessages(mergedMessages), + stream: true, + tool_choice: nextRequest?.tool_choice ?? previousRequest?.tool_choice, + tools: Array.isArray(nextRequest?.tools) && nextRequest.tools.length > 0 + ? nextRequest.tools + : previousRequest?.tools + }); +} + +function createAssistantToolCallMessage(toolCalls) { + return { + content: "", + role: "assistant", + tool_calls: normalizeToolCallList(toolCalls) + }; +} + +function appendUniqueChatMessages(target, messages) { + const seen = new Set(target.map(chatMessageFingerprint)); + for (const message of Array.isArray(messages) ? messages : []) { + const fingerprint = chatMessageFingerprint(message); + if (!fingerprint || seen.has(fingerprint)) { + continue; + } + seen.add(fingerprint); + target.push(message); + } +} + +function chatMessageFingerprint(message) { + if (!isRecord(message)) { + return ""; + } + return safeJsonStringify(compactObject({ + content: message.content, + function_call: message.function_call, + name: message.name, + role: message.role, + tool_call_id: message.tool_call_id, + tool_calls: message.tool_calls + })); +} + +function hasAssistantToolCallsForIds(messages, toolCalls) { + const ids = new Set((Array.isArray(toolCalls) ? toolCalls : []).map((call) => call.id).filter(Boolean)); + if (ids.size === 0) { + return false; + } + return (Array.isArray(messages) ? messages : []).some((message) => { + if (message?.role !== "assistant" || !Array.isArray(message.tool_calls)) { + return false; + } + return message.tool_calls.some((call) => ids.has(call.id)); + }); +} + +function logAgentToolContinuation(runtime, session, toolCalls, chatRequest, round) { + runtime.logger?.debug?.( + `Cursor proxy continuing Agent RunSSE after Cursor tool results for ${session.requestId} ` + + `(round=${round}, tool_calls=${summarizeGatewayToolCalls(toolCalls) || "none"}, ` + + `${formatChatRequestSummary(chatRequest)}).` + ); +} + +function logCursorToolBridgeFollowUp(runtime, session, runRequest, chatRequest, toolCalls, resultMessages, round) { + const dumpPath = writeAgentRunRequestDecodeDump( + runtime, + session, + runRequest, + chatRequest, + `tool-bridge-round-${round}` + ); + const resultSummary = (Array.isArray(resultMessages) ? resultMessages : []) + .slice(0, decodeDiagnosticSampleLimit(runtime)) + .map((message) => { + const id = stringValue(message.tool_call_id) || "no-id"; + const name = stringValue(message.name) || "no-name"; + const content = truncateForLog(runtime, stringifyContent(message.content) || ""); + return `${name}/${id}:${content}`; + }) + .join(" | ") || "none"; + runtime.logger?.debug?.( + `Cursor proxy decoded tool bridge follow-up for ${session.requestId} ` + + `(round=${round}, tool_calls=${summarizeGatewayToolCalls(toolCalls) || "none"}, ` + + `result_messages=${Array.isArray(resultMessages) ? resultMessages.length : 0}, ` + + `results=${resultSummary}, ${formatChatRequestSummary(chatRequest)}` + + `${dumpPath ? `, decode_dump=${dumpPath}` : ""}).` + ); + if (!Array.isArray(resultMessages) || resultMessages.length > 0) { + return; + } + logCursorDecodeDiagnostics( + runtime, + "warn", + `Cursor proxy tool bridge follow-up for ${session.requestId} did not decode any matching tool result messages; ` + + `tool_calls=${summarizeGatewayToolCalls(toolCalls) || "none"}; ` + + `run_request=${formatAgentRunRequestDecodeDiagnostic(runtime, runRequest, chatRequest)}; ` + + `bidi_session=${formatBidiSessionDecodeDiagnostic(runtime, session)}` + ); +} + +function extractTextFromGatewayJson(text) { + const payload = readJsonText(text); + if (!payload) { + return text.trim(); + } + const choice = Array.isArray(payload.choices) ? payload.choices[0] : undefined; + const hasToolCalls = normalizeToolCallList(choice?.message?.tool_calls).length > 0 || + normalizeToolCallList(choice?.delta?.tool_calls).length > 0 || + normalizeToolCallList(payload.tool_calls).length > 0; + return stringifyContent(payload.choices?.[0]?.message?.content) || + stringifyContent(payload.choices?.[0]?.delta?.content) || + stringifyContent(payload.output_text) || + stringifyContent(payload.content) || + (hasToolCalls ? "" : text.trim()); +} + +function writeCursorConnectMessage(response, message) { + if (!response.writableEnded) { + response.write(connectEnvelope(0, message)); + } +} + +function finishCursorConnectStream(response) { + if (!response.writableEnded) { + response.end(connectEnvelope(0x02, Buffer.from("{}", "utf8"))); + } +} + +function encodeCursorAgentTextDelta(text) { + return protoMessage(1, protoMessage(1, protoRawString(1, text))); +} + +function encodeCursorAgentTurnEnded() { + return protoMessage(1, protoMessage(14, Buffer.alloc(0))); +} + +function encodeCursorAgentMcpToolCallStarted(call, metadata, options = {}) { + const update = Buffer.concat([ + protoString(1, call.id), + protoMessage(2, encodeCursorMcpToolCall(call, metadata, undefined, options)), + protoString(3, options.modelCallId) + ]); + return protoMessage(1, protoMessage(2, update)); +} + +function encodeCursorAgentMcpToolCallCompleted(call, metadata, resultMessage, options = {}) { + const update = Buffer.concat([ + protoString(1, call.id), + protoMessage(2, encodeCursorMcpToolCall(call, metadata, resultMessage, options)), + protoString(3, options.modelCallId) + ]); + return protoMessage(1, protoMessage(3, update)); +} + +function encodeCursorAgentNativeToolCallStarted(call, spec, options = {}) { + const update = Buffer.concat([ + protoString(1, call.id), + protoMessage(2, encodeCursorNativeToolCall(call, spec)), + protoString(3, options.modelCallId) + ]); + return protoMessage(1, protoMessage(2, update)); +} + +function encodeCursorNativeToolCall(call, spec) { + const args = parseToolArgumentsObject(call?.function?.arguments); + return protoMessage(spec.toolCallField, protoMessage(1, spec.encodeArgs(args, call))); +} + +function encodeCursorMcpToolCall(call, metadata, resultMessage, options = {}) { + const mcpToolCall = Buffer.concat([ + protoMessage(1, encodeCursorMcpArgs(call, metadata, options)), + resultMessage ? protoMessage(2, encodeCursorMcpResult(resultMessage)) : Buffer.alloc(0) + ]); + return protoMessage(15, mcpToolCall); +} + +function encodeCursorMcpArgs(call, metadata, options = {}) { + const args = parseToolArgumentsObject(call?.function?.arguments); + return Buffer.concat([ + protoString(1, stringValue(call?.function?.name) || metadata.name || metadata.toolName), + encodeProtoStringValueMapField(2, args), + protoString(3, call?.id), + protoString(4, metadata.providerIdentifier), + protoString(5, metadata.toolName || metadata.name), + options.skipApproval ? protoBool(8, true) : Buffer.alloc(0) + ]); +} + +function encodeCursorMcpResult(resultMessage) { + const text = stringifyContent(resultMessage?.content) || ""; + const textContent = protoRawString(1, text); + const contentItem = protoMessage(1, textContent); + const success = protoMessage(1, contentItem); + return protoMessage(1, success); +} + +function parseToolArgumentsObject(value) { + if (isRecord(value)) { + return value; + } + if (typeof value === "string") { + const parsed = readJsonText(value); + if (isRecord(parsed)) { + return parsed; + } + if (parsed !== undefined) { + return { value: parsed }; + } + return value.trim() ? { input: value } : {}; + } + if (value === undefined || value === null) { + return {}; + } + return { value }; +} + +function encodeCursorNativeReadArgs(args) { + return Buffer.concat([ + protoString(1, stringArg(args, ["path", "file", "file_path", "target_file"])), + optionalProtoInt(2, numberArg(args, ["offset", "start_line"])), + optionalProtoInt(3, numberArg(args, ["limit", "num_lines", "line_count"])), + optionalProtoBool(5, booleanArg(args, ["include_line_numbers", "includeLineNumbers"])) + ]); +} + +function encodeCursorNativeLsArgs(args, call) { + const ignore = arrayArg(args, ["ignore", "ignores", "exclude"]).filter((item) => typeof item === "string"); + return Buffer.concat([ + protoString(1, stringArg(args, ["path", "directory", "dir", "target_directory"]) || "."), + Buffer.concat(ignore.map((item) => protoString(2, item))), + protoString(3, call?.id) + ]); +} + +function encodeCursorNativeGrepArgs(args, call) { + return Buffer.concat([ + protoString(1, stringArg(args, ["pattern", "query", "regex"])), + protoString(2, stringArg(args, ["path", "target_directory", "directory"])), + protoString(3, stringArg(args, ["glob", "include", "include_pattern"])), + protoString(4, stringArg(args, ["output_mode", "outputMode"])), + optionalProtoInt(5, numberArg(args, ["context_before", "contextBefore"])), + optionalProtoInt(6, numberArg(args, ["context_after", "contextAfter"])), + optionalProtoInt(7, numberArg(args, ["context"])), + optionalProtoBool(8, booleanArg(args, ["case_insensitive", "caseInsensitive", "ignore_case"])), + protoString(9, stringArg(args, ["type"])), + optionalProtoInt(10, numberArg(args, ["head_limit", "headLimit", "limit"])), + optionalProtoBool(11, booleanArg(args, ["multiline"])), + protoString(12, stringArg(args, ["sort"])), + optionalProtoBool(13, booleanArg(args, ["sort_ascending", "sortAscending"])), + protoString(14, call?.id), + optionalProtoInt(16, numberArg(args, ["offset"])) + ]); +} + +function encodeCursorNativeGlobArgs(args) { + return Buffer.concat([ + protoString(1, stringArg(args, ["target_directory", "targetDirectory", "path", "directory"])), + protoString(2, stringArg(args, ["glob_pattern", "globPattern", "pattern", "query"]) || "*") + ]); +} + +function encodeCursorNativeSemSearchArgs(args) { + const targetDirectories = arrayArg(args, ["target_directories", "targetDirectories", "directories"]) + .filter((item) => typeof item === "string"); + return Buffer.concat([ + protoString(1, stringArg(args, ["query", "question"])), + Buffer.concat(targetDirectories.map((item) => protoString(2, item))), + protoString(3, stringArg(args, ["explanation", "reason"])) + ]); +} + +function encodeCursorNativeShellArgs(args, call) { + const simpleCommands = arrayArg(args, ["simple_commands", "simpleCommands"]) + .filter((item) => typeof item === "string"); + return Buffer.concat([ + protoString(1, stringArg(args, ["command", "cmd"])), + protoString(2, stringArg(args, ["working_directory", "workingDirectory", "cwd", "path"])), + optionalProtoInt(3, numberArg(args, ["timeout", "timeout_ms", "timeoutMs"])), + protoString(4, call?.id), + Buffer.concat(simpleCommands.map((item) => protoString(5, item))), + optionalProtoBool(11, booleanArg(args, ["is_background", "isBackground", "background"])), + optionalProtoBool(12, booleanArg(args, ["skip_approval", "skipApproval"])), + optionalProtoInt(13, timeoutBehaviorArg(args)), + optionalProtoInt(14, numberArg(args, ["hard_timeout", "hardTimeout"])), + protoString(15, stringArg(args, ["description", "reason"])), + optionalProtoBool(17, booleanArg(args, ["close_stdin", "closeStdin"])) + ]); +} + +function encodeCursorNativeDeleteArgs(args, call) { + return Buffer.concat([ + protoString(1, stringArg(args, ["path", "file", "file_path", "target_file"])), + protoString(2, call?.id) + ]); +} + +function encodeCursorNativeEditArgs(args) { + return Buffer.concat([ + protoString(1, stringArg(args, ["path", "file", "file_path", "target_file"])), + protoRawString(6, stringArg(args, ["stream_content", "streamContent", "content", "file_text", "text", "new_content"])) + ]); +} + +function encodeCursorNativeReadLintsArgs(args) { + const paths = arrayArg(args, ["paths", "path", "files", "file"]) + .filter((item) => typeof item === "string"); + return Buffer.concat(paths.map((item) => protoString(1, item))); +} + +function encodeCursorNativeWebSearchArgs(args, call) { + return Buffer.concat([ + protoString(1, stringArg(args, ["search_term", "searchTerm", "query", "q"])), + protoString(2, call?.id) + ]); +} + +function encodeCursorNativeUrlArgs(args, call) { + return Buffer.concat([ + protoString(1, stringArg(args, ["url", "uri"])), + protoString(2, call?.id) + ]); +} + +function encodeCursorNativeTaskArgs(args) { + const attachments = arrayArg(args, ["attachments", "files", "paths"]) + .filter((item) => typeof item === "string"); + const respondingToMessageIds = arrayArg(args, ["responding_to_message_ids", "respondingToMessageIds"]) + .filter((item) => typeof item === "string"); + return Buffer.concat([ + protoString(1, stringArg(args, ["description", "title", "summary"])), + protoRawString(2, stringArg(args, ["prompt", "task", "input", "instructions"])), + protoString(4, stringArg(args, ["model"])), + protoString(5, stringArg(args, ["resume", "resume_from_id", "resumeFromId"])), + protoString(6, stringArg(args, ["agent_id", "agentId"])), + Buffer.concat(attachments.map((item) => protoString(7, item))), + optionalProtoInt(8, taskModeArg(args)), + Buffer.concat(respondingToMessageIds.map((item) => protoString(9, item))), + optionalProtoInt(10, taskEnvironmentArg(args)) + ]); +} + +function encodeCursorNativeAwaitArgs(args) { + return Buffer.concat([ + protoString(1, stringArg(args, ["task_id", "taskId", "id"])), + optionalProtoInt(2, numberArg(args, ["block_until_ms", "blockUntilMs", "timeout_ms", "timeoutMs"])), + protoString(3, stringArg(args, ["regex", "pattern"])) + ]); +} + +function encodeCursorNativeReadTodosArgs(args) { + const statuses = arrayArg(args, ["status_filter", "statusFilter", "statuses", "status"]) + .map(todoStatusArg) + .filter((value) => value > 0); + const ids = arrayArg(args, ["id_filter", "idFilter", "ids", "id"]) + .filter((item) => typeof item === "string"); + return Buffer.concat([ + Buffer.concat(statuses.map((item) => optionalProtoInt(1, item))), + Buffer.concat(ids.map((item) => protoString(2, item))) + ]); +} + +function encodeCursorNativeUpdateTodosArgs(args) { + const todos = arrayArg(args, ["todos", "items"]) + .filter(isRecord) + .map(encodeCursorNativeTodoItem); + return Buffer.concat([ + Buffer.concat(todos.map((item) => protoMessage(1, item))), + optionalProtoBool(2, booleanArg(args, ["merge"])) + ]); +} + +function encodeCursorNativeTodoItem(item) { + const dependencies = arrayArg(item, ["dependencies", "depends_on", "dependsOn"]) + .filter((value) => typeof value === "string"); + return Buffer.concat([ + protoString(1, stringArg(item, ["id"])), + protoRawString(2, stringArg(item, ["content", "text", "title"])), + optionalProtoInt(3, todoStatusArg(item?.status)), + optionalProtoInt(4, numberArg(item, ["created_at", "createdAt"])), + optionalProtoInt(5, numberArg(item, ["updated_at", "updatedAt"])), + Buffer.concat(dependencies.map((dependency) => protoString(6, dependency))) + ]); +} + +function encodeCursorNativeAskQuestionArgs(args, call) { + const questions = arrayArg(args, ["questions", "items"]) + .filter(isRecord) + .map(encodeCursorNativeQuestion); + return Buffer.concat([ + protoString(1, stringArg(args, ["title", "header"])), + Buffer.concat(questions.map((question) => protoMessage(2, question))), + optionalProtoBool(5, booleanArg(args, ["run_async", "runAsync"])), + protoString(6, stringArg(args, ["async_original_tool_call_id", "asyncOriginalToolCallId"])) + ]); +} + +function encodeCursorNativeQuestion(question) { + const options = arrayArg(question, ["options", "choices"]) + .filter(isRecord) + .map(encodeCursorNativeQuestionOption); + return Buffer.concat([ + protoString(1, stringArg(question, ["id"])), + protoRawString(2, stringArg(question, ["prompt", "question", "text"])), + Buffer.concat(options.map((option) => protoMessage(3, option))), + optionalProtoBool(4, booleanArg(question, ["allow_multiple", "allowMultiple", "multiple"])) + ]); +} + +function encodeCursorNativeQuestionOption(option) { + return Buffer.concat([ + protoString(1, stringArg(option, ["id", "value"])), + protoRawString(2, stringArg(option, ["label", "text", "description"])) + ]); +} + +function encodeCursorNativeSwitchModeArgs(args, call) { + return Buffer.concat([ + protoString(1, stringArg(args, ["target_mode_id", "targetModeId", "mode", "mode_id"])), + protoRawString(2, stringArg(args, ["explanation", "reason"])), + protoString(3, call?.id) + ]); +} + +function encodeCursorNativeGenerateImageArgs(args) { + const references = arrayArg(args, ["reference_image_paths", "referenceImagePaths", "references"]) + .filter((item) => typeof item === "string"); + return Buffer.concat([ + protoRawString(1, stringArg(args, ["description", "prompt"])), + protoString(2, stringArg(args, ["file_path", "filePath", "path"])), + Buffer.concat(references.map((item) => protoString(5, item))) + ]); +} + +function encodeCursorNativeListMcpResourcesArgs(args) { + return protoString(1, stringArg(args, ["server", "provider", "provider_identifier", "providerIdentifier"])); +} + +function encodeCursorNativeReadMcpResourceArgs(args, call) { + return Buffer.concat([ + protoString(1, stringArg(args, ["server", "provider", "provider_identifier", "providerIdentifier"])), + protoString(2, stringArg(args, ["uri", "url"])), + protoString(3, stringArg(args, ["download_path", "downloadPath", "path"])), + protoString(4, call?.id) + ]); +} + +function encodeCursorNativeGetMcpToolsArgs(args, call) { + return Buffer.concat([ + protoString(1, stringArg(args, ["server", "provider", "provider_identifier", "providerIdentifier"])), + protoString(2, stringArg(args, ["tool_name", "toolName", "name"])), + protoString(3, stringArg(args, ["pattern", "query"])), + protoString(4, call?.id) + ]); +} + +function encodeCursorNativeCallMcpToolArgs(args, call) { + const server = stringArg(args, ["server", "provider", "provider_identifier", "providerIdentifier"]); + const toolName = stringArg(args, ["tool_name", "toolName", "name"]); + const rawArgs = firstDefined(args?.arguments, args?.args, args?.parameters, args?.input); + const toolArgs = isRecord(rawArgs) ? rawArgs : {}; + return Buffer.concat([ + protoString(1, toolName), + encodeProtoStringValueMapField(2, toolArgs), + protoString(3, call?.id), + protoString(4, server), + protoString(5, toolName), + optionalProtoBool(8, booleanArg(args, ["skip_approval", "skipApproval"])) + ]); +} + +function encodeCursorNativeSetActiveBranchArgs(args) { + return Buffer.concat([ + protoString(1, stringArg(args, ["path", "repo_path", "repoPath"])), + protoString(2, stringArg(args, ["branch_name", "branchName", "branch"])) + ]); +} + +function stringArg(args, keys) { + for (const key of keys) { + if (typeof args?.[key] === "string" && args[key].trim()) { + return args[key].trim(); + } + } + return ""; +} + +function numberArg(args, keys) { + for (const key of keys) { + const value = args?.[key]; + if (value === undefined || value === null || value === "") { + continue; + } + const number = Number(value); + if (Number.isFinite(number)) { + return number; + } + } + return undefined; +} + +function booleanArg(args, keys) { + for (const key of keys) { + const value = args?.[key]; + if (typeof value === "boolean") { + return value; + } + } + return undefined; +} + +function arrayArg(args, keys) { + for (const key of keys) { + const value = args?.[key]; + if (Array.isArray(value)) { + return value; + } + if (typeof value === "string" && value.trim()) { + return [value.trim()]; + } + } + return []; +} + +function timeoutBehaviorArg(args) { + const value = stringArg(args, ["timeout_behavior", "timeoutBehavior"]).toLowerCase(); + if (value === "cancel") { + return 1; + } + if (value === "background") { + return 2; + } + return undefined; +} + +function taskModeArg(args) { + const value = stringArg(args, ["mode"]).toLowerCase(); + if (value === "agent" || value === "default") { + return 1; + } + if (value === "ask" || value === "plan") { + return 2; + } + const number = numberArg(args, ["mode"]); + return Number.isFinite(number) ? number : undefined; +} + +function taskEnvironmentArg(args) { + const value = stringArg(args, ["environment", "env"]).toLowerCase(); + if (value === "local" || value === "ide") { + return 1; + } + if (value === "cloud" || value === "remote") { + return 2; + } + const number = numberArg(args, ["environment", "env"]); + return Number.isFinite(number) ? number : undefined; +} + +function todoStatusArg(value) { + const normalized = typeof value === "string" ? value.trim().toLowerCase().replace(/[-\s]+/g, "_") : ""; + if (normalized === "pending" || normalized === "todo") { + return 1; + } + if (normalized === "in_progress" || normalized === "inprogress" || normalized === "doing") { + return 2; + } + if (normalized === "completed" || normalized === "complete" || normalized === "done") { + return 3; + } + if (normalized === "cancelled" || normalized === "canceled") { + return 4; + } + const number = Number(value); + return Number.isFinite(number) && number > 0 ? number : undefined; +} + +function encodeProtoStringValueMapField(fieldNumber, value) { + if (!isRecord(value)) { + return Buffer.alloc(0); + } + return Buffer.concat(Object.entries(value).map(([key, rawValue]) => { + const entry = Buffer.concat([ + protoString(1, key), + protoMessage(2, encodeGoogleValue(rawValue)) + ]); + return protoMessage(fieldNumber, entry); + })); +} + +function encodeGoogleStruct(value) { + if (!isRecord(value)) { + return Buffer.alloc(0); + } + return Buffer.concat(Object.entries(value).map(([key, rawValue]) => { + const field = Buffer.concat([ + protoString(1, key), + protoMessage(2, encodeGoogleValue(rawValue)) + ]); + return protoMessage(1, field); + })); +} + +function encodeGoogleListValue(value) { + const items = Array.isArray(value) ? value : []; + return Buffer.concat(items.map((item) => protoMessage(1, encodeGoogleValue(item)))); +} + +function encodeGoogleValue(value) { + if (value === null || value === undefined) { + return Buffer.concat([protoTag(1, 0), protoVarint(0)]); + } + if (typeof value === "number") { + return Number.isFinite(value) ? protoDouble(2, value) : protoRawString(3, String(value)); + } + if (typeof value === "string") { + return protoRawString(3, value); + } + if (typeof value === "boolean") { + return protoBool(4, value, true); + } + if (Array.isArray(value)) { + return protoMessage(6, encodeGoogleListValue(value)); + } + if (isRecord(value)) { + return protoMessage(5, encodeGoogleStruct(value)); + } + return protoRawString(3, String(value)); +} + +function resolveGatewayRoute(runtime, request, url, requestBody) { + const method = (request.method || "GET").toUpperCase(); + const path = normalizePath(url.pathname); + const search = url.search || ""; + + if (method === "GET" || method === "HEAD") { + if (isModelsPath(path)) { + return { body: undefined, method, path: `/v1/models${search}`, protocol: "openai" }; + } + return undefined; + } + + if (method !== "POST" && method !== "PUT" && method !== "PATCH") { + return undefined; + } + + if (isOpenAIChatPath(path)) { + const routed = prepareOpenAIChatRequestBody(runtime, requestBody); + return { + body: routed.body, + method, + path: `/v1/chat/completions${search}`, + protocol: "openai", + skipRuntimeTargetHeaders: routed.routed + }; + } + if (isOpenAIResponsesPath(path)) { + const routed = routeJsonRequestBody(runtime, requestBody); + return { + body: routed.body, + method, + path: `/v1/responses${search}`, + protocol: "openai", + skipRuntimeTargetHeaders: routed.routed + }; + } + if (isAnthropicMessagesPath(path)) { + const routed = routeJsonRequestBody(runtime, requestBody); + return { + body: routed.body, + method, + path: `/v1/messages${search}`, + protocol: "anthropic", + skipRuntimeTargetHeaders: routed.routed + }; + } + if (isAnthropicCountTokensPath(path)) { + const routed = routeJsonRequestBody(runtime, requestBody); + return { + body: routed.body, + method, + path: `/v1/messages/count_tokens${search}`, + protocol: "anthropic", + skipRuntimeTargetHeaders: routed.routed + }; + } + if (isGeminiPath(path)) { + const routed = routeJsonRequestBody(runtime, requestBody); + return { + body: routed.body, + method, + path: `${path}${search}`, + protocol: "gemini", + skipRuntimeTargetHeaders: routed.routed + }; + } + + if (runtime.cursorConnectJson && isCursorConnectJsonRequest(request.headers, path)) { + const converted = convertCursorJsonToOpenAIChat(runtime, path, requestBody); + if (converted) { + const routingDecision = applyCursorProxyRouting(runtime, converted); + return { + body: Buffer.from(`${JSON.stringify(converted)}\n`, "utf8"), + method: "POST", + path: "/v1/chat/completions", + protocol: "openai", + skipRuntimeTargetHeaders: routingDecision.routed + }; + } + } + + return undefined; +} + +function buildGatewayHeaders(runtime, sourceHeaders, route, body) { + const headers = copyForwardHeaders(sourceHeaders); + delete headers.host; + delete headers.authorization; + delete headers["x-api-key"]; + delete headers["content-length"]; + delete headers["content-encoding"]; + delete headers["accept-encoding"]; + for (const key of Object.keys(headers)) { + if (key.startsWith(INTERNAL_HEADER_PREFIX)) { + delete headers[key]; + } + } + + headers["content-type"] = route.body ? (headers["content-type"] || "application/json") : "application/json"; + headers.accept = headers.accept || "*/*"; + headers["x-ccr-client"] = "Cursor"; + headers["x-ccr-cursor-proxy"] = "1"; + + if (body) { + headers["content-length"] = String(Buffer.byteLength(body)); + } + if (runtime.gatewayApiKey) { + headers.authorization = `Bearer ${runtime.gatewayApiKey}`; + headers["x-api-key"] = runtime.gatewayApiKey; + } + const useRuntimeTargetHeaders = route.skipRuntimeTargetHeaders !== true; + if (route.targetProvider || (useRuntimeTargetHeaders && runtime.targetProvider)) { + headers["x-target-provider"] = route.targetProvider || runtime.targetProvider; + } + if (route.targetProviders || (useRuntimeTargetHeaders && runtime.targetProviders)) { + headers["x-target-providers"] = route.targetProviders || runtime.targetProviders; + } + if (route.targetModel || (useRuntimeTargetHeaders && runtime.targetModel)) { + headers["x-target-model"] = route.targetModel || runtime.targetModel; + } + + if (route.protocol === "anthropic") { + headers["anthropic-version"] = headers["anthropic-version"] || "2023-06-01"; + } + + return headers; +} + +function buildPassthroughHeaders(sourceHeaders, originalUrl) { + const headers = copyForwardHeaders(sourceHeaders); + for (const key of Object.keys(headers)) { + if (key.startsWith(INTERNAL_HEADER_PREFIX)) { + delete headers[key]; + } + } + delete headers["content-length"]; + headers.host = originalUrl.host; + return headers; +} + +function logCursorPassthrough(runtime, method, path, headers) { + const normalizedPath = normalizePath(path); + const key = `${method} ${normalizedPath}`; + const count = (runtime.passthroughLogCounts.get(key) || 0) + 1; + runtime.passthroughLogCounts.set(key, count); + if (count > runtime.passthroughLogLimit) { + return; + } + + const suffix = count === runtime.passthroughLogLimit + ? "; suppressing repeated logs for this RPC" + : ""; + runtime.logger?.debug?.( + `Cursor proxy passing through non-chat Cursor RPC ${method} ${normalizedPath} ` + + `(${readHeader(headers["content-type"]) || "no content-type"})${suffix}.` + ); +} + +function copyForwardHeaders(sourceHeaders) { + const headers = {}; + for (const [key, value] of Object.entries(sourceHeaders)) { + const normalized = key.toLowerCase(); + if (HOP_BY_HOP_HEADERS.has(normalized) || value === undefined) { + continue; + } + headers[normalized] = Array.isArray(value) ? value.join(",") : String(value); + } + return headers; +} + +async function forwardToUrl({ body, headers, method, response, url }) { + const targetUrl = url instanceof URL ? url : new URL(url); + const transport = targetUrl.protocol === "https:" ? https : http; + + await new Promise((resolve) => { + const upstreamRequest = transport.request( + { + headers, + hostname: targetUrl.hostname, + method, + path: `${targetUrl.pathname}${targetUrl.search}`, + port: targetUrl.port || (targetUrl.protocol === "https:" ? 443 : 80), + protocol: targetUrl.protocol + }, + (upstreamResponse) => { + const statusCode = upstreamResponse.statusCode || 502; + response.writeHead(statusCode, filterResponseHeaders(upstreamResponse.headers)); + upstreamResponse.pipe(response); + upstreamResponse.once("end", resolve); + upstreamResponse.once("error", (error) => { + if (!response.headersSent) { + sendJson(response, 502, { error: { message: formatError(error) } }); + } else { + response.destroy(error); + } + resolve(); + }); + } + ); + + upstreamRequest.once("error", (error) => { + if (!response.headersSent) { + sendJson(response, 502, { error: { message: formatError(error) } }); + } else { + response.destroy(error); + } + resolve(); + }); + upstreamRequest.setTimeout(120000, () => { + upstreamRequest.destroy(new Error(`Cursor proxy upstream request to ${targetUrl.toString()} timed out.`)); + }); + + if (body && Buffer.byteLength(body) > 0 && method !== "GET" && method !== "HEAD") { + upstreamRequest.end(body); + } else { + upstreamRequest.end(); + } + }); +} + +function convertCursorJsonToOpenAIChat(runtime, path, body) { + const payload = unwrapCursorJson(readJsonLikePayload(body)); + if (!payload) { + return undefined; + } + + const messages = extractMessages(payload); + if (messages.length === 0) { + const prompt = findFirstStringByKeys(payload, ["prompt", "query", "instruction", "text"]); + if (prompt) { + messages.push({ content: prompt, role: "user" }); + } + } + if (messages.length === 0) { + return undefined; + } + + const systemPrompt = extractSystemPrompt(payload); + if (systemPrompt && !messages.some((message) => message.role === "system")) { + messages.unshift({ content: systemPrompt, role: "system" }); + } + const compactedMessages = compactChatMessages(messages); + if (compactedMessages.length === 0) { + return undefined; + } + const tools = extractTools(payload); + const toolChoice = extractToolChoice(payload); + + const model = + findFirstStringByKeys(payload, ["model", "modelName", "selectedModel", "intentModel", "chatModel"]) || + runtime.defaultModel || + "cursor-proxy"; + const stream = path.toLowerCase().includes("stream") || Boolean(findFirstBooleanByKeys(payload, ["stream", "shouldStream"])); + + return compactObject({ + frequency_penalty: findFirstNumberByKeys(payload, ["frequency_penalty", "frequencyPenalty"]), + max_tokens: findFirstNumberByKeys(payload, ["max_tokens", "maxTokens", "maxOutputTokens"]), + messages: compactedMessages, + model, + presence_penalty: findFirstNumberByKeys(payload, ["presence_penalty", "presencePenalty"]), + stream, + temperature: findFirstNumberByKeys(payload, ["temperature"]), + tool_choice: toolChoice, + tools: tools.length > 0 ? tools : undefined, + top_p: findFirstNumberByKeys(payload, ["top_p", "topP"]) + }); +} + +function extractMessages(value) { + const candidates = []; + const rootMessages = normalizeMessages(value); + if (rootMessages.length > 0) { + candidates.push(rootMessages); + } + walkJson(value, (item) => { + if (!Array.isArray(item) || item.length === 0) { + return; + } + const normalizedItems = item.map(normalizeMessages); + const messages = normalizedItems.flat(); + const matchedItems = normalizedItems.filter((messagesForItem) => messagesForItem.length > 0).length; + if (messages.length > 0 && matchedItems >= Math.ceil(item.length * 0.5)) { + candidates.push(messages); + } + }); + candidates.sort((a, b) => scoreMessages(b) - scoreMessages(a)); + return candidates[0] || []; +} + +function extractMessagesFromValues(values) { + const candidates = []; + for (const value of values) { + const messages = extractMessages(value); + if (messages.length > 0) { + candidates.push(messages); + } + } + candidates.sort((a, b) => scoreMessages(b) - scoreMessages(a)); + return [...(candidates[0] || [])]; +} + +function scoreMessages(messages) { + return messages.length * 10 + + messages.filter((message) => message.role === "system").length * 4 + + messages.filter((message) => message.role === "tool").length * 3 + + messages.filter((message) => Array.isArray(message.tool_calls) && message.tool_calls.length > 0).length * 3; +} + +function normalizeMessages(value) { + const messages = []; + const message = normalizeMessage(value); + if (message) { + messages.push(message); + } + const toolResults = normalizeToolResultMessages(value); + if (toolResults.length > 0) { + messages.push(...toolResults); + } + return messages; +} + +function normalizeMessage(value) { + if (!isRecord(value)) { + return undefined; + } + + const role = normalizeRole( + stringValue(value.role) || + stringValue(value.speaker) || + stringValue(value.author) || + stringValue(value.type) || + stringValue(value.kind) + ); + if (!role) { + return undefined; + } + + const content = normalizeMessageContent(value); + const toolCalls = normalizeToolCallsFromMessage(value); + const functionCall = normalizeFunctionCall(value.function_call || value.functionCall); + if (!hasChatMessageContent(content) && toolCalls.length === 0 && !functionCall) { + return undefined; + } + + return compactObject({ + content, + function_call: functionCall, + name: role === "tool" ? stringValue(value.name) || stringValue(value.toolName) || stringValue(value.functionName) : undefined, + role, + tool_call_id: role === "tool" ? toolCallIdFromRecord(value) : undefined, + tool_calls: toolCalls.length > 0 ? toolCalls : undefined + }); +} + +function normalizeRole(value) { + if (!value) { + return undefined; + } + const normalized = value.toLowerCase().replace(/^role_/, "").replace(/[-\s]+/g, "_"); + if (["customer", "human", "human_message", "request", "user", "user_message"].includes(normalized)) { + return "user"; + } + if (["agent", "ai", "assistant", "assistant_message", "bot", "model", "model_message"].includes(normalized)) { + return "assistant"; + } + if (["developer", "developer_message", "system", "system_message"].includes(normalized)) { + return "system"; + } + if (["function", "function_result", "tool", "tool_result", "tool_result_error", "tool_response"].includes(normalized)) { + return "tool"; + } + return undefined; +} + +function normalizeMessageContent(value) { + for (const key of [ + "bubbleText", + "content", + "displayText", + "markdown", + "message", + "observation", + "output", + "plainText", + "prompt", + "rawText", + "result", + "text", + "userMessage", + "value", + "error" + ]) { + if (Object.prototype.hasOwnProperty.call(value, key)) { + const content = normalizeContentValue(value[key]); + if (hasChatMessageContent(content)) { + return content; + } + } + } + return undefined; +} + +function normalizeContentValue(value) { + if (typeof value === "string") { + return value; + } + if (typeof value === "number" || typeof value === "boolean") { + return String(value); + } + if (Array.isArray(value)) { + const parts = []; + const text = []; + for (const item of value) { + if (isToolCallContentBlock(item) || isToolResultContentBlock(item)) { + continue; + } + const part = normalizeOpenAIContentPart(item); + if (part) { + parts.push(part); + continue; + } + const itemText = stringifyContent(item); + if (itemText) { + text.push(itemText); + } + } + if (parts.length > 0 && parts.every((part) => part.type === "text")) { + return [...text, ...parts.map((part) => part.text)].filter(Boolean).join("\n"); + } + if (parts.length > 0 && text.length === 0) { + return parts; + } + if (parts.length > 0 || text.length > 0) { + return [ + ...text.map((item) => ({ text: item, type: "text" })), + ...parts + ]; + } + return undefined; + } + if (isRecord(value)) { + if (isToolCallContentBlock(value) || isToolResultContentBlock(value)) { + return undefined; + } + const part = normalizeOpenAIContentPart(value); + if (part?.type === "text") { + return part.text; + } + if (part) { + return [part]; + } + const text = stringifyContent(value); + if (text) { + return text; + } + try { + return JSON.stringify(value); + } catch { + return undefined; + } + } + return undefined; +} + +function normalizeOpenAIContentPart(value) { + if (!isRecord(value)) { + return undefined; + } + const type = stringValue(value.type)?.toLowerCase(); + if ((type === "text" || type === "input_text") && typeof value.text === "string") { + return { text: value.text, type: "text" }; + } + if (type === "image_url" && (isRecord(value.image_url) || typeof value.image_url === "string")) { + return { + image_url: typeof value.image_url === "string" ? { url: value.image_url } : value.image_url, + type: "image_url" + }; + } + if ((type === "image" || type === "input_image") && typeof value.url === "string") { + return { image_url: { url: value.url }, type: "image_url" }; + } + return undefined; +} + +function normalizeToolCallsFromMessage(value) { + const calls = []; + for (const key of ["tool_calls", "toolCalls", "function_calls", "functionCalls", "calls"]) { + calls.push(...normalizeToolCallList(value[key])); + } + calls.push(...normalizeToolCallList(value.tool_call || value.toolCall)); + if (Array.isArray(value.content)) { + for (const block of value.content) { + if (isToolCallContentBlock(block)) { + calls.push(...normalizeToolCallList(block)); + } + } + } + return uniqueToolCalls(calls); +} + +function normalizeToolCallList(value) { + const values = Array.isArray(value) ? value : value ? [value] : []; + return values.map(normalizeToolCall).filter(Boolean); +} + +function normalizeToolCall(value, index) { + const raw = unwrapToolCall(value); + if (!isRecord(raw)) { + return undefined; + } + const fn = isRecord(raw.function) ? raw.function : raw; + const name = + stringValue(fn.name) || + stringValue(raw.name) || + stringValue(raw.toolName) || + stringValue(raw.functionName); + if (!name) { + return undefined; + } + const args = firstDefined(fn.arguments, raw.arguments, fn.input, raw.input, raw.args, fn.parameters, raw.parameters); + return { + function: { + arguments: normalizeToolArguments(args), + name + }, + id: stringValue(raw.id) || stringValue(raw.tool_call_id) || stringValue(raw.toolCallId) || stringValue(raw.callId) || `call_${index + 1}`, + type: "function" + }; +} + +function unwrapToolCall(value) { + if (!isRecord(value)) { + return value; + } + if (isRecord(value.toolCall)) { + return value.toolCall; + } + if (isRecord(value.tool_call)) { + return value.tool_call; + } + if (isRecord(value.functionCall)) { + return value.functionCall; + } + if (isRecord(value.function_call)) { + return value.function_call; + } + return value; +} + +function normalizeFunctionCall(value) { + if (!isRecord(value)) { + return undefined; + } + const name = stringValue(value.name) || stringValue(value.functionName); + if (!name) { + return undefined; + } + return { + arguments: normalizeToolArguments(firstDefined(value.arguments, value.input, value.args, value.parameters)), + name + }; +} + +function normalizeToolResultMessages(value) { + if (!isRecord(value)) { + return []; + } + const blocks = []; + if (Array.isArray(value.content)) { + blocks.push(...value.content); + } + if (isToolResultContentBlock(value)) { + blocks.push(value); + } + return blocks.map(normalizeToolResultBlock).filter(Boolean); +} + +function normalizeToolResultBlock(value) { + const raw = unwrapToolResult(value); + if (!isRecord(raw)) { + return undefined; + } + const toolCallId = toolCallIdFromRecord(raw) || stringValue(raw.tool_use_id) || stringValue(raw.toolUseId); + const name = stringValue(raw.name) || stringValue(raw.toolName) || stringValue(raw.functionName); + const content = normalizeContentValue(firstDefined(raw.content, raw.result, raw.output, raw.text, raw.error)) || ""; + if (!toolCallId && !name) { + return undefined; + } + return compactObject({ + content, + name, + role: "tool", + tool_call_id: toolCallId + }); +} + +function unwrapToolResult(value) { + if (!isRecord(value)) { + return value; + } + if (isRecord(value.toolResult)) { + return value.toolResult; + } + if (isRecord(value.tool_result)) { + return value.tool_result; + } + return value; +} + +function isToolCallContentBlock(value) { + const raw = unwrapToolCall(value); + if (!isRecord(raw)) { + return false; + } + const type = stringValue(raw.type)?.toLowerCase().replace(/[-\s]+/g, "_"); + return Boolean( + type === "tool_call" || + type === "tool_use" || + type === "function_call" || + isRecord(value.toolCall) || + isRecord(value.tool_call) || + isRecord(value.functionCall) || + isRecord(value.function_call) + ); +} + +function isToolResultContentBlock(value) { + const raw = unwrapToolResult(value); + if (!isRecord(raw)) { + return false; + } + const type = stringValue(raw.type)?.toLowerCase().replace(/[-\s]+/g, "_"); + return Boolean( + type === "tool_result" || + type === "tool_result_error" || + type === "function_result" || + isRecord(value.toolResult) || + isRecord(value.tool_result) + ); +} + +function toolCallIdFromRecord(value) { + return stringValue(value.tool_call_id) || + stringValue(value.toolCallId) || + stringValue(value.callId) || + stringValue(value.id); +} + +function uniqueToolCalls(calls) { + const result = []; + const seen = new Set(); + for (const call of calls) { + const key = call.id || `${call.function?.name}:${call.function?.arguments}`; + if (seen.has(key)) { + continue; + } + seen.add(key); + result.push(call); + } + return result; +} + +function normalizeToolArguments(value) { + if (typeof value === "string") { + return value.trim() || "{}"; + } + if (value === undefined) { + return "{}"; + } + try { + return JSON.stringify(value); + } catch { + return "{}"; + } +} + +function stringifyContent(value) { + if (typeof value === "string") { + return value; + } + if (typeof value === "number" || typeof value === "boolean") { + return String(value); + } + if (Array.isArray(value)) { + return value.map(stringifyContent).filter(Boolean).join("\n"); + } + if (isRecord(value)) { + if (typeof value.text === "string") { + return value.text; + } + if (typeof value.content === "string") { + return value.content; + } + if (typeof value.markdown === "string") { + return value.markdown; + } + if (typeof value.value === "string") { + return value.value; + } + } + return undefined; +} + +function extractSystemPrompt(value) { + return findFirstByKeys(value, CURSOR_SYSTEM_PROMPT_KEYS, stringifyPromptCandidate); +} + +function extractSystemPromptFromValues(values) { + for (const value of values) { + const systemPrompt = extractSystemPrompt(value); + if (systemPrompt) { + return systemPrompt; + } + } + return undefined; +} + +function selectPreferredSystemPrompt(...candidates) { + for (const candidate of candidates) { + const content = typeof candidate === "string" ? candidate.trim() : ""; + if (!content || isLikelyCursorInstructionText(content) || looksLikeCursorToolDescriptionText(content)) { + continue; + } + return content; + } + return undefined; +} + +function composeAgentSystemPrompt(values, preferredSystemPrompt) { + const sections = []; + const toolDescriptionFingerprints = new Set( + extractToolsFromValues(values) + .map((tool) => normalizePromptFingerprint(tool?.function?.description || tool?.description)) + .filter(Boolean) + ); + const addSection = (text) => { + const content = typeof text === "string" ? text.trim() : ""; + if (!content || looksLikeNoiseString(content) || isCursorMcpToolFilePath(content)) { + return; + } + if (looksLikeCursorToolDescriptionText(content) || toolDescriptionFingerprints.has(normalizePromptFingerprint(content))) { + return; + } + if (sections.some((item) => normalizePromptFingerprint(item) === normalizePromptFingerprint(content))) { + return; + } + sections.push(content); + }; + + addSection(preferredSystemPrompt); + + const workspaceContext = composeCursorWorkspaceContext(values); + if (workspaceContext) { + addSection(workspaceContext); + } + + if (sections.length === 0) { + return undefined; + } + return truncateComposedSystemPrompt(sections.join("\n\n---\n\n")); +} + +function extractCursorInstructionTexts(values) { + const instructions = []; + const addInstruction = (text) => { + const content = typeof text === "string" ? text.trim() : ""; + if (!content || !isLikelyCursorInstructionText(content)) { + return; + } + if (instructions.some((item) => normalizePromptFingerprint(item) === normalizePromptFingerprint(content))) { + return; + } + instructions.push(content); + }; + + for (const value of Array.isArray(values) ? values : [values]) { + if (typeof value !== "string") { + continue; + } + addInstruction(value); + } + + for (const filePath of extractCursorInstructionFilePaths(values)) { + const content = readTextFileIfSmall(filePath, 128 * 1024); + if (content) { + addInstruction(content); + } + } + + return instructions + .sort((left, right) => scoreCursorInstructionText(right) - scoreCursorInstructionText(left)) + .slice(0, 12); +} + +function extractCursorInstructionFilePaths(values) { + const result = []; + const seen = new Set(); + const addPath = (filePath) => { + const normalized = typeof filePath === "string" ? filePath.trim() : ""; + if (!normalized || seen.has(normalized)) { + return; + } + seen.add(normalized); + result.push(normalized); + }; + + for (const toolPath of extractCursorToolFilePaths(values)) { + const marker = "/tools/"; + const markerIndex = toolPath.lastIndexOf(marker); + if (markerIndex > 0) { + addPath(`${toolPath.slice(0, markerIndex)}/INSTRUCTIONS.md`); + } + } + + for (const value of Array.isArray(values) ? values : [values]) { + if (typeof value !== "string") { + continue; + } + if (/\/mcps\/[^/]+\/INSTRUCTIONS\.md$/.test(value.trim())) { + addPath(value.trim()); + } + for (const match of value.matchAll(/\/[^\s"'`<>]+\/mcps\/[^\s"'`<>]+\/INSTRUCTIONS\.md/g)) { + addPath(match[0]); + } + } + return result; +} + +function isLikelyCursorInstructionText(value) { + const text = String(value || "").trim(); + if (text.length < 250 || text.length > 120000 || looksLikeNoiseString(text) || looksLikeJsonText(text)) { + return false; + } + if (isCursorMcpToolFilePath(text) || looksLikeGitStatusText(text)) { + return false; + } + return /\bMCP\b|\bCORE WORKFLOW\b|\bCDP USAGE\b|\bCRITICAL\b|\bYou MUST\b|\bUse [a-zA-Z0-9_]+ when\b|\ballows you to\b|A Cursor Canvas/.test(text); +} + +function scoreCursorInstructionText(value) { + const text = String(value || ""); + let score = Math.min(text.length, 10000) / 100; + if (/\bMCP\b/.test(text)) { + score += 50; + } + if (/\bCORE WORKFLOW\b|\bCDP USAGE\b/.test(text)) { + score += 35; + } + if (/A Cursor Canvas/.test(text)) { + score += 25; + } + if (/\bUse [a-zA-Z0-9_]+ when\b/.test(text)) { + score += 20; + } + return score; +} + +function composeCursorWorkspaceContext(values) { + const strings = (Array.isArray(values) ? values : [values]).filter((value) => typeof value === "string"); + const workspaceRoot = strings.find((value) => + /^\/.+/.test(value) && + !value.includes("/.cursor/") && + !value.includes("/mcps/") && + !value.endsWith(".json") && + value.length < 500 + ); + const os = strings.find((value) => /^(?:darwin|linux|win32)\s+\S+/i.test(value.trim())); + const shell = strings.find((value) => /^(?:zsh|bash|fish|pwsh|powershell|cmd)$/i.test(value.trim())); + const timezone = strings.find((value) => /^[A-Za-z_]+\/[A-Za-z0-9_+\-]+$/.test(value.trim())); + const gitStatus = strings.find(looksLikeGitStatusText); + const lines = []; + if (workspaceRoot) { + lines.push(`Workspace root: ${workspaceRoot}`); + } + if (os) { + lines.push(`OS: ${os.trim()}`); + } + if (shell) { + lines.push(`Shell: ${shell.trim()}`); + } + if (timezone) { + lines.push(`Timezone: ${timezone.trim()}`); + } + if (gitStatus) { + lines.push(`Git status:\n${gitStatus.trim()}`); + } + return lines.length > 0 ? `Cursor workspace context:\n${lines.join("\n")}` : ""; +} + +function looksLikeGitStatusText(value) { + const text = String(value || "").trim(); + if (!text || text.length > 20000) { + return false; + } + const lines = text.split(/\r?\n/).filter(Boolean); + if (lines.length === 0) { + return false; + } + return lines.filter((line) => /^(?:[ MADRCU?!]{1,2}|\?\?)\s+/.test(line)).length >= Math.ceil(lines.length * 0.5); +} + +function truncateComposedSystemPrompt(value) { + const maxLength = 32000; + return value.length > maxLength ? `${value.slice(0, maxLength)}\n\n[Cursor context truncated at ${maxLength} characters]` : value; +} + +function readTextFileIfSmall(filePath, maxBytes) { + try { + if (!fs.existsSync(filePath) || !fs.statSync(filePath).isFile()) { + return ""; + } + const stat = fs.statSync(filePath); + if (stat.size > maxBytes) { + return ""; + } + return fs.readFileSync(filePath, "utf8"); + } catch { + return ""; + } +} + +function stringifyPromptCandidate(value) { + const content = normalizeContentValue(value); + if (typeof content === "string") { + return content.trim() || undefined; + } + if (Array.isArray(content)) { + const text = stringifyContent(content).trim(); + return text || undefined; + } + return undefined; +} + +function extractCursorNativeToolsFromValues(values) { + const names = extractCursorNativeToolNames(values); + return names.map((name) => cursorNativeToolSpecToOpenAITool(lookupCursorNativeToolSpec(name))).filter(Boolean); +} + +function extractCursorNativeToolsFromRunRequest(runtime, runRequest, values, systemPrompt) { + const extraction = describeCursorNativeToolExtraction(runtime, runRequest, values, systemPrompt); + return extraction.names.map((name) => cursorNativeToolSpecToOpenAITool(lookupCursorNativeToolSpec(name))).filter(Boolean); +} + +function describeCursorNativeToolExtraction(runtime, runRequest, values, systemPrompt) { + const sourceValues = [...(Array.isArray(values) ? values : [values]), systemPrompt].filter(Boolean); + const textNames = extractCursorNativeToolNames(sourceValues); + const nativeSupportedTools = extractCursorSupportedToolEnums(runRequest); + const enumNames = nativeSupportedTools + .map((item) => CURSOR_NATIVE_SUPPORTED_TOOL_TO_SPEC_NAME.get(item.value)) + .filter(Boolean); + const fallbackApplied = shouldForwardCursorNativeBuiltinTools(runtime) && + enumNames.length === 0 && + hasCursorWorkspaceContext(values); + const names = uniqueStrings([ + ...textNames, + ...enumNames, + ...(fallbackApplied ? CURSOR_NATIVE_BUILTIN_TOOL_NAMES : []) + ]); + const unsupportedBuiltins = CURSOR_NATIVE_BUILTIN_TOOL_NAMES.filter((name) => !lookupCursorNativeToolSpec(name)); + return { + enumNames: uniqueStrings(enumNames), + enumValues: summarizeCursorSupportedToolEnums(runtime, nativeSupportedTools), + fallbackApplied, + fallbackReason: fallbackApplied + ? "AgentRunRequest exposed workspace context and MCP descriptors but no Cursor native tool enum list" + : undefined, + forwardCursorNativeBuiltinTools: shouldForwardCursorNativeBuiltinTools(runtime), + hasWorkspaceContext: hasCursorWorkspaceContext(values), + names, + textNames: uniqueStrings(textNames), + unsupportedBuiltins + }; +} + +function shouldForwardCursorNativeBuiltinTools(runtime) { + return runtime?.forwardCursorNativeBuiltinTools !== false; +} + +function hasCursorWorkspaceContext(values) { + return Boolean(composeCursorWorkspaceContext(values)); +} + +function extractCursorSupportedToolEnums(buffer) { + if (!Buffer.isBuffer(buffer) || buffer.length === 0) { + return []; + } + const results = []; + const seenBuffers = new Set(); + collectCursorSupportedToolEnums(buffer, "", 0, seenBuffers, results); + const seenValues = new Set(); + return results.filter((item) => { + const key = `${item.path}:${item.value}`; + if (seenValues.has(key)) { + return false; + } + seenValues.add(key); + return true; + }); +} + +function collectCursorSupportedToolEnums(buffer, currentPath, depth, seenBuffers, results) { + if (!Buffer.isBuffer(buffer) || buffer.length === 0 || depth > 14) { + return; + } + const key = `${buffer.length}:${buffer.subarray(0, 24).toString("hex")}`; + if (seenBuffers.has(key)) { + return; + } + seenBuffers.add(key); + + forEachProtoField(buffer, (field) => { + const fieldPath = currentPath ? `${currentPath}.${field.fieldNumber}` : String(field.fieldNumber); + if (CURSOR_NATIVE_SUPPORTED_TOOL_FIELDS.has(field.fieldNumber)) { + for (const value of decodeCursorSupportedToolEnumField(field)) { + const name = CURSOR_NATIVE_SUPPORTED_TOOL_ENUM_NAMES.get(value); + if (name) { + results.push({ + name, + path: fieldPath, + value + }); + } + } + } + if (field.wireType === 2 && shouldRecurseIntoCursorProtoField(field.value, depth)) { + collectCursorSupportedToolEnums(field.value, fieldPath, depth + 1, seenBuffers, results); + } + }); +} + +function decodeCursorSupportedToolEnumField(field) { + if (field.wireType === 0) { + return [Number(field.value)].filter((value) => CURSOR_NATIVE_SUPPORTED_TOOL_ENUM_NAMES.has(value)); + } + if (field.wireType !== 2 || field.value.length === 0) { + return []; + } + const values = decodePackedCursorSupportedToolEnums(field.value); + return values.length > 0 ? values : []; +} + +function decodePackedCursorSupportedToolEnums(buffer) { + const values = []; + let offset = 0; + while (offset < buffer.length) { + const value = readProtoVarint(buffer, offset); + if (!value) { + return []; + } + offset = value.offset; + const number = Number(value.value); + if (!CURSOR_NATIVE_SUPPORTED_TOOL_ENUM_NAMES.has(number)) { + return []; + } + values.push(number); + } + return values; +} + +function shouldRecurseIntoCursorProtoField(buffer, depth) { + if (!Buffer.isBuffer(buffer) || buffer.length === 0 || depth >= 14) { + return false; + } + if (looksLikeTextBuffer(buffer) && !hasReadableProtoFields(buffer)) { + return false; + } + return true; +} + +function summarizeCursorSupportedToolEnums(runtime, tools) { + if (!Array.isArray(tools) || tools.length === 0) { + return []; + } + return tools.slice(0, decodeDiagnosticSampleLimit(runtime)).map((item) => ({ + name: item.name, + path: item.path, + tool: CURSOR_NATIVE_SUPPORTED_TOOL_TO_SPEC_NAME.get(item.value), + value: item.value + })); +} + +function extractCursorNativeToolNames(values) { + const names = new Set(); + const text = (Array.isArray(values) ? values : [values]) + .filter((value) => typeof value === "string") + .join("\n"); + for (const spec of cursorNativeToolSpecs()) { + for (const alias of [spec.name, ...(spec.aliases || [])]) { + if (new RegExp(`(^|[^A-Za-z0-9_])${escapeRegExp(alias)}([^A-Za-z0-9_]|$)`).test(text)) { + names.add(spec.name); + break; + } + } + } + return [...names]; +} + +function cursorNativeToolSpecToOpenAITool(spec) { + if (!spec) { + return undefined; + } + return { + function: { + description: spec.description, + name: spec.name, + parameters: spec.parameters + }, + type: "function" + }; +} + +function lookupCursorNativeToolSpec(name) { + const normalized = normalizeToolBridgeName(name); + return cursorNativeToolSpecs().find((spec) => + normalizeToolBridgeName(spec.name) === normalized || + (spec.aliases || []).some((alias) => normalizeToolBridgeName(alias) === normalized) + ); +} + +function cursorNativeToolSpecs() { + return [ + { + aliases: ["Read", "read", "readFile"], + description: "Read a file through Cursor's native read_file tool. Use this for known project files.", + encodeArgs: encodeCursorNativeReadArgs, + name: "read_file", + parameters: { + additionalProperties: false, + properties: { + include_line_numbers: { type: "boolean" }, + limit: { type: "integer" }, + offset: { type: "integer" }, + path: { type: "string" } + }, + required: ["path"], + type: "object" + }, + toolCallField: 8 + }, + { + aliases: ["Ls", "ListDir", "list_directory", "ls"], + description: "List a directory through Cursor's native list_dir tool.", + encodeArgs: encodeCursorNativeLsArgs, + name: "list_dir", + parameters: { + additionalProperties: false, + properties: { + ignore: { items: { type: "string" }, type: "array" }, + path: { type: "string" } + }, + required: ["path"], + type: "object" + }, + toolCallField: 13 + }, + { + aliases: ["Grep", "grep", "ripgrep_search", "ripgrep_raw_search"], + description: "Search exact text or regular expressions through Cursor's native grep_search tool.", + encodeArgs: encodeCursorNativeGrepArgs, + name: "grep_search", + parameters: { + additionalProperties: false, + properties: { + case_insensitive: { type: "boolean" }, + context: { type: "integer" }, + context_after: { type: "integer" }, + context_before: { type: "integer" }, + glob: { type: "string" }, + head_limit: { type: "integer" }, + multiline: { type: "boolean" }, + offset: { type: "integer" }, + output_mode: { type: "string" }, + path: { type: "string" }, + pattern: { type: "string" }, + sort: { type: "string" }, + sort_ascending: { type: "boolean" }, + type: { type: "string" } + }, + required: ["pattern"], + type: "object" + }, + toolCallField: 5 + }, + { + aliases: ["Glob", "glob", "file_search", "FileSearch"], + description: "Find files by glob pattern through Cursor's native glob/file search tool.", + encodeArgs: encodeCursorNativeGlobArgs, + name: "glob_file_search", + parameters: { + additionalProperties: false, + properties: { + glob_pattern: { type: "string" }, + pattern: { type: "string" }, + target_directory: { type: "string" } + }, + required: ["glob_pattern"], + type: "object" + }, + toolCallField: 4 + }, + { + aliases: ["SemanticSearch", "semantic_search", "sem_search"], + description: "Run Cursor's native semantic codebase search tool.", + encodeArgs: encodeCursorNativeSemSearchArgs, + name: "codebase_search", + parameters: { + additionalProperties: false, + properties: { + explanation: { type: "string" }, + query: { type: "string" }, + target_directories: { items: { type: "string" }, type: "array" } + }, + required: ["query"], + type: "object" + }, + toolCallField: 16 + }, + { + aliases: ["Shell", "run_terminal_cmd", "run_terminal_command", "run_terminal_command_v2"], + description: "Run a shell command through Cursor's native shell tool.", + encodeArgs: encodeCursorNativeShellArgs, + name: "shell", + parameters: { + additionalProperties: false, + properties: { + close_stdin: { type: "boolean" }, + command: { type: "string" }, + description: { type: "string" }, + hard_timeout: { type: "integer" }, + is_background: { type: "boolean" }, + simple_commands: { items: { type: "string" }, type: "array" }, + skip_approval: { type: "boolean" }, + timeout: { type: "integer" }, + timeout_behavior: { enum: ["cancel", "background"], type: "string" }, + working_directory: { type: "string" } + }, + required: ["command"], + type: "object" + }, + toolCallField: 1 + }, + { + aliases: ["Delete", "delete", "delete_file"], + description: "Delete a file through Cursor's native delete tool.", + encodeArgs: encodeCursorNativeDeleteArgs, + name: "delete_file", + parameters: { + additionalProperties: false, + properties: { + path: { type: "string" } + }, + required: ["path"], + type: "object" + }, + toolCallField: 3 + }, + { + aliases: ["Edit", "edit", "edit_file"], + description: "Apply a full-file edit through Cursor's native edit tool.", + encodeArgs: encodeCursorNativeEditArgs, + name: "edit_file", + parameters: { + additionalProperties: false, + properties: { + content: { type: "string" }, + path: { type: "string" }, + stream_content: { type: "string" } + }, + required: ["path", "content"], + type: "object" + }, + toolCallField: 12 + }, + { + aliases: ["ReadLints", "read_lints"], + description: "Read linter diagnostics through Cursor's native read_lints tool.", + encodeArgs: encodeCursorNativeReadLintsArgs, + name: "read_lints", + parameters: { + additionalProperties: false, + properties: { + paths: { items: { type: "string" }, type: "array" } + }, + required: ["paths"], + type: "object" + }, + toolCallField: 14 + }, + { + aliases: ["WebSearch", "web_search"], + description: "Run a web search through Cursor's native web_search tool.", + encodeArgs: encodeCursorNativeWebSearchArgs, + name: "web_search", + parameters: { + additionalProperties: false, + properties: { + query: { type: "string" }, + search_term: { type: "string" } + }, + required: ["query"], + type: "object" + }, + toolCallField: 18 + }, + { + aliases: ["WebFetch", "web_fetch", "fetch_url"], + description: "Fetch and convert a web page through Cursor's native web_fetch tool.", + encodeArgs: encodeCursorNativeUrlArgs, + name: "web_fetch", + parameters: { + additionalProperties: false, + properties: { + url: { type: "string" } + }, + required: ["url"], + type: "object" + }, + toolCallField: 37 + }, + { + aliases: ["Task", "task"], + description: "Start a Cursor native subagent task.", + encodeArgs: encodeCursorNativeTaskArgs, + name: "task", + parameters: { + additionalProperties: false, + properties: { + agent_id: { type: "string" }, + attachments: { items: { type: "string" }, type: "array" }, + description: { type: "string" }, + model: { type: "string" }, + prompt: { type: "string" }, + resume: { type: "string" } + }, + required: ["description", "prompt"], + type: "object" + }, + toolCallField: 19 + }, + { + aliases: ["Await", "await", "await_task"], + description: "Await a Cursor native background task.", + encodeArgs: encodeCursorNativeAwaitArgs, + name: "await_task", + parameters: { + additionalProperties: false, + properties: { + block_until_ms: { type: "integer" }, + regex: { type: "string" }, + task_id: { type: "string" } + }, + required: ["task_id"], + type: "object" + }, + toolCallField: 42 + }, + { + aliases: ["TodoRead", "ReadTodos", "todo_read"], + description: "Read Cursor's native todo list.", + encodeArgs: encodeCursorNativeReadTodosArgs, + name: "todo_read", + parameters: { + additionalProperties: false, + properties: { + id_filter: { items: { type: "string" }, type: "array" }, + status_filter: { + items: { enum: ["pending", "in_progress", "completed", "cancelled"], type: "string" }, + type: "array" + } + }, + type: "object" + }, + toolCallField: 10 + }, + { + aliases: ["TodoWrite", "todo_write"], + description: "Update Cursor's native todo list.", + encodeArgs: encodeCursorNativeUpdateTodosArgs, + name: "todo_write", + parameters: { + additionalProperties: false, + properties: { + merge: { type: "boolean" }, + todos: { + items: { + additionalProperties: false, + properties: { + content: { type: "string" }, + dependencies: { items: { type: "string" }, type: "array" }, + id: { type: "string" }, + status: { enum: ["pending", "in_progress", "completed", "cancelled"], type: "string" } + }, + required: ["content", "status"], + type: "object" + }, + type: "array" + } + }, + required: ["todos"], + type: "object" + }, + toolCallField: 9 + }, + { + aliases: ["AskQuestion", "ask_question"], + description: "Ask the user a structured question through Cursor.", + encodeArgs: encodeCursorNativeAskQuestionArgs, + name: "ask_question", + parameters: { + additionalProperties: false, + properties: { + questions: { + items: { + additionalProperties: false, + properties: { + allow_multiple: { type: "boolean" }, + id: { type: "string" }, + options: { + items: { + additionalProperties: false, + properties: { + id: { type: "string" }, + label: { type: "string" } + }, + required: ["id", "label"], + type: "object" + }, + type: "array" + }, + prompt: { type: "string" } + }, + required: ["id", "prompt"], + type: "object" + }, + type: "array" + }, + run_async: { type: "boolean" }, + title: { type: "string" } + }, + required: ["title", "questions"], + type: "object" + }, + toolCallField: 23 + }, + { + aliases: ["SwitchMode", "switch_mode"], + description: "Switch Cursor agent mode.", + encodeArgs: encodeCursorNativeSwitchModeArgs, + name: "switch_mode", + parameters: { + additionalProperties: false, + properties: { + explanation: { type: "string" }, + target_mode_id: { type: "string" } + }, + required: ["target_mode_id"], + type: "object" + }, + toolCallField: 25 + }, + { + aliases: ["GenerateImage", "generate_image"], + description: "Generate an image through Cursor's native generate_image tool.", + encodeArgs: encodeCursorNativeGenerateImageArgs, + name: "generate_image", + parameters: { + additionalProperties: false, + properties: { + description: { type: "string" }, + file_path: { type: "string" }, + reference_image_paths: { items: { type: "string" }, type: "array" } + }, + required: ["description"], + type: "object" + }, + toolCallField: 28 + }, + { + aliases: ["ListMcpResources", "list_mcp_resources"], + description: "List MCP resources through Cursor.", + encodeArgs: encodeCursorNativeListMcpResourcesArgs, + name: "list_mcp_resources", + parameters: { + additionalProperties: false, + properties: { + server: { type: "string" } + }, + type: "object" + }, + toolCallField: 20 + }, + { + aliases: ["FetchMcpResource", "ReadMcpResource", "read_mcp_resource"], + description: "Fetch an MCP resource through Cursor.", + encodeArgs: encodeCursorNativeReadMcpResourceArgs, + name: "read_mcp_resource", + parameters: { + additionalProperties: false, + properties: { + download_path: { type: "string" }, + server: { type: "string" }, + uri: { type: "string" } + }, + required: ["server", "uri"], + type: "object" + }, + toolCallField: 21 + }, + { + aliases: ["GetMcpTools", "get_mcp_tools"], + description: "Discover MCP tool schemas through Cursor.", + encodeArgs: encodeCursorNativeGetMcpToolsArgs, + name: "get_mcp_tools", + parameters: { + additionalProperties: false, + properties: { + pattern: { type: "string" }, + server: { type: "string" }, + tool_name: { type: "string" } + }, + type: "object" + }, + toolCallField: 44 + }, + { + aliases: ["CallMcpTool", "call_mcp_tool"], + description: "Call an MCP tool through Cursor's native MCP bridge.", + encodeArgs: encodeCursorNativeCallMcpToolArgs, + name: "call_mcp_tool", + parameters: { + additionalProperties: false, + properties: { + arguments: { additionalProperties: true, type: "object" }, + args: { additionalProperties: true, type: "object" }, + server: { type: "string" }, + tool_name: { type: "string" } + }, + required: ["server", "tool_name"], + type: "object" + }, + toolCallField: 15 + }, + { + aliases: ["SetActiveBranch", "set_active_branch"], + description: "Set Cursor's active branch metadata.", + encodeArgs: encodeCursorNativeSetActiveBranchArgs, + name: "set_active_branch", + parameters: { + additionalProperties: false, + properties: { + branch_name: { type: "string" }, + path: { type: "string" } + }, + required: ["path", "branch_name"], + type: "object" + }, + toolCallField: 46 + } + ]; +} + +function extractToolsFromValues(values) { + const tools = []; + for (const value of values) { + tools.push(...extractTools(value)); + } + tools.push(...extractToolsFromCursorToolFiles(values)); + return uniqueTools(tools); +} + +function extractTools(value) { + const tools = []; + if (typeof value === "string") { + tools.push(...extractToolsFromCursorToolFiles([value])); + return uniqueTools(tools); + } + const keySet = new Set(CURSOR_TOOL_KEYS.map((key) => key.toLowerCase())); + walkJson(value, (item) => { + if (!isRecord(item)) { + return; + } + for (const [key, rawValue] of Object.entries(item)) { + if (!keySet.has(key.toLowerCase())) { + continue; + } + tools.push(...normalizeToolList(rawValue)); + } + }); + return uniqueTools(tools); +} + +function extractToolsFromCursorToolFiles(values) { + const tools = []; + for (const filePath of extractCursorToolFilePaths(values)) { + const tool = readCursorToolDefinition(filePath); + if (tool) { + tools.push(tool); + } + } + return uniqueTools(tools); +} + +function extractCursorToolFilePaths(values) { + const result = []; + const seen = new Set(); + const addPath = (value) => { + const filePath = normalizeCursorMcpFilePath(value); + if (!filePath || seen.has(filePath)) { + return; + } + seen.add(filePath); + result.push(filePath); + }; + + for (const value of Array.isArray(values) ? values : [values]) { + if (typeof value !== "string") { + continue; + } + addPath(value); + for (const match of value.matchAll(/\/[^\s"'`<>]+\/mcps\/[^\s"'`<>]+\/tools\/[^\s"'`<>]+\.json/g)) { + addPath(match[0]); + } + } + return result; +} + +function normalizeCursorMcpFilePath(value) { + const text = typeof value === "string" ? value.trim() : ""; + if (!text || !text.includes("/mcps/") || !text.endsWith(".json")) { + return ""; + } + if (!/\/mcps\/[^/]+\/tools\/[^/]+\.json$/.test(text)) { + return ""; + } + return text; +} + +function isCursorMcpToolFilePath(value) { + return Boolean(normalizeCursorMcpFilePath(value)); +} + +function readCursorToolDefinition(filePath) { + try { + if (!fs.existsSync(filePath) || !fs.statSync(filePath).isFile()) { + return undefined; + } + const parsed = readJsonText(fs.readFileSync(filePath, "utf8")); + if (!isRecord(parsed)) { + return undefined; + } + return normalizeTool(parsed); + } catch { + return undefined; + } +} + +function normalizeToolList(value) { + if (Array.isArray(value)) { + return value.map((item) => normalizeTool(item)).filter(Boolean); + } + if (isRecord(value)) { + return Object.entries(value).map(([name, item]) => { + if (!isRecord(item)) { + return normalizeTool({ description: stringifyContent(item), name }); + } + const tool = { ...item }; + if (!stringValue(tool.name)) { + tool.name = name; + } + return normalizeTool(tool); + }).filter(Boolean); + } + return []; +} + +function normalizeConfiguredTools(value) { + if (isRecord(value) && (Array.isArray(value.tools) || isRecord(value.tools))) { + return normalizeToolList(value.tools); + } + return normalizeToolList(value); +} + +function normalizeTool(value) { + if (!isRecord(value)) { + return undefined; + } + const type = stringValue(value.type); + if (type && type.toLowerCase().startsWith("web_search")) { + return { ...value, type }; + } + + const fn = isRecord(value.function) ? value.function : value; + const name = + stringValue(fn.name) || + stringValue(value.name) || + stringValue(value.toolName) || + stringValue(value.functionName); + if (!name) { + return undefined; + } + + const parameters = normalizeToolParameters(firstDefined( + fn.parameters, + value.parameters, + fn.arguments, + value.arguments, + fn.input_schema, + value.input_schema, + fn.inputSchema, + value.inputSchema, + fn.schema, + value.schema + )); + return { + function: compactObject({ + description: stringValue(fn.description) || stringValue(value.description), + name, + parameters + }), + type: "function" + }; +} + +function normalizeToolParameters(value) { + if (isRecord(value)) { + return value; + } + if (typeof value === "string") { + const parsed = readJsonText(value); + if (isRecord(parsed)) { + return parsed; + } + } + return { properties: {}, type: "object" }; +} + +function uniqueTools(tools) { + const result = []; + const seen = new Set(); + for (const tool of tools) { + const key = tool.type === "function" ? `function:${tool.function?.name || ""}` : `${tool.type}:${tool.name || ""}`; + if (!key || seen.has(key)) { + continue; + } + seen.add(key); + result.push(tool); + } + return result; +} + +function extractToolChoiceFromValues(values) { + for (const value of values) { + const toolChoice = extractToolChoice(value); + if (toolChoice !== undefined) { + return toolChoice; + } + } + return undefined; +} + +function extractToolChoice(value) { + return findFirstByKeys(value, CURSOR_TOOL_CHOICE_KEYS, normalizeToolChoice); +} + +function normalizeToolChoice(value) { + if (typeof value === "string" && value.trim()) { + const normalized = value.trim().toLowerCase(); + if (["auto", "none", "required"].includes(normalized)) { + return normalized; + } + return { function: { name: value.trim() }, type: "function" }; + } + if (!isRecord(value)) { + return undefined; + } + const type = stringValue(value.type); + if (type && ["auto", "none", "required"].includes(type.toLowerCase())) { + return type.toLowerCase(); + } + const fn = isRecord(value.function) ? value.function : value; + const name = stringValue(fn.name) || stringValue(value.name) || stringValue(value.toolName); + return name ? { function: { name }, type: "function" } : undefined; +} + +function decodeJsonPayloadsFromProtoStrings(buffer) { + const payloads = []; + for (const item of decodeAllProtoStrings(buffer)) { + const parsed = readJsonText(item.value); + if (parsed !== undefined) { + payloads.push(parsed); + } + } + return payloads; +} + +function decodeAgentRunRequestContextValues(buffer) { + const values = []; + for (const item of decodeAllProtoStrings(buffer)) { + const text = typeof item.value === "string" ? item.value.trim() : ""; + if (!text || looksLikeNoiseString(text)) { + continue; + } + values.push(text); + const parsed = readJsonText(text); + if (parsed !== undefined) { + values.push(parsed); + } + values.push(...decodeEmbeddedStringValues(text)); + } + return uniqueDecodedValues(values); +} + +function firstDefined(...values) { + return values.find((value) => value !== undefined); +} + +function readJsonLikePayload(body) { + if (!body || body.length === 0) { + return undefined; + } + const text = body.toString("utf8").trim(); + if (!text) { + return undefined; + } + try { + return JSON.parse(text); + } catch { + for (const line of text.split(/\r?\n/)) { + const trimmed = line.trim(); + if (!trimmed.startsWith("{")) { + continue; + } + try { + return JSON.parse(trimmed); + } catch { + // Try the next line. + } + } + } + return undefined; +} + +function unwrapCursorJson(value) { + if (!isRecord(value)) { + return value; + } + if (isRecord(value.message)) { + return value.message; + } + if (isRecord(value.request)) { + return value.request; + } + if (isRecord(value.payload)) { + return value.payload; + } + return value; +} + +function findFirstStringByKeys(value, keys) { + return findFirstByKeys(value, keys, (item) => typeof item === "string" && item.trim() ? item.trim() : undefined); +} + +function findFirstStringFromValues(values, keys) { + for (const value of values) { + const found = findFirstStringByKeys(value, keys); + if (found) { + return found; + } + } + return undefined; +} + +function findStringValuesByKeys(value, keys) { + const keySet = new Set(keys.map((key) => key.toLowerCase())); + const found = []; + walkJson(value, (item) => { + if (!isRecord(item)) { + return; + } + for (const [key, rawValue] of Object.entries(item)) { + if (keySet.has(key.toLowerCase()) && typeof rawValue === "string" && rawValue.trim()) { + found.push(rawValue.trim()); + } + } + }); + return found; +} + +function findFirstNumberByKeys(value, keys) { + return findFirstByKeys(value, keys, (item) => { + const number = Number(item); + return Number.isFinite(number) ? number : undefined; + }); +} + +function findFirstNumberFromValues(values, keys) { + for (const value of values) { + const found = findFirstNumberByKeys(value, keys); + if (found !== undefined) { + return found; + } + } + return undefined; +} + +function findFirstBooleanByKeys(value, keys) { + return findFirstByKeys(value, keys, (item) => typeof item === "boolean" ? item : undefined); +} + +function findFirstBooleanFromValues(values, keys) { + for (const value of values) { + const found = findFirstBooleanByKeys(value, keys); + if (found !== undefined) { + return found; + } + } + return undefined; +} + +function findBestSystemPromptStringFromValues(values) { + return values + .filter((value) => typeof value === "string") + .map((value) => value.trim()) + .filter((value) => + looksLikeSystemPromptText(value) && + !isLikelyCursorInstructionText(value) && + !looksLikeCursorToolDescriptionText(value) + ) + .sort((left, right) => right.length - left.length)[0]; +} + +function looksLikeCursorToolDescriptionText(value) { + const text = String(value || "").trim(); + if (!text || text.length > 1600 || looksLikeJsonText(text)) { + return false; + } + const firstLine = text.split(/\r?\n/, 1)[0] || text; + if (/\bChrome DevTools Protocol\b|\bCDP\b.*\bInput\.\*|\btarget browser tab\b/i.test(text)) { + return true; + } + if ( + /^(?:Use|Call|Invoke)\s+[`'"]?[A-Za-z0-9_.:-]+[`'"]?\s+(?:to|when|for)\b/i.test(firstLine) || + /\b(?:browser|move_agent|cursor|mcp)_[a-z0-9_]+\b/i.test(text) + ) { + return true; + } + const startsLikeToolDescription = + /^(?:Move|Open|Create|Rename|Navigate|Capture|Click|Type|Set|Select|Press|Scroll|Drag|Get|Highlight|List|Send|Take|Lock|Read|Write|Search|Delete|Run|Fetch|Find|Inspect|Execute|Apply)\b/.test(firstLine); + const hasToolUsageLanguage = + /\bUse (?:this|ONLY|instead|by default|browser_|move_agent_|cursor|the )\b/i.test(text) || + /\bDo not use\b|\bDo not call\b|\bMust be called\b|\bCall this\b/i.test(text) || + /\bDefaults? to\b|\bRequired for\b|\bOptional\b/i.test(text); + const referencesToolName = /\b[a-z][a-z0-9]+(?:_[a-z0-9]+)+\b/.test(text); + return startsLikeToolDescription && hasToolUsageLanguage && (referencesToolName || text.length < 900); +} + +function findBestPromptStringFromValues(values) { + return values + .filter((value) => typeof value === "string") + .map((value) => value.trim()) + .filter((value) => + value.length > 2 && + value.length < 200000 && + !looksLikeNoiseString(value) && + !looksLikeSystemPromptText(value) && + !looksLikeJsonText(value) + ) + .sort((left, right) => scorePromptString(right) - scorePromptString(left))[0]; +} + +function scorePromptString(value) { + const hasNaturalLanguage = /[\p{L}\p{N}]/u.test(value) ? 20 : 0; + const hasWhitespace = /\s/.test(value) ? 5 : 0; + const lengthScore = Math.min(value.length, 4000) / 100; + return hasNaturalLanguage + hasWhitespace + lengthScore; +} + +function looksLikeJsonText(value) { + const trimmed = String(value || "").trim(); + return (trimmed.startsWith("{") && trimmed.endsWith("}")) || + (trimmed.startsWith("[") && trimmed.endsWith("]")); +} + +function findFirstByKeys(value, keys, read) { + const keySet = new Set(keys.map((key) => key.toLowerCase())); + let found; + walkJson(value, (item) => { + if (found !== undefined || !isRecord(item)) { + return; + } + for (const [key, rawValue] of Object.entries(item)) { + if (!keySet.has(key.toLowerCase())) { + continue; + } + const readValue = read(rawValue); + if (readValue !== undefined) { + found = readValue; + return; + } + } + }); + return found; +} + +function walkJson(value, visit, depth = 0, seen = new Set()) { + if (depth > MAX_JSON_SCAN_DEPTH || value === undefined || value === null) { + return; + } + if (typeof value === "object") { + if (seen.has(value)) { + return; + } + seen.add(value); + } + + visit(value); + + if (Array.isArray(value)) { + value.forEach((item) => walkJson(item, visit, depth + 1, seen)); + return; + } + if (isRecord(value)) { + Object.values(value).forEach((item) => walkJson(item, visit, depth + 1, seen)); + } +} + +function isCursorConnectJsonRequest(headers, path) { + const contentType = readHeader(headers["content-type"]).toLowerCase(); + return isCursorNativeRpcPath(path) && ( + contentType.includes("json") || + contentType.includes("connect+json") || + contentType === "" + ); +} + +function isCursorNativeLlmRpcPath(runtime, path) { + if (!isCursorNativeRpcPath(path)) { + return false; + } + const normalized = normalizePath(path); + const lower = normalized.toLowerCase(); + if (lower === "/aiserver.v1.bidiservice/bidiappend") { + return false; + } + if (lower === "/agent.v1.agentservice/runsse") { + return true; + } + if (matchesConfiguredNativeLlmMethod(runtime, normalized)) { + return true; + } + const parsed = parseCursorNativeRpcPath(normalized); + if (!parsed) { + return false; + } + return CURSOR_NATIVE_LLM_SERVICE_PATTERN.test(parsed.service) && + CURSOR_NATIVE_LLM_METHOD_PATTERN.test(parsed.method); +} + +function isCursorNativeRpcPath(path) { + return CURSOR_NATIVE_RPC_PATH_PATTERN.test(normalizePath(path)); +} + +function parseCursorNativeRpcPath(path) { + const match = normalizePath(path).match(/^\/(?:aiserver|agent)\.v\d+\.([^/]+)\/([^/]+)$/i); + return match ? { method: match[2], service: match[1] } : undefined; +} + +function matchesConfiguredNativeLlmMethod(runtime, path) { + const configured = Array.isArray(runtime?.cursorNativeLlmMethods) ? runtime.cursorNativeLlmMethods : []; + if (configured.length === 0) { + return false; + } + const normalized = normalizePath(path).toLowerCase(); + const parsed = parseCursorNativeRpcPath(path); + const method = parsed?.method.toLowerCase(); + return configured.some((item) => { + const value = String(item || "").trim().toLowerCase(); + if (!value) { + return false; + } + return normalized === normalizePath(value).toLowerCase() || method === value; + }); +} + +function isOpenAIChatPath(path) { + return path === "/chat/completions" || path === "/v1/chat/completions" || path.endsWith("/chat/completions"); +} + +function isOpenAIResponsesPath(path) { + return path === "/responses" || path === "/v1/responses" || path.endsWith("/responses"); +} + +function isAnthropicMessagesPath(path) { + return path === "/messages" || path === "/v1/messages" || path.endsWith("/v1/messages"); +} + +function isAnthropicCountTokensPath(path) { + return path === "/v1/messages/count_tokens" || path.endsWith("/messages/count_tokens"); +} + +function isModelsPath(path) { + return path === "/models" || path === "/v1/models" || path.startsWith("/v1/models/"); +} + +function isGeminiPath(path) { + return /^\/v1(?:beta)?\/models\/[^/]+:(?:generateContent|streamGenerateContent)$/i.test(path); +} + +function originalRequestUrl(request) { + const explicit = readHeader(request.headers["x-ccr-original-url"]); + if (explicit) { + try { + return new URL(explicit); + } catch { + return undefined; + } + } + + const host = readHeader(request.headers.host); + if (!host) { + return undefined; + } + return new URL(`https://${host}${request.url || "/"}`); +} + +function readRequestBody(request) { + return new Promise((resolve, reject) => { + const chunks = []; + request.on("data", (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))); + request.on("end", () => resolve(Buffer.concat(chunks))); + request.on("error", reject); + }); +} + +function filterResponseHeaders(headers) { + const filtered = {}; + for (const [key, value] of Object.entries(headers)) { + if (!HOP_BY_HOP_HEADERS.has(key.toLowerCase()) && value !== undefined) { + filtered[key] = Array.isArray(value) ? value.map(String) : String(value); + } + } + return filtered; +} + +function corsHeaders(extra = {}) { + return { + "access-control-allow-headers": "authorization,connect-protocol-version,content-type,x-api-key,x-client-version", + "access-control-allow-methods": "GET,POST,PUT,PATCH,OPTIONS", + "access-control-allow-origin": "*", + ...extra + }; +} + +function sendJson(response, statusCode, payload) { + response.writeHead(statusCode, corsHeaders({ "content-type": "application/json" })); + response.end(`${JSON.stringify(payload)}\n`); +} + +function sendBinary(response, statusCode, body, headers) { + response.writeHead(statusCode, corsHeaders(headers || { "content-type": "application/octet-stream" })); + response.end(body || Buffer.alloc(0)); +} + +function protoHeaders(extra = {}) { + return { + "cache-control": "no-store", + "connect-protocol-version": "1", + "content-type": "application/proto", + ...extra + }; +} + +function connectProtoHeaders(extra = {}) { + return { + "cache-control": "no-store", + "connect-content-encoding": "identity", + "connect-protocol-version": "1", + "content-type": "application/connect+proto", + ...extra + }; +} + +function connectEnvelope(flags, data) { + const payload = Buffer.isBuffer(data) ? data : Buffer.from(data || []); + const header = Buffer.alloc(5); + header[0] = flags; + header.writeUInt32BE(payload.length, 1); + return Buffer.concat([header, payload]); +} + +function decodeConnectEnvelope(buffer) { + const messages = decodeConnectMessages(buffer); + if (messages.length === 0) { + return Buffer.isBuffer(buffer) ? buffer : Buffer.alloc(0); + } + return messages.length === 1 ? messages[0] : Buffer.concat(messages); +} + +function decodeConnectMessages(buffer) { + if (!Buffer.isBuffer(buffer) || buffer.length < 5) { + return Buffer.isBuffer(buffer) && buffer.length > 0 ? [buffer] : []; + } + + const frames = []; + let offset = 0; + while (offset + 5 <= buffer.length) { + const flags = buffer[offset]; + if ((flags & ~0x03) !== 0) { + return frames.length ? frames : [buffer]; + } + const length = buffer.readUInt32BE(offset + 1); + const start = offset + 5; + const end = start + length; + if (end > buffer.length) { + return frames.length ? frames : [buffer]; + } + if ((flags & 0x02) === 0 && length > 0) { + const payload = buffer.subarray(start, end); + frames.push((flags & 0x01) === 0 ? payload : decompressConnectPayload(payload) || payload); + } + offset = end; + } + if (offset === buffer.length) { + return frames; + } + return frames.length > 0 && buffer.length - offset <= 4 ? frames : [buffer]; +} + +function decompressConnectPayload(payload) { + for (const decompress of [zlib.gunzipSync, zlib.inflateSync, zlib.brotliDecompressSync]) { + try { + return decompress(payload); + } catch { + // Try the next compression format. + } + } + return undefined; +} + +function readJsonText(text) { + if (typeof text !== "string") { + return undefined; + } + const trimmed = text.trim(); + if (!trimmed) { + return undefined; + } + try { + return JSON.parse(trimmed); + } catch { + return undefined; + } +} + +function protoString(fieldNumber, value) { + const text = stringValue(value); + if (!text) { + return Buffer.alloc(0); + } + return protoBytes(fieldNumber, Buffer.from(text, "utf8"), true); +} + +function protoRawString(fieldNumber, value) { + if (typeof value !== "string" || value.length === 0) { + return Buffer.alloc(0); + } + return protoBytes(fieldNumber, Buffer.from(value, "utf8"), true); +} + +function protoBytes(fieldNumber, value, includeEmpty) { + const payload = Buffer.isBuffer(value) ? value : Buffer.from(value || []); + if (!includeEmpty && payload.length === 0) { + return Buffer.alloc(0); + } + return Buffer.concat([protoTag(fieldNumber, 2), protoVarint(payload.length), payload]); +} + +function protoMessage(fieldNumber, body) { + const payload = Buffer.isBuffer(body) ? body : Buffer.from(body || []); + return Buffer.concat([protoTag(fieldNumber, 2), protoVarint(payload.length), payload]); +} + +function protoBool(fieldNumber, value, includeFalse) { + if (!value && !includeFalse) { + return Buffer.alloc(0); + } + return Buffer.concat([protoTag(fieldNumber, 0), protoVarint(value ? 1 : 0)]); +} + +function optionalProtoBool(fieldNumber, value) { + return typeof value === "boolean" ? protoBool(fieldNumber, value, true) : Buffer.alloc(0); +} + +function optionalProtoInt(fieldNumber, value) { + if (!Number.isFinite(Number(value))) { + return Buffer.alloc(0); + } + return Buffer.concat([protoTag(fieldNumber, 0), protoVarint(value)]); +} + +function protoDouble(fieldNumber, value) { + const buffer = Buffer.alloc(8); + buffer.writeDoubleLE(Number(value) || 0, 0); + return Buffer.concat([protoTag(fieldNumber, 1), buffer]); +} + +function protoTag(fieldNumber, wireType) { + return protoVarint((Number(fieldNumber) << 3) | Number(wireType)); +} + +function protoVarint(value) { + let number = typeof value === "bigint" ? value : BigInt(Math.max(0, Math.trunc(Number(value) || 0))); + const bytes = []; + while (number >= 0x80n) { + bytes.push(Number((number & 0x7fn) | 0x80n)); + number >>= 7n; + } + bytes.push(Number(number)); + return Buffer.from(bytes); +} + +function decodeProtoStringField(buffer, fieldNumber) { + const field = readProtoField(buffer, fieldNumber); + return field?.wireType === 2 ? stringValue(field.value.toString("utf8")) : undefined; +} + +function decodeProtoStringFields(buffer, fieldNumber) { + return readProtoFields(buffer, fieldNumber) + .filter((field) => field.wireType === 2) + .map((field) => field.value.toString("utf8")) + .filter((value) => value.length > 0); +} + +function decodeAllProtoStrings(buffer, depth = 0) { + if (!Buffer.isBuffer(buffer) || depth > 6) { + return []; + } + const values = []; + forEachProtoField(buffer, (field) => { + if (field.wireType === 2 && field.value.length > 0) { + const text = field.value.toString("utf8"); + if (/^[\t\n\r -~\u00a0-\uffff]+$/.test(text)) { + values.push({ fieldNumber: field.fieldNumber, value: text }); + } + values.push(...decodeAllProtoStrings(field.value, depth + 1)); + } + }); + return values; +} + +function decodeProtoBytesField(buffer, fieldNumber) { + const field = readProtoField(buffer, fieldNumber); + return field?.wireType === 2 ? field.value : undefined; +} + +function decodeProtoBytesFields(buffer, fieldNumber) { + return readProtoFields(buffer, fieldNumber) + .filter((field) => field.wireType === 2) + .map((field) => field.value); +} + +function concatProtoBytesFields(buffer, fieldNumber) { + const fields = decodeProtoBytesFields(buffer, fieldNumber).filter((value) => value.length > 0); + return fields.length > 0 ? Buffer.concat(fields) : Buffer.alloc(0); +} + +function decodeProtoMessageFields(buffer, fieldNumber) { + return readProtoFields(buffer, fieldNumber) + .filter((field) => field.wireType === 2) + .map((field) => field.value); +} + +function readLengthDelimitedProtoFields(buffer) { + const fields = []; + forEachProtoField(buffer, (field) => { + if (field.wireType === 2 && field.value.length > 0) { + fields.push(field); + } + }); + return fields; +} + +function hasReadableProtoFields(buffer) { + let found = false; + forEachProtoField(buffer, () => { + found = true; + }); + return found; +} + +function decodeProtoIntField(buffer, fieldNumber) { + const field = readProtoField(buffer, fieldNumber); + return field?.wireType === 0 ? Number(field.value) : 0; +} + +function readProtoFields(buffer, targetFieldNumber) { + if (!Buffer.isBuffer(buffer)) { + return []; + } + const matches = []; + forEachProtoField(buffer, (field) => { + if (field.fieldNumber === targetFieldNumber) { + matches.push({ + value: field.value, + wireType: field.wireType + }); + } + }); + return matches; +} + +function readProtoField(buffer, targetFieldNumber) { + return readProtoFields(buffer, targetFieldNumber)[0]; +} + +function forEachProtoField(buffer, visitor) { + if (!Buffer.isBuffer(buffer)) { + return; + } + + let offset = 0; + while (offset < buffer.length) { + const tag = readProtoVarint(buffer, offset); + if (!tag) { + return; + } + + offset = tag.offset; + const fieldNumber = Number(tag.value >> 3n); + const wireType = Number(tag.value & 0x07n); + if (fieldNumber <= 0) { + return; + } + + if (wireType === 0) { + const value = readProtoVarint(buffer, offset); + if (!value) { + return; + } + offset = value.offset; + visitor({ fieldNumber, value: value.value, wireType }); + continue; + } + + if (wireType === 1) { + if (offset + 8 > buffer.length) { + return; + } + const value = buffer.subarray(offset, offset + 8); + offset += 8; + visitor({ fieldNumber, value, wireType }); + continue; + } + + if (wireType === 2) { + const length = readProtoVarint(buffer, offset); + if (!length) { + return; + } + offset = length.offset; + const end = offset + Number(length.value); + if (end > buffer.length) { + return; + } + const value = buffer.subarray(offset, end); + offset = end; + visitor({ fieldNumber, value, wireType }); + continue; + } + + if (wireType === 5) { + if (offset + 4 > buffer.length) { + return; + } + const value = buffer.subarray(offset, offset + 4); + offset += 4; + visitor({ fieldNumber, value, wireType }); + continue; + } + + return; + } +} + +function readProtoVarint(buffer, offset) { + let result = 0n; + let shift = 0n; + for (let index = offset; index < buffer.length; index += 1) { + const byte = buffer[index]; + result |= BigInt(byte & 0x7f) << shift; + if ((byte & 0x80) === 0) { + return { + offset: index + 1, + value: result + }; + } + shift += 7n; + if (shift > 70n) { + return undefined; + } + } + return undefined; +} + +function formatProtoFieldSummary(buffer) { + if (!Buffer.isBuffer(buffer) || buffer.length === 0) { + return "empty"; + } + const fields = []; + forEachProtoField(buffer, (field) => { + if (fields.length >= 12) { + return; + } + fields.push(`${field.fieldNumber}:${field.wireType}:${field.wireType === 2 ? field.value.length : String(field.value)}`); + }); + return fields.length ? fields.join(",") : `unreadable:${buffer.length}`; +} + +function configuredGatewayUrl(config) { + if (typeof config?.routerEndpoint === "string" && config.routerEndpoint.trim()) { + return config.routerEndpoint.trim(); + } + const host = config?.gateway?.host && config.gateway.host !== "0.0.0.0" ? config.gateway.host : "127.0.0.1"; + const port = config?.gateway?.port || config?.PORT || 3456; + return `http://${host}:${port}`; +} + +function configuredGatewayApiKey(config) { + const apiKeys = Array.isArray(config?.APIKEYS) ? config.APIKEYS : []; + return apiKeys.map((item) => stringValue(item?.key)).find(Boolean) || stringValue(config?.APIKEY); +} + +function configuredDefaultModel(config) { + const routerDefault = stringValue(config?.Router?.default); + if (routerDefault) { + return routeTargetModel(routerDefault) || routerDefault; + } + + const preferredProvider = stringValue(config?.preferredProvider); + const providers = Array.isArray(config?.Providers) ? config.Providers : []; + const preferred = preferredProvider + ? providers.find((provider) => provider?.name === preferredProvider) + : undefined; + return firstProviderModel(preferred) || providers.map(firstProviderModel).find(Boolean); +} + +function routeTargetModel(value) { + const parts = value.split(","); + return parts.length > 1 ? parts.slice(1).join(",").trim() : undefined; +} + +function firstProviderModel(provider) { + return Array.isArray(provider?.models) ? provider.models.map(stringValue).find(Boolean) : undefined; +} + +function normalizeStringList(...values) { + const result = []; + for (const value of values) { + if (Array.isArray(value)) { + value.forEach((item) => { + const normalized = stringValue(item); + if (normalized) { + result.push(normalized.toLowerCase()); + } + }); + continue; + } + const normalized = stringValue(value); + if (normalized) { + result.push(normalized.toLowerCase()); + } + } + return result.length ? uniqueStrings(result) : undefined; +} + +function normalizePathList(value) { + if (!Array.isArray(value)) { + return undefined; + } + const result = value + .map((item) => normalizePath(stringValue(item))) + .filter(Boolean); + return result.length ? uniqueStrings(result) : undefined; +} + +function normalizePath(value) { + if (!value) { + return ""; + } + const trimmed = value.trim(); + return trimmed.startsWith("/") ? trimmed : `/${trimmed}`; +} + +function trimTrailingSlash(value) { + return (value || DEFAULT_GATEWAY_URL).replace(/\/+$/, ""); +} + +function numberOption(value, fallback) { + const number = Number(value); + return Number.isFinite(number) && number > 0 ? number : fallback; +} + +function uniqueStrings(values) { + return [...new Set(values.filter(Boolean))]; +} + +function compactObject(value) { + const result = {}; + for (const [key, rawValue] of Object.entries(value)) { + if (rawValue !== undefined) { + result[key] = rawValue; + } + } + return result; +} + +function readHeader(value) { + if (Array.isArray(value)) { + return value[0]?.trim() || ""; + } + return typeof value === "string" ? value.trim() : ""; +} + +function stringValue(value) { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function isRecord(value) { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function formatError(error) { + return error instanceof Error ? error.message : String(error); +} diff --git a/extension/chrome/README.md b/extension/chrome/README.md new file mode 100644 index 0000000..86a5f26 --- /dev/null +++ b/extension/chrome/README.md @@ -0,0 +1,23 @@ +# CCR Login Import Chrome Extension + +This unpacked Chrome extension imports cookies and localStorage for explicitly selected domains into CCR's in-app browser. + +## Development install + +1. Open `chrome://extensions`. +2. Enable **Developer mode**. +3. Click **Load unpacked**. +4. Select this `extension/chrome` directory. + +After changing extension files, click **Reload** for this unpacked extension in `chrome://extensions`. +The confirmation-page flow uses the site access declared in `manifest.json`; it does not request new host permissions from the page click. + +## Flow + +1. An agent calls CCR's Chrome login import browser tool, or the user clicks the key button in CCR's in-app browser. +2. CCR opens a one-time confirmation page in the system browser. +3. Review the requested domains and click **Confirm and Import**. + +The extension reads only the domains listed in the CCR job. It does not enumerate all Chrome cookies. + +For localStorage, the extension temporarily opens non-active tabs for the selected origins, reads `localStorage`, then closes those tabs. diff --git a/extension/chrome/background.js b/extension/chrome/background.js new file mode 100644 index 0000000..e86e03b --- /dev/null +++ b/extension/chrome/background.js @@ -0,0 +1,262 @@ +chrome.runtime.onMessage.addListener((message, _sender, sendResponse) => { + if (!message || message.type !== "ccr-login-import-confirm") { + return false; + } + + runImport(message.importUrl) + .then((result) => sendResponse({ ok: true, result })) + .catch((error) => sendResponse({ error: formatError(error), ok: false })); + return true; +}); + +async function runImport(importUrl) { + const normalizedImportUrl = normalizeImportUrl(importUrl); + if (!normalizedImportUrl) { + throw new Error("Invalid CCR import URL."); + } + + const job = await fetchImportJob(normalizedImportUrl); + const domains = Array.isArray(job.domains) ? job.domains.map(normalizeDomain).filter(Boolean) : []; + if (domains.length === 0) { + throw new Error("CCR import job does not include any domains."); + } + + await ensureHostPermissions(domains); + + const cookies = await readCookiesForDomains(domains); + const localStorageEntries = await readLocalStorageForDomains(domains, cookies); + if (cookies.length === 0 && localStorageEntries.length === 0) { + throw new Error("No cookies or localStorage entries were found for the selected domains."); + } + + return await submitLoginState(normalizedImportUrl, cookies, localStorageEntries, domains); +} + +async function fetchImportJob(importUrl) { + const response = await fetch(importUrl, { + headers: { + "x-ccr-login-import": "chrome-extension" + } + }); + const body = await response.json().catch(() => ({})); + if (!response.ok) { + throw new Error(body?.error?.message || `CCR import job request failed (${response.status}).`); + } + if (!body.job || body.job.status !== "pending") { + throw new Error(`CCR import job is ${body.job?.status || "unavailable"}.`); + } + return body.job; +} + +async function submitLoginState(importUrl, cookies, localStorage, domains) { + const response = await fetch(`${importUrl.replace(/\/+$/, "")}/cookies`, { + body: JSON.stringify({ + cookies, + domains, + localStorage, + source: { + browser: "chrome", + extension: chrome.runtime.getManifest().version + } + }), + headers: { + "content-type": "application/json", + "x-ccr-login-import": "chrome-extension" + }, + method: "POST" + }); + const body = await response.json().catch(() => ({})); + if (!response.ok) { + throw new Error(body?.error?.message || `CCR login import failed (${response.status}).`); + } + return body.result || {}; +} + +async function readCookiesForDomains(domains) { + const cookies = []; + for (const domain of domains) { + cookies.push(...await chrome.cookies.getAll({ domain })); + } + return dedupeCookies(cookies); +} + +async function readLocalStorageForDomains(domains, cookies) { + const origins = localStorageOriginsForDomains(domains, cookies); + const entries = []; + for (const origin of origins) { + const entry = await readLocalStorageForOrigin(origin).catch(() => undefined); + if (entry && Object.keys(entry.items).length > 0) { + entries.push(entry); + } + } + return entries; +} + +async function readLocalStorageForOrigin(origin) { + const tab = await chrome.tabs.create({ + active: false, + url: `${origin}/` + }); + try { + await waitForTabLoad(tab.id, 15000); + const [frameResult] = await chrome.scripting.executeScript({ + func: () => { + const items = {}; + for (let index = 0; index < window.localStorage.length; index += 1) { + const key = window.localStorage.key(index); + if (key !== null) { + items[key] = window.localStorage.getItem(key) || ""; + } + } + return { + items, + origin: window.location.origin + }; + }, + target: { tabId: tab.id }, + world: "MAIN" + }); + const result = frameResult?.result; + if (!result || !allowedLocalStorageOrigin(result.origin, origin)) { + return undefined; + } + return result; + } finally { + if (tab.id !== undefined) { + await chrome.tabs.remove(tab.id).catch(() => undefined); + } + } +} + +function waitForTabLoad(tabId, timeoutMs) { + return new Promise((resolve) => { + let done = false; + const finish = () => { + if (done) { + return; + } + done = true; + chrome.tabs.onUpdated.removeListener(listener); + clearTimeout(timeout); + resolve(); + }; + const listener = (updatedTabId, changeInfo) => { + if (updatedTabId === tabId && changeInfo.status === "complete") { + finish(); + } + }; + const timeout = setTimeout(finish, timeoutMs); + chrome.tabs.onUpdated.addListener(listener); + }); +} + +function dedupeCookies(cookies) { + const seen = new Set(); + const result = []; + for (const cookie of cookies) { + const partitionKey = cookie.partitionKey ? JSON.stringify(cookie.partitionKey) : ""; + const key = `${cookie.storeId || ""}\n${cookie.domain}\n${cookie.path}\n${cookie.name}\n${partitionKey}`; + if (!seen.has(key)) { + seen.add(key); + result.push(cookie); + } + } + return result; +} + +function localStorageOriginsForDomains(domains, cookies) { + const origins = new Set(); + for (const domain of domains) { + if (domain === "localhost" || isIpAddress(domain)) { + origins.add(`http://${domain}`); + origins.add(`https://${domain}`); + } else { + origins.add(`https://${domain}`); + } + } + + for (const cookie of cookies) { + const host = normalizeDomain(cookie.domain); + if (!host || !cookie.hostOnly || !domains.some((domain) => host === domain || host.endsWith(`.${domain}`))) { + continue; + } + origins.add(`${cookie.secure === false ? "http" : "https"}://${host}`); + } + + return [...origins]; +} + +function originsForDomains(domains) { + return [...new Set(domains.flatMap((domain) => { + if (domain === "localhost" || isIpAddress(domain)) { + return [ + `http://${domain}/*`, + `https://${domain}/*` + ]; + } + return [ + `http://${domain}/*`, + `https://${domain}/*`, + `http://*.${domain}/*`, + `https://*.${domain}/*` + ]; + }))]; +} + +async function ensureHostPermissions(domains) { + const origins = originsForDomains(domains); + const granted = await chrome.permissions.contains({ origins }); + if (granted) { + return; + } + throw new Error( + [ + `CCR Login Import does not have Chrome site access for ${domains.join(", ")}.`, + "Reload the unpacked extension after updating it, then grant the extension site access for the requested domains in Chrome extensions settings." + ].join(" ") + ); +} + +function normalizeImportUrl(value) { + const raw = typeof value === "string" ? value.trim() : ""; + if (!raw) { + return ""; + } + try { + const url = new URL(raw); + if (!["127.0.0.1", "localhost"].includes(url.hostname)) { + return ""; + } + if (!/^\/chrome-import\/jobs\/[^/]+\/?$/.test(url.pathname)) { + return ""; + } + url.pathname = url.pathname.replace(/\/+$/, ""); + return url.toString(); + } catch { + return ""; + } +} + +function normalizeDomain(value) { + return typeof value === "string" + ? value.trim().replace(/^\*\./, "").replace(/^\./, "").toLowerCase() + : ""; +} + +function allowedLocalStorageOrigin(actualOrigin, requestedOrigin) { + try { + const actual = new URL(actualOrigin); + const requested = new URL(requestedOrigin); + return actual.protocol === requested.protocol && actual.hostname === requested.hostname && actual.port === requested.port; + } catch { + return false; + } +} + +function isIpAddress(value) { + return /^\d{1,3}(?:\.\d{1,3}){3}$/.test(value) || value.includes(":"); +} + +function formatError(error) { + return error instanceof Error ? error.message : String(error); +} diff --git a/extension/chrome/confirm.js b/extension/chrome/confirm.js new file mode 100644 index 0000000..56a6aa1 --- /dev/null +++ b/extension/chrome/confirm.js @@ -0,0 +1,46 @@ +const root = document.getElementById("ccr-chrome-login-import"); +const button = document.getElementById("ccr-confirm-import"); +const statusElement = document.getElementById("ccr-import-status"); + +if (root && button && statusElement) { + const importUrl = root.getAttribute("data-import-url") || ""; + button.disabled = false; + button.textContent = "Confirm and Import"; + setStatus("CCR Login Import extension is connected. Review the domains, then confirm."); + + button.addEventListener("click", () => { + void confirmImport(importUrl); + }); +} + +async function confirmImport(importUrl) { + button.disabled = true; + setStatus("Importing Chrome cookies and localStorage into CCR..."); + try { + const response = await chrome.runtime.sendMessage({ + importUrl, + type: "ccr-login-import-confirm" + }); + if (!response?.ok) { + throw new Error(response?.error || "Chrome login import failed."); + } + const result = response.result || {}; + setStatus( + `Imported ${result.cookieImported || 0} cookies and ${result.localStorageImported || 0} localStorage items. Skipped ${result.skipped || 0}.`, + "ok" + ); + button.textContent = "Imported"; + } catch (error) { + button.disabled = false; + setStatus(formatError(error), "error"); + } +} + +function setStatus(message, kind = "") { + statusElement.textContent = message; + statusElement.className = `status ${kind}`.trim(); +} + +function formatError(error) { + return error instanceof Error ? error.message : String(error); +} diff --git a/extension/chrome/manifest.json b/extension/chrome/manifest.json new file mode 100644 index 0000000..262869a --- /dev/null +++ b/extension/chrome/manifest.json @@ -0,0 +1,35 @@ +{ + "manifest_version": 3, + "name": "CCR Login Import", + "description": "Import selected Chrome site login cookies into CCR's in-app browser.", + "version": "0.1.0", + "action": { + "default_popup": "popup.html", + "default_title": "CCR Login Import" + }, + "background": { + "service_worker": "background.js" + }, + "content_scripts": [ + { + "js": [ + "confirm.js" + ], + "matches": [ + "http://127.0.0.1/*", + "http://localhost/*" + ] + } + ], + "permissions": [ + "cookies", + "scripting", + "storage" + ], + "host_permissions": [ + "http://127.0.0.1/*", + "http://localhost/*", + "http://*/*", + "https://*/*" + ] +} diff --git a/extension/chrome/popup.html b/extension/chrome/popup.html new file mode 100644 index 0000000..391063b --- /dev/null +++ b/extension/chrome/popup.html @@ -0,0 +1,110 @@ + + + + + + CCR Login Import + + + +
+

CCR Login Import

+ + +
+
+ + + diff --git a/extension/chrome/popup.js b/extension/chrome/popup.js new file mode 100644 index 0000000..4b12be1 --- /dev/null +++ b/extension/chrome/popup.js @@ -0,0 +1,297 @@ +const importUrlInput = document.getElementById("import-url"); +const importButton = document.getElementById("import-button"); +const statusElement = document.getElementById("status"); + +document.addEventListener("DOMContentLoaded", () => { + void restoreLastImportUrl(); +}); + +importButton.addEventListener("click", () => { + void runImport(); +}); + +async function restoreLastImportUrl() { + const stored = await chrome.storage.local.get(["lastImportUrl"]); + if (typeof stored.lastImportUrl === "string") { + importUrlInput.value = stored.lastImportUrl; + } +} + +async function runImport() { + const importUrl = normalizeImportUrl(importUrlInput.value); + if (!importUrl) { + setStatus("Paste the import URL copied from CCR.", "error"); + return; + } + + importButton.disabled = true; + try { + await chrome.storage.local.set({ lastImportUrl: importUrl }); + setStatus("Reading CCR import job..."); + const job = await fetchImportJob(importUrl); + const domains = Array.isArray(job.domains) ? job.domains.map(normalizeDomain).filter(Boolean) : []; + if (domains.length === 0) { + throw new Error("CCR import job does not include any domains."); + } + + await ensureHostPermissions(domains); + + setStatus(`Reading cookies for ${domains.join(", ")}...`); + const cookies = await readCookiesForDomains(domains); + setStatus(`Reading localStorage for ${domains.join(", ")}...`); + const localStorageEntries = await readLocalStorageForDomains(domains, cookies); + + if (cookies.length === 0 && localStorageEntries.length === 0) { + throw new Error("No cookies or localStorage entries were found for the selected domains."); + } + + setStatus(`Sending ${cookies.length} cookies and ${localStorageItemCount(localStorageEntries)} localStorage items to CCR...`); + const result = await submitCookies(importUrl, cookies, localStorageEntries, domains); + setStatus( + `Imported ${result.cookieImported ?? 0} cookies and ${result.localStorageImported ?? 0} localStorage items. Skipped ${result.skipped ?? 0}.`, + "ok" + ); + } catch (error) { + setStatus(formatError(error), "error"); + } finally { + importButton.disabled = false; + } +} + +async function fetchImportJob(importUrl) { + const response = await fetch(importUrl, { + headers: { + "x-ccr-login-import": "chrome-extension" + } + }); + const body = await response.json().catch(() => ({})); + if (!response.ok) { + throw new Error(body?.error?.message || `CCR import job request failed (${response.status}).`); + } + if (!body.job || body.job.status !== "pending") { + throw new Error(`CCR import job is ${body.job?.status || "unavailable"}.`); + } + return body.job; +} + +async function submitCookies(importUrl, cookies, localStorage, domains) { + const response = await fetch(`${importUrl.replace(/\/+$/, "")}/cookies`, { + body: JSON.stringify({ + cookies, + domains, + localStorage, + source: { + browser: "chrome", + extension: chrome.runtime.getManifest().version + } + }), + headers: { + "content-type": "application/json", + "x-ccr-login-import": "chrome-extension" + }, + method: "POST" + }); + const body = await response.json().catch(() => ({})); + if (!response.ok) { + throw new Error(body?.error?.message || `CCR cookie import failed (${response.status}).`); + } + return body.result || {}; +} + +async function readCookiesForDomains(domains) { + const cookies = []; + for (const domain of domains) { + cookies.push(...await chrome.cookies.getAll({ domain })); + } + return dedupeCookies(cookies); +} + +async function readLocalStorageForDomains(domains, cookies) { + const origins = localStorageOriginsForDomains(domains, cookies); + const entries = []; + for (const origin of origins) { + const entry = await readLocalStorageForOrigin(origin).catch(() => undefined); + if (entry && Object.keys(entry.items).length > 0) { + entries.push(entry); + } + } + return entries; +} + +async function readLocalStorageForOrigin(origin) { + const tab = await chrome.tabs.create({ + active: false, + url: `${origin}/` + }); + try { + await waitForTabLoad(tab.id, 15000); + const [frameResult] = await chrome.scripting.executeScript({ + func: () => { + const items = {}; + for (let index = 0; index < window.localStorage.length; index += 1) { + const key = window.localStorage.key(index); + if (key !== null) { + items[key] = window.localStorage.getItem(key) || ""; + } + } + return { + items, + origin: window.location.origin + }; + }, + target: { tabId: tab.id }, + world: "MAIN" + }); + const result = frameResult?.result; + if (!result || !allowedLocalStorageOrigin(result.origin, origin)) { + return undefined; + } + return result; + } finally { + if (tab.id !== undefined) { + await chrome.tabs.remove(tab.id).catch(() => undefined); + } + } +} + +function waitForTabLoad(tabId, timeoutMs) { + return new Promise((resolve) => { + let done = false; + const finish = () => { + if (done) { + return; + } + done = true; + chrome.tabs.onUpdated.removeListener(listener); + window.clearTimeout(timeout); + resolve(); + }; + const listener = (updatedTabId, changeInfo) => { + if (updatedTabId === tabId && changeInfo.status === "complete") { + finish(); + } + }; + const timeout = window.setTimeout(finish, timeoutMs); + chrome.tabs.onUpdated.addListener(listener); + }); +} + +function dedupeCookies(cookies) { + const seen = new Set(); + const result = []; + for (const cookie of cookies) { + const partitionKey = cookie.partitionKey ? JSON.stringify(cookie.partitionKey) : ""; + const key = `${cookie.storeId || ""}\n${cookie.domain}\n${cookie.path}\n${cookie.name}\n${partitionKey}`; + if (!seen.has(key)) { + seen.add(key); + result.push(cookie); + } + } + return result; +} + +function localStorageOriginsForDomains(domains, cookies) { + const origins = new Set(); + for (const domain of domains) { + if (domain === "localhost" || isIpAddress(domain)) { + origins.add(`http://${domain}`); + origins.add(`https://${domain}`); + } else { + origins.add(`https://${domain}`); + } + } + + for (const cookie of cookies) { + const host = normalizeDomain(cookie.domain); + if (!host || !cookie.hostOnly || !domains.some((domain) => host === domain || host.endsWith(`.${domain}`))) { + continue; + } + origins.add(`${cookie.secure === false ? "http" : "https"}://${host}`); + } + + return [...origins]; +} + +function allowedLocalStorageOrigin(actualOrigin, requestedOrigin) { + try { + const actual = new URL(actualOrigin); + const requested = new URL(requestedOrigin); + return actual.protocol === requested.protocol && actual.hostname === requested.hostname && actual.port === requested.port; + } catch { + return false; + } +} + +function localStorageItemCount(entries) { + return entries.reduce((count, entry) => count + Object.keys(entry.items || {}).length, 0); +} + +function originsForDomains(domains) { + return [...new Set(domains.flatMap((domain) => { + if (domain === "localhost" || isIpAddress(domain)) { + return [ + `http://${domain}/*`, + `https://${domain}/*` + ]; + } + return [ + `http://${domain}/*`, + `https://${domain}/*`, + `http://*.${domain}/*`, + `https://*.${domain}/*` + ]; + }))]; +} + +async function ensureHostPermissions(domains) { + const origins = originsForDomains(domains); + const granted = await chrome.permissions.contains({ origins }); + if (granted) { + return; + } + throw new Error( + [ + `CCR Login Import does not have Chrome site access for ${domains.join(", ")}.`, + "Reload the unpacked extension after updating it, then grant the extension site access for the requested domains in Chrome extensions settings." + ].join(" ") + ); +} + +function normalizeImportUrl(value) { + const raw = value.trim(); + if (!raw) { + return ""; + } + try { + const url = new URL(raw); + if (!["127.0.0.1", "localhost"].includes(url.hostname)) { + return ""; + } + if (!/^\/chrome-import\/jobs\/[^/]+\/?$/.test(url.pathname)) { + return ""; + } + url.pathname = url.pathname.replace(/\/+$/, ""); + return url.toString(); + } catch { + return ""; + } +} + +function normalizeDomain(value) { + return typeof value === "string" + ? value.trim().replace(/^\*\./, "").replace(/^\./, "").toLowerCase() + : ""; +} + +function isIpAddress(value) { + return /^\d{1,3}(?:\.\d{1,3}){3}$/.test(value) || value.includes(":"); +} + +function setStatus(message, kind = "") { + statusElement.textContent = message; + statusElement.className = `status ${kind}`.trim(); +} + +function formatError(error) { + return error instanceof Error ? error.message : String(error); +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4bbb5fd --- /dev/null +++ b/package-lock.json @@ -0,0 +1,9609 @@ +{ + "name": "claude-code-router-monorepo", + "version": "3.0.11", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "claude-code-router-monorepo", + "version": "3.0.11", + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@the-next-ai/ai-gateway": "^1.0.7", + "@the-next-ai/bot-gateway-sdk": "^0.1.0", + "better-sqlite3": "^12.11.1", + "electron-updater": "^6.8.9", + "node-forge": "^1.4.0", + "openai": "^6.27.0", + "undici": "^7.27.2" + }, + "devDependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@playwright/test": "^1.61.1", + "@tailwindcss/cli": "^4.3.0", + "@types/better-sqlite3": "^7.6.13", + "@types/node": "^22.10.2", + "@types/node-forge": "^1.3.14", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "baseui": "^16.1.1", + "clsx": "^2.1.1", + "electron": "^42.3.3", + "electron-builder": "^26.8.1", + "esbuild": "^0.27.7", + "lucide-react": "^1.17.0", + "motion": "^12.40.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "recharts": "^3.8.1", + "styletron-engine-atomic": "^1.6.2", + "styletron-react": "^6.1.1", + "tailwind-merge": "^3.6.0", + "tailwindcss": "^4.3.0", + "typescript": "^5.9.3" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@claude-code-router/core": { + "resolved": "packages/core", + "link": true + }, + "node_modules/@claude-code-router/electron": { + "resolved": "packages/electron", + "link": true + }, + "node_modules/@claude-code-router/ui": { + "resolved": "packages/ui", + "link": true + }, + "node_modules/@date-io/core": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.17.0.tgz", + "integrity": "sha512-+EQE8xZhRM/hsY0CDTVyayMDDY5ihc4MqXCrPxooKw19yAzUIC6uUqsZeaOFNL9YKTNxYKrJP5DFgE8o5xRCOw==", + "license": "MIT" + }, + "node_modules/@date-io/date-fns": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.17.0.tgz", + "integrity": "sha512-L0hWZ/mTpy3Gx/xXJ5tq5CzHo0L7ry6KEO9/w/JWiFWFLZgiNVo3ex92gOl3zmzjHqY/3Ev+5sehAr8UnGLEng==", + "license": "MIT", + "dependencies": { + "@date-io/core": "^2.17.0" + }, + "peerDependencies": { + "date-fns": "^2.0.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + } + } + }, + "node_modules/@date-io/moment": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-2.17.0.tgz", + "integrity": "sha512-e4nb4CDZU4k0WRVhz1Wvl7d+hFsedObSauDHKtZwU9kt7gdYEAzKgnrSCTHsEaXrDumdrkCYTeZ0Tmyk7uV4tw==", + "license": "MIT", + "dependencies": { + "@date-io/core": "^2.17.0" + }, + "peerDependencies": { + "moment": "^2.24.0" + }, + "peerDependenciesMeta": { + "moment": { + "optional": true + } + } + }, + "node_modules/@dnd-kit/accessibility": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", + "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/core": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", + "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", + "license": "MIT", + "dependencies": { + "@dnd-kit/accessibility": "^3.1.1", + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/sortable": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz", + "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==", + "license": "MIT", + "dependencies": { + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@dnd-kit/core": "^6.3.0", + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/utilities": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz", + "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@electron-internal/extract-zip": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@electron-internal/extract-zip/-/extract-zip-1.0.3.tgz", + "integrity": "sha512-OjKpjB7gohtEjZiq6nDx1egqjZJhGPN1iFOIED+NFhB/MMkXw/XRcHjh1DGXKT5z2W9eW7Jy2UKU3gpjvusFTQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@electron/asar/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/asar/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/fuses": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", + "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.1", + "fs-extra": "^9.0.1", + "minimist": "^1.2.5" + }, + "bin": { + "electron-fuses": "dist/bin.js" + } + }, + "node_modules/@electron/fuses/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/get": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.0.0.tgz", + "integrity": "sha512-pjoBpru1KdEtcExBnuHAP1cAc/5faoedw0hzJkL3o4/IJp7HNF1+fbrdxT3gMYRX2oJfvnA/WXeCTVQpYYxyJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^3.0.0", + "graceful-fs": "^4.2.11", + "progress": "^2.0.3", + "semver": "^7.6.3", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=22.12.0" + }, + "optionalDependencies": { + "undici": "^7.24.4" + } + }, + "node_modules/@electron/notarize": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", + "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/rebuild": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.0.4.tgz", + "integrity": "sha512-Rzc39XPdk/+/wBG8MfwAHohXflep0ITUfulb6Rgz3R0NeSB1noE+E9/M/cb8ftCAiyDD9PPhLuuWgE1GaInbKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.1.1", + "node-abi": "^4.2.0", + "node-api-version": "^0.2.1", + "node-gyp": "^12.2.0", + "read-binary-file-arch": "^1.0.6" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/universal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", + "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.3.1", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/windows-sign": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", + "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.5.tgz", + "integrity": "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^3.0.0" + } + }, + "node_modules/@fastify/error": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.0.tgz", + "integrity": "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.3.tgz", + "integrity": "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "fast-json-stringify": "^6.0.0" + } + }, + "node_modules/@fastify/forwarded": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.0.1.tgz", + "integrity": "sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz", + "integrity": "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@fastify/proxy-addr": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.0.tgz", + "integrity": "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/forwarded": "^3.0.0", + "ipaddr.js": "^2.1.0" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/geojson-rewind": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", + "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", + "license": "ISC", + "dependencies": { + "get-stream": "^6.0.1", + "minimist": "^1.2.6" + }, + "bin": { + "geojson-rewind": "geojson-rewind" + } + }, + "node_modules/@mapbox/geojson-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", + "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==", + "license": "ISC" + }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mapbox/mapbox-gl-supported": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", + "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==", + "license": "BSD-3-Clause", + "peerDependencies": { + "mapbox-gl": ">=0.32.1 <2.0.0" + } + }, + "node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==", + "license": "ISC" + }, + "node_modules/@mapbox/tiny-sdf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", + "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==", + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==", + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "node_modules/@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", + "license": "ISC", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@math.gl/web-mercator": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@math.gl/web-mercator/-/web-mercator-3.6.3.tgz", + "integrity": "sha512-UVrkSOs02YLehKaehrxhAejYMurehIHPfFQvPFZmdJHglHOU4V2cCUApTVEwOksvCp161ypEqVp+9H6mGhTTcw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.0", + "gl-matrix": "^3.4.0" + } + }, + "node_modules/@musistudio/claude-code-router": { + "resolved": "packages/cli", + "link": true + }, + "node_modules/@noble/hashes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.8.0.tgz", + "integrity": "sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.7.1.tgz", + "integrity": "sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "tslib": "^2.8.1", + "webcrypto-core": "^1.9.2" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" + }, + "node_modules/@playwright/test": { + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.61.1.tgz", + "integrity": "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.61.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@pm2/agent": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.1.1.tgz", + "integrity": "sha512-0V9ckHWd/HSC8BgAbZSoq8KXUG81X97nSkAxmhKDhmF8vanyaoc1YXwc2KVkbWz82Rg4gjd2n9qiT3i7bdvGrQ==", + "license": "AGPL-3.0", + "dependencies": { + "async": "~3.2.0", + "chalk": "~3.0.0", + "dayjs": "~1.8.24", + "debug": "~4.3.1", + "eventemitter2": "~5.0.1", + "fast-json-patch": "^3.1.0", + "fclone": "~1.0.11", + "pm2-axon": "~4.0.1", + "pm2-axon-rpc": "~0.7.0", + "proxy-agent": "~6.4.0", + "semver": "~7.5.0", + "ws": "~7.5.10" + } + }, + "node_modules/@pm2/agent/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@pm2/agent/node_modules/dayjs": { + "version": "1.8.36", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz", + "integrity": "sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==", + "license": "MIT" + }, + "node_modules/@pm2/agent/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@pm2/agent/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pm2/agent/node_modules/ws": { + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", + "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@pm2/blessed": { + "version": "0.1.81", + "resolved": "https://registry.npmjs.org/@pm2/blessed/-/blessed-0.1.81.tgz", + "integrity": "sha512-ZcNHqQjMuNRcQ7Z1zJbFIQZO/BDKV3KbiTckWdfbUaYhj7uNmUwb+FbdDWSCkvxNr9dBJQwvV17o6QBkAvgO0g==", + "license": "MIT", + "bin": { + "blessed": "bin/tput.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@pm2/io": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@pm2/io/-/io-6.1.0.tgz", + "integrity": "sha512-IxHuYURa3+FQ6BKePlgChZkqABUKFYH6Bwbw7V/pWU1pP6iR1sCI26l7P9ThUEB385ruZn/tZS3CXDUF5IA1NQ==", + "license": "Apache-2", + "dependencies": { + "async": "~2.6.1", + "debug": "~4.3.1", + "eventemitter2": "^6.3.1", + "require-in-the-middle": "^5.0.0", + "semver": "~7.5.4", + "shimmer": "^1.2.0", + "signal-exit": "^3.0.3", + "tslib": "1.9.3" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@pm2/io/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/@pm2/io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@pm2/io/node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", + "license": "MIT" + }, + "node_modules/@pm2/io/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pm2/io/node_modules/tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "license": "Apache-2.0" + }, + "node_modules/@pm2/js-api": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.8.1.tgz", + "integrity": "sha512-n9tDOz1ojyDOs05XthEXrLFVQYbbh2oAN19UakLPyEZDrUyEq05h8wIZU8+dNXBQY/KeFlWMLVA76nnX52ofRg==", + "license": "Apache-2", + "dependencies": { + "async": "^2.6.3", + "debug": "~4.3.1", + "eventemitter2": "^6.3.1", + "extrareqp2": "^1.0.0", + "ws": "^8.21.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@pm2/js-api/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/@pm2/js-api/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@pm2/js-api/node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", + "license": "MIT" + }, + "node_modules/@pm2/pm2-version-check": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz", + "integrity": "sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.1" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.12.0.tgz", + "integrity": "sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@reduxjs/toolkit/node_modules/immer": { + "version": "11.1.8", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.8.tgz", + "integrity": "sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/@rtsao/csstype": { + "version": "2.6.5-forked.0", + "resolved": "https://registry.npmjs.org/@rtsao/csstype/-/csstype-2.6.5-forked.0.tgz", + "integrity": "sha512-0HwnY8uPWcCloTgdbbaJG3MbDUfNf6yKWZfCKxFv9yj2Sbp4mSKaIjC7Cr/5L4hMxvrrk85CU3wlAg7EtBBJ1Q==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tailwindcss/cli": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.3.1.tgz", + "integrity": "sha512-ZWPy20rF+TBfTImxDMG3Wr75Y3RpaPlo9lc+oJbInlMyjT+XPkTVKVIL5RZ7JirXuIahcfHoLNFRmDorKi+JQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/watcher": "2.5.1", + "@tailwindcss/node": "4.3.1", + "@tailwindcss/oxide": "4.3.1", + "enhanced-resolve": "5.21.6", + "mri": "^1.2.0", + "picocolors": "^1.1.1", + "tailwindcss": "4.3.1" + }, + "bin": { + "tailwindcss": "dist/index.mjs" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.1.tgz", + "integrity": "sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "5.21.6", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.1" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.1.tgz", + "integrity": "sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.1", + "@tailwindcss/oxide-darwin-arm64": "4.3.1", + "@tailwindcss/oxide-darwin-x64": "4.3.1", + "@tailwindcss/oxide-freebsd-x64": "4.3.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.1", + "@tailwindcss/oxide-linux-x64-musl": "4.3.1", + "@tailwindcss/oxide-wasm32-wasi": "4.3.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.1.tgz", + "integrity": "sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.1.tgz", + "integrity": "sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.1.tgz", + "integrity": "sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.1.tgz", + "integrity": "sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.1.tgz", + "integrity": "sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.1.tgz", + "integrity": "sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.1.tgz", + "integrity": "sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.1.tgz", + "integrity": "sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.1.tgz", + "integrity": "sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.1.tgz", + "integrity": "sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.10.0", + "@emnapi/runtime": "^1.10.0", + "@emnapi/wasi-threads": "^1.2.1", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.10.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.10.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.1.tgz", + "integrity": "sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.1.tgz", + "integrity": "sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@the-next-ai/ai-gateway": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@the-next-ai/ai-gateway/-/ai-gateway-1.0.7.tgz", + "integrity": "sha512-HJtfjpBgjFEPQ6ub7nFTtEyxzzbrz6V5vQZfJOoHi3Jhpjob3W4h0UenTW6loHanJYucFIEh01SvB//Qj3ulcw==", + "license": "MIT", + "dependencies": { + "diff": "^8.0.3", + "fastify": "^5.8.2", + "glob": "^13.0.6", + "openai": "^6.27.0", + "ws": "^8.19.0" + }, + "bin": { + "next-ai-gateway": "bin/next-ai-gateway.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@the-next-ai/bot-gateway-sdk": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@the-next-ai/bot-gateway-sdk/-/bot-gateway-sdk-0.1.0.tgz", + "integrity": "sha512-AedLi7oqf3ChqPllvy3h+h6plGZf/Rxbpp5TdmfAKeXjJ7ezaWVxRtsOA6EFAVXYLTtYQ+Sy0fZThW5FucKYKQ==", + "license": "MIT", + "bin": { + "bot-gateway-stdio": "bin/bot-gateway-stdio.mjs" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" + }, + "node_modules/@types/better-sqlite3": { + "version": "7.6.13", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", + "integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hammerjs": { + "version": "2.0.46", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz", + "integrity": "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.19.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.21.tgz", + "integrity": "sha512-VMeFBSCKQKmm2swI2kW51SFusDqekC6q9trBCvJ/JliDchFSuoYYKN7yVNjPthP1HKZcx3U1gI/wTcEBjEFKTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.31", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", + "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abbrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/amp": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz", + "integrity": "sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw==", + "license": "MIT" + }, + "node_modules/amp-message": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/amp-message/-/amp-message-0.1.2.tgz", + "integrity": "sha512-JqutcFwoU1+jhv7ArgW38bqrE+LQdcRv4NxNw0mp0JHQyB6tXesWRjtYKlDgHRY2o3JE5UTaBGUK8kSWUdxWUg==", + "license": "MIT", + "dependencies": { + "amp": "0.3.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.0.0-node10", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.0.0-node10.tgz", + "integrity": "sha512-BRrU0Bo1X9dFGw6KgGz6hWrqQuOlVEDOzkb0QSLZY9sXHqA7pNj7yHPVJRz7y/rj4EOJ3d/D5uxH+ee9leYgsg==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-builder-lib": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.15.3.tgz", + "integrity": "sha512-2VnyWkqsP5v5XbBhL3tD5Syx8iNPBYsoU7kY4S2fz7wg8Rj/nztWKCUzGKaFRTv0Xwf3/H058CR1Kvtd/3lRow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "3.4.1", + "@electron/fuses": "^1.8.0", + "@electron/get": "^3.0.0", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.3", + "@electron/rebuild": "^4.0.4", + "@electron/universal": "2.0.3", + "@malept/flatpak-bundler": "^0.4.0", + "@noble/hashes": "^2.2.0", + "@peculiar/webcrypto": "^1.7.1", + "@types/fs-extra": "9.0.13", + "ajv": "^8.18.0", + "asn1js": "^3.0.10", + "async-exit-hook": "^2.0.1", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chromium-pickle-js": "^0.2.0", + "ci-info": "4.3.1", + "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "ejs": "^3.1.8", + "electron-publish": "26.15.3", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "isbinaryfile": "^5.0.0", + "jiti": "^2.4.2", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "lazy-val": "^1.0.5", + "minimatch": "^10.2.5", + "pkijs": "^3.4.0", + "plist": "3.1.0", + "proper-lockfile": "^4.1.2", + "resedit": "^1.7.0", + "semver": "~7.7.3", + "tar": "^7.5.7", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0", + "unzipper": "^0.12.3", + "which": "^5.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "26.15.3", + "electron-builder-squirrel-windows": "26.15.3" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", + "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/app-builder-lib/node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/app-builder-lib/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/attr-accept": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-1.1.3.tgz", + "integrity": "sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ==", + "license": "MIT", + "dependencies": { + "core-js": "^2.5.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/avvio": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.2.0.tgz", + "integrity": "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/error": "^4.0.0", + "fastq": "^1.17.1" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/axe-core": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.12.1.tgz", + "integrity": "sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==", + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseui": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/baseui/-/baseui-16.1.1.tgz", + "integrity": "sha512-pux441GCtmYrI8NE1SYqwsDnBad47msc7T/6p9JhHYrqYKo2y52YAO+7oSoFqIdaJxoY9r443U14hDkF68p56w==", + "license": "MIT", + "dependencies": { + "@date-io/date-fns": "^2.13.1", + "@date-io/moment": "^2.13.1", + "axe-core": "^4.11.0", + "card-validator": "^6.2.0", + "csstype": "2.6.11", + "d3": "^7.9.0", + "date-fns": "^2.28.0", + "date-fns-tz": "^1.2.2", + "just-extend": "4.1.1", + "memoize-one": "5.0.0", + "mockdate": "2.0.5", + "moment": "^2.29.4", + "polished": "^4.2.2", + "popper.js": "^1.16.1", + "prop-types": "^15.8.1", + "react-dropzone": "9.0.0", + "react-focus-lock": "^2.8.1", + "react-hook-form": "^7.30.0", + "react-input-mask": "^2.0.4", + "react-is": "^17.0.2", + "react-map-gl": "5.2.13", + "react-movable": "^3.0.4", + "react-multi-ref": "^1.0.0", + "react-range": "^1.8.12", + "react-uid": "2.3.0", + "react-virtualized": "^9.22.3", + "react-virtualized-auto-sizer": "1.0.2", + "react-window": "1.8.5", + "resize-observer-polyfill": "1.5.1", + "styletron-standard": "^3.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18", + "styletron-react": ">=6" + } + }, + "node_modules/baseui/node_modules/csstype": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.11.tgz", + "integrity": "sha512-l8YyEC9NBkSm783PFTvh0FmJy7s5pFKrDp49ZL7zBGX3fWkO+N4EEyan1qqp8cwPLDcD0OSdyY6hAMoxp34JFw==", + "license": "MIT" + }, + "node_modules/baseui/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, + "node_modules/baseui/node_modules/react-uid": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-uid/-/react-uid-2.3.0.tgz", + "integrity": "sha512-tsPZ77GR0pISGYmpCLHAbZTabKXZ7zBniKPVqVMMfnXFyo39zq5g/psIlD5vLTKkjQEhWOO8JhqcHnxkwNu6eA==", + "license": "MIT", + "dependencies": { + "tslib": "^1.10.0" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@types/react": "^16.8.0", + "react": "^16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/baseui/node_modules/react-virtualized-auto-sizer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.2.tgz", + "integrity": "sha512-MYXhTY1BZpdJFjUovvYHVBmkq79szK/k7V3MO+36gJkWGkrXKtyr4vCPtpphaTLRAdDNoYEYFZWE8LjN+PIHNg==", + "license": "MIT", + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha", + "react-dom": "^15.3.0 || ^16.0.0-alpha" + } + }, + "node_modules/baseui/node_modules/react-window": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.5.tgz", + "integrity": "sha512-HeTwlNa37AFa8MDZFZOKcNEkuF2YflA0hpGPiTT9vR7OawEt+GZbfM6wqkBahD3D3pUjIabQYzsnY/BSJbgq6Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0", + "react-dom": "^15.0.0 || ^16.0.0" + } + }, + "node_modules/baseui/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/basic-ftp": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz", + "integrity": "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/better-sqlite3": { + "version": "12.11.1", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.11.1.tgz", + "integrity": "sha512-dq9AtApgg5PGFtBzPFSBl3HZQjHok5gaQCM6zh2Yk0aSmDCs1CbnVI8/HgASQkNKsWFpseIO9beg5xxpYhbIfA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + }, + "engines": { + "node": "20.x || 22.x || 23.x || 24.x || 25.x || 26.x" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/bodec": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bodec/-/bodec-0.1.0.tgz", + "integrity": "sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==", + "license": "MIT" + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/builder-util": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.15.3.tgz", + "integrity": "sha512-q2hn7Mbo2nFNkVekPiHFx6Nfo3hURmES3tfBn+k5Pqxl2RkmP3QGqZUhH/q9Pch/4G05NRhPjDlVj1O8q4Txvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.6", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "js-yaml": "^4.1.0", + "sanitize-filename": "^1.6.3", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.7.0.tgz", + "integrity": "sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/card-validator": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/card-validator/-/card-validator-6.2.0.tgz", + "integrity": "sha512-1vYv45JaE9NmixZr4dl6ykzbFKv7imI9L7MQDs235b/a7EGbG8rrEsipeHtVvscLSUbl3RX6UP5gyOe0Y2FlHA==", + "license": "MIT", + "dependencies": { + "credit-card-type": "^8.0.0" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/charm": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", + "integrity": "sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==", + "license": "MIT/X11" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-tableau": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz", + "integrity": "sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==", + "dependencies": { + "chalk": "3.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/cli-tableau/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/credit-card-type": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/credit-card-type/-/credit-card-type-8.3.0.tgz", + "integrity": "sha512-czfZUpQ7W9CDxZL4yFLb1kFtM/q2lTOY975hL2aO+DC8+GRNDVSXVCHXhVFZPxiUKmQCZbFP8vIhxx5TBQaThw==", + "license": "MIT" + }, + "node_modules/croner": { + "version": "4.1.97", + "resolved": "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz", + "integrity": "sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==", + "license": "MIT" + }, + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-in-js-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz", + "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==", + "license": "MIT", + "dependencies": { + "hyphenate-style-name": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "node_modules/csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/culvert": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz", + "integrity": "sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/date-fns-tz": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-1.3.8.tgz", + "integrity": "sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ==", + "license": "MIT", + "peerDependencies": { + "date-fns": ">=2.0.0" + } + }, + "node_modules/dayjs": { + "version": "1.11.15", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.15.tgz", + "integrity": "sha512-MC+DfnSWiM9APs7fpiurHGCoeIx0Gdl6QZBy+5lu8MbYKN5FZEXqOgrundfibdfhGZ15o9hzmZ2xJjZnbvgKXQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-compare": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, + "node_modules/dir-compare/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/dir-compare/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/dir-compare/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dmg-builder": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.15.3.tgz", + "integrity": "sha512-O3zJUFUYHJKgzPqioHxfxzBzlSC1eXCSr79gMSBKBP5AgjjpmrydMsMLotEg9fAJF36vdUncb+4ndRNxoPdlSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", + "license": "ISC" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "42.4.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-42.4.1.tgz", + "integrity": "sha512-8CYHJP5O4wFO+ycoJR98yy907MmPeo+vWXrzjxmGGgRNKqv8pOjjm+wphO0CCgQJnBU7+QUPSJS4QXhbKrO50w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-internal/extract-zip": "^1.0.1", + "@electron/get": "^5.0.0", + "@types/node": "^24.9.0" + }, + "bin": { + "electron": "cli.js", + "install-electron": "install.js" + }, + "engines": { + "node": ">= 22.12.0" + } + }, + "node_modules/electron-builder": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.15.3.tgz", + "integrity": "sha512-a1KM5heqS3gQCZzizXEI8RjJy3QVogULPdeSknt76uLDpBIW/HDGsMg/XgP0riP6PI9COsRvFITKKGDqA8fJxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "dmg-builder": "26.15.3", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-squirrel-windows": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.15.3.tgz", + "integrity": "sha512-Jc19XPV9y9+2bAdZPkXuVNGNIEFBq9poHC61l8Kv6FdK7DRG3+Ic0rerC0DXOaeHNz8yW0fg/JnF8GQROOF5MA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "electron-winstaller": "5.4.0" + } + }, + "node_modules/electron-publish": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.15.3.tgz", + "integrity": "sha512-g/2bn8YTavY4cuS5F+jOS7zmZbXXBV8KZ8yHKfJjFPoKtzBqrpCdNPxBd3tqdBwP7BVd0lGzf7Bk2s0KesWZ4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^9.0.11", + "aws4": "^1.13.2", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "form-data": "^4.0.5", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-updater": { + "version": "6.8.9", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.8.9.tgz", + "integrity": "sha512-ZhVxM9iGONUpZGI1FxdMRgJjUFXi7AYGVa5PwKlO1tV1/4zDxQmfKpXOHVztKrd6L9rLcFjERvi1Mf2vxyTkig==", + "license": "MIT", + "dependencies": { + "builder-util-runtime": "9.7.0", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "lodash.escaperegexp": "^4.1.2", + "lodash.isequal": "^4.5.0", + "semver": "~7.7.3", + "tiny-typed-emitter": "^2.1.0" + } + }, + "node_modules/electron-updater/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/electron-winstaller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-winstaller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/electron/node_modules/@types/node": { + "version": "24.13.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", + "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/electron/node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.21.6", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", + "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-toolkit": { + "version": "1.47.1", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.47.1.tgz", + "integrity": "sha512-5RAqEwf4P4E17p+W75KLOWw/nOvKZzSQpxM32IpI2KZLaVonjTrZ0Ai5ghMaVI9eKC2p8eoQgcBdkEDgzFk6+Q==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", + "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==", + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/extrareqp2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/extrareqp2/-/extrareqp2-1.0.0.tgz", + "integrity": "sha512-Gum0g1QYb6wpPJCVypWP3bbIuaibcFiJcpuPM10YSXp/tzqi84x9PJageob+eN4xVRIOto4wjSGNLyMD54D2xA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", + "license": "MIT" + }, + "node_modules/fast-json-stringify": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.4.0.tgz", + "integrity": "sha512-ibRCQ0GZKJIQ+P3Et1h0LhPgp3PMTYk0MH8O+kW3lNYsvmaQww5Nn3f1jf73Q0jR1Yz3a1CDP4/NZD3vOajWJQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/merge-json-schemas": "^0.2.0", + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^3.0.0", + "json-schema-ref-resolver": "^3.0.0", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "license": "MIT", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastify": { + "version": "5.8.5", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.8.5.tgz", + "integrity": "sha512-Yqptv59pQzPgQUSIm87hMqHJmdkb1+GPxdE6vW6FRyVE9G86mt7rOghitiU4JHRaTyDUk9pfeKmDeu70lAwM4Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/ajv-compiler": "^4.0.5", + "@fastify/error": "^4.0.0", + "@fastify/fast-json-stringify-compiler": "^5.0.0", + "@fastify/proxy-addr": "^5.0.0", + "abstract-logging": "^2.0.1", + "avvio": "^9.0.0", + "fast-json-stringify": "^6.0.0", + "find-my-way": "^9.0.0", + "light-my-request": "^6.0.0", + "pino": "^9.14.0 || ^10.1.0", + "process-warning": "^5.0.0", + "rfdc": "^1.3.1", + "secure-json-parse": "^4.0.0", + "semver": "^7.6.0", + "toad-cache": "^3.7.0" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fclone": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz", + "integrity": "sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==", + "license": "MIT" + }, + "node_modules/file-selector": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.1.19.tgz", + "integrity": "sha512-kCWw3+Aai8Uox+5tHCNgMFaUdgidxvMnLWO6fM5sZ0hA2wlHP5/DHGF0ECe84BiB95qdJbKNEJhWKVDvMN+JDQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/filelist": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-my-way": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.6.0.tgz", + "integrity": "sha512-Zf4Xve4RymLl7NgaavNebZ01joJ8MfVerOG43wy7SHLO+r+K0C6d/SE0BiR7AV5V1VOCFlOP7ecdo+I4qmiHrQ==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^5.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/focus-lock": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.6.tgz", + "integrity": "sha512-Ik/6OCk9RQQ0T5Xw+hKNLWrjSMtv51dD4GRmJjbD5a58TIEpI5a5iXagKVl3Z5UuyslMCA8Xwnu76jQob62Yhg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/framer-motion": { + "version": "12.40.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.40.0.tgz", + "integrity": "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.40.0", + "motion-utils": "^12.39.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/geojson-vt": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", + "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==", + "license": "ISC" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/git-node-fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz", + "integrity": "sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ==", + "license": "MIT" + }, + "node_modules/git-sha1": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/git-sha1/-/git-sha1-0.1.2.tgz", + "integrity": "sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg==", + "license": "MIT" + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/gl-matrix": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz", + "integrity": "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==", + "license": "MIT" + }, + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/grid-index": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", + "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==", + "license": "ISC" + }, + "node_modules/hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/hyphenate-style-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", + "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", + "license": "BSD-3-Clause" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/inline-style-prefixer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-5.1.2.tgz", + "integrity": "sha512-PYUF+94gDfhy+LsQxM0g3d6Hge4l1pAqOSOiZuHWzMvQEGsbRQ/ck2WioLqrY2ZkHyPgVUXxn+hrkF7D6QUGbA==", + "license": "MIT", + "dependencies": { + "css-in-js-utils": "^2.0.0" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ip-address": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", + "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-git": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/js-git/-/js-git-0.7.8.tgz", + "integrity": "sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==", + "license": "MIT", + "dependencies": { + "bodec": "^0.1.0", + "culvert": "^0.1.2", + "git-sha1": "^0.1.2", + "pako": "^0.2.5" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-ref-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", + "integrity": "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/just-extend": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.1.tgz", + "integrity": "sha512-aWgeGFW67BP3e5181Ep1Fv2v8z//iBJfrvyTnq8wG86vEESwmonn1zPBJ0VfmT9CJq2FIT0VsETtrNFm2a+SHA==", + "license": "MIT" + }, + "node_modules/kdbush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", + "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==", + "license": "ISC" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "license": "MIT" + }, + "node_modules/light-my-request": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz", + "integrity": "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", + "dependencies": { + "cookie": "^1.0.1", + "process-warning": "^4.0.0", + "set-cookie-parser": "^2.6.0" + } + }, + "node_modules/light-my-request/node_modules/process-warning": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lucide-react": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.20.0.tgz", + "integrity": "sha512-jhXLeC/7m0/tjL1nzMdKk6x256zWA6AtbhTVreHOiKPoeX2d6MK4FbyIQPpVq0E6iPWBisyy1TW+pEge/uMEuQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mapbox-gl": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.13.3.tgz", + "integrity": "sha512-p8lJFEiqmEQlyv+DQxFAOG/XPWN0Wp7j/Psq93Zywz7qt9CcUKFYDBOoOEKzqe6gudHVJY8/Bhqw6VDpX2lSBg==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@mapbox/geojson-rewind": "^0.5.2", + "@mapbox/geojson-types": "^1.0.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/mapbox-gl-supported": "^1.5.0", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^1.1.1", + "@mapbox/unitbezier": "^0.0.0", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "csscolorparser": "~1.0.3", + "earcut": "^2.2.2", + "geojson-vt": "^3.2.1", + "gl-matrix": "^3.2.1", + "grid-index": "^1.1.0", + "murmurhash-js": "^1.0.0", + "pbf": "^3.2.1", + "potpack": "^1.0.1", + "quickselect": "^2.0.0", + "rw": "^1.3.3", + "supercluster": "^7.1.0", + "tinyqueue": "^2.0.3", + "vt-pbf": "^3.1.1" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/memoize-one": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.0.0.tgz", + "integrity": "sha512-7g0+ejkOaI9w5x6LvQwmj68kUj6rxROywPSCqmclG/HBacmFnZqhVscQ8kovkn9FBCNJmOz6SY42+jnvZzDWdw==", + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mjolnir.js": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/mjolnir.js/-/mjolnir.js-2.7.3.tgz", + "integrity": "sha512-Z5z/+FzZqOSO3juSVKV3zcm4R2eAlWwlKMcqHmyFEJAaLILNcDKnIbnb4/kbcGyIuhtdWrzu8WOIR7uM6I34aw==", + "license": "MIT", + "dependencies": { + "@types/hammerjs": "^2.0.41", + "hammerjs": "^2.0.8" + }, + "engines": { + "node": ">= 4", + "npm": ">= 3" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/mockdate": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/mockdate/-/mockdate-2.0.5.tgz", + "integrity": "sha512-ST0PnThzWKcgSLyc+ugLVql45PvESt3Ul/wrdV/OPc/6Pr8dbLAIJsN1cIp41FLzbN+srVTNIRn+5Cju0nyV6A==", + "license": "MIT" + }, + "node_modules/module-details-from-path": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", + "license": "MIT" + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/motion": { + "version": "12.40.0", + "resolved": "https://registry.npmjs.org/motion/-/motion-12.40.0.tgz", + "integrity": "sha512-yjrHUrBFW6kQvjJwRsoiPSAhC5tRwRqNGJWmiJ4CrGnbKp0V88AdzkhBmDoqIsIPfarOe0Uddd37Xq43/gIocA==", + "license": "MIT", + "dependencies": { + "framer-motion": "^12.40.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/motion-dom": { + "version": "12.40.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.40.0.tgz", + "integrity": "sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.39.0" + } + }, + "node_modules/motion-utils": { + "version": "12.39.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz", + "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==", + "license": "MIT" + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==", + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "license": "ISC" + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, + "node_modules/needle": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/netmask": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz", + "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/node-abi": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.31.0.tgz", + "integrity": "sha512-Erq5w/t3syw3s4sDsUaX4QttIdBPsGKTT1DTRsCkTonGggczhlDKm/wDX3o+HPJpQ41EjXCbcmXf0tgr5YZJXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-api-version": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-forge": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", + "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz", + "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/node-gyp/node_modules/undici": { + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.27.0.tgz", + "integrity": "sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/openai": { + "version": "6.44.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-6.44.0.tgz", + "integrity": "sha512-09/gH+8jH0RgUwsgWHAaxsKGRT5zVZ95IaJUnqAWj6XejIBmnFRwq2WUIF37VtDEsmGrtPmvCs5+yBSeZGWvkA==", + "license": "Apache-2.0", + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "license": "MIT" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/pbf": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", + "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" + } + }, + "node_modules/pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidusage": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-3.0.2.tgz", + "integrity": "sha512-g0VU+y08pKw5M8EZ2rIGiEBaB8wrQMjYGFfW2QVIfyT8V+fq8YFLkvlz4bz5ljvFDJYNFCWT3PWqcRr2FKO81w==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pidusage/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/pino": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.1.tgz", + "integrity": "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==", + "license": "MIT", + "dependencies": { + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^3.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^4.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", + "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", + "license": "MIT" + }, + "node_modules/pkijs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", + "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/pkijs/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/playwright": { + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz", + "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.61.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz", + "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/pm2": { + "version": "6.0.14", + "resolved": "https://registry.npmjs.org/pm2/-/pm2-6.0.14.tgz", + "integrity": "sha512-wX1FiFkzuT2H/UUEA8QNXDAA9MMHDsK/3UHj6Dkd5U7kxyigKDA5gyDw78ycTQZAuGCLWyUX5FiXEuVQWafukA==", + "license": "AGPL-3.0", + "dependencies": { + "@pm2/agent": "~2.1.1", + "@pm2/blessed": "0.1.81", + "@pm2/io": "~6.1.0", + "@pm2/js-api": "~0.8.0", + "@pm2/pm2-version-check": "^1.0.4", + "ansis": "4.0.0-node10", + "async": "3.2.6", + "chokidar": "3.6.0", + "cli-tableau": "2.0.1", + "commander": "2.15.1", + "croner": "4.1.97", + "dayjs": "1.11.15", + "debug": "4.4.3", + "enquirer": "2.3.6", + "eventemitter2": "5.0.1", + "fclone": "1.0.11", + "js-yaml": "4.1.1", + "mkdirp": "1.0.4", + "needle": "2.4.0", + "pidusage": "3.0.2", + "pm2-axon": "~4.0.1", + "pm2-axon-rpc": "~0.7.1", + "pm2-deploy": "~1.0.2", + "pm2-multimeter": "^0.1.2", + "promptly": "2.2.0", + "semver": "7.7.2", + "source-map-support": "0.5.21", + "sprintf-js": "1.1.2", + "vizion": "~2.2.1" + }, + "bin": { + "pm2": "bin/pm2", + "pm2-dev": "bin/pm2-dev", + "pm2-docker": "bin/pm2-docker", + "pm2-runtime": "bin/pm2-runtime" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "pm2-sysmonit": "^1.2.8" + } + }, + "node_modules/pm2-axon": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pm2-axon/-/pm2-axon-4.0.1.tgz", + "integrity": "sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg==", + "license": "MIT", + "dependencies": { + "amp": "~0.3.1", + "amp-message": "~0.1.1", + "debug": "^4.3.1", + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=5" + } + }, + "node_modules/pm2-axon-rpc": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz", + "integrity": "sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.1" + }, + "engines": { + "node": ">=5" + } + }, + "node_modules/pm2-deploy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pm2-deploy/-/pm2-deploy-1.0.2.tgz", + "integrity": "sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==", + "license": "MIT", + "dependencies": { + "run-series": "^1.1.8", + "tv4": "^1.3.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pm2-multimeter": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz", + "integrity": "sha512-S+wT6XfyKfd7SJIBqRgOctGxaBzUOmVQzTAS+cg04TsEUObJVreha7lvCfX8zzGVr871XwCSnHUU7DQQ5xEsfA==", + "license": "MIT/X11", + "dependencies": { + "charm": "~0.1.1" + } + }, + "node_modules/pm2-sysmonit": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/pm2-sysmonit/-/pm2-sysmonit-1.2.8.tgz", + "integrity": "sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==", + "license": "Apache", + "optional": true, + "dependencies": { + "async": "^3.2.0", + "debug": "^4.3.1", + "pidusage": "^2.0.21", + "systeminformation": "^5.7", + "tx2": "~1.0.4" + } + }, + "node_modules/pm2-sysmonit/node_modules/pidusage": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz", + "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==", + "license": "MIT", + "optional": true, + "dependencies": { + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pm2-sysmonit/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true + }, + "node_modules/pm2/node_modules/commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "license": "MIT" + }, + "node_modules/pm2/node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/pm2/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pm2/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pm2/node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "license": "BSD-3-Clause" + }, + "node_modules/polished": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", + "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", + "license": "ISC" + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install/node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/prebuild-install/node_modules/node-abi": { + "version": "3.92.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", + "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/promptly": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz", + "integrity": "sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==", + "license": "MIT", + "dependencies": { + "read": "^1.0.4" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "license": "MIT", + "dependencies": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, + "node_modules/prop-types-extra/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/protocol-buffers-schema": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.1.tgz", + "integrity": "sha512-VG2K63Igkiv9p76tk1lilczEK1cT+kCjKtkdhw1dQZV3k3IXJbd3o6Ho8b9zJZaHSnT2hKe4I+ObmX9w6m5SmQ==", + "license": "MIT" + }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", + "license": "ISC" + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-clientside-effect": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.8.tgz", + "integrity": "sha512-ma2FePH0z3px2+WOu6h+YycZcEvFmmxIlAb62cF52bG86eMySciO/EQZeQMXd07kPCYB0a1dWDT5J+KE9mCDUw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-dropzone": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-9.0.0.tgz", + "integrity": "sha512-wZ2o9B2qkdE3RumWhfyZT9swgJYJPeU5qHEcMU8weYpmLex1eeWX0CC32/Y0VutB+BBi2D+iePV/YZIiB4kZGw==", + "license": "MIT", + "dependencies": { + "attr-accept": "^1.1.3", + "file-selector": "^0.1.8", + "prop-types": "^15.6.2", + "prop-types-extra": "^1.1.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, + "node_modules/react-focus-lock": { + "version": "2.13.7", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.13.7.tgz", + "integrity": "sha512-20lpZHEQrXPb+pp1tzd4ULL6DyO5D2KnR0G69tTDdydrmNhU7pdFmbQUYVyHUgp+xN29IuFR0PVuhOmvaZL9Og==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^1.3.6", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.7", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-hook-form": { + "version": "7.79.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.79.0.tgz", + "integrity": "sha512-mhYp/MTmXvzYX6AJcJVko0rktoIhhmRnEouObj4wF5i/tCttgJvnp1+9wRkpITZjDTqpo4IOSJqu0dBlPlV/Lw==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-input-mask": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/react-input-mask/-/react-input-mask-2.0.4.tgz", + "integrity": "sha512-1hwzMr/aO9tXfiroiVCx5EtKohKwLk/NT8QlJXHQ4N+yJJFyUuMT+zfTpLBwX/lK3PkuMlievIffncpMZ3HGRQ==", + "license": "MIT", + "dependencies": { + "invariant": "^2.2.4", + "warning": "^4.0.2" + }, + "peerDependencies": { + "react": ">=0.14.0", + "react-dom": ">=0.14.0" + } + }, + "node_modules/react-is": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", + "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "license": "MIT", + "peer": true + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "license": "MIT" + }, + "node_modules/react-map-gl": { + "version": "5.2.13", + "resolved": "https://registry.npmjs.org/react-map-gl/-/react-map-gl-5.2.13.tgz", + "integrity": "sha512-yYqpZJADB7o5epiYpkcUED5MWevFnOsVn9mgKfizxjsenLMpVNgNgb/x0e9DS4VZtpOLWW2ZXYBB4BJZJlZmTQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "mapbox-gl": "^1.0.0", + "mjolnir.js": "^2.4.0", + "prop-types": "^15.7.2", + "react-virtualized-auto-sizer": "^1.0.2", + "viewport-mercator-project": "^6.2.3 || ^7.0.1" + }, + "engines": { + "node": ">= 4", + "npm": ">= 3" + }, + "peerDependencies": { + "react": ">=16.3.0" + } + }, + "node_modules/react-map-gl/node_modules/react-virtualized-auto-sizer": { + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.26.tgz", + "integrity": "sha512-CblNyiNVw2o+hsa5/49NH2ogGxZ+t+3aweRvNSq7TVjDIlwk7ir4lencEg5HxHeSzwNarSkNkiu0qJSOXtxm5A==", + "license": "MIT", + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-movable": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/react-movable/-/react-movable-3.4.1.tgz", + "integrity": "sha512-VTrBKjRWV4yVUDGj5dIZIhf07fyoFDXzIV6xs3KNNHpgPbkPT7FNu/Vbe11ZjHmT48uOykCmRMpS66DrzRbZZg==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/react-multi-ref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/react-multi-ref/-/react-multi-ref-1.0.2.tgz", + "integrity": "sha512-6oS5yzrZ4UrdMHbF6QAnnaoIe9h8R+Xv4m8uJWVK8/Q4RCc6RTT0XJ/LZ7llVgFcVbnDHeUAcVIhtRgFyzjJpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.4" + } + }, + "node_modules/react-range": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/react-range/-/react-range-1.10.0.tgz", + "integrity": "sha512-kDo0LiBUHIQIP8menx0UoxTnHr7UXBYpIYl/DR9jCaO1o29VwvCLpkP/qOTNQz5hkJadPg1uEM07XJcJ1XGoKw==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/react-redux": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz", + "integrity": "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-virtualized": { + "version": "9.22.6", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.6.tgz", + "integrity": "sha512-U5j7KuUQt3AaMatlMJ0UJddqSiX+Km0YJxSqbAzIiGw5EmNz0khMyqP2hzgu4+QUtm+QPIrxzUX4raJxmVJnHg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "clsx": "^1.0.4", + "dom-helpers": "^5.1.3", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-virtualized/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "license": "ISC", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/recharts": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.8.1.tgz", + "integrity": "sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg==", + "license": "MIT", + "workspaces": [ + "www" + ], + "dependencies": { + "@reduxjs/toolkit": "^1.9.0 || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^10.1.1", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.1.1", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", + "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/resedit": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", + "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pe-library": "^0.4.1" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "license": "MIT", + "dependencies": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ret": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", + "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rimraf/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "license": "Unlicense" + }, + "node_modules/run-series": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", + "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/safe-regex2": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.1.1.tgz", + "integrity": "sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "ret": "~0.5.0" + }, + "bin": { + "safe-regex2": "bin/safe-regex2.js" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/secure-json-parse": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", + "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", + "license": "BSD-2-Clause" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", + "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.1.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/sonic-boom": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", + "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/styletron-engine-atomic": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/styletron-engine-atomic/-/styletron-engine-atomic-1.6.2.tgz", + "integrity": "sha512-vWSIxpCkYbVD3xhnxYwnJDJePD8p8pJCu7g1zFxdQIM4z34Eo1zj3LgXJI6yeNMrJ7PkE56SYK6ZOo3hpTOBzA==", + "license": "MIT", + "dependencies": { + "inline-style-prefixer": "^5.1.0", + "styletron-standard": "^3.1.0" + } + }, + "node_modules/styletron-react": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/styletron-react/-/styletron-react-6.1.1.tgz", + "integrity": "sha512-K04BwKZTrdRG/wR5BaFG8z0bFu1jkT2HAp0UP5ZeMAKW6Ix8J3yuROWLoLUMZafaRRQ9LjiLpIl65u75L7YZow==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.6.0", + "styletron-standard": "^3.1.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/styletron-standard": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/styletron-standard/-/styletron-standard-3.1.0.tgz", + "integrity": "sha512-Cr2q0IFsag6OaIeD/LBNRuCxNTPa/WtTbKP1X3o50mDudN8FGwmD5h1sMJ/Bu5+mO/2NfrNAv9V9zUXn6lXXMA==", + "license": "MIT", + "dependencies": { + "@rtsao/csstype": "2.6.5-forked.0", + "csstype": "^3.0.0", + "inline-style-prefixer": "^5.1.0" + } + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supercluster": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", + "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==", + "license": "ISC", + "dependencies": { + "kdbush": "^3.0.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/systeminformation": { + "version": "5.31.12", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.12.tgz", + "integrity": "sha512-qnTtO5wHrKeKE/MvQ6iIt6XAV+5fgt/kPIQf27DYgjVQQuHUfWkV4Gu6k04ZpEzAMuyQ3ZsovY7Ivhp+E9JyWw==", + "license": "MIT", + "optional": true, + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos", + "android" + ], + "bin": { + "systeminformation": "lib/cli.js" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "Buy me a coffee", + "url": "https://www.buymeacoffee.com/systeminfo" + } + }, + "node_modules/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.1.tgz", + "integrity": "sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.5.16", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz", + "integrity": "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/thread-stream": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.2.0.tgz", + "integrity": "sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==", + "license": "MIT", + "dependencies": { + "real-require": "^1.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/thread-stream/node_modules/real-require": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-1.0.0.tgz", + "integrity": "sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==", + "license": "MIT" + }, + "node_modules/tiny-async-pool": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^5.5.0" + } + }, + "node_modules/tiny-async-pool/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==", + "license": "ISC" + }, + "node_modules/tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toad-cache": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.1.tgz", + "integrity": "sha512-5DXWzE4Vz7xNHsv+xQ+MGfJYyC78Aok3tEr0MNwHoRf7vZnga1mQXZ4/Nsodld4VR6Wd+VhfmqnNrsRJyYPfrQ==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tv4": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", + "integrity": "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==", + "license": [ + { + "type": "Public Domain", + "url": "http://geraintluff.github.io/tv4/LICENSE.txt" + }, + { + "type": "MIT", + "url": "http://jsonary.com/LICENSE.txt" + } + ], + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tx2": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tx2/-/tx2-1.0.5.tgz", + "integrity": "sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg==", + "license": "MIT", + "optional": true, + "dependencies": { + "json-stringify-safe": "^5.0.1" + } + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", + "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unzipper": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz", + "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "~3.7.2", + "duplexer2": "~0.1.4", + "fs-extra": "^11.2.0", + "graceful-fs": "^4.2.2", + "node-int64": "^0.4.0" + } + }, + "node_modules/unzipper/node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/victory-vendor": { + "version": "37.3.6", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/viewport-mercator-project": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/viewport-mercator-project/-/viewport-mercator-project-7.0.4.tgz", + "integrity": "sha512-0jzpL6pIMocCKWg1C3mqi/N4UPgZC3FzwghEm1H+XsUo8hNZAyJc3QR7YqC816ibOR8aWT5pCsV+gCu8/BMJgg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT", + "dependencies": { + "@math.gl/web-mercator": "^3.5.5" + } + }, + "node_modules/vizion": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz", + "integrity": "sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==", + "license": "Apache-2.0", + "dependencies": { + "async": "^2.6.3", + "git-node-fs": "^1.0.0", + "ini": "^1.3.5", + "js-git": "^0.7.8" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vizion/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/vt-pbf": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "license": "MIT", + "dependencies": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.2.1" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/webcrypto-core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.9.2.tgz", + "integrity": "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/cli": { + "name": "@musistudio/claude-code-router", + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@the-next-ai/ai-gateway": "^1.0.4", + "@the-next-ai/bot-gateway-sdk": "^0.1.0", + "better-sqlite3": "^12.11.1", + "node-forge": "^1.4.0", + "undici": "^7.27.2" + }, + "bin": { + "ccr": "dist/main/cli.js" + }, + "engines": { + "node": ">=22" + } + }, + "packages/core": { + "name": "@claude-code-router/core", + "version": "3.0.3", + "dependencies": { + "@the-next-ai/ai-gateway": "^1.0.4", + "@the-next-ai/bot-gateway-sdk": "^0.1.0", + "better-sqlite3": "^12.11.1", + "node-forge": "^1.4.0", + "pm2": "^6.0.13", + "undici": "^7.27.2" + }, + "bin": { + "ccr-core-server": "dist/main/server.js" + }, + "engines": { + "node": ">=22" + } + }, + "packages/electron": { + "name": "@claude-code-router/electron", + "version": "3.0.11", + "dependencies": { + "better-sqlite3": "^12.11.1" + }, + "devDependencies": { + "electron-updater": "^6.8.9" + } + }, + "packages/ui": { + "name": "@claude-code-router/ui", + "version": "3.0.11", + "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", + "baseui": "^16.1.1", + "clsx": "^2.1.1", + "lucide-react": "^1.17.0", + "motion": "^12.40.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "recharts": "^3.8.1", + "styletron-engine-atomic": "^1.6.2", + "styletron-react": "^6.1.1", + "tailwind-merge": "^3.6.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9b218e1 --- /dev/null +++ b/package.json @@ -0,0 +1,97 @@ +{ + "name": "claude-code-router-monorepo", + "version": "3.0.11", + "private": true, + "license": "MIT", + "description": "Local Claude Code Router gateway with CLI and web management UI.", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/musistudio/claude-code-router.git" + }, + "bugs": { + "url": "https://github.com/musistudio/claude-code-router/issues" + }, + "homepage": "https://github.com/musistudio/claude-code-router#readme", + "keywords": [ + "claude-code", + "codex", + "llm", + "gateway", + "router" + ], + "main": "packages/electron/dist/main/main.js", + "workspaces": [ + "packages/*" + ], + "engines": { + "node": ">=22" + }, + "publishConfig": { + "access": "public" + }, + "scripts": { + "dev": "npm run dev:cli", + "dev:ui": "node build/dev.mjs ui", + "dev:cli": "node build/dev.mjs cli", + "dev:electron": "node build/dev.mjs electron", + "build": "node build/build.mjs && electron-builder", + "build:assets": "node build/build.mjs", + "build:docker": "node build/docker-build.mjs", + "build:app:mac": "npm run build:app:mac:local", + "build:app:mac:local": "npm run build:assets && electron-builder --config build/electron-builder.local.cjs --mac --publish never", + "build:app:mac:release": "node build/macos-release-preflight.mjs && npm run build:assets && electron-builder --mac --publish never", + "build:app:win": "npm run build:assets && electron-builder --win", + "prepack": "npm run build:assets", + "prepublishOnly": "npm run typecheck", + "preview": "npm run build:assets && electron .", + "docker:build": "docker build -t claude-code-router:local .", + "docker:run": "docker run --rm -p 3458:8080 -v ccr-data:/data claude-code-router:local", + "test": "node build/test.mjs && node build/run-tests.mjs", + "test:docker": "node tests/docker/docker-smoke.mjs", + "test:e2e": "npm run build:assets && playwright test", + "test:e2e:install": "playwright install chromium", + "test:main": "node build/test.mjs main && node build/run-tests.mjs main", + "test:renderer": "node build/test.mjs renderer && node build/run-tests.mjs renderer", + "typecheck": "tsc --noEmit", + "rebuild:sqlite3": "electron-rebuild -f -w better-sqlite3" + }, + "dependencies": { + "@the-next-ai/ai-gateway": "^1.0.7", + "@the-next-ai/bot-gateway-sdk": "^0.1.0", + "better-sqlite3": "^12.11.1", + "electron-updater": "^6.8.9", + "node-forge": "^1.4.0", + "openai": "^6.27.0", + "undici": "^7.27.2" + }, + "devDependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@playwright/test": "^1.61.1", + "@tailwindcss/cli": "^4.3.0", + "@types/better-sqlite3": "^7.6.13", + "@types/node": "^22.10.2", + "@types/node-forge": "^1.3.14", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "baseui": "^16.1.1", + "clsx": "^2.1.1", + "electron": "^42.3.3", + "electron-builder": "^26.8.1", + "esbuild": "^0.27.7", + "lucide-react": "^1.17.0", + "motion": "^12.40.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "recharts": "^3.8.1", + "styletron-engine-atomic": "^1.6.2", + "styletron-react": "^6.1.1", + "tailwind-merge": "^3.6.0", + "tailwindcss": "^4.3.0", + "typescript": "^5.9.3" + }, + "overrides": { + "@types/react": "$@types/react" + } +} diff --git a/packages/cli/LICENSE b/packages/cli/LICENSE new file mode 100644 index 0000000..ea7e8ac --- /dev/null +++ b/packages/cli/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 musistudio + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/cli/README.md b/packages/cli/README.md new file mode 100644 index 0000000..17dc66b --- /dev/null +++ b/packages/cli/README.md @@ -0,0 +1,375 @@ +

Claude Code Router Desktop

+ +

+ Chinese README + Discord + X + License + Documentation +

+ +
+ + + + + + + + +
+ + Kimi K2.7 Code sponsor banner + +
+ + Kimi Code Subscription +  ·  + API Global +  ·  + API China + +
+

+ Thanks to Kimi for sponsoring this project! Kimi K2.7 Code is an open-source, coding-focused agentic model developed by Moonshot AI, with substantial gains on real-world long-horizon coding tasks and higher end-to-end success across complex software engineering workflows. It also cuts thinking-token usage by approximately 30% compared with K2.6. Inside CCR, Kimi ships as built-in provider presets: import the pay-as-you-go API or the Kimi Code subscription in one click and route your coding agent's requests to Kimi, the subscription endpoint passes straight through natively with no protocol conversion, API endpoints are adapted automatically, and your balance and subscription usage show up right in the CCR dashboard. +

+

+ CCR already supports Kimi. Visit the Kimi Open Platform (中文站 | Global) to try the API, or explore the cost-effective Coding Plan. +

+
+ +
+ +Claude Code Router Desktop is a local gateway and desktop control panel for routing agent requests from Claude Code, Codex, ZCode, and compatible clients to the model provider you actually want to use. + +

+ Claude Code Router Desktop screenshot +

+ +## Why Use CCR + +- Use one local endpoint for multiple agent tools instead of configuring every client separately. +- Route requests with default routing, conditional rules, fallback targets, and request rewrites instead of editing client configuration by hand. +- Mix providers without changing your workflow. CCR supports OpenAI-compatible APIs, Anthropic Messages, Gemini Generate Content, OpenRouter, DeepSeek, SiliconFlow, Moonshot, Kimi Code, Mistral, Z.AI, Bailian, and custom providers. +- Control cost and reliability with fallback routing, API key rotation, usage statistics, and request logs. + +## Features + +- **Overview dashboard**: inspect system status, usage widgets, account balances, model distribution, and share cards. +- **Provider management**: add provider presets or custom endpoints, probe protocol support, test model connectivity, manage credentials, and monitor supported account balances where available. +- **Routing rules**: configure default routing, conditional and model-prefix rules, fallback handling, and request rewrites. +- **Agent Config**: configure Claude Code, Codex, and ZCode launch entries, models, scopes, and multi-instance app profiles. +- **Gateway compatibility**: translate supported client requests through the local CCR model gateway. +- **Proxy mode**: capture supported API traffic through a local proxy with optional system proxy integration and network capture. +- **Fusion models**: combine a base model with vision, web search, or MCP tools into a reusable selectable model. + +## Documentation + +Read the full documentation at [ccrdesk.top](https://ccrdesk.top/). + +## Download And Install + +1. Open the [GitHub Releases page](https://github.com/musistudio/claude-code-router/releases). +2. Download the package for your platform: + - macOS Apple Silicon: `Claude-Code-Router_-mac-Apple-Silicon-arm64.dmg` or `.zip` + - macOS Intel: `Claude-Code-Router_-mac-Intel-x64.dmg` or `.zip` + - Windows: `Claude Code Router_.exe` + - Linux: `Claude Code Router_.AppImage` +3. Install and launch **Claude Code Router**. +4. On first launch, CCR creates its local configuration database: + - macOS/Linux: `~/.claude-code-router/config.sqlite` + - Windows: `%APPDATA%\Claude Code Router\config.sqlite` + +CCR stores runtime configuration in SQLite. A legacy `config.json` is read only once for migration when no SQLite config exists. + +After the service is started from the **Server** page, CCR listens on `http://localhost:8080` by default. The **Server** page controls the gateway `Host`, `Port`, proxy mode, system proxy, network capture, and CA certificate status. + +## Quick Start + +CCR can be configured entirely from the desktop UI. Use this setup order for a clean first run. + +### 1. Add a provider + +Open **Providers**, click **Add Provider**, then choose a built-in preset or **Other / custom API endpoint**. Fill in the provider name, base URL, protocol, API key, and model list. Run protocol probing and model connectivity checks when available, then save the provider. + +### 2. Configure routing + +Open **Routing** to add conditional rules, configure request rewrites, and set fallback behavior. + +Use **Add Routing Rule** for request conditions, model-prefix routing, or rule-level fallback targets. + +### 3. Start the gateway + +Open **Server** and click **Start**. After the page shows Running, CCR listens on `http://localhost:8080`. Enable **Auto start** if you want CCR to start the local gateway whenever the desktop app opens. + +### 4. Connect your agent tool + +Open **Agent Config** and choose the client you want to use. Configure Claude Code, Codex, or ZCode, select the target model and effect scope, then apply the config. For app entries, use the **Open Agent** action to open the target app through CCR. + +### 5. Monitor and adjust + +Use **Settings → Logs & Observability** to enable request logs and agent observability. Use **Logs** to confirm `request model`, `resolved provider`, `resolved model`, status, tokens, latency, and errors; use the tray window for quick token and account status. + +## Acknowledgements + +Codex support is powered by [musistudio/codexl](https://github.com/musistudio/codexl). + +## Support & Sponsoring + +
+ +

If you find this project helpful, please consider sponsoring its development. Your support is greatly appreciated.

+ + + + + + +
+ + Support on Ko-fi + +
+ One-time support via Ko-fi +
+ + Sponsor with PayPal + +
+ International sponsorship +
+ + + + + + +
+ Alipay +
+ Alipay QR code +
+ WeChat Pay +
+ WeChat Pay QR code +
+ +
+ +### Our Sponsors + +
+ +

A huge thank you to all our sponsors for their generous support.

+ + + + + + + + + + + + + + +
+ + Zhipu icon +
+ Z智谱 +
+
+ + AIHubmix icon +
+ AIHubmix +
+
+ + BurnCloud icon +
+ BurnCloud +
+
+ + 302.AI icon +
+ 302.AI +
+
+ + RunAPI icon +
+ RunAPI +
+
+ + TeamoRouter icon +
+ TeamoRouter +
+
+ + Qiniu Cloud AI icon +
+ Qiniu Cloud AI +
+
+ + Fenno.ai icon +
+ Fenno.ai +
+
+ +

Community Sponsors

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
@Simon Leischnig@duanshuaimin@vrgitadmin@*o@ceilwoo@*说
@*更@K*g@R*R@bobleer@*苗@*划
@Clarence-pan@carter003@S*r@*晖@*敏@Z*z
@*然@cluic@*苗@PromptExpert@*应@yusnake
@*飞@董*@*汀@*涯@*:-)@**磊
@*琢@*成@Z*o@*琨@congzhangzh@*_
@Z*m@*鑫@c*y@*昕@witsice@b*g
@*亿@*辉@JACK@*光@W*l@kesku
@biguncle@二吉吉@a*g@*林@*咸@*明
@S*y@f*o@*智@F*t@r*c@qierkang
@*军@snrise-z@*王@greatheart1000@*王@zcutlip
@Peng-YM@*更@*.@F*t@*政@*铭
@*叶@七*o@*青@**晨@*远@*霄
@**吉@**飞@**驰@x*g@**东@*落
@哆*k@*涛@苗大@*呢@d*u@crizcraig
s*s*火*勤**锟*涛**明
*知*语*瓜
+ +If your name is masked, please contact me via my homepage email to update it with your GitHub username. + +
+ +## License + +This project is licensed under the [MIT License](LICENSE). diff --git a/packages/cli/README_zh.md b/packages/cli/README_zh.md new file mode 100644 index 0000000..58c4fef --- /dev/null +++ b/packages/cli/README_zh.md @@ -0,0 +1,374 @@ +

Claude Code Router Desktop

+ +

+ English README + Discord + X + License + 文档 +

+ +
+ + + + + + + + +
+ + Kimi K2.7 Code 赞助横幅 + +
+ + Kimi Code 订阅 +  ·  + API 中文站 +  ·  + API Global + +
+

+ 感谢 Kimi 赞助本项目!Kimi K2.7 Code 是 Moonshot AI 推出的编程专用开源智能体模型,在真实长程编程与复杂软件工程工作流中显著提升端到端任务成功率,同时优化推理效率,相比 K2.6 平均减少约 30% 的推理 token 消耗。在 CCR 中,Kimi 已作为内置供应商预设开箱即用:无论按量付费 API 还是 Kimi Code 订阅,一键导入即可把你的编程 Agent 请求路由到 Kimi,订阅端点原生直通、无需协议转换,API 端点自动适配,账户余额与订阅用量也能直接在 CCR 面板中查看。 +

+

+ CCR 已内置 Kimi 供应商预设。前往 Kimi 开放平台(中文站Global)体验 API,或了解高性价比 Coding Plan 套餐。 +

+
+ +
+ +Claude Code Router Desktop 是一个本地网关和桌面控制台,用来把 Claude Code、Codex、ZCode 以及兼容客户端的 Agent 请求路由到你真正想使用的模型服务。 + +

+ Claude Code Router Desktop 项目截图 +

+ +## 为什么使用 CCR + +- 用一个本地入口连接多个 Agent 工具,不需要在每个客户端里重复配置 Provider。 +- 在不改变工作流的情况下混用不同 Provider。CCR 支持 OpenAI 兼容 API、Anthropic Messages、Gemini Generate Content、OpenRouter、DeepSeek、SiliconFlow、Moonshot、Kimi Code、Mistral、Z.AI、百炼以及自定义 Provider。 +- 通过 fallback 路由、API Key 轮换、用量统计和请求日志来控制成本和可靠性。 + +## 功能和特性 + +- **概览仪表盘**:查看系统状态、用量组件、账号余额、模型分布和分享卡片。 +- **Provider 管理**:添加预设或自定义端点,探测协议支持,检测模型连通性,管理凭据,并在可用时查看账号余额。 +- **路由规则**:配置条件路由、模型前缀规则、失败降级和请求改写。 +- **Agent配置**:为 Claude Code、Codex 和 ZCode 配置启动入口、模型、作用范围和多开 App 配置。 +- **网关兼容层**:通过本地 CCR 模型网关转换支持的客户端请求。 +- **代理模式**:通过本地代理捕获支持的 API 流量,可选系统代理和网络捕获。 +- **Fusion 组合模型**:把基础模型与视觉、联网搜索或 MCP 工具组合成新的可选模型。 + +## 文档 + +完整文档见 [ccrdesk.top](https://ccrdesk.top/)。 + +## 下载和安装 + +1. 打开 [GitHub Releases 页面](https://github.com/musistudio/claude-code-router/releases)。 +2. 按系统下载对应安装包: + - macOS Apple 芯片:`Claude-Code-Router_-mac-Apple-Silicon-arm64.dmg` 或 `.zip` + - macOS Intel 芯片:`Claude-Code-Router_-mac-Intel-x64.dmg` 或 `.zip` + - Windows:`Claude Code Router_.exe` + - Linux:`Claude Code Router_.AppImage` +3. 安装并启动 **Claude Code Router**。 +4. 首次启动后,CCR 会创建本地配置数据库: + - macOS/Linux:`~/.claude-code-router/config.sqlite` + - Windows:`%APPDATA%\Claude Code Router\config.sqlite` + +CCR 的运行配置存储在 SQLite 中。旧版 `config.json` 只会在没有 SQLite 配置时作为迁移来源读取一次。 + +从 **服务** 页面启动后,CCR 默认监听 `http://localhost:8080`。**服务** 页面负责配置网关 `Host`、`Port`、代理模式、系统代理、网络捕获和 CA 证书状态。 + +## 快速开始 + +CCR 可以完全通过桌面 UI 完成配置。首次使用建议按下面顺序操作。 + +### 1. 添加 Provider + +打开 **供应商**,点击 **添加供应商**,选择内置预设或 **其他 / 自定义 API 端点**。按表单填写 Provider 名称、基础 URL、协议、API Key 和模型列表。可用时先运行协议探测和模型连通性检查,然后保存 Provider。 + +### 2. 设置路由 + +打开 **路由**,添加条件规则,配置请求改写和失败降级。 + +如果需要更细粒度控制,使用 **添加路由规则** 添加模型前缀、请求条件或规则级失败降级目标。 + +### 3. 启动网关 + +打开 **服务**,点击 **启动**。页面显示运行中后,CCR 会在本机监听 `http://localhost:8080`。如果希望每次打开桌面应用时自动启动网关,可以启用自动启动。 + +### 4. 连接 Agent 工具 + +打开 **Agent配置**,选择要使用的客户端。配置 Claude Code、Codex 或 ZCode,选择目标模型和作用范围,然后应用配置。对于 App 入口,可以使用 **打开 Agent** 操作通过 CCR 打开目标应用。 + +### 5. 日常查看和调整 + +到 **设置 → 日志与观测** 打开请求日志和 Agent 观测。使用 **日志** 确认 `request model`、`resolved provider`、`resolved model`、状态码、tokens、耗时和错误;使用托盘窗口快速查看 Token 和账号状态。 + +## 致谢 + +对 Codex 的支持来自于 [musistudio/codexl](https://github.com/musistudio/codexl) 这个项目。 + +## 支持与赞助 + +
+ +

如果你觉得这个项目有帮助,欢迎赞助项目开发。非常感谢你的支持。

+ + + + + + +
+ + 通过 Ko-fi 赞助 + +
+ 通过 Ko-fi 单次赞助 +
+ + 通过 PayPal 赞助 + +
+ 国际赞助通道 +
+ + + + + + +
+ 支付宝 +
+ 支付宝收款码 +
+ 微信支付 +
+ 微信支付收款码 +
+ +
+ +### 我们的赞助商 + +
+ +

非常感谢所有赞助商的慷慨支持。

+ + + + + + + + + + + + + + +
+ + 智谱图标 +
+ Z智谱 +
+
+ + AIHubmix 图标 +
+ AIHubmix +
+
+ + BurnCloud 图标 +
+ BurnCloud +
+
+ + 302.AI 图标 +
+ 302.AI +
+
+ + RunAPI 图标 +
+ RunAPI +
+
+ + TeamoRouter 图标 +
+ TeamoRouter +
+
+ + 七牛云 AI 图标 +
+ 七牛云 AI +
+
+ + Fenno.ai 图标 +
+ Fenno.ai +
+
+ +

社区赞助者

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
@Simon Leischnig@duanshuaimin@vrgitadmin@*o@ceilwoo@*说
@*更@K*g@R*R@bobleer@*苗@*划
@Clarence-pan@carter003@S*r@*晖@*敏@Z*z
@*然@cluic@*苗@PromptExpert@*应@yusnake
@*飞@董*@*汀@*涯@*:-)@**磊
@*琢@*成@Z*o@*琨@congzhangzh@*_
@Z*m@*鑫@c*y@*昕@witsice@b*g
@*亿@*辉@JACK@*光@W*l@kesku
@biguncle@二吉吉@a*g@*林@*咸@*明
@S*y@f*o@*智@F*t@r*c@qierkang
@*军@snrise-z@*王@greatheart1000@*王@zcutlip
@Peng-YM@*更@*.@F*t@*政@*铭
@*叶@七*o@*青@**晨@*远@*霄
@**吉@**飞@**驰@x*g@**东@*落
@哆*k@*涛@苗大@*呢@d*u@crizcraig
s*s*火*勤**锟*涛**明
*知*语*瓜
+ +如果你的名字被打码,请通过我的主页邮箱联系我更新为 GitHub 用户名。 + +
+ +## 许可证 + +本项目基于 [MIT License](LICENSE) 发布。 diff --git a/packages/cli/package.json b/packages/cli/package.json new file mode 100644 index 0000000..ef8d921 --- /dev/null +++ b/packages/cli/package.json @@ -0,0 +1,48 @@ +{ + "name": "@musistudio/claude-code-router", + "version": "3.0.3", + "license": "MIT", + "description": "Local Claude Code Router gateway with CLI and web management UI.", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/musistudio/claude-code-router.git" + }, + "bugs": { + "url": "https://github.com/musistudio/claude-code-router/issues" + }, + "homepage": "https://github.com/musistudio/claude-code-router#readme", + "keywords": [ + "claude-code", + "codex", + "llm", + "gateway", + "router" + ], + "main": "dist/main/cli.js", + "bin": { + "ccr": "dist/main/cli.js" + }, + "files": [ + "dist", + "LICENSE", + "README.md", + "README_zh.md" + ], + "engines": { + "node": ">=22" + }, + "publishConfig": { + "access": "public" + }, + "scripts": { + "prepack": "npm --prefix ../.. run build:assets", + "prepublishOnly": "npm --prefix ../.. run typecheck" + }, + "dependencies": { + "@the-next-ai/ai-gateway": "^1.0.4", + "@the-next-ai/bot-gateway-sdk": "^0.1.0", + "better-sqlite3": "^12.11.1", + "node-forge": "^1.4.0", + "undici": "^7.27.2" + } +} diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts new file mode 100644 index 0000000..cb1867c --- /dev/null +++ b/packages/cli/src/cli.ts @@ -0,0 +1,800 @@ +#!/usr/bin/env node +import { spawn } from "node:child_process"; +import { randomBytes } from "node:crypto"; +import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs"; +import path from "node:path"; +import { botGatewayProfileEnv } from "@ccr/core/agents/bot-gateway/env"; +import { applyClaudeAppGatewayConfig } from "@ccr/core/agents/claude-app/gateway-service"; +import { launchClaudeAppProfile, resolveClaudeAppProfileUserDataDir } from "@ccr/core/agents/claude-app/launch"; +import { codexDesktopAppName, launchCodexAppProfile, launchZcodeAppProfile } from "@ccr/core/agents/codex/app-launch"; +import { loadAppConfig } from "@ccr/core/config/config"; +import { CONFIGDIR } from "@ccr/core/config/constants"; +import { applyProfileConfig, applyProfileRuntimeConfig } from "@ccr/core/profiles/service"; +import { ensureProfileGateway } from "@ccr/core/profiles/launch-service"; +import { buildProfileLaunchPlan, defaultProfileOpenSurface, findProfileForOpen, profileLaunchSpawnCommand, resolveProfileOpenSurface } from "@ccr/core/profiles/launch-core"; +import { openSystemExternal, startWebManagementServer } from "@ccr/core/web/management-server"; +import { assertAvailableGatewayModels, type ProfileConfig, type ProfileOpenSurface } from "@ccr/core/contracts/app"; + +type ProfileCliOptions = { + agentArgs: string[]; + command: "profile"; + help: boolean; + profileRef: string; + surface?: ProfileOpenSurface; +}; + +type WebCliOptions = { + command: "start" | "ui" | "web"; + daemonChild: boolean; + help: boolean; + host?: string; + open: boolean; + port?: number; + startGateway: boolean; +}; + +type StopCliOptions = { + command: "stop"; + help: boolean; +}; + +type CliOptions = ProfileCliOptions | StopCliOptions | WebCliOptions; + +type ServiceState = { + host?: string; + pid: number; + serviceToken?: string; + startedAt: string; + startGateway: boolean; + url: string; +}; + +const serviceStateFileName = "service.json"; +const serviceInstanceTokenEnv = "CCR_SERVICE_INSTANCE_TOKEN"; +const serviceRpcTimeoutMs = 2_000; +const serviceStartTimeoutMs = 30_000; +const serviceStopTimeoutMs = 10_000; +const webAuthHeader = "x-ccr-web-auth"; +const webAuthQueryParam = "ccr_web_token"; +const defaultCliCommandName = "ccr"; +const prepareProfileOnlyEnv = "CCR_CLI_PREPARE_PROFILE_ONLY"; + +async function main(): Promise { + const options = parseArgs(process.argv.slice(2)); + if (options.command === "start") { + if (options.help) { + printStartHelp(0); + return; + } + await startService(options); + return; + } + if (options.command === "ui") { + if (options.help) { + printUiHelp(0); + return; + } + await openManagementUi(options); + return; + } + if (options.command === "stop") { + if (options.help) { + printStopHelp(0); + return; + } + await stopService(); + return; + } + if (options.command === "web") { + if (options.help) { + printWebHelp(0); + return; + } + await runWebServer(options); + return; + } + + const profileOptions = options as ProfileCliOptions; + if (profileOptions.help || !profileOptions.profileRef) { + printHelp(profileOptions.help ? 0 : 2); + return; + } + + const configDir = CONFIGDIR; + const config = await loadAppConfig(); + assertAvailableGatewayModels(config); + await applyProfileConfig(config); + const profile = findProfileForOpen(config, profileOptions.profileRef); + const surface = profileOptions.surface ?? defaultProfileOpenSurface(profile); + const resolvedSurface = resolveProfileOpenSurface(profile, surface); + if (profile.agent === "zcode" && profileOptions.agentArgs.length > 0) { + throw new Error("ZCode profiles can only open the app; agent arguments are not supported."); + } + if (profile.agent === "claude-code" && resolvedSurface === "app" && profileOptions.agentArgs.length > 0) { + throw new Error("Claude App profiles do not support agent arguments."); + } + + const launchConfig = await ensureProfileGateway(config, profile, resolvedSurface === "app" ? profileAppName(profile) : profile.name || profile.id || "profile", { + reuseExisting: true, + startIfMissing: false + }); + if (resolvedSurface === "cli") { + const runtimeResult = applyProfileRuntimeConfig(launchConfig, profile, launchConfig.APIKEY); + if (!runtimeResult.ok) { + throw new Error(runtimeResult.message); + } + } + if (resolvedSurface === "cli" && process.env[prepareProfileOnlyEnv] === "1") { + return; + } + if (profile.agent === "claude-code" && resolvedSurface === "app") { + applyClaudeAppGatewayConfig(launchConfig); + applyClaudeAppGatewayConfig(launchConfig, { + backup: false, + dataDir: resolveClaudeAppProfileUserDataDir(configDir, profile), + refreshModelDiscoveryCache: true + }); + const launch = await launchClaudeAppProfile(configDir, profile, launchConfig); + const spawnError = await waitForImmediateSpawnError(launch.child, 500); + if (spawnError) { + throw new Error(`Failed to open Claude App: ${spawnError}`); + } + process.stdout.write(`Opened Claude App with ${profile.name || profile.id}.\n`); + return; + } + if ((profile.agent === "codex" || profile.agent === "zcode") && resolvedSurface === "app" && profileOptions.agentArgs.length === 0) { + if (profile.agent === "zcode") { + const launch = launchZcodeAppProfile(configDir, profile, launchConfig); + const spawnError = await waitForImmediateSpawnError(launch.child, 500); + if (spawnError) { + throw new Error(`Failed to open ZCode App: ${spawnError}`); + } + process.stdout.write(`Opened ZCode App with ${profile.name || profile.id}.\n`); + } else { + const launch = launchCodexAppProfile(configDir, profile, launchConfig); + const spawnError = await waitForImmediateSpawnError(launch.child, 500); + if (spawnError) { + throw new Error(`Failed to open ${codexDesktopAppName}: ${spawnError}`); + } + process.stdout.write(`Opened ${codexDesktopAppName} with ${profile.name || profile.id}.\n`); + } + return; + } + + const plan = buildProfileLaunchPlan(configDir, profile, resolvedSurface, profileOptions.agentArgs); + + if (path.isAbsolute(plan.command) && !existsSync(plan.command)) { + throw new Error(`Profile launcher was not found: ${plan.command}. Open CCR once or re-save the profile.`); + } + + const childEnv = { + ...process.env, + ...plan.env, + ...botGatewayProfileEnv(launchConfig, profile, resolvedSurface) + }; + delete childEnv.ELECTRON_RUN_AS_NODE; + + const launch = profileLaunchSpawnCommand(plan); + const child = spawn(launch.command, launch.args, { + env: childEnv, + stdio: "inherit", + windowsVerbatimArguments: !!launch.windowsVerbatimArguments + }); + const code = await waitForChild(child); + process.exitCode = code; +} + +function parseArgs(args: string[]): CliOptions { + if (args[0] === "start") { + return parseWebArgs(args.slice(1), "start"); + } + if (args[0] === "ui") { + return parseWebArgs(args.slice(1), "ui", true); + } + if (args[0] === "stop") { + return parseStopArgs(args.slice(1)); + } + if (args[0] === "serve" || args[0] === "web") { + return parseWebArgs(args.slice(1), "web"); + } + + const options: ProfileCliOptions = { + agentArgs: [], + command: "profile", + help: false, + profileRef: "" + }; + for (let index = 0; index < args.length; index += 1) { + const arg = args[index]; + if (arg === "--") { + options.agentArgs.push(...args.slice(index + 1)); + break; + } + if (arg === "--help" || arg === "-h") { + options.help = true; + continue; + } + if (arg === "--app") { + options.surface = "app"; + continue; + } + if (arg === "--cli") { + options.surface = "cli"; + continue; + } + if (options.profileRef && !options.surface && (arg === "cli" || arg === "app")) { + options.surface = arg; + continue; + } + if (!options.profileRef) { + options.profileRef = arg; + continue; + } + options.agentArgs.push(arg); + } + return options; +} + +function profileAppName(profile: Pick): string { + if (profile.agent === "claude-code") { + return "Claude App"; + } + if (profile.agent === "zcode") { + return "ZCode App"; + } + return codexDesktopAppName; +} + +function parseStopArgs(args: string[]): StopCliOptions { + const options: StopCliOptions = { + command: "stop", + help: false + }; + for (const arg of args) { + if (arg === "--help" || arg === "-h") { + options.help = true; + continue; + } + throw new Error(`Unknown stop option: ${arg}`); + } + return options; +} + +function parseWebArgs(args: string[], command: WebCliOptions["command"], defaultOpen = false): WebCliOptions { + const options: WebCliOptions = { + command, + daemonChild: false, + help: false, + open: defaultOpen, + startGateway: true + }; + for (let index = 0; index < args.length; index += 1) { + const arg = args[index]; + if (arg === "--help" || arg === "-h") { + options.help = true; + continue; + } + if (arg === "--open") { + options.open = true; + continue; + } + if (arg === "--no-open") { + options.open = false; + continue; + } + if (arg === "--gateway") { + options.startGateway = true; + continue; + } + if (arg === "--no-gateway") { + options.startGateway = false; + continue; + } + if (arg === "--daemon-child") { + options.daemonChild = true; + continue; + } + if (arg === "--host") { + index += 1; + options.host = requiredArg(args[index], "--host"); + continue; + } + if (arg.startsWith("--host=")) { + options.host = requiredArg(arg.slice("--host=".length), "--host"); + continue; + } + if (arg === "--port") { + index += 1; + options.port = parsePort(requiredArg(args[index], "--port")); + continue; + } + if (arg.startsWith("--port=")) { + options.port = parsePort(requiredArg(arg.slice("--port=".length), "--port")); + continue; + } + throw new Error(`Unknown web option: ${arg}`); + } + return options; +} + +async function startService(options: WebCliOptions): Promise { + const current = readServiceState(); + const currentVerification = current ? await verifyServiceState(current) : undefined; + if (current && currentVerification?.ok) { + process.stdout.write(`CCR service is already running at ${current.url} (pid ${current.pid}).\n`); + if (options.open) { + await openManagementUrl(current.url); + } + return; + } + if (current) { + clearServiceState(current.pid); + } + + const serviceToken = generateServiceToken(); + const childArgs = [ + currentCliScript(), + "serve", + "--daemon-child", + ...(options.host ? ["--host", options.host] : []), + ...(options.port ? ["--port", String(options.port)] : []), + "--no-open", + ...(options.startGateway ? [] : ["--no-gateway"]) + ]; + const child = spawn(process.execPath, childArgs, { + detached: true, + env: serviceChildEnv(serviceToken), + stdio: "ignore", + windowsHide: true + }); + const spawnError = await waitForImmediateSpawnError(child, 1000); + if (spawnError) { + throw new Error(`Failed to start CCR service: ${spawnError}`); + } + child.unref(); + + const state = await waitForServiceState(child.pid, serviceStartTimeoutMs); + if (!state) { + throw new Error(`CCR service did not report ready within ${serviceStartTimeoutMs}ms.`); + } + process.stdout.write(`CCR service started at ${state.url} (pid ${state.pid}).\n`); + if (options.open) { + await openManagementUrl(state.url); + } +} + +async function openManagementUi(options: WebCliOptions): Promise { + await startService({ + ...options, + command: "start" + }); +} + +async function openManagementUrl(url: string): Promise { + try { + await openSystemExternal(url); + process.stdout.write(`Opened CCR management UI at ${url}\n`); + } catch (error) { + process.stderr.write(`Failed to open browser: ${formatError(error)}\n`); + process.stdout.write(`CCR management UI is available at ${url}\n`); + } +} + +function serviceChildEnv(serviceToken: string): NodeJS.ProcessEnv { + const env = { ...process.env }; + env[serviceInstanceTokenEnv] = serviceToken; + if (process.versions.electron) { + env.ELECTRON_RUN_AS_NODE = "1"; + } else { + delete env.ELECTRON_RUN_AS_NODE; + } + return env; +} + +async function runWebServer(options: WebCliOptions): Promise { + const runtime = await startWebManagementServer({ + host: options.host, + open: options.open, + port: options.port, + startGateway: options.startGateway + }); + if (options.daemonChild) { + const serviceToken = process.env[serviceInstanceTokenEnv]?.trim() || undefined; + writeServiceState({ + host: options.host, + pid: process.pid, + ...(serviceToken ? { serviceToken } : {}), + startedAt: new Date().toISOString(), + startGateway: options.startGateway, + url: runtime.url + }); + } + process.stdout.write(`CCR web management is running at ${runtime.url}\n`); + + let closing = false; + const shutdown = (signal: NodeJS.Signals) => { + if (closing) { + return; + } + closing = true; + void runtime.close().finally(() => { + if (options.daemonChild) { + clearServiceState(process.pid); + } + process.exit(signal === "SIGINT" ? 130 : 143); + }); + }; + process.once("SIGINT", shutdown); + process.once("SIGTERM", shutdown); + await new Promise(() => undefined); +} + +async function stopService(): Promise { + const state = readServiceState(); + if (!state) { + process.stdout.write("CCR service is not running.\n"); + return; + } + const verification = await verifyServiceState(state); + if (!verification.ok) { + clearServiceState(state.pid); + process.stdout.write("CCR service is not running.\n"); + return; + } + + await callServiceRpc(state, "quitApp"); + const stopped = verification.trustedPid + ? await waitForProcessExit(state.pid, serviceStopTimeoutMs) + : await waitForServiceUnavailable(state, serviceStopTimeoutMs); + if (!stopped) { + throw new Error(`CCR service did not stop within ${serviceStopTimeoutMs}ms.`); + } + clearServiceState(state.pid); + process.stdout.write("CCR service stopped.\n"); +} + +function printHelp(exitCode: number): void { + const command = cliCommandName(); + const output = [ + "Usage:", + ` ${command} start [--host ] [--port ] [--open] [--no-gateway]`, + ` ${command} ui [--host ] [--port ] [--no-gateway]`, + ` ${command} stop`, + ` ${command} [cli|app] [-- ]`, + "", + "Examples:", + ` ${command} start`, + ` ${command} ui`, + ` ${command} stop`, + ` ${command} Codex`, + ` ${command} default-codex -- --model gpt-5-codex`, + ` ${command} default-codex app` + ].join("\n"); + const stream = exitCode === 0 ? process.stdout : process.stderr; + stream.write(`${output}\n`); + process.exitCode = exitCode; +} + +function printStartHelp(exitCode: number): void { + const command = cliCommandName(); + const output = [ + "Usage:", + ` ${command} start [--host ] [--port ] [--open] [--no-gateway]`, + "", + "Options:", + " --host Management server host. Defaults to 127.0.0.1.", + " --port Management server port. Defaults to 3458.", + " --open Open the management page in the default browser.", + " --no-open Do not open the management page.", + " --no-gateway Start only the web management server.", + "", + "Environment:", + " CCR_WEB_AUTH_TOKEN Use this token for management UI and RPC authentication." + ].join("\n"); + const stream = exitCode === 0 ? process.stdout : process.stderr; + stream.write(`${output}\n`); + process.exitCode = exitCode; +} + +function printUiHelp(exitCode: number): void { + const command = cliCommandName(); + const output = [ + "Usage:", + ` ${command} ui [--host ] [--port ] [--no-gateway]`, + "", + "Starts the background CCR service if needed and opens the management UI in the default browser.", + "", + "Options:", + " --host Management server host. Defaults to 127.0.0.1.", + " --port Management server port. Defaults to 3458.", + " --no-open Start or find the service and print the management URL without opening a browser.", + " --no-gateway Start only the web management server when the service is not already running.", + "", + "Environment:", + " CCR_WEB_AUTH_TOKEN Use this token for management UI and RPC authentication." + ].join("\n"); + const stream = exitCode === 0 ? process.stdout : process.stderr; + stream.write(`${output}\n`); + process.exitCode = exitCode; +} + +function printStopHelp(exitCode: number): void { + const command = cliCommandName(); + const output = [ + "Usage:", + ` ${command} stop`, + "", + `Stops the background CCR service started by \`${command} start\`.` + ].join("\n"); + const stream = exitCode === 0 ? process.stdout : process.stderr; + stream.write(`${output}\n`); + process.exitCode = exitCode; +} + +function printWebHelp(exitCode: number): void { + const command = cliCommandName(); + const output = [ + "Usage:", + ` ${command} serve [--host ] [--port ] [--open] [--no-gateway]`, + "", + "Options:", + " --host Management server host. Defaults to 127.0.0.1.", + " --port Management server port. Defaults to 3458.", + " --open Open the management page in the default browser.", + " --no-gateway Start only the web management server.", + "", + "Environment:", + " CCR_WEB_AUTH_TOKEN Use this token for management UI and RPC authentication." + ].join("\n"); + const stream = exitCode === 0 ? process.stdout : process.stderr; + stream.write(`${output}\n`); + process.exitCode = exitCode; +} + +function cliCommandName(): string { + const configured = process.env.CCR_CLI_COMMAND_NAME?.trim(); + return configured && /^[A-Za-z0-9._-]+$/.test(configured) + ? configured + : defaultCliCommandName; +} + +function readServiceState(): ServiceState | undefined { + const file = serviceStateFile(); + if (!existsSync(file)) { + return undefined; + } + try { + const parsed = JSON.parse(readFileSync(file, "utf8")) as Partial; + const pid = Number(parsed.pid); + if (!Number.isInteger(pid) || pid <= 0 || typeof parsed.url !== "string") { + return undefined; + } + return { + host: parsed.host, + pid, + serviceToken: typeof parsed.serviceToken === "string" && parsed.serviceToken.trim() ? parsed.serviceToken.trim() : undefined, + startedAt: parsed.startedAt || "", + startGateway: parsed.startGateway !== false, + url: parsed.url + }; + } catch { + return undefined; + } +} + +function writeServiceState(state: ServiceState): void { + const file = serviceStateFile(); + mkdirSync(path.dirname(file), { recursive: true }); + writeFileSync(file, `${JSON.stringify(state, null, 2)}\n`, { encoding: "utf8", mode: 0o600 }); +} + +function clearServiceState(pid?: number): void { + const state = readServiceState(); + if (pid !== undefined && state && state.pid !== pid) { + return; + } + try { + unlinkSync(serviceStateFile()); + } catch { + // Stale state cleanup is best effort. + } +} + +function serviceStateFile(): string { + return path.join(CONFIGDIR, serviceStateFileName); +} + +function currentCliScript(): string { + return __filename; +} + +async function waitForServiceState(pid: number | undefined, timeoutMs: number): Promise { + const startedAt = Date.now(); + while (Date.now() - startedAt < timeoutMs) { + const state = readServiceState(); + if (state && (!pid || state.pid === pid) && (await verifyServiceState(state)).ok) { + return state; + } + await delay(150); + } + return undefined; +} + +async function waitForProcessExit(pid: number, timeoutMs: number): Promise { + const startedAt = Date.now(); + while (Date.now() - startedAt < timeoutMs) { + if (!isProcessRunning(pid)) { + return true; + } + await delay(150); + } + return !isProcessRunning(pid); +} + +function isProcessRunning(pid: number | undefined): boolean { + if (!pid || pid <= 0) { + return false; + } + try { + process.kill(pid, 0); + return true; + } catch (error) { + const code = typeof error === "object" && error !== null && "code" in error ? (error as { code?: unknown }).code : undefined; + return code === "EPERM"; + } +} + +type ServiceStateVerification = + | { ok: true; trustedPid: boolean } + | { ok: false }; + +type ServiceIdentity = { + pid?: unknown; + serviceTokenConfigured?: unknown; + serviceTokenMatches?: unknown; +}; + +async function verifyServiceState(state: ServiceState): Promise { + if (!isProcessRunning(state.pid)) { + return { ok: false }; + } + + if (state.serviceToken) { + const identity = await callServiceRpc(state, "getServiceIdentity", [state.serviceToken]).catch(() => undefined); + if (identity?.serviceTokenMatches === true && Number(identity.pid) === state.pid) { + return { ok: true, trustedPid: true }; + } + return { ok: false }; + } + + const appInfo = await callServiceRpc<{ name?: unknown }>(state, "getAppInfo").catch(() => undefined); + return appInfo?.name === "Claude Code Router" + ? { ok: true, trustedPid: false } + : { ok: false }; +} + +async function waitForServiceUnavailable(state: ServiceState, timeoutMs: number): Promise { + const startedAt = Date.now(); + while (Date.now() - startedAt < timeoutMs) { + const appInfo = await callServiceRpc<{ name?: unknown }>(state, "getAppInfo").catch(() => undefined); + if (appInfo?.name !== "Claude Code Router") { + return true; + } + await delay(150); + } + const appInfo = await callServiceRpc<{ name?: unknown }>(state, "getAppInfo").catch(() => undefined); + return appInfo?.name !== "Claude Code Router"; +} + +async function callServiceRpc(state: ServiceState, method: string, args: unknown[] = []): Promise { + const endpoint = serviceRpcEndpoint(state.url); + const authToken = serviceAuthToken(state.url); + if (!endpoint || !authToken) { + throw new Error("CCR service state does not include a usable management URL."); + } + + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), serviceRpcTimeoutMs); + try { + const response = await fetch(endpoint, { + body: JSON.stringify({ args, method }), + headers: { + "content-type": "application/json", + [webAuthHeader]: authToken + }, + method: "POST", + signal: controller.signal + }); + const payload = await response.json().catch(() => undefined) as { ok?: boolean; value?: T } | undefined; + if (!response.ok || !payload?.ok) { + throw new Error(`CCR service RPC ${method} failed with HTTP ${response.status}`); + } + return payload.value as T; + } finally { + clearTimeout(timer); + } +} + +function serviceRpcEndpoint(url: string): string | undefined { + try { + const parsed = new URL(url); + return `${parsed.origin}/api/ccr/rpc`; + } catch { + return undefined; + } +} + +function serviceAuthToken(url: string): string { + try { + return new URL(url).searchParams.get(webAuthQueryParam)?.trim() ?? ""; + } catch { + return ""; + } +} + +function generateServiceToken(): string { + return randomBytes(32).toString("base64url"); +} + +function delay(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +function requiredArg(value: string | undefined, option: string): string { + if (!value?.trim()) { + throw new Error(`${option} requires a value.`); + } + return value.trim(); +} + +function parsePort(value: string): number { + const port = Number(value); + if (!Number.isInteger(port) || port <= 0 || port > 65535) { + throw new Error(`Invalid port: ${value}`); + } + return port; +} + +function waitForChild(child: ReturnType): Promise { + return new Promise((resolve) => { + child.on("exit", (code, signal) => resolve(code ?? (signal === "SIGINT" ? 130 : 1))); + child.on("error", (error) => { + process.stderr.write(`${formatError(error)}\n`); + resolve(1); + }); + }); +} + +function waitForImmediateSpawnError(child: ReturnType, timeoutMs: number): Promise { + return new Promise((resolve) => { + let settled = false; + let timer: NodeJS.Timeout | undefined; + const finish = (message: string | undefined) => { + if (settled) { + return; + } + settled = true; + if (timer) { + clearTimeout(timer); + } + child.off("error", onError); + child.off("spawn", onSpawn); + resolve(message); + }; + const onError = (error: Error) => finish(formatError(error)); + const onSpawn = () => finish(undefined); + child.once("error", onError); + child.once("spawn", onSpawn); + timer = setTimeout(() => finish(undefined), timeoutMs); + timer.unref?.(); + }); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + +main().catch((error) => { + process.stderr.write(`${formatError(error)}\n`); + process.exitCode = 1; +}); diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json new file mode 100644 index 0000000..1f70006 --- /dev/null +++ b/packages/cli/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "src" + }, + "include": ["src/**/*.ts", "src/**/*.d.ts"] +} diff --git a/packages/core/models.json b/packages/core/models.json new file mode 100644 index 0000000..e6ecf55 --- /dev/null +++ b/packages/core/models.json @@ -0,0 +1,490722 @@ +{ + "schemaVersion": 2, + "generatedAt": "2026-06-20T07:13:41.379Z", + "generatedBy": "scripts/generate-models-json.mjs", + "sources": [ + { + "id": "litellm", + "name": "LiteLLM model prices and context window", + "url": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json" + }, + { + "id": "models.dev", + "name": "models.dev API", + "url": "https://models.dev/api.json" + }, + { + "id": "openrouter", + "name": "OpenRouter models API", + "url": "https://openrouter.ai/api/v1/models" + } + ], + "summary": { + "modelCount": 3619, + "rawProviderModelCount": 7748, + "duplicateProviderModelRecordsMerged": 4129, + "providerCount": 166, + "availabilityProviderCount": 236, + "sourceCounts": { + "models.dev": 2308, + "litellm": 1829, + "openrouter": 340 + }, + "pricingOfferCount": 8033, + "modelsWithPricing": 3428, + "modelsWithoutPricing": 191, + "modelsWith1MContext": 467, + "modelsWithImageInput": 1283, + "modelsWithImageOutput": 168, + "modelsWithAudioInput": 224, + "modelsWithToolCalling": 2097, + "modelsWithReasoning": 1415 + }, + "models": [ + { + "id": "302ai/doubao-seed-1-6-thinking-250715", + "provider": "302ai", + "model": "doubao-seed-1-6-thinking-250715", + "displayName": "doubao-seed-1-6-thinking-250715", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai" + ], + "aliases": [ + "302ai/doubao-seed-1-6-thinking-250715" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "doubao-seed-1-6-thinking-250715", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.121, + "output": 1.21 + } + } + ] + }, + "metadata": { + "displayNames": [ + "doubao-seed-1-6-thinking-250715" + ], + "releaseDate": "2025-07-15", + "lastUpdated": "2025-07-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "doubao-seed-1-6-thinking-250715", + "modelKey": "doubao-seed-1-6-thinking-250715", + "displayName": "doubao-seed-1-6-thinking-250715", + "metadata": { + "lastUpdated": "2025-07-15", + "openWeights": false, + "releaseDate": "2025-07-15" + } + } + ] + }, + { + "id": "302ai/doubao-seed-1-6-vision-250815", + "provider": "302ai", + "model": "doubao-seed-1-6-vision-250815", + "displayName": "doubao-seed-1-6-vision-250815", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai" + ], + "aliases": [ + "302ai/doubao-seed-1-6-vision-250815" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "doubao-seed-1-6-vision-250815", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.114, + "output": 1.143 + } + } + ] + }, + "metadata": { + "displayNames": [ + "doubao-seed-1-6-vision-250815" + ], + "releaseDate": "2025-09-30", + "lastUpdated": "2025-09-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "doubao-seed-1-6-vision-250815", + "modelKey": "doubao-seed-1-6-vision-250815", + "displayName": "doubao-seed-1-6-vision-250815", + "metadata": { + "lastUpdated": "2025-09-30", + "openWeights": false, + "releaseDate": "2025-09-30" + } + } + ] + }, + { + "id": "302ai/doubao-seed-1-8-251215", + "provider": "302ai", + "model": "doubao-seed-1-8-251215", + "displayName": "doubao-seed-1-8-251215", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai" + ], + "aliases": [ + "302ai/doubao-seed-1-8-251215" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 224000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "doubao-seed-1-8-251215", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.114, + "output": 0.286 + } + } + ] + }, + "metadata": { + "displayNames": [ + "doubao-seed-1-8-251215" + ], + "releaseDate": "2025-12-18", + "lastUpdated": "2025-12-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "doubao-seed-1-8-251215", + "modelKey": "doubao-seed-1-8-251215", + "displayName": "doubao-seed-1-8-251215", + "metadata": { + "lastUpdated": "2025-12-18", + "openWeights": false, + "releaseDate": "2025-12-18" + } + } + ] + }, + { + "id": "302ai/doubao-seed-code-preview-251028", + "provider": "302ai", + "model": "doubao-seed-code-preview-251028", + "displayName": "doubao-seed-code-preview-251028", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai" + ], + "aliases": [ + "302ai/doubao-seed-code-preview-251028" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "doubao-seed-code-preview-251028", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.17, + "output": 1.14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "doubao-seed-code-preview-251028" + ], + "releaseDate": "2025-11-11", + "lastUpdated": "2025-11-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "doubao-seed-code-preview-251028", + "modelKey": "doubao-seed-code-preview-251028", + "displayName": "doubao-seed-code-preview-251028", + "metadata": { + "lastUpdated": "2025-11-11", + "openWeights": false, + "releaseDate": "2025-11-11" + } + } + ] + }, + { + "id": "abacus/o3", + "provider": "abacus", + "model": "o3", + "displayName": "o3", + "family": "o", + "sources": [ + "models.dev" + ], + "providers": [ + "abacus" + ], + "aliases": [ + "abacus/o3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "o3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "o3" + ], + "families": [ + "o" + ], + "knowledgeCutoff": "2024-05", + "releaseDate": "2025-04-16", + "lastUpdated": "2025-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "o3", + "modelKey": "o3", + "displayName": "o3", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16" + } + } + ] + }, + { + "id": "abacus/route-llm", + "provider": "abacus", + "model": "route-llm", + "displayName": "Route LLM", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "abacus" + ], + "aliases": [ + "abacus/route-llm" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "route-llm", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Route LLM" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-01-01", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "route-llm", + "modelKey": "route-llm", + "displayName": "Route LLM", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + } + ] + }, + { + "id": "abliteration-ai/abliterated-model", + "provider": "abliteration-ai", + "model": "abliterated-model", + "displayName": "Abliterated Model", + "sources": [ + "models.dev" + ], + "providers": [ + "abliteration-ai" + ], + "aliases": [ + "abliteration-ai/abliterated-model" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 150000, + "inputTokens": 150000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abliteration-ai", + "model": "abliterated-model", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Abliterated Model" + ], + "releaseDate": "2026-01-06", + "lastUpdated": "2026-01-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abliteration-ai", + "providerName": "abliteration.ai", + "providerApi": "https://api.abliteration.ai/v1", + "providerDoc": "https://docs.abliteration.ai/models", + "model": "abliterated-model", + "modelKey": "abliterated-model", + "displayName": "Abliterated Model", + "metadata": { + "lastUpdated": "2026-01-06", + "openWeights": true, + "releaseDate": "2026-01-06" + } + } + ] + }, + { + "id": "ai21/j2-light", + "provider": "ai21", + "model": "j2-light", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "ai21" + ], + "aliases": [ + "ai21/j2-light" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ai21", + "model": "j2-light", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 3 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ai21", + "model": "j2-light", + "mode": "completion" + } + ] + }, + { + "id": "ai21/j2-mid", + "provider": "ai21", + "model": "j2-mid", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "ai21" + ], + "aliases": [ + "ai21/j2-mid" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ai21", + "model": "j2-mid", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10, + "output": 10 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ai21", + "model": "j2-mid", + "mode": "completion" + } + ] + }, + { + "id": "ai21/j2-ultra", + "provider": "ai21", + "model": "j2-ultra", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "ai21" + ], + "aliases": [ + "ai21/j2-ultra" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ai21", + "model": "j2-ultra", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 15, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ai21", + "model": "j2-ultra", + "mode": "completion" + } + ] + }, + { + "id": "ai21/jamba-1.5", + "provider": "ai21", + "model": "jamba-1.5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ai21" + ], + "aliases": [ + "ai21/jamba-1.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ai21", + "model": "jamba-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ai21", + "model": "jamba-1.5", + "mode": "chat" + } + ] + }, + { + "id": "ai21/jamba-1.5-large", + "provider": "ai21", + "model": "jamba-1.5-large", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ai21" + ], + "aliases": [ + "ai21/jamba-1.5-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ai21", + "model": "jamba-1.5-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ai21", + "model": "jamba-1.5-large", + "mode": "chat" + } + ] + }, + { + "id": "ai21/jamba-1.5-large@001", + "provider": "ai21", + "model": "jamba-1.5-large@001", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ai21" + ], + "aliases": [ + "ai21/jamba-1.5-large@001" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ai21", + "model": "jamba-1.5-large@001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ai21", + "model": "jamba-1.5-large@001", + "mode": "chat" + } + ] + }, + { + "id": "ai21/jamba-1.5-mini", + "provider": "ai21", + "model": "jamba-1.5-mini", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ai21" + ], + "aliases": [ + "ai21/jamba-1.5-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ai21", + "model": "jamba-1.5-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ai21", + "model": "jamba-1.5-mini", + "mode": "chat" + } + ] + }, + { + "id": "ai21/jamba-1.5-mini@001", + "provider": "ai21", + "model": "jamba-1.5-mini@001", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ai21" + ], + "aliases": [ + "ai21/jamba-1.5-mini@001" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ai21", + "model": "jamba-1.5-mini@001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ai21", + "model": "jamba-1.5-mini@001", + "mode": "chat" + } + ] + }, + { + "id": "ai21/jamba-large-1.6", + "provider": "ai21", + "model": "jamba-large-1.6", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ai21" + ], + "aliases": [ + "ai21/jamba-large-1.6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ai21", + "model": "jamba-large-1.6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ai21", + "model": "jamba-large-1.6", + "mode": "chat" + } + ] + }, + { + "id": "ai21/jamba-large-1.7", + "provider": "ai21", + "model": "jamba-large-1.7", + "displayName": "AI21: Jamba Large 1.7", + "family": "jamba", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "ai21", + "kilo", + "openrouter" + ], + "aliases": [ + "ai21/jamba-large-1.7", + "kilo/ai21/jamba-large-1.7", + "openrouter/ai21/jamba-large-1.7" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "ai21/jamba-large-1.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "ai21/jamba-large-1.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 8 + } + }, + { + "source": "litellm", + "provider": "ai21", + "model": "jamba-large-1.7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 8 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "ai21/jamba-large-1.7", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "AI21: Jamba Large 1.7", + "Jamba Large 1.7" + ], + "families": [ + "jamba" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-08-31", + "releaseDate": "2025-08-09", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "max_tokens", + "response_format", + "stop", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "ai21/jamba-large-1.7", + "modelKey": "ai21/jamba-large-1.7", + "displayName": "AI21: Jamba Large 1.7", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-08-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "ai21/jamba-large-1.7", + "modelKey": "ai21/jamba-large-1.7", + "displayName": "Jamba Large 1.7", + "family": "jamba", + "metadata": { + "knowledgeCutoff": "2024-08-31", + "lastUpdated": "2025-08-08", + "openWeights": true, + "releaseDate": "2025-08-08" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ai21", + "model": "jamba-large-1.7", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "ai21/jamba-large-1.7", + "displayName": "AI21: Jamba Large 1.7", + "metadata": { + "canonicalSlug": "ai21/jamba-large-1.7", + "createdAt": "2025-08-08T16:03:40.000Z", + "huggingFaceId": "ai21labs/AI21-Jamba-Large-1.7", + "knowledgeCutoff": "2024-08-31", + "links": { + "details": "/api/v1/models/ai21/jamba-large-1.7/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "response_format", + "stop", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 256000, + "max_completion_tokens": 4096, + "is_moderated": false + } + } + } + ] + }, + { + "id": "ai21/jamba-mini-1.6", + "provider": "ai21", + "model": "jamba-mini-1.6", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ai21" + ], + "aliases": [ + "ai21/jamba-mini-1.6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ai21", + "model": "jamba-mini-1.6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ai21", + "model": "jamba-mini-1.6", + "mode": "chat" + } + ] + }, + { + "id": "ai21/jamba-mini-1.7", + "provider": "ai21", + "model": "jamba-mini-1.7", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ai21" + ], + "aliases": [ + "ai21/jamba-mini-1.7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ai21", + "model": "jamba-mini-1.7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ai21", + "model": "jamba-mini-1.7", + "mode": "chat" + } + ] + }, + { + "id": "aihubmix/alicloud-deepseek-v4-flash", + "provider": "aihubmix", + "model": "alicloud-deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash (Alibaba Cloud)", + "family": "deepseek-flash", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/alicloud-deepseek-v4-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 384000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "alicloud-deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.14, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V4 Flash (Alibaba Cloud)" + ], + "families": [ + "deepseek-flash" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2026-04-24", + "lastUpdated": "2026-04-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "alicloud-deepseek-v4-flash", + "modelKey": "alicloud-deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash (Alibaba Cloud)", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + } + ] + }, + { + "id": "aihubmix/alicloud-deepseek-v4-pro", + "provider": "aihubmix", + "model": "alicloud-deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro (Alibaba Cloud)", + "family": "deepseek-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/alicloud-deepseek-v4-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 384000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "alicloud-deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 1.69, + "output": 3.38 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V4 Pro (Alibaba Cloud)" + ], + "families": [ + "deepseek-thinking" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2026-04-24", + "lastUpdated": "2026-04-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "alicloud-deepseek-v4-pro", + "modelKey": "alicloud-deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro (Alibaba Cloud)", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + } + ] + }, + { + "id": "aihubmix/alicloud-glm-5.1", + "provider": "aihubmix", + "model": "alicloud-glm-5.1", + "displayName": "GLM-5.1 (Alibaba Cloud)", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/alicloud-glm-5.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "alicloud-glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.169, + "cacheWrite": 1.05625, + "input": 0.84, + "output": 3.38 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-5.1 (Alibaba Cloud)" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-03-27", + "lastUpdated": "2026-03-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "alicloud-glm-5.1", + "modelKey": "alicloud-glm-5.1", + "displayName": "GLM-5.1 (Alibaba Cloud)", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-27", + "openWeights": true, + "releaseDate": "2026-03-27" + } + } + ] + }, + { + "id": "aihubmix/coding-glm-5.1", + "provider": "aihubmix", + "model": "coding-glm-5.1", + "displayName": "Coding GLM 5.1", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/coding-glm-5.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "coding-glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.013, + "input": 0.06, + "output": 0.22 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Coding GLM 5.1" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-04-11", + "lastUpdated": "2026-04-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "coding-glm-5.1", + "modelKey": "coding-glm-5.1", + "displayName": "Coding GLM 5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": true, + "releaseDate": "2026-04-11" + } + } + ] + }, + { + "id": "aihubmix/coding-glm-5.1-free", + "provider": "aihubmix", + "model": "coding-glm-5.1-free", + "displayName": "Coding GLM 5.1 (free)", + "family": "glm-free", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/coding-glm-5.1-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "coding-glm-5.1-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Coding GLM 5.1 (free)" + ], + "families": [ + "glm-free" + ], + "releaseDate": "2026-04-11", + "lastUpdated": "2026-04-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "coding-glm-5.1-free", + "modelKey": "coding-glm-5.1-free", + "displayName": "Coding GLM 5.1 (free)", + "family": "glm-free", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": true, + "releaseDate": "2026-04-11" + } + } + ] + }, + { + "id": "aihubmix/coding-minimax-m2.7", + "provider": "aihubmix", + "model": "coding-minimax-m2.7", + "displayName": "Coding MiniMax M2.7", + "family": "minimax", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/coding-minimax-m2.7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "outputTokens": 128100, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "coding-minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Coding MiniMax M2.7" + ], + "families": [ + "minimax" + ], + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "coding-minimax-m2.7", + "modelKey": "coding-minimax-m2.7", + "displayName": "Coding MiniMax M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "aihubmix/coding-minimax-m2.7-free", + "provider": "aihubmix", + "model": "coding-minimax-m2.7-free", + "displayName": "Coding MiniMax M2.7 (Free)", + "family": "minimax-free", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/coding-minimax-m2.7-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "outputTokens": 128100, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "coding-minimax-m2.7-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Coding MiniMax M2.7 (Free)" + ], + "families": [ + "minimax-free" + ], + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "coding-minimax-m2.7-free", + "modelKey": "coding-minimax-m2.7-free", + "displayName": "Coding MiniMax M2.7 (Free)", + "family": "minimax-free", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "aihubmix/coding-minimax-m2.7-highspeed", + "provider": "aihubmix", + "model": "coding-minimax-m2.7-highspeed", + "displayName": "Coding MiniMax M2.7 Highspeed", + "family": "minimax", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/coding-minimax-m2.7-highspeed" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "outputTokens": 128100, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "coding-minimax-m2.7-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Coding MiniMax M2.7 Highspeed" + ], + "families": [ + "minimax" + ], + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "coding-minimax-m2.7-highspeed", + "modelKey": "coding-minimax-m2.7-highspeed", + "displayName": "Coding MiniMax M2.7 Highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "aihubmix/coding-xiaomi-mimo-v2.5", + "provider": "aihubmix", + "model": "coding-xiaomi-mimo-v2.5", + "displayName": "Coding Xiaomi MiMo-V2.5", + "family": "mimo-v2.5", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/coding-xiaomi-mimo-v2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "coding-xiaomi-mimo-v2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.016, + "input": 0.08, + "output": 0.4 + }, + "tiered": { + "contextOver200K": { + "input": 0.16, + "output": 0.8, + "cache_read": 0.032 + }, + "tiers": [ + { + "input": 0.16, + "output": 0.8, + "cache_read": 0.032, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Coding Xiaomi MiMo-V2.5" + ], + "families": [ + "mimo-v2.5" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-05-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "coding-xiaomi-mimo-v2.5", + "modelKey": "coding-xiaomi-mimo-v2.5", + "displayName": "Coding Xiaomi MiMo-V2.5", + "family": "mimo-v2.5", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-05-13", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "aihubmix/coding-xiaomi-mimo-v2.5-pro", + "provider": "aihubmix", + "model": "coding-xiaomi-mimo-v2.5-pro", + "displayName": "Coding Xiaomi MiMo-V2.5-Pro", + "family": "mimo-v2.5-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/coding-xiaomi-mimo-v2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "coding-xiaomi-mimo-v2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.2, + "output": 0.6 + }, + "tiered": { + "contextOver200K": { + "input": 0.4, + "output": 1.2, + "cache_read": 0.08 + }, + "tiers": [ + { + "input": 0.4, + "output": 1.2, + "cache_read": 0.08, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Coding Xiaomi MiMo-V2.5-Pro" + ], + "families": [ + "mimo-v2.5-pro" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-05-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "coding-xiaomi-mimo-v2.5-pro", + "modelKey": "coding-xiaomi-mimo-v2.5-pro", + "displayName": "Coding Xiaomi MiMo-V2.5-Pro", + "family": "mimo-v2.5-pro", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-05-13", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "aihubmix/deep-deepseek-v4-flash", + "provider": "aihubmix", + "model": "deep-deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash (DeepSeek)", + "family": "deepseek-flash", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/deep-deepseek-v4-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 384000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "deep-deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0308, + "input": 0.154, + "output": 0.308 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V4 Flash (DeepSeek)" + ], + "families": [ + "deepseek-flash" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2026-04-24", + "lastUpdated": "2026-04-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "deep-deepseek-v4-flash", + "modelKey": "deep-deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash (DeepSeek)", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + } + ] + }, + { + "id": "aihubmix/deep-deepseek-v4-pro", + "provider": "aihubmix", + "model": "deep-deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro (DeepSeek)", + "family": "deepseek-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/deep-deepseek-v4-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 384000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "deep-deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.004302, + "input": 0.478, + "output": 0.956 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V4 Pro (DeepSeek)" + ], + "families": [ + "deepseek-thinking" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2026-04-24", + "lastUpdated": "2026-04-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "deep-deepseek-v4-pro", + "modelKey": "deep-deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro (DeepSeek)", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + } + ] + }, + { + "id": "aihubmix/doubao-seed-2-0-code-preview", + "provider": "aihubmix", + "model": "doubao-seed-2-0-code-preview", + "displayName": "Doubao Seed 2.0 Code Preview", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/doubao-seed-2-0-code-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "doubao-seed-2-0-code-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.09644, + "input": 0.48, + "output": 2.41 + }, + "tiered": { + "tiers": [ + { + "input": 0.72, + "output": 3.62, + "cache_read": 0.144656, + "tier": { + "size": 32000 + } + }, + { + "input": 1.45, + "output": 7.23, + "cache_read": 0.28932, + "tier": { + "size": 128000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao Seed 2.0 Code Preview" + ], + "families": [ + "seed" + ], + "releaseDate": "2026-02-14", + "lastUpdated": "2026-02-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "doubao-seed-2-0-code-preview", + "modelKey": "doubao-seed-2-0-code-preview", + "displayName": "Doubao Seed 2.0 Code Preview", + "family": "seed", + "metadata": { + "lastUpdated": "2026-02-14", + "openWeights": false, + "releaseDate": "2026-02-14" + } + } + ] + }, + { + "id": "aihubmix/doubao-seed-2-0-lite-260428", + "provider": "aihubmix", + "model": "doubao-seed-2-0-lite-260428", + "displayName": "Doubao Seed 2.0 Lite 260428", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/doubao-seed-2-0-lite-260428" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "doubao-seed-2-0-lite-260428", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01692, + "input": 0.08, + "inputAudio": 1.269, + "output": 0.51 + }, + "tiered": { + "tiers": [ + { + "input": 0.13, + "output": 0.76, + "cache_read": 0.02536, + "input_audio": 1.902, + "tier": { + "size": 32000 + } + }, + { + "input": 0.25, + "output": 1.52, + "cache_read": 0.05072, + "input_audio": 3.804, + "tier": { + "size": 128000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao Seed 2.0 Lite 260428" + ], + "families": [ + "seed" + ], + "releaseDate": "2026-04-28", + "lastUpdated": "2026-04-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "doubao-seed-2-0-lite-260428", + "modelKey": "doubao-seed-2-0-lite-260428", + "displayName": "Doubao Seed 2.0 Lite 260428", + "family": "seed", + "metadata": { + "lastUpdated": "2026-04-28", + "openWeights": false, + "releaseDate": "2026-04-28" + } + } + ] + }, + { + "id": "aihubmix/doubao-seed-2-0-mini-260428", + "provider": "aihubmix", + "model": "doubao-seed-2-0-mini-260428", + "displayName": "Doubao Seed 2.0 Mini 260428", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/doubao-seed-2-0-mini-260428" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "doubao-seed-2-0-mini-260428", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.00564, + "input": 0.03, + "inputAudio": 0.423, + "output": 0.28 + }, + "tiered": { + "tiers": [ + { + "input": 0.06, + "output": 0.56, + "cache_read": 0.01128, + "input_audio": 0.846, + "tier": { + "size": 32000 + } + }, + { + "input": 0.11, + "output": 1.13, + "cache_read": 0.02256, + "input_audio": 1.692, + "tier": { + "size": 128000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao Seed 2.0 Mini 260428" + ], + "families": [ + "seed" + ], + "releaseDate": "2026-04-28", + "lastUpdated": "2026-04-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "doubao-seed-2-0-mini-260428", + "modelKey": "doubao-seed-2-0-mini-260428", + "displayName": "Doubao Seed 2.0 Mini 260428", + "family": "seed", + "metadata": { + "lastUpdated": "2026-04-28", + "openWeights": false, + "releaseDate": "2026-04-28" + } + } + ] + }, + { + "id": "aihubmix/doubao-seed-2-0-pro", + "provider": "aihubmix", + "model": "doubao-seed-2-0-pro", + "displayName": "Doubao Seed 2.0 Pro", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/doubao-seed-2-0-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "doubao-seed-2-0-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.09644, + "input": 0.48, + "output": 2.41 + }, + "tiered": { + "tiers": [ + { + "input": 0.72, + "output": 3.62, + "cache_read": 0.144656, + "tier": { + "size": 32000 + } + }, + { + "input": 1.45, + "output": 7.23, + "cache_read": 0.28932, + "tier": { + "size": 128000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao Seed 2.0 Pro" + ], + "families": [ + "seed" + ], + "releaseDate": "2026-02-14", + "lastUpdated": "2026-02-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "doubao-seed-2-0-pro", + "modelKey": "doubao-seed-2-0-pro", + "displayName": "Doubao Seed 2.0 Pro", + "family": "seed", + "metadata": { + "lastUpdated": "2026-02-14", + "openWeights": false, + "releaseDate": "2026-02-14" + } + } + ] + }, + { + "id": "aihubmix/xiaomi-mimo-v2.5", + "provider": "aihubmix", + "model": "xiaomi-mimo-v2.5", + "displayName": "Xiaomi MiMo-V2.5", + "family": "mimo-v2.5", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/xiaomi-mimo-v2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "xiaomi-mimo-v2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.088, + "input": 0.44, + "output": 2.2 + }, + "tiered": { + "contextOver200K": { + "input": 0.88, + "output": 4.4, + "cache_read": 0.176 + }, + "tiers": [ + { + "input": 0.88, + "output": 4.4, + "cache_read": 0.176, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Xiaomi MiMo-V2.5" + ], + "families": [ + "mimo-v2.5" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-05-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "xiaomi-mimo-v2.5", + "modelKey": "xiaomi-mimo-v2.5", + "displayName": "Xiaomi MiMo-V2.5", + "family": "mimo-v2.5", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-05-13", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "aihubmix/xiaomi-mimo-v2.5-free", + "provider": "aihubmix", + "model": "xiaomi-mimo-v2.5-free", + "displayName": "Xiaomi MiMo-V2.5 (free)", + "family": "mimo-v2.5", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/xiaomi-mimo-v2.5-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "xiaomi-mimo-v2.5-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Xiaomi MiMo-V2.5 (free)" + ], + "families": [ + "mimo-v2.5" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-05-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "xiaomi-mimo-v2.5-free", + "modelKey": "xiaomi-mimo-v2.5-free", + "displayName": "Xiaomi MiMo-V2.5 (free)", + "family": "mimo-v2.5", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-05-13", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "aihubmix/xiaomi-mimo-v2.5-pro", + "provider": "aihubmix", + "model": "xiaomi-mimo-v2.5-pro", + "displayName": "Xiaomi MiMo-V2.5-Pro", + "family": "mimo-v2.5-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/xiaomi-mimo-v2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "xiaomi-mimo-v2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.22, + "input": 1.1, + "output": 3.3 + }, + "tiered": { + "contextOver200K": { + "input": 2.2, + "output": 6.6, + "cache_read": 0.44 + }, + "tiers": [ + { + "input": 2.2, + "output": 6.6, + "cache_read": 0.44, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Xiaomi MiMo-V2.5-Pro" + ], + "families": [ + "mimo-v2.5-pro" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-05-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "xiaomi-mimo-v2.5-pro", + "modelKey": "xiaomi-mimo-v2.5-pro", + "displayName": "Xiaomi MiMo-V2.5-Pro", + "family": "mimo-v2.5-pro", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-05-13", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "aihubmix/xiaomi-mimo-v2.5-pro-free", + "provider": "aihubmix", + "model": "xiaomi-mimo-v2.5-pro-free", + "displayName": "Xiaomi MiMo-V2.5-Pro (free)", + "family": "mimo-v2.5-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/xiaomi-mimo-v2.5-pro-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "xiaomi-mimo-v2.5-pro-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Xiaomi MiMo-V2.5-Pro (free)" + ], + "families": [ + "mimo-v2.5-pro" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-05-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "xiaomi-mimo-v2.5-pro-free", + "modelKey": "xiaomi-mimo-v2.5-pro-free", + "displayName": "Xiaomi MiMo-V2.5-Pro (free)", + "family": "mimo-v2.5-pro", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-05-13", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "aihubmix/zai-glm-5.1", + "provider": "aihubmix", + "model": "zai-glm-5.1", + "displayName": "GLM-5.1 (Z.ai)", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/zai-glm-5.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "zai-glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.183112, + "input": 0.845, + "output": 3.38 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-5.1 (Z.ai)" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-03-27", + "lastUpdated": "2026-03-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "zai-glm-5.1", + "modelKey": "zai-glm-5.1", + "displayName": "GLM-5.1 (Z.ai)", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-27", + "openWeights": true, + "releaseDate": "2026-03-27" + } + } + ] + }, + { + "id": "aiml/dev", + "provider": "aiml", + "model": "dev", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "aiml" + ], + "aliases": [ + "aiml/flux/dev" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "aiml", + "model": "aiml/flux/dev", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.033 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "aiml", + "model": "aiml/flux/dev", + "mode": "image_generation", + "metadata": { + "metadata": { + "notes": "Flux Dev - Development version optimized for experimentation" + }, + "source": "https://docs.aimlapi.com/", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "aiml/flux-pro", + "provider": "aiml", + "model": "flux-pro", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "aiml" + ], + "aliases": [ + "aiml/flux-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "aiml", + "model": "aiml/flux-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.065 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "aiml", + "model": "aiml/flux-pro", + "mode": "image_generation", + "metadata": { + "metadata": { + "notes": "Flux Dev - Development version optimized for experimentation" + }, + "source": "https://docs.aimlapi.com/", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "aiml/flux-realism", + "provider": "aiml", + "model": "flux-realism", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "aiml" + ], + "aliases": [ + "aiml/flux-realism" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "aiml", + "model": "aiml/flux-realism", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.046 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "aiml", + "model": "aiml/flux-realism", + "mode": "image_generation", + "metadata": { + "metadata": { + "notes": "Flux Pro - Professional-grade image generation model" + }, + "source": "https://docs.aimlapi.com/", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "aiml/schnell", + "provider": "aiml", + "model": "schnell", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "aiml" + ], + "aliases": [ + "aiml/flux/schnell" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "aiml", + "model": "aiml/flux/schnell", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.004 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "aiml", + "model": "aiml/flux/schnell", + "mode": "image_generation", + "metadata": { + "metadata": { + "notes": "Flux Schnell - Fast generation model optimized for speed" + }, + "source": "https://docs.aimlapi.com/", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "aiml/text-to-image", + "provider": "aiml", + "model": "text-to-image", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "aiml" + ], + "aliases": [ + "aiml/flux/kontext-max/text-to-image", + "aiml/flux/kontext-pro/text-to-image" + ], + "mergedProviderModelRecords": 2, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "aiml", + "model": "aiml/flux/kontext-max/text-to-image", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.104 + } + }, + { + "source": "litellm", + "provider": "aiml", + "model": "aiml/flux/kontext-pro/text-to-image", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.052 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "aiml", + "model": "aiml/flux/kontext-max/text-to-image", + "mode": "image_generation", + "metadata": { + "metadata": { + "notes": "Flux Pro v1.1 - Enhanced version with improved capabilities and 6x faster inference speed" + }, + "source": "https://docs.aimlapi.com/", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "aiml", + "model": "aiml/flux/kontext-pro/text-to-image", + "mode": "image_generation", + "metadata": { + "metadata": { + "notes": "Flux Pro v1.1 - Enhanced version with improved capabilities and 6x faster inference speed" + }, + "source": "https://docs.aimlapi.com/", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "aiml/v1.1", + "provider": "aiml", + "model": "v1.1", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "aiml" + ], + "aliases": [ + "aiml/flux-pro/v1.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "aiml", + "model": "aiml/flux-pro/v1.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.052 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "aiml", + "model": "aiml/flux-pro/v1.1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "aiml/v1.1-ultra", + "provider": "aiml", + "model": "v1.1-ultra", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "aiml" + ], + "aliases": [ + "aiml/flux-pro/v1.1-ultra" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "aiml", + "model": "aiml/flux-pro/v1.1-ultra", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.063 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "aiml", + "model": "aiml/flux-pro/v1.1-ultra", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "alibaba-cn/moonshot-kimi-k2-instruct", + "provider": "alibaba-cn", + "model": "moonshot-kimi-k2-instruct", + "displayName": "Moonshot Kimi K2 Instruct", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/moonshot-kimi-k2-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "moonshot-kimi-k2-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.574, + "output": 2.294 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Moonshot Kimi K2 Instruct" + ], + "families": [ + "kimi-k2" + ], + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "moonshot-kimi-k2-instruct", + "modelKey": "moonshot-kimi-k2-instruct", + "displayName": "Moonshot Kimi K2 Instruct", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2025-01-01", + "openWeights": true, + "releaseDate": "2025-01-01" + } + } + ] + }, + { + "id": "alibaba-cn/qvq-max", + "provider": "alibaba-cn", + "model": "qvq-max", + "displayName": "QVQ Max", + "family": "qvq", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qvq-max" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qvq-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.147, + "output": 4.588 + } + } + ] + }, + "metadata": { + "displayNames": [ + "QVQ Max" + ], + "families": [ + "qvq" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-03-25", + "lastUpdated": "2025-03-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qvq-max", + "modelKey": "qvq-max", + "displayName": "QVQ Max", + "family": "qvq", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-03-25", + "openWeights": false, + "releaseDate": "2025-03-25" + } + } + ] + }, + { + "id": "alibaba-cn/tongyi-intent-detect-v3", + "provider": "alibaba-cn", + "model": "tongyi-intent-detect-v3", + "displayName": "Tongyi Intent Detect V3", + "family": "yi", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/tongyi-intent-detect-v3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "tongyi-intent-detect-v3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.058, + "output": 0.144 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Tongyi Intent Detect V3" + ], + "families": [ + "yi" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-01", + "lastUpdated": "2024-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "tongyi-intent-detect-v3", + "modelKey": "tongyi-intent-detect-v3", + "displayName": "Tongyi Intent Detect V3", + "family": "yi", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-01", + "openWeights": false, + "releaseDate": "2024-01" + } + } + ] + }, + { + "id": "alibaba-token-plan-cn/wan2.7-image", + "provider": "alibaba-token-plan-cn", + "model": "wan2.7-image", + "displayName": "Wan2.7 Image", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-token-plan-cn" + ], + "aliases": [ + "alibaba-token-plan-cn/wan2.7-image" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "wan2.7-image", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Wan2.7 Image" + ], + "releaseDate": "2026-05-29", + "lastUpdated": "2026-05-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "wan2.7-image", + "modelKey": "wan2.7-image", + "displayName": "Wan2.7 Image", + "metadata": { + "lastUpdated": "2026-05-29", + "openWeights": false, + "releaseDate": "2026-05-29" + } + } + ] + }, + { + "id": "alibaba-token-plan-cn/wan2.7-image-pro", + "provider": "alibaba-token-plan-cn", + "model": "wan2.7-image-pro", + "displayName": "Wan2.7 Image Pro", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-token-plan-cn" + ], + "aliases": [ + "alibaba-token-plan-cn/wan2.7-image-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "wan2.7-image-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Wan2.7 Image Pro" + ], + "releaseDate": "2026-05-29", + "lastUpdated": "2026-05-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "wan2.7-image-pro", + "modelKey": "wan2.7-image-pro", + "displayName": "Wan2.7 Image Pro", + "metadata": { + "lastUpdated": "2026-05-29", + "openWeights": false, + "releaseDate": "2026-05-29" + } + } + ] + }, + { + "id": "alibaba-token-plan/wan2.7-image", + "provider": "alibaba-token-plan", + "model": "wan2.7-image", + "displayName": "Wan2.7 Image", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-token-plan" + ], + "aliases": [ + "alibaba-token-plan/wan2.7-image" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "wan2.7-image", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Wan2.7 Image" + ], + "releaseDate": "2026-05-29", + "lastUpdated": "2026-05-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "wan2.7-image", + "modelKey": "wan2.7-image", + "displayName": "Wan2.7 Image", + "metadata": { + "lastUpdated": "2026-05-29", + "openWeights": false, + "releaseDate": "2026-05-29" + } + } + ] + }, + { + "id": "alibaba-token-plan/wan2.7-image-pro", + "provider": "alibaba-token-plan", + "model": "wan2.7-image-pro", + "displayName": "Wan2.7 Image Pro", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-token-plan" + ], + "aliases": [ + "alibaba-token-plan/wan2.7-image-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "wan2.7-image-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Wan2.7 Image Pro" + ], + "releaseDate": "2026-05-29", + "lastUpdated": "2026-05-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "wan2.7-image-pro", + "modelKey": "wan2.7-image-pro", + "displayName": "Wan2.7 Image Pro", + "metadata": { + "lastUpdated": "2026-05-29", + "openWeights": false, + "releaseDate": "2026-05-29" + } + } + ] + }, + { + "id": "alibaba/qvq-max", + "provider": "alibaba", + "model": "qvq-max", + "displayName": "QVQ Max", + "family": "qvq", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba" + ], + "aliases": [ + "alibaba/qvq-max" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba", + "model": "qvq-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.2, + "output": 4.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "QVQ Max" + ], + "families": [ + "qvq" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-03-25", + "lastUpdated": "2025-03-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qvq-max", + "modelKey": "qvq-max", + "displayName": "QVQ Max", + "family": "qvq", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-03-25", + "openWeights": false, + "releaseDate": "2025-03-25" + } + } + ] + }, + { + "id": "alibaba/qwen-2.5-14b-instruct", + "provider": "alibaba", + "model": "qwen-2.5-14b-instruct", + "displayName": "Qwen 2.5 14B Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/qwen-2.5-14b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Qwen 2.5 14B Instruct" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-09", + "releaseDate": "2024-09-19", + "lastUpdated": "2024-09-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "qwen-2.5-14b-instruct", + "modelKey": "qwen-2.5-14b-instruct", + "displayName": "Qwen 2.5 14B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2024-09-19", + "openWeights": true, + "releaseDate": "2024-09-19" + } + } + ] + }, + { + "id": "alibaba/qwen-2.5-72b-instruct", + "provider": "alibaba", + "model": "qwen-2.5-72b-instruct", + "displayName": "Qwen2.5 72B Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "cortecs", + "kilo", + "nano-gpt", + "novita", + "novita-ai", + "openrouter" + ], + "aliases": [ + "cortecs/qwen-2.5-72b-instruct", + "kilo/qwen/qwen-2.5-72b-instruct", + "nano-gpt/qwen/qwen-2.5-72b-instruct", + "novita-ai/qwen/qwen-2.5-72b-instruct", + "novita/qwen/qwen-2.5-72b-instruct", + "openrouter/qwen/qwen-2.5-72b-instruct" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 8192, + "outputTokens": 33000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "qwen-2.5-72b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.062, + "output": 0.231 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen-2.5-72b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.39 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/qwen-2.5-72b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.357, + "output": 0.408 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen-2.5-72b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.38, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen-2.5-72b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.36, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen-2.5-72b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.38, + "output": 0.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen-2.5-72b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 2.5 72B Instruct", + "Qwen2.5 72B", + "Qwen2.5 72B Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-06", + "releaseDate": "2024-09-19", + "lastUpdated": "2024-09-19", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "qwen-2.5-72b-instruct", + "modelKey": "qwen-2.5-72b-instruct", + "displayName": "Qwen2.5 72B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2024-09-19", + "openWeights": true, + "releaseDate": "2024-09-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen-2.5-72b-instruct", + "modelKey": "qwen/qwen-2.5-72b-instruct", + "displayName": "Qwen2.5 72B Instruct", + "metadata": { + "lastUpdated": "2026-01-10", + "openWeights": true, + "releaseDate": "2024-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/qwen-2.5-72b-instruct", + "modelKey": "qwen/qwen-2.5-72b-instruct", + "displayName": "Qwen2.5 72B", + "metadata": { + "lastUpdated": "2025-07-03", + "openWeights": false, + "releaseDate": "2025-07-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen-2.5-72b-instruct", + "modelKey": "qwen/qwen-2.5-72b-instruct", + "displayName": "Qwen 2.5 72B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-10-15", + "openWeights": true, + "releaseDate": "2024-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen-2.5-72b-instruct", + "modelKey": "qwen/qwen-2.5-72b-instruct", + "displayName": "Qwen2.5 72B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-06-30", + "lastUpdated": "2024-09-19", + "openWeights": true, + "releaseDate": "2024-09-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen-2.5-72b-instruct", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen-2.5-72b-instruct", + "displayName": "Qwen2.5 72B Instruct", + "metadata": { + "canonicalSlug": "qwen/qwen-2.5-72b-instruct", + "createdAt": "2024-09-19T00:00:00.000Z", + "huggingFaceId": "Qwen/Qwen2.5-72B-Instruct", + "instructType": "chatml", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/qwen/qwen-2.5-72b-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Qwen", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen-2.5-7b-instruct", + "provider": "alibaba", + "model": "qwen-2.5-7b-instruct", + "displayName": "Qwen: Qwen2.5 7B Instruct", + "family": "qwen", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/qwen/qwen-2.5-7b-instruct", + "openrouter/qwen/qwen-2.5-7b-instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen-2.5-7b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.1 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen-2.5-7b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.1 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen-2.5-7b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen2.5 7B Instruct", + "Qwen: Qwen2.5 7B Instruct" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-06-30", + "releaseDate": "2024-09", + "lastUpdated": "2025-04-16", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen-2.5-7b-instruct", + "modelKey": "qwen/qwen-2.5-7b-instruct", + "displayName": "Qwen: Qwen2.5 7B Instruct", + "metadata": { + "lastUpdated": "2025-04-16", + "openWeights": true, + "releaseDate": "2024-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen-2.5-7b-instruct", + "modelKey": "qwen/qwen-2.5-7b-instruct", + "displayName": "Qwen2.5 7B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-06-30", + "lastUpdated": "2024-10-16", + "openWeights": true, + "releaseDate": "2024-10-16" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen-2.5-7b-instruct", + "displayName": "Qwen: Qwen2.5 7B Instruct", + "metadata": { + "canonicalSlug": "qwen/qwen-2.5-7b-instruct", + "createdAt": "2024-10-16T00:00:00.000Z", + "huggingFaceId": "Qwen/Qwen2.5-7B-Instruct", + "instructType": "chatml", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/qwen/qwen-2.5-7b-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen-2.5-7b-vision-instruct", + "provider": "alibaba", + "model": "qwen-2.5-7b-vision-instruct", + "displayName": "Qwen 2.5 7B Vision Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "inference" + ], + "aliases": [ + "inference/qwen/qwen-2.5-7b-vision-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 125000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "inference", + "model": "qwen/qwen-2.5-7b-vision-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 2.5 7B Vision Instruct" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "inference", + "providerName": "Inference", + "providerApi": "https://inference.net/v1", + "providerDoc": "https://inference.net/models", + "model": "qwen/qwen-2.5-7b-vision-instruct", + "modelKey": "qwen/qwen-2.5-7b-vision-instruct", + "displayName": "Qwen 2.5 7B Vision Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-01", + "openWeights": true, + "releaseDate": "2025-01-01" + } + } + ] + }, + { + "id": "alibaba/qwen-2.5-coder-32b", + "provider": "alibaba", + "model": "qwen-2.5-coder-32b", + "displayName": "Qwen 2.5 Coder 32B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "abacus" + ], + "aliases": [ + "abacus/qwen-2.5-coder-32b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "qwen-2.5-coder-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.79, + "output": 0.79 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 2.5 Coder 32B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2024-11-11", + "lastUpdated": "2024-11-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "qwen-2.5-coder-32b", + "modelKey": "qwen-2.5-coder-32b", + "displayName": "Qwen 2.5 Coder 32B", + "family": "qwen", + "metadata": { + "lastUpdated": "2024-11-11", + "openWeights": true, + "releaseDate": "2024-11-11" + } + } + ] + }, + { + "id": "alibaba/qwen-2.5-coder-32b-instruct", + "provider": "alibaba", + "model": "qwen-2.5-coder-32b-instruct", + "displayName": "Qwen2.5 Coder 32B Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/qwen/qwen-2.5-coder-32b-instruct", + "openrouter/qwen/qwen-2.5-coder-32b-instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 33792, + "maxTokens": 33792, + "outputTokens": 33792, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen-2.5-coder-32b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen-2.5-coder-32b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.66, + "output": 1 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/qwen/qwen-2.5-coder-32b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.18, + "output": 0.18 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen-2.5-coder-32b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.66, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen2.5 Coder 32B Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-06-30", + "releaseDate": "2024-11-11", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "seed", + "stop", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen-2.5-coder-32b-instruct", + "modelKey": "qwen/qwen-2.5-coder-32b-instruct", + "displayName": "Qwen2.5 Coder 32B Instruct", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2024-11-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen-2.5-coder-32b-instruct", + "modelKey": "qwen/qwen-2.5-coder-32b-instruct", + "displayName": "Qwen2.5 Coder 32B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-06-30", + "lastUpdated": "2024-11-11", + "openWeights": true, + "releaseDate": "2024-11-11" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/qwen/qwen-2.5-coder-32b-instruct", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen-2.5-coder-32b-instruct", + "displayName": "Qwen2.5 Coder 32B Instruct", + "metadata": { + "canonicalSlug": "qwen/qwen-2.5-coder-32b-instruct", + "createdAt": "2024-11-11T23:40:00.000Z", + "huggingFaceId": "Qwen/Qwen2.5-Coder-32B-Instruct", + "instructType": "chatml", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/qwen/qwen-2.5-coder-32b-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "seed", + "stop", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Qwen", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen-3-14b", + "provider": "alibaba", + "model": "qwen-3-14b", + "displayName": "Qwen3-14B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "vercel/alibaba/qwen-3-14b", + "vercel_ai_gateway/alibaba/qwen-3-14b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 40960, + "inputTokens": 40960, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen-3-14b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.24 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/alibaba/qwen-3-14b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.24 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3-14B" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-04-01", + "lastUpdated": "2025-04", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen-3-14b", + "modelKey": "alibaba/qwen-3-14b", + "displayName": "Qwen3-14B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": false, + "releaseDate": "2025-04-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/alibaba/qwen-3-14b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen-3-235b", + "provider": "alibaba", + "model": "qwen-3-235b", + "displayName": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "vercel/alibaba/qwen-3-235b", + "vercel_ai_gateway/alibaba/qwen-3-235b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 40960, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen-3-235b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.22, + "output": 0.88 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/alibaba/qwen-3-235b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 235B A22B Instruct 2507" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-04-01", + "lastUpdated": "2025-04", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen-3-235b", + "modelKey": "alibaba/qwen-3-235b", + "displayName": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": false, + "releaseDate": "2025-04-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/alibaba/qwen-3-235b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen-3-30b", + "provider": "alibaba", + "model": "qwen-3-30b", + "displayName": "Qwen3-30B-A3B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "vercel/alibaba/qwen-3-30b", + "vercel_ai_gateway/alibaba/qwen-3-30b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 40960, + "inputTokens": 40960, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen-3-30b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/alibaba/qwen-3-30b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3-30B-A3B" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-04-01", + "lastUpdated": "2025-04", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen-3-30b", + "modelKey": "alibaba/qwen-3-30b", + "displayName": "Qwen3-30B-A3B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": false, + "releaseDate": "2025-04-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/alibaba/qwen-3-30b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen-3-32b", + "provider": "alibaba", + "model": "qwen-3-32b", + "displayName": "Qwen 3.32B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "cerebras", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "cerebras/qwen-3-32b", + "vercel/alibaba/qwen-3-32b", + "vercel_ai_gateway/alibaba/qwen-3-32b" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen-3-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.16, + "output": 0.64 + } + }, + { + "source": "litellm", + "provider": "cerebras", + "model": "cerebras/qwen-3-32b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 0.8 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/alibaba/qwen-3-32b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.32B" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-04-01", + "lastUpdated": "2025-04", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen-3-32b", + "modelKey": "alibaba/qwen-3-32b", + "displayName": "Qwen 3.32B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": false, + "releaseDate": "2025-04-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cerebras", + "model": "cerebras/qwen-3-32b", + "mode": "chat", + "metadata": { + "source": "https://inference-docs.cerebras.ai/support/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/alibaba/qwen-3-32b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen-3-6-plus", + "provider": "alibaba", + "model": "qwen-3-6-plus", + "displayName": "Qwen 3.6 Plus", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "frogbot", + "venice" + ], + "aliases": [ + "frogbot/qwen-3-6-plus", + "venice/qwen-3-6-plus" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1000000, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "frogbot", + "model": "qwen-3-6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.5, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "qwen-3-6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0625, + "cacheWrite": 0.78, + "input": 0.625, + "output": 3.75 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 7.5, + "cache_read": 0.0625, + "cache_write": 0.78 + }, + "tiers": [ + { + "input": 2.5, + "output": 7.5, + "cache_read": 0.0625, + "cache_write": 0.78, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.6 Plus", + "Qwen 3.6 Plus Uncensored" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-03", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "qwen-3-6-plus", + "modelKey": "qwen-3-6-plus", + "displayName": "Qwen 3.6 Plus", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-03", + "openWeights": false, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "qwen-3-6-plus", + "modelKey": "qwen-3-6-plus", + "displayName": "Qwen 3.6 Plus Uncensored", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-04-06" + } + } + ] + }, + { + "id": "alibaba/qwen-3-7-max", + "provider": "alibaba", + "model": "qwen-3-7-max", + "displayName": "Qwen 3.7 Max", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/qwen-3-7-max" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "qwen-3-7-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.27, + "cacheWrite": 3.35, + "input": 2.7, + "output": 8.05 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.7 Max" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-05-22", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "qwen-3-7-max", + "modelKey": "qwen-3-7-max", + "displayName": "Qwen 3.7 Max", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-05-22" + } + } + ] + }, + { + "id": "alibaba/qwen-3-7-plus", + "provider": "alibaba", + "model": "qwen-3-7-plus", + "displayName": "Qwen 3.7 Plus", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/qwen-3-7-plus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "qwen-3-7-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.625, + "input": 0.5, + "output": 2 + }, + "tiered": { + "contextOver200K": { + "input": 1.5, + "output": 6, + "cache_read": 0.15, + "cache_write": 1.875 + }, + "tiers": [ + { + "input": 1.5, + "output": 6, + "cache_read": 0.15, + "cache_write": 1.875, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.7 Plus" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-06-02", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "qwen-3-7-plus", + "modelKey": "qwen-3-7-plus", + "displayName": "Qwen 3.7 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-06-02" + } + } + ] + }, + { + "id": "alibaba/qwen-3.6-max-preview", + "provider": "alibaba", + "model": "qwen-3.6-max-preview", + "displayName": "Qwen 3.6 Max Preview", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/alibaba/qwen-3.6-max-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 240000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen-3.6-max-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "cacheWrite": 1.625, + "input": 1.3, + "output": 7.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.6 Max Preview" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-04-20", + "lastUpdated": "2026-04-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen-3.6-max-preview", + "modelKey": "alibaba/qwen-3.6-max-preview", + "displayName": "Qwen 3.6 Max Preview", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-20" + } + } + ] + }, + { + "id": "alibaba/qwen-3.6-plus", + "provider": "alibaba", + "model": "qwen-3.6-plus", + "displayName": "Qwen3.6 Plus", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "auriko", + "nano-gpt" + ], + "aliases": [ + "auriko/qwen-3.6-plus", + "nano-gpt/qwen-3.6-plus" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1000000, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "auriko", + "model": "qwen-3.6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.5, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.2, + "cache_write": 2.5 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.2, + "cache_write": 2.5, + "tier": { + "size": 256000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen-3.6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 2.7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.6 Plus", + "Qwen3.6 Plus" + ], + "families": [ + "qwen", + "qwen3.6" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "auriko", + "providerName": "Auriko", + "providerApi": "https://api.auriko.ai/v1", + "providerDoc": "https://docs.auriko.ai", + "model": "qwen-3.6-plus", + "modelKey": "qwen-3.6-plus", + "displayName": "Qwen3.6 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen-3.6-plus", + "modelKey": "qwen-3.6-plus", + "displayName": "Qwen 3.6 Plus", + "family": "qwen3.6", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + } + ] + }, + { + "id": "alibaba/qwen-coder", + "provider": "alibaba", + "model": "qwen-coder", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "dashscope" + ], + "aliases": [ + "dashscope/qwen-coder" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen-coder", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen-coder", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen-coder-plus", + "provider": "alibaba", + "model": "qwen-coder-plus", + "displayName": "Qwen Coder Plus", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/qwen-coder-plus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen-coder-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.502, + "output": 1.004 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Coder Plus" + ], + "families": [ + "qwen" + ], + "releaseDate": "2024-09-18", + "lastUpdated": "2024-09-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen-coder-plus", + "modelKey": "qwen-coder-plus", + "displayName": "Qwen Coder Plus", + "family": "qwen", + "metadata": { + "lastUpdated": "2024-09-18", + "openWeights": false, + "releaseDate": "2024-09-18" + } + } + ] + }, + { + "id": "alibaba/qwen-deep-research", + "provider": "alibaba", + "model": "qwen-deep-research", + "displayName": "Qwen Deep Research", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen-deep-research" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 32768, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 7.742, + "output": 23.367 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Deep Research" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-01", + "lastUpdated": "2024-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-deep-research", + "modelKey": "qwen-deep-research", + "displayName": "Qwen Deep Research", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-01", + "openWeights": false, + "releaseDate": "2024-01" + } + } + ] + }, + { + "id": "alibaba/qwen-doc-turbo", + "provider": "alibaba", + "model": "qwen-doc-turbo", + "displayName": "Qwen Doc Turbo", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen-doc-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen-doc-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.087, + "output": 0.144 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Doc Turbo" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-01", + "lastUpdated": "2024-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-doc-turbo", + "modelKey": "qwen-doc-turbo", + "displayName": "Qwen Doc Turbo", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-01", + "openWeights": false, + "releaseDate": "2024-01" + } + } + ] + }, + { + "id": "alibaba/qwen-flash", + "provider": "alibaba", + "model": "qwen-flash", + "displayName": "Qwen Flash", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "alibaba", + "alibaba-cn", + "dashscope", + "llmgateway" + ], + "aliases": [ + "302ai/qwen-flash", + "alibaba-cn/qwen-flash", + "alibaba/qwen-flash", + "dashscope/qwen-flash", + "llmgateway/qwen-flash" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 1000000, + "inputTokens": 997952, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "qwen-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.022, + "output": 0.22 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.022, + "output": 0.216 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Flash", + "Qwen-Flash" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-07-28", + "lastUpdated": "2025-07-28", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "qwen-flash", + "modelKey": "qwen-flash", + "displayName": "Qwen-Flash", + "metadata": { + "lastUpdated": "2025-07-28", + "openWeights": false, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-flash", + "modelKey": "qwen-flash", + "displayName": "Qwen Flash", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-07-28", + "openWeights": false, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-flash", + "modelKey": "qwen-flash", + "displayName": "Qwen Flash", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-07-28", + "openWeights": false, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen-flash", + "modelKey": "qwen-flash", + "displayName": "Qwen Flash", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-07-28", + "openWeights": false, + "releaseDate": "2025-07-28" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen-flash", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen-flash-2025-07-28", + "provider": "alibaba", + "model": "qwen-flash-2025-07-28", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "dashscope" + ], + "aliases": [ + "dashscope/qwen-flash-2025-07-28" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 997952, + "inputTokens": 997952, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen-flash-2025-07-28", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen-flash-2025-07-28", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen-image", + "provider": "alibaba", + "model": "qwen-image", + "displayName": "Qwen Image", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia", + "regolo-ai" + ], + "aliases": [ + "nvidia/qwen/qwen-image", + "regolo-ai/qwen-image" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 8192, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "qwen/qwen-image", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "regolo-ai", + "model": "qwen-image", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Image", + "Qwen-Image" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-08-07", + "lastUpdated": "2025-08-07", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "qwen/qwen-image", + "modelKey": "qwen/qwen-image", + "displayName": "Qwen Image", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "regolo-ai", + "providerName": "Regolo AI", + "providerApi": "https://api.regolo.ai/v1", + "providerDoc": "https://docs.regolo.ai/", + "model": "qwen-image", + "modelKey": "qwen-image", + "displayName": "Qwen-Image", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-03-01", + "openWeights": false, + "releaseDate": "2026-03-01" + } + } + ] + }, + { + "id": "alibaba/qwen-image-2.0", + "provider": "alibaba", + "model": "qwen-image-2.0", + "displayName": "Qwen Image 2.0", + "family": "qwen", + "mode": "image_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "alibaba-token-plan", + "alibaba-token-plan-cn", + "dashscope" + ], + "aliases": [ + "alibaba-token-plan-cn/qwen-image-2.0", + "alibaba-token-plan/qwen-image-2.0", + "dashscope/qwen-image-2.0" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 8192, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": true, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "qwen-image-2.0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "qwen-image-2.0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen-image-2.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Image 2.0" + ], + "families": [ + "qwen" + ], + "modes": [ + "image_generation" + ], + "releaseDate": "2026-03-03", + "lastUpdated": "2026-03-03", + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "qwen-image-2.0", + "modelKey": "qwen-image-2.0", + "displayName": "Qwen Image 2.0", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "qwen-image-2.0", + "modelKey": "qwen-image-2.0", + "displayName": "Qwen Image 2.0", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen-image-2.0", + "mode": "image_generation", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "alibaba/qwen-image-2.0-pro", + "provider": "alibaba", + "model": "qwen-image-2.0-pro", + "displayName": "Qwen Image 2.0 Pro", + "family": "qwen", + "mode": "image_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "alibaba-token-plan", + "alibaba-token-plan-cn", + "dashscope" + ], + "aliases": [ + "alibaba-token-plan-cn/qwen-image-2.0-pro", + "alibaba-token-plan/qwen-image-2.0-pro", + "dashscope/qwen-image-2.0-pro" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 8192, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": true, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "qwen-image-2.0-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "qwen-image-2.0-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen-image-2.0-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Image 2.0 Pro" + ], + "families": [ + "qwen" + ], + "modes": [ + "image_generation" + ], + "releaseDate": "2026-03-03", + "lastUpdated": "2026-03-03", + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "qwen-image-2.0-pro", + "modelKey": "qwen-image-2.0-pro", + "displayName": "Qwen Image 2.0 Pro", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "qwen-image-2.0-pro", + "modelKey": "qwen-image-2.0-pro", + "displayName": "Qwen Image 2.0 Pro", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen-image-2.0-pro", + "mode": "image_generation", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "alibaba/qwen-image-edit", + "provider": "alibaba", + "model": "qwen-image-edit", + "displayName": "Qwen Image Edit", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/qwen/qwen-image-edit" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "qwen/qwen-image-edit", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Image Edit" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-08-19", + "lastUpdated": "2025-08-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "qwen/qwen-image-edit", + "modelKey": "qwen/qwen-image-edit", + "displayName": "Qwen Image Edit", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-08-19", + "openWeights": false, + "releaseDate": "2025-08-19" + } + } + ] + }, + { + "id": "alibaba/qwen-long", + "provider": "alibaba", + "model": "qwen-long", + "displayName": "Qwen Long", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-cn", + "nano-gpt" + ], + "aliases": [ + "alibaba-cn/qwen-long", + "nano-gpt/qwen-long" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 10000000, + "inputTokens": 10000000, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen-long", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.072, + "output": 0.287 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen-long", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1003, + "output": 0.408 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Long", + "Qwen Long 10M" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-01-25", + "lastUpdated": "2025-01-25", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-long", + "modelKey": "qwen-long", + "displayName": "Qwen Long", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-01-25", + "openWeights": false, + "releaseDate": "2025-01-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen-long", + "modelKey": "qwen-long", + "displayName": "Qwen Long 10M", + "metadata": { + "lastUpdated": "2025-01-25", + "openWeights": false, + "releaseDate": "2025-01-25" + } + } + ] + }, + { + "id": "alibaba/qwen-math-plus", + "provider": "alibaba", + "model": "qwen-math-plus", + "displayName": "Qwen Math Plus", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen-math-plus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 3072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen-math-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.574, + "output": 1.721 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Math Plus" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-08-16", + "lastUpdated": "2024-09-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-math-plus", + "modelKey": "qwen-math-plus", + "displayName": "Qwen Math Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-09-19", + "openWeights": false, + "releaseDate": "2024-08-16" + } + } + ] + }, + { + "id": "alibaba/qwen-math-turbo", + "provider": "alibaba", + "model": "qwen-math-turbo", + "displayName": "Qwen Math Turbo", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen-math-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 3072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen-math-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.287, + "output": 0.861 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Math Turbo" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-09-19", + "lastUpdated": "2024-09-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-math-turbo", + "modelKey": "qwen-math-turbo", + "displayName": "Qwen Math Turbo", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-09-19", + "openWeights": false, + "releaseDate": "2024-09-19" + } + } + ] + }, + { + "id": "alibaba/qwen-max", + "provider": "alibaba", + "model": "qwen-max", + "displayName": "Qwen Max", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "dashscope", + "llmgateway", + "nano-gpt" + ], + "aliases": [ + "alibaba-cn/qwen-max", + "alibaba/qwen-max", + "dashscope/qwen-max", + "llmgateway/qwen-max", + "nano-gpt/qwen-max" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 131072, + "inputTokens": 32000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.345, + "output": 1.377 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.6, + "output": 6.4 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.6, + "output": 6.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5997, + "output": 6.392 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen-max", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.6, + "output": 6.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 2.5 Max", + "Qwen Max" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-04-03", + "lastUpdated": "2025-01-25", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-max", + "modelKey": "qwen-max", + "displayName": "Qwen Max", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-01-25", + "openWeights": false, + "releaseDate": "2024-04-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-max", + "modelKey": "qwen-max", + "displayName": "Qwen Max", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-01-25", + "openWeights": false, + "releaseDate": "2024-04-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen-max", + "modelKey": "qwen-max", + "displayName": "Qwen Max", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-01-25", + "openWeights": false, + "releaseDate": "2024-04-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen-max", + "modelKey": "qwen-max", + "displayName": "Qwen 2.5 Max", + "metadata": { + "lastUpdated": "2024-04-03", + "openWeights": false, + "releaseDate": "2024-04-03" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen-max", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen-max-2025-01-25", + "provider": "alibaba", + "model": "qwen-max-2025-01-25", + "displayName": "Qwen2.5-Max-2025-01-25", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/qwen-max-2025-01-25" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Qwen2.5-Max-2025-01-25" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen-max-2025-01-25", + "modelKey": "qwen-max-2025-01-25", + "displayName": "Qwen2.5-Max-2025-01-25", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + } + ] + }, + { + "id": "alibaba/qwen-max-latest", + "provider": "alibaba", + "model": "qwen-max-latest", + "displayName": "Qwen-Max-Latest", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai", + "llmgateway" + ], + "aliases": [ + "302ai/qwen-max-latest", + "llmgateway/qwen-max-latest" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "qwen-max-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.343, + "output": 1.372 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen-max-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.345, + "output": 1.377 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Max Latest", + "Qwen-Max-Latest" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-11", + "releaseDate": "2024-04-03", + "lastUpdated": "2025-01-25", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "qwen-max-latest", + "modelKey": "qwen-max-latest", + "displayName": "Qwen-Max-Latest", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2025-01-25", + "openWeights": false, + "releaseDate": "2024-04-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen-max-latest", + "modelKey": "qwen-max-latest", + "displayName": "Qwen Max Latest", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-01-25", + "openWeights": false, + "releaseDate": "2025-01-25" + } + } + ] + }, + { + "id": "alibaba/qwen-mt-plus", + "provider": "alibaba", + "model": "qwen-mt-plus", + "displayName": "Qwen-MT Plus", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "novita", + "novita-ai" + ], + "aliases": [ + "alibaba-cn/qwen-mt-plus", + "alibaba/qwen-mt-plus", + "novita-ai/qwen/qwen-mt-plus", + "novita/qwen/qwen-mt-plus" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen-mt-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.259, + "output": 0.775 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen-mt-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.46, + "output": 7.37 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen-mt-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 0.75 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen-mt-plus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 0.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen MT Plus", + "Qwen-MT Plus" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-01", + "lastUpdated": "2025-01", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-mt-plus", + "modelKey": "qwen-mt-plus", + "displayName": "Qwen-MT Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-01", + "openWeights": false, + "releaseDate": "2025-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-mt-plus", + "modelKey": "qwen-mt-plus", + "displayName": "Qwen-MT Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-01", + "openWeights": false, + "releaseDate": "2025-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen-mt-plus", + "modelKey": "qwen/qwen-mt-plus", + "displayName": "Qwen MT Plus", + "metadata": { + "lastUpdated": "2025-09-03", + "openWeights": true, + "releaseDate": "2025-09-03" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen-mt-plus", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen-mt-turbo", + "provider": "alibaba", + "model": "qwen-mt-turbo", + "displayName": "Qwen-MT Turbo", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen-mt-turbo", + "alibaba/qwen-mt-turbo" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen-mt-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.101, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen-mt-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.16, + "output": 0.49 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen-MT Turbo" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-01", + "lastUpdated": "2025-01", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-mt-turbo", + "modelKey": "qwen-mt-turbo", + "displayName": "Qwen-MT Turbo", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-01", + "openWeights": false, + "releaseDate": "2025-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-mt-turbo", + "modelKey": "qwen-mt-turbo", + "displayName": "Qwen-MT Turbo", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-01", + "openWeights": false, + "releaseDate": "2025-01" + } + } + ] + }, + { + "id": "alibaba/qwen-omni-turbo", + "provider": "alibaba", + "model": "qwen-omni-turbo", + "displayName": "Qwen-Omni Turbo", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "llmgateway" + ], + "aliases": [ + "alibaba-cn/qwen-omni-turbo", + "alibaba/qwen-omni-turbo", + "llmgateway/qwen-omni-turbo" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 32768, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen-omni-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.058, + "inputAudio": 3.584, + "output": 0.23, + "outputAudio": 7.168 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen-omni-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "inputAudio": 4.44, + "output": 0.27, + "outputAudio": 8.89 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen-omni-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "inputAudio": 4.44, + "output": 0.27, + "outputAudio": 8.89 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen-Omni Turbo" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-01-19", + "lastUpdated": "2025-03-26", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-omni-turbo", + "modelKey": "qwen-omni-turbo", + "displayName": "Qwen-Omni Turbo", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-03-26", + "openWeights": false, + "releaseDate": "2025-01-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-omni-turbo", + "modelKey": "qwen-omni-turbo", + "displayName": "Qwen-Omni Turbo", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-03-26", + "openWeights": false, + "releaseDate": "2025-01-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen-omni-turbo", + "modelKey": "qwen-omni-turbo", + "displayName": "Qwen-Omni Turbo", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-03-26", + "openWeights": false, + "releaseDate": "2025-01-19" + } + } + ] + }, + { + "id": "alibaba/qwen-omni-turbo-realtime", + "provider": "alibaba", + "model": "qwen-omni-turbo-realtime", + "displayName": "Qwen-Omni Turbo Realtime", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen-omni-turbo-realtime", + "alibaba/qwen-omni-turbo-realtime" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 32768, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen-omni-turbo-realtime", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.23, + "inputAudio": 3.584, + "output": 0.918, + "outputAudio": 7.168 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen-omni-turbo-realtime", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "inputAudio": 4.44, + "output": 1.07, + "outputAudio": 8.89 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen-Omni Turbo Realtime" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-05-08", + "lastUpdated": "2025-05-08", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-omni-turbo-realtime", + "modelKey": "qwen-omni-turbo-realtime", + "displayName": "Qwen-Omni Turbo Realtime", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-05-08", + "openWeights": false, + "releaseDate": "2025-05-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-omni-turbo-realtime", + "modelKey": "qwen-omni-turbo-realtime", + "displayName": "Qwen-Omni Turbo Realtime", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-05-08", + "openWeights": false, + "releaseDate": "2025-05-08" + } + } + ] + }, + { + "id": "alibaba/qwen-plus", + "provider": "alibaba", + "model": "qwen-plus", + "displayName": "Qwen Plus", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "alibaba", + "alibaba-cn", + "dashscope", + "kilo", + "llmgateway", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "302ai/qwen-plus", + "alibaba-cn/qwen-plus", + "alibaba/qwen-plus", + "dashscope/qwen-plus", + "kilo/qwen/qwen-plus", + "llmgateway/qwen-plus", + "nano-gpt/qwen-plus", + "openrouter/qwen/qwen-plus" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 1000000, + "inputTokens": 995904, + "maxTokens": 16384, + "outputTokens": 32768, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "qwen-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.115, + "output": 0.287, + "reasoningOutput": 1.147 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.2, + "reasoningOutput": 4 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.4, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.2, + "reasoningOutput": 4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3995, + "output": 1.2002 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.052, + "cacheWrite": 0.325, + "input": 0.26, + "output": 0.78 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen-plus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 1.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen-plus", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.052, + "cacheWrite": 0.325, + "input": 0.26, + "output": 0.78 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Plus", + "Qwen-Plus", + "Qwen: Qwen-Plus" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "supportedParameters": [ + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "qwen-plus", + "modelKey": "qwen-plus", + "displayName": "Qwen-Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-07-23", + "openWeights": false, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-plus", + "modelKey": "qwen-plus", + "displayName": "Qwen Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-09-11", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-plus", + "modelKey": "qwen-plus", + "displayName": "Qwen Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-09-11", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen-plus", + "modelKey": "qwen/qwen-plus", + "displayName": "Qwen: Qwen-Plus", + "metadata": { + "lastUpdated": "2025-09-11", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen-plus", + "modelKey": "qwen-plus", + "displayName": "Qwen Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-09-11", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen-plus", + "modelKey": "qwen-plus", + "displayName": "Qwen Plus", + "metadata": { + "lastUpdated": "2024-01-25", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen-plus", + "modelKey": "qwen/qwen-plus", + "displayName": "Qwen Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-09-11", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen-plus", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen-plus", + "displayName": "Qwen: Qwen-Plus", + "metadata": { + "canonicalSlug": "qwen/qwen-plus-2025-01-25", + "createdAt": "2025-02-01T11:37:20.000Z", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/qwen/qwen-plus-2025-01-25/endpoints" + }, + "supportedParameters": [ + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen-plus-2025-01-25", + "provider": "alibaba", + "model": "qwen-plus-2025-01-25", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "dashscope" + ], + "aliases": [ + "dashscope/qwen-plus-2025-01-25" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 129024, + "inputTokens": 129024, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen-plus-2025-01-25", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen-plus-2025-01-25", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen-plus-2025-04-28", + "provider": "alibaba", + "model": "qwen-plus-2025-04-28", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "dashscope" + ], + "aliases": [ + "dashscope/qwen-plus-2025-04-28" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 129024, + "inputTokens": 129024, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen-plus-2025-04-28", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 1.2, + "reasoningOutput": 4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen-plus-2025-04-28", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen-plus-2025-07-14", + "provider": "alibaba", + "model": "qwen-plus-2025-07-14", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "dashscope" + ], + "aliases": [ + "dashscope/qwen-plus-2025-07-14" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 129024, + "inputTokens": 129024, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen-plus-2025-07-14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 1.2, + "reasoningOutput": 4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen-plus-2025-07-14", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen-plus-2025-07-28", + "provider": "alibaba", + "model": "qwen-plus-2025-07-28", + "displayName": "Qwen: Qwen Plus 0728", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "dashscope", + "kilo", + "openrouter" + ], + "aliases": [ + "dashscope/qwen-plus-2025-07-28", + "kilo/qwen/qwen-plus-2025-07-28", + "openrouter/qwen/qwen-plus-2025-07-28" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1000000, + "inputTokens": 997952, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen-plus-2025-07-28", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.26, + "output": 0.78 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen-plus-2025-07-28", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.26, + "output": 0.78 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen-plus-2025-07-28", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen-plus-2025-07-28", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.26, + "output": 0.78 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Plus 0728", + "Qwen: Qwen Plus 0728" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-09-09", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen-plus-2025-07-28", + "modelKey": "qwen/qwen-plus-2025-07-28", + "displayName": "Qwen: Qwen Plus 0728", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-09-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen-plus-2025-07-28", + "modelKey": "qwen/qwen-plus-2025-07-28", + "displayName": "Qwen Plus 0728", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-09-08", + "openWeights": false, + "releaseDate": "2025-09-08" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen-plus-2025-07-28", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen-plus-2025-07-28", + "displayName": "Qwen: Qwen Plus 0728", + "metadata": { + "canonicalSlug": "qwen/qwen-plus-2025-07-28", + "createdAt": "2025-09-08T16:06:39.000Z", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/qwen/qwen-plus-2025-07-28/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen-plus-2025-07-28:thinking", + "provider": "alibaba", + "model": "qwen-plus-2025-07-28:thinking", + "displayName": "Qwen: Qwen Plus 0728 (thinking)", + "family": "qwen", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/qwen/qwen-plus-2025-07-28:thinking", + "openrouter/qwen/qwen-plus-2025-07-28:thinking" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1000000, + "outputTokens": 32768, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen-plus-2025-07-28:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.26, + "output": 0.78 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen-plus-2025-07-28:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 0.325, + "input": 0.26, + "output": 0.78 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen-plus-2025-07-28:thinking", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheWrite": 0.325, + "input": 0.26, + "output": 0.78 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Plus 0728 (thinking)", + "Qwen: Qwen Plus 0728 (thinking)" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-09-09", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen-plus-2025-07-28:thinking", + "modelKey": "qwen/qwen-plus-2025-07-28:thinking", + "displayName": "Qwen: Qwen Plus 0728 (thinking)", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-09-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen-plus-2025-07-28:thinking", + "modelKey": "qwen/qwen-plus-2025-07-28:thinking", + "displayName": "Qwen Plus 0728 (thinking)", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-09-08", + "openWeights": false, + "releaseDate": "2025-09-08", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1, + "max": 81920 + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen-plus-2025-07-28:thinking", + "displayName": "Qwen: Qwen Plus 0728 (thinking)", + "metadata": { + "canonicalSlug": "qwen/qwen-plus-2025-07-28", + "createdAt": "2025-09-08T16:06:39.000Z", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/qwen/qwen-plus-2025-07-28/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen-plus-2025-09-11", + "provider": "alibaba", + "model": "qwen-plus-2025-09-11", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "dashscope" + ], + "aliases": [ + "dashscope/qwen-plus-2025-09-11" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 997952, + "inputTokens": 997952, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen-plus-2025-09-11", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen-plus-2025-09-11", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen-plus-character", + "provider": "alibaba", + "model": "qwen-plus-character", + "displayName": "Qwen Plus Character", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen-plus-character" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen-plus-character", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.115, + "output": 0.287 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Plus Character" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-01", + "lastUpdated": "2024-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-plus-character", + "modelKey": "qwen-plus-character", + "displayName": "Qwen Plus Character", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-01", + "openWeights": false, + "releaseDate": "2024-01" + } + } + ] + }, + { + "id": "alibaba/qwen-plus-character-ja", + "provider": "alibaba", + "model": "qwen-plus-character-ja", + "displayName": "Qwen Plus Character (Japanese)", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba" + ], + "aliases": [ + "alibaba/qwen-plus-character-ja" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 512, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen-plus-character-ja", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Plus Character (Japanese)" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-01", + "lastUpdated": "2024-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-plus-character-ja", + "modelKey": "qwen-plus-character-ja", + "displayName": "Qwen Plus Character (Japanese)", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-01", + "openWeights": false, + "releaseDate": "2024-01" + } + } + ] + }, + { + "id": "alibaba/qwen-plus-latest", + "provider": "alibaba", + "model": "qwen-plus-latest", + "displayName": "Qwen Plus Latest", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "dashscope", + "llmgateway" + ], + "aliases": [ + "dashscope/qwen-plus-latest", + "llmgateway/qwen-plus-latest" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 997952, + "inputTokens": 997952, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen-plus-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.115, + "output": 0.287 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen-plus-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Plus Latest" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-01-25", + "lastUpdated": "2025-01-25", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen-plus-latest", + "modelKey": "qwen-plus-latest", + "displayName": "Qwen Plus Latest", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-01-25", + "openWeights": false, + "releaseDate": "2025-01-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen-plus-latest", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen-qwq-32b-preview", + "provider": "alibaba", + "model": "qwen-qwq-32b-preview", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen-qwq-32b-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen-qwq-32b-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen-qwq-32b-preview", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen-sea-lion-v4-32b-it", + "provider": "alibaba", + "model": "qwen-sea-lion-v4-32b-it", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "publicai" + ], + "aliases": [ + "publicai/aisingapore/Qwen-SEA-LION-v4-32B-IT" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "publicai", + "model": "publicai/aisingapore/Qwen-SEA-LION-v4-32B-IT", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "publicai", + "model": "publicai/aisingapore/Qwen-SEA-LION-v4-32B-IT", + "mode": "chat", + "metadata": { + "source": "https://platform.publicai.co/docs" + } + } + ] + }, + { + "id": "alibaba/qwen-turbo", + "provider": "alibaba", + "model": "qwen-turbo", + "displayName": "Qwen Turbo", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "dashscope", + "llmgateway", + "nano-gpt", + "qiniu-ai" + ], + "aliases": [ + "alibaba-cn/qwen-turbo", + "alibaba/qwen-turbo", + "dashscope/qwen-turbo", + "llmgateway/qwen-turbo", + "nano-gpt/qwen-turbo", + "qiniu-ai/qwen-turbo" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.044, + "output": 0.087, + "reasoningOutput": 0.431 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.2, + "reasoningOutput": 0.5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.2, + "reasoningOutput": 0.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04998, + "output": 0.2006 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.2, + "reasoningOutput": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen Turbo", + "Qwen-Turbo" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-11-01", + "lastUpdated": "2025-07-15", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-turbo", + "modelKey": "qwen-turbo", + "displayName": "Qwen Turbo", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-07-15", + "openWeights": false, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-turbo", + "modelKey": "qwen-turbo", + "displayName": "Qwen Turbo", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-28", + "openWeights": false, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen-turbo", + "modelKey": "qwen-turbo", + "displayName": "Qwen Turbo", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-28", + "openWeights": false, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen-turbo", + "modelKey": "qwen-turbo", + "displayName": "Qwen Turbo", + "metadata": { + "lastUpdated": "2024-11-01", + "openWeights": false, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen-turbo", + "modelKey": "qwen-turbo", + "displayName": "Qwen-Turbo", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen-turbo", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen-turbo-2024-11-01", + "provider": "alibaba", + "model": "qwen-turbo-2024-11-01", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "dashscope" + ], + "aliases": [ + "dashscope/qwen-turbo-2024-11-01" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen-turbo-2024-11-01", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen-turbo-2024-11-01", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen-turbo-2025-04-28", + "provider": "alibaba", + "model": "qwen-turbo-2025-04-28", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "dashscope" + ], + "aliases": [ + "dashscope/qwen-turbo-2025-04-28" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen-turbo-2025-04-28", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.2, + "reasoningOutput": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen-turbo-2025-04-28", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen-turbo-latest", + "provider": "alibaba", + "model": "qwen-turbo-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "dashscope" + ], + "aliases": [ + "dashscope/qwen-turbo-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen-turbo-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.2, + "reasoningOutput": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen-turbo-latest", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen-v2p5-14b-instruct", + "provider": "alibaba", + "model": "qwen-v2p5-14b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen-v2p5-14b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen-v2p5-14b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen-v2p5-14b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen-v2p5-7b", + "provider": "alibaba", + "model": "qwen-v2p5-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen-v2p5-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen-v2p5-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen-v2p5-7b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen-vl-max", + "provider": "alibaba", + "model": "qwen-vl-max", + "displayName": "Qwen-VL Max", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "llmgateway" + ], + "aliases": [ + "alibaba-cn/qwen-vl-max", + "alibaba/qwen-vl-max", + "llmgateway/qwen-vl-max" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen-vl-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.23, + "output": 0.574 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen-vl-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen-vl-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 3.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen-VL Max" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-04-08", + "lastUpdated": "2025-08-13", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-vl-max", + "modelKey": "qwen-vl-max", + "displayName": "Qwen-VL Max", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-08-13", + "openWeights": false, + "releaseDate": "2024-04-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-vl-max", + "modelKey": "qwen-vl-max", + "displayName": "Qwen-VL Max", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-08-13", + "openWeights": false, + "releaseDate": "2024-04-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen-vl-max", + "modelKey": "qwen-vl-max", + "displayName": "Qwen-VL Max", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-08-13", + "openWeights": false, + "releaseDate": "2024-04-08" + } + } + ] + }, + { + "id": "alibaba/qwen-vl-max-2025-01-25", + "provider": "alibaba", + "model": "qwen-vl-max-2025-01-25", + "displayName": "Qwen VL-MAX-2025-01-25", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/qwen-vl-max-2025-01-25" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Qwen VL-MAX-2025-01-25" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen-vl-max-2025-01-25", + "modelKey": "qwen-vl-max-2025-01-25", + "displayName": "Qwen VL-MAX-2025-01-25", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + } + ] + }, + { + "id": "alibaba/qwen-vl-ocr", + "provider": "alibaba", + "model": "qwen-vl-ocr", + "displayName": "Qwen-VL OCR", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen-vl-ocr", + "alibaba/qwen-vl-ocr" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 34096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen-vl-ocr", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.717, + "output": 0.717 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen-vl-ocr", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen-VL OCR" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-10-28", + "lastUpdated": "2025-04-13", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-vl-ocr", + "modelKey": "qwen-vl-ocr", + "displayName": "Qwen-VL OCR", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-13", + "openWeights": false, + "releaseDate": "2024-10-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-vl-ocr", + "modelKey": "qwen-vl-ocr", + "displayName": "Qwen-VL OCR", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-13", + "openWeights": false, + "releaseDate": "2024-10-28" + } + } + ] + }, + { + "id": "alibaba/qwen-vl-plus", + "provider": "alibaba", + "model": "qwen-vl-plus", + "displayName": "Qwen-VL Plus", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "llmgateway", + "openrouter" + ], + "aliases": [ + "alibaba-cn/qwen-vl-plus", + "alibaba/qwen-vl-plus", + "llmgateway/qwen-vl-plus", + "openrouter/qwen/qwen-vl-plus" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 131072, + "inputTokens": 8192, + "maxTokens": 2048, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen-vl-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.115, + "output": 0.287 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen-vl-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.21, + "output": 0.63 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen-vl-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.21, + "output": 0.63 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/qwen/qwen-vl-plus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.21, + "output": 0.63 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen-VL Plus" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-01-25", + "lastUpdated": "2025-08-15", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-vl-plus", + "modelKey": "qwen-vl-plus", + "displayName": "Qwen-VL Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-08-15", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen-vl-plus", + "modelKey": "qwen-vl-plus", + "displayName": "Qwen-VL Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-08-15", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen-vl-plus", + "modelKey": "qwen-vl-plus", + "displayName": "Qwen-VL Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-08-15", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/qwen/qwen-vl-plus", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen.qwen3-235b-a22b-2507-v1:0", + "provider": "alibaba", + "model": "qwen.qwen3-235b-a22b-2507-v1:0", + "displayName": "Qwen3 235B A22B 2507", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/qwen.qwen3-235b-a22b-2507-v1:0", + "bedrock_converse/qwen.qwen3-235b-a22b-2507-v1:0" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStructuredOutput": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "qwen.qwen3-235b-a22b-2507-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.22, + "output": 0.88 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "qwen.qwen3-235b-a22b-2507-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.22, + "output": 0.88 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 235B A22B 2507" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-09-18", + "lastUpdated": "2025-09-18", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "qwen.qwen3-235b-a22b-2507-v1:0", + "modelKey": "qwen.qwen3-235b-a22b-2507-v1:0", + "displayName": "Qwen3 235B A22B 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-09-18", + "openWeights": true, + "releaseDate": "2025-09-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "qwen.qwen3-235b-a22b-2507-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen.qwen3-32b-v1:0", + "provider": "alibaba", + "model": "qwen.qwen3-32b-v1:0", + "displayName": "Qwen3 32B (dense)", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/qwen.qwen3-32b-v1:0", + "bedrock_converse/qwen.qwen3-32b-v1:0" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStructuredOutput": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "qwen.qwen3-32b-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "qwen.qwen3-32b-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 32B (dense)" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-09-18", + "lastUpdated": "2025-09-18", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "qwen.qwen3-32b-v1:0", + "modelKey": "qwen.qwen3-32b-v1:0", + "displayName": "Qwen3 32B (dense)", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-09-18", + "openWeights": true, + "releaseDate": "2025-09-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "qwen.qwen3-32b-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen.qwen3-coder-30b-a3b-v1:0", + "provider": "alibaba", + "model": "qwen.qwen3-coder-30b-a3b-v1:0", + "displayName": "Qwen3 Coder 30B A3B Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/qwen.qwen3-coder-30b-a3b-v1:0", + "bedrock_converse/qwen.qwen3-coder-30b-a3b-v1:0" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStructuredOutput": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "qwen.qwen3-coder-30b-a3b-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "qwen.qwen3-coder-30b-a3b-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 Coder 30B A3B Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-09-18", + "lastUpdated": "2025-09-18", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "qwen.qwen3-coder-30b-a3b-v1:0", + "modelKey": "qwen.qwen3-coder-30b-a3b-v1:0", + "displayName": "Qwen3 Coder 30B A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-09-18", + "openWeights": false, + "releaseDate": "2025-09-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "qwen.qwen3-coder-30b-a3b-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen.qwen3-coder-480b-a35b-v1:0", + "provider": "alibaba", + "model": "qwen.qwen3-coder-480b-a35b-v1:0", + "displayName": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/qwen.qwen3-coder-480b-a35b-v1:0", + "bedrock_converse/qwen.qwen3-coder-480b-a35b-v1:0" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262000, + "inputTokens": 262000, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStructuredOutput": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "qwen.qwen3-coder-480b-a35b-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.22, + "output": 1.8 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "qwen.qwen3-coder-480b-a35b-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.22, + "output": 1.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 Coder 480B A35B Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-09-18", + "lastUpdated": "2025-09-18", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "qwen.qwen3-coder-480b-a35b-v1:0", + "modelKey": "qwen.qwen3-coder-480b-a35b-v1:0", + "displayName": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-09-18", + "openWeights": true, + "releaseDate": "2025-09-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "qwen.qwen3-coder-480b-a35b-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen.qwen3-coder-next", + "provider": "alibaba", + "model": "qwen.qwen3-coder-next", + "displayName": "Qwen3 Coder Next", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/qwen.qwen3-coder-next", + "bedrock_converse/qwen.qwen3-coder-next" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 8192, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "qwen.qwen3-coder-next", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.22, + "output": 1.8 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "qwen.qwen3-coder-next", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 Coder Next" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-02-06", + "lastUpdated": "2026-02-06", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "qwen.qwen3-coder-next", + "modelKey": "qwen.qwen3-coder-next", + "displayName": "Qwen3 Coder Next", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-06", + "openWeights": true, + "releaseDate": "2026-02-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "qwen.qwen3-coder-next", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "alibaba/qwen.qwen3-next-80b-a3b", + "provider": "alibaba", + "model": "qwen.qwen3-next-80b-a3b", + "displayName": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/qwen.qwen3-next-80b-a3b", + "bedrock_converse/qwen.qwen3-next-80b-a3b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 262000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStructuredOutput": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "qwen.qwen3-next-80b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 1.4 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "qwen.qwen3-next-80b-a3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3-Next-80B-A3B-Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-09-18", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "qwen.qwen3-next-80b-a3b", + "modelKey": "qwen.qwen3-next-80b-a3b", + "displayName": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-09-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "qwen.qwen3-next-80b-a3b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen.qwen3-vl-235b-a22b", + "provider": "alibaba", + "model": "qwen.qwen3-vl-235b-a22b", + "displayName": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/qwen.qwen3-vl-235b-a22b", + "bedrock_converse/qwen.qwen3-vl-235b-a22b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 262000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStructuredOutput": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "qwen.qwen3-vl-235b-a22b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "qwen.qwen3-vl-235b-a22b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.53, + "output": 2.66 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3-VL-235B-A22B-Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-10-04", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "qwen.qwen3-vl-235b-a22b", + "modelKey": "qwen.qwen3-vl-235b-a22b", + "displayName": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-04" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "qwen.qwen3-vl-235b-a22b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen1p5-72b-chat", + "provider": "alibaba", + "model": "qwen1p5-72b-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen1p5-72b-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen1p5-72b-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen1p5-72b-chat", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2-5-14b-instruct", + "provider": "alibaba", + "model": "qwen2-5-14b-instruct", + "displayName": "Qwen2.5 14B Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen2-5-14b-instruct", + "alibaba/qwen2-5-14b-instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen2-5-14b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.144, + "output": 0.431 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen2-5-14b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.35, + "output": 1.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen2.5 14B Instruct" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-09", + "lastUpdated": "2024-09", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-14b-instruct", + "modelKey": "qwen2-5-14b-instruct", + "displayName": "Qwen2.5 14B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-09", + "openWeights": true, + "releaseDate": "2024-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-14b-instruct", + "modelKey": "qwen2-5-14b-instruct", + "displayName": "Qwen2.5 14B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-09", + "openWeights": true, + "releaseDate": "2024-09" + } + } + ] + }, + { + "id": "alibaba/qwen2-5-32b-instruct", + "provider": "alibaba", + "model": "qwen2-5-32b-instruct", + "displayName": "Qwen2.5 32B Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen2-5-32b-instruct", + "alibaba/qwen2-5-32b-instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen2-5-32b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.287, + "output": 0.861 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen2-5-32b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 2.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen2.5 32B Instruct" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-09", + "lastUpdated": "2024-09", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-32b-instruct", + "modelKey": "qwen2-5-32b-instruct", + "displayName": "Qwen2.5 32B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-09", + "openWeights": true, + "releaseDate": "2024-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-32b-instruct", + "modelKey": "qwen2-5-32b-instruct", + "displayName": "Qwen2.5 32B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-09", + "openWeights": true, + "releaseDate": "2024-09" + } + } + ] + }, + { + "id": "alibaba/qwen2-5-72b-instruct", + "provider": "alibaba", + "model": "qwen2-5-72b-instruct", + "displayName": "Qwen2.5 72B Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen2-5-72b-instruct", + "alibaba/qwen2-5-72b-instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen2-5-72b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.574, + "output": 1.721 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen2-5-72b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.4, + "output": 5.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen2.5 72B Instruct" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-09", + "lastUpdated": "2024-09", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-72b-instruct", + "modelKey": "qwen2-5-72b-instruct", + "displayName": "Qwen2.5 72B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-09", + "openWeights": true, + "releaseDate": "2024-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-72b-instruct", + "modelKey": "qwen2-5-72b-instruct", + "displayName": "Qwen2.5 72B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-09", + "openWeights": true, + "releaseDate": "2024-09" + } + } + ] + }, + { + "id": "alibaba/qwen2-5-7b-instruct", + "provider": "alibaba", + "model": "qwen2-5-7b-instruct", + "displayName": "Qwen2.5 7B Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen2-5-7b-instruct", + "alibaba/qwen2-5-7b-instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen2-5-7b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.072, + "output": 0.144 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen2-5-7b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.175, + "output": 0.7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen2.5 7B Instruct" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-09", + "lastUpdated": "2024-09", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-7b-instruct", + "modelKey": "qwen2-5-7b-instruct", + "displayName": "Qwen2.5 7B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-09", + "openWeights": true, + "releaseDate": "2024-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-7b-instruct", + "modelKey": "qwen2-5-7b-instruct", + "displayName": "Qwen2.5 7B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-09", + "openWeights": true, + "releaseDate": "2024-09" + } + } + ] + }, + { + "id": "alibaba/qwen2-5-coder-32b-instruct", + "provider": "alibaba", + "model": "qwen2-5-coder-32b-instruct", + "displayName": "Qwen2.5-Coder 32B Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen2-5-coder-32b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen2-5-coder-32b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.287, + "output": 0.861 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen2.5-Coder 32B Instruct" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-11", + "lastUpdated": "2024-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-coder-32b-instruct", + "modelKey": "qwen2-5-coder-32b-instruct", + "displayName": "Qwen2.5-Coder 32B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-11", + "openWeights": true, + "releaseDate": "2024-11" + } + } + ] + }, + { + "id": "alibaba/qwen2-5-coder-7b-instruct", + "provider": "alibaba", + "model": "qwen2-5-coder-7b-instruct", + "displayName": "Qwen2.5-Coder 7B Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen2-5-coder-7b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen2-5-coder-7b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.144, + "output": 0.287 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen2.5-Coder 7B Instruct" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-11", + "lastUpdated": "2024-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-coder-7b-instruct", + "modelKey": "qwen2-5-coder-7b-instruct", + "displayName": "Qwen2.5-Coder 7B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-11", + "openWeights": true, + "releaseDate": "2024-11" + } + } + ] + }, + { + "id": "alibaba/qwen2-5-math-72b-instruct", + "provider": "alibaba", + "model": "qwen2-5-math-72b-instruct", + "displayName": "Qwen2.5-Math 72B Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen2-5-math-72b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 3072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen2-5-math-72b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.574, + "output": 1.721 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen2.5-Math 72B Instruct" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-09", + "lastUpdated": "2024-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-math-72b-instruct", + "modelKey": "qwen2-5-math-72b-instruct", + "displayName": "Qwen2.5-Math 72B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-09", + "openWeights": true, + "releaseDate": "2024-09" + } + } + ] + }, + { + "id": "alibaba/qwen2-5-math-7b-instruct", + "provider": "alibaba", + "model": "qwen2-5-math-7b-instruct", + "displayName": "Qwen2.5-Math 7B Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen2-5-math-7b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 3072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen2-5-math-7b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.144, + "output": 0.287 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen2.5-Math 7B Instruct" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-09", + "lastUpdated": "2024-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-math-7b-instruct", + "modelKey": "qwen2-5-math-7b-instruct", + "displayName": "Qwen2.5-Math 7B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-09", + "openWeights": true, + "releaseDate": "2024-09" + } + } + ] + }, + { + "id": "alibaba/qwen2-5-omni-7b", + "provider": "alibaba", + "model": "qwen2-5-omni-7b", + "displayName": "Qwen2.5-Omni 7B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen2-5-omni-7b", + "alibaba/qwen2-5-omni-7b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 32768, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen2-5-omni-7b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.087, + "inputAudio": 5.448, + "output": 0.345 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen2-5-omni-7b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "inputAudio": 6.76, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen2.5-Omni 7B" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-12", + "lastUpdated": "2024-12", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-omni-7b", + "modelKey": "qwen2-5-omni-7b", + "displayName": "Qwen2.5-Omni 7B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-12", + "openWeights": true, + "releaseDate": "2024-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-omni-7b", + "modelKey": "qwen2-5-omni-7b", + "displayName": "Qwen2.5-Omni 7B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-12", + "openWeights": true, + "releaseDate": "2024-12" + } + } + ] + }, + { + "id": "alibaba/qwen2-5-vl-32b-instruct", + "provider": "alibaba", + "model": "qwen2-5-vl-32b-instruct", + "displayName": "Qwen2.5 VL 32B Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/qwen2-5-vl-32b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen2-5-vl-32b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.4, + "output": 4.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen2.5 VL 32B Instruct" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-03-15", + "lastUpdated": "2025-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen2-5-vl-32b-instruct", + "modelKey": "qwen2-5-vl-32b-instruct", + "displayName": "Qwen2.5 VL 32B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-03-15", + "openWeights": true, + "releaseDate": "2025-03-15" + } + } + ] + }, + { + "id": "alibaba/qwen2-5-vl-72b-instruct", + "provider": "alibaba", + "model": "qwen2-5-vl-72b-instruct", + "displayName": "Qwen2.5-VL 72B Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "llmgateway" + ], + "aliases": [ + "alibaba-cn/qwen2-5-vl-72b-instruct", + "alibaba/qwen2-5-vl-72b-instruct", + "llmgateway/qwen2-5-vl-72b-instruct" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen2-5-vl-72b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.294, + "output": 6.881 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen2-5-vl-72b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.8, + "output": 8.4 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen2-5-vl-72b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.8, + "output": 8.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen2.5-VL 72B Instruct" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-09", + "lastUpdated": "2024-09", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-vl-72b-instruct", + "modelKey": "qwen2-5-vl-72b-instruct", + "displayName": "Qwen2.5-VL 72B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-09", + "openWeights": true, + "releaseDate": "2024-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-vl-72b-instruct", + "modelKey": "qwen2-5-vl-72b-instruct", + "displayName": "Qwen2.5-VL 72B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-09", + "openWeights": true, + "releaseDate": "2024-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen2-5-vl-72b-instruct", + "modelKey": "qwen2-5-vl-72b-instruct", + "displayName": "Qwen2.5-VL 72B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-09", + "openWeights": true, + "releaseDate": "2024-09" + } + } + ] + }, + { + "id": "alibaba/qwen2-5-vl-7b-instruct", + "provider": "alibaba", + "model": "qwen2-5-vl-7b-instruct", + "displayName": "Qwen2.5-VL 7B Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen2-5-vl-7b-instruct", + "alibaba/qwen2-5-vl-7b-instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen2-5-vl-7b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.287, + "output": 0.717 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen2-5-vl-7b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.35, + "output": 1.05 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen2.5-VL 7B Instruct" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-09", + "lastUpdated": "2024-09", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-vl-7b-instruct", + "modelKey": "qwen2-5-vl-7b-instruct", + "displayName": "Qwen2.5-VL 7B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-09", + "openWeights": true, + "releaseDate": "2024-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen2-5-vl-7b-instruct", + "modelKey": "qwen2-5-vl-7b-instruct", + "displayName": "Qwen2.5-VL 7B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-09", + "openWeights": true, + "releaseDate": "2024-09" + } + } + ] + }, + { + "id": "alibaba/qwen2-72b-instruct", + "provider": "alibaba", + "model": "qwen2-72b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2-72b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2-72b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2-72b-instruct", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "alibaba/qwen2-7b-instruct", + "provider": "alibaba", + "model": "qwen2-7b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2-7b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2-7b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2-7b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2-audio-7b-instruct", + "provider": "alibaba", + "model": "qwen2-audio-7b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "sambanova" + ], + "aliases": [ + "sambanova/Qwen2-Audio-7B-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "sambanova", + "model": "sambanova/Qwen2-Audio-7B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 100 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sambanova", + "model": "sambanova/Qwen2-Audio-7B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://cloud.sambanova.ai/plans/pricing" + } + } + ] + }, + { + "id": "alibaba/qwen2-vl-2b-instruct", + "provider": "alibaba", + "model": "qwen2-vl-2b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2-vl-2b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2-vl-2b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2-vl-2b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2-vl-72b-instruct", + "provider": "alibaba", + "model": "qwen2-vl-72b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai", + "nebius" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2-vl-72b-instruct", + "nebius/Qwen/Qwen2-VL-72B-Instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "functionCalling": true, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2-vl-72b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/Qwen/Qwen2-VL-72B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2-vl-72b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/Qwen/Qwen2-VL-72B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + } + ] + }, + { + "id": "alibaba/qwen2-vl-7b-instruct", + "provider": "alibaba", + "model": "qwen2-vl-7b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai", + "nebius" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2-vl-7b-instruct", + "nebius/Qwen/Qwen2-VL-7B-Instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2-vl-7b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/Qwen/Qwen2-VL-7B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0.06 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2-vl-7b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/Qwen/Qwen2-VL-7B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + } + ] + }, + { + "id": "alibaba/qwen2.5-14b-instruct", + "provider": "alibaba", + "model": "qwen2.5-14b-instruct", + "displayName": "Qwen/Qwen2.5-14B-Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "siliconflow-cn/Qwen/Qwen2.5-14B-Instruct", + "siliconflow/Qwen/Qwen2.5-14B-Instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 33000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen2.5-14B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen2.5-14B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen2.5-14B-Instruct" + ], + "families": [ + "qwen" + ], + "releaseDate": "2024-09-18", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen2.5-14B-Instruct", + "modelKey": "Qwen/Qwen2.5-14B-Instruct", + "displayName": "Qwen/Qwen2.5-14B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-09-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen2.5-14B-Instruct", + "modelKey": "Qwen/Qwen2.5-14B-Instruct", + "displayName": "Qwen/Qwen2.5-14B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-09-18" + } + } + ] + }, + { + "id": "alibaba/qwen2.5-32b-eva-v0.2", + "provider": "alibaba", + "model": "qwen2.5-32b-eva-v0.2", + "displayName": "Qwen 2.5 32b EVA", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen2.5-32B-EVA-v0.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 24576, + "inputTokens": 24576, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen2.5-32B-EVA-v0.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.493, + "output": 0.493 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 2.5 32b EVA" + ], + "releaseDate": "2024-09-01", + "lastUpdated": "2024-09-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen2.5-32B-EVA-v0.2", + "modelKey": "Qwen2.5-32B-EVA-v0.2", + "displayName": "Qwen 2.5 32b EVA", + "metadata": { + "lastUpdated": "2024-09-01", + "openWeights": false, + "releaseDate": "2024-09-01" + } + } + ] + }, + { + "id": "alibaba/qwen2.5-32b-instruct", + "provider": "alibaba", + "model": "qwen2.5-32b-instruct", + "displayName": "Qwen/Qwen2.5-32B-Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "nebius", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "nebius/Qwen/Qwen2.5-32B-Instruct", + "siliconflow-cn/Qwen/Qwen2.5-32B-Instruct", + "siliconflow/Qwen/Qwen2.5-32B-Instruct" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen2.5-32B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.18 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen2.5-32B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.18 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/Qwen/Qwen2.5-32B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen2.5-32B-Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-09-19", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen2.5-32B-Instruct", + "modelKey": "Qwen/Qwen2.5-32B-Instruct", + "displayName": "Qwen/Qwen2.5-32B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-09-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen2.5-32B-Instruct", + "modelKey": "Qwen/Qwen2.5-32B-Instruct", + "displayName": "Qwen/Qwen2.5-32B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-09-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/Qwen/Qwen2.5-32B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + } + ] + }, + { + "id": "alibaba/qwen2.5-32b-instruct-abliterated", + "provider": "alibaba", + "model": "qwen2.5-32b-instruct-abliterated", + "displayName": "Qwen 2.5 32B Abliterated", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/huihui-ai/Qwen2.5-32B-Instruct-abliterated" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "huihui-ai/Qwen2.5-32B-Instruct-abliterated", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 0.7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 2.5 32B Abliterated" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-01-06", + "lastUpdated": "2025-01-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "huihui-ai/Qwen2.5-32B-Instruct-abliterated", + "modelKey": "huihui-ai/Qwen2.5-32B-Instruct-abliterated", + "displayName": "Qwen 2.5 32B Abliterated", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-01-06", + "openWeights": false, + "releaseDate": "2025-01-06" + } + } + ] + }, + { + "id": "alibaba/qwen2.5-72b-instruct", + "provider": "alibaba", + "model": "qwen2.5-72b-instruct", + "displayName": "Qwen 2.5 72B Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "abacus", + "chutes", + "deepinfra", + "hyperbolic", + "nebius", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "abacus/Qwen/Qwen2.5-72B-Instruct", + "chutes/Qwen/Qwen2.5-72B-Instruct", + "deepinfra/Qwen/Qwen2.5-72B-Instruct", + "hyperbolic/Qwen/Qwen2.5-72B-Instruct", + "nebius/Qwen/Qwen2.5-72B-Instruct", + "siliconflow-cn/Qwen/Qwen2.5-72B-Instruct", + "siliconflow/Qwen/Qwen2.5-72B-Instruct" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "Qwen/Qwen2.5-72B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.11, + "output": 0.38 + } + }, + { + "source": "models.dev", + "provider": "chutes", + "model": "Qwen/Qwen2.5-72B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.14945, + "input": 0.2989, + "output": 1.1957 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen2.5-72B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.59, + "output": 0.59 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen2.5-72B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.59, + "output": 0.59 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen2.5-72B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0.39 + } + }, + { + "source": "litellm", + "provider": "hyperbolic", + "model": "hyperbolic/Qwen/Qwen2.5-72B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/Qwen/Qwen2.5-72B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 2.5 72B Instruct", + "Qwen/Qwen2.5-72B-Instruct", + "Qwen2.5 72B Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-09-19", + "lastUpdated": "2024-09-19", + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "Qwen/Qwen2.5-72B-Instruct", + "modelKey": "Qwen/Qwen2.5-72B-Instruct", + "displayName": "Qwen 2.5 72B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2024-09-19", + "openWeights": true, + "releaseDate": "2024-09-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "Qwen/Qwen2.5-72B-Instruct", + "modelKey": "Qwen/Qwen2.5-72B-Instruct", + "displayName": "Qwen2.5 72B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen2.5-72B-Instruct", + "modelKey": "Qwen/Qwen2.5-72B-Instruct", + "displayName": "Qwen/Qwen2.5-72B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-09-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen2.5-72B-Instruct", + "modelKey": "Qwen/Qwen2.5-72B-Instruct", + "displayName": "Qwen/Qwen2.5-72B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-09-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen2.5-72B-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "hyperbolic", + "model": "hyperbolic/Qwen/Qwen2.5-72B-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/Qwen/Qwen2.5-72B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + } + ] + }, + { + "id": "alibaba/qwen2.5-72b-instruct-128k", + "provider": "alibaba", + "model": "qwen2.5-72b-instruct-128k", + "displayName": "Qwen/Qwen2.5-72B-Instruct-128K", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "siliconflow-cn/Qwen/Qwen2.5-72B-Instruct-128K", + "siliconflow/Qwen/Qwen2.5-72B-Instruct-128K" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen2.5-72B-Instruct-128K", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.59, + "output": 0.59 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen2.5-72B-Instruct-128K", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.59, + "output": 0.59 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen2.5-72B-Instruct-128K" + ], + "families": [ + "qwen" + ], + "releaseDate": "2024-09-18", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen2.5-72B-Instruct-128K", + "modelKey": "Qwen/Qwen2.5-72B-Instruct-128K", + "displayName": "Qwen/Qwen2.5-72B-Instruct-128K", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-09-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen2.5-72B-Instruct-128K", + "modelKey": "Qwen/Qwen2.5-72B-Instruct-128K", + "displayName": "Qwen/Qwen2.5-72B-Instruct-128K", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-09-18" + } + } + ] + }, + { + "id": "alibaba/qwen2.5-72b-instruct-turbo", + "provider": "alibaba", + "model": "qwen2.5-72b-instruct-turbo", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "together_ai" + ], + "aliases": [ + "together_ai/Qwen/Qwen2.5-72B-Instruct-Turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen2.5-72B-Instruct-Turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen2.5-72B-Instruct-Turbo", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2.5-7b-instruct", + "provider": "alibaba", + "model": "qwen2.5-7b-instruct", + "displayName": "Qwen2.5 7B Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "deepinfra", + "novita", + "novita-ai", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "deepinfra/Qwen/Qwen2.5-7B-Instruct", + "novita-ai/qwen/qwen2.5-7b-instruct", + "novita/qwen/qwen2.5-7b-instruct", + "siliconflow-cn/Qwen/Qwen2.5-7B-Instruct", + "siliconflow/Qwen/Qwen2.5-7B-Instruct" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 33000, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "functionCalling": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen2.5-7b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.07 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen2.5-7B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.05 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen2.5-7B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.05 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen2.5-7B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen2.5-7b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0.07 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen2.5-7B-Instruct", + "Qwen2.5 7B Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-04-16", + "lastUpdated": "2025-04-16", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen2.5-7b-instruct", + "modelKey": "qwen/qwen2.5-7b-instruct", + "displayName": "Qwen2.5 7B Instruct", + "metadata": { + "lastUpdated": "2025-04-16", + "openWeights": true, + "releaseDate": "2025-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen2.5-7B-Instruct", + "modelKey": "Qwen/Qwen2.5-7B-Instruct", + "displayName": "Qwen/Qwen2.5-7B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-09-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen2.5-7B-Instruct", + "modelKey": "Qwen/Qwen2.5-7B-Instruct", + "displayName": "Qwen/Qwen2.5-7B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-09-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen2.5-7B-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen2.5-7b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2.5-7b-instruct-turbo", + "provider": "alibaba", + "model": "qwen2.5-7b-instruct-turbo", + "displayName": "Qwen 2.5 7B Instruct Turbo", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "together_ai", + "togetherai" + ], + "aliases": [ + "together_ai/Qwen/Qwen2.5-7B-Instruct-Turbo", + "togetherai/Qwen/Qwen2.5-7B-Instruct-Turbo" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "togetherai", + "model": "Qwen/Qwen2.5-7B-Instruct-Turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen2.5-7B-Instruct-Turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 2.5 7B Instruct Turbo" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-09-19", + "lastUpdated": "2024-09-19", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "Qwen/Qwen2.5-7B-Instruct-Turbo", + "modelKey": "Qwen/Qwen2.5-7B-Instruct-Turbo", + "displayName": "Qwen 2.5 7B Instruct Turbo", + "family": "qwen", + "metadata": { + "lastUpdated": "2024-09-19", + "openWeights": true, + "releaseDate": "2024-09-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen2.5-7B-Instruct-Turbo", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2.5-coder-32b-instruct", + "provider": "alibaba", + "model": "qwen2.5-coder-32b-instruct", + "displayName": "Qwen2.5 Coder 32B Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "chutes", + "cloudflare-ai-gateway", + "cloudflare-workers-ai", + "hyperbolic", + "nano-gpt", + "nscale", + "nvidia", + "ovhcloud", + "siliconflow", + "siliconflow-cn", + "synthetic" + ], + "aliases": [ + "chutes/Qwen/Qwen2.5-Coder-32B-Instruct", + "cloudflare-ai-gateway/workers-ai/@cf/qwen/qwen2.5-coder-32b-instruct", + "cloudflare-workers-ai/@cf/qwen/qwen2.5-coder-32b-instruct", + "hyperbolic/Qwen/Qwen2.5-Coder-32B-Instruct", + "nano-gpt/qwen/Qwen2.5-Coder-32B-Instruct", + "nscale/Qwen/Qwen2.5-Coder-32B-Instruct", + "nvidia/qwen/qwen2.5-coder-32b-instruct", + "ovhcloud/Qwen2.5-Coder-32B-Instruct", + "siliconflow-cn/Qwen/Qwen2.5-Coder-32B-Instruct", + "siliconflow/Qwen/Qwen2.5-Coder-32B-Instruct", + "synthetic/hf:Qwen/Qwen2.5-Coder-32B-Instruct" + ], + "mergedProviderModelRecords": 11, + "limits": { + "contextTokens": 128000, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "responseSchema": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "Qwen/Qwen2.5-Coder-32B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0136, + "input": 0.0272, + "output": 0.1087 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/qwen/qwen2.5-coder-32b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.66, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/qwen/qwen2.5-coder-32b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.66, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/Qwen2.5-Coder-32B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2006, + "output": 0.2006 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "qwen/qwen2.5-coder-32b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen2.5-Coder-32B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.18 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen2.5-Coder-32B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.18 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:Qwen/Qwen2.5-Coder-32B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 0.8 + } + }, + { + "source": "litellm", + "provider": "hyperbolic", + "model": "hyperbolic/Qwen/Qwen2.5-Coder-32B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "nscale", + "model": "nscale/Qwen/Qwen2.5-Coder-32B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "ovhcloud", + "model": "ovhcloud/Qwen2.5-Coder-32B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.87, + "output": 0.87 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 2.5 Coder 32B Instruct", + "Qwen 2.5 Coder 32b", + "Qwen/Qwen2.5-Coder-32B-Instruct", + "Qwen2.5 Coder 32B Instruct", + "Qwen2.5 Coder 32b Instruct", + "Qwen2.5-Coder-32B-Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-12-29", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 11 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "Qwen/Qwen2.5-Coder-32B-Instruct", + "modelKey": "Qwen/Qwen2.5-Coder-32B-Instruct", + "displayName": "Qwen2.5 Coder 32B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/qwen/qwen2.5-coder-32b-instruct", + "modelKey": "workers-ai/@cf/qwen/qwen2.5-coder-32b-instruct", + "displayName": "Qwen 2.5 Coder 32B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-04-11", + "openWeights": false, + "releaseDate": "2025-04-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/qwen/qwen2.5-coder-32b-instruct", + "modelKey": "@cf/qwen/qwen2.5-coder-32b-instruct", + "displayName": "Qwen2.5 Coder 32B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-02-27", + "openWeights": true, + "releaseDate": "2025-02-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/Qwen2.5-Coder-32B-Instruct", + "modelKey": "qwen/Qwen2.5-Coder-32B-Instruct", + "displayName": "Qwen 2.5 Coder 32b", + "metadata": { + "lastUpdated": "2025-07-03", + "openWeights": false, + "releaseDate": "2025-07-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "qwen/qwen2.5-coder-32b-instruct", + "modelKey": "qwen/qwen2.5-coder-32b-instruct", + "displayName": "Qwen2.5 Coder 32b Instruct", + "metadata": { + "lastUpdated": "2024-11-06", + "openWeights": true, + "releaseDate": "2024-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen2.5-Coder-32B-Instruct", + "modelKey": "Qwen/Qwen2.5-Coder-32B-Instruct", + "displayName": "Qwen/Qwen2.5-Coder-32B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-11-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen2.5-Coder-32B-Instruct", + "modelKey": "Qwen/Qwen2.5-Coder-32B-Instruct", + "displayName": "Qwen/Qwen2.5-Coder-32B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-11-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:Qwen/Qwen2.5-Coder-32B-Instruct", + "modelKey": "hf:Qwen/Qwen2.5-Coder-32B-Instruct", + "displayName": "Qwen2.5-Coder-32B-Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-11-11", + "openWeights": true, + "releaseDate": "2024-11-11" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "hyperbolic", + "model": "hyperbolic/Qwen/Qwen2.5-Coder-32B-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nscale", + "model": "nscale/Qwen/Qwen2.5-Coder-32B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://docs.nscale.com/docs/inference/serverless-models/current#chat-models" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ovhcloud", + "model": "ovhcloud/Qwen2.5-Coder-32B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://endpoints.ai.cloud.ovh.net/models/qwen2-5-coder-32b-instruct" + } + } + ] + }, + { + "id": "alibaba/qwen2.5-coder-3b-instruct", + "provider": "alibaba", + "model": "qwen2.5-coder-3b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "nscale" + ], + "aliases": [ + "nscale/Qwen/Qwen2.5-Coder-3B-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "nscale", + "model": "nscale/Qwen/Qwen2.5-Coder-3B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.01, + "output": 0.03 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nscale", + "model": "nscale/Qwen/Qwen2.5-Coder-3B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://docs.nscale.com/docs/inference/serverless-models/current#chat-models" + } + } + ] + }, + { + "id": "alibaba/qwen2.5-coder-7b", + "provider": "alibaba", + "model": "qwen2.5-coder-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "llamagate", + "nebius" + ], + "aliases": [ + "llamagate/qwen2.5-coder-7b", + "nebius/Qwen/Qwen2.5-Coder-7B" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "llamagate", + "model": "llamagate/qwen2.5-coder-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.12 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/Qwen/Qwen2.5-Coder-7B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.01, + "output": 0.03 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "llamagate", + "model": "llamagate/qwen2.5-coder-7b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/Qwen/Qwen2.5-Coder-7B", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + } + ] + }, + { + "id": "alibaba/qwen2.5-coder-7b-fast", + "provider": "alibaba", + "model": "qwen2.5-coder-7b-fast", + "displayName": "Qwen2.5 Coder 7B fast", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "helicone" + ], + "aliases": [ + "helicone/qwen2.5-coder-7b-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "qwen2.5-coder-7b-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.03, + "output": 0.09 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen2.5 Coder 7B fast" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-09", + "releaseDate": "2024-09-15", + "lastUpdated": "2024-09-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "qwen2.5-coder-7b-fast", + "modelKey": "qwen2.5-coder-7b-fast", + "displayName": "Qwen2.5 Coder 7B fast", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2024-09-15", + "openWeights": false, + "releaseDate": "2024-09-15" + } + } + ] + }, + { + "id": "alibaba/qwen2.5-coder-7b-instruct", + "provider": "alibaba", + "model": "qwen2.5-coder-7b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "nscale" + ], + "aliases": [ + "nscale/Qwen/Qwen2.5-Coder-7B-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "nscale", + "model": "nscale/Qwen/Qwen2.5-Coder-7B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.01, + "output": 0.03 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nscale", + "model": "nscale/Qwen/Qwen2.5-Coder-7B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://docs.nscale.com/docs/inference/serverless-models/current#chat-models" + } + } + ] + }, + { + "id": "alibaba/qwen2.5-vl-32b-instruct", + "provider": "alibaba", + "model": "qwen2.5-vl-32b-instruct", + "displayName": "Qwen2.5 VL 32B Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "chutes", + "deepinfra", + "io-net", + "meganova", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "chutes/Qwen/Qwen2.5-VL-32B-Instruct", + "deepinfra/Qwen/Qwen2.5-VL-32B-Instruct", + "io-net/Qwen/Qwen2.5-VL-32B-Instruct", + "meganova/Qwen/Qwen2.5-VL-32B-Instruct", + "siliconflow-cn/Qwen/Qwen2.5-VL-32B-Instruct", + "siliconflow/Qwen/Qwen2.5-VL-32B-Instruct" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 131000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 131000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "Qwen/Qwen2.5-VL-32B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02715, + "input": 0.0543, + "output": 0.2174 + } + }, + { + "source": "models.dev", + "provider": "io-net", + "model": "Qwen/Qwen2.5-VL-32B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 0.1, + "input": 0.05, + "output": 0.22 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "Qwen/Qwen2.5-VL-32B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen2.5-VL-32B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.27 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen2.5-VL-32B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.27 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen2.5-VL-32B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 2.5 VL 32B Instruct", + "Qwen/Qwen2.5-VL-32B-Instruct", + "Qwen2.5 VL 32B Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-09", + "releaseDate": "2025-12-29", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "Qwen/Qwen2.5-VL-32B-Instruct", + "modelKey": "Qwen/Qwen2.5-VL-32B-Instruct", + "displayName": "Qwen2.5 VL 32B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "io-net", + "providerName": "IO.NET", + "providerApi": "https://api.intelligence.io.solutions/api/v1", + "providerDoc": "https://io.net/docs/guides/intelligence/io-intelligence", + "model": "Qwen/Qwen2.5-VL-32B-Instruct", + "modelKey": "Qwen/Qwen2.5-VL-32B-Instruct", + "displayName": "Qwen 2.5 VL 32B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2024-11-01", + "openWeights": true, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "Qwen/Qwen2.5-VL-32B-Instruct", + "modelKey": "Qwen/Qwen2.5-VL-32B-Instruct", + "displayName": "Qwen2.5 VL 32B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-03-24", + "openWeights": true, + "releaseDate": "2025-03-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen2.5-VL-32B-Instruct", + "modelKey": "Qwen/Qwen2.5-VL-32B-Instruct", + "displayName": "Qwen/Qwen2.5-VL-32B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-03-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen2.5-VL-32B-Instruct", + "modelKey": "Qwen/Qwen2.5-VL-32B-Instruct", + "displayName": "Qwen/Qwen2.5-VL-32B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-03-24" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen2.5-VL-32B-Instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2.5-vl-72b-instruct", + "provider": "alibaba", + "model": "qwen2.5-vl-72b-instruct", + "displayName": "Qwen2.5-VL-72B-Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "nebius", + "novita", + "novita-ai", + "openrouter", + "ovhcloud", + "qiniu-ai", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "kilo/qwen/qwen2.5-vl-72b-instruct", + "nano-gpt/TEE/qwen2.5-vl-72b-instruct", + "nebius/Qwen/Qwen2.5-VL-72B-Instruct", + "novita-ai/qwen/qwen2.5-vl-72b-instruct", + "novita/qwen/qwen2.5-vl-72b-instruct", + "openrouter/qwen/qwen2.5-vl-72b-instruct", + "ovhcloud/Qwen2.5-VL-72B-Instruct", + "ovhcloud/qwen2.5-vl-72b-instruct", + "qiniu-ai/qwen2.5-vl-72b-instruct", + "siliconflow-cn/Qwen/Qwen2.5-VL-72B-Instruct", + "siliconflow/Qwen/Qwen2.5-VL-72B-Instruct" + ], + "mergedProviderModelRecords": 10, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true, + "supports1MContext": false, + "responseSchema": true, + "toolChoice": false, + "parallelFunctionCalling": false, + "webSearch": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen2.5-vl-72b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.8, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/qwen2.5-vl-72b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 0.7 + } + }, + { + "source": "models.dev", + "provider": "nebius", + "model": "Qwen/Qwen2.5-VL-72B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 0.31, + "input": 0.25, + "output": 0.75 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen2.5-vl-72b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen2.5-vl-72b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.4, + "input": 0.8, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "ovhcloud", + "model": "qwen2.5-vl-72b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.01, + "output": 1.01 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen2.5-VL-72B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.59, + "output": 0.59 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen2.5-VL-72B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.59, + "output": 0.59 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/Qwen/Qwen2.5-VL-72B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen2.5-vl-72b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 0.8 + } + }, + { + "source": "litellm", + "provider": "ovhcloud", + "model": "ovhcloud/Qwen2.5-VL-72B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.91, + "output": 0.91 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen2.5-vl-72b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.4, + "input": 0.8, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 2.5 VL 72B Instruct", + "Qwen/Qwen2.5-VL-72B-Instruct", + "Qwen2.5 VL 72B Instruct", + "Qwen2.5 VL 72B TEE", + "Qwen2.5-VL-72B-Instruct", + "Qwen: Qwen2.5 VL 72B Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-02-01", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 10 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen2.5-vl-72b-instruct", + "modelKey": "qwen/qwen2.5-vl-72b-instruct", + "displayName": "Qwen: Qwen2.5 VL 72B Instruct", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-02-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/qwen2.5-vl-72b-instruct", + "modelKey": "TEE/qwen2.5-vl-72b-instruct", + "displayName": "Qwen2.5 VL 72B TEE", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-02-01", + "openWeights": false, + "releaseDate": "2025-02-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "Qwen/Qwen2.5-VL-72B-Instruct", + "modelKey": "Qwen/Qwen2.5-VL-72B-Instruct", + "displayName": "Qwen2.5-VL-72B-Instruct", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen2.5-vl-72b-instruct", + "modelKey": "qwen/qwen2.5-vl-72b-instruct", + "displayName": "Qwen2.5 VL 72B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-03-25", + "openWeights": true, + "releaseDate": "2025-03-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen2.5-vl-72b-instruct", + "modelKey": "qwen/qwen2.5-vl-72b-instruct", + "displayName": "Qwen2.5 VL 72B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-06-30", + "lastUpdated": "2025-02-01", + "openWeights": true, + "releaseDate": "2025-02-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ovhcloud", + "providerName": "OVHcloud AI Endpoints", + "providerApi": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", + "providerDoc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", + "model": "qwen2.5-vl-72b-instruct", + "modelKey": "qwen2.5-vl-72b-instruct", + "displayName": "Qwen2.5-VL-72B-Instruct", + "metadata": { + "lastUpdated": "2025-03-31", + "openWeights": true, + "releaseDate": "2025-03-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen2.5-vl-72b-instruct", + "modelKey": "qwen2.5-vl-72b-instruct", + "displayName": "Qwen 2.5 VL 72B Instruct", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen2.5-VL-72B-Instruct", + "modelKey": "Qwen/Qwen2.5-VL-72B-Instruct", + "displayName": "Qwen/Qwen2.5-VL-72B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-01-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen2.5-VL-72B-Instruct", + "modelKey": "Qwen/Qwen2.5-VL-72B-Instruct", + "displayName": "Qwen/Qwen2.5-VL-72B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-01-28" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/Qwen/Qwen2.5-VL-72B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen2.5-vl-72b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ovhcloud", + "model": "ovhcloud/Qwen2.5-VL-72B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://endpoints.ai.cloud.ovh.net/models/qwen2-5-vl-72b-instruct" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen2.5-vl-72b-instruct", + "displayName": "Qwen: Qwen2.5 VL 72B Instruct", + "metadata": { + "canonicalSlug": "qwen/qwen2.5-vl-72b-instruct", + "createdAt": "2025-02-01T11:45:11.000Z", + "huggingFaceId": "Qwen/Qwen2.5-VL-72B-Instruct", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/qwen/qwen2.5-vl-72b-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 128000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen2.5-vl-7b-instruct", + "provider": "alibaba", + "model": "qwen2.5-vl-7b-instruct", + "displayName": "Qwen/Qwen2.5-VL-7B-Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai", + "siliconflow" + ], + "aliases": [ + "qiniu-ai/qwen2.5-vl-7b-instruct", + "siliconflow/Qwen/Qwen2.5-VL-7B-Instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen2.5-VL-7B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.05 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 2.5 VL 7B Instruct", + "Qwen/Qwen2.5-VL-7B-Instruct" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen2.5-vl-7b-instruct", + "modelKey": "qwen2.5-vl-7b-instruct", + "displayName": "Qwen 2.5 VL 7B Instruct", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen2.5-VL-7B-Instruct", + "modelKey": "Qwen/Qwen2.5-VL-7B-Instruct", + "displayName": "Qwen/Qwen2.5-VL-7B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-01-28" + } + } + ] + }, + { + "id": "alibaba/qwen25-coder-32b-instruct", + "provider": "alibaba", + "model": "qwen25-coder-32b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lambda_ai" + ], + "aliases": [ + "lambda_ai/qwen25-coder-32b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/qwen25-coder-32b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/qwen25-coder-32b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen25-coder-7b", + "provider": "alibaba", + "model": "qwen25-coder-7b", + "displayName": "Qwen2.5 Coder 7B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/qwen25-coder-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen25-coder-7b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.05 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen2.5 Coder 7B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2024-09-19", + "lastUpdated": "2024-09-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen25-coder-7b", + "modelKey": "qwen25-coder-7b", + "displayName": "Qwen2.5 Coder 7B", + "family": "qwen", + "metadata": { + "lastUpdated": "2024-09-19", + "openWeights": true, + "releaseDate": "2024-09-19" + } + } + ] + }, + { + "id": "alibaba/qwen25-vl-72b-instruct", + "provider": "alibaba", + "model": "qwen25-vl-72b-instruct", + "displayName": "Qwen25 VL 72b", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/qwen25-vl-72b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen25-vl-72b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.69989, + "output": 0.69989 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen25 VL 72b" + ], + "releaseDate": "2025-05-10", + "lastUpdated": "2025-05-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen25-vl-72b-instruct", + "modelKey": "qwen25-vl-72b-instruct", + "displayName": "Qwen25 VL 72b", + "metadata": { + "lastUpdated": "2025-05-10", + "openWeights": false, + "releaseDate": "2025-05-10" + } + } + ] + }, + { + "id": "alibaba/qwen2p5-0p5b-instruct", + "provider": "alibaba", + "model": "qwen2p5-0p5b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-0p5b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-0p5b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-0p5b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-14b", + "provider": "alibaba", + "model": "qwen2p5-14b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-14b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-14b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-14b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-1p5b-instruct", + "provider": "alibaba", + "model": "qwen2p5-1p5b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-1p5b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-1p5b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-1p5b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-32b", + "provider": "alibaba", + "model": "qwen2p5-32b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-32b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-32b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-32b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-32b-instruct", + "provider": "alibaba", + "model": "qwen2p5-32b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-32b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-32b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-32b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-72b", + "provider": "alibaba", + "model": "qwen2p5-72b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-72b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-72b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-72b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-72b-instruct", + "provider": "alibaba", + "model": "qwen2p5-72b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-72b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-72b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-72b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-7b-instruct", + "provider": "alibaba", + "model": "qwen2p5-7b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-7b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-7b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-7b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-coder-0p5b", + "provider": "alibaba", + "model": "qwen2p5-coder-0p5b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-0p5b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-0p5b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-0p5b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-coder-0p5b-instruct", + "provider": "alibaba", + "model": "qwen2p5-coder-0p5b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-0p5b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-0p5b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-0p5b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-coder-14b", + "provider": "alibaba", + "model": "qwen2p5-coder-14b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-14b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-14b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-14b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-coder-14b-instruct", + "provider": "alibaba", + "model": "qwen2p5-coder-14b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-14b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-14b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-14b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-coder-1p5b", + "provider": "alibaba", + "model": "qwen2p5-coder-1p5b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-1p5b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-1p5b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-1p5b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-coder-1p5b-instruct", + "provider": "alibaba", + "model": "qwen2p5-coder-1p5b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-1p5b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-1p5b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-1p5b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-coder-32b", + "provider": "alibaba", + "model": "qwen2p5-coder-32b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-coder-32b-instruct", + "provider": "alibaba", + "model": "qwen2p5-coder-32b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "alibaba/qwen2p5-coder-32b-instruct-128k", + "provider": "alibaba", + "model": "qwen2p5-coder-32b-instruct-128k", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct-128k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct-128k", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct-128k", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-coder-32b-instruct-32k-rope", + "provider": "alibaba", + "model": "qwen2p5-coder-32b-instruct-32k-rope", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct-32k-rope" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct-32k-rope", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct-32k-rope", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-coder-32b-instruct-64k", + "provider": "alibaba", + "model": "qwen2p5-coder-32b-instruct-64k", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct-64k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct-64k", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct-64k", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-coder-3b", + "provider": "alibaba", + "model": "qwen2p5-coder-3b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-3b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-coder-3b-instruct", + "provider": "alibaba", + "model": "qwen2p5-coder-3b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-3b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-3b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-3b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-coder-7b", + "provider": "alibaba", + "model": "qwen2p5-coder-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-7b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-coder-7b-instruct", + "provider": "alibaba", + "model": "qwen2p5-coder-7b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-7b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-7b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-coder-7b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-math-72b-instruct", + "provider": "alibaba", + "model": "qwen2p5-math-72b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-math-72b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-math-72b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-math-72b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-vl-32b-instruct", + "provider": "alibaba", + "model": "qwen2p5-vl-32b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-vl-32b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-vl-32b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-vl-32b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-vl-3b-instruct", + "provider": "alibaba", + "model": "qwen2p5-vl-3b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-vl-3b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-vl-3b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-vl-3b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-vl-72b-instruct", + "provider": "alibaba", + "model": "qwen2p5-vl-72b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-vl-72b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-vl-72b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-vl-72b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen2p5-vl-7b-instruct", + "provider": "alibaba", + "model": "qwen2p5-vl-7b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen2p5-vl-7b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-vl-7b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen2p5-vl-7b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-0p6b", + "provider": "alibaba", + "model": "qwen3-0p6b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen3-0p6b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 40960, + "inputTokens": 40960, + "maxTokens": 40960, + "outputTokens": 40960, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-0p6b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-0p6b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-14b", + "provider": "alibaba", + "model": "qwen3-14b", + "displayName": "Qwen3 14B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "deepinfra", + "fireworks_ai", + "kilo", + "nano-gpt", + "nebius", + "openrouter", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "alibaba-cn/qwen3-14b", + "alibaba/qwen3-14b", + "deepinfra/Qwen/Qwen3-14B", + "fireworks_ai/accounts/fireworks/models/qwen3-14b", + "kilo/qwen/qwen3-14b", + "nano-gpt/qwen/qwen3-14b", + "nebius/Qwen/Qwen3-14B", + "openrouter/qwen/qwen3-14b", + "siliconflow-cn/Qwen/Qwen3-14B", + "siliconflow/Qwen/Qwen3-14B" + ], + "mergedProviderModelRecords": 10, + "limits": { + "contextTokens": 131702, + "inputTokens": 41000, + "maxTokens": 40960, + "outputTokens": 131000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3-14b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.144, + "output": 0.574, + "reasoningOutput": 1.434 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-14b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.35, + "output": 1.4, + "reasoningOutput": 4.2 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-14b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.06, + "output": 0.24 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/qwen3-14b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "output": 0.24 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-14b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.24 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-14B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-14B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.28 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-14B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.24 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-14b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/Qwen/Qwen3-14B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.24 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-14b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.24 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3 14b", + "Qwen/Qwen3-14B", + "Qwen3 14B", + "Qwen: Qwen3 14B" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-04", + "lastUpdated": "2025-04", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 10 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-14b", + "modelKey": "qwen3-14b", + "displayName": "Qwen3 14B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-14b", + "modelKey": "qwen3-14b", + "displayName": "Qwen3 14B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-14b", + "modelKey": "qwen/qwen3-14b", + "displayName": "Qwen: Qwen3 14B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/qwen3-14b", + "modelKey": "qwen/qwen3-14b", + "displayName": "Qwen 3 14b", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-14b", + "modelKey": "qwen/qwen3-14b", + "displayName": "Qwen3 14B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-04-28", + "openWeights": true, + "releaseDate": "2025-04-28", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-14B", + "modelKey": "Qwen/Qwen3-14B", + "displayName": "Qwen/Qwen3-14B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-04-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-14B", + "modelKey": "Qwen/Qwen3-14B", + "displayName": "Qwen/Qwen3-14B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-04-30" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-14B", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-14b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/Qwen/Qwen3-14B", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-14b", + "displayName": "Qwen: Qwen3 14B", + "metadata": { + "canonicalSlug": "qwen/qwen3-14b-04-28", + "createdAt": "2025-04-28T21:41:18.000Z", + "huggingFaceId": "Qwen/Qwen3-14B", + "instructType": "qwen3", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/qwen/qwen3-14b-04-28/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 40960, + "max_completion_tokens": 40960, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-14b-instruct", + "provider": "alibaba", + "model": "qwen3-14b-instruct", + "displayName": "OpenPipe Qwen3 14B Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "wandb" + ], + "aliases": [ + "wandb/OpenPipe/Qwen3-14B-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "wandb", + "model": "OpenPipe/Qwen3-14B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.22 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenPipe Qwen3 14B Instruct" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-04-29", + "lastUpdated": "2026-03-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "OpenPipe/Qwen3-14B-Instruct", + "modelKey": "OpenPipe/Qwen3-14B-Instruct", + "displayName": "OpenPipe Qwen3 14B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-03-12", + "openWeights": true, + "releaseDate": "2025-04-29" + } + } + ] + }, + { + "id": "alibaba/qwen3-1p7b", + "provider": "alibaba", + "model": "qwen3-1p7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen3-1p7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-1p7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-1p7b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-1p7b-fp8-draft", + "provider": "alibaba", + "model": "qwen3-1p7b-fp8-draft", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen3-1p7b-fp8-draft" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-1p7b-fp8-draft", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-1p7b-fp8-draft", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-1p7b-fp8-draft-131072", + "provider": "alibaba", + "model": "qwen3-1p7b-fp8-draft-131072", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen3-1p7b-fp8-draft-131072" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-1p7b-fp8-draft-131072", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-1p7b-fp8-draft-131072", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-1p7b-fp8-draft-40960", + "provider": "alibaba", + "model": "qwen3-1p7b-fp8-draft-40960", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen3-1p7b-fp8-draft-40960" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 40960, + "inputTokens": 40960, + "maxTokens": 40960, + "outputTokens": 40960, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-1p7b-fp8-draft-40960", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-1p7b-fp8-draft-40960", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-235b", + "provider": "alibaba", + "model": "qwen3-235b", + "displayName": "Qwen3-235B-A22B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "iflowcn" + ], + "aliases": [ + "iflowcn/qwen3-235b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "iflowcn", + "model": "qwen3-235b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3-235B-A22B" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-12-01", + "lastUpdated": "2024-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "iflowcn", + "providerName": "iFlow", + "providerApi": "https://apis.iflow.cn/v1", + "providerDoc": "https://platform.iflow.cn/en/docs", + "model": "qwen3-235b", + "modelKey": "qwen3-235b", + "displayName": "Qwen3-235B-A22B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-12-01", + "openWeights": true, + "releaseDate": "2024-12-01" + } + } + ] + }, + { + "id": "alibaba/qwen3-235b-2507-cs", + "provider": "alibaba", + "model": "qwen3-235b-2507-cs", + "displayName": "qwen3-235b-2507-cs", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/cerebras/qwen3-235b-2507-cs" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "qwen3-235b-2507-cs" + ], + "statuses": [ + "deprecated" + ], + "releaseDate": "2025-08-06", + "lastUpdated": "2025-08-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "cerebras/qwen3-235b-2507-cs", + "modelKey": "cerebras/qwen3-235b-2507-cs", + "displayName": "qwen3-235b-2507-cs", + "status": "deprecated", + "metadata": { + "lastUpdated": "2025-08-06", + "openWeights": false, + "releaseDate": "2025-08-06" + } + } + ] + }, + { + "id": "alibaba/qwen3-235b-a22b", + "provider": "alibaba", + "model": "qwen3-235b-a22b", + "displayName": "Qwen3 235B-A22B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "alibaba", + "alibaba-cn", + "deepinfra", + "fireworks_ai", + "hyperbolic", + "kilo", + "nano-gpt", + "nebius", + "openrouter", + "qiniu-ai", + "siliconflow" + ], + "aliases": [ + "302ai/qwen3-235b-a22b", + "alibaba-cn/qwen3-235b-a22b", + "alibaba/qwen3-235b-a22b", + "deepinfra/Qwen/Qwen3-235B-A22B", + "fireworks_ai/accounts/fireworks/models/qwen3-235b-a22b", + "hyperbolic/Qwen/Qwen3-235B-A22B", + "kilo/qwen/qwen3-235b-a22b", + "nano-gpt/qwen/qwen3-235b-a22b", + "nebius/Qwen/Qwen3-235B-A22B", + "openrouter/qwen/qwen3-235b-a22b", + "qiniu-ai/qwen3-235b-a22b", + "siliconflow/Qwen/Qwen3-235B-A22B" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "qwen3-235b-a22b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 2.86 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3-235b-a22b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.287, + "output": 1.147, + "reasoningOutput": 2.868 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-235b-a22b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 2.8, + "reasoningOutput": 8.4 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-235b-a22b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.455, + "output": 1.82 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/qwen3-235b-a22b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.455, + "output": 1.82 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-235B-A22B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.35, + "output": 1.42 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-235B-A22B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.18, + "output": 0.54 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-235b-a22b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.22, + "output": 0.88 + } + }, + { + "source": "litellm", + "provider": "hyperbolic", + "model": "hyperbolic/Qwen/Qwen3-235B-A22B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/Qwen/Qwen3-235B-A22B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.455, + "output": 1.82 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3 235B A22B", + "Qwen 3 235b A22B", + "Qwen/Qwen3-235B-A22B", + "Qwen3 235B-A22B", + "Qwen3-235B-A22B", + "Qwen: Qwen3 235B A22B" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-04-29", + "lastUpdated": "2025-04-29", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "qwen3-235b-a22b", + "modelKey": "qwen3-235b-a22b", + "displayName": "Qwen3-235B-A22B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04-29", + "openWeights": false, + "releaseDate": "2025-04-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-235b-a22b", + "modelKey": "qwen3-235b-a22b", + "displayName": "Qwen3 235B-A22B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-235b-a22b", + "modelKey": "qwen3-235b-a22b", + "displayName": "Qwen3 235B-A22B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-235b-a22b", + "modelKey": "qwen/qwen3-235b-a22b", + "displayName": "Qwen: Qwen3 235B A22B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2024-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/qwen3-235b-a22b", + "modelKey": "qwen/qwen3-235b-a22b", + "displayName": "Qwen 3 235b A22B", + "metadata": { + "lastUpdated": "2025-04-29", + "openWeights": false, + "releaseDate": "2025-04-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-235b-a22b", + "modelKey": "qwen/qwen3-235b-a22b", + "displayName": "Qwen3 235B-A22B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1, + "max": 38912 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen3-235b-a22b", + "modelKey": "qwen3-235b-a22b", + "displayName": "Qwen 3 235B A22B", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-235B-A22B", + "modelKey": "Qwen/Qwen3-235B-A22B", + "displayName": "Qwen/Qwen3-235B-A22B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-04-30" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-235B-A22B", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-235b-a22b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "hyperbolic", + "model": "hyperbolic/Qwen/Qwen3-235B-A22B", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/Qwen/Qwen3-235B-A22B", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b", + "displayName": "Qwen: Qwen3 235B A22B", + "metadata": { + "canonicalSlug": "qwen/qwen3-235b-a22b-04-28", + "createdAt": "2025-04-28T21:29:17.000Z", + "huggingFaceId": "Qwen/Qwen3-235B-A22B", + "instructType": "qwen3", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/qwen/qwen3-235b-a22b-04-28/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 8192, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-235b-a22b-2507", + "provider": "alibaba", + "model": "qwen3-235b-a22b-2507", + "displayName": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/qwen/qwen3-235b-a22b-2507", + "openrouter/qwen/qwen3-235b-a22b-2507" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-235b-a22b-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.071, + "output": 0.1 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3-235b-a22b-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.071, + "output": 0.1 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b-2507", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.09, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 235B A22B Instruct 2507", + "Qwen: Qwen3 235B A22B Instruct 2507" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-06-30", + "releaseDate": "2025-04", + "lastUpdated": "2026-01", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-235b-a22b-2507", + "modelKey": "qwen/qwen3-235b-a22b-2507", + "displayName": "Qwen: Qwen3 235B A22B Instruct 2507", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-235b-a22b-2507", + "modelKey": "qwen/qwen3-235b-a22b-2507", + "displayName": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-06-30", + "lastUpdated": "2025-07-21", + "openWeights": true, + "releaseDate": "2025-07-21" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3-235b-a22b-2507", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/qwen/qwen3-235b-a22b-2507" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b-2507", + "displayName": "Qwen: Qwen3 235B A22B Instruct 2507", + "metadata": { + "canonicalSlug": "qwen/qwen3-235b-a22b-07-25", + "createdAt": "2025-07-21T17:39:15.000Z", + "huggingFaceId": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "knowledgeCutoff": "2025-06-30", + "links": { + "details": "/api/v1/models/qwen/qwen3-235b-a22b-07-25/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-235b-a22b-fp8", + "provider": "alibaba", + "model": "qwen3-235b-a22b-fp8", + "displayName": "Qwen3 235B A22B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "jiekou", + "llmgateway", + "novita", + "novita-ai" + ], + "aliases": [ + "jiekou/qwen/qwen3-235b-a22b-fp8", + "llmgateway/qwen3-235b-a22b-fp8", + "novita-ai/qwen/qwen3-235b-a22b-fp8", + "novita/qwen/qwen3-235b-a22b-fp8" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 131072, + "inputTokens": 40960, + "maxTokens": 20000, + "outputTokens": 20000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "jiekou", + "model": "qwen/qwen3-235b-a22b-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-235b-a22b-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-235b-a22b-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-235b-a22b-fp8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 235B A22B", + "Qwen3 235B A22B FP8" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-01", + "lastUpdated": "2026-01", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "qwen/qwen3-235b-a22b-fp8", + "modelKey": "qwen/qwen3-235b-a22b-fp8", + "displayName": "Qwen3 235B A22B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-235b-a22b-fp8", + "modelKey": "qwen3-235b-a22b-fp8", + "displayName": "Qwen3 235B A22B FP8", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-04-28", + "openWeights": true, + "releaseDate": "2025-04-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-235b-a22b-fp8", + "modelKey": "qwen/qwen3-235b-a22b-fp8", + "displayName": "Qwen3 235B A22B", + "metadata": { + "lastUpdated": "2025-04-29", + "openWeights": true, + "releaseDate": "2025-04-29" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-235b-a22b-fp8", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-235b-a22b-fp8-tput", + "provider": "alibaba", + "model": "qwen3-235b-a22b-fp8-tput", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "together_ai" + ], + "aliases": [ + "together_ai/Qwen/Qwen3-235B-A22B-fp8-tput" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 40000, + "inputTokens": 40000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen3-235B-A22B-fp8-tput", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen3-235B-A22B-fp8-tput", + "mode": "chat", + "metadata": { + "source": "https://www.together.ai/models/qwen3-235b-a22b-fp8-tput" + } + } + ] + }, + { + "id": "alibaba/qwen3-235b-a22b-instruct", + "provider": "alibaba", + "model": "qwen3-235b-a22b-instruct", + "displayName": "Qwen3-235B-A22B-Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "iflowcn" + ], + "aliases": [ + "iflowcn/qwen3-235b-a22b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "iflowcn", + "model": "qwen3-235b-a22b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3-235B-A22B-Instruct" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-07-01", + "lastUpdated": "2025-07-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "iflowcn", + "providerName": "iFlow", + "providerApi": "https://apis.iflow.cn/v1", + "providerDoc": "https://platform.iflow.cn/en/docs", + "model": "qwen3-235b-a22b-instruct", + "modelKey": "qwen3-235b-a22b-instruct", + "displayName": "Qwen3-235B-A22B-Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-01", + "openWeights": true, + "releaseDate": "2025-07-01" + } + } + ] + }, + { + "id": "alibaba/qwen3-235b-a22b-instruct-2507", + "provider": "alibaba", + "model": "qwen3-235b-a22b-instruct-2507", + "displayName": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "abacus", + "cortecs", + "crusoe", + "deepinfra", + "fireworks_ai", + "friendli", + "jiekou", + "llmgateway", + "meganova", + "modelscope", + "nano-gpt", + "nebius", + "novita", + "novita-ai", + "qiniu-ai", + "replicate", + "scaleway", + "siliconflow", + "siliconflow-cn", + "submodel", + "synthetic", + "venice", + "wandb" + ], + "aliases": [ + "302ai/qwen3-235b-a22b-instruct-2507", + "abacus/Qwen/Qwen3-235B-A22B-Instruct-2507", + "cortecs/qwen3-235b-a22b-instruct-2507", + "crusoe/Qwen/Qwen3-235B-A22B-Instruct-2507", + "deepinfra/Qwen/Qwen3-235B-A22B-Instruct-2507", + "fireworks_ai/accounts/fireworks/models/qwen3-235b-a22b-instruct-2507", + "friendli/Qwen/Qwen3-235B-A22B-Instruct-2507", + "jiekou/qwen/qwen3-235b-a22b-instruct-2507", + "llmgateway/qwen3-235b-a22b-instruct-2507", + "meganova/Qwen/Qwen3-235B-A22B-Instruct-2507", + "modelscope/Qwen/Qwen3-235B-A22B-Instruct-2507", + "nano-gpt/qwen/Qwen3-235B-A22B-Instruct-2507", + "nebius/Qwen/Qwen3-235B-A22B-Instruct-2507", + "novita-ai/qwen/qwen3-235b-a22b-instruct-2507", + "novita/qwen/qwen3-235b-a22b-instruct-2507", + "qiniu-ai/qwen3-235b-a22b-instruct-2507", + "replicate/qwen/qwen3-235b-a22b-instruct-2507", + "scaleway/qwen3-235b-a22b-instruct-2507", + "siliconflow-cn/Qwen/Qwen3-235B-A22B-Instruct-2507", + "siliconflow/Qwen/Qwen3-235B-A22B-Instruct-2507", + "submodel/Qwen/Qwen3-235B-A22B-Instruct-2507", + "synthetic/hf:Qwen/Qwen3-235B-A22B-Instruct-2507", + "venice/qwen3-235b-a22b-instruct-2507", + "wandb/Qwen/Qwen3-235B-A22B-Instruct-2507" + ], + "mergedProviderModelRecords": 24, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false, + "functionCalling": true, + "parallelFunctionCalling": true, + "systemMessages": true, + "toolChoice": true, + "responseSchema": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "qwen3-235b-a22b-instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 1.143 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "qwen3-235b-a22b-instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.062, + "output": 0.408 + } + }, + { + "source": "models.dev", + "provider": "friendli", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "qwen/qwen3-235b-a22b-instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-235b-a22b-instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.58 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "modelscope", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/Qwen3-235B-A22B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "nebius", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-235b-a22b-instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.58 + } + }, + { + "source": "models.dev", + "provider": "scaleway", + "model": "qwen3-235b-a22b-instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.75, + "output": 2.25, + "reasoningOutput": 8.4 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "submodel", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:Qwen/Qwen3-235B-A22B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "qwen3-235b-a22b-instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.75 + } + }, + { + "source": "models.dev", + "provider": "wandb", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "crusoe", + "model": "crusoe/Qwen/Qwen3-235B-A22B-Instruct-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-235B-A22B-Instruct-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.09, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-235b-a22b-instruct-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.22, + "output": 0.88 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-235b-a22b-instruct-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.09, + "output": 0.58 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/qwen/qwen3-235b-a22b-instruct-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.264, + "output": 1.06 + } + }, + { + "source": "litellm", + "provider": "wandb", + "model": "wandb/Qwen/Qwen3-235B-A22B-Instruct-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10000, + "output": 10000 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3 235B A22B Instruct 2507", + "Qwen 3 235B Instruct", + "Qwen 3 235b A22B 2507", + "Qwen/Qwen3-235B-A22B-Instruct-2507", + "Qwen3 235B A22B Instruct", + "Qwen3 235B A22B Instruct (2507)", + "Qwen3 235B A22B Instruct 2507", + "Qwen3 235b A22B Instruct 2507", + "qwen3-235b-a22b-instruct-2507" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-07-30", + "lastUpdated": "2025-07-30", + "providerModelRecordCount": 24 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "qwen3-235b-a22b-instruct-2507", + "modelKey": "qwen3-235b-a22b-instruct-2507", + "displayName": "qwen3-235b-a22b-instruct-2507", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-30", + "openWeights": false, + "releaseDate": "2025-07-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "modelKey": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "displayName": "Qwen3 235B A22B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-07-01", + "openWeights": true, + "releaseDate": "2025-07-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "qwen3-235b-a22b-instruct-2507", + "modelKey": "qwen3-235b-a22b-instruct-2507", + "displayName": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "friendli", + "providerName": "Friendli", + "providerApi": "https://api.friendli.ai/serverless/v1", + "providerDoc": "https://friendli.ai/docs/guides/serverless_endpoints/introduction", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "modelKey": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "displayName": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-01-29", + "openWeights": true, + "releaseDate": "2025-07-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "qwen/qwen3-235b-a22b-instruct-2507", + "modelKey": "qwen/qwen3-235b-a22b-instruct-2507", + "displayName": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-235b-a22b-instruct-2507", + "modelKey": "qwen3-235b-a22b-instruct-2507", + "displayName": "Qwen3 235B A22B Instruct (2507)", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-07-08", + "openWeights": true, + "releaseDate": "2025-07-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "modelKey": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "displayName": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "modelscope", + "providerName": "ModelScope", + "providerApi": "https://api-inference.modelscope.cn/v1", + "providerDoc": "https://modelscope.cn/docs/model-service/API-Inference/intro", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "modelKey": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "displayName": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-21", + "openWeights": true, + "releaseDate": "2025-04-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/Qwen3-235B-A22B-Instruct-2507", + "modelKey": "qwen/Qwen3-235B-A22B-Instruct-2507", + "displayName": "Qwen 3 235b A22B 2507", + "metadata": { + "lastUpdated": "2025-07-25", + "openWeights": false, + "releaseDate": "2025-07-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "modelKey": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "displayName": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2025-10-04", + "openWeights": false, + "releaseDate": "2025-07-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-235b-a22b-instruct-2507", + "modelKey": "qwen/qwen3-235b-a22b-instruct-2507", + "displayName": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-22", + "openWeights": true, + "releaseDate": "2025-07-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen3-235b-a22b-instruct-2507", + "modelKey": "qwen3-235b-a22b-instruct-2507", + "displayName": "Qwen3 235b A22B Instruct 2507", + "metadata": { + "lastUpdated": "2025-08-12", + "openWeights": false, + "releaseDate": "2025-08-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "scaleway", + "providerName": "Scaleway", + "providerApi": "https://api.scaleway.ai/v1", + "providerDoc": "https://www.scaleway.com/en/docs/generative-apis/", + "model": "qwen3-235b-a22b-instruct-2507", + "modelKey": "qwen3-235b-a22b-instruct-2507", + "displayName": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-03-17", + "openWeights": true, + "releaseDate": "2025-07-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "modelKey": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "displayName": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "modelKey": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "displayName": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "submodel", + "providerName": "submodel", + "providerApi": "https://llm.submodel.ai/v1", + "providerDoc": "https://submodel.gitbook.io", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "modelKey": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "displayName": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-08-23", + "openWeights": true, + "releaseDate": "2025-08-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:Qwen/Qwen3-235B-A22B-Instruct-2507", + "modelKey": "hf:Qwen/Qwen3-235B-A22B-Instruct-2507", + "displayName": "Qwen 3 235B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-21", + "openWeights": true, + "releaseDate": "2025-04-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "qwen3-235b-a22b-instruct-2507", + "modelKey": "qwen3-235b-a22b-instruct-2507", + "displayName": "Qwen 3 235B A22B Instruct 2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2025-04-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "modelKey": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "displayName": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-03-12", + "openWeights": true, + "releaseDate": "2025-04-28" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "crusoe", + "model": "crusoe/Qwen/Qwen3-235B-A22B-Instruct-2507", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-235B-A22B-Instruct-2507", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-235b-a22b-instruct-2507", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-235b-a22b-instruct-2507", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/qwen/qwen3-235b-a22b-instruct-2507", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "wandb", + "model": "wandb/Qwen/Qwen3-235B-A22B-Instruct-2507", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-235b-a22b-instruct-2507-maas", + "provider": "alibaba", + "model": "qwen3-235b-a22b-instruct-2507-maas", + "displayName": "Qwen3 235B A22B Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "vertex_ai-qwen_models" + ], + "aliases": [ + "google-vertex/qwen/qwen3-235b-a22b-instruct-2507-maas", + "vertex_ai-qwen_models/vertex_ai/qwen/qwen3-235b-a22b-instruct-2507-maas" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex", + "model": "qwen/qwen3-235b-a22b-instruct-2507-maas", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.22, + "output": 0.88 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-qwen_models", + "model": "vertex_ai/qwen/qwen3-235b-a22b-instruct-2507-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 235B A22B Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-08-13", + "lastUpdated": "2025-08-13", + "supportedRegions": [ + "global", + "us-south1" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "qwen/qwen3-235b-a22b-instruct-2507-maas", + "modelKey": "qwen/qwen3-235b-a22b-instruct-2507-maas", + "displayName": "Qwen3 235B A22B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-08-13", + "openWeights": true, + "releaseDate": "2025-08-13" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-qwen_models", + "model": "vertex_ai/qwen/qwen3-235b-a22b-instruct-2507-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", + "supportedRegions": [ + "global", + "us-south1" + ] + } + } + ] + }, + { + "id": "alibaba/qwen3-235b-a22b-instruct-2507-tee", + "provider": "alibaba", + "model": "qwen3-235b-a22b-instruct-2507-tee", + "displayName": "Qwen3 235B A22B Instruct 2507 TEE", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes", + "nano-gpt" + ], + "aliases": [ + "chutes/Qwen/Qwen3-235B-A22B-Instruct-2507-TEE", + "nano-gpt/qwen/Qwen3-235B-A22B-Instruct-2507-TEE" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 256000, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.1, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/Qwen3-235B-A22B-Instruct-2507-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3 235b A22B 2507 (TEE)", + "Qwen3 235B A22B Instruct 2507 TEE" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-04", + "lastUpdated": "2025-04", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507-TEE", + "modelKey": "Qwen/Qwen3-235B-A22B-Instruct-2507-TEE", + "displayName": "Qwen3 235B A22B Instruct 2507 TEE", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/Qwen3-235B-A22B-Instruct-2507-TEE", + "modelKey": "qwen/Qwen3-235B-A22B-Instruct-2507-TEE", + "displayName": "Qwen 3 235b A22B 2507 (TEE)", + "metadata": { + "lastUpdated": "2025-07-25", + "openWeights": false, + "releaseDate": "2025-07-25" + } + } + ] + }, + { + "id": "alibaba/qwen3-235b-a22b-instruct-2507-tput", + "provider": "alibaba", + "model": "qwen3-235b-a22b-instruct-2507-tput", + "displayName": "Qwen3 235B A22B Instruct 2507 FP8", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "together_ai", + "togetherai" + ], + "aliases": [ + "together_ai/Qwen/Qwen3-235B-A22B-Instruct-2507-tput", + "togetherai/Qwen/Qwen3-235B-A22B-Instruct-2507-tput" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 262000, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "togetherai", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507-tput", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen3-235B-A22B-Instruct-2507-tput", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 235B A22B Instruct 2507 FP8" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-07", + "releaseDate": "2025-07-25", + "lastUpdated": "2025-07-25", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "Qwen/Qwen3-235B-A22B-Instruct-2507-tput", + "modelKey": "Qwen/Qwen3-235B-A22B-Instruct-2507-tput", + "displayName": "Qwen3 235B A22B Instruct 2507 FP8", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2025-07-25", + "openWeights": true, + "releaseDate": "2025-07-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen3-235B-A22B-Instruct-2507-tput", + "mode": "chat", + "metadata": { + "source": "https://www.together.ai/models/qwen3-235b-a22b-instruct-2507-fp8" + } + } + ] + }, + { + "id": "alibaba/qwen3-235b-a22b-thinking", + "provider": "alibaba", + "model": "qwen3-235b-a22b-thinking", + "displayName": "Qwen3 235B A22B Thinking", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "helicone", + "vercel" + ], + "aliases": [ + "helicone/qwen3-235b-a22b-thinking", + "vercel/alibaba/qwen3-235b-a22b-thinking" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "outputTokens": 81920, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "qwen3-235b-a22b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.9000000000000004 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3-235b-a22b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 235B A22B Thinking", + "Qwen3 235B A22B Thinking 2507" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-07", + "releaseDate": "2025-07-25", + "lastUpdated": "2025-07-25", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "qwen3-235b-a22b-thinking", + "modelKey": "qwen3-235b-a22b-thinking", + "displayName": "Qwen3 235B A22B Thinking", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2025-07-25", + "openWeights": false, + "releaseDate": "2025-07-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3-235b-a22b-thinking", + "modelKey": "alibaba/qwen3-235b-a22b-thinking", + "displayName": "Qwen3 235B A22B Thinking 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": false, + "releaseDate": "2025-09-24" + } + } + ] + }, + { + "id": "alibaba/qwen3-235b-a22b-thinking-2507", + "provider": "alibaba", + "model": "qwen3-235b-a22b-thinking-2507", + "displayName": "Qwen3 235B A22B Thinking 2507", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "chutes", + "deepinfra", + "fireworks_ai", + "huggingface", + "iflowcn", + "io-net", + "jiekou", + "kilo", + "llmgateway", + "modelscope", + "nano-gpt", + "novita", + "novita-ai", + "openrouter", + "qiniu-ai", + "siliconflow", + "siliconflow-cn", + "submodel", + "synthetic", + "together_ai", + "venice", + "wandb" + ], + "aliases": [ + "chutes/Qwen/Qwen3-235B-A22B-Thinking-2507", + "deepinfra/Qwen/Qwen3-235B-A22B-Thinking-2507", + "fireworks_ai/accounts/fireworks/models/qwen3-235b-a22b-thinking-2507", + "huggingface/Qwen/Qwen3-235B-A22B-Thinking-2507", + "iflowcn/qwen3-235b-a22b-thinking-2507", + "io-net/Qwen/Qwen3-235B-A22B-Thinking-2507", + "jiekou/qwen/qwen3-235b-a22b-thinking-2507", + "kilo/qwen/qwen3-235b-a22b-thinking-2507", + "llmgateway/qwen3-235b-a22b-thinking-2507", + "modelscope/Qwen/Qwen3-235B-A22B-Thinking-2507", + "nano-gpt/qwen/Qwen3-235B-A22B-Thinking-2507", + "novita-ai/qwen/qwen3-235b-a22b-thinking-2507", + "novita/qwen/qwen3-235b-a22b-thinking-2507", + "openrouter/qwen/qwen3-235b-a22b-thinking-2507", + "qiniu-ai/qwen3-235b-a22b-thinking-2507", + "siliconflow-cn/Qwen/Qwen3-235B-A22B-Thinking-2507", + "siliconflow/Qwen/Qwen3-235B-A22B-Thinking-2507", + "submodel/Qwen/Qwen3-235B-A22B-Thinking-2507", + "synthetic/hf:Qwen/Qwen3-235B-A22B-Thinking-2507", + "together_ai/Qwen/Qwen3-235B-A22B-Thinking-2507", + "venice/qwen3-235b-a22b-thinking-2507", + "wandb/Qwen/Qwen3-235B-A22B-Thinking-2507" + ], + "mergedProviderModelRecords": 22, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.055, + "input": 0.11, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "iflowcn", + "model": "qwen3-235b-a22b-thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "io-net", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.055, + "cacheWrite": 0.22, + "input": 0.11, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "qwen/qwen3-235b-a22b-thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-235b-a22b-thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.11, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-235b-a22b-thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "modelscope", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/Qwen3-235B-A22B-Thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-235b-a22b-thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b-thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "submodel", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:Qwen/Qwen3-235B-A22B-Thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.65, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "qwen3-235b-a22b-thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 3.5 + } + }, + { + "source": "models.dev", + "provider": "wandb", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-235B-A22B-Thinking-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 2.9 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-235b-a22b-thinking-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.22, + "output": 0.88 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-235b-a22b-thinking-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3-235b-a22b-thinking-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.11, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen3-235B-A22B-Thinking-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.65, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "wandb", + "model": "wandb/Qwen/Qwen3-235B-A22B-Thinking-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10000, + "output": 10000 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b-thinking-2507", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3 235B A22B Thinking 2507", + "Qwen 3 235B Thinking", + "Qwen 3 235b A22B 2507 Thinking", + "Qwen/Qwen3-235B-A22B-Thinking-2507", + "Qwen3 235B A22B Thinking (2507)", + "Qwen3 235B A22B Thinking 2507", + "Qwen3 235B A22b Thinking 2507", + "Qwen3-235B-A22B-Thinking", + "Qwen3-235B-A22B-Thinking-2507", + "Qwen: Qwen3 235B A22B Thinking 2507" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-12-29", + "lastUpdated": "2026-04-25", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 22 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "modelKey": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "displayName": "Qwen3 235B A22B Thinking 2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "modelKey": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "displayName": "Qwen3-235B-A22B-Thinking-2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-25", + "openWeights": true, + "releaseDate": "2025-07-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "iflowcn", + "providerName": "iFlow", + "providerApi": "https://apis.iflow.cn/v1", + "providerDoc": "https://platform.iflow.cn/en/docs", + "model": "qwen3-235b-a22b-thinking-2507", + "modelKey": "qwen3-235b-a22b-thinking-2507", + "displayName": "Qwen3-235B-A22B-Thinking", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-01", + "openWeights": true, + "releaseDate": "2025-07-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "io-net", + "providerName": "IO.NET", + "providerApi": "https://api.intelligence.io.solutions/api/v1", + "providerDoc": "https://io.net/docs/guides/intelligence/io-intelligence", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "modelKey": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "displayName": "Qwen 3 235B Thinking", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-07-01", + "openWeights": true, + "releaseDate": "2025-07-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "qwen/qwen3-235b-a22b-thinking-2507", + "modelKey": "qwen/qwen3-235b-a22b-thinking-2507", + "displayName": "Qwen3 235B A22b Thinking 2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-235b-a22b-thinking-2507", + "modelKey": "qwen/qwen3-235b-a22b-thinking-2507", + "displayName": "Qwen: Qwen3 235B A22B Thinking 2507", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-07-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-235b-a22b-thinking-2507", + "modelKey": "qwen3-235b-a22b-thinking-2507", + "displayName": "Qwen3 235B A22B Thinking (2507)", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-07-08", + "openWeights": true, + "releaseDate": "2025-07-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "modelscope", + "providerName": "ModelScope", + "providerApi": "https://api-inference.modelscope.cn/v1", + "providerDoc": "https://modelscope.cn/docs/model-service/API-Inference/intro", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "modelKey": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "displayName": "Qwen3-235B-A22B-Thinking-2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-25", + "openWeights": true, + "releaseDate": "2025-07-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/Qwen3-235B-A22B-Thinking-2507", + "modelKey": "qwen/Qwen3-235B-A22B-Thinking-2507", + "displayName": "Qwen 3 235b A22B 2507 Thinking", + "metadata": { + "lastUpdated": "2025-09-11", + "openWeights": false, + "releaseDate": "2025-09-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-235b-a22b-thinking-2507", + "modelKey": "qwen/qwen3-235b-a22b-thinking-2507", + "displayName": "Qwen3 235B A22b Thinking 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-25", + "openWeights": true, + "releaseDate": "2025-07-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-235b-a22b-thinking-2507", + "modelKey": "qwen/qwen3-235b-a22b-thinking-2507", + "displayName": "Qwen3 235B A22B Thinking 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-06-30", + "lastUpdated": "2025-07-25", + "openWeights": true, + "releaseDate": "2025-07-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen3-235b-a22b-thinking-2507", + "modelKey": "qwen3-235b-a22b-thinking-2507", + "displayName": "Qwen3 235B A22B Thinking 2507", + "metadata": { + "lastUpdated": "2025-08-12", + "openWeights": false, + "releaseDate": "2025-08-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "modelKey": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "displayName": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "modelKey": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "displayName": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "submodel", + "providerName": "submodel", + "providerApi": "https://llm.submodel.ai/v1", + "providerDoc": "https://submodel.gitbook.io", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "modelKey": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "displayName": "Qwen3 235B A22B Thinking 2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-08-23", + "openWeights": true, + "releaseDate": "2025-08-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:Qwen/Qwen3-235B-A22B-Thinking-2507", + "modelKey": "hf:Qwen/Qwen3-235B-A22B-Thinking-2507", + "displayName": "Qwen3 235B A22B Thinking 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-25", + "openWeights": true, + "releaseDate": "2025-07-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "qwen3-235b-a22b-thinking-2507", + "modelKey": "qwen3-235b-a22b-thinking-2507", + "displayName": "Qwen 3 235B A22B Thinking 2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2025-04-29", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "modelKey": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "displayName": "Qwen3-235B-A22B-Thinking-2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-03-12", + "openWeights": true, + "releaseDate": "2025-07-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-235B-A22B-Thinking-2507", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-235b-a22b-thinking-2507", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-235b-a22b-thinking-2507", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3-235b-a22b-thinking-2507", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/qwen/qwen3-235b-a22b-thinking-2507" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen3-235B-A22B-Thinking-2507", + "mode": "chat", + "metadata": { + "source": "https://www.together.ai/models/qwen3-235b-a22b-thinking-2507" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "wandb", + "model": "wandb/Qwen/Qwen3-235B-A22B-Thinking-2507", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b-thinking-2507", + "displayName": "Qwen: Qwen3 235B A22B Thinking 2507", + "metadata": { + "canonicalSlug": "qwen/qwen3-235b-a22b-thinking-2507", + "createdAt": "2025-07-25T13:19:17.000Z", + "huggingFaceId": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "instructType": "qwen3", + "knowledgeCutoff": "2025-06-30", + "links": { + "details": "/api/v1/models/qwen/qwen3-235b-a22b-thinking-2507/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 262144, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-235b-a22b-thinking-2507-fast", + "provider": "alibaba", + "model": "qwen3-235b-a22b-thinking-2507-fast", + "displayName": "Qwen3-235B-A22B-Thinking-2507-fast", + "sources": [ + "models.dev" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/Qwen/Qwen3-235B-A22B-Thinking-2507-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 7000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nebius", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.625, + "input": 0.5, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3-235B-A22B-Thinking-2507-fast" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-07", + "releaseDate": "2025-07-25", + "lastUpdated": "2026-05-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "Qwen/Qwen3-235B-A22B-Thinking-2507-fast", + "modelKey": "Qwen/Qwen3-235B-A22B-Thinking-2507-fast", + "displayName": "Qwen3-235B-A22B-Thinking-2507-fast", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2026-05-07", + "openWeights": true, + "releaseDate": "2025-07-25" + } + } + ] + }, + { + "id": "alibaba/qwen3-30b-a3b", + "provider": "alibaba", + "model": "qwen3-30b-a3b", + "displayName": "Qwen3-30B-A3B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "chutes", + "dashscope", + "deepinfra", + "fireworks_ai", + "helicone", + "kilo", + "nano-gpt", + "nebius", + "openrouter", + "qiniu-ai" + ], + "aliases": [ + "302ai/qwen3-30b-a3b", + "chutes/Qwen/Qwen3-30B-A3B", + "dashscope/qwen3-30b-a3b", + "deepinfra/Qwen/Qwen3-30B-A3B", + "fireworks_ai/accounts/fireworks/models/qwen3-30b-a3b", + "helicone/qwen3-30b-a3b", + "kilo/qwen/qwen3-30b-a3b", + "nano-gpt/qwen/qwen3-30b-a3b", + "nebius/Qwen/Qwen3-30B-A3B", + "openrouter/qwen/qwen3-30b-a3b", + "qiniu-ai/qwen3-30b-a3b" + ], + "mergedProviderModelRecords": 11, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "qwen3-30b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.11, + "output": 1.08 + } + }, + { + "source": "models.dev", + "provider": "chutes", + "model": "Qwen/Qwen3-30B-A3B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.06, + "output": 0.22 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "qwen3-30b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "output": 0.29 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-30b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.08, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/qwen3-30b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen3-30b-a3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-30B-A3B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.29 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-30b-a3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/Qwen/Qwen3-30B-A3B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 30B A3B", + "Qwen3-30B-A3B", + "Qwen: Qwen3 30B A3B" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-04-29", + "lastUpdated": "2025-04-29", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 11 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "qwen3-30b-a3b", + "modelKey": "qwen3-30b-a3b", + "displayName": "Qwen3-30B-A3B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04-29", + "openWeights": false, + "releaseDate": "2025-04-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "Qwen/Qwen3-30B-A3B", + "modelKey": "Qwen/Qwen3-30B-A3B", + "displayName": "Qwen3 30B A3B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "qwen3-30b-a3b", + "modelKey": "qwen3-30b-a3b", + "displayName": "Qwen3 30B A3B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-06-01", + "openWeights": false, + "releaseDate": "2025-06-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-30b-a3b", + "modelKey": "qwen/qwen3-30b-a3b", + "displayName": "Qwen: Qwen3 30B A3B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/qwen3-30b-a3b", + "modelKey": "qwen/qwen3-30b-a3b", + "displayName": "Qwen3 30B A3B", + "metadata": { + "lastUpdated": "2025-02-27", + "openWeights": false, + "releaseDate": "2025-02-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-30b-a3b", + "modelKey": "qwen/qwen3-30b-a3b", + "displayName": "Qwen3 30B A3B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-04-28", + "openWeights": true, + "releaseDate": "2025-04-28", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen3-30b-a3b", + "modelKey": "qwen3-30b-a3b", + "displayName": "Qwen3 30B A3B", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen3-30b-a3b", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-30B-A3B", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-30b-a3b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/Qwen/Qwen3-30B-A3B", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b", + "displayName": "Qwen: Qwen3 30B A3B", + "metadata": { + "canonicalSlug": "qwen/qwen3-30b-a3b-04-28", + "createdAt": "2025-04-28T22:16:44.000Z", + "huggingFaceId": "Qwen/Qwen3-30B-A3B", + "instructType": "qwen3", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/qwen/qwen3-30b-a3b-04-28/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 40960, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-30b-a3b-2507", + "provider": "alibaba", + "model": "qwen3-30b-a3b-2507", + "displayName": "Qwen3 30B A3B 2507", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "lmstudio" + ], + "aliases": [ + "lmstudio/qwen/qwen3-30b-a3b-2507" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "lmstudio", + "model": "qwen/qwen3-30b-a3b-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 30B A3B 2507" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-07-30", + "lastUpdated": "2025-07-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "lmstudio", + "providerName": "LMStudio", + "providerApi": "http://127.0.0.1:1234/v1", + "providerDoc": "https://lmstudio.ai/models", + "model": "qwen/qwen3-30b-a3b-2507", + "modelKey": "qwen/qwen3-30b-a3b-2507", + "displayName": "Qwen3 30B A3B 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-30", + "openWeights": true, + "releaseDate": "2025-07-30" + } + } + ] + }, + { + "id": "alibaba/qwen3-30b-a3b-fp8", + "provider": "alibaba", + "model": "qwen3-30b-a3b-fp8", + "displayName": "Qwen3 30B A3B FP8", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway", + "cloudflare-workers-ai", + "jiekou", + "llmgateway", + "novita", + "novita-ai" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/qwen/qwen3-30b-a3b-fp8", + "cloudflare-workers-ai/@cf/qwen/qwen3-30b-a3b-fp8", + "jiekou/qwen/qwen3-30b-a3b-fp8", + "llmgateway/qwen3-30b-a3b-fp8", + "novita-ai/qwen/qwen3-30b-a3b-fp8", + "novita/qwen/qwen3-30b-a3b-fp8" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 131072, + "inputTokens": 40960, + "maxTokens": 20000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/qwen/qwen3-30b-a3b-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.051, + "output": 0.34 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/qwen/qwen3-30b-a3b-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0509, + "output": 0.335 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "qwen/qwen3-30b-a3b-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.45 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-30b-a3b-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-30b-a3b-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.45 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-30b-a3b-fp8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.09, + "output": 0.45 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 30B A3B", + "Qwen3 30B A3B FP8", + "Qwen3 30B A3b fp8" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-11-14", + "lastUpdated": "2025-11-14", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/qwen/qwen3-30b-a3b-fp8", + "modelKey": "workers-ai/@cf/qwen/qwen3-30b-a3b-fp8", + "displayName": "Qwen3 30B A3B FP8", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/qwen/qwen3-30b-a3b-fp8", + "modelKey": "@cf/qwen/qwen3-30b-a3b-fp8", + "displayName": "Qwen3 30B A3b fp8", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-04-30", + "openWeights": true, + "releaseDate": "2025-04-30", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "qwen/qwen3-30b-a3b-fp8", + "modelKey": "qwen/qwen3-30b-a3b-fp8", + "displayName": "Qwen3 30B A3B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-30b-a3b-fp8", + "modelKey": "qwen3-30b-a3b-fp8", + "displayName": "Qwen3 30B A3B FP8", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-04-28", + "openWeights": true, + "releaseDate": "2025-04-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-30b-a3b-fp8", + "modelKey": "qwen/qwen3-30b-a3b-fp8", + "displayName": "Qwen3 30B A3B", + "metadata": { + "lastUpdated": "2025-04-29", + "openWeights": true, + "releaseDate": "2025-04-29" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-30b-a3b-fp8", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-30b-a3b-instruct-2507", + "provider": "alibaba", + "model": "qwen3-30b-a3b-instruct-2507", + "displayName": "Qwen3 30B A3B Instruct 2507", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "clarifai", + "fireworks_ai", + "kilo", + "llmgateway", + "modelscope", + "nano-gpt", + "nearai", + "nebius", + "openrouter", + "qiniu-ai", + "siliconflow", + "siliconflow-cn", + "wandb" + ], + "aliases": [ + "clarifai/qwen/qwenLM/models/Qwen3-30B-A3B-Instruct-2507", + "fireworks_ai/accounts/fireworks/models/qwen3-30b-a3b-instruct-2507", + "kilo/qwen/qwen3-30b-a3b-instruct-2507", + "llmgateway/qwen3-30b-a3b-instruct-2507", + "modelscope/Qwen/Qwen3-30B-A3B-Instruct-2507", + "nano-gpt/TEE/qwen3-30b-a3b-instruct-2507", + "nano-gpt/qwen3-30b-a3b-instruct-2507", + "nearai/Qwen/Qwen3-30B-A3B-Instruct-2507", + "nebius/Qwen/Qwen3-30B-A3B-Instruct-2507", + "openrouter/qwen/qwen3-30b-a3b-instruct-2507", + "qiniu-ai/qwen3-30b-a3b-instruct-2507", + "siliconflow-cn/Qwen/Qwen3-30B-A3B-Instruct-2507", + "siliconflow/Qwen/Qwen3-30B-A3B-Instruct-2507", + "wandb/Qwen/Qwen3-30B-A3B-Instruct-2507" + ], + "mergedProviderModelRecords": 14, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "clarifai", + "model": "qwen/qwenLM/models/Qwen3-30B-A3B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-30b-a3b-instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.09, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-30b-a3b-instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "modelscope", + "model": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3-30b-a3b-instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/qwen3-30b-a3b-instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.44999999999999996 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.55 + } + }, + { + "source": "models.dev", + "provider": "nebius", + "model": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0.125, + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b-instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04815, + "output": 0.19305 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "wandb", + "model": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-30b-a3b-instruct-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b-instruct-2507", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04815, + "output": 0.19305 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3-30B-A3B-Instruct-2507", + "Qwen3 30B A3B Instruct (2507)", + "Qwen3 30B A3B Instruct 2507", + "Qwen3 30B A3B Instruct 2507 TEE", + "Qwen3 30B-A3B Instruct 2507", + "Qwen3 30b A3b Instruct 2507", + "Qwen3-30B-A3B-Instruct-2507", + "Qwen: Qwen3 30B A3B Instruct 2507" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-07-30", + "lastUpdated": "2026-02-25", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 14 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "clarifai", + "providerName": "Clarifai", + "providerApi": "https://api.clarifai.com/v2/ext/openai/v1", + "providerDoc": "https://docs.clarifai.com/compute/inference/", + "model": "qwen/qwenLM/models/Qwen3-30B-A3B-Instruct-2507", + "modelKey": "qwen/qwenLM/models/Qwen3-30B-A3B-Instruct-2507", + "displayName": "Qwen3 30B A3B Instruct 2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-25", + "openWeights": true, + "releaseDate": "2025-07-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-30b-a3b-instruct-2507", + "modelKey": "qwen/qwen3-30b-a3b-instruct-2507", + "displayName": "Qwen: Qwen3 30B A3B Instruct 2507", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-07-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-30b-a3b-instruct-2507", + "modelKey": "qwen3-30b-a3b-instruct-2507", + "displayName": "Qwen3 30B A3B Instruct (2507)", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-07-08", + "openWeights": true, + "releaseDate": "2025-07-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "modelscope", + "providerName": "ModelScope", + "providerApi": "https://api-inference.modelscope.cn/v1", + "providerDoc": "https://modelscope.cn/docs/model-service/API-Inference/intro", + "model": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "modelKey": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "displayName": "Qwen3 30B A3B Instruct 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-30", + "openWeights": true, + "releaseDate": "2025-07-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3-30b-a3b-instruct-2507", + "modelKey": "qwen3-30b-a3b-instruct-2507", + "displayName": "Qwen3 30B A3B Instruct 2507", + "metadata": { + "lastUpdated": "2025-02-20", + "openWeights": false, + "releaseDate": "2025-02-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/qwen3-30b-a3b-instruct-2507", + "modelKey": "TEE/qwen3-30b-a3b-instruct-2507", + "displayName": "Qwen3 30B A3B Instruct 2507 TEE", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-07-29", + "openWeights": false, + "releaseDate": "2025-07-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "modelKey": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "displayName": "Qwen3 30B-A3B Instruct 2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-07-29", + "openWeights": true, + "releaseDate": "2025-07-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "modelKey": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "displayName": "Qwen3-30B-A3B-Instruct-2507", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2026-01-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-30b-a3b-instruct-2507", + "modelKey": "qwen/qwen3-30b-a3b-instruct-2507", + "displayName": "Qwen3 30B A3B Instruct 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-06-30", + "lastUpdated": "2025-07-29", + "openWeights": true, + "releaseDate": "2025-07-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen3-30b-a3b-instruct-2507", + "modelKey": "qwen3-30b-a3b-instruct-2507", + "displayName": "Qwen3 30b A3b Instruct 2507", + "metadata": { + "lastUpdated": "2026-02-04", + "openWeights": false, + "releaseDate": "2026-02-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "modelKey": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "displayName": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-07-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "modelKey": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "displayName": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-07-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "modelKey": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "displayName": "Qwen3 30B A3B Instruct 2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-03-12", + "openWeights": true, + "releaseDate": "2025-07-29" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-30b-a3b-instruct-2507", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b-instruct-2507", + "displayName": "Qwen: Qwen3 30B A3B Instruct 2507", + "metadata": { + "canonicalSlug": "qwen/qwen3-30b-a3b-instruct-2507", + "createdAt": "2025-07-29T16:36:05.000Z", + "huggingFaceId": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "knowledgeCutoff": "2025-06-30", + "links": { + "details": "/api/v1/models/qwen/qwen3-30b-a3b-instruct-2507/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 32000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-30b-a3b-instruct-2507-fp8", + "provider": "alibaba", + "model": "qwen3-30b-a3b-instruct-2507-fp8", + "displayName": "Qwen3 30B 2507", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "evroc" + ], + "aliases": [ + "evroc/Qwen/Qwen3-30B-A3B-Instruct-2507-FP8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "evroc", + "model": "Qwen/Qwen3-30B-A3B-Instruct-2507-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.35, + "output": 1.42 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 30B 2507" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-07-30", + "lastUpdated": "2025-07-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "evroc", + "providerName": "evroc", + "providerApi": "https://models.think.evroc.com/v1", + "providerDoc": "https://docs.evroc.com/products/think/overview.html", + "model": "Qwen/Qwen3-30B-A3B-Instruct-2507-FP8", + "modelKey": "Qwen/Qwen3-30B-A3B-Instruct-2507-FP8", + "displayName": "Qwen3 30B 2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-07-30", + "openWeights": true, + "releaseDate": "2025-07-30" + } + } + ] + }, + { + "id": "alibaba/qwen3-30b-a3b-thinking-2507", + "provider": "alibaba", + "model": "qwen3-30b-a3b-thinking-2507", + "displayName": "Qwen3 30B A3B Thinking 2507", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "clarifai", + "fireworks_ai", + "kilo", + "llmgateway", + "modelscope", + "openrouter", + "qiniu-ai", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "clarifai/qwen/qwenLM/models/Qwen3-30B-A3B-Thinking-2507", + "fireworks_ai/accounts/fireworks/models/qwen3-30b-a3b-thinking-2507", + "kilo/qwen/qwen3-30b-a3b-thinking-2507", + "llmgateway/qwen3-30b-a3b-thinking-2507", + "modelscope/Qwen/Qwen3-30B-A3B-Thinking-2507", + "openrouter/qwen/qwen3-30b-a3b-thinking-2507", + "qiniu-ai/qwen3-30b-a3b-thinking-2507", + "siliconflow-cn/Qwen/Qwen3-30B-A3B-Thinking-2507", + "siliconflow/Qwen/Qwen3-30B-A3B-Thinking-2507" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "clarifai", + "model": "qwen/qwenLM/models/Qwen3-30B-A3B-Thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.36, + "output": 1.3 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-30b-a3b-thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.051, + "output": 0.34 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-30b-a3b-thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "models.dev", + "provider": "modelscope", + "model": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b-thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.08, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-30b-a3b-thinking-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b-thinking-2507", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.08, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3-30B-A3B-Thinking-2507", + "Qwen3 30B A3B Thinking (2507)", + "Qwen3 30B A3B Thinking 2507", + "Qwen3 30b A3b Thinking 2507", + "Qwen: Qwen3 30B A3B Thinking 2507" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-07-31", + "lastUpdated": "2026-02-25", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "clarifai", + "providerName": "Clarifai", + "providerApi": "https://api.clarifai.com/v2/ext/openai/v1", + "providerDoc": "https://docs.clarifai.com/compute/inference/", + "model": "qwen/qwenLM/models/Qwen3-30B-A3B-Thinking-2507", + "modelKey": "qwen/qwenLM/models/Qwen3-30B-A3B-Thinking-2507", + "displayName": "Qwen3 30B A3B Thinking 2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-25", + "openWeights": true, + "releaseDate": "2025-07-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-30b-a3b-thinking-2507", + "modelKey": "qwen/qwen3-30b-a3b-thinking-2507", + "displayName": "Qwen: Qwen3 30B A3B Thinking 2507", + "metadata": { + "lastUpdated": "2025-07-29", + "openWeights": true, + "releaseDate": "2025-07-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-30b-a3b-thinking-2507", + "modelKey": "qwen3-30b-a3b-thinking-2507", + "displayName": "Qwen3 30B A3B Thinking (2507)", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-07-08", + "openWeights": true, + "releaseDate": "2025-07-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "modelscope", + "providerName": "ModelScope", + "providerApi": "https://api-inference.modelscope.cn/v1", + "providerDoc": "https://modelscope.cn/docs/model-service/API-Inference/intro", + "model": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "modelKey": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "displayName": "Qwen3 30B A3B Thinking 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-30", + "openWeights": true, + "releaseDate": "2025-07-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-30b-a3b-thinking-2507", + "modelKey": "qwen/qwen3-30b-a3b-thinking-2507", + "displayName": "Qwen3 30B A3B Thinking 2507", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-06-30", + "lastUpdated": "2025-08-28", + "openWeights": true, + "releaseDate": "2025-08-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen3-30b-a3b-thinking-2507", + "modelKey": "qwen3-30b-a3b-thinking-2507", + "displayName": "Qwen3 30b A3b Thinking 2507", + "metadata": { + "lastUpdated": "2026-02-04", + "openWeights": false, + "releaseDate": "2026-02-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "modelKey": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "displayName": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-07-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "modelKey": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "displayName": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-07-31" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-30b-a3b-thinking-2507", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b-thinking-2507", + "displayName": "Qwen: Qwen3 30B A3B Thinking 2507", + "metadata": { + "canonicalSlug": "qwen/qwen3-30b-a3b-thinking-2507", + "createdAt": "2025-08-28T16:39:52.000Z", + "huggingFaceId": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "knowledgeCutoff": "2025-06-30", + "links": { + "details": "/api/v1/models/qwen/qwen3-30b-a3b-thinking-2507/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 131072, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-32b", + "provider": "alibaba", + "model": "qwen3-32b", + "displayName": "Qwen3 32B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "alibaba", + "alibaba-cn", + "cortecs", + "deepinfra", + "fireworks_ai", + "groq", + "helicone", + "iflowcn", + "kilo", + "llmgateway", + "nano-gpt", + "nebius", + "openrouter", + "ovhcloud", + "qiniu-ai", + "sambanova", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "abacus/Qwen/Qwen3-32B", + "alibaba-cn/qwen3-32b", + "alibaba/qwen3-32b", + "cortecs/qwen3-32b", + "deepinfra/Qwen/Qwen3-32B", + "fireworks_ai/accounts/fireworks/models/qwen3-32b", + "groq/qwen/qwen3-32b", + "helicone/qwen3-32b", + "iflowcn/qwen3-32b", + "kilo/qwen/qwen3-32b", + "llmgateway/qwen3-32b", + "nano-gpt/qwen/qwen3-32b", + "nebius/Qwen/Qwen3-32B", + "openrouter/qwen/qwen3-32b", + "ovhcloud/Qwen3-32B", + "ovhcloud/qwen3-32b", + "qiniu-ai/qwen3-32b", + "sambanova/Qwen3-32B", + "siliconflow-cn/Qwen/Qwen3-32B", + "siliconflow/Qwen/Qwen3-32B" + ], + "mergedProviderModelRecords": 19, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "Qwen/Qwen3-32B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.29 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.287, + "output": 1.147, + "reasoningOutput": 2.868 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 2.8, + "reasoningOutput": 8.4 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "qwen3-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.099, + "output": 0.33 + } + }, + { + "source": "models.dev", + "provider": "groq", + "model": "qwen/qwen3-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 0.59 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "qwen3-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 0.59 + } + }, + { + "source": "models.dev", + "provider": "iflowcn", + "model": "qwen3-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.08, + "output": 0.24 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 2.8, + "reasoningOutput": 8.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/qwen3-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "nebius", + "model": "Qwen/Qwen3-32B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0.125, + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "ovhcloud", + "model": "qwen3-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.25 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-32B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.57 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-32B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.57 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-32B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.28 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-32b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "groq", + "model": "groq/qwen/qwen3-32b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.29, + "output": 0.59 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/Qwen/Qwen3-32B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "ovhcloud", + "model": "ovhcloud/Qwen3-32B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.23 + } + }, + { + "source": "litellm", + "provider": "sambanova", + "model": "sambanova/Qwen3-32B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 0.8 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-32b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3 32b", + "Qwen/Qwen3-32B", + "Qwen3 32B", + "Qwen3-32B", + "Qwen: Qwen3 32B" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-04-29", + "lastUpdated": "2025-04-29", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 19 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "Qwen/Qwen3-32B", + "modelKey": "Qwen/Qwen3-32B", + "displayName": "Qwen3 32B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-04-29", + "openWeights": true, + "releaseDate": "2025-04-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-32b", + "modelKey": "qwen3-32b", + "displayName": "Qwen3 32B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-32b", + "modelKey": "qwen3-32b", + "displayName": "Qwen3 32B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "qwen3-32b", + "modelKey": "qwen3-32b", + "displayName": "Qwen3 32B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-04-29", + "openWeights": true, + "releaseDate": "2025-04-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "groq", + "providerName": "Groq", + "providerDoc": "https://console.groq.com/docs/models", + "model": "qwen/qwen3-32b", + "modelKey": "qwen/qwen3-32b", + "displayName": "Qwen3-32B", + "family": "qwen", + "status": "beta", + "metadata": { + "lastUpdated": "2025-06-12", + "openWeights": true, + "releaseDate": "2025-06-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "default" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "qwen3-32b", + "modelKey": "qwen3-32b", + "displayName": "Qwen3 32B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04-28", + "openWeights": false, + "releaseDate": "2025-04-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "iflowcn", + "providerName": "iFlow", + "providerApi": "https://apis.iflow.cn/v1", + "providerDoc": "https://platform.iflow.cn/en/docs", + "model": "qwen3-32b", + "modelKey": "qwen3-32b", + "displayName": "Qwen3-32B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-12-01", + "openWeights": true, + "releaseDate": "2024-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-32b", + "modelKey": "qwen/qwen3-32b", + "displayName": "Qwen: Qwen3 32B", + "metadata": { + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2024-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-32b", + "modelKey": "qwen3-32b", + "displayName": "Qwen3 32B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/qwen3-32b", + "modelKey": "qwen/qwen3-32b", + "displayName": "Qwen 3 32b", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "Qwen/Qwen3-32B", + "modelKey": "Qwen/Qwen3-32B", + "displayName": "Qwen3-32B", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2026-01-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-32b", + "modelKey": "qwen/qwen3-32b", + "displayName": "Qwen3 32B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ovhcloud", + "providerName": "OVHcloud AI Endpoints", + "providerApi": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", + "providerDoc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", + "model": "qwen3-32b", + "modelKey": "qwen3-32b", + "displayName": "Qwen3-32B", + "metadata": { + "lastUpdated": "2025-07-16", + "openWeights": true, + "releaseDate": "2025-07-16", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen3-32b", + "modelKey": "qwen3-32b", + "displayName": "Qwen3 32B", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-32B", + "modelKey": "Qwen/Qwen3-32B", + "displayName": "Qwen/Qwen3-32B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-04-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-32B", + "modelKey": "Qwen/Qwen3-32B", + "displayName": "Qwen/Qwen3-32B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-04-30" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-32B", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-32b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "groq", + "model": "groq/qwen/qwen3-32b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/Qwen/Qwen3-32B", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ovhcloud", + "model": "ovhcloud/Qwen3-32B", + "mode": "chat", + "metadata": { + "source": "https://endpoints.ai.cloud.ovh.net/models/qwen3-32b" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sambanova", + "model": "sambanova/Qwen3-32B", + "mode": "chat", + "metadata": { + "source": "https://cloud.sambanova.ai/plans/pricing" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-32b", + "displayName": "Qwen: Qwen3 32B", + "metadata": { + "canonicalSlug": "qwen/qwen3-32b-04-28", + "createdAt": "2025-04-28T21:32:25.000Z", + "huggingFaceId": "Qwen/Qwen3-32B", + "instructType": "qwen3", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/qwen/qwen3-32b-04-28/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 40960, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-32b-cs", + "provider": "alibaba", + "model": "qwen3-32b-cs", + "displayName": "qwen3-32b-cs", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/cerebras/qwen3-32b-cs" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "qwen3-32b-cs" + ], + "statuses": [ + "deprecated" + ], + "releaseDate": "2025-05-15", + "lastUpdated": "2025-05-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "cerebras/qwen3-32b-cs", + "modelKey": "cerebras/qwen3-32b-cs", + "displayName": "qwen3-32b-cs", + "status": "deprecated", + "metadata": { + "lastUpdated": "2025-05-15", + "openWeights": false, + "releaseDate": "2025-05-15" + } + } + ] + }, + { + "id": "alibaba/qwen3-32b-fp8", + "provider": "alibaba", + "model": "qwen3-32b-fp8", + "displayName": "Qwen3 32B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "jiekou", + "lambda_ai", + "llmgateway", + "novita", + "novita-ai" + ], + "aliases": [ + "jiekou/qwen/qwen3-32b-fp8", + "lambda_ai/qwen3-32b-fp8", + "llmgateway/qwen3-32b-fp8", + "novita-ai/qwen/qwen3-32b-fp8", + "novita/qwen/qwen3-32b-fp8" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "jiekou", + "model": "qwen/qwen3-32b-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.45 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-32b-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-32b-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.45 + } + }, + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/qwen3-32b-fp8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-32b-fp8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.45 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 32B", + "Qwen3 32B FP8" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-01", + "lastUpdated": "2026-01", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "qwen/qwen3-32b-fp8", + "modelKey": "qwen/qwen3-32b-fp8", + "displayName": "Qwen3 32B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-32b-fp8", + "modelKey": "qwen3-32b-fp8", + "displayName": "Qwen3 32B FP8", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-04-28", + "openWeights": true, + "releaseDate": "2025-04-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-32b-fp8", + "modelKey": "qwen/qwen3-32b-fp8", + "displayName": "Qwen3 32B", + "metadata": { + "lastUpdated": "2025-04-29", + "openWeights": true, + "releaseDate": "2025-04-29" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/qwen3-32b-fp8", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-32b-fp8", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-32b-tee", + "provider": "alibaba", + "model": "qwen3-32b-tee", + "displayName": "Qwen3 32B TEE", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/Qwen/Qwen3-32B-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 40960, + "outputTokens": 40960, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "Qwen/Qwen3-32B-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.08, + "output": 0.24 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 32B TEE" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-04", + "lastUpdated": "2025-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "Qwen/Qwen3-32B-TEE", + "modelKey": "Qwen/Qwen3-32B-TEE", + "displayName": "Qwen3 32B TEE", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "alibaba/qwen3-4b", + "provider": "alibaba", + "model": "qwen3-4b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai", + "nebius" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen3-4b", + "nebius/Qwen/Qwen3-4B" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 40960, + "inputTokens": 40960, + "maxTokens": 40960, + "outputTokens": 40960, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "functionCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-4b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/Qwen/Qwen3-4B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.24 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-4b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/Qwen/Qwen3-4B", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + } + ] + }, + { + "id": "alibaba/qwen3-4b-fp8", + "provider": "alibaba", + "model": "qwen3-4b-fp8", + "displayName": "Qwen3 4B FP8", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "llmgateway", + "novita", + "novita-ai" + ], + "aliases": [ + "llmgateway/qwen3-4b-fp8", + "novita-ai/qwen/qwen3-4b-fp8", + "novita/qwen/qwen3-4b-fp8" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 131072, + "inputTokens": 128000, + "maxTokens": 20000, + "outputTokens": 20000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-4b-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.03, + "output": 0.03 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-4b-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.03, + "output": 0.03 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-4b-fp8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.03, + "output": 0.03 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 4B", + "Qwen3 4B FP8" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-04-28", + "lastUpdated": "2025-04-28", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-4b-fp8", + "modelKey": "qwen3-4b-fp8", + "displayName": "Qwen3 4B FP8", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-04-28", + "openWeights": true, + "releaseDate": "2025-04-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-4b-fp8", + "modelKey": "qwen/qwen3-4b-fp8", + "displayName": "Qwen3 4B", + "metadata": { + "lastUpdated": "2025-04-29", + "openWeights": true, + "releaseDate": "2025-04-29" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-4b-fp8", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-4b-instruct-2507", + "provider": "alibaba", + "model": "qwen3-4b-instruct-2507", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen3-4b-instruct-2507" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-4b-instruct-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-4b-instruct-2507", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-4b-instruct-2507-gguf", + "provider": "alibaba", + "model": "qwen3-4b-instruct-2507-gguf", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lemonade" + ], + "aliases": [ + "lemonade/Qwen3-4B-Instruct-2507-GGUF" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lemonade", + "model": "lemonade/Qwen3-4B-Instruct-2507-GGUF", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lemonade", + "model": "lemonade/Qwen3-4B-Instruct-2507-GGUF", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-5-35b-a3b", + "provider": "alibaba", + "model": "qwen3-5-35b-a3b", + "displayName": "Qwen 3.5 35B A3B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/qwen3-5-35b-a3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "qwen3-5-35b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15625, + "input": 0.3125, + "output": 1.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.5 35B A3B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-02-25", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "qwen3-5-35b-a3b", + "modelKey": "qwen3-5-35b-a3b", + "displayName": "Qwen 3.5 35B A3B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-02-25", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "alibaba/qwen3-5-397b-a17b", + "provider": "alibaba", + "model": "qwen3-5-397b-a17b", + "displayName": "Qwen 3.5 397B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/qwen3-5-397b-a17b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "qwen3-5-397b-a17b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.75, + "output": 4.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.5 397B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-02-16", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "qwen3-5-397b-a17b", + "modelKey": "qwen3-5-397b-a17b", + "displayName": "Qwen 3.5 397B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-02-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "alibaba/qwen3-5-9b", + "provider": "alibaba", + "model": "qwen3-5-9b", + "displayName": "Qwen 3.5 9B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/qwen3-5-9b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "qwen3-5-9b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.5 9B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-03-05", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "qwen3-5-9b", + "modelKey": "qwen3-5-9b", + "displayName": "Qwen 3.5 9B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "alibaba/qwen3-5-9b-mlx-4bit", + "provider": "alibaba", + "model": "qwen3-5-9b-mlx-4bit", + "displayName": "Qwen 3.5 9B (MLX 4-bit)", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "atomic-chat" + ], + "aliases": [ + "atomic-chat/Qwen3_5-9B-MLX-4bit" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "atomic-chat", + "model": "Qwen3_5-9B-MLX-4bit", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.5 9B (MLX 4-bit)" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-03-05", + "lastUpdated": "2026-04-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "atomic-chat", + "providerName": "Atomic Chat", + "providerApi": "http://127.0.0.1:1337/v1", + "providerDoc": "https://atomic.chat", + "model": "Qwen3_5-9B-MLX-4bit", + "modelKey": "Qwen3_5-9B-MLX-4bit", + "displayName": "Qwen 3.5 9B (MLX 4-bit)", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-04", + "openWeights": true, + "releaseDate": "2026-03-05" + } + } + ] + }, + { + "id": "alibaba/qwen3-5-9b-q4-k-m", + "provider": "alibaba", + "model": "qwen3-5-9b-q4-k-m", + "displayName": "Qwen 3.5 9B (Q4_K_M)", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "atomic-chat" + ], + "aliases": [ + "atomic-chat/Qwen3_5-9B-Q4_K_M" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "atomic-chat", + "model": "Qwen3_5-9B-Q4_K_M", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.5 9B (Q4_K_M)" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-03-05", + "lastUpdated": "2026-04-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "atomic-chat", + "providerName": "Atomic Chat", + "providerApi": "http://127.0.0.1:1337/v1", + "providerDoc": "https://atomic.chat", + "model": "Qwen3_5-9B-Q4_K_M", + "modelKey": "Qwen3_5-9B-Q4_K_M", + "displayName": "Qwen 3.5 9B (Q4_K_M)", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-04", + "openWeights": true, + "releaseDate": "2026-03-05" + } + } + ] + }, + { + "id": "alibaba/qwen3-6-27b", + "provider": "alibaba", + "model": "qwen3-6-27b", + "displayName": "Qwen 3.6 27B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/qwen3-6-27b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "qwen3-6-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.325, + "output": 3.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.6 27B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-04-24", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "qwen3-6-27b", + "modelKey": "qwen3-6-27b", + "displayName": "Qwen 3.6 27B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "alibaba/qwen3-6-35b", + "provider": "alibaba", + "model": "qwen3-6-35b", + "displayName": "Qwen3.6 35B-A3B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "llmtr" + ], + "aliases": [ + "llmtr/qwen3-6-35b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmtr", + "model": "qwen3-6-35b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.6 35B-A3B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-04-17", + "lastUpdated": "2026-04-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmtr", + "providerName": "LLMTR", + "providerApi": "https://llmtr.com/v1", + "providerDoc": "https://llmtr.com/docs", + "model": "qwen3-6-35b", + "modelKey": "qwen3-6-35b", + "displayName": "Qwen3.6 35B-A3B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": true, + "releaseDate": "2026-04-17", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "alibaba/qwen3-8b", + "provider": "alibaba", + "model": "qwen3-8b", + "displayName": "Qwen3 8B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "fireworks_ai", + "kilo", + "llamagate", + "nano-gpt", + "openrouter", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "alibaba-cn/qwen3-8b", + "alibaba/qwen3-8b", + "fireworks_ai/accounts/fireworks/models/qwen3-8b", + "kilo/qwen/qwen3-8b", + "llamagate/qwen3-8b", + "nano-gpt/qwen/Qwen3-8B", + "openrouter/qwen/qwen3-8b", + "siliconflow-cn/Qwen/Qwen3-8B", + "siliconflow/Qwen/Qwen3-8B" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 131072, + "inputTokens": 41000, + "maxTokens": 40960, + "outputTokens": 131000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "functionCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.072, + "output": 0.287, + "reasoningOutput": 0.717 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.7, + "reasoningOutput": 2.1 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/Qwen3-8B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.47, + "output": 0.47 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-8B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.06, + "output": 0.06 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-8B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.06, + "output": 0.06 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "llamagate", + "model": "llamagate/qwen3-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.14 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-8b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.05, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3 8B", + "Qwen/Qwen3-8B", + "Qwen3 8B", + "Qwen: Qwen3 8B" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-04", + "lastUpdated": "2025-04", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-8b", + "modelKey": "qwen3-8b", + "displayName": "Qwen3 8B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-8b", + "modelKey": "qwen3-8b", + "displayName": "Qwen3 8B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-8b", + "modelKey": "qwen/qwen3-8b", + "displayName": "Qwen: Qwen3 8B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/Qwen3-8B", + "modelKey": "qwen/Qwen3-8B", + "displayName": "Qwen 3 8B", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-8b", + "modelKey": "qwen/qwen3-8b", + "displayName": "Qwen3 8B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-04-28", + "openWeights": true, + "releaseDate": "2025-04-28", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-8B", + "modelKey": "Qwen/Qwen3-8B", + "displayName": "Qwen/Qwen3-8B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-04-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-8B", + "modelKey": "Qwen/Qwen3-8B", + "displayName": "Qwen/Qwen3-8B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-04-30" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-8b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "llamagate", + "model": "llamagate/qwen3-8b", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-8b", + "displayName": "Qwen: Qwen3 8B", + "metadata": { + "canonicalSlug": "qwen/qwen3-8b-04-28", + "createdAt": "2025-04-28T21:43:52.000Z", + "huggingFaceId": "Qwen/Qwen3-8B", + "instructType": "qwen3", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/qwen/qwen3-8b-04-28/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 40960, + "max_completion_tokens": 8192, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-8b-fp8", + "provider": "alibaba", + "model": "qwen3-8b-fp8", + "displayName": "Qwen3 8B", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "novita", + "novita-ai" + ], + "aliases": [ + "novita-ai/qwen/qwen3-8b-fp8", + "novita/qwen/qwen3-8b-fp8" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 20000, + "outputTokens": 20000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-8b-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.035, + "output": 0.138 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-8b-fp8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.035, + "output": 0.138 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 8B" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-04-29", + "lastUpdated": "2025-04-29", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-8b-fp8", + "modelKey": "qwen/qwen3-8b-fp8", + "displayName": "Qwen3 8B", + "metadata": { + "lastUpdated": "2025-04-29", + "openWeights": true, + "releaseDate": "2025-04-29" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-8b-fp8", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-asr-flash", + "provider": "alibaba", + "model": "qwen3-asr-flash", + "displayName": "Qwen3-ASR Flash", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen3-asr-flash", + "alibaba/qwen3-asr-flash" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 53248, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": true, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3-asr-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.032, + "output": 0.032 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-asr-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.035, + "output": 0.035 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3-ASR Flash" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-09-08", + "lastUpdated": "2025-09-08", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-asr-flash", + "modelKey": "qwen3-asr-flash", + "displayName": "Qwen3-ASR Flash", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-09-08", + "openWeights": false, + "releaseDate": "2025-09-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-asr-flash", + "modelKey": "qwen3-asr-flash", + "displayName": "Qwen3-ASR Flash", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-09-08", + "openWeights": false, + "releaseDate": "2025-09-08" + } + } + ] + }, + { + "id": "alibaba/qwen3-coder", + "provider": "alibaba", + "model": "qwen3-coder", + "displayName": "Qwen3 Coder 480B A35B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "fastrouter", + "helicone", + "kilo", + "nano-gpt", + "opencode", + "openrouter", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "fastrouter/qwen/qwen3-coder", + "helicone/qwen3-coder", + "kilo/qwen/qwen3-coder", + "nano-gpt/qwen/qwen3-coder", + "opencode/qwen3-coder", + "openrouter/qwen/qwen3-coder", + "vercel/alibaba/qwen3-coder", + "vercel_ai_gateway/alibaba/qwen3-coder" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 1048576, + "inputTokens": 262144, + "maxTokens": 262100, + "outputTokens": 262100, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fastrouter", + "model": "qwen/qwen3-coder", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "qwen3-coder", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.22, + "output": 0.95 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-coder", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.022, + "input": 0.22, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/qwen3-coder", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "qwen3-coder", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 1.8 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-coder", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.22, + "output": 1.8 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3-coder", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "input": 1.5, + "output": 7.5 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3-coder", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.22, + "output": 0.95 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/alibaba/qwen3-coder", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-coder", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.22, + "output": 1.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3 Coder 480B", + "Qwen3 Coder", + "Qwen3 Coder 480B A35B", + "Qwen3 Coder 480B A35B Instruct", + "Qwen3 Coder 480B A35B Instruct Turbo", + "Qwen: Qwen3 Coder 480B A35B" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-07-23", + "lastUpdated": "2025-07-23", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "qwen/qwen3-coder", + "modelKey": "qwen/qwen3-coder", + "displayName": "Qwen3 Coder", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "qwen3-coder", + "modelKey": "qwen3-coder", + "displayName": "Qwen3 Coder 480B A35B Instruct Turbo", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2025-07-23", + "openWeights": false, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-coder", + "modelKey": "qwen/qwen3-coder", + "displayName": "Qwen: Qwen3 Coder 480B A35B", + "metadata": { + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/qwen3-coder", + "modelKey": "qwen/qwen3-coder", + "displayName": "Qwen 3 Coder 480B", + "metadata": { + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "qwen3-coder", + "modelKey": "qwen3-coder", + "displayName": "Qwen3 Coder", + "family": "qwen", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-coder", + "modelKey": "qwen/qwen3-coder", + "displayName": "Qwen3 Coder 480B A35B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-06-30", + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3-coder", + "modelKey": "alibaba/qwen3-coder", + "displayName": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": false, + "releaseDate": "2025-04-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3-coder", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/qwen/qwen3-coder" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/alibaba/qwen3-coder", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-coder", + "displayName": "Qwen: Qwen3 Coder 480B A35B", + "metadata": { + "canonicalSlug": "qwen/qwen3-coder-480b-a35b-07-25", + "createdAt": "2025-07-23T00:29:06.000Z", + "huggingFaceId": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "knowledgeCutoff": "2025-06-30", + "links": { + "details": "/api/v1/models/qwen/qwen3-coder-480b-a35b-07-25/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-coder-30b", + "provider": "alibaba", + "model": "qwen3-coder-30b", + "displayName": "Qwen3 Coder 30B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "lmstudio" + ], + "aliases": [ + "lmstudio/qwen/qwen3-coder-30b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "lmstudio", + "model": "qwen/qwen3-coder-30b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 Coder 30B" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-07-23", + "lastUpdated": "2025-07-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "lmstudio", + "providerName": "LMStudio", + "providerApi": "http://127.0.0.1:1234/v1", + "providerDoc": "https://lmstudio.ai/models", + "model": "qwen/qwen3-coder-30b", + "modelKey": "qwen/qwen3-coder-30b", + "displayName": "Qwen3 Coder 30B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + } + ] + }, + { + "id": "alibaba/qwen3-coder-30b-a3b", + "provider": "alibaba", + "model": "qwen3-coder-30b-a3b", + "displayName": "Qwen3-Coder 30B-A3B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "privatemode-ai", + "vercel" + ], + "aliases": [ + "privatemode-ai/qwen3-coder-30b-a3b", + "vercel/alibaba/qwen3-coder-30b-a3b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "privatemode-ai", + "model": "qwen3-coder-30b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3-coder-30b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3 Coder 30B A3B Instruct", + "Qwen3-Coder 30B-A3B" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-04", + "lastUpdated": "2025-04", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "privatemode-ai", + "providerName": "Privatemode AI", + "providerApi": "http://localhost:8080/v1", + "providerDoc": "https://docs.privatemode.ai/api/overview", + "model": "qwen3-coder-30b-a3b", + "modelKey": "qwen3-coder-30b-a3b", + "displayName": "Qwen3-Coder 30B-A3B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3-coder-30b-a3b", + "modelKey": "alibaba/qwen3-coder-30b-a3b", + "displayName": "Qwen 3 Coder 30B A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": false, + "releaseDate": "2025-04-01" + } + } + ] + }, + { + "id": "alibaba/qwen3-coder-30b-a3b-instruct", + "provider": "alibaba", + "model": "qwen3-coder-30b-a3b-instruct", + "displayName": "Qwen3-Coder 30B-A3B Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "clarifai", + "cortecs", + "fireworks_ai", + "helicone", + "kilo", + "llmgateway", + "modelscope", + "nano-gpt", + "novita", + "novita-ai", + "openrouter", + "ovhcloud", + "scaleway", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "alibaba-cn/qwen3-coder-30b-a3b-instruct", + "alibaba/qwen3-coder-30b-a3b-instruct", + "clarifai/qwen/qwenCoder/models/Qwen3-Coder-30B-A3B-Instruct", + "cortecs/qwen3-coder-30b-a3b-instruct", + "fireworks_ai/accounts/fireworks/models/qwen3-coder-30b-a3b-instruct", + "helicone/qwen3-coder-30b-a3b-instruct", + "kilo/qwen/qwen3-coder-30b-a3b-instruct", + "llmgateway/qwen3-coder-30b-a3b-instruct", + "modelscope/Qwen/Qwen3-Coder-30B-A3B-Instruct", + "nano-gpt/qwen3-coder-30b-a3b-instruct", + "novita-ai/qwen/qwen3-coder-30b-a3b-instruct", + "novita/qwen/qwen3-coder-30b-a3b-instruct", + "openrouter/qwen/qwen3-coder-30b-a3b-instruct", + "ovhcloud/qwen3-coder-30b-a3b-instruct", + "scaleway/qwen3-coder-30b-a3b-instruct", + "siliconflow-cn/Qwen/Qwen3-Coder-30B-A3B-Instruct", + "siliconflow/Qwen/Qwen3-Coder-30B-A3B-Instruct" + ], + "mergedProviderModelRecords": 17, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "functionCalling": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3-coder-30b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.216, + "output": 0.861 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-coder-30b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 2.25 + } + }, + { + "source": "models.dev", + "provider": "clarifai", + "model": "qwen/qwenCoder/models/Qwen3-Coder-30B-A3B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.11458, + "output": 0.74812 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "qwen3-coder-30b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.053, + "output": 0.222 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "qwen3-coder-30b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09999999999999999, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-coder-30b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.27 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-coder-30b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 2.25 + } + }, + { + "source": "models.dev", + "provider": "modelscope", + "model": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3-coder-30b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-coder-30b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.27 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-coder-30b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.27 + } + }, + { + "source": "models.dev", + "provider": "ovhcloud", + "model": "qwen3-coder-30b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.26 + } + }, + { + "source": "models.dev", + "provider": "scaleway", + "model": "qwen3-coder-30b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.28 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-coder-30b-a3b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-coder-30b-a3b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0.27 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-coder-30b-a3b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0.27 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "Qwen3 Coder 30B A3B Instruct", + "Qwen3 Coder 30b A3B Instruct", + "Qwen3-Coder 30B-A3B Instruct", + "Qwen3-Coder-30B-A3B-Instruct", + "Qwen: Qwen3 Coder 30B A3B Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-04", + "lastUpdated": "2025-04", + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 17 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-coder-30b-a3b-instruct", + "modelKey": "qwen3-coder-30b-a3b-instruct", + "displayName": "Qwen3-Coder 30B-A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-coder-30b-a3b-instruct", + "modelKey": "qwen3-coder-30b-a3b-instruct", + "displayName": "Qwen3-Coder 30B-A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "clarifai", + "providerName": "Clarifai", + "providerApi": "https://api.clarifai.com/v2/ext/openai/v1", + "providerDoc": "https://docs.clarifai.com/compute/inference/", + "model": "qwen/qwenCoder/models/Qwen3-Coder-30B-A3B-Instruct", + "modelKey": "qwen/qwenCoder/models/Qwen3-Coder-30B-A3B-Instruct", + "displayName": "Qwen3 Coder 30B A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2025-07-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "qwen3-coder-30b-a3b-instruct", + "modelKey": "qwen3-coder-30b-a3b-instruct", + "displayName": "Qwen3 Coder 30B A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-31", + "openWeights": true, + "releaseDate": "2025-07-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "qwen3-coder-30b-a3b-instruct", + "modelKey": "qwen3-coder-30b-a3b-instruct", + "displayName": "Qwen3 Coder 30B A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2025-07-31", + "openWeights": false, + "releaseDate": "2025-07-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-coder-30b-a3b-instruct", + "modelKey": "qwen/qwen3-coder-30b-a3b-instruct", + "displayName": "Qwen: Qwen3 Coder 30B A3B Instruct", + "metadata": { + "lastUpdated": "2025-07-31", + "openWeights": true, + "releaseDate": "2025-07-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-coder-30b-a3b-instruct", + "modelKey": "qwen3-coder-30b-a3b-instruct", + "displayName": "Qwen3-Coder 30B-A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "modelscope", + "providerName": "ModelScope", + "providerApi": "https://api-inference.modelscope.cn/v1", + "providerDoc": "https://modelscope.cn/docs/model-service/API-Inference/intro", + "model": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "modelKey": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "displayName": "Qwen3 Coder 30B A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-31", + "openWeights": true, + "releaseDate": "2025-07-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3-coder-30b-a3b-instruct", + "modelKey": "qwen3-coder-30b-a3b-instruct", + "displayName": "Qwen3 Coder 30B A3B Instruct", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-coder-30b-a3b-instruct", + "modelKey": "qwen/qwen3-coder-30b-a3b-instruct", + "displayName": "Qwen3 Coder 30b A3B Instruct", + "metadata": { + "lastUpdated": "2025-10-09", + "openWeights": true, + "releaseDate": "2025-10-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-coder-30b-a3b-instruct", + "modelKey": "qwen/qwen3-coder-30b-a3b-instruct", + "displayName": "Qwen3-Coder 30B-A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ovhcloud", + "providerName": "OVHcloud AI Endpoints", + "providerApi": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", + "providerDoc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", + "model": "qwen3-coder-30b-a3b-instruct", + "modelKey": "qwen3-coder-30b-a3b-instruct", + "displayName": "Qwen3-Coder-30B-A3B-Instruct", + "metadata": { + "lastUpdated": "2025-10-28", + "openWeights": true, + "releaseDate": "2025-10-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "scaleway", + "providerName": "Scaleway", + "providerApi": "https://api.scaleway.ai/v1", + "providerDoc": "https://www.scaleway.com/en/docs/generative-apis/", + "model": "qwen3-coder-30b-a3b-instruct", + "modelKey": "qwen3-coder-30b-a3b-instruct", + "displayName": "Qwen3-Coder 30B-A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-03-17", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "modelKey": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "displayName": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-08-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "modelKey": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "displayName": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-08-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-coder-30b-a3b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-coder-30b-a3b-instruct", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-coder-30b-a3b-instruct", + "displayName": "Qwen: Qwen3 Coder 30B A3B Instruct", + "metadata": { + "canonicalSlug": "qwen/qwen3-coder-30b-a3b-instruct", + "createdAt": "2025-07-31T14:32:59.000Z", + "huggingFaceId": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "knowledgeCutoff": "2025-06-30", + "links": { + "details": "/api/v1/models/qwen/qwen3-coder-30b-a3b-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 160000, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-coder-30b-a3b-instruct-gguf", + "provider": "alibaba", + "model": "qwen3-coder-30b-a3b-instruct-gguf", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lemonade" + ], + "aliases": [ + "lemonade/Qwen3-Coder-30B-A3B-Instruct-GGUF" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lemonade", + "model": "lemonade/Qwen3-Coder-30B-A3B-Instruct-GGUF", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lemonade", + "model": "lemonade/Qwen3-Coder-30B-A3B-Instruct-GGUF", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-coder-480b-a35b-instruct", + "provider": "alibaba", + "model": "qwen3-coder-480b-a35b-instruct", + "displayName": "Qwen3-Coder 480B-A35B Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "abacus", + "alibaba", + "alibaba-cn", + "cortecs", + "deepinfra", + "fireworks_ai", + "huggingface", + "jiekou", + "llmgateway", + "novita", + "novita-ai", + "nvidia", + "qiniu-ai", + "siliconflow", + "siliconflow-cn", + "synthetic", + "wandb" + ], + "aliases": [ + "302ai/qwen3-coder-480b-a35b-instruct", + "abacus/Qwen/qwen3-coder-480b-a35b-instruct", + "alibaba-cn/qwen3-coder-480b-a35b-instruct", + "alibaba/qwen3-coder-480b-a35b-instruct", + "cortecs/qwen3-coder-480b-a35b-instruct", + "deepinfra/Qwen/Qwen3-Coder-480B-A35B-Instruct", + "fireworks_ai/accounts/fireworks/models/qwen3-coder-480b-a35b-instruct", + "huggingface/Qwen/Qwen3-Coder-480B-A35B-Instruct", + "jiekou/qwen/qwen3-coder-480b-a35b-instruct", + "llmgateway/qwen3-coder-480b-a35b-instruct", + "novita-ai/qwen/qwen3-coder-480b-a35b-instruct", + "novita/qwen/qwen3-coder-480b-a35b-instruct", + "nvidia/qwen/qwen3-coder-480b-a35b-instruct", + "qiniu-ai/qwen3-coder-480b-a35b-instruct", + "siliconflow-cn/Qwen/Qwen3-Coder-480B-A35B-Instruct", + "siliconflow/Qwen/Qwen3-Coder-480B-A35B-Instruct", + "synthetic/hf:Qwen/Qwen3-Coder-480B-A35B-Instruct", + "wandb/Qwen/Qwen3-Coder-480B-A35B-Instruct" + ], + "mergedProviderModelRecords": 18, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "functionCalling": true, + "toolChoice": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "qwen3-coder-480b-a35b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.86, + "output": 3.43 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "Qwen/qwen3-coder-480b-a35b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3-coder-480b-a35b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.861, + "output": 3.441 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-coder-480b-a35b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 7.5 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "qwen3-coder-480b-a35b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.441, + "output": 1.984 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "qwen/qwen3-coder-480b-a35b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-coder-480b-a35b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 7.5 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-coder-480b-a35b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.3 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "qwen/qwen3-coder-480b-a35b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:Qwen/Qwen3-Coder-480B-A35B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "wandb", + "model": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-Coder-480B-A35B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-coder-480b-a35b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.45, + "output": 1.8 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-coder-480b-a35b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.3 + } + }, + { + "source": "litellm", + "provider": "wandb", + "model": "wandb/Qwen/Qwen3-Coder-480B-A35B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 100000, + "output": 150000 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3 Coder 480B", + "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "Qwen3 Coder 480B A35B Instruct", + "Qwen3-Coder 480B-A35B Instruct", + "Qwen3-Coder-480B-A35B-Instruct", + "qwen3-coder-480b-a35b-instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-07-23", + "lastUpdated": "2025-07-23", + "providerModelRecordCount": 18 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "qwen3-coder-480b-a35b-instruct", + "modelKey": "qwen3-coder-480b-a35b-instruct", + "displayName": "qwen3-coder-480b-a35b-instruct", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": false, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "Qwen/qwen3-coder-480b-a35b-instruct", + "modelKey": "Qwen/qwen3-coder-480b-a35b-instruct", + "displayName": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-07-22", + "openWeights": true, + "releaseDate": "2025-07-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-coder-480b-a35b-instruct", + "modelKey": "qwen3-coder-480b-a35b-instruct", + "displayName": "Qwen3-Coder 480B-A35B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-coder-480b-a35b-instruct", + "modelKey": "qwen3-coder-480b-a35b-instruct", + "displayName": "Qwen3-Coder 480B-A35B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "qwen3-coder-480b-a35b-instruct", + "modelKey": "qwen3-coder-480b-a35b-instruct", + "displayName": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-07-25", + "openWeights": true, + "releaseDate": "2025-07-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "modelKey": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "displayName": "Qwen3-Coder-480B-A35B-Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "qwen/qwen3-coder-480b-a35b-instruct", + "modelKey": "qwen/qwen3-coder-480b-a35b-instruct", + "displayName": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-coder-480b-a35b-instruct", + "modelKey": "qwen3-coder-480b-a35b-instruct", + "displayName": "Qwen3-Coder 480B-A35B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-coder-480b-a35b-instruct", + "modelKey": "qwen/qwen3-coder-480b-a35b-instruct", + "displayName": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "qwen/qwen3-coder-480b-a35b-instruct", + "modelKey": "qwen/qwen3-coder-480b-a35b-instruct", + "displayName": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": false, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen3-coder-480b-a35b-instruct", + "modelKey": "qwen3-coder-480b-a35b-instruct", + "displayName": "Qwen3 Coder 480B A35B Instruct", + "metadata": { + "lastUpdated": "2025-08-14", + "openWeights": false, + "releaseDate": "2025-08-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "modelKey": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "displayName": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-07-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "modelKey": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "displayName": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-07-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:Qwen/Qwen3-Coder-480B-A35B-Instruct", + "modelKey": "hf:Qwen/Qwen3-Coder-480B-A35B-Instruct", + "displayName": "Qwen 3 Coder 480B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "modelKey": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "displayName": "Qwen3-Coder-480B-A35B-Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-03-12", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-Coder-480B-A35B-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-coder-480b-a35b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-coder-480b-a35b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "wandb", + "model": "wandb/Qwen/Qwen3-Coder-480B-A35B-Instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-coder-480b-a35b-instruct-fp8", + "provider": "alibaba", + "model": "qwen3-coder-480b-a35b-instruct-fp8", + "displayName": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "submodel", + "together_ai", + "togetherai" + ], + "aliases": [ + "submodel/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", + "together_ai/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", + "togetherai/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 262144, + "inputTokens": 256000, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "submodel", + "model": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 Coder 480B A35B Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-08-23", + "lastUpdated": "2025-08-23", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "submodel", + "providerName": "submodel", + "providerApi": "https://llm.submodel.ai/v1", + "providerDoc": "https://submodel.gitbook.io", + "model": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", + "modelKey": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", + "displayName": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-08-23", + "openWeights": false, + "releaseDate": "2025-08-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", + "modelKey": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", + "displayName": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", + "mode": "chat", + "metadata": { + "source": "https://www.together.ai/models/qwen3-coder-480b-a35b-instruct" + } + } + ] + }, + { + "id": "alibaba/qwen3-coder-480b-a35b-instruct-int4-mixed-ar", + "provider": "alibaba", + "model": "qwen3-coder-480b-a35b-instruct-int4-mixed-ar", + "displayName": "Qwen 3 Coder 480B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "io-net" + ], + "aliases": [ + "io-net/Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 106000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "io-net", + "model": "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0.44, + "input": 0.22, + "output": 0.95 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3 Coder 480B" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-01-15", + "lastUpdated": "2025-01-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "io-net", + "providerName": "IO.NET", + "providerApi": "https://api.intelligence.io.solutions/api/v1", + "providerDoc": "https://io.net/docs/guides/intelligence/io-intelligence", + "model": "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar", + "modelKey": "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar", + "displayName": "Qwen 3 Coder 480B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-15", + "openWeights": true, + "releaseDate": "2025-01-15" + } + } + ] + }, + { + "id": "alibaba/qwen3-coder-480b-a35b-instruct-maas", + "provider": "alibaba", + "model": "qwen3-coder-480b-a35b-instruct-maas", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-qwen_models" + ], + "aliases": [ + "vertex_ai-qwen_models/vertex_ai/qwen/qwen3-coder-480b-a35b-instruct-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-qwen_models", + "model": "vertex_ai/qwen/qwen3-coder-480b-a35b-instruct-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedRegions": [ + "global" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-qwen_models", + "model": "vertex_ai/qwen/qwen3-coder-480b-a35b-instruct-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", + "supportedRegions": [ + "global" + ] + } + } + ] + }, + { + "id": "alibaba/qwen3-coder-480b-a35b-instruct-turbo", + "provider": "alibaba", + "model": "qwen3-coder-480b-a35b-instruct-turbo", + "displayName": "Qwen3 Coder 480B A35B Instruct Turbo", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "deepinfra", + "venice" + ], + "aliases": [ + "deepinfra/Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo", + "venice/qwen3-coder-480b-a35b-instruct-turbo" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "deepinfra", + "model": "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "qwen3-coder-480b-a35b-instruct-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.35, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.29, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3 Coder 480B Turbo", + "Qwen3 Coder 480B A35B Instruct Turbo" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-07-23", + "lastUpdated": "2025-07-23", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo", + "modelKey": "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo", + "displayName": "Qwen3 Coder 480B A35B Instruct Turbo", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "qwen3-coder-480b-a35b-instruct-turbo", + "modelKey": "qwen3-coder-480b-a35b-instruct-turbo", + "displayName": "Qwen 3 Coder 480B Turbo", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-01-27" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-coder-480b-instruct-bf16", + "provider": "alibaba", + "model": "qwen3-coder-480b-instruct-bf16", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen3-coder-480b-instruct-bf16" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-coder-480b-instruct-bf16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-coder-480b-instruct-bf16", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-coder-flash", + "provider": "alibaba", + "model": "qwen3-coder-flash", + "displayName": "Qwen3 Coder Flash", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "dashscope", + "digitalocean", + "kilo", + "llmgateway", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "alibaba-cn/qwen3-coder-flash", + "alibaba/qwen3-coder-flash", + "dashscope/qwen3-coder-flash", + "digitalocean/qwen3-coder-flash", + "kilo/qwen/qwen3-coder-flash", + "llmgateway/qwen3-coder-flash", + "nano-gpt/qwen/qwen3-coder-flash", + "openrouter/qwen/qwen3-coder-flash" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 1000000, + "inputTokens": 997952, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3-coder-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.144, + "output": 0.574 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-coder-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "digitalocean", + "model": "qwen3-coder-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 1.7 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-coder-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.195, + "output": 0.975 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-coder-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/qwen3-coder-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-coder-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.039, + "cacheWrite": 0.24375, + "input": 0.195, + "output": 0.975 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen3-coder-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-coder-flash", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.039, + "cacheWrite": 0.24375, + "input": 0.195, + "output": 0.975 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 Coder Flash", + "Qwen: Qwen3 Coder Flash" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-07-28", + "lastUpdated": "2025-07-28", + "supportedParameters": [ + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-coder-flash", + "modelKey": "qwen3-coder-flash", + "displayName": "Qwen3 Coder Flash", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": false, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-coder-flash", + "modelKey": "qwen3-coder-flash", + "displayName": "Qwen3 Coder Flash", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": false, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "qwen3-coder-flash", + "modelKey": "qwen3-coder-flash", + "displayName": "Qwen3 Coder Flash", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-coder-flash", + "modelKey": "qwen/qwen3-coder-flash", + "displayName": "Qwen: Qwen3 Coder Flash", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-coder-flash", + "modelKey": "qwen3-coder-flash", + "displayName": "Qwen3 Coder Flash", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": false, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/qwen3-coder-flash", + "modelKey": "qwen/qwen3-coder-flash", + "displayName": "Qwen3 Coder Flash", + "metadata": { + "lastUpdated": "2025-09-17", + "openWeights": false, + "releaseDate": "2025-09-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-coder-flash", + "modelKey": "qwen/qwen3-coder-flash", + "displayName": "Qwen3 Coder Flash", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": false, + "releaseDate": "2025-07-28" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen3-coder-flash", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-coder-flash", + "displayName": "Qwen: Qwen3 Coder Flash", + "metadata": { + "canonicalSlug": "qwen/qwen3-coder-flash", + "createdAt": "2025-09-17T13:25:36.000Z", + "knowledgeCutoff": "2025-06-30", + "links": { + "details": "/api/v1/models/qwen/qwen3-coder-flash/endpoints" + }, + "supportedParameters": [ + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-coder-flash-2025-07-28", + "provider": "alibaba", + "model": "qwen3-coder-flash-2025-07-28", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "dashscope" + ], + "aliases": [ + "dashscope/qwen3-coder-flash-2025-07-28" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 997952, + "inputTokens": 997952, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen3-coder-flash-2025-07-28", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen3-coder-flash-2025-07-28", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen3-coder-next", + "provider": "alibaba", + "model": "qwen3-coder-next", + "displayName": "Qwen3 Coder Next", + "family": "qwen", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba-coding-plan", + "alibaba-coding-plan-cn", + "cortecs", + "huggingface", + "jiekou", + "kilo", + "llmgateway", + "nano-gpt", + "novita-ai", + "ollama-cloud", + "openrouter", + "regolo-ai", + "vercel" + ], + "aliases": [ + "alibaba-coding-plan-cn/qwen3-coder-next", + "alibaba-coding-plan/qwen3-coder-next", + "cortecs/qwen3-coder-next", + "huggingface/Qwen/Qwen3-Coder-Next", + "jiekou/qwen/qwen3-coder-next", + "kilo/qwen/qwen3-coder-next", + "llmgateway/qwen3-coder-next", + "nano-gpt/qwen/qwen3-coder-next", + "novita-ai/qwen/qwen3-coder-next", + "ollama-cloud/qwen3-coder-next", + "openrouter/qwen/qwen3-coder-next", + "regolo-ai/qwen3-coder-next", + "vercel/alibaba/qwen3-coder-next" + ], + "mergedProviderModelRecords": 13, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-coding-plan-cn", + "model": "qwen3-coder-next", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan", + "model": "qwen3-coder-next", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "qwen3-coder-next", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.158, + "output": 0.84 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "Qwen/Qwen3-Coder-Next", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "qwen/qwen3-coder-next", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-coder-next", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.035, + "input": 0.12, + "output": 0.75 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-coder-next", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.108, + "output": 0.675 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/qwen3-coder-next", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-coder-next", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-coder-next", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.07, + "input": 0.11, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "regolo-ai", + "model": "qwen3-coder-next", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3-coder-next", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-coder-next", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.07, + "input": 0.11, + "output": 0.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 Coder Next", + "Qwen3 Coder Next 80B", + "Qwen3-Coder-Next", + "Qwen: Qwen3 Coder Next", + "qwen/qwen3-coder-next", + "qwen3-coder-next" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-02-03", + "lastUpdated": "2026-02-03", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 13 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan-cn", + "providerName": "Alibaba Coding Plan (China)", + "providerApi": "https://coding.dashscope.aliyuncs.com/v1", + "providerDoc": "https://help.aliyun.com/zh/model-studio/coding-plan", + "model": "qwen3-coder-next", + "modelKey": "qwen3-coder-next", + "displayName": "Qwen3 Coder Next", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-03", + "openWeights": true, + "releaseDate": "2026-02-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan", + "providerName": "Alibaba Coding Plan", + "providerApi": "https://coding-intl.dashscope.aliyuncs.com/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/coding-plan", + "model": "qwen3-coder-next", + "modelKey": "qwen3-coder-next", + "displayName": "Qwen3 Coder Next", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-03", + "openWeights": true, + "releaseDate": "2026-02-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "qwen3-coder-next", + "modelKey": "qwen3-coder-next", + "displayName": "Qwen3 Coder Next 80B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2026-02-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "Qwen/Qwen3-Coder-Next", + "modelKey": "Qwen/Qwen3-Coder-Next", + "displayName": "Qwen3-Coder-Next", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-03", + "openWeights": true, + "releaseDate": "2026-02-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "qwen/qwen3-coder-next", + "modelKey": "qwen/qwen3-coder-next", + "displayName": "qwen/qwen3-coder-next", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02", + "openWeights": true, + "releaseDate": "2026-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-coder-next", + "modelKey": "qwen/qwen3-coder-next", + "displayName": "Qwen: Qwen3 Coder Next", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2026-02-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-coder-next", + "modelKey": "qwen3-coder-next", + "displayName": "Qwen3 Coder Next", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/qwen3-coder-next", + "modelKey": "qwen/qwen3-coder-next", + "displayName": "Qwen3 Coder Next", + "metadata": { + "lastUpdated": "2025-12-08", + "openWeights": false, + "releaseDate": "2025-12-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-coder-next", + "modelKey": "qwen/qwen3-coder-next", + "displayName": "Qwen3 Coder Next", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-03", + "openWeights": true, + "releaseDate": "2026-02-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "qwen3-coder-next", + "modelKey": "qwen3-coder-next", + "displayName": "qwen3-coder-next", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-08", + "openWeights": true, + "releaseDate": "2026-02-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-coder-next", + "modelKey": "qwen/qwen3-coder-next", + "displayName": "Qwen3 Coder Next", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2026-02-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "regolo-ai", + "providerName": "Regolo AI", + "providerApi": "https://api.regolo.ai/v1", + "providerDoc": "https://docs.regolo.ai/", + "model": "qwen3-coder-next", + "modelKey": "qwen3-coder-next", + "displayName": "Qwen3-Coder-Next", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-03-01", + "openWeights": true, + "releaseDate": "2026-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3-coder-next", + "modelKey": "alibaba/qwen3-coder-next", + "displayName": "Qwen3 Coder Next", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2025-07-22" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-coder-next", + "displayName": "Qwen: Qwen3 Coder Next", + "metadata": { + "canonicalSlug": "qwen/qwen3-coder-next-2025-02-03", + "createdAt": "2026-02-04T00:15:01.000Z", + "huggingFaceId": "Qwen/Qwen3-Coder-Next", + "links": { + "details": "/api/v1/models/qwen/qwen3-coder-next-2025-02-03/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 262144, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-coder-next-fp8", + "provider": "alibaba", + "model": "qwen3-coder-next-fp8", + "displayName": "Qwen3 Coder Next FP8", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "togetherai" + ], + "aliases": [ + "togetherai/Qwen/Qwen3-Coder-Next-FP8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "togetherai", + "model": "Qwen/Qwen3-Coder-Next-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 Coder Next FP8" + ], + "families": [ + "qwen" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2026-02-03", + "releaseDate": "2026-02-03", + "lastUpdated": "2026-02-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "Qwen/Qwen3-Coder-Next-FP8", + "modelKey": "Qwen/Qwen3-Coder-Next-FP8", + "displayName": "Qwen3 Coder Next FP8", + "family": "qwen", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2026-02-03", + "lastUpdated": "2026-02-03", + "openWeights": true, + "releaseDate": "2026-02-03" + } + } + ] + }, + { + "id": "alibaba/qwen3-coder-next-tee", + "provider": "alibaba", + "model": "qwen3-coder-next-tee", + "displayName": "Qwen3 Coder Next TEE", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/Qwen/Qwen3-Coder-Next-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "Qwen/Qwen3-Coder-Next-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.12, + "output": 0.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 Coder Next TEE" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-04-25", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "Qwen/Qwen3-Coder-Next-TEE", + "modelKey": "Qwen/Qwen3-Coder-Next-TEE", + "displayName": "Qwen3 Coder Next TEE", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2026-04-25" + } + } + ] + }, + { + "id": "alibaba/qwen3-coder-plus", + "provider": "alibaba", + "model": "qwen3-coder-plus", + "displayName": "Qwen3 Coder Plus", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "alibaba-coding-plan", + "alibaba-coding-plan-cn", + "dashscope", + "iflowcn", + "kilo", + "llmgateway", + "nano-gpt", + "openrouter", + "vercel", + "zenmux" + ], + "aliases": [ + "alibaba-cn/qwen3-coder-plus", + "alibaba-coding-plan-cn/qwen3-coder-plus", + "alibaba-coding-plan/qwen3-coder-plus", + "alibaba/qwen3-coder-plus", + "dashscope/qwen3-coder-plus", + "iflowcn/qwen3-coder-plus", + "kilo/qwen/qwen3-coder-plus", + "llmgateway/qwen3-coder-plus", + "nano-gpt/qwen/qwen3-coder-plus", + "openrouter/qwen/qwen3-coder-plus", + "vercel/alibaba/qwen3-coder-plus", + "zenmux/qwen/qwen3-coder-plus" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 1048576, + "inputTokens": 997952, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3-coder-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan-cn", + "model": "qwen3-coder-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan", + "model": "qwen3-coder-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-coder-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "iflowcn", + "model": "qwen3-coder-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-coder-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.65, + "output": 3.25 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-coder-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/qwen3-coder-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-coder-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "cacheWrite": 0.8125, + "input": 0.65, + "output": 3.25 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3-coder-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "qwen/qwen3-coder-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen3-coder-plus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3-coder-plus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-coder-plus", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.13, + "cacheWrite": 0.8125, + "input": 0.65, + "output": 3.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 Coder Plus", + "Qwen3-Coder-Plus", + "Qwen: Qwen3 Coder Plus" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-07-23", + "lastUpdated": "2025-07-23", + "supportedParameters": [ + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-coder-plus", + "modelKey": "qwen3-coder-plus", + "displayName": "Qwen3 Coder Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan-cn", + "providerName": "Alibaba Coding Plan (China)", + "providerApi": "https://coding.dashscope.aliyuncs.com/v1", + "providerDoc": "https://help.aliyun.com/zh/model-studio/coding-plan", + "model": "qwen3-coder-plus", + "modelKey": "qwen3-coder-plus", + "displayName": "Qwen3 Coder Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan", + "providerName": "Alibaba Coding Plan", + "providerApi": "https://coding-intl.dashscope.aliyuncs.com/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/coding-plan", + "model": "qwen3-coder-plus", + "modelKey": "qwen3-coder-plus", + "displayName": "Qwen3 Coder Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-coder-plus", + "modelKey": "qwen3-coder-plus", + "displayName": "Qwen3 Coder Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "iflowcn", + "providerName": "iFlow", + "providerApi": "https://apis.iflow.cn/v1", + "providerDoc": "https://platform.iflow.cn/en/docs", + "model": "qwen3-coder-plus", + "modelKey": "qwen3-coder-plus", + "displayName": "Qwen3-Coder-Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-01", + "openWeights": true, + "releaseDate": "2025-07-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-coder-plus", + "modelKey": "qwen/qwen3-coder-plus", + "displayName": "Qwen: Qwen3 Coder Plus", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-07-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-coder-plus", + "modelKey": "qwen3-coder-plus", + "displayName": "Qwen3 Coder Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": false, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/qwen3-coder-plus", + "modelKey": "qwen/qwen3-coder-plus", + "displayName": "Qwen3 Coder Plus", + "metadata": { + "lastUpdated": "2025-09-17", + "openWeights": false, + "releaseDate": "2025-09-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-coder-plus", + "modelKey": "qwen/qwen3-coder-plus", + "displayName": "Qwen3 Coder Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": false, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3-coder-plus", + "modelKey": "alibaba/qwen3-coder-plus", + "displayName": "Qwen3 Coder Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "qwen/qwen3-coder-plus", + "modelKey": "qwen/qwen3-coder-plus", + "displayName": "Qwen3-Coder-Plus", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-07-23", + "openWeights": false, + "releaseDate": "2025-07-23" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen3-coder-plus", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3-coder-plus", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/qwen/qwen3-coder-plus" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-coder-plus", + "displayName": "Qwen: Qwen3 Coder Plus", + "metadata": { + "canonicalSlug": "qwen/qwen3-coder-plus", + "createdAt": "2025-09-23T21:25:07.000Z", + "knowledgeCutoff": "2025-06-30", + "links": { + "details": "/api/v1/models/qwen/qwen3-coder-plus/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-coder-plus-2025-07-22", + "provider": "alibaba", + "model": "qwen3-coder-plus-2025-07-22", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "dashscope" + ], + "aliases": [ + "dashscope/qwen3-coder-plus-2025-07-22" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 997952, + "inputTokens": 997952, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen3-coder-plus-2025-07-22", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen3-coder-plus-2025-07-22", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen3-coder:480b", + "provider": "alibaba", + "model": "qwen3-coder:480b", + "displayName": "qwen3-coder:480b", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/qwen3-coder:480b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "qwen3-coder:480b" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-07-22", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "qwen3-coder:480b", + "modelKey": "qwen3-coder:480b", + "displayName": "qwen3-coder:480b", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-07-22" + } + } + ] + }, + { + "id": "alibaba/qwen3-coder:480b-cloud", + "provider": "alibaba", + "model": "qwen3-coder:480b-cloud", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/qwen3-coder:480b-cloud" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/qwen3-coder:480b-cloud", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/qwen3-coder:480b-cloud", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-coder:free", + "provider": "alibaba", + "model": "qwen3-coder:free", + "displayName": "Qwen3 Coder 480B A35B (free)", + "family": "qwen", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/qwen/qwen3-coder:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 262000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-coder:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-coder:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 Coder 480B A35B (free)", + "Qwen: Qwen3 Coder 480B A35B (free)" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-06-30", + "releaseDate": "2025-07-23", + "lastUpdated": "2025-07-23", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-coder:free", + "modelKey": "qwen/qwen3-coder:free", + "displayName": "Qwen3 Coder 480B A35B (free)", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-06-30", + "lastUpdated": "2025-07-23", + "openWeights": true, + "releaseDate": "2025-07-23" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-coder:free", + "displayName": "Qwen: Qwen3 Coder 480B A35B (free)", + "metadata": { + "canonicalSlug": "qwen/qwen3-coder-480b-a35b-07-25", + "createdAt": "2025-07-23T00:29:06.000Z", + "huggingFaceId": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "knowledgeCutoff": "2025-06-30", + "links": { + "details": "/api/v1/models/qwen/qwen3-coder-480b-a35b-07-25/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 262000, + "max_completion_tokens": 262000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-embedding-0.6b", + "provider": "alibaba", + "model": "qwen3-embedding-0.6b", + "displayName": "Qwen3 Embedding 0.6B", + "family": "qwen", + "mode": "embedding", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway", + "digitalocean", + "nearai", + "novita", + "vercel" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/qwen/qwen3-embedding-0.6b", + "digitalocean/qwen3-embedding-0.6b", + "nearai/Qwen/Qwen3-Embedding-0.6B", + "novita/qwen/qwen3-embedding-0.6b", + "vercel/alibaba/qwen3-embedding-0.6b" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 128000, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding", + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/qwen/qwen3-embedding-0.6b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.012, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "digitalocean", + "model": "qwen3-embedding-0.6b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "Qwen/Qwen3-Embedding-0.6B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.01, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-embedding-0.6b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 Embedding 0.6B" + ], + "families": [ + "qwen", + "text-embedding" + ], + "modes": [ + "embedding" + ], + "statuses": [ + "beta" + ], + "releaseDate": "2025-11-14", + "lastUpdated": "2025-11-14", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/qwen/qwen3-embedding-0.6b", + "modelKey": "workers-ai/@cf/qwen/qwen3-embedding-0.6b", + "displayName": "Qwen3 Embedding 0.6B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "qwen3-embedding-0.6b", + "modelKey": "qwen3-embedding-0.6b", + "displayName": "Qwen3 Embedding 0.6B", + "family": "text-embedding", + "status": "beta", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": true, + "releaseDate": "2025-06-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "Qwen/Qwen3-Embedding-0.6B", + "modelKey": "Qwen/Qwen3-Embedding-0.6B", + "displayName": "Qwen3 Embedding 0.6B", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2025-06-03", + "openWeights": true, + "releaseDate": "2025-06-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3-embedding-0.6b", + "modelKey": "alibaba/qwen3-embedding-0.6b", + "displayName": "Qwen3 Embedding 0.6B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-embedding-0.6b", + "mode": "embedding" + } + ] + }, + { + "id": "alibaba/qwen3-embedding-0p6b", + "provider": "alibaba", + "model": "qwen3-embedding-0p6b", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen3-embedding-0p6b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-embedding-0p6b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-embedding-0p6b", + "mode": "embedding" + } + ] + }, + { + "id": "alibaba/qwen3-embedding-4b", + "provider": "alibaba", + "model": "qwen3-embedding-4b", + "displayName": "Qwen 3 Embedding 4B", + "family": "qwen", + "mode": "embedding", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "fireworks_ai", + "huggingface", + "inference", + "privatemode-ai", + "vercel" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen3-embedding-4b", + "huggingface/Qwen/Qwen3-Embedding-4B", + "inference/qwen/qwen3-embedding-4b", + "privatemode-ai/qwen3-embedding-4b", + "vercel/alibaba/qwen3-embedding-4b" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 40960, + "inputTokens": 40960, + "maxTokens": 40960, + "outputTokens": 40960, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding", + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false, + "embedding": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "huggingface", + "model": "Qwen/Qwen3-Embedding-4B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.01, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "inference", + "model": "qwen/qwen3-embedding-4b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.01, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "privatemode-ai", + "model": "qwen3-embedding-4b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-embedding-4b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3 Embedding 4B", + "Qwen3 Embedding 4B", + "Qwen3-Embedding 4B" + ], + "families": [ + "qwen" + ], + "modes": [ + "embedding" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "Qwen/Qwen3-Embedding-4B", + "modelKey": "Qwen/Qwen3-Embedding-4B", + "displayName": "Qwen 3 Embedding 4B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-01", + "openWeights": true, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "inference", + "providerName": "Inference", + "providerApi": "https://inference.net/v1", + "providerDoc": "https://inference.net/models", + "model": "qwen/qwen3-embedding-4b", + "modelKey": "qwen/qwen3-embedding-4b", + "displayName": "Qwen 3 Embedding 4B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-01", + "openWeights": true, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "privatemode-ai", + "providerName": "Privatemode AI", + "providerApi": "http://localhost:8080/v1", + "providerDoc": "https://docs.privatemode.ai/api/overview", + "model": "qwen3-embedding-4b", + "modelKey": "qwen3-embedding-4b", + "displayName": "Qwen3-Embedding 4B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-06-06", + "openWeights": true, + "releaseDate": "2025-06-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3-embedding-4b", + "modelKey": "alibaba/qwen3-embedding-4b", + "displayName": "Qwen3 Embedding 4B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-06-05", + "openWeights": false, + "releaseDate": "2025-06-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-embedding-4b", + "mode": "embedding" + } + ] + }, + { + "id": "alibaba/qwen3-embedding-8b", + "provider": "alibaba", + "model": "qwen3-embedding-8b", + "displayName": "Qwen3 Embedding 8B", + "family": "text-embedding", + "mode": "embedding", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "evroc", + "huggingface", + "llamagate", + "nebius", + "novita", + "regolo-ai", + "scaleway", + "vercel" + ], + "aliases": [ + "evroc/Qwen/Qwen3-Embedding-8B", + "huggingface/Qwen/Qwen3-Embedding-8B", + "llamagate/qwen3-embedding-8b", + "nebius/Qwen/Qwen3-Embedding-8B", + "novita/qwen/qwen3-embedding-8b", + "regolo-ai/qwen3-embedding-8b", + "scaleway/qwen3-embedding-8b", + "vercel/alibaba/qwen3-embedding-8b" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 40960, + "inputTokens": 40960, + "maxTokens": 40960, + "outputTokens": 40960, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding", + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "temperature": true, + "structuredOutput": false, + "embedding": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "evroc", + "model": "Qwen/Qwen3-Embedding-8B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.12 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "Qwen/Qwen3-Embedding-8B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.01, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "nebius", + "model": "Qwen/Qwen3-Embedding-8B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.01, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "regolo-ai", + "model": "qwen3-embedding-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "models.dev", + "provider": "scaleway", + "model": "qwen3-embedding-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "llamagate", + "model": "llamagate/qwen3-embedding-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-embedding-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3 Embedding 8B", + "Qwen3 Embedding 8B", + "Qwen3-Embedding-8B" + ], + "families": [ + "qwen", + "text-embedding" + ], + "modes": [ + "embedding" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-07-30", + "lastUpdated": "2025-07-30", + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "evroc", + "providerName": "evroc", + "providerApi": "https://models.think.evroc.com/v1", + "providerDoc": "https://docs.evroc.com/products/think/overview.html", + "model": "Qwen/Qwen3-Embedding-8B", + "modelKey": "Qwen/Qwen3-Embedding-8B", + "displayName": "Qwen3 Embedding 8B", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2025-07-30", + "openWeights": true, + "releaseDate": "2025-07-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "Qwen/Qwen3-Embedding-8B", + "modelKey": "Qwen/Qwen3-Embedding-8B", + "displayName": "Qwen 3 Embedding 8B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-01", + "openWeights": true, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "Qwen/Qwen3-Embedding-8B", + "modelKey": "Qwen/Qwen3-Embedding-8B", + "displayName": "Qwen3-Embedding-8B", + "family": "text-embedding", + "metadata": { + "knowledgeCutoff": "2025-10", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2026-01-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "regolo-ai", + "providerName": "Regolo AI", + "providerApi": "https://api.regolo.ai/v1", + "providerDoc": "https://docs.regolo.ai/", + "model": "qwen3-embedding-8b", + "modelKey": "qwen3-embedding-8b", + "displayName": "Qwen3-Embedding-8B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-01", + "openWeights": true, + "releaseDate": "2026-02-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "scaleway", + "providerName": "Scaleway", + "providerApi": "https://api.scaleway.ai/v1", + "providerDoc": "https://www.scaleway.com/en/docs/generative-apis/", + "model": "qwen3-embedding-8b", + "modelKey": "qwen3-embedding-8b", + "displayName": "Qwen3 Embedding 8B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2025-25-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3-embedding-8b", + "modelKey": "alibaba/qwen3-embedding-8b", + "displayName": "Qwen3 Embedding 8B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-06-05", + "openWeights": false, + "releaseDate": "2025-06-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "llamagate", + "model": "llamagate/qwen3-embedding-8b", + "mode": "embedding" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-embedding-8b", + "mode": "embedding" + } + ] + }, + { + "id": "alibaba/qwen3-livetranslate-flash-realtime", + "provider": "alibaba", + "model": "qwen3-livetranslate-flash-realtime", + "displayName": "Qwen3-LiveTranslate Flash Realtime", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba" + ], + "aliases": [ + "alibaba/qwen3-livetranslate-flash-realtime" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 53248, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-livetranslate-flash-realtime", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "inputAudio": 10, + "output": 10, + "outputAudio": 38 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3-LiveTranslate Flash Realtime" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-09-22", + "lastUpdated": "2025-09-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-livetranslate-flash-realtime", + "modelKey": "qwen3-livetranslate-flash-realtime", + "displayName": "Qwen3-LiveTranslate Flash Realtime", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-09-22", + "openWeights": false, + "releaseDate": "2025-09-22" + } + } + ] + }, + { + "id": "alibaba/qwen3-max", + "provider": "alibaba", + "model": "qwen3-max", + "displayName": "Qwen3 Max", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "alibaba", + "alibaba-cn", + "dashscope", + "iflowcn", + "kilo", + "llmgateway", + "nano-gpt", + "novita", + "novita-ai", + "openrouter", + "orcarouter", + "qiniu-ai", + "vercel", + "zenmux" + ], + "aliases": [ + "abacus/qwen3-max", + "alibaba-cn/qwen3-max", + "alibaba/qwen3-max", + "dashscope/qwen3-max", + "iflowcn/qwen3-max", + "kilo/qwen/qwen3-max", + "llmgateway/qwen3-max", + "nano-gpt/qwen/qwen3-max", + "novita-ai/qwen/qwen3-max", + "novita/qwen/qwen3-max", + "openrouter/qwen/qwen3-max", + "orcarouter/qwen/qwen3-max", + "qiniu-ai/qwen3-max", + "vercel/alibaba/qwen3-max", + "zenmux/qwen/qwen3-max" + ], + "mergedProviderModelRecords": 15, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "qwen3-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.861, + "output": 3.441 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "iflowcn", + "model": "qwen3-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "input": 1.2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/qwen3-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.08018, + "output": 5.4009 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.11, + "output": 8.45 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.156, + "cacheWrite": 0.975, + "input": 0.78, + "output": 3.9 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "qwen/qwen3-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.359, + "output": 1.434 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "input": 1.2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "qwen/qwen3-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.2, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen3-max", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-max", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.11, + "output": 8.45 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-max", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.156, + "cacheWrite": 0.975, + "input": 0.78, + "output": 3.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 Max", + "Qwen3-Max", + "Qwen3-Max-Thinking", + "Qwen: Qwen3 Max" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-05-28", + "lastUpdated": "2025-05-28", + "supportedParameters": [ + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 15 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "qwen3-max", + "modelKey": "qwen3-max", + "displayName": "Qwen3 Max", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-05-28", + "openWeights": false, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-max", + "modelKey": "qwen3-max", + "displayName": "Qwen3 Max", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-23", + "openWeights": false, + "releaseDate": "2025-09-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-max", + "modelKey": "qwen3-max", + "displayName": "Qwen3 Max", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-23", + "openWeights": false, + "releaseDate": "2025-09-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "iflowcn", + "providerName": "iFlow", + "providerApi": "https://apis.iflow.cn/v1", + "providerDoc": "https://platform.iflow.cn/en/docs", + "model": "qwen3-max", + "modelKey": "qwen3-max", + "displayName": "Qwen3-Max", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-max", + "modelKey": "qwen/qwen3-max", + "displayName": "Qwen: Qwen3 Max", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-max", + "modelKey": "qwen3-max", + "displayName": "Qwen3 Max", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-23", + "openWeights": false, + "releaseDate": "2025-09-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/qwen3-max", + "modelKey": "qwen/qwen3-max", + "displayName": "Qwen3 Max", + "metadata": { + "lastUpdated": "2025-09-05", + "openWeights": false, + "releaseDate": "2025-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-max", + "modelKey": "qwen/qwen3-max", + "displayName": "Qwen3 Max", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-24", + "openWeights": false, + "releaseDate": "2025-09-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-max", + "modelKey": "qwen/qwen3-max", + "displayName": "Qwen3 Max", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-23", + "openWeights": false, + "releaseDate": "2025-09-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "qwen/qwen3-max", + "modelKey": "qwen/qwen3-max", + "displayName": "Qwen3 Max", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-23", + "openWeights": false, + "releaseDate": "2025-09-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen3-max", + "modelKey": "qwen3-max", + "displayName": "Qwen3 Max", + "metadata": { + "lastUpdated": "2025-09-24", + "openWeights": false, + "releaseDate": "2025-09-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3-max", + "modelKey": "alibaba/qwen3-max", + "displayName": "Qwen3 Max", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-23", + "openWeights": false, + "releaseDate": "2025-09-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "qwen/qwen3-max", + "modelKey": "qwen/qwen3-max", + "displayName": "Qwen3-Max-Thinking", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-01-23", + "openWeights": false, + "releaseDate": "2026-01-23" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen3-max", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-max", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-max", + "displayName": "Qwen: Qwen3 Max", + "metadata": { + "canonicalSlug": "qwen/qwen3-max", + "createdAt": "2025-09-23T21:26:48.000Z", + "knowledgeCutoff": "2025-06-30", + "links": { + "details": "/api/v1/models/qwen/qwen3-max/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-max-2025-09-23", + "provider": "alibaba", + "model": "qwen3-max-2025-09-23", + "displayName": "qwen3-max-2025-09-23", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai" + ], + "aliases": [ + "302ai/qwen3-max-2025-09-23" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 258048, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "qwen3-max-2025-09-23", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.86, + "output": 3.43 + } + } + ] + }, + "metadata": { + "displayNames": [ + "qwen3-max-2025-09-23" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-09-24", + "lastUpdated": "2025-09-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "qwen3-max-2025-09-23", + "modelKey": "qwen3-max-2025-09-23", + "displayName": "qwen3-max-2025-09-23", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-24", + "openWeights": false, + "releaseDate": "2025-09-24" + } + } + ] + }, + { + "id": "alibaba/qwen3-max-2026-01-23", + "provider": "alibaba", + "model": "qwen3-max-2026-01-23", + "displayName": "Qwen3 Max", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "alibaba-coding-plan", + "alibaba-coding-plan-cn", + "dashscope", + "llmgateway", + "nano-gpt" + ], + "aliases": [ + "alibaba-coding-plan-cn/qwen3-max-2026-01-23", + "alibaba-coding-plan/qwen3-max-2026-01-23", + "dashscope/qwen3-max-2026-01-23", + "llmgateway/qwen3-max-2026-01-23", + "nano-gpt/qwen3-max-2026-01-23" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 262144, + "inputTokens": 258048, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-coding-plan-cn", + "model": "qwen3-max-2026-01-23", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan", + "model": "qwen3-max-2026-01-23", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-max-2026-01-23", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.072, + "input": 0.359, + "output": 1.434 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3-max-2026-01-23", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.2002, + "output": 6.001 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen3-max-2026-01-23", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 Max", + "Qwen3 Max (2026-01-23)", + "Qwen3 Max 2026-01-23" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-01-23", + "lastUpdated": "2026-01-23", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan-cn", + "providerName": "Alibaba Coding Plan (China)", + "providerApi": "https://coding.dashscope.aliyuncs.com/v1", + "providerDoc": "https://help.aliyun.com/zh/model-studio/coding-plan", + "model": "qwen3-max-2026-01-23", + "modelKey": "qwen3-max-2026-01-23", + "displayName": "Qwen3 Max", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-23", + "openWeights": false, + "releaseDate": "2026-01-23", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan", + "providerName": "Alibaba Coding Plan", + "providerApi": "https://coding-intl.dashscope.aliyuncs.com/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/coding-plan", + "model": "qwen3-max-2026-01-23", + "modelKey": "qwen3-max-2026-01-23", + "displayName": "Qwen3 Max", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-23", + "openWeights": false, + "releaseDate": "2026-01-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-max-2026-01-23", + "modelKey": "qwen3-max-2026-01-23", + "displayName": "Qwen3 Max (2026-01-23)", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-01-23", + "openWeights": false, + "releaseDate": "2026-01-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3-max-2026-01-23", + "modelKey": "qwen3-max-2026-01-23", + "displayName": "Qwen3 Max 2026-01-23", + "metadata": { + "lastUpdated": "2026-01-26", + "openWeights": false, + "releaseDate": "2026-01-26" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen3-max-2026-01-23", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen3-max-preview", + "provider": "alibaba", + "model": "qwen3-max-preview", + "displayName": "Qwen3-Max-Preview", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "dashscope", + "iflowcn", + "qiniu-ai", + "vercel" + ], + "aliases": [ + "dashscope/qwen3-max-preview", + "iflowcn/qwen3-max-preview", + "qiniu-ai/qwen3-max-preview", + "vercel/alibaba/qwen3-max-preview" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 262144, + "inputTokens": 258048, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "iflowcn", + "model": "qwen3-max-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3-max-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "input": 1.2, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen3-max-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 Max Preview", + "Qwen3-Max-Preview" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "iflowcn", + "providerName": "iFlow", + "providerApi": "https://apis.iflow.cn/v1", + "providerDoc": "https://platform.iflow.cn/en/docs", + "model": "qwen3-max-preview", + "modelKey": "qwen3-max-preview", + "displayName": "Qwen3-Max-Preview", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen3-max-preview", + "modelKey": "qwen3-max-preview", + "displayName": "Qwen3 Max Preview", + "metadata": { + "lastUpdated": "2025-09-06", + "openWeights": false, + "releaseDate": "2025-09-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3-max-preview", + "modelKey": "alibaba/qwen3-max-preview", + "displayName": "Qwen3 Max Preview", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-23", + "openWeights": false, + "releaseDate": "2025-09-23" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen3-max-preview", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen3-max-thinking", + "provider": "alibaba", + "model": "qwen3-max-thinking", + "displayName": "Qwen: Qwen3 Max Thinking", + "family": "qwen", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter", + "vercel" + ], + "aliases": [ + "kilo/qwen/qwen3-max-thinking", + "openrouter/qwen/qwen3-max-thinking", + "vercel/alibaba/qwen3-max-thinking" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-max-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.78, + "output": 3.9 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-max-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.78, + "output": 3.9 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3-max-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "input": 1.2, + "output": 6 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-max-thinking", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.78, + "output": 3.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3 Max Thinking", + "Qwen3 Max Thinking", + "Qwen: Qwen3 Max Thinking" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-01-23", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-max-thinking", + "modelKey": "qwen/qwen3-max-thinking", + "displayName": "Qwen: Qwen3 Max Thinking", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-01-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-max-thinking", + "modelKey": "qwen/qwen3-max-thinking", + "displayName": "Qwen3 Max Thinking", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-09", + "openWeights": false, + "releaseDate": "2026-02-09", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1, + "max": 81920 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3-max-thinking", + "modelKey": "alibaba/qwen3-max-thinking", + "displayName": "Qwen 3 Max Thinking", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01", + "openWeights": true, + "releaseDate": "2025-01" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-max-thinking", + "displayName": "Qwen: Qwen3 Max Thinking", + "metadata": { + "canonicalSlug": "qwen/qwen3-max-thinking-20260123", + "createdAt": "2026-02-09T21:18:21.000Z", + "links": { + "details": "/api/v1/models/qwen/qwen3-max-thinking-20260123/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-next-80b", + "provider": "alibaba", + "model": "qwen3-next-80b", + "displayName": "Qwen 3 Next 80b", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/qwen3-next-80b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "qwen3-next-80b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.35, + "output": 1.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3 Next 80b" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-04-29", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "qwen3-next-80b", + "modelKey": "qwen3-next-80b", + "displayName": "Qwen 3 Next 80b", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2025-04-29" + } + } + ] + }, + { + "id": "alibaba/qwen3-next-80b-a3b-instruct", + "provider": "alibaba", + "model": "qwen3-next-80b-a3b-instruct", + "displayName": "Qwen3-Next 80B-A3B Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "chutes", + "dashscope", + "deepinfra", + "fireworks_ai", + "helicone", + "huggingface", + "io-net", + "jiekou", + "kilo", + "llmgateway", + "nano-gpt", + "novita", + "novita-ai", + "nvidia", + "openrouter", + "qiniu-ai", + "siliconflow", + "siliconflow-cn", + "together_ai", + "vercel" + ], + "aliases": [ + "alibaba-cn/qwen3-next-80b-a3b-instruct", + "alibaba/qwen3-next-80b-a3b-instruct", + "chutes/Qwen/Qwen3-Next-80B-A3B-Instruct", + "dashscope/qwen3-next-80b-a3b-instruct", + "deepinfra/Qwen/Qwen3-Next-80B-A3B-Instruct", + "fireworks_ai/accounts/fireworks/models/qwen3-next-80b-a3b-instruct", + "helicone/qwen3-next-80b-a3b-instruct", + "huggingface/Qwen/Qwen3-Next-80B-A3B-Instruct", + "io-net/Qwen/Qwen3-Next-80B-A3B-Instruct", + "jiekou/qwen/qwen3-next-80b-a3b-instruct", + "kilo/qwen/qwen3-next-80b-a3b-instruct", + "llmgateway/qwen3-next-80b-a3b-instruct", + "nano-gpt/qwen/Qwen3-Next-80B-A3B-Instruct", + "novita-ai/qwen/qwen3-next-80b-a3b-instruct", + "novita/qwen/qwen3-next-80b-a3b-instruct", + "nvidia/qwen/qwen3-next-80b-a3b-instruct", + "openrouter/qwen/qwen3-next-80b-a3b-instruct", + "qiniu-ai/qwen3-next-80b-a3b-instruct", + "siliconflow-cn/Qwen/Qwen3-Next-80B-A3B-Instruct", + "siliconflow/Qwen/Qwen3-Next-80B-A3B-Instruct", + "together_ai/Qwen/Qwen3-Next-80B-A3B-Instruct", + "vercel/alibaba/qwen3-next-80b-a3b-instruct" + ], + "mergedProviderModelRecords": 22, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3-next-80b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.144, + "output": 0.574 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-next-80b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "chutes", + "model": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.1, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "qwen3-next-80b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 1.4 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "io-net", + "model": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.2, + "input": 0.1, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "qwen/qwen3-next-80b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-next-80b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 1.1 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-next-80b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/Qwen3-Next-80B-A3B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.65 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-next-80b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "qwen/qwen3-next-80b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-next-80b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 1.1 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 1.4 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 1.4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3-next-80b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen3-next-80b-a3b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-Next-80B-A3B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.14, + "output": 1.4 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-next-80b-a3b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-next-80b-a3b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen3-Next-80B-A3B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 1.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-next-80b-a3b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.09, + "output": 1.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3 Next 80B Instruct", + "Qwen/Qwen3-Next-80B-A3B-Instruct", + "Qwen3 Next 80B A3B (Instruct)", + "Qwen3 Next 80B A3B Instruct", + "Qwen3-Next 80B-A3B Instruct", + "Qwen3-Next-80B-A3B-Instruct", + "Qwen: Qwen3 Next 80B A3B Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-09", + "lastUpdated": "2025-09", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 22 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-next-80b-a3b-instruct", + "modelKey": "qwen3-next-80b-a3b-instruct", + "displayName": "Qwen3-Next 80B-A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09", + "openWeights": true, + "releaseDate": "2025-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-next-80b-a3b-instruct", + "modelKey": "qwen3-next-80b-a3b-instruct", + "displayName": "Qwen3-Next 80B-A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09", + "openWeights": true, + "releaseDate": "2025-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "modelKey": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "displayName": "Qwen3 Next 80B A3B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "qwen3-next-80b-a3b-instruct", + "modelKey": "qwen3-next-80b-a3b-instruct", + "displayName": "Qwen3 Next 80B A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "modelKey": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "displayName": "Qwen3-Next-80B-A3B-Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-11", + "openWeights": true, + "releaseDate": "2025-09-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "io-net", + "providerName": "IO.NET", + "providerApi": "https://api.intelligence.io.solutions/api/v1", + "providerDoc": "https://io.net/docs/guides/intelligence/io-intelligence", + "model": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "modelKey": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "displayName": "Qwen 3 Next 80B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-10", + "openWeights": true, + "releaseDate": "2025-01-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "qwen/qwen3-next-80b-a3b-instruct", + "modelKey": "qwen/qwen3-next-80b-a3b-instruct", + "displayName": "Qwen3 Next 80B A3B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-next-80b-a3b-instruct", + "modelKey": "qwen/qwen3-next-80b-a3b-instruct", + "displayName": "Qwen: Qwen3 Next 80B A3B Instruct", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-09-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-next-80b-a3b-instruct", + "modelKey": "qwen3-next-80b-a3b-instruct", + "displayName": "Qwen3-Next 80B-A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09", + "openWeights": true, + "releaseDate": "2025-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/Qwen3-Next-80B-A3B-Instruct", + "modelKey": "qwen/Qwen3-Next-80B-A3B-Instruct", + "displayName": "Qwen3 Next 80B A3B (Instruct)", + "metadata": { + "lastUpdated": "2025-09-11", + "openWeights": false, + "releaseDate": "2025-09-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-next-80b-a3b-instruct", + "modelKey": "qwen/qwen3-next-80b-a3b-instruct", + "displayName": "Qwen3 Next 80B A3B Instruct", + "metadata": { + "lastUpdated": "2025-09-10", + "openWeights": true, + "releaseDate": "2025-09-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "qwen/qwen3-next-80b-a3b-instruct", + "modelKey": "qwen/qwen3-next-80b-a3b-instruct", + "displayName": "Qwen3-Next-80B-A3B-Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-09-05", + "openWeights": false, + "releaseDate": "2024-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-next-80b-a3b-instruct", + "modelKey": "qwen/qwen3-next-80b-a3b-instruct", + "displayName": "Qwen3-Next 80B-A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09", + "openWeights": true, + "releaseDate": "2025-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen3-next-80b-a3b-instruct", + "modelKey": "qwen3-next-80b-a3b-instruct", + "displayName": "Qwen3 Next 80B A3B Instruct", + "metadata": { + "lastUpdated": "2025-09-12", + "openWeights": false, + "releaseDate": "2025-09-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "modelKey": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "displayName": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-09-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "modelKey": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "displayName": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-09-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3-next-80b-a3b-instruct", + "modelKey": "alibaba/qwen3-next-80b-a3b-instruct", + "displayName": "Qwen3 Next 80B A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09", + "openWeights": true, + "releaseDate": "2025-09-12" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen3-next-80b-a3b-instruct", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/model-pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-Next-80B-A3B-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-next-80b-a3b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-next-80b-a3b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen3-Next-80B-A3B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://www.together.ai/models/qwen3-next-80b-a3b-instruct" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-next-80b-a3b-instruct", + "displayName": "Qwen: Qwen3 Next 80B A3B Instruct", + "metadata": { + "canonicalSlug": "qwen/qwen3-next-80b-a3b-instruct-2509", + "createdAt": "2025-09-11T17:36:53.000Z", + "huggingFaceId": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "knowledgeCutoff": "2025-09-30", + "links": { + "details": "/api/v1/models/qwen/qwen3-next-80b-a3b-instruct-2509/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-next-80b-a3b-instruct-maas", + "provider": "alibaba", + "model": "qwen3-next-80b-a3b-instruct-maas", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-qwen_models" + ], + "aliases": [ + "vertex_ai-qwen_models/vertex_ai/qwen/qwen3-next-80b-a3b-instruct-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-qwen_models", + "model": "vertex_ai/qwen/qwen3-next-80b-a3b-instruct-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedRegions": [ + "global" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-qwen_models", + "model": "vertex_ai/qwen/qwen3-next-80b-a3b-instruct-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", + "supportedRegions": [ + "global" + ] + } + } + ] + }, + { + "id": "alibaba/qwen3-next-80b-a3b-instruct:free", + "provider": "alibaba", + "model": "qwen3-next-80b-a3b-instruct:free", + "displayName": "Qwen3 Next 80B A3B Instruct (free)", + "family": "qwen", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/qwen/qwen3-next-80b-a3b-instruct:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-next-80b-a3b-instruct:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-next-80b-a3b-instruct:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 Next 80B A3B Instruct (free)", + "Qwen: Qwen3 Next 80B A3B Instruct (free)" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-09", + "lastUpdated": "2025-09", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-next-80b-a3b-instruct:free", + "modelKey": "qwen/qwen3-next-80b-a3b-instruct:free", + "displayName": "Qwen3 Next 80B A3B Instruct (free)", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09", + "openWeights": true, + "releaseDate": "2025-09" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-next-80b-a3b-instruct:free", + "displayName": "Qwen: Qwen3 Next 80B A3B Instruct (free)", + "metadata": { + "canonicalSlug": "qwen/qwen3-next-80b-a3b-instruct-2509", + "createdAt": "2025-09-11T17:36:53.000Z", + "huggingFaceId": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "knowledgeCutoff": "2025-09-30", + "links": { + "details": "/api/v1/models/qwen/qwen3-next-80b-a3b-instruct-2509/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-next-80b-a3b-thinking", + "provider": "alibaba", + "model": "qwen3-next-80b-a3b-thinking", + "displayName": "Qwen3-Next 80B-A3B (Thinking)", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "cortecs", + "dashscope", + "deepinfra", + "fireworks_ai", + "huggingface", + "jiekou", + "kilo", + "llmgateway", + "nano-gpt", + "nebius", + "novita", + "novita-ai", + "openrouter", + "qiniu-ai", + "siliconflow", + "siliconflow-cn", + "together_ai", + "vercel" + ], + "aliases": [ + "alibaba-cn/qwen3-next-80b-a3b-thinking", + "alibaba/qwen3-next-80b-a3b-thinking", + "cortecs/qwen3-next-80b-a3b-thinking", + "dashscope/qwen3-next-80b-a3b-thinking", + "deepinfra/Qwen/Qwen3-Next-80B-A3B-Thinking", + "fireworks_ai/accounts/fireworks/models/qwen3-next-80b-a3b-thinking", + "huggingface/Qwen/Qwen3-Next-80B-A3B-Thinking", + "jiekou/qwen/qwen3-next-80b-a3b-thinking", + "kilo/qwen/qwen3-next-80b-a3b-thinking", + "llmgateway/qwen3-next-80b-a3b-thinking", + "nano-gpt/qwen/qwen3-next-80b-a3b-thinking", + "nebius/Qwen/Qwen3-Next-80B-A3B-Thinking", + "novita-ai/qwen/qwen3-next-80b-a3b-thinking", + "novita/qwen/qwen3-next-80b-a3b-thinking", + "openrouter/qwen/qwen3-next-80b-a3b-thinking", + "qiniu-ai/qwen3-next-80b-a3b-thinking", + "siliconflow-cn/Qwen/Qwen3-Next-80B-A3B-Thinking", + "siliconflow/Qwen/Qwen3-Next-80B-A3B-Thinking", + "together_ai/Qwen/Qwen3-Next-80B-A3B-Thinking", + "vercel/alibaba/qwen3-next-80b-a3b-thinking" + ], + "mergedProviderModelRecords": 20, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3-next-80b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.144, + "output": 1.434 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-next-80b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "qwen3-next-80b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.164, + "output": 1.311 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "qwen/qwen3-next-80b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-next-80b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0975, + "output": 0.78 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-next-80b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/qwen3-next-80b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.65 + } + }, + { + "source": "models.dev", + "provider": "nebius", + "model": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "cacheWrite": 0.18, + "input": 0.15, + "output": 1.2, + "reasoningOutput": 1.2 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-next-80b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-next-80b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0975, + "output": 0.78 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.57 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.57 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3-next-80b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen3-next-80b-a3b-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-Next-80B-A3B-Thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.14, + "output": 1.4 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-next-80b-a3b-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-next-80b-a3b-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen3-Next-80B-A3B-Thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 1.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-next-80b-a3b-thinking", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.0975, + "output": 0.78 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3-Next-80B-A3B-Thinking", + "Qwen3 Next 80B A3B (Thinking)", + "Qwen3 Next 80B A3B Thinking", + "Qwen3-Next 80B-A3B (Thinking)", + "Qwen3-Next-80B-A3B-Thinking", + "Qwen: Qwen3 Next 80B A3B Thinking" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-09", + "lastUpdated": "2025-09", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 20 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-next-80b-a3b-thinking", + "modelKey": "qwen3-next-80b-a3b-thinking", + "displayName": "Qwen3-Next 80B-A3B (Thinking)", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09", + "openWeights": true, + "releaseDate": "2025-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-next-80b-a3b-thinking", + "modelKey": "qwen3-next-80b-a3b-thinking", + "displayName": "Qwen3-Next 80B-A3B (Thinking)", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09", + "openWeights": true, + "releaseDate": "2025-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "qwen3-next-80b-a3b-thinking", + "modelKey": "qwen3-next-80b-a3b-thinking", + "displayName": "Qwen3 Next 80B A3B Thinking", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-11", + "openWeights": true, + "releaseDate": "2025-09-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "modelKey": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "displayName": "Qwen3-Next-80B-A3B-Thinking", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-11", + "openWeights": true, + "releaseDate": "2025-09-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "qwen/qwen3-next-80b-a3b-thinking", + "modelKey": "qwen/qwen3-next-80b-a3b-thinking", + "displayName": "Qwen3 Next 80B A3B Thinking", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-next-80b-a3b-thinking", + "modelKey": "qwen/qwen3-next-80b-a3b-thinking", + "displayName": "Qwen: Qwen3 Next 80B A3B Thinking", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-09-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-next-80b-a3b-thinking", + "modelKey": "qwen3-next-80b-a3b-thinking", + "displayName": "Qwen3-Next 80B-A3B (Thinking)", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09", + "openWeights": true, + "releaseDate": "2025-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/qwen3-next-80b-a3b-thinking", + "modelKey": "qwen/qwen3-next-80b-a3b-thinking", + "displayName": "Qwen3 Next 80B A3B (Thinking)", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "modelKey": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "displayName": "Qwen3-Next-80B-A3B-Thinking", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2026-01-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-next-80b-a3b-thinking", + "modelKey": "qwen/qwen3-next-80b-a3b-thinking", + "displayName": "Qwen3 Next 80B A3B Thinking", + "metadata": { + "lastUpdated": "2025-09-10", + "openWeights": true, + "releaseDate": "2025-09-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-next-80b-a3b-thinking", + "modelKey": "qwen/qwen3-next-80b-a3b-thinking", + "displayName": "Qwen3-Next 80B-A3B (Thinking)", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09", + "openWeights": true, + "releaseDate": "2025-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen3-next-80b-a3b-thinking", + "modelKey": "qwen3-next-80b-a3b-thinking", + "displayName": "Qwen3 Next 80B A3B Thinking", + "metadata": { + "lastUpdated": "2025-09-12", + "openWeights": false, + "releaseDate": "2025-09-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "modelKey": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "displayName": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "modelKey": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "displayName": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3-next-80b-a3b-thinking", + "modelKey": "alibaba/qwen3-next-80b-a3b-thinking", + "displayName": "Qwen3 Next 80B A3B Thinking", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2025-09", + "openWeights": true, + "releaseDate": "2025-09-12" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen3-next-80b-a3b-thinking", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/model-pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Qwen/Qwen3-Next-80B-A3B-Thinking", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-next-80b-a3b-thinking", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-next-80b-a3b-thinking", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen3-Next-80B-A3B-Thinking", + "mode": "chat", + "metadata": { + "source": "https://www.together.ai/models/qwen3-next-80b-a3b-thinking" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-next-80b-a3b-thinking", + "displayName": "Qwen: Qwen3 Next 80B A3B Thinking", + "metadata": { + "canonicalSlug": "qwen/qwen3-next-80b-a3b-thinking-2509", + "createdAt": "2025-09-11T17:38:04.000Z", + "huggingFaceId": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "knowledgeCutoff": "2025-09-30", + "links": { + "details": "/api/v1/models/qwen/qwen3-next-80b-a3b-thinking-2509/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-next-80b-a3b-thinking-fast", + "provider": "alibaba", + "model": "qwen3-next-80b-a3b-thinking-fast", + "displayName": "Qwen3-Next-80B-A3B-Thinking-fast", + "sources": [ + "models.dev" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/Qwen/Qwen3-Next-80B-A3B-Thinking-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 7000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nebius", + "model": "Qwen/Qwen3-Next-80B-A3B-Thinking-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "cacheWrite": 0.1875, + "input": 0.15, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3-Next-80B-A3B-Thinking-fast" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-07", + "releaseDate": "2025-07-25", + "lastUpdated": "2026-05-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "Qwen/Qwen3-Next-80B-A3B-Thinking-fast", + "modelKey": "Qwen/Qwen3-Next-80B-A3B-Thinking-fast", + "displayName": "Qwen3-Next-80B-A3B-Thinking-fast", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2026-05-07", + "openWeights": true, + "releaseDate": "2025-07-25" + } + } + ] + }, + { + "id": "alibaba/qwen3-next-80b-a3b-thinking-maas", + "provider": "alibaba", + "model": "qwen3-next-80b-a3b-thinking-maas", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-qwen_models" + ], + "aliases": [ + "vertex_ai-qwen_models/vertex_ai/qwen/qwen3-next-80b-a3b-thinking-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-qwen_models", + "model": "vertex_ai/qwen/qwen3-next-80b-a3b-thinking-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedRegions": [ + "global" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-qwen_models", + "model": "vertex_ai/qwen/qwen3-next-80b-a3b-thinking-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", + "supportedRegions": [ + "global" + ] + } + } + ] + }, + { + "id": "alibaba/qwen3-next:80b", + "provider": "alibaba", + "model": "qwen3-next:80b", + "displayName": "qwen3-next:80b", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/qwen3-next:80b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "qwen3-next:80b" + ], + "families": [ + "qwen" + ], + "statuses": [ + "deprecated" + ], + "releaseDate": "2025-09-15", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "qwen3-next:80b", + "modelKey": "qwen3-next:80b", + "displayName": "qwen3-next:80b", + "family": "qwen", + "status": "deprecated", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-09-15" + } + } + ] + }, + { + "id": "alibaba/qwen3-omni-30b-a3b-captioner", + "provider": "alibaba", + "model": "qwen3-omni-30b-a3b-captioner", + "displayName": "Qwen/Qwen3-Omni-30B-A3B-Captioner", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "siliconflow-cn/Qwen/Qwen3-Omni-30B-A3B-Captioner", + "siliconflow/Qwen/Qwen3-Omni-30B-A3B-Captioner" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 66000, + "outputTokens": 66000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-Omni-30B-A3B-Captioner", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-Omni-30B-A3B-Captioner", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3-Omni-30B-A3B-Captioner" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-10-04", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-Omni-30B-A3B-Captioner", + "modelKey": "Qwen/Qwen3-Omni-30B-A3B-Captioner", + "displayName": "Qwen/Qwen3-Omni-30B-A3B-Captioner", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-Omni-30B-A3B-Captioner", + "modelKey": "Qwen/Qwen3-Omni-30B-A3B-Captioner", + "displayName": "Qwen/Qwen3-Omni-30B-A3B-Captioner", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-04" + } + } + ] + }, + { + "id": "alibaba/qwen3-omni-30b-a3b-instruct", + "provider": "alibaba", + "model": "qwen3-omni-30b-a3b-instruct", + "displayName": "Qwen3 Omni 30B A3B Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "novita", + "novita-ai", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "novita-ai/qwen/qwen3-omni-30b-a3b-instruct", + "novita/qwen/qwen3-omni-30b-a3b-instruct", + "siliconflow-cn/Qwen/Qwen3-Omni-30B-A3B-Instruct", + "siliconflow/Qwen/Qwen3-Omni-30B-A3B-Instruct" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 66000, + "inputTokens": 65536, + "maxTokens": 16384, + "outputTokens": 66000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-omni-30b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "inputAudio": 2.2, + "output": 0.97, + "outputAudio": 1.788 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-Omni-30B-A3B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-Omni-30B-A3B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-omni-30b-a3b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 0.97 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3-Omni-30B-A3B-Instruct", + "Qwen3 Omni 30B A3B Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-09-24", + "lastUpdated": "2025-09-24", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-omni-30b-a3b-instruct", + "modelKey": "qwen/qwen3-omni-30b-a3b-instruct", + "displayName": "Qwen3 Omni 30B A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-09-24", + "openWeights": true, + "releaseDate": "2025-09-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-Omni-30B-A3B-Instruct", + "modelKey": "Qwen/Qwen3-Omni-30B-A3B-Instruct", + "displayName": "Qwen/Qwen3-Omni-30B-A3B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-Omni-30B-A3B-Instruct", + "modelKey": "Qwen/Qwen3-Omni-30B-A3B-Instruct", + "displayName": "Qwen/Qwen3-Omni-30B-A3B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-04" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-omni-30b-a3b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-omni-30b-a3b-thinking", + "provider": "alibaba", + "model": "qwen3-omni-30b-a3b-thinking", + "displayName": "Qwen3 Omni 30B A3B Thinking", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "novita", + "novita-ai", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "novita-ai/qwen/qwen3-omni-30b-a3b-thinking", + "novita/qwen/qwen3-omni-30b-a3b-thinking", + "siliconflow-cn/Qwen/Qwen3-Omni-30B-A3B-Thinking", + "siliconflow/Qwen/Qwen3-Omni-30B-A3B-Thinking" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 66000, + "inputTokens": 65536, + "maxTokens": 16384, + "outputTokens": 66000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-omni-30b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "inputAudio": 2.2, + "output": 0.97, + "outputAudio": 1.788 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-Omni-30B-A3B-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-Omni-30B-A3B-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-omni-30b-a3b-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 0.97 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3-Omni-30B-A3B-Thinking", + "Qwen3 Omni 30B A3B Thinking" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-09-24", + "lastUpdated": "2025-09-24", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-omni-30b-a3b-thinking", + "modelKey": "qwen/qwen3-omni-30b-a3b-thinking", + "displayName": "Qwen3 Omni 30B A3B Thinking", + "metadata": { + "lastUpdated": "2025-09-24", + "openWeights": true, + "releaseDate": "2025-09-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-Omni-30B-A3B-Thinking", + "modelKey": "Qwen/Qwen3-Omni-30B-A3B-Thinking", + "displayName": "Qwen/Qwen3-Omni-30B-A3B-Thinking", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-Omni-30B-A3B-Thinking", + "modelKey": "Qwen/Qwen3-Omni-30B-A3B-Thinking", + "displayName": "Qwen/Qwen3-Omni-30B-A3B-Thinking", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-04" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-omni-30b-a3b-thinking", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-omni-flash", + "provider": "alibaba", + "model": "qwen3-omni-flash", + "displayName": "Qwen3-Omni Flash", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen3-omni-flash", + "alibaba/qwen3-omni-flash" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 65536, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3-omni-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.058, + "inputAudio": 3.584, + "output": 0.23, + "outputAudio": 7.168 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-omni-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.43, + "inputAudio": 3.81, + "output": 1.66, + "outputAudio": 15.11 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3-Omni Flash" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-09-15", + "lastUpdated": "2025-09-15", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-omni-flash", + "modelKey": "qwen3-omni-flash", + "displayName": "Qwen3-Omni Flash", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-09-15", + "openWeights": false, + "releaseDate": "2025-09-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-omni-flash", + "modelKey": "qwen3-omni-flash", + "displayName": "Qwen3-Omni Flash", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-09-15", + "openWeights": false, + "releaseDate": "2025-09-15" + } + } + ] + }, + { + "id": "alibaba/qwen3-omni-flash-realtime", + "provider": "alibaba", + "model": "qwen3-omni-flash-realtime", + "displayName": "Qwen3-Omni Flash Realtime", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen3-omni-flash-realtime", + "alibaba/qwen3-omni-flash-realtime" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 65536, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3-omni-flash-realtime", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.23, + "inputAudio": 3.584, + "output": 0.918, + "outputAudio": 7.168 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-omni-flash-realtime", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.52, + "inputAudio": 4.57, + "output": 1.99, + "outputAudio": 18.13 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3-Omni Flash Realtime" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-09-15", + "lastUpdated": "2025-09-15", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-omni-flash-realtime", + "modelKey": "qwen3-omni-flash-realtime", + "displayName": "Qwen3-Omni Flash Realtime", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-09-15", + "openWeights": false, + "releaseDate": "2025-09-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-omni-flash-realtime", + "modelKey": "qwen3-omni-flash-realtime", + "displayName": "Qwen3-Omni Flash Realtime", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-09-15", + "openWeights": false, + "releaseDate": "2025-09-15" + } + } + ] + }, + { + "id": "alibaba/qwen3-reranker-0.6b", + "provider": "alibaba", + "model": "qwen3-reranker-0.6b", + "displayName": "Qwen3 Reranker 0.6B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "nearai" + ], + "aliases": [ + "nearai/Qwen/Qwen3-Reranker-0.6B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 40960, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nearai", + "model": "Qwen/Qwen3-Reranker-0.6B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.01, + "output": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 Reranker 0.6B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-06-03", + "lastUpdated": "2025-06-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "Qwen/Qwen3-Reranker-0.6B", + "modelKey": "Qwen/Qwen3-Reranker-0.6B", + "displayName": "Qwen3 Reranker 0.6B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-06-03", + "openWeights": true, + "releaseDate": "2025-06-03" + } + } + ] + }, + { + "id": "alibaba/qwen3-reranker-0p6b", + "provider": "alibaba", + "model": "qwen3-reranker-0p6b", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen3-reranker-0p6b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 40960, + "inputTokens": 40960, + "maxTokens": 40960, + "outputTokens": 40960, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-reranker-0p6b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-reranker-0p6b", + "mode": "rerank" + } + ] + }, + { + "id": "alibaba/qwen3-reranker-4b", + "provider": "alibaba", + "model": "qwen3-reranker-4b", + "displayName": "Qwen3-Reranker-4B", + "family": "qwen", + "mode": "rerank", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "fireworks_ai", + "regolo-ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen3-reranker-4b", + "regolo-ai/qwen3-reranker-4b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 40960, + "inputTokens": 40960, + "maxTokens": 40960, + "outputTokens": 40960, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score", + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": true, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "regolo-ai", + "model": "qwen3-reranker-4b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.12 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-reranker-4b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3-Reranker-4B" + ], + "families": [ + "qwen" + ], + "modes": [ + "rerank" + ], + "releaseDate": "2026-02-01", + "lastUpdated": "2026-02-01", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "regolo-ai", + "providerName": "Regolo AI", + "providerApi": "https://api.regolo.ai/v1", + "providerDoc": "https://docs.regolo.ai/", + "model": "qwen3-reranker-4b", + "modelKey": "qwen3-reranker-4b", + "displayName": "Qwen3-Reranker-4B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-01", + "openWeights": true, + "releaseDate": "2026-02-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-reranker-4b", + "mode": "rerank" + } + ] + }, + { + "id": "alibaba/qwen3-reranker-8b", + "provider": "alibaba", + "model": "qwen3-reranker-8b", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai", + "novita" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen3-reranker-8b", + "novita/qwen/qwen3-reranker-8b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 40960, + "inputTokens": 40960, + "maxTokens": 40960, + "outputTokens": 40960, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-reranker-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-reranker-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.05 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-reranker-8b", + "mode": "rerank" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-reranker-8b", + "mode": "rerank" + } + ] + }, + { + "id": "alibaba/qwen3-tts-voicedesign", + "provider": "alibaba", + "model": "qwen3-tts-voicedesign", + "displayName": "Qwen3 TTS VoiceDesign", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/qwen3-tts-voicedesign" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 1, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Qwen3 TTS VoiceDesign" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-04-21", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "qwen3-tts-voicedesign", + "modelKey": "qwen3-tts-voicedesign", + "displayName": "Qwen3 TTS VoiceDesign", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2026-04-21" + } + } + ] + }, + { + "id": "alibaba/qwen3-vl-235b-a22b", + "provider": "alibaba", + "model": "qwen3-vl-235b-a22b", + "displayName": "Qwen3-VL 235B-A22B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "venice" + ], + "aliases": [ + "alibaba-cn/qwen3-vl-235b-a22b", + "alibaba/qwen3-vl-235b-a22b", + "venice/qwen3-vl-235b-a22b" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 256000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3-vl-235b-a22b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.286705, + "output": 1.14682, + "reasoningOutput": 2.867051 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-vl-235b-a22b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 2.8, + "reasoningOutput": 8.4 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "qwen3-vl-235b-a22b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 VL 235B", + "Qwen3-VL 235B-A22B" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-04", + "lastUpdated": "2025-04", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-vl-235b-a22b", + "modelKey": "qwen3-vl-235b-a22b", + "displayName": "Qwen3-VL 235B-A22B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-vl-235b-a22b", + "modelKey": "qwen3-vl-235b-a22b", + "displayName": "Qwen3-VL 235B-A22B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "qwen3-vl-235b-a22b", + "modelKey": "qwen3-vl-235b-a22b", + "displayName": "Qwen3 VL 235B", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-01-16" + } + } + ] + }, + { + "id": "alibaba/qwen3-vl-235b-a22b-instruct", + "provider": "alibaba", + "model": "qwen3-vl-235b-a22b-instruct", + "displayName": "Qwen3 VL 235B A22B Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "dashscope", + "fireworks_ai", + "helicone", + "kilo", + "llmgateway", + "nano-gpt", + "novita", + "novita-ai", + "openrouter", + "siliconflow", + "siliconflow-cn", + "vercel" + ], + "aliases": [ + "dashscope/qwen3-vl-235b-a22b-instruct", + "fireworks_ai/accounts/fireworks/models/qwen3-vl-235b-a22b-instruct", + "helicone/qwen3-vl-235b-a22b-instruct", + "kilo/qwen/qwen3-vl-235b-a22b-instruct", + "llmgateway/qwen3-vl-235b-a22b-instruct", + "nano-gpt/qwen/Qwen3-VL-235B-A22B-Instruct", + "novita-ai/qwen/qwen3-vl-235b-a22b-instruct", + "novita/qwen/qwen3-vl-235b-a22b-instruct", + "openrouter/qwen/qwen3-vl-235b-a22b-instruct", + "siliconflow-cn/Qwen/Qwen3-VL-235B-A22B-Instruct", + "siliconflow/Qwen/Qwen3-VL-235B-A22B-Instruct", + "vercel/alibaba/qwen3-vl-235b-a22b-instruct" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "qwen3-vl-235b-a22b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-vl-235b-a22b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.2, + "output": 0.88 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-vl-235b-a22b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/Qwen3-VL-235B-A22B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-vl-235b-a22b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-vl-235b-a22b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.2, + "output": 0.88 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3-vl-235b-a22b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen3-vl-235b-a22b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-vl-235b-a22b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.22, + "output": 0.88 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-vl-235b-a22b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-vl-235b-a22b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.2, + "output": 0.88 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3-VL-235B-A22B-Instruct", + "Qwen3 VL 235B A22B Instruct", + "Qwen: Qwen3 VL 235B A22B Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-09", + "releaseDate": "2025-09-23", + "lastUpdated": "2025-09-23", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "qwen3-vl-235b-a22b-instruct", + "modelKey": "qwen3-vl-235b-a22b-instruct", + "displayName": "Qwen3 VL 235B A22B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2025-09-23", + "openWeights": false, + "releaseDate": "2025-09-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-vl-235b-a22b-instruct", + "modelKey": "qwen/qwen3-vl-235b-a22b-instruct", + "displayName": "Qwen: Qwen3 VL 235B A22B Instruct", + "metadata": { + "lastUpdated": "2026-01-10", + "openWeights": true, + "releaseDate": "2025-09-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-vl-235b-a22b-instruct", + "modelKey": "qwen3-vl-235b-a22b-instruct", + "displayName": "Qwen3 VL 235B A22B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-09-15", + "openWeights": true, + "releaseDate": "2025-09-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/Qwen3-VL-235B-A22B-Instruct", + "modelKey": "qwen/Qwen3-VL-235B-A22B-Instruct", + "displayName": "Qwen3 VL 235B A22B Instruct", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-vl-235b-a22b-instruct", + "modelKey": "qwen/qwen3-vl-235b-a22b-instruct", + "displayName": "Qwen3 VL 235B A22B Instruct", + "metadata": { + "lastUpdated": "2025-09-24", + "openWeights": true, + "releaseDate": "2025-09-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-vl-235b-a22b-instruct", + "modelKey": "qwen/qwen3-vl-235b-a22b-instruct", + "displayName": "Qwen3 VL 235B A22B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-09-23", + "openWeights": true, + "releaseDate": "2025-09-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "modelKey": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "displayName": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "modelKey": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "displayName": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3-vl-235b-a22b-instruct", + "modelKey": "alibaba/qwen3-vl-235b-a22b-instruct", + "displayName": "Qwen3 VL 235B A22B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2025-09-24" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen3-vl-235b-a22b-instruct", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/model-pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-vl-235b-a22b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-vl-235b-a22b-instruct", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-vl-235b-a22b-instruct", + "displayName": "Qwen: Qwen3 VL 235B A22B Instruct", + "metadata": { + "canonicalSlug": "qwen/qwen3-vl-235b-a22b-instruct", + "createdAt": "2025-09-23T23:04:47.000Z", + "huggingFaceId": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/qwen/qwen3-vl-235b-a22b-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-vl-235b-a22b-instruct-fp8", + "provider": "alibaba", + "model": "qwen3-vl-235b-a22b-instruct-fp8", + "displayName": "Qwen3-VL 235B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "gmi", + "stackit" + ], + "aliases": [ + "gmi/Qwen/Qwen3-VL-235B-A22B-Instruct-FP8", + "stackit/Qwen/Qwen3-VL-235B-A22B-Instruct-FP8" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "stackit", + "model": "Qwen/Qwen3-VL-235B-A22B-Instruct-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.64, + "output": 1.91 + } + }, + { + "source": "litellm", + "provider": "gmi", + "model": "gmi/Qwen/Qwen3-VL-235B-A22B-Instruct-FP8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3-VL 235B" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-11-01", + "lastUpdated": "2024-11-01", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "stackit", + "providerName": "STACKIT", + "providerApi": "https://api.openai-compat.model-serving.eu01.onstackit.cloud/v1", + "providerDoc": "https://docs.stackit.cloud/products/data-and-ai/ai-model-serving/basics/available-shared-models", + "model": "Qwen/Qwen3-VL-235B-A22B-Instruct-FP8", + "modelKey": "Qwen/Qwen3-VL-235B-A22B-Instruct-FP8", + "displayName": "Qwen3-VL 235B", + "family": "qwen", + "metadata": { + "lastUpdated": "2024-11-01", + "openWeights": true, + "releaseDate": "2024-11-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gmi", + "model": "gmi/Qwen/Qwen3-VL-235B-A22B-Instruct-FP8", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-vl-235b-a22b-instruct-original", + "provider": "alibaba", + "model": "qwen3-vl-235b-a22b-instruct-original", + "displayName": "Qwen3 VL 235B A22B Instruct Original", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/qwen3-vl-235b-a22b-instruct-original" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3-vl-235b-a22b-instruct-original", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 VL 235B A22B Instruct Original" + ], + "releaseDate": "2025-09-25", + "lastUpdated": "2025-09-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3-vl-235b-a22b-instruct-original", + "modelKey": "qwen3-vl-235b-a22b-instruct-original", + "displayName": "Qwen3 VL 235B A22B Instruct Original", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + } + ] + }, + { + "id": "alibaba/qwen3-vl-235b-a22b-thinking", + "provider": "alibaba", + "model": "qwen3-vl-235b-a22b-thinking", + "displayName": "Qwen: Qwen3 VL 235B A22B Thinking", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "dashscope", + "fireworks_ai", + "kilo", + "llmgateway", + "nano-gpt", + "novita", + "novita-ai", + "openrouter", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "dashscope/qwen3-vl-235b-a22b-thinking", + "fireworks_ai/accounts/fireworks/models/qwen3-vl-235b-a22b-thinking", + "kilo/qwen/qwen3-vl-235b-a22b-thinking", + "llmgateway/qwen3-vl-235b-a22b-thinking", + "nano-gpt/qwen3-vl-235b-a22b-thinking", + "novita-ai/qwen/qwen3-vl-235b-a22b-thinking", + "novita/qwen/qwen3-vl-235b-a22b-thinking", + "openrouter/qwen/qwen3-vl-235b-a22b-thinking", + "siliconflow-cn/Qwen/Qwen3-VL-235B-A22B-Thinking", + "siliconflow/Qwen/Qwen3-VL-235B-A22B-Thinking" + ], + "mergedProviderModelRecords": 10, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-vl-235b-a22b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.26, + "output": 2.6 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-vl-235b-a22b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3-vl-235b-a22b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-vl-235b-a22b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.98, + "output": 3.95 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-vl-235b-a22b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.26, + "output": 2.6 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 3.5 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 3.5 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen3-vl-235b-a22b-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 4 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-vl-235b-a22b-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.22, + "output": 0.88 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-vl-235b-a22b-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.98, + "output": 3.95 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-vl-235b-a22b-thinking", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.26, + "output": 2.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3-VL-235B-A22B-Thinking", + "Qwen3 VL 235B A22B Thinking", + "Qwen: Qwen3 VL 235B A22B Thinking" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-09-24", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 10 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-vl-235b-a22b-thinking", + "modelKey": "qwen/qwen3-vl-235b-a22b-thinking", + "displayName": "Qwen: Qwen3 VL 235B A22B Thinking", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-09-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-vl-235b-a22b-thinking", + "modelKey": "qwen3-vl-235b-a22b-thinking", + "displayName": "Qwen3 VL 235B A22B Thinking", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-09-15", + "openWeights": true, + "releaseDate": "2025-09-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3-vl-235b-a22b-thinking", + "modelKey": "qwen3-vl-235b-a22b-thinking", + "displayName": "Qwen3 VL 235B A22B Thinking", + "metadata": { + "lastUpdated": "2025-08-26", + "openWeights": false, + "releaseDate": "2025-08-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-vl-235b-a22b-thinking", + "modelKey": "qwen/qwen3-vl-235b-a22b-thinking", + "displayName": "Qwen3 VL 235B A22B Thinking", + "metadata": { + "lastUpdated": "2025-09-24", + "openWeights": true, + "releaseDate": "2025-09-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-vl-235b-a22b-thinking", + "modelKey": "qwen/qwen3-vl-235b-a22b-thinking", + "displayName": "Qwen3 VL 235B A22B Thinking", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-09-23", + "openWeights": true, + "releaseDate": "2025-09-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "modelKey": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "displayName": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "modelKey": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "displayName": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-04" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen3-vl-235b-a22b-thinking", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/model-pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-vl-235b-a22b-thinking", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-vl-235b-a22b-thinking", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-vl-235b-a22b-thinking", + "displayName": "Qwen: Qwen3 VL 235B A22B Thinking", + "metadata": { + "canonicalSlug": "qwen/qwen3-vl-235b-a22b-thinking", + "createdAt": "2025-09-23T23:04:50.000Z", + "huggingFaceId": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/qwen/qwen3-vl-235b-a22b-thinking/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-vl-30b-a3b", + "provider": "alibaba", + "model": "qwen3-vl-30b-a3b", + "displayName": "Qwen3-VL 30B-A3B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/qwen3-vl-30b-a3b", + "alibaba/qwen3-vl-30b-a3b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3-vl-30b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.108, + "output": 0.431, + "reasoningOutput": 1.076 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-vl-30b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.8, + "reasoningOutput": 2.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3-VL 30B-A3B" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-04", + "lastUpdated": "2025-04", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-vl-30b-a3b", + "modelKey": "qwen3-vl-30b-a3b", + "displayName": "Qwen3-VL 30B-A3B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-vl-30b-a3b", + "modelKey": "qwen3-vl-30b-a3b", + "displayName": "Qwen3-VL 30B-A3B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04", + "openWeights": true, + "releaseDate": "2025-04" + } + } + ] + }, + { + "id": "alibaba/qwen3-vl-30b-a3b-instruct", + "provider": "alibaba", + "model": "qwen3-vl-30b-a3b-instruct", + "displayName": "Qwen3 VL 30B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "evroc", + "fireworks_ai", + "kilo", + "llmgateway", + "nearai", + "novita", + "novita-ai", + "openrouter", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "evroc/Qwen/Qwen3-VL-30B-A3B-Instruct", + "fireworks_ai/accounts/fireworks/models/qwen3-vl-30b-a3b-instruct", + "kilo/qwen/qwen3-vl-30b-a3b-instruct", + "llmgateway/qwen3-vl-30b-a3b-instruct", + "nearai/Qwen/Qwen3-VL-30B-A3B-Instruct", + "novita-ai/qwen/qwen3-vl-30b-a3b-instruct", + "novita/qwen/qwen3-vl-30b-a3b-instruct", + "openrouter/qwen/qwen3-vl-30b-a3b-instruct", + "siliconflow-cn/Qwen/Qwen3-VL-30B-A3B-Instruct", + "siliconflow/Qwen/Qwen3-VL-30B-A3B-Instruct" + ], + "mergedProviderModelRecords": 10, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "temperature": true, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "functionCalling": true, + "systemMessages": true, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "evroc", + "model": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.24, + "output": 0.94 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-vl-30b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.52 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-vl-30b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.7 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.55 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-vl-30b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.7 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-vl-30b-a3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.52 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 1 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-vl-30b-a3b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-vl-30b-a3b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.7 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-vl-30b-a3b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0.52 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3-VL-30B-A3B-Instruct", + "Qwen3 VL 30B", + "Qwen3 VL 30B A3B Instruct", + "Qwen3-VL 30B-A3B Instruct", + "Qwen: Qwen3 VL 30B A3B Instruct", + "qwen/qwen3-vl-30b-a3b-instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-07-30", + "lastUpdated": "2025-07-30", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 10 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "evroc", + "providerName": "evroc", + "providerApi": "https://models.think.evroc.com/v1", + "providerDoc": "https://docs.evroc.com/products/think/overview.html", + "model": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "modelKey": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "displayName": "Qwen3 VL 30B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-07-30", + "openWeights": true, + "releaseDate": "2025-07-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-vl-30b-a3b-instruct", + "modelKey": "qwen/qwen3-vl-30b-a3b-instruct", + "displayName": "Qwen: Qwen3 VL 30B A3B Instruct", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": true, + "releaseDate": "2025-10-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-vl-30b-a3b-instruct", + "modelKey": "qwen3-vl-30b-a3b-instruct", + "displayName": "Qwen3 VL 30B A3B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-10-02", + "openWeights": true, + "releaseDate": "2025-10-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "modelKey": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "displayName": "Qwen3-VL 30B-A3B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-09-23", + "openWeights": true, + "releaseDate": "2025-09-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-vl-30b-a3b-instruct", + "modelKey": "qwen/qwen3-vl-30b-a3b-instruct", + "displayName": "qwen/qwen3-vl-30b-a3b-instruct", + "metadata": { + "lastUpdated": "2025-10-11", + "openWeights": true, + "releaseDate": "2025-10-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-vl-30b-a3b-instruct", + "modelKey": "qwen/qwen3-vl-30b-a3b-instruct", + "displayName": "Qwen3 VL 30B A3B Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-10-06", + "openWeights": true, + "releaseDate": "2025-10-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "modelKey": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "displayName": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "modelKey": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "displayName": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-vl-30b-a3b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-vl-30b-a3b-instruct", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-vl-30b-a3b-instruct", + "displayName": "Qwen: Qwen3 VL 30B A3B Instruct", + "metadata": { + "canonicalSlug": "qwen/qwen3-vl-30b-a3b-instruct", + "createdAt": "2025-10-06T23:47:56.000Z", + "huggingFaceId": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/qwen/qwen3-vl-30b-a3b-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-vl-30b-a3b-thinking", + "provider": "alibaba", + "model": "qwen3-vl-30b-a3b-thinking", + "displayName": "Qwen: Qwen3 VL 30B A3B Thinking", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "fireworks_ai", + "kilo", + "llmgateway", + "novita", + "novita-ai", + "openrouter", + "qiniu-ai", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen3-vl-30b-a3b-thinking", + "kilo/qwen/qwen3-vl-30b-a3b-thinking", + "llmgateway/qwen3-vl-30b-a3b-thinking", + "novita-ai/qwen/qwen3-vl-30b-a3b-thinking", + "novita/qwen/qwen3-vl-30b-a3b-thinking", + "openrouter/qwen/qwen3-vl-30b-a3b-thinking", + "qiniu-ai/qwen3-vl-30b-a3b-thinking", + "siliconflow-cn/Qwen/Qwen3-VL-30B-A3B-Thinking", + "siliconflow/Qwen/Qwen3-VL-30B-A3B-Thinking" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "functionCalling": true, + "systemMessages": true, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-vl-30b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 1.56 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-vl-30b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-vl-30b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-vl-30b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 1.56 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 1 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-vl-30b-a3b-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-vl-30b-a3b-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 1 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-vl-30b-a3b-thinking", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 1.56 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3-VL-30B-A3B-Thinking", + "Qwen3 VL 30B A3B Thinking", + "Qwen3-Vl 30b A3b Thinking", + "Qwen: Qwen3 VL 30B A3B Thinking", + "qwen/qwen3-vl-30b-a3b-thinking" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-10-11", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-vl-30b-a3b-thinking", + "modelKey": "qwen/qwen3-vl-30b-a3b-thinking", + "displayName": "Qwen: Qwen3 VL 30B A3B Thinking", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-10-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-vl-30b-a3b-thinking", + "modelKey": "qwen3-vl-30b-a3b-thinking", + "displayName": "Qwen3 VL 30B A3B Thinking", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-10-02", + "openWeights": true, + "releaseDate": "2025-10-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-vl-30b-a3b-thinking", + "modelKey": "qwen/qwen3-vl-30b-a3b-thinking", + "displayName": "qwen/qwen3-vl-30b-a3b-thinking", + "metadata": { + "lastUpdated": "2025-10-11", + "openWeights": true, + "releaseDate": "2025-10-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-vl-30b-a3b-thinking", + "modelKey": "qwen/qwen3-vl-30b-a3b-thinking", + "displayName": "Qwen3 VL 30B A3B Thinking", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-10-06", + "openWeights": true, + "releaseDate": "2025-10-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen3-vl-30b-a3b-thinking", + "modelKey": "qwen3-vl-30b-a3b-thinking", + "displayName": "Qwen3-Vl 30b A3b Thinking", + "metadata": { + "lastUpdated": "2026-02-09", + "openWeights": false, + "releaseDate": "2026-02-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "modelKey": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "displayName": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "modelKey": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "displayName": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-11" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-vl-30b-a3b-thinking", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-vl-30b-a3b-thinking", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-vl-30b-a3b-thinking", + "displayName": "Qwen: Qwen3 VL 30B A3B Thinking", + "metadata": { + "canonicalSlug": "qwen/qwen3-vl-30b-a3b-thinking", + "createdAt": "2025-10-06T23:47:59.000Z", + "huggingFaceId": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/qwen/qwen3-vl-30b-a3b-thinking/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-vl-32b-instruct", + "provider": "alibaba", + "model": "qwen3-vl-32b-instruct", + "displayName": "Qwen: Qwen3 VL 32B Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "dashscope", + "fireworks_ai", + "kilo", + "openrouter", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "dashscope/qwen3-vl-32b-instruct", + "fireworks_ai/accounts/fireworks/models/qwen3-vl-32b-instruct", + "kilo/qwen/qwen3-vl-32b-instruct", + "openrouter/qwen/qwen3-vl-32b-instruct", + "siliconflow-cn/Qwen/Qwen3-VL-32B-Instruct", + "siliconflow/Qwen/Qwen3-VL-32B-Instruct" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 262144, + "inputTokens": 131072, + "maxTokens": 32768, + "outputTokens": 262000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-vl-32b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.104, + "output": 0.416 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-vl-32b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.104, + "output": 0.416 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-VL-32B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-VL-32B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen3-vl-32b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.16, + "output": 0.64 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-vl-32b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-vl-32b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.104, + "output": 0.416 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3-VL-32B-Instruct", + "Qwen3 VL 32B Instruct", + "Qwen: Qwen3 VL 32B Instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-10-21", + "lastUpdated": "2025-11-25", + "supportedParameters": [ + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-vl-32b-instruct", + "modelKey": "qwen/qwen3-vl-32b-instruct", + "displayName": "Qwen: Qwen3 VL 32B Instruct", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-vl-32b-instruct", + "modelKey": "qwen/qwen3-vl-32b-instruct", + "displayName": "Qwen3 VL 32B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-10-23", + "openWeights": true, + "releaseDate": "2025-10-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-VL-32B-Instruct", + "modelKey": "Qwen/Qwen3-VL-32B-Instruct", + "displayName": "Qwen/Qwen3-VL-32B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-VL-32B-Instruct", + "modelKey": "Qwen/Qwen3-VL-32B-Instruct", + "displayName": "Qwen/Qwen3-VL-32B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-21" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen3-vl-32b-instruct", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/model-pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-vl-32b-instruct", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-vl-32b-instruct", + "displayName": "Qwen: Qwen3 VL 32B Instruct", + "metadata": { + "canonicalSlug": "qwen/qwen3-vl-32b-instruct", + "createdAt": "2025-10-23T14:55:32.000Z", + "huggingFaceId": "Qwen/Qwen3-VL-32B-Instruct", + "links": { + "details": "/api/v1/models/qwen/qwen3-vl-32b-instruct/endpoints" + }, + "supportedParameters": [ + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-vl-32b-thinking", + "provider": "alibaba", + "model": "qwen3-vl-32b-thinking", + "displayName": "Qwen/Qwen3-VL-32B-Thinking", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "dashscope", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "dashscope/qwen3-vl-32b-thinking", + "siliconflow-cn/Qwen/Qwen3-VL-32B-Thinking", + "siliconflow/Qwen/Qwen3-VL-32B-Thinking" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 262000, + "inputTokens": 131072, + "maxTokens": 32768, + "outputTokens": 262000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-VL-32B-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-VL-32B-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen3-vl-32b-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.16, + "output": 2.87 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3-VL-32B-Thinking" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-10-21", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-VL-32B-Thinking", + "modelKey": "Qwen/Qwen3-VL-32B-Thinking", + "displayName": "Qwen/Qwen3-VL-32B-Thinking", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-VL-32B-Thinking", + "modelKey": "Qwen/Qwen3-VL-32B-Thinking", + "displayName": "Qwen/Qwen3-VL-32B-Thinking", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-21" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen3-vl-32b-thinking", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/model-pricing" + } + } + ] + }, + { + "id": "alibaba/qwen3-vl-8b", + "provider": "alibaba", + "model": "qwen3-vl-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "llamagate" + ], + "aliases": [ + "llamagate/qwen3-vl-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "llamagate", + "model": "llamagate/qwen3-vl-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.55 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "llamagate", + "model": "llamagate/qwen3-vl-8b", + "mode": "chat" + } + ] + }, + { + "id": "alibaba/qwen3-vl-8b-instruct", + "provider": "alibaba", + "model": "qwen3-vl-8b-instruct", + "displayName": "Qwen: Qwen3 VL 8B Instruct", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "fireworks_ai", + "kilo", + "llmgateway", + "novita", + "novita-ai", + "openrouter", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/qwen3-vl-8b-instruct", + "kilo/qwen/qwen3-vl-8b-instruct", + "llmgateway/qwen3-vl-8b-instruct", + "novita-ai/qwen/qwen3-vl-8b-instruct", + "novita/qwen/qwen3-vl-8b-instruct", + "openrouter/qwen/qwen3-vl-8b-instruct", + "siliconflow-cn/Qwen/Qwen3-VL-8B-Instruct", + "siliconflow/Qwen/Qwen3-VL-8B-Instruct" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 262000, + "inputTokens": 131072, + "maxTokens": 32768, + "outputTokens": 262000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "functionCalling": true, + "systemMessages": true, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-vl-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-vl-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3-vl-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-vl-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-VL-8B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.68 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-VL-8B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.68 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-vl-8b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/qwen/qwen3-vl-8b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-vl-8b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3-VL-8B-Instruct", + "Qwen3 VL 8B Instruct", + "Qwen: Qwen3 VL 8B Instruct", + "qwen/qwen3-vl-8b-instruct" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-10-15", + "lastUpdated": "2025-11-25", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-vl-8b-instruct", + "modelKey": "qwen/qwen3-vl-8b-instruct", + "displayName": "Qwen: Qwen3 VL 8B Instruct", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": true, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-vl-8b-instruct", + "modelKey": "qwen3-vl-8b-instruct", + "displayName": "Qwen3 VL 8B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-08-19", + "openWeights": true, + "releaseDate": "2025-08-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3-vl-8b-instruct", + "modelKey": "qwen/qwen3-vl-8b-instruct", + "displayName": "qwen/qwen3-vl-8b-instruct", + "metadata": { + "lastUpdated": "2025-10-17", + "openWeights": true, + "releaseDate": "2025-10-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-vl-8b-instruct", + "modelKey": "qwen/qwen3-vl-8b-instruct", + "displayName": "Qwen3 VL 8B Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-10-14", + "openWeights": true, + "releaseDate": "2025-10-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-VL-8B-Instruct", + "modelKey": "Qwen/Qwen3-VL-8B-Instruct", + "displayName": "Qwen/Qwen3-VL-8B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-VL-8B-Instruct", + "modelKey": "Qwen/Qwen3-VL-8B-Instruct", + "displayName": "Qwen/Qwen3-VL-8B-Instruct", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwen3-vl-8b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/qwen/qwen3-vl-8b-instruct", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-vl-8b-instruct", + "displayName": "Qwen: Qwen3 VL 8B Instruct", + "metadata": { + "canonicalSlug": "qwen/qwen3-vl-8b-instruct", + "createdAt": "2025-10-14T17:35:08.000Z", + "huggingFaceId": "Qwen/Qwen3-VL-8B-Instruct", + "links": { + "details": "/api/v1/models/qwen/qwen3-vl-8b-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-vl-8b-thinking", + "provider": "alibaba", + "model": "qwen3-vl-8b-thinking", + "displayName": "Qwen: Qwen3 VL 8B Thinking", + "family": "qwen", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "kilo/qwen/qwen3-vl-8b-thinking", + "openrouter/qwen/qwen3-vl-8b-thinking", + "siliconflow-cn/Qwen/Qwen3-VL-8B-Thinking", + "siliconflow/Qwen/Qwen3-VL-8B-Thinking" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 262000, + "outputTokens": 262000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3-vl-8b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.117, + "output": 1.365 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3-vl-8b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.117, + "output": 1.365 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3-VL-8B-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/Qwen3-VL-8B-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3-vl-8b-thinking", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.117, + "output": 1.365 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3-VL-8B-Thinking", + "Qwen3 VL 8B Thinking", + "Qwen: Qwen3 VL 8B Thinking" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-10-15", + "lastUpdated": "2025-11-25", + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3-vl-8b-thinking", + "modelKey": "qwen/qwen3-vl-8b-thinking", + "displayName": "Qwen: Qwen3 VL 8B Thinking", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3-vl-8b-thinking", + "modelKey": "qwen/qwen3-vl-8b-thinking", + "displayName": "Qwen3 VL 8B Thinking", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-10-14", + "openWeights": true, + "releaseDate": "2025-10-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-VL-8B-Thinking", + "modelKey": "Qwen/Qwen3-VL-8B-Thinking", + "displayName": "Qwen/Qwen3-VL-8B-Thinking", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3-VL-8B-Thinking", + "modelKey": "Qwen/Qwen3-VL-8B-Thinking", + "displayName": "Qwen/Qwen3-VL-8B-Thinking", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3-vl-8b-thinking", + "displayName": "Qwen: Qwen3 VL 8B Thinking", + "metadata": { + "canonicalSlug": "qwen/qwen3-vl-8b-thinking", + "createdAt": "2025-10-14T17:42:26.000Z", + "huggingFaceId": "Qwen/Qwen3-VL-8B-Thinking", + "links": { + "details": "/api/v1/models/qwen/qwen3-vl-8b-thinking/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3-vl-embedding-8b", + "provider": "alibaba", + "model": "qwen3-vl-embedding-8b", + "displayName": "Qwen3-VL Embedding 8B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "stackit" + ], + "aliases": [ + "stackit/Qwen/Qwen3-VL-Embedding-8B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "stackit", + "model": "Qwen/Qwen3-VL-Embedding-8B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.09 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3-VL Embedding 8B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-02-05", + "lastUpdated": "2026-02-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "stackit", + "providerName": "STACKIT", + "providerApi": "https://api.openai-compat.model-serving.eu01.onstackit.cloud/v1", + "providerDoc": "https://docs.stackit.cloud/products/data-and-ai/ai-model-serving/basics/available-shared-models", + "model": "Qwen/Qwen3-VL-Embedding-8B", + "modelKey": "Qwen/Qwen3-VL-Embedding-8B", + "displayName": "Qwen3-VL Embedding 8B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-05", + "openWeights": true, + "releaseDate": "2026-02-05" + } + } + ] + }, + { + "id": "alibaba/qwen3-vl-flash", + "provider": "alibaba", + "model": "qwen3-vl-flash", + "displayName": "Qwen3 VL Flash", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/qwen3-vl-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 32000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-vl-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0044, + "input": 0.022, + "output": 0.215 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 VL Flash" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-10-09", + "lastUpdated": "2025-10-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-vl-flash", + "modelKey": "qwen3-vl-flash", + "displayName": "Qwen3 VL Flash", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-10-09", + "openWeights": false, + "releaseDate": "2025-10-09" + } + } + ] + }, + { + "id": "alibaba/qwen3-vl-instruct", + "provider": "alibaba", + "model": "qwen3-vl-instruct", + "displayName": "Qwen3 VL Instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/alibaba/qwen3-vl-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 129024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3-vl-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 VL Instruct" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-09-24", + "lastUpdated": "2025-09-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3-vl-instruct", + "modelKey": "alibaba/qwen3-vl-instruct", + "displayName": "Qwen3 VL Instruct", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-24", + "openWeights": true, + "releaseDate": "2025-09-24" + } + } + ] + }, + { + "id": "alibaba/qwen3-vl-plus", + "provider": "alibaba", + "model": "qwen3-vl-plus", + "displayName": "Qwen3-VL Plus", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "dashscope", + "iflowcn", + "llmgateway" + ], + "aliases": [ + "alibaba-cn/qwen3-vl-plus", + "alibaba/qwen3-vl-plus", + "dashscope/qwen3-vl-plus", + "iflowcn/qwen3-vl-plus", + "llmgateway/qwen3-vl-plus" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 262144, + "inputTokens": 260096, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3-vl-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.143353, + "output": 1.433525, + "reasoningOutput": 4.300576 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3-vl-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.6, + "reasoningOutput": 4.8 + } + }, + { + "source": "models.dev", + "provider": "iflowcn", + "model": "qwen3-vl-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3-vl-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.6, + "reasoningOutput": 4.8 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen3-vl-plus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3-VL Plus", + "Qwen3-VL-Plus" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-09-23", + "lastUpdated": "2025-09-23", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-vl-plus", + "modelKey": "qwen3-vl-plus", + "displayName": "Qwen3-VL Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-23", + "openWeights": false, + "releaseDate": "2025-09-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3-vl-plus", + "modelKey": "qwen3-vl-plus", + "displayName": "Qwen3-VL Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-23", + "openWeights": false, + "releaseDate": "2025-09-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "iflowcn", + "providerName": "iFlow", + "providerApi": "https://apis.iflow.cn/v1", + "providerDoc": "https://platform.iflow.cn/en/docs", + "model": "qwen3-vl-plus", + "modelKey": "qwen3-vl-plus", + "displayName": "Qwen3-VL-Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3-vl-plus", + "modelKey": "qwen3-vl-plus", + "displayName": "Qwen3-VL Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-23", + "openWeights": false, + "releaseDate": "2025-09-23" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen3-vl-plus", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen3-vl-thinking", + "provider": "alibaba", + "model": "qwen3-vl-thinking", + "displayName": "Qwen3 VL Thinking", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/alibaba/qwen3-vl-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3-vl-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3 VL Thinking" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-09", + "releaseDate": "2025-09-24", + "lastUpdated": "2025-09-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3-vl-thinking", + "modelKey": "alibaba/qwen3-vl-thinking", + "displayName": "Qwen3 VL Thinking", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2025-09-24", + "openWeights": true, + "releaseDate": "2025-09-24" + } + } + ] + }, + { + "id": "alibaba/qwen3-vl:235b", + "provider": "alibaba", + "model": "qwen3-vl:235b", + "displayName": "qwen3-vl:235b", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/qwen3-vl:235b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "qwen3-vl:235b" + ], + "families": [ + "qwen" + ], + "statuses": [ + "deprecated" + ], + "releaseDate": "2025-09-22", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "qwen3-vl:235b", + "modelKey": "qwen3-vl:235b", + "displayName": "qwen3-vl:235b", + "family": "qwen", + "status": "deprecated", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-09-22" + } + } + ] + }, + { + "id": "alibaba/qwen3-vl:235b-instruct", + "provider": "alibaba", + "model": "qwen3-vl:235b-instruct", + "displayName": "qwen3-vl:235b-instruct", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/qwen3-vl:235b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "qwen3-vl:235b-instruct" + ], + "families": [ + "qwen" + ], + "statuses": [ + "deprecated" + ], + "releaseDate": "2025-09-22", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "qwen3-vl:235b-instruct", + "modelKey": "qwen3-vl:235b-instruct", + "displayName": "qwen3-vl:235b-instruct", + "family": "qwen", + "status": "deprecated", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-09-22" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-122b", + "provider": "alibaba", + "model": "qwen3.5-122b", + "displayName": "Qwen3.5-122B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "regolo-ai" + ], + "aliases": [ + "regolo-ai/qwen3.5-122b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "regolo-ai", + "model": "qwen3.5-122b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.9, + "output": 3.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5-122B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-02-01", + "lastUpdated": "2026-02-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "regolo-ai", + "providerName": "Regolo AI", + "providerApi": "https://api.regolo.ai/v1", + "providerDoc": "https://docs.regolo.ai/", + "model": "qwen3.5-122b", + "modelKey": "qwen3.5-122b", + "displayName": "Qwen3.5-122B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-01", + "openWeights": true, + "releaseDate": "2026-02-01" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-122b-a10b", + "provider": "alibaba", + "model": "qwen3.5-122b-a10b", + "displayName": "Qwen3.5 122B-A10B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba", + "cortecs", + "kilo", + "mixlayer", + "nano-gpt", + "nearai", + "novita-ai", + "nvidia", + "openrouter", + "orcarouter", + "siliconflow-cn" + ], + "aliases": [ + "alibaba/qwen3.5-122b-a10b", + "cortecs/qwen3.5-122b-a10b", + "kilo/qwen/qwen3.5-122b-a10b", + "mixlayer/qwen/qwen3.5-122b-a10b", + "nano-gpt/TEE/qwen3.5-122b-a10b", + "nano-gpt/qwen3.5-122b-a10b", + "nearai/Qwen/Qwen3.5-122B-A10B", + "novita-ai/qwen/qwen3.5-122b-a10b", + "nvidia/qwen/qwen3.5-122b-a10b", + "openrouter/qwen/qwen3.5-122b-a10b", + "orcarouter/qwen/qwen3.5-122b-a10b", + "siliconflow-cn/Qwen/Qwen3.5-122B-A10B" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 65536, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3.5-122b-a10b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "qwen3.5-122b-a10b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.444, + "output": 3.106 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3.5-122b-a10b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.26, + "output": 2.08 + } + }, + { + "source": "models.dev", + "provider": "mixlayer", + "model": "qwen/qwen3.5-122b-a10b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3.5-122b-a10b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.36, + "output": 2.88 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/qwen3.5-122b-a10b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.46, + "output": 3.68 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "Qwen/Qwen3.5-122B-A10B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3.5-122b-a10b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "qwen/qwen3.5-122b-a10b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3.5-122b-a10b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.26, + "output": 2.08 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "qwen/qwen3.5-122b-a10b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.115, + "output": 0.917 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3.5-122B-A10B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 2.32 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3.5-122b-a10b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3.5-122b-a10b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.26, + "output": 2.08 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3.5-122B-A10B", + "Qwen3.5 122B A10B", + "Qwen3.5 122B A10B TEE", + "Qwen3.5 122B-A10B", + "Qwen3.5-122B-A10B", + "Qwen: Qwen3.5-122B-A10B" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2026-01", + "releaseDate": "2026-02-23", + "lastUpdated": "2026-02-23", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.5-122b-a10b", + "modelKey": "qwen3.5-122b-a10b", + "displayName": "Qwen3.5 122B-A10B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-23", + "openWeights": true, + "releaseDate": "2026-02-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "qwen3.5-122b-a10b", + "modelKey": "qwen3.5-122b-a10b", + "displayName": "Qwen3.5 122B A10B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2026-01", + "lastUpdated": "2026-02-24", + "openWeights": true, + "releaseDate": "2026-02-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3.5-122b-a10b", + "modelKey": "qwen/qwen3.5-122b-a10b", + "displayName": "Qwen: Qwen3.5-122B-A10B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2026-02-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mixlayer", + "providerName": "Mixlayer", + "providerApi": "https://models.mixlayer.ai/v1", + "providerDoc": "https://docs.mixlayer.com", + "model": "qwen/qwen3.5-122b-a10b", + "modelKey": "qwen/qwen3.5-122b-a10b", + "displayName": "Qwen3.5 122B A10B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3.5-122b-a10b", + "modelKey": "qwen3.5-122b-a10b", + "displayName": "Qwen3.5 122B A10B", + "metadata": { + "lastUpdated": "2026-02-24", + "openWeights": false, + "releaseDate": "2026-02-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/qwen3.5-122b-a10b", + "modelKey": "TEE/qwen3.5-122b-a10b", + "displayName": "Qwen3.5 122B A10B TEE", + "metadata": { + "lastUpdated": "2026-05-26", + "openWeights": false, + "releaseDate": "2026-05-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "Qwen/Qwen3.5-122B-A10B", + "modelKey": "Qwen/Qwen3.5-122B-A10B", + "displayName": "Qwen3.5 122B-A10B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-23", + "openWeights": true, + "releaseDate": "2026-02-23", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3.5-122b-a10b", + "modelKey": "qwen/qwen3.5-122b-a10b", + "displayName": "Qwen3.5-122B-A10B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-26", + "openWeights": true, + "releaseDate": "2026-02-26", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "qwen/qwen3.5-122b-a10b", + "modelKey": "qwen/qwen3.5-122b-a10b", + "displayName": "Qwen3.5 122B-A10B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-23", + "openWeights": true, + "releaseDate": "2026-02-23", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3.5-122b-a10b", + "modelKey": "qwen/qwen3.5-122b-a10b", + "displayName": "Qwen3.5 122B-A10B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-23", + "openWeights": true, + "releaseDate": "2026-02-23", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "qwen/qwen3.5-122b-a10b", + "modelKey": "qwen/qwen3.5-122b-a10b", + "displayName": "Qwen3.5 122B-A10B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-23", + "openWeights": true, + "releaseDate": "2026-02-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3.5-122B-A10B", + "modelKey": "Qwen/Qwen3.5-122B-A10B", + "displayName": "Qwen/Qwen3.5-122B-A10B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-26", + "openWeights": true, + "releaseDate": "2026-02-26" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3.5-122b-a10b", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/qwen/qwen3.5-122b-a10b" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3.5-122b-a10b", + "displayName": "Qwen: Qwen3.5-122B-A10B", + "metadata": { + "canonicalSlug": "qwen/qwen3.5-122b-a10b-20260224", + "createdAt": "2026-02-25T21:09:49.000Z", + "huggingFaceId": "Qwen/Qwen3.5-122B-A10B", + "links": { + "details": "/api/v1/models/qwen/qwen3.5-122b-a10b-20260224/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 262144, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3.5-122b-a10b:thinking", + "provider": "alibaba", + "model": "qwen3.5-122b-a10b:thinking", + "displayName": "Qwen3.5 122B A10B Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/qwen3.5-122b-a10b:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 260096, + "inputTokens": 260096, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3.5-122b-a10b:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.36, + "output": 2.88 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 122B A10B Thinking" + ], + "releaseDate": "2026-02-24", + "lastUpdated": "2026-02-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3.5-122b-a10b:thinking", + "modelKey": "qwen3.5-122b-a10b:thinking", + "displayName": "Qwen3.5 122B A10B Thinking", + "metadata": { + "lastUpdated": "2026-02-24", + "openWeights": false, + "releaseDate": "2026-02-24" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b", + "provider": "alibaba", + "model": "qwen3.5-27b", + "displayName": "Qwen3.5 27B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba", + "kilo", + "mixlayer", + "nano-gpt", + "novita-ai", + "openrouter", + "orcarouter", + "siliconflow-cn" + ], + "aliases": [ + "alibaba/qwen3.5-27b", + "kilo/qwen/qwen3.5-27b", + "mixlayer/qwen/qwen3.5-27b", + "nano-gpt/TEE/qwen3.5-27b", + "nano-gpt/qwen3.5-27b", + "novita-ai/qwen/qwen3.5-27b", + "openrouter/qwen/qwen3.5-27b", + "orcarouter/qwen/qwen3.5-27b", + "siliconflow-cn/Qwen/Qwen3.5-27B" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 65536, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3.5-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3.5-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.195, + "output": 1.56 + } + }, + { + "source": "models.dev", + "provider": "mixlayer", + "model": "qwen/qwen3.5-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3.5-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 2.16 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/qwen3.5-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3.5-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3.5-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.195, + "output": 1.56 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "qwen/qwen3.5-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.086, + "output": 0.688 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3.5-27B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.26, + "output": 2.09 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3.5-27b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 2.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3.5-27b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.195, + "output": 1.56 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3.5-27B", + "Qwen3.5 27B", + "Qwen3.5 27B TEE", + "Qwen3.5-27B", + "Qwen: Qwen3.5-27B" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-02-23", + "lastUpdated": "2026-02-23", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.5-27b", + "modelKey": "qwen3.5-27b", + "displayName": "Qwen3.5 27B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-23", + "openWeights": true, + "releaseDate": "2026-02-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3.5-27b", + "modelKey": "qwen/qwen3.5-27b", + "displayName": "Qwen: Qwen3.5-27B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2026-02-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mixlayer", + "providerName": "Mixlayer", + "providerApi": "https://models.mixlayer.ai/v1", + "providerDoc": "https://docs.mixlayer.com", + "model": "qwen/qwen3.5-27b", + "modelKey": "qwen/qwen3.5-27b", + "displayName": "Qwen3.5 27B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3.5-27b", + "modelKey": "qwen3.5-27b", + "displayName": "Qwen3.5 27B", + "metadata": { + "lastUpdated": "2026-02-24", + "openWeights": false, + "releaseDate": "2026-02-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/qwen3.5-27b", + "modelKey": "TEE/qwen3.5-27b", + "displayName": "Qwen3.5 27B TEE", + "metadata": { + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-03-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3.5-27b", + "modelKey": "qwen/qwen3.5-27b", + "displayName": "Qwen3.5-27B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-26", + "openWeights": true, + "releaseDate": "2026-02-26", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3.5-27b", + "modelKey": "qwen/qwen3.5-27b", + "displayName": "Qwen3.5 27B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-23", + "openWeights": true, + "releaseDate": "2026-02-23", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "qwen/qwen3.5-27b", + "modelKey": "qwen/qwen3.5-27b", + "displayName": "Qwen3.5 27B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-23", + "openWeights": true, + "releaseDate": "2026-02-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3.5-27B", + "modelKey": "Qwen/Qwen3.5-27B", + "displayName": "Qwen/Qwen3.5-27B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-25", + "openWeights": true, + "releaseDate": "2026-02-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3.5-27b", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/qwen/qwen3.5-27b" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3.5-27b", + "displayName": "Qwen: Qwen3.5-27B", + "metadata": { + "canonicalSlug": "qwen/qwen3.5-27b-20260224", + "createdAt": "2026-02-25T21:10:10.000Z", + "huggingFaceId": "Qwen/Qwen3.5-27B", + "links": { + "details": "/api/v1/models/qwen/qwen3.5-27b-20260224/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-anko", + "provider": "alibaba", + "model": "qwen3.5-27b-anko", + "displayName": "Qwen3.5 27B Anko", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Anko" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Anko", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Anko" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Anko", + "modelKey": "Qwen3.5-27B-Anko", + "displayName": "Qwen3.5 27B Anko", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-bluestar-derestricted", + "provider": "alibaba", + "model": "qwen3.5-27b-bluestar-derestricted", + "displayName": "Qwen3.5 27B BlueStar Derestricted", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-BlueStar-Derestricted" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-BlueStar-Derestricted", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B BlueStar Derestricted" + ], + "releaseDate": "2026-04-06", + "lastUpdated": "2026-04-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-BlueStar-Derestricted", + "modelKey": "Qwen3.5-27B-BlueStar-Derestricted", + "displayName": "Qwen3.5 27B BlueStar Derestricted", + "metadata": { + "lastUpdated": "2026-04-06", + "openWeights": false, + "releaseDate": "2026-04-06" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-bluestar-derestricted-lite", + "provider": "alibaba", + "model": "qwen3.5-27b-bluestar-derestricted-lite", + "displayName": "Qwen3.5 27B BlueStar Derestricted Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-BlueStar-Derestricted-Lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-BlueStar-Derestricted-Lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B BlueStar Derestricted Lite" + ], + "releaseDate": "2026-04-06", + "lastUpdated": "2026-04-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-BlueStar-Derestricted-Lite", + "modelKey": "Qwen3.5-27B-BlueStar-Derestricted-Lite", + "displayName": "Qwen3.5 27B BlueStar Derestricted Lite", + "metadata": { + "lastUpdated": "2026-04-06", + "openWeights": false, + "releaseDate": "2026-04-06" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-bluestar-v2-derestricted", + "provider": "alibaba", + "model": "qwen3.5-27b-bluestar-v2-derestricted", + "displayName": "Qwen3.5 27B BlueStar v2 Derestricted", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-BlueStar-v2-Derestricted" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-BlueStar-v2-Derestricted", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B BlueStar v2 Derestricted" + ], + "releaseDate": "2026-04-06", + "lastUpdated": "2026-04-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-BlueStar-v2-Derestricted", + "modelKey": "Qwen3.5-27B-BlueStar-v2-Derestricted", + "displayName": "Qwen3.5 27B BlueStar v2 Derestricted", + "metadata": { + "lastUpdated": "2026-04-06", + "openWeights": false, + "releaseDate": "2026-04-06" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-bluestar-v2-derestricted-lite", + "provider": "alibaba", + "model": "qwen3.5-27b-bluestar-v2-derestricted-lite", + "displayName": "Qwen3.5 27B BlueStar v2 Derestricted Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-BlueStar-v2-Derestricted-Lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-BlueStar-v2-Derestricted-Lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B BlueStar v2 Derestricted Lite" + ], + "releaseDate": "2026-04-06", + "lastUpdated": "2026-04-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-BlueStar-v2-Derestricted-Lite", + "modelKey": "Qwen3.5-27B-BlueStar-v2-Derestricted-Lite", + "displayName": "Qwen3.5 27B BlueStar v2 Derestricted Lite", + "metadata": { + "lastUpdated": "2026-04-06", + "openWeights": false, + "releaseDate": "2026-04-06" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-bluestar-v3-derestricted", + "provider": "alibaba", + "model": "qwen3.5-27b-bluestar-v3-derestricted", + "displayName": "Qwen3.5 27B BlueStar v3 Derestricted", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-BlueStar-v3-Derestricted" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-BlueStar-v3-Derestricted", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B BlueStar v3 Derestricted" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-BlueStar-v3-Derestricted", + "modelKey": "Qwen3.5-27B-BlueStar-v3-Derestricted", + "displayName": "Qwen3.5 27B BlueStar v3 Derestricted", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-bluestar-v3-derestricted-lite", + "provider": "alibaba", + "model": "qwen3.5-27b-bluestar-v3-derestricted-lite", + "displayName": "Qwen3.5 27B BlueStar v3 Derestricted Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-BlueStar-v3-Derestricted-Lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-BlueStar-v3-Derestricted-Lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B BlueStar v3 Derestricted Lite" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-BlueStar-v3-Derestricted-Lite", + "modelKey": "Qwen3.5-27B-BlueStar-v3-Derestricted-Lite", + "displayName": "Qwen3.5 27B BlueStar v3 Derestricted Lite", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-derestricted", + "provider": "alibaba", + "model": "qwen3.5-27b-derestricted", + "displayName": "Qwen3.5 27B Derestricted", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Derestricted" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Derestricted", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Derestricted" + ], + "releaseDate": "2026-03-17", + "lastUpdated": "2026-03-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Derestricted", + "modelKey": "Qwen3.5-27B-Derestricted", + "displayName": "Qwen3.5 27B Derestricted", + "metadata": { + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-earica-derestricted", + "provider": "alibaba", + "model": "qwen3.5-27b-earica-derestricted", + "displayName": "Qwen3.5 27B earica Derestricted", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-earica-Derestricted" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-earica-Derestricted", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B earica Derestricted" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-earica-Derestricted", + "modelKey": "Qwen3.5-27B-earica-Derestricted", + "displayName": "Qwen3.5 27B earica Derestricted", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-earica-derestricted-lite", + "provider": "alibaba", + "model": "qwen3.5-27b-earica-derestricted-lite", + "displayName": "Qwen3.5 27B earica Derestricted Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-earica-Derestricted-Lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-earica-Derestricted-Lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B earica Derestricted Lite" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-earica-Derestricted-Lite", + "modelKey": "Qwen3.5-27B-earica-Derestricted-Lite", + "displayName": "Qwen3.5 27B earica Derestricted Lite", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-infracelestial", + "provider": "alibaba", + "model": "qwen3.5-27b-infracelestial", + "displayName": "Qwen3.5 27B Infracelestial", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Infracelestial" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Infracelestial", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Infracelestial" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Infracelestial", + "modelKey": "Qwen3.5-27B-Infracelestial", + "displayName": "Qwen3.5 27B Infracelestial", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-marvin-dpo-v2-derestricted", + "provider": "alibaba", + "model": "qwen3.5-27b-marvin-dpo-v2-derestricted", + "displayName": "Qwen3.5 27B Marvin DPO V2 Derestricted", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Marvin-DPO-V2-Derestricted" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Marvin-DPO-V2-Derestricted", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Marvin DPO V2 Derestricted" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Marvin-DPO-V2-Derestricted", + "modelKey": "Qwen3.5-27B-Marvin-DPO-V2-Derestricted", + "displayName": "Qwen3.5 27B Marvin DPO V2 Derestricted", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-marvin-dpo-v2-derestricted-lite", + "provider": "alibaba", + "model": "qwen3.5-27b-marvin-dpo-v2-derestricted-lite", + "displayName": "Qwen3.5 27B Marvin DPO V2 Derestricted Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Marvin-DPO-V2-Derestricted-Lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Marvin-DPO-V2-Derestricted-Lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Marvin DPO V2 Derestricted Lite" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Marvin-DPO-V2-Derestricted-Lite", + "modelKey": "Qwen3.5-27B-Marvin-DPO-V2-Derestricted-Lite", + "displayName": "Qwen3.5 27B Marvin DPO V2 Derestricted Lite", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-marvin-v2-derestricted", + "provider": "alibaba", + "model": "qwen3.5-27b-marvin-v2-derestricted", + "displayName": "Qwen3.5 27B Marvin V2 Derestricted", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Marvin-V2-Derestricted" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Marvin-V2-Derestricted", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Marvin V2 Derestricted" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Marvin-V2-Derestricted", + "modelKey": "Qwen3.5-27B-Marvin-V2-Derestricted", + "displayName": "Qwen3.5 27B Marvin V2 Derestricted", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-marvin-v2-derestricted-lite", + "provider": "alibaba", + "model": "qwen3.5-27b-marvin-v2-derestricted-lite", + "displayName": "Qwen3.5 27B Marvin V2 Derestricted Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Marvin-V2-Derestricted-Lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Marvin-V2-Derestricted-Lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Marvin V2 Derestricted Lite" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Marvin-V2-Derestricted-Lite", + "modelKey": "Qwen3.5-27B-Marvin-V2-Derestricted-Lite", + "displayName": "Qwen3.5 27B Marvin V2 Derestricted Lite", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-musica-v1", + "provider": "alibaba", + "model": "qwen3.5-27b-musica-v1", + "displayName": "Qwen3.5 27B Musica v1", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Musica-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Musica-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Musica v1" + ], + "releaseDate": "2026-03-27", + "lastUpdated": "2026-03-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Musica-v1", + "modelKey": "Qwen3.5-27B-Musica-v1", + "displayName": "Qwen3.5 27B Musica v1", + "metadata": { + "lastUpdated": "2026-03-27", + "openWeights": false, + "releaseDate": "2026-03-27" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-nanovel-derestricted", + "provider": "alibaba", + "model": "qwen3.5-27b-nanovel-derestricted", + "displayName": "Qwen3.5 27B NaNovel Derestricted", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-NaNovel-Derestricted" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-NaNovel-Derestricted", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B NaNovel Derestricted" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-NaNovel-Derestricted", + "modelKey": "Qwen3.5-27B-NaNovel-Derestricted", + "displayName": "Qwen3.5 27B NaNovel Derestricted", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-nanovel-derestricted-lite", + "provider": "alibaba", + "model": "qwen3.5-27b-nanovel-derestricted-lite", + "displayName": "Qwen3.5 27B NaNovel Derestricted Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-NaNovel-Derestricted-Lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-NaNovel-Derestricted-Lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B NaNovel Derestricted Lite" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-NaNovel-Derestricted-Lite", + "modelKey": "Qwen3.5-27B-NaNovel-Derestricted-Lite", + "displayName": "Qwen3.5 27B NaNovel Derestricted Lite", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-omega-evolution-v2.0-derestricted", + "provider": "alibaba", + "model": "qwen3.5-27b-omega-evolution-v2.0-derestricted", + "displayName": "Qwen3.5 27B Omega Evolution v2.0 Derestricted", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Omega Evolution v2.0 Derestricted" + ], + "releaseDate": "2026-04-06", + "lastUpdated": "2026-04-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted", + "modelKey": "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted", + "displayName": "Qwen3.5 27B Omega Evolution v2.0 Derestricted", + "metadata": { + "lastUpdated": "2026-04-06", + "openWeights": false, + "releaseDate": "2026-04-06" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-omega-evolution-v2.0-derestricted-lite", + "provider": "alibaba", + "model": "qwen3.5-27b-omega-evolution-v2.0-derestricted-lite", + "displayName": "Qwen3.5 27B Omega Evolution v2.0 Derestricted Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted-Lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted-Lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Omega Evolution v2.0 Derestricted Lite" + ], + "releaseDate": "2026-04-06", + "lastUpdated": "2026-04-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted-Lite", + "modelKey": "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted-Lite", + "displayName": "Qwen3.5 27B Omega Evolution v2.0 Derestricted Lite", + "metadata": { + "lastUpdated": "2026-04-06", + "openWeights": false, + "releaseDate": "2026-04-06" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-omega-evolution-v2.2-derestricted", + "provider": "alibaba", + "model": "qwen3.5-27b-omega-evolution-v2.2-derestricted", + "displayName": "Qwen3.5 27B Omega Evolution v2.2 Derestricted", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Omega Evolution v2.2 Derestricted" + ], + "releaseDate": "2026-05-02", + "lastUpdated": "2026-05-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted", + "modelKey": "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted", + "displayName": "Qwen3.5 27B Omega Evolution v2.2 Derestricted", + "metadata": { + "lastUpdated": "2026-05-02", + "openWeights": false, + "releaseDate": "2026-05-02" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-omega-evolution-v2.2-derestricted-lite", + "provider": "alibaba", + "model": "qwen3.5-27b-omega-evolution-v2.2-derestricted-lite", + "displayName": "Qwen3.5 27B Omega Evolution v2.2 Derestricted Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted-Lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted-Lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Omega Evolution v2.2 Derestricted Lite" + ], + "releaseDate": "2026-05-02", + "lastUpdated": "2026-05-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted-Lite", + "modelKey": "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted-Lite", + "displayName": "Qwen3.5 27B Omega Evolution v2.2 Derestricted Lite", + "metadata": { + "lastUpdated": "2026-05-02", + "openWeights": false, + "releaseDate": "2026-05-02" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-queen-derestricted", + "provider": "alibaba", + "model": "qwen3.5-27b-queen-derestricted", + "displayName": "Qwen3.5 27B Queen Derestricted", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Queen-Derestricted" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Queen-Derestricted", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Queen Derestricted" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Queen-Derestricted", + "modelKey": "Qwen3.5-27B-Queen-Derestricted", + "displayName": "Qwen3.5 27B Queen Derestricted", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-queen-derestricted-lite", + "provider": "alibaba", + "model": "qwen3.5-27b-queen-derestricted-lite", + "displayName": "Qwen3.5 27B Queen Derestricted Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Queen-Derestricted-Lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Queen-Derestricted-Lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Queen Derestricted Lite" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Queen-Derestricted-Lite", + "modelKey": "Qwen3.5-27B-Queen-Derestricted-Lite", + "displayName": "Qwen3.5 27B Queen Derestricted Lite", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-rprmax-v1", + "provider": "alibaba", + "model": "qwen3.5-27b-rprmax-v1", + "displayName": "Qwen3.5 27B RpRMax v1", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-RpRMax-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-RpRMax-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B RpRMax v1" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-RpRMax-v1", + "modelKey": "Qwen3.5-27B-RpRMax-v1", + "displayName": "Qwen3.5 27B RpRMax v1", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-vivid-durian", + "provider": "alibaba", + "model": "qwen3.5-27b-vivid-durian", + "displayName": "Qwen3.5 27B Vivid Durian", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Vivid-Durian" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Vivid-Durian", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Vivid Durian" + ], + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Vivid-Durian", + "modelKey": "Qwen3.5-27B-Vivid-Durian", + "displayName": "Qwen3.5 27B Vivid Durian", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-writer-derestricted", + "provider": "alibaba", + "model": "qwen3.5-27b-writer-derestricted", + "displayName": "Qwen3.5 27B Writer Derestricted", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Writer-Derestricted" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Writer-Derestricted", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Writer Derestricted" + ], + "releaseDate": "2026-04-06", + "lastUpdated": "2026-04-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Writer-Derestricted", + "modelKey": "Qwen3.5-27B-Writer-Derestricted", + "displayName": "Qwen3.5 27B Writer Derestricted", + "metadata": { + "lastUpdated": "2026-04-06", + "openWeights": false, + "releaseDate": "2026-04-06" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-writer-derestricted-lite", + "provider": "alibaba", + "model": "qwen3.5-27b-writer-derestricted-lite", + "displayName": "Qwen3.5 27B Writer Derestricted Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Writer-Derestricted-Lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Writer-Derestricted-Lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Writer Derestricted Lite" + ], + "releaseDate": "2026-04-06", + "lastUpdated": "2026-04-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Writer-Derestricted-Lite", + "modelKey": "Qwen3.5-27B-Writer-Derestricted-Lite", + "displayName": "Qwen3.5 27B Writer Derestricted Lite", + "metadata": { + "lastUpdated": "2026-04-06", + "openWeights": false, + "releaseDate": "2026-04-06" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-writer-v2-derestricted", + "provider": "alibaba", + "model": "qwen3.5-27b-writer-v2-derestricted", + "displayName": "Qwen3.5 27B Writer V2 Derestricted", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Writer-V2-Derestricted" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Writer-V2-Derestricted", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Writer V2 Derestricted" + ], + "releaseDate": "2026-04-06", + "lastUpdated": "2026-04-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Writer-V2-Derestricted", + "modelKey": "Qwen3.5-27B-Writer-V2-Derestricted", + "displayName": "Qwen3.5 27B Writer V2 Derestricted", + "metadata": { + "lastUpdated": "2026-04-06", + "openWeights": false, + "releaseDate": "2026-04-06" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b-writer-v2-derestricted-lite", + "provider": "alibaba", + "model": "qwen3.5-27b-writer-v2-derestricted-lite", + "displayName": "Qwen3.5 27B Writer V2 Derestricted Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Qwen3.5-27B-Writer-V2-Derestricted-Lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Qwen3.5-27B-Writer-V2-Derestricted-Lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Writer V2 Derestricted Lite" + ], + "releaseDate": "2026-04-06", + "lastUpdated": "2026-04-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Qwen3.5-27B-Writer-V2-Derestricted-Lite", + "modelKey": "Qwen3.5-27B-Writer-V2-Derestricted-Lite", + "displayName": "Qwen3.5 27B Writer V2 Derestricted Lite", + "metadata": { + "lastUpdated": "2026-04-06", + "openWeights": false, + "releaseDate": "2026-04-06" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-27b:thinking", + "provider": "alibaba", + "model": "qwen3.5-27b:thinking", + "displayName": "Qwen3.5 27B Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/qwen3.5-27b:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 260096, + "inputTokens": 260096, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3.5-27b:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 2.16 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 27B Thinking" + ], + "releaseDate": "2026-02-24", + "lastUpdated": "2026-02-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3.5-27b:thinking", + "modelKey": "qwen3.5-27b:thinking", + "displayName": "Qwen3.5 27B Thinking", + "metadata": { + "lastUpdated": "2026-02-24", + "openWeights": false, + "releaseDate": "2026-02-24" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-35b-a3b", + "provider": "alibaba", + "model": "qwen3.5-35b-a3b", + "displayName": "Qwen3.5 35B-A3B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba", + "deepinfra", + "kilo", + "mixlayer", + "nano-gpt", + "novita-ai", + "openrouter", + "orcarouter", + "siliconflow-cn" + ], + "aliases": [ + "alibaba/qwen3.5-35b-a3b", + "deepinfra/Qwen/Qwen3.5-35B-A3B", + "kilo/qwen/qwen3.5-35b-a3b", + "mixlayer/qwen/qwen3.5-35b-a3b", + "nano-gpt/qwen3.5-35b-a3b", + "novita-ai/qwen/qwen3.5-35b-a3b", + "openrouter/qwen/qwen3.5-35b-a3b", + "orcarouter/qwen/qwen3.5-35b-a3b", + "siliconflow-cn/Qwen/Qwen3.5-35B-A3B" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 65536, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3.5-35b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "Qwen/Qwen3.5-35B-A3B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.14, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3.5-35b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1625, + "output": 1.3 + } + }, + { + "source": "models.dev", + "provider": "mixlayer", + "model": "qwen/qwen3.5-35b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1.3 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3.5-35b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.225, + "output": 1.8 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3.5-35b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3.5-35b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "qwen/qwen3.5-35b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.057, + "output": 0.459 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3.5-35B-A3B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.23, + "output": 1.86 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3.5-35b-a3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3.5-35b-a3b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.14, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.5 35B A3B", + "Qwen/Qwen3.5-35B-A3B", + "Qwen3.5 35B A3B", + "Qwen3.5 35B-A3B", + "Qwen3.5-35B-A3B", + "Qwen: Qwen3.5-35B-A3B" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-02-23", + "lastUpdated": "2026-02-23", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.5-35b-a3b", + "modelKey": "qwen3.5-35b-a3b", + "displayName": "Qwen3.5 35B-A3B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-23", + "openWeights": true, + "releaseDate": "2026-02-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "Qwen/Qwen3.5-35B-A3B", + "modelKey": "Qwen/Qwen3.5-35B-A3B", + "displayName": "Qwen 3.5 35B A3B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-20", + "openWeights": true, + "releaseDate": "2026-02-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3.5-35b-a3b", + "modelKey": "qwen/qwen3.5-35b-a3b", + "displayName": "Qwen: Qwen3.5-35B-A3B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2026-02-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mixlayer", + "providerName": "Mixlayer", + "providerApi": "https://models.mixlayer.ai/v1", + "providerDoc": "https://docs.mixlayer.com", + "model": "qwen/qwen3.5-35b-a3b", + "modelKey": "qwen/qwen3.5-35b-a3b", + "displayName": "Qwen3.5 35B A3B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3.5-35b-a3b", + "modelKey": "qwen3.5-35b-a3b", + "displayName": "Qwen3.5 35B A3B", + "metadata": { + "lastUpdated": "2026-02-24", + "openWeights": false, + "releaseDate": "2026-02-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3.5-35b-a3b", + "modelKey": "qwen/qwen3.5-35b-a3b", + "displayName": "Qwen3.5-35B-A3B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-26", + "openWeights": true, + "releaseDate": "2026-02-26", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3.5-35b-a3b", + "modelKey": "qwen/qwen3.5-35b-a3b", + "displayName": "Qwen3.5 35B-A3B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-23", + "openWeights": true, + "releaseDate": "2026-02-23", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "qwen/qwen3.5-35b-a3b", + "modelKey": "qwen/qwen3.5-35b-a3b", + "displayName": "Qwen3.5 35B-A3B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-23", + "openWeights": true, + "releaseDate": "2026-02-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3.5-35B-A3B", + "modelKey": "Qwen/Qwen3.5-35B-A3B", + "displayName": "Qwen/Qwen3.5-35B-A3B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-25", + "openWeights": true, + "releaseDate": "2026-02-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3.5-35b-a3b", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/qwen/qwen3.5-35b-a3b" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3.5-35b-a3b", + "displayName": "Qwen: Qwen3.5-35B-A3B", + "metadata": { + "canonicalSlug": "qwen/qwen3.5-35b-a3b-20260224", + "createdAt": "2026-02-25T21:10:22.000Z", + "huggingFaceId": "Qwen/Qwen3.5-35B-A3B", + "links": { + "details": "/api/v1/models/qwen/qwen3.5-35b-a3b-20260224/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 262144, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3.5-35b-a3b:thinking", + "provider": "alibaba", + "model": "qwen3.5-35b-a3b:thinking", + "displayName": "Qwen3.5 35B A3B Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/qwen3.5-35b-a3b:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 260096, + "inputTokens": 260096, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3.5-35b-a3b:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.225, + "output": 1.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 35B A3B Thinking" + ], + "releaseDate": "2026-02-24", + "lastUpdated": "2026-02-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3.5-35b-a3b:thinking", + "modelKey": "qwen3.5-35b-a3b:thinking", + "displayName": "Qwen3.5 35B A3B Thinking", + "metadata": { + "lastUpdated": "2026-02-24", + "openWeights": false, + "releaseDate": "2026-02-24" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-397b-a17b", + "provider": "alibaba", + "model": "qwen3.5-397b-a17b", + "displayName": "Qwen3.5 397B-A17B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "cortecs", + "crof", + "deepinfra", + "digitalocean", + "huggingface", + "kilo", + "mixlayer", + "nano-gpt", + "nebius", + "novita-ai", + "nvidia", + "openrouter", + "orcarouter", + "ovhcloud", + "qiniu-ai", + "scaleway", + "siliconflow-cn", + "synthetic", + "together_ai", + "togetherai", + "wafer.ai" + ], + "aliases": [ + "alibaba-cn/qwen3.5-397b-a17b", + "alibaba/qwen3.5-397b-a17b", + "cortecs/qwen3.5-397b-a17b", + "crof/qwen3.5-397b-a17b", + "deepinfra/Qwen/Qwen3.5-397B-A17B", + "digitalocean/qwen3.5-397b-a17b", + "huggingface/Qwen/Qwen3.5-397B-A17B", + "kilo/qwen/qwen3.5-397b-a17b", + "mixlayer/qwen/qwen3.5-397b-a17b", + "nano-gpt/TEE/qwen3.5-397b-a17b", + "nano-gpt/qwen/qwen3.5-397b-a17b", + "nebius/Qwen/Qwen3.5-397B-A17B", + "novita-ai/qwen/qwen3.5-397b-a17b", + "nvidia/qwen/qwen3.5-397b-a17b", + "openrouter/qwen/qwen3.5-397b-a17b", + "orcarouter/qwen/qwen3.5-397b-a17b", + "ovhcloud/qwen3.5-397b-a17b", + "qiniu-ai/qwen3.5-397b-a17b", + "scaleway/qwen3.5-397b-a17b", + "siliconflow-cn/Qwen/Qwen3.5-397B-A17B", + "synthetic/hf:Qwen/Qwen3.5-397B-A17B", + "together_ai/Qwen/Qwen3.5-397B-A17B", + "togetherai/Qwen/Qwen3.5-397B-A17B", + "wafer.ai/Qwen3.5-397B-A17B" + ], + "mergedProviderModelRecords": 24, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 65536, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3.5-397b-a17b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.43, + "output": 2.58, + "reasoningOutput": 2.58 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3.5-397b-a17b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3.6 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "qwen3.5-397b-a17b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3.6 + } + }, + { + "source": "models.dev", + "provider": "crof", + "model": "qwen3.5-397b-a17b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.07, + "input": 0.35, + "output": 1.75 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "Qwen/Qwen3.5-397B-A17B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.22, + "input": 0.45, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "digitalocean", + "model": "qwen3.5-397b-a17b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 3.5 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "Qwen/Qwen3.5-397B-A17B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3.6 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3.5-397b-a17b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.39, + "output": 2.34 + } + }, + { + "source": "models.dev", + "provider": "mixlayer", + "model": "qwen/qwen3.5-397b-a17b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3.6 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/qwen3.5-397b-a17b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3.6 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/qwen3.5-397b-a17b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3.6 + } + }, + { + "source": "models.dev", + "provider": "nebius", + "model": "Qwen/Qwen3.5-397B-A17B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.75, + "input": 0.6, + "output": 3.6 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3.5-397b-a17b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3.6 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "qwen/qwen3.5-397b-a17b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3.5-397b-a17b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.385, + "output": 2.45 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "qwen/qwen3.5-397b-a17b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.172, + "output": 1.032 + } + }, + { + "source": "models.dev", + "provider": "ovhcloud", + "model": "qwen3.5-397b-a17b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.71, + "output": 4.25 + } + }, + { + "source": "models.dev", + "provider": "scaleway", + "model": "qwen3.5-397b-a17b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3.6 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3.5-397B-A17B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 1.74 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:Qwen/Qwen3.5-397B-A17B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.6, + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "Qwen/Qwen3.5-397B-A17B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3.6 + } + }, + { + "source": "models.dev", + "provider": "wafer.ai", + "model": "Qwen3.5-397B-A17B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "cacheWrite": 0, + "input": 0.43, + "output": 2.6 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3.5-397b-a17b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 3.6 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen3.5-397B-A17B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 3.6 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3.5-397b-a17b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.385, + "output": 2.45 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.5 397B A17B", + "Qwen/Qwen3.5-397B-A17B", + "Qwen3.5 397B A17B", + "Qwen3.5 397B A17B TEE", + "Qwen3.5 397B-A17B", + "Qwen3.5-397B-A17B", + "Qwen3.5-97B-A17B", + "Qwen: Qwen3.5 397B A17B" + ], + "families": [ + "qwen", + "qwen3.5" + ], + "modes": [ + "chat" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-02-16", + "lastUpdated": "2026-02-16", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 24 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.5-397b-a17b", + "modelKey": "qwen3.5-397b-a17b", + "displayName": "Qwen3.5 397B-A17B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-16", + "openWeights": true, + "releaseDate": "2026-02-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.5-397b-a17b", + "modelKey": "qwen3.5-397b-a17b", + "displayName": "Qwen3.5 397B-A17B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-15", + "openWeights": true, + "releaseDate": "2026-02-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "qwen3.5-397b-a17b", + "modelKey": "qwen3.5-397b-a17b", + "displayName": "Qwen3.5 397B A17B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2026-01", + "lastUpdated": "2026-02-16", + "openWeights": true, + "releaseDate": "2026-02-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "qwen3.5-397b-a17b", + "modelKey": "qwen3.5-397b-a17b", + "displayName": "Qwen3.5 397B-A17B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-15", + "openWeights": true, + "releaseDate": "2026-02-15", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "Qwen/Qwen3.5-397B-A17B", + "modelKey": "Qwen/Qwen3.5-397B-A17B", + "displayName": "Qwen 3.5 397B A17B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-20", + "openWeights": true, + "releaseDate": "2026-02-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "qwen3.5-397b-a17b", + "modelKey": "qwen3.5-397b-a17b", + "displayName": "Qwen 3.5 397B A17B", + "family": "qwen3.5", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2026-02-15", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "Qwen/Qwen3.5-397B-A17B", + "modelKey": "Qwen/Qwen3.5-397B-A17B", + "displayName": "Qwen3.5-397B-A17B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-01", + "openWeights": true, + "releaseDate": "2026-02-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3.5-397b-a17b", + "modelKey": "qwen/qwen3.5-397b-a17b", + "displayName": "Qwen: Qwen3.5 397B A17B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-02-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mixlayer", + "providerName": "Mixlayer", + "providerApi": "https://models.mixlayer.ai/v1", + "providerDoc": "https://docs.mixlayer.com", + "model": "qwen/qwen3.5-397b-a17b", + "modelKey": "qwen/qwen3.5-397b-a17b", + "displayName": "Qwen3.5 397B A17B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/qwen3.5-397b-a17b", + "modelKey": "qwen/qwen3.5-397b-a17b", + "displayName": "Qwen3.5 397B A17B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-16", + "openWeights": true, + "releaseDate": "2026-02-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/qwen3.5-397b-a17b", + "modelKey": "TEE/qwen3.5-397b-a17b", + "displayName": "Qwen3.5 397B A17B TEE", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-28", + "openWeights": false, + "releaseDate": "2026-02-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "Qwen/Qwen3.5-397B-A17B", + "modelKey": "Qwen/Qwen3.5-397B-A17B", + "displayName": "Qwen3.5-397B-A17B", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2026-05-07", + "openWeights": true, + "releaseDate": "2025-07-15", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3.5-397b-a17b", + "modelKey": "qwen/qwen3.5-397b-a17b", + "displayName": "Qwen3.5-397B-A17B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-17", + "openWeights": true, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "qwen/qwen3.5-397b-a17b", + "modelKey": "qwen/qwen3.5-397b-a17b", + "displayName": "Qwen3.5-397B-A17B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2026-01", + "lastUpdated": "2026-02-16", + "openWeights": true, + "releaseDate": "2026-02-16", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3.5-397b-a17b", + "modelKey": "qwen/qwen3.5-397b-a17b", + "displayName": "Qwen3.5 397B-A17B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-15", + "openWeights": true, + "releaseDate": "2026-02-15", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "qwen/qwen3.5-397b-a17b", + "modelKey": "qwen/qwen3.5-397b-a17b", + "displayName": "Qwen3.5 397B-A17B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-15", + "openWeights": true, + "releaseDate": "2026-02-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ovhcloud", + "providerName": "OVHcloud AI Endpoints", + "providerApi": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", + "providerDoc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", + "model": "qwen3.5-397b-a17b", + "modelKey": "qwen3.5-397b-a17b", + "displayName": "Qwen3.5-397B-A17B", + "metadata": { + "lastUpdated": "2026-05-18", + "openWeights": true, + "releaseDate": "2026-05-18", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "qwen3.5-397b-a17b", + "modelKey": "qwen3.5-397b-a17b", + "displayName": "Qwen3.5 397B A17B", + "metadata": { + "lastUpdated": "2026-02-22", + "openWeights": false, + "releaseDate": "2026-02-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "scaleway", + "providerName": "Scaleway", + "providerApi": "https://api.scaleway.ai/v1", + "providerDoc": "https://www.scaleway.com/en/docs/generative-apis/", + "model": "qwen3.5-397b-a17b", + "modelKey": "qwen3.5-397b-a17b", + "displayName": "Qwen3.5 397B A17B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-03-17", + "openWeights": true, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3.5-397B-A17B", + "modelKey": "Qwen/Qwen3.5-397B-A17B", + "displayName": "Qwen/Qwen3.5-397B-A17B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-16", + "openWeights": true, + "releaseDate": "2026-02-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:Qwen/Qwen3.5-397B-A17B", + "modelKey": "hf:Qwen/Qwen3.5-397B-A17B", + "displayName": "Qwen3.5-97B-A17B", + "family": "qwen", + "status": "beta", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": true, + "releaseDate": "2026-02-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "Qwen/Qwen3.5-397B-A17B", + "modelKey": "Qwen/Qwen3.5-397B-A17B", + "displayName": "Qwen3.5 397B A17B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-06-15", + "openWeights": true, + "releaseDate": "2026-02-16", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wafer.ai", + "providerName": "Wafer", + "providerApi": "https://pass.wafer.ai/v1", + "providerDoc": "https://docs.wafer.ai/wafer-pass", + "model": "Qwen3.5-397B-A17B", + "modelKey": "Qwen3.5-397B-A17B", + "displayName": "Qwen3.5-397B-A17B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-06-01", + "openWeights": true, + "releaseDate": "2026-02-16", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3.5-397b-a17b", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/qwen/qwen3.5-397b-a17b" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/Qwen/Qwen3.5-397B-A17B", + "mode": "chat", + "metadata": { + "source": "https://www.together.ai/models/Qwen/Qwen3.5-397B-A17B" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3.5-397b-a17b", + "displayName": "Qwen: Qwen3.5 397B A17B", + "metadata": { + "canonicalSlug": "qwen/qwen3.5-397b-a17b-20260216", + "createdAt": "2026-02-16T06:23:38.000Z", + "huggingFaceId": "Qwen/Qwen3.5-397B-A17B", + "links": { + "details": "/api/v1/models/qwen/qwen3.5-397b-a17b-20260216/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3.5-397b-a17b-fast", + "provider": "alibaba", + "model": "qwen3.5-397b-a17b-fast", + "displayName": "Qwen3.5-397B-A17B-fast", + "sources": [ + "models.dev" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/Qwen/Qwen3.5-397B-A17B-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 7000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nebius", + "model": "Qwen/Qwen3.5-397B-A17B-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.75, + "input": 0.6, + "output": 3.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5-397B-A17B-fast" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-07", + "releaseDate": "2025-07-15", + "lastUpdated": "2026-05-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "Qwen/Qwen3.5-397B-A17B-fast", + "modelKey": "Qwen/Qwen3.5-397B-A17B-fast", + "displayName": "Qwen3.5-397B-A17B-fast", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2026-05-07", + "openWeights": true, + "releaseDate": "2025-07-15", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "alibaba/qwen3.5-397b-a17b-fp8", + "provider": "alibaba", + "model": "qwen3.5-397b-a17b-fp8", + "displayName": "Qwen3.5 397B A17B FP8", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "neuralwatt" + ], + "aliases": [ + "neuralwatt/Qwen/Qwen3.5-397B-A17B-FP8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262128, + "outputTokens": 262128, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "neuralwatt", + "model": "Qwen/Qwen3.5-397B-A17B-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.69, + "output": 4.14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 397B A17B FP8" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-02-01", + "lastUpdated": "2026-02-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neuralwatt", + "providerName": "Neuralwatt", + "providerApi": "https://api.neuralwatt.com/v1", + "providerDoc": "https://portal.neuralwatt.com/docs", + "model": "Qwen/Qwen3.5-397B-A17B-FP8", + "modelKey": "Qwen/Qwen3.5-397B-A17B-FP8", + "displayName": "Qwen3.5 397B A17B FP8", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-01", + "openWeights": true, + "releaseDate": "2026-02-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "alibaba/qwen3.5-397b-a17b-tee", + "provider": "alibaba", + "model": "qwen3.5-397b-a17b-tee", + "displayName": "Qwen3.5 397B A17B TEE", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/Qwen/Qwen3.5-397B-A17B-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "Qwen/Qwen3.5-397B-A17B-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.195, + "input": 0.39, + "output": 2.34 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 397B A17B TEE" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-02-15", + "lastUpdated": "2026-02-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "Qwen/Qwen3.5-397B-A17B-TEE", + "modelKey": "Qwen/Qwen3.5-397B-A17B-TEE", + "displayName": "Qwen3.5 397B A17B TEE", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-15", + "openWeights": true, + "releaseDate": "2026-02-15", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "alibaba/qwen3.5-397b-a17b-thinking", + "provider": "alibaba", + "model": "qwen3.5-397b-a17b-thinking", + "displayName": "Qwen3.5 397B A17B Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/qwen/qwen3.5-397b-a17b-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 258048, + "inputTokens": 258048, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/qwen3.5-397b-a17b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 397B A17B Thinking" + ], + "releaseDate": "2026-02-16", + "lastUpdated": "2026-02-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/qwen3.5-397b-a17b-thinking", + "modelKey": "qwen/qwen3.5-397b-a17b-thinking", + "displayName": "Qwen3.5 397B A17B Thinking", + "metadata": { + "lastUpdated": "2026-02-16", + "openWeights": false, + "releaseDate": "2026-02-16" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-397b-fast", + "provider": "alibaba", + "model": "qwen3.5-397b-fast", + "displayName": "Qwen3.5 397B Fast", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "neuralwatt" + ], + "aliases": [ + "neuralwatt/qwen3.5-397b-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262128, + "outputTokens": 262128, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "neuralwatt", + "model": "qwen3.5-397b-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.69, + "output": 4.14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 397B Fast" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-02-01", + "lastUpdated": "2026-02-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neuralwatt", + "providerName": "Neuralwatt", + "providerApi": "https://api.neuralwatt.com/v1", + "providerDoc": "https://portal.neuralwatt.com/docs", + "model": "qwen3.5-397b-fast", + "modelKey": "qwen3.5-397b-fast", + "displayName": "Qwen3.5 397B Fast", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-01", + "openWeights": true, + "releaseDate": "2026-02-01" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-4b", + "provider": "alibaba", + "model": "qwen3.5-4b", + "displayName": "Qwen/Qwen3.5-4B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow-cn" + ], + "aliases": [ + "siliconflow-cn/Qwen/Qwen3.5-4B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3.5-4B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3.5-4B" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-03-03", + "lastUpdated": "2026-03-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3.5-4B", + "modelKey": "Qwen/Qwen3.5-4B", + "displayName": "Qwen/Qwen3.5-4B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-03-03", + "openWeights": true, + "releaseDate": "2026-03-03" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-9b", + "provider": "alibaba", + "model": "qwen3.5-9b", + "displayName": "Qwen3.5 9B", + "family": "qwen", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "crof", + "kilo", + "mixlayer", + "nano-gpt", + "openrouter", + "ovhcloud", + "regolo-ai", + "siliconflow-cn", + "togetherai" + ], + "aliases": [ + "crof/qwen3.5-9b", + "kilo/qwen/qwen3.5-9b", + "mixlayer/qwen/qwen3.5-9b", + "nano-gpt/qwen/qwen3.5-9b", + "openrouter/qwen/qwen3.5-9b", + "ovhcloud/qwen3.5-9b", + "regolo-ai/qwen3.5-9b", + "siliconflow-cn/Qwen/Qwen3.5-9B", + "togetherai/Qwen/Qwen3.5-9B" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 262144, + "inputTokens": 256000, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "crof", + "model": "qwen3.5-9b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.008, + "input": 0.04, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3.5-9b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "mixlayer", + "model": "qwen/qwen3.5-9b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/qwen3.5-9b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3.5-9b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "ovhcloud", + "model": "qwen3.5-9b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.18 + } + }, + { + "source": "models.dev", + "provider": "regolo-ai", + "model": "qwen3.5-9b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3.5-9B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.22, + "output": 1.74 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "Qwen/Qwen3.5-9B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.17, + "output": 0.25 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3.5-9b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3.5-9B", + "Qwen3.5 9B", + "Qwen3.5-9B", + "Qwen: Qwen3.5-9B" + ], + "families": [ + "qwen", + "qwen3.5" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-03-13", + "lastUpdated": "2026-03-13", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "qwen3.5-9b", + "modelKey": "qwen3.5-9b", + "displayName": "Qwen3.5 9B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-03-13", + "openWeights": true, + "releaseDate": "2026-03-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3.5-9b", + "modelKey": "qwen/qwen3.5-9b", + "displayName": "Qwen: Qwen3.5-9B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2026-03-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mixlayer", + "providerName": "Mixlayer", + "providerApi": "https://models.mixlayer.ai/v1", + "providerDoc": "https://docs.mixlayer.com", + "model": "qwen/qwen3.5-9b", + "modelKey": "qwen/qwen3.5-9b", + "displayName": "Qwen3.5 9B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/qwen3.5-9b", + "modelKey": "qwen/qwen3.5-9b", + "displayName": "Qwen3.5 9B", + "metadata": { + "lastUpdated": "2026-03-10", + "openWeights": false, + "releaseDate": "2026-03-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3.5-9b", + "modelKey": "qwen/qwen3.5-9b", + "displayName": "Qwen3.5-9B", + "family": "qwen3.5", + "metadata": { + "lastUpdated": "2026-03-10", + "openWeights": true, + "releaseDate": "2026-03-10", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ovhcloud", + "providerName": "OVHcloud AI Endpoints", + "providerApi": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", + "providerDoc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", + "model": "qwen3.5-9b", + "modelKey": "qwen3.5-9b", + "displayName": "Qwen3.5-9B", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "regolo-ai", + "providerName": "Regolo AI", + "providerApi": "https://api.regolo.ai/v1", + "providerDoc": "https://docs.regolo.ai/", + "model": "qwen3.5-9b", + "modelKey": "qwen3.5-9b", + "displayName": "Qwen3.5-9B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-01", + "openWeights": true, + "releaseDate": "2026-02-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3.5-9B", + "modelKey": "Qwen/Qwen3.5-9B", + "displayName": "Qwen/Qwen3.5-9B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-03-03", + "openWeights": true, + "releaseDate": "2026-03-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "Qwen/Qwen3.5-9B", + "modelKey": "Qwen/Qwen3.5-9B", + "displayName": "Qwen3.5 9B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-03-03", + "openWeights": true, + "releaseDate": "2026-03-03", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3.5-9b", + "displayName": "Qwen: Qwen3.5-9B", + "metadata": { + "canonicalSlug": "qwen/qwen3.5-9b-20260310", + "createdAt": "2026-03-10T14:19:56.000Z", + "huggingFaceId": "Qwen/Qwen3.5-9B", + "links": { + "details": "/api/v1/models/qwen/qwen3.5-9b-20260310/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 262144, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3.5-flash", + "provider": "alibaba", + "model": "qwen3.5-flash", + "displayName": "Qwen3.5 Flash", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-cn", + "nano-gpt", + "vercel", + "zenmux" + ], + "aliases": [ + "alibaba-cn/qwen3.5-flash", + "nano-gpt/qwen3.5-flash", + "vercel/alibaba/qwen3.5-flash", + "zenmux/qwen/qwen3.5-flash" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 1020000, + "inputTokens": 991808, + "outputTokens": 1020000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.172, + "output": 1.72, + "reasoningOutput": 1.72 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.36 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.001, + "cacheWrite": 0.125, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "qwen/qwen3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.5 Flash", + "Qwen3.5 Flash" + ], + "families": [ + "qwen" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-02-23", + "lastUpdated": "2026-02-23", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.5-flash", + "modelKey": "qwen3.5-flash", + "displayName": "Qwen3.5 Flash", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-23", + "openWeights": false, + "releaseDate": "2026-02-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3.5-flash", + "modelKey": "qwen3.5-flash", + "displayName": "Qwen3.5 Flash", + "metadata": { + "lastUpdated": "2026-02-24", + "openWeights": false, + "releaseDate": "2026-02-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3.5-flash", + "modelKey": "alibaba/qwen3.5-flash", + "displayName": "Qwen 3.5 Flash", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-24", + "openWeights": false, + "releaseDate": "2026-02-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "qwen/qwen3.5-flash", + "modelKey": "qwen/qwen3.5-flash", + "displayName": "Qwen3.5 Flash", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-03-20", + "openWeights": false, + "releaseDate": "2026-03-20" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-flash-02-23", + "provider": "alibaba", + "model": "qwen3.5-flash-02-23", + "displayName": "Qwen3.5-Flash", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/qwen/qwen3.5-flash-02-23", + "openrouter/qwen/qwen3.5-flash-02-23" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3.5-flash-02-23", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3.5-flash-02-23", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.065, + "output": 0.26 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3.5-flash-02-23", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3.5-flash-02-23", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.065, + "output": 0.26 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5-Flash", + "Qwen: Qwen3.5-Flash" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-02-26", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3.5-flash-02-23", + "modelKey": "qwen/qwen3.5-flash-02-23", + "displayName": "Qwen: Qwen3.5-Flash", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2026-02-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3.5-flash-02-23", + "modelKey": "qwen/qwen3.5-flash-02-23", + "displayName": "Qwen3.5-Flash", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-25", + "openWeights": false, + "releaseDate": "2026-02-25", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1, + "max": 81920 + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3.5-flash-02-23", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/qwen/qwen3.5-flash-02-23" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3.5-flash-02-23", + "displayName": "Qwen: Qwen3.5-Flash", + "metadata": { + "canonicalSlug": "qwen/qwen3.5-flash-20260224", + "createdAt": "2026-02-25T21:09:36.000Z", + "links": { + "details": "/api/v1/models/qwen/qwen3.5-flash-20260224/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3.5-flash:thinking", + "provider": "alibaba", + "model": "qwen3.5-flash:thinking", + "displayName": "Qwen3.5 Flash Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/qwen3.5-flash:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 991808, + "inputTokens": 991808, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3.5-flash:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.36 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 Flash Thinking" + ], + "releaseDate": "2026-02-24", + "lastUpdated": "2026-02-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3.5-flash:thinking", + "modelKey": "qwen3.5-flash:thinking", + "displayName": "Qwen3.5 Flash Thinking", + "metadata": { + "lastUpdated": "2026-02-24", + "openWeights": false, + "releaseDate": "2026-02-24" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-omni-flash", + "provider": "alibaba", + "model": "qwen3.5-omni-flash", + "displayName": "Qwen3.5 Omni Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/qwen3.5-omni-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 49152, + "inputTokens": 49152, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3.5-omni-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 Omni Flash" + ], + "releaseDate": "2026-03-30", + "lastUpdated": "2026-03-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3.5-omni-flash", + "modelKey": "qwen3.5-omni-flash", + "displayName": "Qwen3.5 Omni Flash", + "metadata": { + "lastUpdated": "2026-03-30", + "openWeights": false, + "releaseDate": "2026-03-30" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-omni-plus", + "provider": "alibaba", + "model": "qwen3.5-omni-plus", + "displayName": "Qwen3.5 Omni Plus", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/qwen3.5-omni-plus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 983616, + "inputTokens": 983616, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3.5-omni-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 Omni Plus" + ], + "releaseDate": "2026-03-30", + "lastUpdated": "2026-03-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3.5-omni-plus", + "modelKey": "qwen3.5-omni-plus", + "displayName": "Qwen3.5 Omni Plus", + "metadata": { + "lastUpdated": "2026-03-30", + "openWeights": false, + "releaseDate": "2026-03-30" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-plus", + "provider": "alibaba", + "model": "qwen3.5-plus", + "displayName": "Qwen3.5 Plus", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "alibaba-coding-plan", + "alibaba-coding-plan-cn", + "dashscope", + "meganova", + "nano-gpt", + "opencode", + "opencode-go", + "orcarouter", + "vercel", + "zenmux" + ], + "aliases": [ + "alibaba-cn/qwen3.5-plus", + "alibaba-coding-plan-cn/qwen3.5-plus", + "alibaba-coding-plan/qwen3.5-plus", + "alibaba/qwen3.5-plus", + "dashscope/qwen3.5-plus", + "meganova/Qwen/Qwen3.5-Plus", + "nano-gpt/qwen/qwen3.5-plus", + "opencode-go/qwen3.5-plus", + "opencode/qwen3.5-plus", + "orcarouter/qwen/qwen3.5-plus", + "vercel/alibaba/qwen3.5-plus", + "zenmux/qwen/qwen3.5-plus" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 1000000, + "inputTokens": 991808, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "structuredOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3.5-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.573, + "output": 3.44, + "reasoningOutput": 3.44 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan-cn", + "model": "qwen3.5-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan", + "model": "qwen3.5-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3.5-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2.4, + "reasoningOutput": 2.4 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "Qwen/Qwen3.5-Plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2.4, + "reasoningOutput": 2.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/qwen3.5-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.4, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "opencode-go", + "model": "qwen3.5-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "cacheWrite": 0.25, + "input": 0.2, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "qwen3.5-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "cacheWrite": 0.25, + "input": 0.2, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "qwen/qwen3.5-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.115, + "output": 0.688, + "reasoningOutput": 2.4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3.5-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "cacheWrite": 0.5, + "input": 0.4, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "qwen/qwen3.5-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 4.8 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwen3.5-plus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.5 Plus", + "Qwen3.5 Plus" + ], + "families": [ + "qwen", + "qwen3.5" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-02-16", + "lastUpdated": "2026-02-16", + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.5-plus", + "modelKey": "qwen3.5-plus", + "displayName": "Qwen3.5 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-16", + "openWeights": false, + "releaseDate": "2026-02-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan-cn", + "providerName": "Alibaba Coding Plan (China)", + "providerApi": "https://coding.dashscope.aliyuncs.com/v1", + "providerDoc": "https://help.aliyun.com/zh/model-studio/coding-plan", + "model": "qwen3.5-plus", + "modelKey": "qwen3.5-plus", + "displayName": "Qwen3.5 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-16", + "openWeights": false, + "releaseDate": "2026-02-16", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan", + "providerName": "Alibaba Coding Plan", + "providerApi": "https://coding-intl.dashscope.aliyuncs.com/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/coding-plan", + "model": "qwen3.5-plus", + "modelKey": "qwen3.5-plus", + "displayName": "Qwen3.5 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-16", + "openWeights": false, + "releaseDate": "2026-02-16", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.5-plus", + "modelKey": "qwen3.5-plus", + "displayName": "Qwen3.5 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-16", + "openWeights": false, + "releaseDate": "2026-02-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "Qwen/Qwen3.5-Plus", + "modelKey": "Qwen/Qwen3.5-Plus", + "displayName": "Qwen3.5 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02", + "openWeights": false, + "releaseDate": "2026-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/qwen3.5-plus", + "modelKey": "qwen/qwen3.5-plus", + "displayName": "Qwen3.5 Plus", + "metadata": { + "lastUpdated": "2026-02-16", + "openWeights": false, + "releaseDate": "2026-02-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "qwen3.5-plus", + "modelKey": "qwen3.5-plus", + "displayName": "Qwen3.5 Plus", + "family": "qwen3.5", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-16", + "openWeights": false, + "releaseDate": "2026-02-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "qwen3.5-plus", + "modelKey": "qwen3.5-plus", + "displayName": "Qwen3.5 Plus", + "family": "qwen3.5", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-16", + "openWeights": false, + "releaseDate": "2026-02-16", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "max": 81920 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "qwen/qwen3.5-plus", + "modelKey": "qwen/qwen3.5-plus", + "displayName": "Qwen3.5 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-16", + "openWeights": false, + "releaseDate": "2026-02-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3.5-plus", + "modelKey": "alibaba/qwen3.5-plus", + "displayName": "Qwen 3.5 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-16", + "openWeights": false, + "releaseDate": "2026-02-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "qwen/qwen3.5-plus", + "modelKey": "qwen/qwen3.5-plus", + "displayName": "Qwen3.5 Plus", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-03-20", + "openWeights": false, + "releaseDate": "2026-03-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwen3.5-plus", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/qwen3.5-plus-02-15", + "provider": "alibaba", + "model": "qwen3.5-plus-02-15", + "displayName": "Qwen3.5 Plus 2026-02-15", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/qwen/qwen3.5-plus-02-15", + "openrouter/qwen/qwen3.5-plus-02-15" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3.5-plus-02-15", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.26, + "output": 1.56 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3.5-plus-02-15", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.26, + "output": 1.56 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3.5-plus-02-15", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 2.4 + }, + "extra": { + "input_cost_per_token_above_256k_tokens": 5e-7, + "output_cost_per_token_above_256k_tokens": 0.000003 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3.5-plus-02-15", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.26, + "output": 1.56 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 Plus 2026-02-15", + "Qwen: Qwen3.5 Plus 2026-02-15" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-02-15", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3.5-plus-02-15", + "modelKey": "qwen/qwen3.5-plus-02-15", + "displayName": "Qwen: Qwen3.5 Plus 2026-02-15", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-02-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3.5-plus-02-15", + "modelKey": "qwen/qwen3.5-plus-02-15", + "displayName": "Qwen3.5 Plus 2026-02-15", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-16", + "openWeights": false, + "releaseDate": "2026-02-16", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1, + "max": 81920 + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3.5-plus-02-15", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/qwen/qwen3.5-plus-02-15" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3.5-plus-02-15", + "displayName": "Qwen: Qwen3.5 Plus 2026-02-15", + "metadata": { + "canonicalSlug": "qwen/qwen3.5-plus-20260216", + "createdAt": "2026-02-16T08:10:16.000Z", + "links": { + "details": "/api/v1/models/qwen/qwen3.5-plus-20260216/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3.5-plus-20260420", + "provider": "alibaba", + "model": "qwen3.5-plus-20260420", + "displayName": "Qwen: Qwen3.5 Plus 2026-04-20", + "family": "qwen3.5", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/qwen/qwen3.5-plus-20260420", + "openrouter/qwen/qwen3.5-plus-20260420" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1000000, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3.5-plus-20260420", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3.5-plus-20260420", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.8 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3.5-plus-20260420", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 Plus 2026-04-20", + "Qwen: Qwen3.5 Plus 2026-04-20" + ], + "families": [ + "qwen3.5" + ], + "releaseDate": "2026-04-27", + "lastUpdated": "2026-05-01", + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3.5-plus-20260420", + "modelKey": "qwen/qwen3.5-plus-20260420", + "displayName": "Qwen: Qwen3.5 Plus 2026-04-20", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3.5-plus-20260420", + "modelKey": "qwen/qwen3.5-plus-20260420", + "displayName": "Qwen3.5 Plus 2026-04-20", + "family": "qwen3.5", + "metadata": { + "lastUpdated": "2026-04-27", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1, + "max": 81920 + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3.5-plus-20260420", + "displayName": "Qwen: Qwen3.5 Plus 2026-04-20", + "metadata": { + "canonicalSlug": "qwen/qwen3.5-plus-20260420", + "createdAt": "2026-04-27T03:42:48.000Z", + "links": { + "details": "/api/v1/models/qwen/qwen3.5-plus-20260420/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3.5-plus-thinking", + "provider": "alibaba", + "model": "qwen3.5-plus-thinking", + "displayName": "Qwen3.5 Plus Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/qwen/qwen3.5-plus-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 983616, + "inputTokens": 983616, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/qwen3.5-plus-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.4, + "output": 2.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 Plus Thinking" + ], + "releaseDate": "2026-02-16", + "lastUpdated": "2026-02-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/qwen3.5-plus-thinking", + "modelKey": "qwen/qwen3.5-plus-thinking", + "displayName": "Qwen3.5 Plus Thinking", + "metadata": { + "lastUpdated": "2026-02-16", + "openWeights": false, + "releaseDate": "2026-02-16" + } + } + ] + }, + { + "id": "alibaba/qwen3.5:397b", + "provider": "alibaba", + "model": "qwen3.5:397b", + "displayName": "qwen3.5:397b", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/qwen3.5:397b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "qwen3.5:397b" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-02-15", + "lastUpdated": "2026-02-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "qwen3.5:397b", + "modelKey": "qwen3.5:397b", + "displayName": "qwen3.5:397b", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-17", + "openWeights": true, + "releaseDate": "2026-02-15", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "alibaba/qwen3.6-27b", + "provider": "alibaba", + "model": "qwen3.6-27b", + "displayName": "Qwen3.6 27B", + "family": "qwen", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba", + "crof", + "kilo", + "nano-gpt", + "openrouter", + "ovhcloud", + "routing-run", + "vercel" + ], + "aliases": [ + "alibaba/qwen3.6-27b", + "crof/qwen3.6-27b", + "kilo/qwen/qwen3.6-27b", + "nano-gpt/alibaba/qwen3.6-27b", + "openrouter/qwen/qwen3.6-27b", + "ovhcloud/qwen3.6-27b", + "routing-run/route/qwen3.6-27b", + "vercel/alibaba/qwen3.6-27b" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 262144, + "inputTokens": 260096, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3.6-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3.6 + } + }, + { + "source": "models.dev", + "provider": "crof", + "model": "qwen3.6-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.2, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3.6-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.325, + "output": 3.25 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "alibaba/qwen3.6-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.203, + "output": 2.24 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3.6-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2885, + "output": 3.17 + } + }, + { + "source": "models.dev", + "provider": "ovhcloud", + "model": "qwen3.6-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.47, + "output": 3.19 + } + }, + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/qwen3.6-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.1, + "output": 3.3 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3.6-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3.6 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3.6-27b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2885, + "output": 3.17 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.6 27B", + "Qwen3.6 27B", + "Qwen3.6-27B", + "Qwen: Qwen3.6 27B" + ], + "families": [ + "qwen", + "qwen3.6" + ], + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.6-27b", + "modelKey": "qwen3.6-27b", + "displayName": "Qwen3.6 27B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "qwen3.6-27b", + "modelKey": "qwen3.6-27b", + "displayName": "Qwen3.6 27B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3.6-27b", + "modelKey": "qwen/qwen3.6-27b", + "displayName": "Qwen: Qwen3.6 27B", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "alibaba/qwen3.6-27b", + "modelKey": "alibaba/qwen3.6-27b", + "displayName": "Qwen3.6 27B", + "metadata": { + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3.6-27b", + "modelKey": "qwen/qwen3.6-27b", + "displayName": "Qwen3.6 27B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ovhcloud", + "providerName": "OVHcloud AI Endpoints", + "providerApi": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", + "providerDoc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", + "model": "qwen3.6-27b", + "modelKey": "qwen3.6-27b", + "displayName": "Qwen3.6-27B", + "metadata": { + "lastUpdated": "2026-06-01", + "openWeights": true, + "releaseDate": "2026-06-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/qwen3.6-27b", + "modelKey": "route/qwen3.6-27b", + "displayName": "Qwen3.6 27B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3.6-27b", + "modelKey": "alibaba/qwen3.6-27b", + "displayName": "Qwen 3.6 27B", + "family": "qwen3.6", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": false, + "releaseDate": "2026-04-22" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3.6-27b", + "displayName": "Qwen: Qwen3.6 27B", + "metadata": { + "canonicalSlug": "qwen/qwen3.6-27b-20260422", + "createdAt": "2026-04-27T01:57:44.000Z", + "huggingFaceId": "Qwen/Qwen3.6-27B", + "links": { + "details": "/api/v1/models/qwen/qwen3.6-27b-20260422/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 262140, + "max_completion_tokens": 262140, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3.6-27b-202k", + "provider": "alibaba", + "model": "qwen3.6-27b-202k", + "displayName": "Qwen3.6 27B 202K", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "routing-run" + ], + "aliases": [ + "routing-run/route/qwen3.6-27b-202k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 202000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/qwen3.6-27b-202k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.1, + "output": 3.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.6 27B 202K" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/qwen3.6-27b-202k", + "modelKey": "route/qwen3.6-27b-202k", + "displayName": "Qwen3.6 27B 202K", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "alibaba/qwen3.6-27b-tee", + "provider": "alibaba", + "model": "qwen3.6-27b-tee", + "displayName": "Qwen3.6 27B TEE", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/Qwen/Qwen3.6-27B-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "Qwen/Qwen3.6-27B-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0975, + "input": 0.195, + "output": 1.56 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.6 27B TEE" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "Qwen/Qwen3.6-27B-TEE", + "modelKey": "Qwen/Qwen3.6-27B-TEE", + "displayName": "Qwen3.6 27B TEE", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "alibaba/qwen3.6-27b:thinking", + "provider": "alibaba", + "model": "qwen3.6-27b:thinking", + "displayName": "Qwen3.6 27B Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/alibaba/qwen3.6-27b:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 260096, + "inputTokens": 260096, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "alibaba/qwen3.6-27b:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.203, + "output": 2.24 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.6 27B Thinking" + ], + "releaseDate": "2026-04-23", + "lastUpdated": "2026-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "alibaba/qwen3.6-27b:thinking", + "modelKey": "alibaba/qwen3.6-27b:thinking", + "displayName": "Qwen3.6 27B Thinking", + "metadata": { + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + } + ] + }, + { + "id": "alibaba/qwen3.6-35b-a3b", + "provider": "alibaba", + "model": "qwen3.6-35b-a3b", + "displayName": "Qwen3.6 35B-A3B", + "family": "qwen", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba", + "deepinfra", + "kilo", + "llmgateway", + "nano-gpt", + "neuralwatt", + "openrouter", + "orcarouter", + "scaleway", + "siliconflow-cn", + "wafer.ai" + ], + "aliases": [ + "alibaba/qwen3.6-35b-a3b", + "deepinfra/Qwen/Qwen3.6-35B-A3B", + "kilo/qwen/qwen3.6-35b-a3b", + "llmgateway/qwen3.6-35b-a3b", + "nano-gpt/qwen/Qwen3.6-35B-A3B", + "neuralwatt/Qwen/Qwen3.6-35B-A3B", + "openrouter/qwen/qwen3.6-35b-a3b", + "orcarouter/qwen/qwen3.6-35b-a3b", + "scaleway/qwen3.6-35b-a3b", + "siliconflow-cn/Qwen/Qwen3.6-35B-A3B", + "wafer.ai/Qwen3.6-35B-A3B" + ], + "mergedProviderModelRecords": 11, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3.6-35b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.248, + "output": 1.485 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "Qwen/Qwen3.6-35B-A3B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.95 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3.6-35b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1612, + "input": 0.1612, + "output": 0.96525 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3.6-35b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.248, + "output": 1.485 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/Qwen3.6-35B-A3B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.112, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "neuralwatt", + "model": "Qwen/Qwen3.6-35B-A3B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 1.15 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3.6-35b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "qwen/qwen3.6-35b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.248, + "output": 1.485 + } + }, + { + "source": "models.dev", + "provider": "scaleway", + "model": "qwen3.6-35b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/Qwen3.6-35B-A3B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.23, + "output": 1.86 + } + }, + { + "source": "models.dev", + "provider": "wafer.ai", + "model": "Qwen3.6-35B-A3B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "cacheWrite": 0, + "input": 0.15, + "output": 1 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3.6-35b-a3b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.14, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen/Qwen3.6-35B-A3B", + "Qwen3.6 35B A3B", + "Qwen3.6 35B-A3B", + "Qwen3.6-35B-A3B", + "Qwen: Qwen3.6 35B A3B" + ], + "families": [ + "qwen", + "qwen3.6" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-04-17", + "lastUpdated": "2026-04-17", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 11 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.6-35b-a3b", + "modelKey": "qwen3.6-35b-a3b", + "displayName": "Qwen3.6 35B-A3B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": true, + "releaseDate": "2026-04-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "Qwen/Qwen3.6-35B-A3B", + "modelKey": "Qwen/Qwen3.6-35B-A3B", + "displayName": "Qwen3.6 35B A3B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-01", + "openWeights": true, + "releaseDate": "2026-04-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3.6-35b-a3b", + "modelKey": "qwen/qwen3.6-35b-a3b", + "displayName": "Qwen: Qwen3.6 35B A3B", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3.6-35b-a3b", + "modelKey": "qwen3.6-35b-a3b", + "displayName": "Qwen3.6 35B-A3B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": true, + "releaseDate": "2026-04-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/Qwen3.6-35B-A3B", + "modelKey": "qwen/Qwen3.6-35B-A3B", + "displayName": "Qwen3.6 35B A3B", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": false, + "releaseDate": "2026-04-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neuralwatt", + "providerName": "Neuralwatt", + "providerApi": "https://api.neuralwatt.com/v1", + "providerDoc": "https://portal.neuralwatt.com/docs", + "model": "Qwen/Qwen3.6-35B-A3B", + "modelKey": "Qwen/Qwen3.6-35B-A3B", + "displayName": "Qwen3.6 35B A3B", + "family": "qwen3.6", + "metadata": { + "lastUpdated": "2026-04-01", + "openWeights": true, + "releaseDate": "2026-04-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3.6-35b-a3b", + "modelKey": "qwen/qwen3.6-35b-a3b", + "displayName": "Qwen3.6 35B-A3B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": true, + "releaseDate": "2026-04-17", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "qwen/qwen3.6-35b-a3b", + "modelKey": "qwen/qwen3.6-35b-a3b", + "displayName": "Qwen3.6 35B-A3B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": true, + "releaseDate": "2026-04-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "scaleway", + "providerName": "Scaleway", + "providerApi": "https://api.scaleway.ai/v1", + "providerDoc": "https://www.scaleway.com/en/docs/generative-apis/", + "model": "qwen3.6-35b-a3b", + "modelKey": "qwen3.6-35b-a3b", + "displayName": "Qwen3.6 35B A3B", + "family": "qwen", + "status": "beta", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-05-22", + "openWeights": true, + "releaseDate": "2026-05-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/Qwen3.6-35B-A3B", + "modelKey": "Qwen/Qwen3.6-35B-A3B", + "displayName": "Qwen/Qwen3.6-35B-A3B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-17", + "openWeights": true, + "releaseDate": "2026-04-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wafer.ai", + "providerName": "Wafer", + "providerApi": "https://pass.wafer.ai/v1", + "providerDoc": "https://docs.wafer.ai/wafer-pass", + "model": "Qwen3.6-35B-A3B", + "modelKey": "Qwen3.6-35B-A3B", + "displayName": "Qwen3.6-35B-A3B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-05-30", + "openWeights": true, + "releaseDate": "2026-05-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3.6-35b-a3b", + "displayName": "Qwen: Qwen3.6 35B A3B", + "metadata": { + "canonicalSlug": "qwen/qwen3.6-35b-a3b-20260415", + "createdAt": "2026-04-27T03:24:15.000Z", + "huggingFaceId": "Qwen/Qwen3.6-35B-A3B", + "links": { + "details": "/api/v1/models/qwen/qwen3.6-35b-a3b-20260415/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 262144, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3.6-35b-a3b-fp8", + "provider": "alibaba", + "model": "qwen3.6-35b-a3b-fp8", + "displayName": "Qwen 3.6 35B A3B FP8", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "nearai" + ], + "aliases": [ + "nearai/Qwen/Qwen3.6-35B-A3B-FP8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nearai", + "model": "Qwen/Qwen3.6-35B-A3B-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.056, + "input": 0.17, + "output": 1.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.6 35B A3B FP8" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-04-17", + "lastUpdated": "2026-04-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "Qwen/Qwen3.6-35B-A3B-FP8", + "modelKey": "Qwen/Qwen3.6-35B-A3B-FP8", + "displayName": "Qwen 3.6 35B A3B FP8", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": true, + "releaseDate": "2026-04-17", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "alibaba/qwen3.6-35b-a3b-uncensored", + "provider": "alibaba", + "model": "qwen3.6-35b-a3b-uncensored", + "displayName": "Qwen3.6 35B A3B Uncensored TEE", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TEE/qwen3.6-35b-a3b-uncensored" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/qwen3.6-35b-a3b-uncensored", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.6 35B A3B Uncensored TEE" + ], + "releaseDate": "2026-05-23", + "lastUpdated": "2026-05-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/qwen3.6-35b-a3b-uncensored", + "modelKey": "TEE/qwen3.6-35b-a3b-uncensored", + "displayName": "Qwen3.6 35B A3B Uncensored TEE", + "metadata": { + "lastUpdated": "2026-05-23", + "openWeights": false, + "releaseDate": "2026-05-23" + } + } + ] + }, + { + "id": "alibaba/qwen3.6-35b-a3b:thinking", + "provider": "alibaba", + "model": "qwen3.6-35b-a3b:thinking", + "displayName": "Qwen3.6 35B A3B Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/qwen/Qwen3.6-35B-A3B:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/Qwen3.6-35B-A3B:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.112, + "output": 0.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.6 35B A3B Thinking" + ], + "releaseDate": "2026-04-19", + "lastUpdated": "2026-04-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/Qwen3.6-35B-A3B:thinking", + "modelKey": "qwen/Qwen3.6-35B-A3B:thinking", + "displayName": "Qwen3.6 35B A3B Thinking", + "metadata": { + "lastUpdated": "2026-04-19", + "openWeights": false, + "releaseDate": "2026-04-19" + } + } + ] + }, + { + "id": "alibaba/qwen3.6-35b-fast", + "provider": "alibaba", + "model": "qwen3.6-35b-fast", + "displayName": "Qwen3.6 35B Fast", + "family": "qwen3.6", + "sources": [ + "models.dev" + ], + "providers": [ + "neuralwatt" + ], + "aliases": [ + "neuralwatt/qwen3.6-35b-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131056, + "outputTokens": 131056, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "neuralwatt", + "model": "qwen3.6-35b-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 1.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.6 35B Fast" + ], + "families": [ + "qwen3.6" + ], + "releaseDate": "2026-04-01", + "lastUpdated": "2026-04-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neuralwatt", + "providerName": "Neuralwatt", + "providerApi": "https://api.neuralwatt.com/v1", + "providerDoc": "https://portal.neuralwatt.com/docs", + "model": "qwen3.6-35b-fast", + "modelKey": "qwen3.6-35b-fast", + "displayName": "Qwen3.6 35B Fast", + "family": "qwen3.6", + "metadata": { + "lastUpdated": "2026-04-01", + "openWeights": true, + "releaseDate": "2026-04-01" + } + } + ] + }, + { + "id": "alibaba/qwen3.6-flash", + "provider": "alibaba", + "model": "qwen3.6-flash", + "displayName": "Qwen3.6 Flash", + "family": "qwen3.6", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "aihubmix", + "alibaba", + "alibaba-cn", + "alibaba-coding-plan", + "alibaba-coding-plan-cn", + "alibaba-token-plan", + "alibaba-token-plan-cn", + "kilo", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "aihubmix/qwen3.6-flash", + "alibaba-cn/qwen3.6-flash", + "alibaba-coding-plan-cn/qwen3.6-flash", + "alibaba-coding-plan/qwen3.6-flash", + "alibaba-token-plan-cn/qwen3.6-flash", + "alibaba-token-plan/qwen3.6-flash", + "alibaba/qwen3.6-flash", + "kilo/qwen/qwen3.6-flash", + "nano-gpt/alibaba/qwen3.6-flash", + "openrouter/qwen/qwen3.6-flash" + ], + "mergedProviderModelRecords": 10, + "limits": { + "contextTokens": 1000000, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "qwen3.6-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0169, + "cacheWrite": 0.21125, + "input": 0.17, + "output": 1.01 + }, + "tiered": { + "contextOver200K": { + "input": 0.68, + "output": 4.06, + "cache_read": 0.0676, + "cache_write": 0.845 + }, + "tiers": [ + { + "input": 0.68, + "output": 4.06, + "cache_read": 0.0676, + "cache_write": 0.845, + "tier": { + "size": 256000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3.6-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 0.234375, + "input": 0.1875, + "output": 1.125 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan-cn", + "model": "qwen3.6-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 0.234375, + "input": 0.1875, + "output": 1.125 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan", + "model": "qwen3.6-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 0.234375, + "input": 0.1875, + "output": 1.125 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "qwen3.6-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "qwen3.6-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3.6-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 0.234375, + "input": 0.1875, + "output": 1.125 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3.6-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 0.3125, + "input": 0.25, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "alibaba/qwen3.6-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.19, + "output": 1.16 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3.6-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 0.234375, + "input": 0.1875, + "output": 1.125 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3.6-flash", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheWrite": 0.234375, + "input": 0.1875, + "output": 1.125 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.6 Flash", + "Qwen: Qwen3.6 Flash" + ], + "families": [ + "qwen3.6" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 10 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "qwen3.6-flash", + "modelKey": "qwen3.6-flash", + "displayName": "Qwen3.6 Flash", + "family": "qwen3.6", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.6-flash", + "modelKey": "qwen3.6-flash", + "displayName": "Qwen3.6 Flash", + "family": "qwen3.6", + "metadata": { + "lastUpdated": "2026-04-27", + "openWeights": false, + "releaseDate": "2026-04-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan-cn", + "providerName": "Alibaba Coding Plan (China)", + "providerApi": "https://coding.dashscope.aliyuncs.com/v1", + "providerDoc": "https://help.aliyun.com/zh/model-studio/coding-plan", + "model": "qwen3.6-flash", + "modelKey": "qwen3.6-flash", + "displayName": "Qwen3.6 Flash", + "family": "qwen3.6", + "metadata": { + "lastUpdated": "2026-04-27", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan", + "providerName": "Alibaba Coding Plan", + "providerApi": "https://coding-intl.dashscope.aliyuncs.com/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/coding-plan", + "model": "qwen3.6-flash", + "modelKey": "qwen3.6-flash", + "displayName": "Qwen3.6 Flash", + "family": "qwen3.6", + "metadata": { + "lastUpdated": "2026-04-27", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "qwen3.6-flash", + "modelKey": "qwen3.6-flash", + "displayName": "Qwen3.6 Flash", + "family": "qwen3.6", + "metadata": { + "lastUpdated": "2026-04-27", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "max": 81920 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "qwen3.6-flash", + "modelKey": "qwen3.6-flash", + "displayName": "Qwen3.6 Flash", + "family": "qwen3.6", + "metadata": { + "lastUpdated": "2026-04-27", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "max": 81920 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.6-flash", + "modelKey": "qwen3.6-flash", + "displayName": "Qwen3.6 Flash", + "family": "qwen3.6", + "metadata": { + "lastUpdated": "2026-04-27", + "openWeights": false, + "releaseDate": "2026-04-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3.6-flash", + "modelKey": "qwen/qwen3.6-flash", + "displayName": "Qwen: Qwen3.6 Flash", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "alibaba/qwen3.6-flash", + "modelKey": "alibaba/qwen3.6-flash", + "displayName": "Qwen3.6 Flash", + "family": "qwen3.6", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": false, + "releaseDate": "2026-04-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3.6-flash", + "modelKey": "qwen/qwen3.6-flash", + "displayName": "Qwen3.6 Flash", + "family": "qwen3.6", + "metadata": { + "lastUpdated": "2026-04-27", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1, + "max": 81920 + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3.6-flash", + "displayName": "Qwen: Qwen3.6 Flash", + "metadata": { + "canonicalSlug": "qwen/qwen3.6-flash", + "createdAt": "2026-04-27T03:42:42.000Z", + "links": { + "details": "/api/v1/models/qwen/qwen3.6-flash/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3.6-max-preview", + "provider": "alibaba", + "model": "qwen3.6-max-preview", + "displayName": "Qwen3.6 Max Preview", + "family": "qwen", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "aihubmix", + "alibaba", + "alibaba-cn", + "kilo", + "llmgateway", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "aihubmix/qwen3.6-max-preview", + "alibaba-cn/qwen3.6-max-preview", + "alibaba/qwen3.6-max-preview", + "kilo/qwen/qwen3.6-max-preview", + "llmgateway/qwen3.6-max-preview", + "nano-gpt/qwen3.6-max-preview", + "openrouter/qwen/qwen3.6-max-preview" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "qwen3.6-max-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1268, + "cacheWrite": 1.585, + "input": 1.27, + "output": 7.61 + }, + "tiered": { + "tiers": [ + { + "input": 2.11, + "output": 12.67, + "cache_read": 0.2112, + "cache_write": 2.64, + "tier": { + "size": 128000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3.6-max-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.132, + "input": 1.32, + "output": 7.9 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3.6-max-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "cacheWrite": 1.625, + "input": 1.3, + "output": 7.8 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3.6-max-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 1.3, + "input": 1.04, + "output": 6.24 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3.6-max-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "cacheWrite": 1.625, + "input": 1.3, + "output": 7.8 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3.6-max-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.3, + "output": 7.8 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3.6-max-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 1.3, + "input": 1.04, + "output": 6.24 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3.6-max-preview", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheWrite": 1.3, + "input": 1.04, + "output": 6.24 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.6 Max Preview", + "Qwen: Qwen3.6 Max Preview" + ], + "families": [ + "qwen", + "qwen3.6" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-05-09", + "lastUpdated": "2026-05-09", + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "qwen3.6-max-preview", + "modelKey": "qwen3.6-max-preview", + "displayName": "Qwen3.6 Max Preview", + "family": "qwen3.6", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-05-09", + "openWeights": false, + "releaseDate": "2026-05-09", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.6-max-preview", + "modelKey": "qwen3.6-max-preview", + "displayName": "Qwen3.6 Max Preview", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": false, + "releaseDate": "2026-04-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.6-max-preview", + "modelKey": "qwen3.6-max-preview", + "displayName": "Qwen3.6 Max Preview", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-20", + "openWeights": false, + "releaseDate": "2026-04-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3.6-max-preview", + "modelKey": "qwen/qwen3.6-max-preview", + "displayName": "Qwen: Qwen3.6 Max Preview", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3.6-max-preview", + "modelKey": "qwen3.6-max-preview", + "displayName": "Qwen3.6 Max Preview", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-20", + "openWeights": false, + "releaseDate": "2026-04-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3.6-max-preview", + "modelKey": "qwen3.6-max-preview", + "displayName": "Qwen3.6 Max Preview", + "family": "qwen3.6", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": false, + "releaseDate": "2026-04-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3.6-max-preview", + "modelKey": "qwen/qwen3.6-max-preview", + "displayName": "Qwen3.6 Max Preview", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-20", + "openWeights": false, + "releaseDate": "2026-04-20", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1, + "max": 131072 + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3.6-max-preview", + "displayName": "Qwen: Qwen3.6 Max Preview", + "metadata": { + "canonicalSlug": "qwen/qwen3.6-max-preview-20260420", + "createdAt": "2026-04-27T03:24:02.000Z", + "links": { + "details": "/api/v1/models/qwen/qwen3.6-max-preview-20260420/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3.6-plus", + "provider": "alibaba", + "model": "qwen3.6-plus", + "displayName": "Qwen3.6 Plus", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "aihubmix", + "alibaba", + "alibaba-cn", + "alibaba-coding-plan", + "alibaba-coding-plan-cn", + "alibaba-token-plan", + "alibaba-token-plan-cn", + "kilo", + "llmgateway", + "opencode", + "opencode-go", + "openrouter", + "orcarouter", + "togetherai", + "vercel", + "zenmux" + ], + "aliases": [ + "aihubmix/qwen3.6-plus", + "alibaba-cn/qwen3.6-plus", + "alibaba-coding-plan-cn/qwen3.6-plus", + "alibaba-coding-plan/qwen3.6-plus", + "alibaba-token-plan-cn/qwen3.6-plus", + "alibaba-token-plan/qwen3.6-plus", + "alibaba/qwen3.6-plus", + "kilo/qwen/qwen3.6-plus", + "llmgateway/qwen3.6-plus", + "opencode-go/qwen3.6-plus", + "opencode/qwen3.6-plus", + "openrouter/qwen/qwen3.6-plus", + "orcarouter/qwen/qwen3.6-plus", + "togetherai/Qwen/Qwen3.6-Plus", + "vercel/alibaba/qwen3.6-plus", + "zenmux/qwen/qwen3.6-plus" + ], + "mergedProviderModelRecords": 16, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 65536, + "outputTokens": 500000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "structuredOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "qwen3.6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0282, + "cacheWrite": 0.3525, + "input": 0.28, + "output": 1.69 + }, + "tiered": { + "contextOver200K": { + "input": 1.13, + "output": 6.77, + "cache_read": 0.1128, + "cache_write": 1.41 + }, + "tiers": [ + { + "input": 1.13, + "output": 6.77, + "cache_read": 0.1128, + "cache_write": 1.41, + "tier": { + "size": 256000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3.6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.625, + "input": 0.5, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.2, + "cache_write": 2.5 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.2, + "cache_write": 2.5, + "tier": { + "size": 256000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan-cn", + "model": "qwen3.6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan", + "model": "qwen3.6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "qwen3.6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "qwen3.6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3.6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.625, + "input": 0.5, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.2, + "cache_write": 2.5 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.2, + "cache_write": 2.5, + "tier": { + "size": 256000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3.6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0325, + "cacheWrite": 0.40625, + "input": 0.325, + "output": 1.95 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3.6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.625, + "input": 0.5, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.2, + "cache_write": 2.5 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.2, + "cache_write": 2.5, + "tier": { + "size": 256000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "opencode-go", + "model": "qwen3.6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.625, + "input": 0.5, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.2, + "cache_write": 2.5 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.2, + "cache_write": 2.5, + "tier": { + "size": 256000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "qwen3.6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.625, + "input": 0.5, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3.6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 0.40625, + "input": 0.325, + "output": 1.95 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "qwen/qwen3.6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.625, + "input": 0.5, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.2, + "cache_write": 2.5 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.2, + "cache_write": 2.5, + "tier": { + "size": 256000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "Qwen/Qwen3.6-Plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3.6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 0.625, + "input": 0.5, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "qwen/qwen3.6-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.625, + "input": 0.5, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.2, + "cache_write": 2.5 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.2, + "cache_write": 2.5, + "tier": { + "size": 256000 + } + } + ] + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3.6-plus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.325, + "output": 1.95 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3.6-plus", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheWrite": 0.40625, + "input": 0.325, + "output": 1.95 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.6 Plus", + "Qwen3.6 Plus", + "Qwen3.6-Plus", + "Qwen: Qwen3.6 Plus" + ], + "families": [ + "qwen", + "qwen3.6" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-05-09", + "lastUpdated": "2026-05-09", + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 16 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "qwen3.6-plus", + "modelKey": "qwen3.6-plus", + "displayName": "Qwen3.6 Plus", + "family": "qwen3.6", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-05-09", + "openWeights": false, + "releaseDate": "2026-05-09", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.6-plus", + "modelKey": "qwen3.6-plus", + "displayName": "Qwen3.6 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan-cn", + "providerName": "Alibaba Coding Plan (China)", + "providerApi": "https://coding.dashscope.aliyuncs.com/v1", + "providerDoc": "https://help.aliyun.com/zh/model-studio/coding-plan", + "model": "qwen3.6-plus", + "modelKey": "qwen3.6-plus", + "displayName": "Qwen3.6 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan", + "providerName": "Alibaba Coding Plan", + "providerApi": "https://coding-intl.dashscope.aliyuncs.com/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/coding-plan", + "model": "qwen3.6-plus", + "modelKey": "qwen3.6-plus", + "displayName": "Qwen3.6 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "qwen3.6-plus", + "modelKey": "qwen3.6-plus", + "displayName": "Qwen3.6 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "max": 81920 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "qwen3.6-plus", + "modelKey": "qwen3.6-plus", + "displayName": "Qwen3.6 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "max": 81920 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.6-plus", + "modelKey": "qwen3.6-plus", + "displayName": "Qwen3.6 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3.6-plus", + "modelKey": "qwen/qwen3.6-plus", + "displayName": "Qwen: Qwen3.6 Plus", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": false, + "releaseDate": "2025-08-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3.6-plus", + "modelKey": "qwen3.6-plus", + "displayName": "Qwen3.6 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "qwen3.6-plus", + "modelKey": "qwen3.6-plus", + "displayName": "Qwen3.6 Plus", + "family": "qwen3.6", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "qwen3.6-plus", + "modelKey": "qwen3.6-plus", + "displayName": "Qwen3.6 Plus", + "family": "qwen3.6", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "max": 81920 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3.6-plus", + "modelKey": "qwen/qwen3.6-plus", + "displayName": "Qwen3.6 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1, + "max": 81920 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "qwen/qwen3.6-plus", + "modelKey": "qwen/qwen3.6-plus", + "displayName": "Qwen3.6 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "Qwen/Qwen3.6-Plus", + "modelKey": "Qwen/Qwen3.6-Plus", + "displayName": "Qwen3.6 Plus", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2026-04-30", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3.6-plus", + "modelKey": "alibaba/qwen3.6-plus", + "displayName": "Qwen 3.6 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "qwen/qwen3.6-plus", + "modelKey": "qwen/qwen3.6-plus", + "displayName": "Qwen3.6-Plus", + "metadata": { + "lastUpdated": "2026-03-30", + "openWeights": false, + "releaseDate": "2026-03-30", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/qwen/qwen3.6-plus", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/qwen/qwen3.6-plus" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3.6-plus", + "displayName": "Qwen: Qwen3.6 Plus", + "metadata": { + "canonicalSlug": "qwen/qwen3.6-plus-04-02", + "createdAt": "2026-04-02T12:39:17.000Z", + "links": { + "details": "/api/v1/models/qwen/qwen3.6-plus-04-02/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3.6-plus-free", + "provider": "alibaba", + "model": "qwen3.6-plus-free", + "displayName": "Qwen3.6 Plus Free", + "family": "qwen-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/qwen3.6-plus-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "qwen3.6-plus-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.6 Plus Free" + ], + "families": [ + "qwen-free" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "qwen3.6-plus-free", + "modelKey": "qwen3.6-plus-free", + "displayName": "Qwen3.6 Plus Free", + "family": "qwen-free", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "max": 81920 + } + ] + } + } + ] + }, + { + "id": "alibaba/qwen3.7-max", + "provider": "alibaba", + "model": "qwen3.7-max", + "displayName": "Qwen3.7 Max", + "family": "qwen", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "alibaba-coding-plan", + "alibaba-coding-plan-cn", + "alibaba-token-plan", + "alibaba-token-plan-cn", + "kilo", + "llmgateway", + "nano-gpt", + "novita-ai", + "opencode-go", + "openrouter", + "togetherai", + "vercel", + "wafer.ai", + "zenmux" + ], + "aliases": [ + "alibaba-cn/qwen3.7-max", + "alibaba-coding-plan-cn/qwen3.7-max", + "alibaba-coding-plan/qwen3.7-max", + "alibaba-token-plan-cn/qwen3.7-max", + "alibaba-token-plan/qwen3.7-max", + "alibaba/qwen3.7-max", + "kilo/qwen/qwen3.7-max", + "llmgateway/qwen3.7-max", + "nano-gpt/qwen3.7-max", + "novita-ai/qwen/qwen3.7-max", + "opencode-go/qwen3.7-max", + "openrouter/qwen/qwen3.7-max", + "togetherai/Qwen/Qwen3.7-Max", + "vercel/alibaba/qwen3.7-max", + "wafer.ai/qwen3.7-max", + "zenmux/qwen/qwen3.7-max" + ], + "mergedProviderModelRecords": 16, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 500000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3.7-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 3.125, + "input": 2.5, + "output": 7.5 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan-cn", + "model": "qwen3.7-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 3.125, + "input": 2.5, + "output": 7.5 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan", + "model": "qwen3.7-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 3.125, + "input": 2.5, + "output": 7.5 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "qwen3.7-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "qwen3.7-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3.7-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 3.125, + "input": 2.5, + "output": 7.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "qwen/qwen3.7-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1625, + "cacheWrite": 2.03125, + "input": 1.625, + "output": 4.875 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3.7-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 3.125, + "input": 2.5, + "output": 7.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3.7-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 7.5 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "qwen/qwen3.7-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "cacheWrite": 1.5625, + "input": 1.25, + "output": 3.75 + } + }, + { + "source": "models.dev", + "provider": "opencode-go", + "model": "qwen3.7-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 3.125, + "input": 2.5, + "output": 7.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3.7-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "cacheWrite": 1.5625, + "input": 1.25, + "output": 3.75 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "Qwen/Qwen3.7-Max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 3.75 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3.7-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "cacheWrite": 1.5625, + "input": 1.25, + "output": 3.75 + } + }, + { + "source": "models.dev", + "provider": "wafer.ai", + "model": "qwen3.7-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 0, + "input": 5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "qwen/qwen3.7-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 3.125, + "input": 2.5, + "output": 7.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3.7-max", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.25, + "cacheWrite": 1.5625, + "input": 1.25, + "output": 3.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.7 Max", + "Qwen3.7 Max", + "Qwen3.7-Max", + "Qwen: Qwen3.7 Max" + ], + "families": [ + "qwen", + "qwen3.7-max" + ], + "releaseDate": "2026-05-21", + "lastUpdated": "2026-05-21", + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 16 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.7-max", + "modelKey": "qwen3.7-max", + "displayName": "Qwen3.7 Max", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-05-21", + "openWeights": false, + "releaseDate": "2026-05-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan-cn", + "providerName": "Alibaba Coding Plan (China)", + "providerApi": "https://coding.dashscope.aliyuncs.com/v1", + "providerDoc": "https://help.aliyun.com/zh/model-studio/coding-plan", + "model": "qwen3.7-max", + "modelKey": "qwen3.7-max", + "displayName": "Qwen3.7 Max", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-05-21", + "openWeights": false, + "releaseDate": "2026-05-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan", + "providerName": "Alibaba Coding Plan", + "providerApi": "https://coding-intl.dashscope.aliyuncs.com/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/coding-plan", + "model": "qwen3.7-max", + "modelKey": "qwen3.7-max", + "displayName": "Qwen3.7 Max", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-05-21", + "openWeights": false, + "releaseDate": "2026-05-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "qwen3.7-max", + "modelKey": "qwen3.7-max", + "displayName": "Qwen3.7 Max", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-05-21", + "openWeights": false, + "releaseDate": "2026-05-21", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "max": 262144 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "qwen3.7-max", + "modelKey": "qwen3.7-max", + "displayName": "Qwen3.7 Max", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-05-21", + "openWeights": false, + "releaseDate": "2026-05-21", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "max": 262144 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.7-max", + "modelKey": "qwen3.7-max", + "displayName": "Qwen3.7 Max", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-05-21", + "openWeights": false, + "releaseDate": "2026-05-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "qwen/qwen3.7-max", + "modelKey": "qwen/qwen3.7-max", + "displayName": "Qwen: Qwen3.7 Max", + "metadata": { + "lastUpdated": "2026-05-27", + "openWeights": false, + "releaseDate": "2025-08-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3.7-max", + "modelKey": "qwen3.7-max", + "displayName": "Qwen3.7 Max", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-05-21", + "openWeights": false, + "releaseDate": "2026-05-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3.7-max", + "modelKey": "qwen3.7-max", + "displayName": "Qwen3.7 Max", + "metadata": { + "lastUpdated": "2026-05-21", + "openWeights": false, + "releaseDate": "2026-05-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "qwen/qwen3.7-max", + "modelKey": "qwen/qwen3.7-max", + "displayName": "Qwen3.7-Max", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-05-27", + "openWeights": false, + "releaseDate": "2026-05-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "qwen3.7-max", + "modelKey": "qwen3.7-max", + "displayName": "Qwen3.7 Max", + "family": "qwen3.7-max", + "metadata": { + "lastUpdated": "2026-05-21", + "openWeights": false, + "releaseDate": "2026-05-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3.7-max", + "modelKey": "qwen/qwen3.7-max", + "displayName": "Qwen3.7 Max", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-05-21", + "openWeights": false, + "releaseDate": "2026-05-21", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1, + "max": 262144 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "Qwen/Qwen3.7-Max", + "modelKey": "Qwen/Qwen3.7-Max", + "displayName": "Qwen3.7 Max", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-06-15", + "openWeights": false, + "releaseDate": "2026-05-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3.7-max", + "modelKey": "alibaba/qwen3.7-max", + "displayName": "Qwen 3.7 Max", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-05-21", + "openWeights": false, + "releaseDate": "2026-05-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wafer.ai", + "providerName": "Wafer", + "providerApi": "https://pass.wafer.ai/v1", + "providerDoc": "https://docs.wafer.ai/wafer-pass", + "model": "qwen3.7-max", + "modelKey": "qwen3.7-max", + "displayName": "Qwen3.7-Max", + "family": "qwen3.7-max", + "metadata": { + "lastUpdated": "2026-05-30", + "openWeights": false, + "releaseDate": "2026-05-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "qwen/qwen3.7-max", + "modelKey": "qwen/qwen3.7-max", + "displayName": "Qwen3.7 Max", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-05-21", + "openWeights": false, + "releaseDate": "2026-05-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3.7-max", + "displayName": "Qwen: Qwen3.7 Max", + "metadata": { + "canonicalSlug": "qwen/qwen3.7-max-20260520", + "createdAt": "2026-05-21T15:21:01.000Z", + "links": { + "details": "/api/v1/models/qwen/qwen3.7-max-20260520/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3.7-max:thinking", + "provider": "alibaba", + "model": "qwen3.7-max:thinking", + "displayName": "Qwen3.7 Max Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/qwen3.7-max:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3.7-max:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 7.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.7 Max Thinking" + ], + "releaseDate": "2026-05-21", + "lastUpdated": "2026-05-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3.7-max:thinking", + "modelKey": "qwen3.7-max:thinking", + "displayName": "Qwen3.7 Max Thinking", + "metadata": { + "lastUpdated": "2026-05-21", + "openWeights": false, + "releaseDate": "2026-05-21" + } + } + ] + }, + { + "id": "alibaba/qwen3.7-plus", + "provider": "alibaba", + "model": "qwen3.7-plus", + "displayName": "Qwen3.7 Plus", + "family": "qwen", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "alibaba-coding-plan", + "alibaba-coding-plan-cn", + "alibaba-token-plan", + "alibaba-token-plan-cn", + "llmgateway", + "nano-gpt", + "opencode-go", + "openrouter", + "vercel", + "zenmux" + ], + "aliases": [ + "alibaba-cn/qwen3.7-plus", + "alibaba-coding-plan-cn/qwen3.7-plus", + "alibaba-coding-plan/qwen3.7-plus", + "alibaba-token-plan-cn/qwen3.7-plus", + "alibaba-token-plan/qwen3.7-plus", + "alibaba/qwen3.7-plus", + "llmgateway/qwen3.7-plus", + "nano-gpt/qwen3.7-plus", + "opencode-go/qwen3.7-plus", + "openrouter/qwen/qwen3.7-plus", + "vercel/alibaba/qwen3.7-plus", + "zenmux/qwen/qwen3.7-plus" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 1000000, + "inputTokens": 991808, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwen3.7-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.625, + "input": 0.5, + "output": 3 + }, + "tiered": { + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.2, + "cache_write": 2.5, + "tier": { + "size": 128000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan-cn", + "model": "qwen3.7-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan", + "model": "qwen3.7-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "qwen3.7-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "qwen3.7-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwen3.7-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.625, + "input": 0.5, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.2, + "cache_write": 2.5 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.2, + "cache_write": 2.5, + "tier": { + "size": 256000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen3.7-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 0.5, + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3.7-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "models.dev", + "provider": "opencode-go", + "model": "qwen3.7-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "cacheWrite": 0.5, + "input": 0.4, + "output": 1.6 + }, + "tiered": { + "contextOver200K": { + "input": 1.2, + "output": 4.8, + "cache_read": 0.12, + "cache_write": 1.5 + }, + "tiers": [ + { + "input": 1.2, + "output": 4.8, + "cache_read": 0.12, + "cache_write": 1.5, + "tier": { + "size": 256000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "qwen/qwen3.7-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.064, + "cacheWrite": 0.4, + "input": 0.32, + "output": 1.28 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "alibaba/qwen3.7-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 0.5, + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "qwen/qwen3.7-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 0.5, + "input": 0.4, + "output": 1.6 + }, + "tiered": { + "contextOver200K": { + "input": 1.2, + "output": 4.8, + "cache_read": 0.24, + "cache_write": 1.5 + }, + "tiers": [ + { + "input": 1.2, + "output": 4.8, + "cache_read": 0.24, + "cache_write": 1.5, + "tier": { + "size": 256000 + } + } + ] + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "qwen/qwen3.7-plus", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.064, + "cacheWrite": 0.4, + "input": 0.32, + "output": 1.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.7 Plus", + "Qwen3.7 Plus", + "Qwen: Qwen3.7 Plus" + ], + "families": [ + "qwen", + "qwen3.7-plus" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-06-02", + "lastUpdated": "2026-06-02", + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.7-plus", + "modelKey": "qwen3.7-plus", + "displayName": "Qwen3.7 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-06-02", + "openWeights": false, + "releaseDate": "2026-06-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan-cn", + "providerName": "Alibaba Coding Plan (China)", + "providerApi": "https://coding.dashscope.aliyuncs.com/v1", + "providerDoc": "https://help.aliyun.com/zh/model-studio/coding-plan", + "model": "qwen3.7-plus", + "modelKey": "qwen3.7-plus", + "displayName": "Qwen3.7 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-06-02", + "openWeights": false, + "releaseDate": "2026-06-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan", + "providerName": "Alibaba Coding Plan", + "providerApi": "https://coding-intl.dashscope.aliyuncs.com/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/coding-plan", + "model": "qwen3.7-plus", + "modelKey": "qwen3.7-plus", + "displayName": "Qwen3.7 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-06-02", + "openWeights": false, + "releaseDate": "2026-06-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "qwen3.7-plus", + "modelKey": "qwen3.7-plus", + "displayName": "Qwen3.7 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-06-02", + "openWeights": false, + "releaseDate": "2026-06-02", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "max": 262144 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "qwen3.7-plus", + "modelKey": "qwen3.7-plus", + "displayName": "Qwen3.7 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-06-02", + "openWeights": false, + "releaseDate": "2026-06-02", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "max": 262144 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwen3.7-plus", + "modelKey": "qwen3.7-plus", + "displayName": "Qwen3.7 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-06-04", + "openWeights": false, + "releaseDate": "2026-06-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen3.7-plus", + "modelKey": "qwen3.7-plus", + "displayName": "Qwen3.7 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-06-02", + "openWeights": false, + "releaseDate": "2026-06-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3.7-plus", + "modelKey": "qwen3.7-plus", + "displayName": "Qwen3.7 Plus", + "metadata": { + "lastUpdated": "2026-06-01", + "openWeights": false, + "releaseDate": "2026-06-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "qwen3.7-plus", + "modelKey": "qwen3.7-plus", + "displayName": "Qwen3.7 Plus", + "family": "qwen3.7-plus", + "metadata": { + "lastUpdated": "2026-06-02", + "openWeights": false, + "releaseDate": "2026-06-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "qwen/qwen3.7-plus", + "modelKey": "qwen/qwen3.7-plus", + "displayName": "Qwen3.7 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-06-02", + "openWeights": false, + "releaseDate": "2026-06-02", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1, + "max": 262144 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/qwen3.7-plus", + "modelKey": "alibaba/qwen3.7-plus", + "displayName": "Qwen 3.7 Plus", + "family": "qwen3.7-plus", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-06-02", + "openWeights": false, + "releaseDate": "2026-06-01", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1, + "max": 262144 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "qwen/qwen3.7-plus", + "modelKey": "qwen/qwen3.7-plus", + "displayName": "Qwen3.7 Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-06-02", + "openWeights": false, + "releaseDate": "2026-06-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "qwen/qwen3.7-plus", + "displayName": "Qwen: Qwen3.7 Plus", + "metadata": { + "canonicalSlug": "qwen/qwen3.7-plus-20260602", + "createdAt": "2026-06-03T13:03:03.000Z", + "links": { + "details": "/api/v1/models/qwen/qwen3.7-plus-20260602/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "alibaba/qwen3.7-plus:thinking", + "provider": "alibaba", + "model": "qwen3.7-plus:thinking", + "displayName": "Qwen3.7 Plus Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/qwen3.7-plus:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 983616, + "inputTokens": 983616, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen3.7-plus:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.4, + "output": 1.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.7 Plus Thinking" + ], + "releaseDate": "2026-06-01", + "lastUpdated": "2026-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen3.7-plus:thinking", + "modelKey": "qwen3.7-plus:thinking", + "displayName": "Qwen3.7 Plus Thinking", + "metadata": { + "lastUpdated": "2026-06-01", + "openWeights": false, + "releaseDate": "2026-06-01" + } + } + ] + }, + { + "id": "alibaba/qwen35-397b-a17b", + "provider": "alibaba", + "model": "qwen35-397b-a17b", + "displayName": "Qwen3.5 397B-A17B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/qwen35-397b-a17b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwen35-397b-a17b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.5 397B-A17B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-02-15", + "lastUpdated": "2026-02-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwen35-397b-a17b", + "modelKey": "qwen35-397b-a17b", + "displayName": "Qwen3.5 397B-A17B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-02-15", + "openWeights": true, + "releaseDate": "2026-02-15" + } + } + ] + }, + { + "id": "alibaba/qwen3guard-gen-0.6b", + "provider": "alibaba", + "model": "qwen3guard-gen-0.6b", + "displayName": "Qwen3Guard Gen 0.6B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes", + "ovhcloud" + ], + "aliases": [ + "chutes/Qwen/Qwen3Guard-Gen-0.6B", + "ovhcloud/qwen3guard-gen-0.6b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 32768, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "Qwen/Qwen3Guard-Gen-0.6B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.01, + "output": 0.0109 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3Guard Gen 0.6B", + "Qwen3Guard-Gen-0.6B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-12-29", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "Qwen/Qwen3Guard-Gen-0.6B", + "modelKey": "Qwen/Qwen3Guard-Gen-0.6B", + "displayName": "Qwen3Guard Gen 0.6B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ovhcloud", + "providerName": "OVHcloud AI Endpoints", + "providerApi": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", + "providerDoc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", + "model": "qwen3guard-gen-0.6b", + "modelKey": "qwen3guard-gen-0.6b", + "displayName": "Qwen3Guard-Gen-0.6B", + "metadata": { + "lastUpdated": "2026-01-22", + "openWeights": true, + "releaseDate": "2026-01-22" + } + } + ] + }, + { + "id": "alibaba/qwen3guard-gen-8b", + "provider": "alibaba", + "model": "qwen3guard-gen-8b", + "displayName": "Qwen3Guard-Gen-8B", + "sources": [ + "models.dev" + ], + "providers": [ + "ovhcloud" + ], + "aliases": [ + "ovhcloud/qwen3guard-gen-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Qwen3Guard-Gen-8B" + ], + "releaseDate": "2026-01-22", + "lastUpdated": "2026-01-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ovhcloud", + "providerName": "OVHcloud AI Endpoints", + "providerApi": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", + "providerDoc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", + "model": "qwen3guard-gen-8b", + "modelKey": "qwen3guard-gen-8b", + "displayName": "Qwen3Guard-Gen-8B", + "metadata": { + "lastUpdated": "2026-01-22", + "openWeights": true, + "releaseDate": "2026-01-22" + } + } + ] + }, + { + "id": "alibaba/qwen3p7-plus", + "provider": "alibaba", + "model": "qwen3p7-plus", + "displayName": "Qwen 3.7 Plus", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "fireworks-ai" + ], + "aliases": [ + "fireworks-ai/accounts/fireworks/models/qwen3p7-plus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fireworks-ai", + "model": "accounts/fireworks/models/qwen3p7-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.4, + "output": 1.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen 3.7 Plus" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-06-12", + "lastUpdated": "2026-06-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fireworks-ai", + "providerName": "Fireworks AI", + "providerApi": "https://api.fireworks.ai/inference/v1/", + "providerDoc": "https://fireworks.ai/docs/", + "model": "accounts/fireworks/models/qwen3p7-plus", + "modelKey": "accounts/fireworks/models/qwen3p7-plus", + "displayName": "Qwen 3.7 Plus", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-06-12", + "openWeights": false, + "releaseDate": "2026-06-12", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 1 + } + ] + } + } + ] + }, + { + "id": "alibaba/qwenlong-l1-32b", + "provider": "alibaba", + "model": "qwenlong-l1-32b", + "displayName": "QwenLong L1 32B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Tongyi-Zhiwen/QwenLong-L1-32B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 40960, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Tongyi-Zhiwen/QwenLong-L1-32B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13999999999999999, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "QwenLong L1 32B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-01-25", + "lastUpdated": "2025-01-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Tongyi-Zhiwen/QwenLong-L1-32B", + "modelKey": "Tongyi-Zhiwen/QwenLong-L1-32B", + "displayName": "QwenLong L1 32B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-01-25", + "openWeights": false, + "releaseDate": "2025-01-25" + } + } + ] + }, + { + "id": "alibaba/qwq-32b", + "provider": "alibaba", + "model": "qwq-32b", + "displayName": "QwQ 32B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "abacus", + "alibaba-cn", + "cloudflare-ai-gateway", + "cloudflare-workers-ai", + "deepinfra", + "fireworks_ai", + "hyperbolic", + "nano-gpt", + "nebius", + "nscale", + "sambanova", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "abacus/Qwen/QwQ-32B", + "alibaba-cn/qwq-32b", + "cloudflare-ai-gateway/workers-ai/@cf/qwen/qwq-32b", + "cloudflare-workers-ai/@cf/qwen/qwq-32b", + "deepinfra/Qwen/QwQ-32B", + "fireworks_ai/accounts/fireworks/models/qwq-32b", + "hyperbolic/Qwen/QwQ-32B", + "nano-gpt/qwq-32b", + "nebius/Qwen/QwQ-32B", + "nscale/Qwen/QwQ-32B", + "sambanova/QwQ-32B", + "siliconflow-cn/Qwen/QwQ-32B", + "siliconflow/Qwen/QwQ-32B" + ], + "mergedProviderModelRecords": 13, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "Qwen/QwQ-32B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwq-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.287, + "output": 0.861 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/qwen/qwq-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.66, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/qwen/qwq-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.66, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwq-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25599999, + "output": 0.30499999 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Qwen/QwQ-32B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.58 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "Qwen/QwQ-32B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.58 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Qwen/QwQ-32B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwq-32b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "hyperbolic", + "model": "hyperbolic/Qwen/QwQ-32B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/Qwen/QwQ-32B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.45 + } + }, + { + "source": "litellm", + "provider": "nscale", + "model": "nscale/Qwen/QwQ-32B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.18, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "sambanova", + "model": "sambanova/QwQ-32B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "QwQ 32B", + "Qwen/QwQ-32B", + "Qwen: QwQ 32B", + "Qwq 32B" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-11-28", + "lastUpdated": "2024-11-28", + "providerModelRecordCount": 13 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "Qwen/QwQ-32B", + "modelKey": "Qwen/QwQ-32B", + "displayName": "QwQ 32B", + "family": "qwen", + "metadata": { + "lastUpdated": "2024-11-28", + "openWeights": true, + "releaseDate": "2024-11-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwq-32b", + "modelKey": "qwq-32b", + "displayName": "QwQ 32B", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-12", + "openWeights": true, + "releaseDate": "2024-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/qwen/qwq-32b", + "modelKey": "workers-ai/@cf/qwen/qwq-32b", + "displayName": "QwQ 32B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-04-11", + "openWeights": false, + "releaseDate": "2025-04-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/qwen/qwq-32b", + "modelKey": "@cf/qwen/qwq-32b", + "displayName": "Qwq 32B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-03-05", + "openWeights": true, + "releaseDate": "2025-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwq-32b", + "modelKey": "qwq-32b", + "displayName": "Qwen: QwQ 32B", + "metadata": { + "lastUpdated": "2025-04-15", + "openWeights": false, + "releaseDate": "2025-04-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/QwQ-32B", + "modelKey": "Qwen/QwQ-32B", + "displayName": "Qwen/QwQ-32B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-03-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Qwen/QwQ-32B", + "modelKey": "Qwen/QwQ-32B", + "displayName": "Qwen/QwQ-32B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-03-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Qwen/QwQ-32B", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/qwq-32b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "hyperbolic", + "model": "hyperbolic/Qwen/QwQ-32B", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/Qwen/QwQ-32B", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nscale", + "model": "nscale/Qwen/QwQ-32B", + "mode": "chat", + "metadata": { + "source": "https://docs.nscale.com/docs/inference/serverless-models/current#chat-models" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sambanova", + "model": "sambanova/QwQ-32B", + "mode": "chat", + "metadata": { + "source": "https://cloud.sambanova.ai/plans/pricing" + } + } + ] + }, + { + "id": "alibaba/qwq-32b-preview", + "provider": "alibaba", + "model": "qwq-32b-preview", + "displayName": "Qwen QwQ 32B Preview", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/qwen/qwq-32b-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qwen/qwq-32b-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen QwQ 32B Preview" + ], + "releaseDate": "2025-02-27", + "lastUpdated": "2025-02-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qwen/qwq-32b-preview", + "modelKey": "qwen/qwq-32b-preview", + "displayName": "Qwen QwQ 32B Preview", + "metadata": { + "lastUpdated": "2025-02-27", + "openWeights": false, + "releaseDate": "2025-02-27" + } + } + ] + }, + { + "id": "alibaba/qwq-plus", + "provider": "alibaba", + "model": "qwq-plus", + "displayName": "QwQ Plus", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "alibaba", + "alibaba-cn", + "dashscope", + "llmgateway" + ], + "aliases": [ + "alibaba-cn/qwq-plus", + "alibaba/qwq-plus", + "dashscope/qwq-plus", + "llmgateway/qwq-plus" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 131072, + "inputTokens": 98304, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "qwq-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.23, + "output": 0.574 + } + }, + { + "source": "models.dev", + "provider": "alibaba", + "model": "qwq-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "qwq-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 2.4 + } + }, + { + "source": "litellm", + "provider": "dashscope", + "model": "dashscope/qwq-plus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 2.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "QwQ Plus" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-03-05", + "lastUpdated": "2025-03-05", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwq-plus", + "modelKey": "qwq-plus", + "displayName": "QwQ Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-03-05", + "openWeights": false, + "releaseDate": "2025-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba", + "providerName": "Alibaba", + "providerApi": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "qwq-plus", + "modelKey": "qwq-plus", + "displayName": "QwQ Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-03-05", + "openWeights": false, + "releaseDate": "2025-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "qwq-plus", + "modelKey": "qwq-plus", + "displayName": "QwQ Plus", + "family": "qwen", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-03-05", + "openWeights": false, + "releaseDate": "2025-03-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dashscope", + "model": "dashscope/qwq-plus", + "mode": "chat", + "metadata": { + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + } + } + ] + }, + { + "id": "alibaba/wan-v2-6", + "provider": "alibaba", + "model": "wan-v2-6", + "displayName": "Wan 2.6", + "sources": [ + "models.dev" + ], + "providers": [ + "fastrouter" + ], + "aliases": [ + "fastrouter/wanx/wan-v2-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Wan 2.6" + ], + "releaseDate": "2025-12-01", + "lastUpdated": "2025-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "wanx/wan-v2-6", + "modelKey": "wanx/wan-v2-6", + "displayName": "Wan 2.6", + "metadata": { + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01" + } + } + ] + }, + { + "id": "alibaba/wan-v2.5-t2v-preview", + "provider": "alibaba", + "model": "wan-v2.5-t2v-preview", + "displayName": "Wan v2.5 Text-to-Video Preview", + "family": "o", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/alibaba/wan-v2.5-t2v-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Wan v2.5 Text-to-Video Preview" + ], + "families": [ + "o" + ], + "releaseDate": "2025-09-24", + "lastUpdated": "2025-09-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/wan-v2.5-t2v-preview", + "modelKey": "alibaba/wan-v2.5-t2v-preview", + "displayName": "Wan v2.5 Text-to-Video Preview", + "family": "o", + "metadata": { + "lastUpdated": "2025-09-24", + "openWeights": false, + "releaseDate": "2025-09-24" + } + } + ] + }, + { + "id": "alibaba/wan-v2.6-i2v", + "provider": "alibaba", + "model": "wan-v2.6-i2v", + "displayName": "Wan v2.6 Image-to-Video", + "family": "o", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/alibaba/wan-v2.6-i2v" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Wan v2.6 Image-to-Video" + ], + "families": [ + "o" + ], + "releaseDate": "2025-12-16", + "lastUpdated": "2025-12-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/wan-v2.6-i2v", + "modelKey": "alibaba/wan-v2.6-i2v", + "displayName": "Wan v2.6 Image-to-Video", + "family": "o", + "metadata": { + "lastUpdated": "2025-12-16", + "openWeights": false, + "releaseDate": "2025-12-16" + } + } + ] + }, + { + "id": "alibaba/wan-v2.6-i2v-flash", + "provider": "alibaba", + "model": "wan-v2.6-i2v-flash", + "displayName": "Wan v2.6 Image-to-Video Flash", + "family": "o", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/alibaba/wan-v2.6-i2v-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Wan v2.6 Image-to-Video Flash" + ], + "families": [ + "o" + ], + "releaseDate": "2025-12-16", + "lastUpdated": "2025-12-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/wan-v2.6-i2v-flash", + "modelKey": "alibaba/wan-v2.6-i2v-flash", + "displayName": "Wan v2.6 Image-to-Video Flash", + "family": "o", + "metadata": { + "lastUpdated": "2025-12-16", + "openWeights": false, + "releaseDate": "2025-12-16" + } + } + ] + }, + { + "id": "alibaba/wan-v2.6-r2v", + "provider": "alibaba", + "model": "wan-v2.6-r2v", + "displayName": "Wan v2.6 Reference-to-Video", + "family": "o", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/alibaba/wan-v2.6-r2v" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Wan v2.6 Reference-to-Video" + ], + "families": [ + "o" + ], + "releaseDate": "2025-12-16", + "lastUpdated": "2025-12-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/wan-v2.6-r2v", + "modelKey": "alibaba/wan-v2.6-r2v", + "displayName": "Wan v2.6 Reference-to-Video", + "family": "o", + "metadata": { + "lastUpdated": "2025-12-16", + "openWeights": false, + "releaseDate": "2025-12-16" + } + } + ] + }, + { + "id": "alibaba/wan-v2.6-r2v-flash", + "provider": "alibaba", + "model": "wan-v2.6-r2v-flash", + "displayName": "Wan v2.6 Reference-to-Video Flash", + "family": "o", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/alibaba/wan-v2.6-r2v-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Wan v2.6 Reference-to-Video Flash" + ], + "families": [ + "o" + ], + "releaseDate": "2025-12-16", + "lastUpdated": "2025-12-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/wan-v2.6-r2v-flash", + "modelKey": "alibaba/wan-v2.6-r2v-flash", + "displayName": "Wan v2.6 Reference-to-Video Flash", + "family": "o", + "metadata": { + "lastUpdated": "2025-12-16", + "openWeights": false, + "releaseDate": "2025-12-16" + } + } + ] + }, + { + "id": "alibaba/wan-v2.6-t2v", + "provider": "alibaba", + "model": "wan-v2.6-t2v", + "displayName": "Wan v2.6 Text-to-Video", + "family": "o", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/alibaba/wan-v2.6-t2v" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Wan v2.6 Text-to-Video" + ], + "families": [ + "o" + ], + "releaseDate": "2025-12-16", + "lastUpdated": "2025-12-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "alibaba/wan-v2.6-t2v", + "modelKey": "alibaba/wan-v2.6-t2v", + "displayName": "Wan v2.6 Text-to-Video", + "family": "o", + "metadata": { + "lastUpdated": "2025-12-16", + "openWeights": false, + "releaseDate": "2025-12-16" + } + } + ] + }, + { + "id": "amazon-bedrock/amazon.nova-2-lite-v1:0", + "provider": "amazon-bedrock", + "model": "amazon.nova-2-lite-v1:0", + "displayName": "Nova 2 Lite", + "family": "nova", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/amazon.nova-2-lite-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "amazon.nova-2-lite-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.33, + "output": 2.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nova 2 Lite" + ], + "families": [ + "nova" + ], + "releaseDate": "2024-12-01", + "lastUpdated": "2024-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "amazon.nova-2-lite-v1:0", + "modelKey": "amazon.nova-2-lite-v1:0", + "displayName": "Nova 2 Lite", + "family": "nova", + "metadata": { + "lastUpdated": "2024-12-01", + "openWeights": false, + "releaseDate": "2024-12-01", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/amazon.nova-lite-v1:0", + "provider": "amazon-bedrock", + "model": "amazon.nova-lite-v1:0", + "displayName": "Nova Lite", + "family": "nova-lite", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/amazon.nova-lite-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 300000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "amazon.nova-lite-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.06, + "output": 0.24 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nova Lite" + ], + "families": [ + "nova-lite" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-12-03", + "lastUpdated": "2024-12-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "amazon.nova-lite-v1:0", + "modelKey": "amazon.nova-lite-v1:0", + "displayName": "Nova Lite", + "family": "nova-lite", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-12-03", + "openWeights": false, + "releaseDate": "2024-12-03" + } + } + ] + }, + { + "id": "amazon-bedrock/amazon.nova-micro-v1:0", + "provider": "amazon-bedrock", + "model": "amazon.nova-micro-v1:0", + "displayName": "Nova Micro", + "family": "nova-micro", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/amazon.nova-micro-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "amazon.nova-micro-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.00875, + "input": 0.035, + "output": 0.14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nova Micro" + ], + "families": [ + "nova-micro" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-12-03", + "lastUpdated": "2024-12-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "amazon.nova-micro-v1:0", + "modelKey": "amazon.nova-micro-v1:0", + "displayName": "Nova Micro", + "family": "nova-micro", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-12-03", + "openWeights": false, + "releaseDate": "2024-12-03" + } + } + ] + }, + { + "id": "amazon-bedrock/amazon.nova-pro-v1:0", + "provider": "amazon-bedrock", + "model": "amazon.nova-pro-v1:0", + "displayName": "Nova Pro", + "family": "nova-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/amazon.nova-pro-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 300000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "amazon.nova-pro-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.8, + "output": 3.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nova Pro" + ], + "families": [ + "nova-pro" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-12-03", + "lastUpdated": "2024-12-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "amazon.nova-pro-v1:0", + "modelKey": "amazon.nova-pro-v1:0", + "displayName": "Nova Pro", + "family": "nova-pro", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-12-03", + "openWeights": false, + "releaseDate": "2024-12-03" + } + } + ] + }, + { + "id": "amazon-bedrock/anthropic.claude-haiku-4-5-20251001-v1:0", + "provider": "amazon-bedrock", + "model": "anthropic.claude-haiku-4-5-20251001-v1:0", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/anthropic.claude-haiku-4-5-20251001-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "anthropic.claude-haiku-4-5-20251001-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Haiku 4.5" + ], + "families": [ + "claude-haiku" + ], + "knowledgeCutoff": "2025-02-28", + "releaseDate": "2025-10-15", + "lastUpdated": "2025-10-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "anthropic.claude-haiku-4-5-20251001-v1:0", + "modelKey": "anthropic.claude-haiku-4-5-20251001-v1:0", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/anthropic.claude-opus-4-1-20250805-v1:0", + "provider": "amazon-bedrock", + "model": "anthropic.claude-opus-4-1-20250805-v1:0", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/anthropic.claude-opus-4-1-20250805-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "anthropic.claude-opus-4-1-20250805-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.1" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "anthropic.claude-opus-4-1-20250805-v1:0", + "modelKey": "anthropic.claude-opus-4-1-20250805-v1:0", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/anthropic.claude-opus-4-5-20251101-v1:0", + "provider": "amazon-bedrock", + "model": "anthropic.claude-opus-4-5-20251101-v1:0", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/anthropic.claude-opus-4-5-20251101-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "anthropic.claude-opus-4-5-20251101-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.5" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-11-24", + "lastUpdated": "2025-08-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "anthropic.claude-opus-4-5-20251101-v1:0", + "modelKey": "anthropic.claude-opus-4-5-20251101-v1:0", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-01", + "openWeights": false, + "releaseDate": "2025-11-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/anthropic.claude-opus-4-6-v1", + "provider": "amazon-bedrock", + "model": "anthropic.claude-opus-4-6-v1", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/anthropic.claude-opus-4-6-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "anthropic.claude-opus-4-6-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.6" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-05-31", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "anthropic.claude-opus-4-6-v1", + "modelKey": "anthropic.claude-opus-4-6-v1", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/anthropic.claude-opus-4-7", + "provider": "amazon-bedrock", + "model": "anthropic.claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/anthropic.claude-opus-4-7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "anthropic.claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.7" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "anthropic.claude-opus-4-7", + "modelKey": "anthropic.claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/anthropic.claude-opus-4-8", + "provider": "amazon-bedrock", + "model": "anthropic.claude-opus-4-8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/anthropic.claude-opus-4-8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "anthropic.claude-opus-4-8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.8" + ], + "families": [ + "claude-opus" + ], + "releaseDate": "2026-05-28", + "lastUpdated": "2026-05-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "anthropic.claude-opus-4-8", + "modelKey": "anthropic.claude-opus-4-8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/anthropic.claude-sonnet-4-5-20250929-v1:0", + "provider": "amazon-bedrock", + "model": "anthropic.claude-sonnet-4-5-20250929-v1:0", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/anthropic.claude-sonnet-4-5-20250929-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "anthropic.claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.5" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-07-31", + "releaseDate": "2025-09-29", + "lastUpdated": "2025-09-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "anthropic.claude-sonnet-4-5-20250929-v1:0", + "modelKey": "anthropic.claude-sonnet-4-5-20250929-v1:0", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/anthropic.claude-sonnet-4-6", + "provider": "amazon-bedrock", + "model": "anthropic.claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/anthropic.claude-sonnet-4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "anthropic.claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.6" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-17", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "anthropic.claude-sonnet-4-6", + "modelKey": "anthropic.claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/au.anthropic.claude-haiku-4-5-20251001-v1:0", + "provider": "amazon-bedrock", + "model": "au.anthropic.claude-haiku-4-5-20251001-v1:0", + "displayName": "Claude Haiku 4.5 (AU)", + "family": "claude-haiku", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/au.anthropic.claude-haiku-4-5-20251001-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "au.anthropic.claude-haiku-4-5-20251001-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Haiku 4.5 (AU)" + ], + "families": [ + "claude-haiku" + ], + "knowledgeCutoff": "2025-02-28", + "releaseDate": "2025-10-15", + "lastUpdated": "2025-10-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "au.anthropic.claude-haiku-4-5-20251001-v1:0", + "modelKey": "au.anthropic.claude-haiku-4-5-20251001-v1:0", + "displayName": "Claude Haiku 4.5 (AU)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/au.anthropic.claude-opus-4-6-v1", + "provider": "amazon-bedrock", + "model": "au.anthropic.claude-opus-4-6-v1", + "displayName": "AU Anthropic Claude Opus 4.6", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/au.anthropic.claude-opus-4-6-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "au.anthropic.claude-opus-4-6-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.65, + "cacheWrite": 20.625, + "input": 16.5, + "output": 82.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "AU Anthropic Claude Opus 4.6" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-02-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "au.anthropic.claude-opus-4-6-v1", + "modelKey": "au.anthropic.claude-opus-4-6-v1", + "displayName": "AU Anthropic Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/au.anthropic.claude-opus-4-8", + "provider": "amazon-bedrock", + "model": "au.anthropic.claude-opus-4-8", + "displayName": "Claude Opus 4.8 (AU)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/au.anthropic.claude-opus-4-8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "au.anthropic.claude-opus-4-8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.8 (AU)" + ], + "families": [ + "claude-opus" + ], + "releaseDate": "2026-05-28", + "lastUpdated": "2026-05-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "au.anthropic.claude-opus-4-8", + "modelKey": "au.anthropic.claude-opus-4-8", + "displayName": "Claude Opus 4.8 (AU)", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/au.anthropic.claude-sonnet-4-5-20250929-v1:0", + "provider": "amazon-bedrock", + "model": "au.anthropic.claude-sonnet-4-5-20250929-v1:0", + "displayName": "Claude Sonnet 4.5 (AU)", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/au.anthropic.claude-sonnet-4-5-20250929-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "au.anthropic.claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.5 (AU)" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-07-31", + "releaseDate": "2025-09-29", + "lastUpdated": "2025-09-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "au.anthropic.claude-sonnet-4-5-20250929-v1:0", + "modelKey": "au.anthropic.claude-sonnet-4-5-20250929-v1:0", + "displayName": "Claude Sonnet 4.5 (AU)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/au.anthropic.claude-sonnet-4-6", + "provider": "amazon-bedrock", + "model": "au.anthropic.claude-sonnet-4-6", + "displayName": "AU Anthropic Claude Sonnet 4.6", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/au.anthropic.claude-sonnet-4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "au.anthropic.claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.33, + "cacheWrite": 4.125, + "input": 3.3, + "output": 16.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "AU Anthropic Claude Sonnet 4.6" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-08", + "releaseDate": "2026-02-17", + "lastUpdated": "2026-02-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "au.anthropic.claude-sonnet-4-6", + "modelKey": "au.anthropic.claude-sonnet-4-6", + "displayName": "AU Anthropic Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08", + "lastUpdated": "2026-02-17", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/deepseek.r1-v1:0", + "provider": "amazon-bedrock", + "model": "deepseek.r1-v1:0", + "displayName": "DeepSeek-R1", + "family": "deepseek-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/deepseek.r1-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "deepseek.r1-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.35, + "output": 5.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek-R1" + ], + "families": [ + "deepseek-thinking" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2025-01-20", + "lastUpdated": "2025-05-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "deepseek.r1-v1:0", + "modelKey": "deepseek.r1-v1:0", + "displayName": "DeepSeek-R1", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-05-29", + "openWeights": false, + "releaseDate": "2025-01-20" + } + } + ] + }, + { + "id": "amazon-bedrock/deepseek.v3-v1:0", + "provider": "amazon-bedrock", + "model": "deepseek.v3-v1:0", + "displayName": "DeepSeek-V3.1", + "family": "deepseek", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/deepseek.v3-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "outputTokens": 81920, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "deepseek.v3-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.58, + "output": 1.68 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek-V3.1" + ], + "families": [ + "deepseek" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2025-09-18", + "lastUpdated": "2025-09-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "deepseek.v3-v1:0", + "modelKey": "deepseek.v3-v1:0", + "displayName": "DeepSeek-V3.1", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-09-18", + "openWeights": true, + "releaseDate": "2025-09-18" + } + } + ] + }, + { + "id": "amazon-bedrock/deepseek.v3.2", + "provider": "amazon-bedrock", + "model": "deepseek.v3.2", + "displayName": "DeepSeek-V3.2", + "family": "deepseek", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/deepseek.v3.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "outputTokens": 81920, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "deepseek.v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.62, + "output": 1.85 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek-V3.2" + ], + "families": [ + "deepseek" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2026-02-06", + "lastUpdated": "2026-02-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "deepseek.v3.2", + "modelKey": "deepseek.v3.2", + "displayName": "DeepSeek-V3.2", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2026-02-06", + "openWeights": true, + "releaseDate": "2026-02-06" + } + } + ] + }, + { + "id": "amazon-bedrock/eu.anthropic.claude-fable-5", + "provider": "amazon-bedrock", + "model": "eu.anthropic.claude-fable-5", + "displayName": "Claude Fable 5 (EU)", + "family": "claude-fable", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/eu.anthropic.claude-fable-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "eu.anthropic.claude-fable-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.1, + "cacheWrite": 13.75, + "input": 11, + "output": 55 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Fable 5 (EU)" + ], + "families": [ + "claude-fable" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-06-09", + "lastUpdated": "2026-06-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "eu.anthropic.claude-fable-5", + "modelKey": "eu.anthropic.claude-fable-5", + "displayName": "Claude Fable 5 (EU)", + "family": "claude-fable", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-06-09", + "openWeights": false, + "releaseDate": "2026-06-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/eu.anthropic.claude-haiku-4-5-20251001-v1:0", + "provider": "amazon-bedrock", + "model": "eu.anthropic.claude-haiku-4-5-20251001-v1:0", + "displayName": "Claude Haiku 4.5 (EU)", + "family": "claude-haiku", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/eu.anthropic.claude-haiku-4-5-20251001-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "eu.anthropic.claude-haiku-4-5-20251001-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Haiku 4.5 (EU)" + ], + "families": [ + "claude-haiku" + ], + "knowledgeCutoff": "2025-02-28", + "releaseDate": "2025-10-15", + "lastUpdated": "2025-10-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "eu.anthropic.claude-haiku-4-5-20251001-v1:0", + "modelKey": "eu.anthropic.claude-haiku-4-5-20251001-v1:0", + "displayName": "Claude Haiku 4.5 (EU)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/eu.anthropic.claude-opus-4-5-20251101-v1:0", + "provider": "amazon-bedrock", + "model": "eu.anthropic.claude-opus-4-5-20251101-v1:0", + "displayName": "Claude Opus 4.5 (EU)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/eu.anthropic.claude-opus-4-5-20251101-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "eu.anthropic.claude-opus-4-5-20251101-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.5 (EU)" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-11-24", + "lastUpdated": "2025-08-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "eu.anthropic.claude-opus-4-5-20251101-v1:0", + "modelKey": "eu.anthropic.claude-opus-4-5-20251101-v1:0", + "displayName": "Claude Opus 4.5 (EU)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-01", + "openWeights": false, + "releaseDate": "2025-11-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/eu.anthropic.claude-opus-4-6-v1", + "provider": "amazon-bedrock", + "model": "eu.anthropic.claude-opus-4-6-v1", + "displayName": "Claude Opus 4.6 (EU)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/eu.anthropic.claude-opus-4-6-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "eu.anthropic.claude-opus-4-6-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "cacheWrite": 6.875, + "input": 5.5, + "output": 27.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.6 (EU)" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-05-31", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "eu.anthropic.claude-opus-4-6-v1", + "modelKey": "eu.anthropic.claude-opus-4-6-v1", + "displayName": "Claude Opus 4.6 (EU)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/eu.anthropic.claude-opus-4-7", + "provider": "amazon-bedrock", + "model": "eu.anthropic.claude-opus-4-7", + "displayName": "Claude Opus 4.7 (EU)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/eu.anthropic.claude-opus-4-7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "eu.anthropic.claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "cacheWrite": 6.875, + "input": 5.5, + "output": 27.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.7 (EU)" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "eu.anthropic.claude-opus-4-7", + "modelKey": "eu.anthropic.claude-opus-4-7", + "displayName": "Claude Opus 4.7 (EU)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/eu.anthropic.claude-opus-4-8", + "provider": "amazon-bedrock", + "model": "eu.anthropic.claude-opus-4-8", + "displayName": "Claude Opus 4.8 (EU)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/eu.anthropic.claude-opus-4-8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "eu.anthropic.claude-opus-4-8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "cacheWrite": 6.875, + "input": 5.5, + "output": 27.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.8 (EU)" + ], + "families": [ + "claude-opus" + ], + "releaseDate": "2026-05-28", + "lastUpdated": "2026-05-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "eu.anthropic.claude-opus-4-8", + "modelKey": "eu.anthropic.claude-opus-4-8", + "displayName": "Claude Opus 4.8 (EU)", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/eu.anthropic.claude-sonnet-4-5-20250929-v1:0", + "provider": "amazon-bedrock", + "model": "eu.anthropic.claude-sonnet-4-5-20250929-v1:0", + "displayName": "Claude Sonnet 4.5 (EU)", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/eu.anthropic.claude-sonnet-4-5-20250929-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "eu.anthropic.claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.33, + "cacheWrite": 4.125, + "input": 3.3, + "output": 16.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.5 (EU)" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-07-31", + "releaseDate": "2025-09-29", + "lastUpdated": "2025-09-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "eu.anthropic.claude-sonnet-4-5-20250929-v1:0", + "modelKey": "eu.anthropic.claude-sonnet-4-5-20250929-v1:0", + "displayName": "Claude Sonnet 4.5 (EU)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/eu.anthropic.claude-sonnet-4-6", + "provider": "amazon-bedrock", + "model": "eu.anthropic.claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6 (EU)", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/eu.anthropic.claude-sonnet-4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "eu.anthropic.claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.33, + "cacheWrite": 4.125, + "input": 3.3, + "output": 16.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.6 (EU)" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-17", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "eu.anthropic.claude-sonnet-4-6", + "modelKey": "eu.anthropic.claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6 (EU)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/global.anthropic.claude-fable-5", + "provider": "amazon-bedrock", + "model": "global.anthropic.claude-fable-5", + "displayName": "Claude Fable 5 (Global)", + "family": "claude-fable", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/global.anthropic.claude-fable-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "global.anthropic.claude-fable-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Fable 5 (Global)" + ], + "families": [ + "claude-fable" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-06-09", + "lastUpdated": "2026-06-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "global.anthropic.claude-fable-5", + "modelKey": "global.anthropic.claude-fable-5", + "displayName": "Claude Fable 5 (Global)", + "family": "claude-fable", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-06-09", + "openWeights": false, + "releaseDate": "2026-06-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/global.anthropic.claude-haiku-4-5-20251001-v1:0", + "provider": "amazon-bedrock", + "model": "global.anthropic.claude-haiku-4-5-20251001-v1:0", + "displayName": "Claude Haiku 4.5 (Global)", + "family": "claude-haiku", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/global.anthropic.claude-haiku-4-5-20251001-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "global.anthropic.claude-haiku-4-5-20251001-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Haiku 4.5 (Global)" + ], + "families": [ + "claude-haiku" + ], + "knowledgeCutoff": "2025-02-28", + "releaseDate": "2025-10-15", + "lastUpdated": "2025-10-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "global.anthropic.claude-haiku-4-5-20251001-v1:0", + "modelKey": "global.anthropic.claude-haiku-4-5-20251001-v1:0", + "displayName": "Claude Haiku 4.5 (Global)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/global.anthropic.claude-opus-4-5-20251101-v1:0", + "provider": "amazon-bedrock", + "model": "global.anthropic.claude-opus-4-5-20251101-v1:0", + "displayName": "Claude Opus 4.5 (Global)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/global.anthropic.claude-opus-4-5-20251101-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "global.anthropic.claude-opus-4-5-20251101-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.5 (Global)" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-11-24", + "lastUpdated": "2025-08-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "global.anthropic.claude-opus-4-5-20251101-v1:0", + "modelKey": "global.anthropic.claude-opus-4-5-20251101-v1:0", + "displayName": "Claude Opus 4.5 (Global)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-01", + "openWeights": false, + "releaseDate": "2025-11-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/global.anthropic.claude-opus-4-6-v1", + "provider": "amazon-bedrock", + "model": "global.anthropic.claude-opus-4-6-v1", + "displayName": "Claude Opus 4.6 (Global)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/global.anthropic.claude-opus-4-6-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "global.anthropic.claude-opus-4-6-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.6 (Global)" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-05-31", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "global.anthropic.claude-opus-4-6-v1", + "modelKey": "global.anthropic.claude-opus-4-6-v1", + "displayName": "Claude Opus 4.6 (Global)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/global.anthropic.claude-opus-4-7", + "provider": "amazon-bedrock", + "model": "global.anthropic.claude-opus-4-7", + "displayName": "Claude Opus 4.7 (Global)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/global.anthropic.claude-opus-4-7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "global.anthropic.claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.7 (Global)" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "global.anthropic.claude-opus-4-7", + "modelKey": "global.anthropic.claude-opus-4-7", + "displayName": "Claude Opus 4.7 (Global)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/global.anthropic.claude-opus-4-8", + "provider": "amazon-bedrock", + "model": "global.anthropic.claude-opus-4-8", + "displayName": "Claude Opus 4.8 (Global)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/global.anthropic.claude-opus-4-8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "global.anthropic.claude-opus-4-8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.8 (Global)" + ], + "families": [ + "claude-opus" + ], + "releaseDate": "2026-05-28", + "lastUpdated": "2026-05-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "global.anthropic.claude-opus-4-8", + "modelKey": "global.anthropic.claude-opus-4-8", + "displayName": "Claude Opus 4.8 (Global)", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/global.anthropic.claude-sonnet-4-5-20250929-v1:0", + "provider": "amazon-bedrock", + "model": "global.anthropic.claude-sonnet-4-5-20250929-v1:0", + "displayName": "Claude Sonnet 4.5 (Global)", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/global.anthropic.claude-sonnet-4-5-20250929-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "global.anthropic.claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.5 (Global)" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-07-31", + "releaseDate": "2025-09-29", + "lastUpdated": "2025-09-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "global.anthropic.claude-sonnet-4-5-20250929-v1:0", + "modelKey": "global.anthropic.claude-sonnet-4-5-20250929-v1:0", + "displayName": "Claude Sonnet 4.5 (Global)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/global.anthropic.claude-sonnet-4-6", + "provider": "amazon-bedrock", + "model": "global.anthropic.claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6 (Global)", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/global.anthropic.claude-sonnet-4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "global.anthropic.claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.6 (Global)" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-17", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "global.anthropic.claude-sonnet-4-6", + "modelKey": "global.anthropic.claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6 (Global)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/google.gemma-3-12b-it", + "provider": "amazon-bedrock", + "model": "google.gemma-3-12b-it", + "displayName": "Google Gemma 3 12B", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/google.gemma-3-12b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "google.gemma-3-12b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.049999999999999996, + "output": 0.09999999999999999 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Google Gemma 3 12B" + ], + "families": [ + "gemma" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2024-12-01", + "lastUpdated": "2024-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "google.gemma-3-12b-it", + "modelKey": "google.gemma-3-12b-it", + "displayName": "Google Gemma 3 12B", + "family": "gemma", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2024-12-01", + "openWeights": false, + "releaseDate": "2024-12-01" + } + } + ] + }, + { + "id": "amazon-bedrock/google.gemma-3-27b-it", + "provider": "amazon-bedrock", + "model": "google.gemma-3-27b-it", + "displayName": "Google Gemma 3 27B Instruct", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/google.gemma-3-27b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 202752, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "google.gemma-3-27b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Google Gemma 3 27B Instruct" + ], + "families": [ + "gemma" + ], + "knowledgeCutoff": "2025-07", + "releaseDate": "2025-07-27", + "lastUpdated": "2025-07-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "google.gemma-3-27b-it", + "modelKey": "google.gemma-3-27b-it", + "displayName": "Google Gemma 3 27B Instruct", + "family": "gemma", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2025-07-27", + "openWeights": true, + "releaseDate": "2025-07-27" + } + } + ] + }, + { + "id": "amazon-bedrock/google.gemma-3-4b-it", + "provider": "amazon-bedrock", + "model": "google.gemma-3-4b-it", + "displayName": "Gemma 3 4B IT", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/google.gemma-3-4b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "google.gemma-3-4b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.08 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 3 4B IT" + ], + "families": [ + "gemma" + ], + "releaseDate": "2024-12-01", + "lastUpdated": "2024-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "google.gemma-3-4b-it", + "modelKey": "google.gemma-3-4b-it", + "displayName": "Gemma 3 4B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2024-12-01", + "openWeights": false, + "releaseDate": "2024-12-01" + } + } + ] + }, + { + "id": "amazon-bedrock/jp.anthropic.claude-opus-4-7", + "provider": "amazon-bedrock", + "model": "jp.anthropic.claude-opus-4-7", + "displayName": "Claude Opus 4.7 (JP)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/jp.anthropic.claude-opus-4-7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "jp.anthropic.claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.7 (JP)" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "jp.anthropic.claude-opus-4-7", + "modelKey": "jp.anthropic.claude-opus-4-7", + "displayName": "Claude Opus 4.7 (JP)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/jp.anthropic.claude-opus-4-8", + "provider": "amazon-bedrock", + "model": "jp.anthropic.claude-opus-4-8", + "displayName": "Claude Opus 4.8 (JP)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/jp.anthropic.claude-opus-4-8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "jp.anthropic.claude-opus-4-8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.8 (JP)" + ], + "families": [ + "claude-opus" + ], + "releaseDate": "2026-05-28", + "lastUpdated": "2026-05-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "jp.anthropic.claude-opus-4-8", + "modelKey": "jp.anthropic.claude-opus-4-8", + "displayName": "Claude Opus 4.8 (JP)", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/jp.anthropic.claude-sonnet-4-5-20250929-v1:0", + "provider": "amazon-bedrock", + "model": "jp.anthropic.claude-sonnet-4-5-20250929-v1:0", + "displayName": "Claude Sonnet 4.5 (JP)", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/jp.anthropic.claude-sonnet-4-5-20250929-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "jp.anthropic.claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.5 (JP)" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-07-31", + "releaseDate": "2025-09-29", + "lastUpdated": "2025-09-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "jp.anthropic.claude-sonnet-4-5-20250929-v1:0", + "modelKey": "jp.anthropic.claude-sonnet-4-5-20250929-v1:0", + "displayName": "Claude Sonnet 4.5 (JP)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/jp.anthropic.claude-sonnet-4-6", + "provider": "amazon-bedrock", + "model": "jp.anthropic.claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6 (JP)", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/jp.anthropic.claude-sonnet-4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "jp.anthropic.claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.6 (JP)" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-17", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "jp.anthropic.claude-sonnet-4-6", + "modelKey": "jp.anthropic.claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6 (JP)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/meta.llama3-1-70b-instruct-v1:0", + "provider": "amazon-bedrock", + "model": "meta.llama3-1-70b-instruct-v1:0", + "displayName": "Llama 3.1 70B Instruct", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/meta.llama3-1-70b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "meta.llama3-1-70b-instruct-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 70B Instruct" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "meta.llama3-1-70b-instruct-v1:0", + "modelKey": "meta.llama3-1-70b-instruct-v1:0", + "displayName": "Llama 3.1 70B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + } + ] + }, + { + "id": "amazon-bedrock/meta.llama3-1-8b-instruct-v1:0", + "provider": "amazon-bedrock", + "model": "meta.llama3-1-8b-instruct-v1:0", + "displayName": "Llama 3.1 8B Instruct", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/meta.llama3-1-8b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "meta.llama3-1-8b-instruct-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.22, + "output": 0.22 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 8B Instruct" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "meta.llama3-1-8b-instruct-v1:0", + "modelKey": "meta.llama3-1-8b-instruct-v1:0", + "displayName": "Llama 3.1 8B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + } + ] + }, + { + "id": "amazon-bedrock/meta.llama3-3-70b-instruct-v1:0", + "provider": "amazon-bedrock", + "model": "meta.llama3-3-70b-instruct-v1:0", + "displayName": "Llama 3.3 70B Instruct", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/meta.llama3-3-70b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "meta.llama3-3-70b-instruct-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 70B Instruct" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-12-06", + "lastUpdated": "2024-12-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "meta.llama3-3-70b-instruct-v1:0", + "modelKey": "meta.llama3-3-70b-instruct-v1:0", + "displayName": "Llama 3.3 70B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + } + ] + }, + { + "id": "amazon-bedrock/meta.llama4-maverick-17b-instruct-v1:0", + "provider": "amazon-bedrock", + "model": "meta.llama4-maverick-17b-instruct-v1:0", + "displayName": "Llama 4 Maverick 17B Instruct", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/meta.llama4-maverick-17b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 16384, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "meta.llama4-maverick-17b-instruct-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.24, + "output": 0.97 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 4 Maverick 17B Instruct" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2024-08", + "releaseDate": "2025-04-05", + "lastUpdated": "2025-04-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "meta.llama4-maverick-17b-instruct-v1:0", + "modelKey": "meta.llama4-maverick-17b-instruct-v1:0", + "displayName": "Llama 4 Maverick 17B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + } + ] + }, + { + "id": "amazon-bedrock/meta.llama4-scout-17b-instruct-v1:0", + "provider": "amazon-bedrock", + "model": "meta.llama4-scout-17b-instruct-v1:0", + "displayName": "Llama 4 Scout 17B Instruct", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/meta.llama4-scout-17b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 3500000, + "outputTokens": 16384, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "meta.llama4-scout-17b-instruct-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.17, + "output": 0.66 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 4 Scout 17B Instruct" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2024-08", + "releaseDate": "2025-04-05", + "lastUpdated": "2025-04-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "meta.llama4-scout-17b-instruct-v1:0", + "modelKey": "meta.llama4-scout-17b-instruct-v1:0", + "displayName": "Llama 4 Scout 17B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + } + ] + }, + { + "id": "amazon-bedrock/moonshot.kimi-k2-thinking", + "provider": "amazon-bedrock", + "model": "moonshot.kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/moonshot.kimi-k2-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262143, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "interleaved": true, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "moonshot.kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2 Thinking" + ], + "families": [ + "kimi-thinking" + ], + "releaseDate": "2025-12-02", + "lastUpdated": "2025-12-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "moonshot.kimi-k2-thinking", + "modelKey": "moonshot.kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2025-12-02" + } + } + ] + }, + { + "id": "amazon-bedrock/moonshotai.kimi-k2.5", + "provider": "amazon-bedrock", + "model": "moonshotai.kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/moonshotai.kimi-k2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262143, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "interleaved": true, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "moonshotai.kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.5" + ], + "families": [ + "kimi" + ], + "releaseDate": "2026-02-06", + "lastUpdated": "2026-02-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "moonshotai.kimi-k2.5", + "modelKey": "moonshotai.kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi", + "metadata": { + "lastUpdated": "2026-02-06", + "openWeights": true, + "releaseDate": "2026-02-06" + } + } + ] + }, + { + "id": "amazon-bedrock/nvidia.nemotron-nano-12b-v2", + "provider": "amazon-bedrock", + "model": "nvidia.nemotron-nano-12b-v2", + "displayName": "NVIDIA Nemotron Nano 12B v2 VL BF16", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/nvidia.nemotron-nano-12b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "nvidia.nemotron-nano-12b-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA Nemotron Nano 12B v2 VL BF16" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2024-12-01", + "lastUpdated": "2024-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "nvidia.nemotron-nano-12b-v2", + "modelKey": "nvidia.nemotron-nano-12b-v2", + "displayName": "NVIDIA Nemotron Nano 12B v2 VL BF16", + "family": "nemotron", + "metadata": { + "lastUpdated": "2024-12-01", + "openWeights": false, + "releaseDate": "2024-12-01" + } + } + ] + }, + { + "id": "amazon-bedrock/nvidia.nemotron-nano-3-30b", + "provider": "amazon-bedrock", + "model": "nvidia.nemotron-nano-3-30b", + "displayName": "NVIDIA Nemotron Nano 3 30B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/nvidia.nemotron-nano-3-30b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "nvidia.nemotron-nano-3-30b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.06, + "output": 0.24 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA Nemotron Nano 3 30B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2025-12-23", + "lastUpdated": "2025-12-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "nvidia.nemotron-nano-3-30b", + "modelKey": "nvidia.nemotron-nano-3-30b", + "displayName": "NVIDIA Nemotron Nano 3 30B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + } + ] + }, + { + "id": "amazon-bedrock/nvidia.nemotron-nano-9b-v2", + "provider": "amazon-bedrock", + "model": "nvidia.nemotron-nano-9b-v2", + "displayName": "NVIDIA Nemotron Nano 9B v2", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/nvidia.nemotron-nano-9b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "nvidia.nemotron-nano-9b-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.06, + "output": 0.23 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA Nemotron Nano 9B v2" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2024-12-01", + "lastUpdated": "2024-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "nvidia.nemotron-nano-9b-v2", + "modelKey": "nvidia.nemotron-nano-9b-v2", + "displayName": "NVIDIA Nemotron Nano 9B v2", + "family": "nemotron", + "metadata": { + "lastUpdated": "2024-12-01", + "openWeights": false, + "releaseDate": "2024-12-01" + } + } + ] + }, + { + "id": "amazon-bedrock/nvidia.nemotron-super-3-120b", + "provider": "amazon-bedrock", + "model": "nvidia.nemotron-super-3-120b", + "displayName": "NVIDIA Nemotron 3 Super 120B A12B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/nvidia.nemotron-super-3-120b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "nvidia.nemotron-super-3-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.65 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA Nemotron 3 Super 120B A12B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-03-11", + "lastUpdated": "2026-03-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "nvidia.nemotron-super-3-120b", + "modelKey": "nvidia.nemotron-super-3-120b", + "displayName": "NVIDIA Nemotron 3 Super 120B A12B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-03-11", + "openWeights": true, + "releaseDate": "2026-03-11" + } + } + ] + }, + { + "id": "amazon-bedrock/openai.gpt-5.4", + "provider": "amazon-bedrock", + "model": "openai.gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/openai.gpt-5.4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "openai.gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.275, + "input": 2.75, + "output": 16.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.4" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-05", + "lastUpdated": "2026-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "openai.gpt-5.4", + "modelKey": "openai.gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-06-01", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/openai.gpt-5.5", + "provider": "amazon-bedrock", + "model": "openai.gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/openai.gpt-5.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "openai.gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 5.5, + "output": 33 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.5" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-12-01", + "releaseDate": "2026-04-23", + "lastUpdated": "2026-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "openai.gpt-5.5", + "modelKey": "openai.gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-06-01", + "openWeights": false, + "releaseDate": "2026-04-23", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/openai.gpt-oss-120b", + "provider": "amazon-bedrock", + "model": "openai.gpt-oss-120b", + "displayName": "gpt-oss-120b", + "family": "gpt-oss", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/openai.gpt-oss-120b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "openai.gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gpt-oss-120b" + ], + "families": [ + "gpt-oss" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "openai.gpt-oss-120b", + "modelKey": "openai.gpt-oss-120b", + "displayName": "gpt-oss-120b", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/openai.gpt-oss-120b-1:0", + "provider": "amazon-bedrock", + "model": "openai.gpt-oss-120b-1:0", + "displayName": "gpt-oss-120b", + "family": "gpt-oss", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/openai.gpt-oss-120b-1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "openai.gpt-oss-120b-1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gpt-oss-120b" + ], + "families": [ + "gpt-oss" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "openai.gpt-oss-120b-1:0", + "modelKey": "openai.gpt-oss-120b-1:0", + "displayName": "gpt-oss-120b", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/openai.gpt-oss-20b", + "provider": "amazon-bedrock", + "model": "openai.gpt-oss-20b", + "displayName": "gpt-oss-20b", + "family": "gpt-oss", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/openai.gpt-oss-20b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "openai.gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gpt-oss-20b" + ], + "families": [ + "gpt-oss" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "openai.gpt-oss-20b", + "modelKey": "openai.gpt-oss-20b", + "displayName": "gpt-oss-20b", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/openai.gpt-oss-20b-1:0", + "provider": "amazon-bedrock", + "model": "openai.gpt-oss-20b-1:0", + "displayName": "gpt-oss-20b", + "family": "gpt-oss", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/openai.gpt-oss-20b-1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "openai.gpt-oss-20b-1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gpt-oss-20b" + ], + "families": [ + "gpt-oss" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "openai.gpt-oss-20b-1:0", + "modelKey": "openai.gpt-oss-20b-1:0", + "displayName": "gpt-oss-20b", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/openai.gpt-oss-safeguard-120b", + "provider": "amazon-bedrock", + "model": "openai.gpt-oss-safeguard-120b", + "displayName": "GPT OSS Safeguard 120B", + "family": "gpt-oss", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/openai.gpt-oss-safeguard-120b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "openai.gpt-oss-safeguard-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT OSS Safeguard 120B" + ], + "families": [ + "gpt-oss" + ], + "releaseDate": "2025-10-29", + "lastUpdated": "2025-10-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "openai.gpt-oss-safeguard-120b", + "modelKey": "openai.gpt-oss-safeguard-120b", + "displayName": "GPT OSS Safeguard 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-10-29", + "openWeights": false, + "releaseDate": "2025-10-29" + } + } + ] + }, + { + "id": "amazon-bedrock/openai.gpt-oss-safeguard-20b", + "provider": "amazon-bedrock", + "model": "openai.gpt-oss-safeguard-20b", + "displayName": "GPT OSS Safeguard 20B", + "family": "gpt-oss", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/openai.gpt-oss-safeguard-20b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "openai.gpt-oss-safeguard-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT OSS Safeguard 20B" + ], + "families": [ + "gpt-oss" + ], + "releaseDate": "2025-10-29", + "lastUpdated": "2025-10-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "openai.gpt-oss-safeguard-20b", + "modelKey": "openai.gpt-oss-safeguard-20b", + "displayName": "GPT OSS Safeguard 20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-10-29", + "openWeights": false, + "releaseDate": "2025-10-29" + } + } + ] + }, + { + "id": "amazon-bedrock/us.anthropic.claude-fable-5", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-fable-5", + "displayName": "Claude Fable 5 (US)", + "family": "claude-fable", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/us.anthropic.claude-fable-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-fable-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Fable 5 (US)" + ], + "families": [ + "claude-fable" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-06-09", + "lastUpdated": "2026-06-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "us.anthropic.claude-fable-5", + "modelKey": "us.anthropic.claude-fable-5", + "displayName": "Claude Fable 5 (US)", + "family": "claude-fable", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-06-09", + "openWeights": false, + "releaseDate": "2026-06-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-haiku-4-5-20251001-v1:0", + "displayName": "Claude Haiku 4.5 (US)", + "family": "claude-haiku", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-haiku-4-5-20251001-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Haiku 4.5 (US)" + ], + "families": [ + "claude-haiku" + ], + "knowledgeCutoff": "2025-02-28", + "releaseDate": "2025-10-15", + "lastUpdated": "2025-10-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "us.anthropic.claude-haiku-4-5-20251001-v1:0", + "modelKey": "us.anthropic.claude-haiku-4-5-20251001-v1:0", + "displayName": "Claude Haiku 4.5 (US)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/us.anthropic.claude-opus-4-1-20250805-v1:0", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-opus-4-1-20250805-v1:0", + "displayName": "Claude Opus 4.1 (US)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/us.anthropic.claude-opus-4-1-20250805-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-opus-4-1-20250805-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.1 (US)" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "us.anthropic.claude-opus-4-1-20250805-v1:0", + "modelKey": "us.anthropic.claude-opus-4-1-20250805-v1:0", + "displayName": "Claude Opus 4.1 (US)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/us.anthropic.claude-opus-4-5-20251101-v1:0", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-opus-4-5-20251101-v1:0", + "displayName": "Claude Opus 4.5 (US)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/us.anthropic.claude-opus-4-5-20251101-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-opus-4-5-20251101-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.5 (US)" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-11-24", + "lastUpdated": "2025-08-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "us.anthropic.claude-opus-4-5-20251101-v1:0", + "modelKey": "us.anthropic.claude-opus-4-5-20251101-v1:0", + "displayName": "Claude Opus 4.5 (US)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-01", + "openWeights": false, + "releaseDate": "2025-11-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/us.anthropic.claude-opus-4-6-v1", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-opus-4-6-v1", + "displayName": "Claude Opus 4.6 (US)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/us.anthropic.claude-opus-4-6-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-opus-4-6-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.6 (US)" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-05-31", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "us.anthropic.claude-opus-4-6-v1", + "modelKey": "us.anthropic.claude-opus-4-6-v1", + "displayName": "Claude Opus 4.6 (US)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/us.anthropic.claude-opus-4-7", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-opus-4-7", + "displayName": "Claude Opus 4.7 (US)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/us.anthropic.claude-opus-4-7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.7 (US)" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "us.anthropic.claude-opus-4-7", + "modelKey": "us.anthropic.claude-opus-4-7", + "displayName": "Claude Opus 4.7 (US)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/us.anthropic.claude-opus-4-8", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-opus-4-8", + "displayName": "Claude Opus 4.8 (US)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/us.anthropic.claude-opus-4-8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-opus-4-8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.8 (US)" + ], + "families": [ + "claude-opus" + ], + "releaseDate": "2026-05-28", + "lastUpdated": "2026-05-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "us.anthropic.claude-opus-4-8", + "modelKey": "us.anthropic.claude-opus-4-8", + "displayName": "Claude Opus 4.8 (US)", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/us.anthropic.claude-sonnet-4-5-20250929-v1:0", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-sonnet-4-5-20250929-v1:0", + "displayName": "Claude Sonnet 4.5 (US)", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/us.anthropic.claude-sonnet-4-5-20250929-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.5 (US)" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-07-31", + "releaseDate": "2025-09-29", + "lastUpdated": "2025-09-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "us.anthropic.claude-sonnet-4-5-20250929-v1:0", + "modelKey": "us.anthropic.claude-sonnet-4-5-20250929-v1:0", + "displayName": "Claude Sonnet 4.5 (US)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/us.anthropic.claude-sonnet-4-6", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6 (US)", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/us.anthropic.claude-sonnet-4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "us.anthropic.claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.6 (US)" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-17", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "us.anthropic.claude-sonnet-4-6", + "modelKey": "us.anthropic.claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6 (US)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "amazon-bedrock/us.deepseek.r1-v1:0", + "provider": "amazon-bedrock", + "model": "us.deepseek.r1-v1:0", + "displayName": "DeepSeek-R1 (US)", + "family": "deepseek-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/us.deepseek.r1-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "us.deepseek.r1-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.35, + "output": 5.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek-R1 (US)" + ], + "families": [ + "deepseek-thinking" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2025-01-20", + "lastUpdated": "2025-05-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "us.deepseek.r1-v1:0", + "modelKey": "us.deepseek.r1-v1:0", + "displayName": "DeepSeek-R1 (US)", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-05-29", + "openWeights": true, + "releaseDate": "2025-01-20" + } + } + ] + }, + { + "id": "amazon-bedrock/us.meta.llama4-maverick-17b-instruct-v1:0", + "provider": "amazon-bedrock", + "model": "us.meta.llama4-maverick-17b-instruct-v1:0", + "displayName": "Llama 4 Maverick 17B Instruct (US)", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/us.meta.llama4-maverick-17b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 16384, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "us.meta.llama4-maverick-17b-instruct-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.24, + "output": 0.97 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 4 Maverick 17B Instruct (US)" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2024-08", + "releaseDate": "2025-04-05", + "lastUpdated": "2025-04-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "us.meta.llama4-maverick-17b-instruct-v1:0", + "modelKey": "us.meta.llama4-maverick-17b-instruct-v1:0", + "displayName": "Llama 4 Maverick 17B Instruct (US)", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + } + ] + }, + { + "id": "amazon-bedrock/us.meta.llama4-scout-17b-instruct-v1:0", + "provider": "amazon-bedrock", + "model": "us.meta.llama4-scout-17b-instruct-v1:0", + "displayName": "Llama 4 Scout 17B Instruct (US)", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/us.meta.llama4-scout-17b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 3500000, + "outputTokens": 16384, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "us.meta.llama4-scout-17b-instruct-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.17, + "output": 0.66 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 4 Scout 17B Instruct (US)" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2024-08", + "releaseDate": "2025-04-05", + "lastUpdated": "2025-04-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "us.meta.llama4-scout-17b-instruct-v1:0", + "modelKey": "us.meta.llama4-scout-17b-instruct-v1:0", + "displayName": "Llama 4 Scout 17B Instruct (US)", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + } + ] + }, + { + "id": "amazon-bedrock/writer.palmyra-x4-v1:0", + "provider": "amazon-bedrock", + "model": "writer.palmyra-x4-v1:0", + "displayName": "Palmyra X4", + "family": "palmyra", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/writer.palmyra-x4-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 122880, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "writer.palmyra-x4-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Palmyra X4" + ], + "families": [ + "palmyra" + ], + "releaseDate": "2025-04-28", + "lastUpdated": "2025-04-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "writer.palmyra-x4-v1:0", + "modelKey": "writer.palmyra-x4-v1:0", + "displayName": "Palmyra X4", + "family": "palmyra", + "metadata": { + "lastUpdated": "2025-04-28", + "openWeights": false, + "releaseDate": "2025-04-28" + } + } + ] + }, + { + "id": "amazon-bedrock/writer.palmyra-x5-v1:0", + "provider": "amazon-bedrock", + "model": "writer.palmyra-x5-v1:0", + "displayName": "Palmyra X5", + "family": "palmyra", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/writer.palmyra-x5-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1040000, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "writer.palmyra-x5-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Palmyra X5" + ], + "families": [ + "palmyra" + ], + "releaseDate": "2025-04-28", + "lastUpdated": "2025-04-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "writer.palmyra-x5-v1:0", + "modelKey": "writer.palmyra-x5-v1:0", + "displayName": "Palmyra X5", + "family": "palmyra", + "metadata": { + "lastUpdated": "2025-04-28", + "openWeights": false, + "releaseDate": "2025-04-28" + } + } + ] + }, + { + "id": "amazon-bedrock/zai.glm-4.7", + "provider": "amazon-bedrock", + "model": "zai.glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/zai.glm-4.7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "zai.glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-4.7" + ], + "families": [ + "glm" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-12-22", + "lastUpdated": "2025-12-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "zai.glm-4.7", + "modelKey": "zai.glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22" + } + } + ] + }, + { + "id": "amazon-bedrock/zai.glm-4.7-flash", + "provider": "amazon-bedrock", + "model": "zai.glm-4.7-flash", + "displayName": "GLM-4.7-Flash", + "family": "glm-flash", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/zai.glm-4.7-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "zai.glm-4.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-4.7-Flash" + ], + "families": [ + "glm-flash" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-01-19", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "zai.glm-4.7-flash", + "modelKey": "zai.glm-4.7-flash", + "displayName": "GLM-4.7-Flash", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2026-01-19" + } + } + ] + }, + { + "id": "amazon-bedrock/zai.glm-5", + "provider": "amazon-bedrock", + "model": "zai.glm-5", + "displayName": "GLM-5", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/zai.glm-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 202752, + "outputTokens": 101376, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "zai.glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 3.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-5" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "zai.glm-5", + "modelKey": "zai.glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "amazon/ai21.j2-mid-v1", + "provider": "amazon", + "model": "ai21.j2-mid-v1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/ai21.j2-mid-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8191, + "inputTokens": 8191, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "ai21.j2-mid-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 12.5, + "output": 12.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "ai21.j2-mid-v1", + "mode": "chat" + } + ] + }, + { + "id": "amazon/ai21.j2-ultra-v1", + "provider": "amazon", + "model": "ai21.j2-ultra-v1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/ai21.j2-ultra-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8191, + "inputTokens": 8191, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "ai21.j2-ultra-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 18.8, + "output": 18.8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "ai21.j2-ultra-v1", + "mode": "chat" + } + ] + }, + { + "id": "amazon/ai21.jamba-1-5-large-v1:0", + "provider": "amazon", + "model": "ai21.jamba-1-5-large-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/ai21.jamba-1-5-large-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "ai21.jamba-1-5-large-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "ai21.jamba-1-5-large-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/ai21.jamba-1-5-mini-v1:0", + "provider": "amazon", + "model": "ai21.jamba-1-5-mini-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/ai21.jamba-1-5-mini-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "ai21.jamba-1-5-mini-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "ai21.jamba-1-5-mini-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/ai21.jamba-instruct-v1:0", + "provider": "amazon", + "model": "ai21.jamba-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/ai21.jamba-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 70000, + "inputTokens": 70000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "ai21.jamba-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 0.7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "ai21.jamba-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/amazon.nova-2-multimodal-embeddings-v1:0", + "provider": "amazon", + "model": "amazon.nova-2-multimodal-embeddings-v1:0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/amazon.nova-2-multimodal-embeddings-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8172, + "inputTokens": 8172, + "maxTokens": 8172, + "outputTokens": 8172, + "outputVectorSize": 3072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "amazon.nova-2-multimodal-embeddings-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.135, + "output": 0 + }, + "perImage": { + "input": 0.00006 + }, + "perAudioSecond": { + "input": 0.00014 + }, + "perVideoSecond": { + "input": 0.0007 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "amazon.nova-2-multimodal-embeddings-v1:0", + "mode": "embedding", + "metadata": { + "source": "https://us-east-1.console.aws.amazon.com/bedrock/home?region=us-east-1#/model-catalog/serverless/amazon.nova-2-multimodal-embeddings-v1:0" + } + } + ] + }, + { + "id": "amazon/amazon.nova-canvas-v1:0", + "provider": "amazon", + "model": "amazon.nova-canvas-v1:0", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/1024-x-1024/50-steps/bedrock/amazon.nova-canvas-v1:0", + "bedrock/amazon.nova-canvas-v1:0" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 2600, + "inputTokens": 2600, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "imageEditing": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "1024-x-1024/50-steps/bedrock/amazon.nova-canvas-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.06 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "amazon.nova-canvas-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.06 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "1024-x-1024/50-steps/bedrock/amazon.nova-canvas-v1:0", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "amazon.nova-canvas-v1:0", + "mode": "image_generation" + } + ] + }, + { + "id": "amazon/amazon.nova-pro-v1:0", + "provider": "amazon", + "model": "amazon.nova-pro-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us-gov-east-1/amazon.nova-pro-v1:0", + "bedrock/us-gov-west-1/amazon.nova-pro-v1:0" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 300000, + "inputTokens": 300000, + "maxTokens": 10000, + "outputTokens": 10000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/amazon.nova-pro-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.96, + "output": 3.84 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/amazon.nova-pro-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.96, + "output": 3.84 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/amazon.nova-pro-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/amazon.nova-pro-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/amazon.rerank-v1:0", + "provider": "amazon", + "model": "amazon.rerank-v1:0", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/amazon.rerank-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxDocumentChunksPerQuery": 100, + "maxQueryTokens": 32000, + "maxTokens": 32000, + "maxTokensPerDocumentChunk": 512, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "amazon.rerank-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perQuery": { + "input": 0.001 + }, + "extra": { + "max_document_chunks_per_query": 100, + "max_tokens_per_document_chunk": 512 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "amazon.rerank-v1:0", + "mode": "rerank" + } + ] + }, + { + "id": "amazon/amazon.titan-embed-image-v1", + "provider": "amazon", + "model": "amazon.titan-embed-image-v1", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/amazon.titan-embed-image-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128, + "inputTokens": 128, + "maxTokens": 128, + "outputTokens": 128, + "outputVectorSize": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "amazon.titan-embed-image-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 0 + }, + "perImage": { + "input": 0.00006 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "amazon.titan-embed-image-v1", + "mode": "embedding", + "metadata": { + "metadata": { + "notes": "'supports_image_input' is a deprecated field. Use 'supports_embedding_image_input' instead." + }, + "source": "https://us-east-1.console.aws.amazon.com/bedrock/home?region=us-east-1#/providers?model=amazon.titan-image-generator-v1" + } + } + ] + }, + { + "id": "amazon/amazon.titan-embed-text-v1", + "provider": "amazon", + "model": "amazon.titan-embed-text-v1", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/amazon.titan-embed-text-v1", + "bedrock/us-gov-east-1/amazon.titan-embed-text-v1", + "bedrock/us-gov-west-1/amazon.titan-embed-text-v1" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "outputVectorSize": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "amazon.titan-embed-text-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/amazon.titan-embed-text-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/amazon.titan-embed-text-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "amazon.titan-embed-text-v1", + "mode": "embedding" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/amazon.titan-embed-text-v1", + "mode": "embedding" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/amazon.titan-embed-text-v1", + "mode": "embedding" + } + ] + }, + { + "id": "amazon/amazon.titan-embed-text-v2:0", + "provider": "amazon", + "model": "amazon.titan-embed-text-v2:0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/amazon.titan-embed-text-v2:0", + "bedrock/us-gov-east-1/amazon.titan-embed-text-v2:0", + "bedrock/us-gov-west-1/amazon.titan-embed-text-v2:0" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "outputVectorSize": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "amazon.titan-embed-text-v2:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/amazon.titan-embed-text-v2:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/amazon.titan-embed-text-v2:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "amazon.titan-embed-text-v2:0", + "mode": "embedding", + "metadata": { + "providerSpecificEntry": { + "bedrock_invocation_schema": "titan_v2" + } + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/amazon.titan-embed-text-v2:0", + "mode": "embedding" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/amazon.titan-embed-text-v2:0", + "mode": "embedding" + } + ] + }, + { + "id": "amazon/amazon.titan-image-generator-v1", + "provider": "amazon", + "model": "amazon.titan-image-generator-v1", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/amazon.titan-image-generator-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": true, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "amazon.titan-image-generator-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0, + "output": 0.008, + "outputAbove512x512": 0.01, + "outputAbove512x512Premium": 0.012, + "outputPremium": 0.01 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "amazon.titan-image-generator-v1", + "mode": "image_generation" + } + ] + }, + { + "id": "amazon/amazon.titan-image-generator-v2", + "provider": "amazon", + "model": "amazon.titan-image-generator-v2", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/amazon.titan-image-generator-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": true, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "amazon.titan-image-generator-v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0, + "output": 0.008, + "outputAbove1024x1024": 0.01, + "outputAbove1024x1024Premium": 0.012, + "outputPremium": 0.01 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "amazon.titan-image-generator-v2", + "mode": "image_generation" + } + ] + }, + { + "id": "amazon/amazon.titan-image-generator-v2:0", + "provider": "amazon", + "model": "amazon.titan-image-generator-v2:0", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/amazon.titan-image-generator-v2:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": true, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "amazon.titan-image-generator-v2:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0, + "output": 0.008, + "outputAbove1024x1024": 0.01, + "outputAbove1024x1024Premium": 0.012, + "outputPremium": 0.01 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "amazon.titan-image-generator-v2:0", + "mode": "image_generation" + } + ] + }, + { + "id": "amazon/amazon.titan-text-express-v1", + "provider": "amazon", + "model": "amazon.titan-text-express-v1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/amazon.titan-text-express-v1", + "bedrock/us-gov-east-1/amazon.titan-text-express-v1", + "bedrock/us-gov-west-1/amazon.titan-text-express-v1" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 42000, + "inputTokens": 42000, + "maxTokens": 8000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "amazon.titan-text-express-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.3, + "output": 1.7 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/amazon.titan-text-express-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.3, + "output": 1.7 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/amazon.titan-text-express-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.3, + "output": 1.7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "amazon.titan-text-express-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/amazon.titan-text-express-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/amazon.titan-text-express-v1", + "mode": "chat" + } + ] + }, + { + "id": "amazon/amazon.titan-text-lite-v1", + "provider": "amazon", + "model": "amazon.titan-text-lite-v1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/amazon.titan-text-lite-v1", + "bedrock/us-gov-east-1/amazon.titan-text-lite-v1", + "bedrock/us-gov-west-1/amazon.titan-text-lite-v1" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 42000, + "inputTokens": 42000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "amazon.titan-text-lite-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/amazon.titan-text-lite-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/amazon.titan-text-lite-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "amazon.titan-text-lite-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/amazon.titan-text-lite-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/amazon.titan-text-lite-v1", + "mode": "chat" + } + ] + }, + { + "id": "amazon/amazon.titan-text-premier-v1:0", + "provider": "amazon", + "model": "amazon.titan-text-premier-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/amazon.titan-text-premier-v1:0", + "bedrock/us-gov-east-1/amazon.titan-text-premier-v1:0", + "bedrock/us-gov-west-1/amazon.titan-text-premier-v1:0" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 42000, + "inputTokens": 42000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "amazon.titan-text-premier-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/amazon.titan-text-premier-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/amazon.titan-text-premier-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "amazon.titan-text-premier-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/amazon.titan-text-premier-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/amazon.titan-text-premier-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/anthropic.claude-3-5-haiku-20241022-v1:0", + "provider": "amazon", + "model": "anthropic.claude-3-5-haiku-20241022-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/anthropic.claude-3-5-haiku-20241022-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "anthropic.claude-3-5-haiku-20241022-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.8, + "output": 4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "anthropic.claude-3-5-haiku-20241022-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/anthropic.claude-3-5-sonnet-20240620-v1:0", + "provider": "amazon", + "model": "anthropic.claude-3-5-sonnet-20240620-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + "bedrock/invoke/anthropic.claude-3-5-sonnet-20240620-v1:0", + "bedrock/us-gov-east-1/anthropic.claude-3-5-sonnet-20240620-v1:0", + "bedrock/us-gov-west-1/anthropic.claude-3-5-sonnet-20240620-v1:0" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "anthropic.claude-3-5-sonnet-20240620-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "extra": { + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.00003, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7, + "cache_creation_input_token_cost_above_1hr": 0.0000075, + "cache_creation_input_token_cost_above_1hr_above_200k_tokens": 0.000015 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/invoke/anthropic.claude-3-5-sonnet-20240620-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/anthropic.claude-3-5-sonnet-20240620-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.36, + "cacheWrite": 4.5, + "input": 3.6, + "output": 18 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/anthropic.claude-3-5-sonnet-20240620-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.36, + "cacheWrite": 4.5, + "input": 3.6, + "output": 18 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "anthropic.claude-3-5-sonnet-20240620-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/invoke/anthropic.claude-3-5-sonnet-20240620-v1:0", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Anthropic via Invoke route does not currently support pdf input." + } + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/anthropic.claude-3-5-sonnet-20240620-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/anthropic.claude-3-5-sonnet-20240620-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/anthropic.claude-3-5-sonnet-20241022-v2:0", + "provider": "amazon", + "model": "anthropic.claude-3-5-sonnet-20241022-v2:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "anthropic.claude-3-5-sonnet-20241022-v2:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "extra": { + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.00003, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7, + "cache_creation_input_token_cost_above_1hr": 0.0000075, + "cache_creation_input_token_cost_above_1hr_above_200k_tokens": 0.000015 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "anthropic.claude-3-5-sonnet-20241022-v2:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/anthropic.claude-3-7-sonnet-20240620-v1:0", + "provider": "amazon", + "model": "anthropic.claude-3-7-sonnet-20240620-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/anthropic.claude-3-7-sonnet-20240620-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "anthropic.claude-3-7-sonnet-20240620-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.36, + "cacheWrite": 4.5, + "input": 3.6, + "output": 18 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "anthropic.claude-3-7-sonnet-20240620-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/anthropic.claude-3-7-sonnet-20250219-v1:0", + "provider": "amazon", + "model": "anthropic.claude-3-7-sonnet-20250219-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us-gov-west-1/anthropic.claude-3-7-sonnet-20250219-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/anthropic.claude-3-7-sonnet-20250219-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.36, + "cacheWrite": 4.5, + "input": 3.6, + "output": 18 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/anthropic.claude-3-7-sonnet-20250219-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/anthropic.claude-3-haiku-20240307-v1:0", + "provider": "amazon", + "model": "anthropic.claude-3-haiku-20240307-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/anthropic.claude-3-haiku-20240307-v1:0", + "bedrock/us-gov-east-1/anthropic.claude-3-haiku-20240307-v1:0", + "bedrock/us-gov-west-1/anthropic.claude-3-haiku-20240307-v1:0" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "anthropic.claude-3-haiku-20240307-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 0.3125, + "input": 0.25, + "output": 1.25 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/anthropic.claude-3-haiku-20240307-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/anthropic.claude-3-haiku-20240307-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "anthropic.claude-3-haiku-20240307-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/anthropic.claude-3-haiku-20240307-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/anthropic.claude-3-haiku-20240307-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/anthropic.claude-3-opus-20240229-v1:0", + "provider": "amazon", + "model": "anthropic.claude-3-opus-20240229-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/anthropic.claude-3-opus-20240229-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "anthropic.claude-3-opus-20240229-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "anthropic.claude-3-opus-20240229-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/anthropic.claude-3-sonnet-20240229-v1:0", + "provider": "amazon", + "model": "anthropic.claude-3-sonnet-20240229-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/anthropic.claude-3-sonnet-20240229-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "anthropic.claude-3-sonnet-20240229-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "anthropic.claude-3-sonnet-20240229-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/anthropic.claude-haiku-4-5-20251001-v1:0", + "provider": "amazon", + "model": "anthropic.claude-haiku-4-5-20251001-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us-gov-east-1/anthropic.claude-haiku-4-5-20251001-v1:0", + "bedrock/us-gov-west-1/anthropic.claude-haiku-4-5-20251001-v1:0" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/anthropic.claude-haiku-4-5-20251001-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.12, + "cacheWrite": 1.5, + "input": 1.2, + "output": 6 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000024 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/anthropic.claude-haiku-4-5-20251001-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.12, + "cacheWrite": 1.5, + "input": 1.2, + "output": 6 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000024 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/anthropic.claude-haiku-4-5-20251001-v1:0", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/about-aws/whats-new/2025/10/claude-4-5-haiku-anthropic-amazon-bedrock" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/anthropic.claude-haiku-4-5-20251001-v1:0", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/about-aws/whats-new/2025/10/claude-4-5-haiku-anthropic-amazon-bedrock" + } + } + ] + }, + { + "id": "amazon/anthropic.claude-instant-v1", + "provider": "amazon", + "model": "anthropic.claude-instant-v1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/anthropic.claude-instant-v1", + "bedrock/ap-northeast-1/1-month-commitment/anthropic.claude-instant-v1", + "bedrock/ap-northeast-1/6-month-commitment/anthropic.claude-instant-v1", + "bedrock/ap-northeast-1/anthropic.claude-instant-v1", + "bedrock/eu-central-1/1-month-commitment/anthropic.claude-instant-v1", + "bedrock/eu-central-1/6-month-commitment/anthropic.claude-instant-v1", + "bedrock/eu-central-1/anthropic.claude-instant-v1", + "bedrock/us-east-1/1-month-commitment/anthropic.claude-instant-v1", + "bedrock/us-east-1/6-month-commitment/anthropic.claude-instant-v1", + "bedrock/us-east-1/anthropic.claude-instant-v1", + "bedrock/us-west-2/1-month-commitment/anthropic.claude-instant-v1", + "bedrock/us-west-2/6-month-commitment/anthropic.claude-instant-v1", + "bedrock/us-west-2/anthropic.claude-instant-v1" + ], + "mergedProviderModelRecords": 13, + "limits": { + "contextTokens": 100000, + "inputTokens": 100000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "anthropic.claude-instant-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 2.4 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/1-month-commitment/anthropic.claude-instant-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.01475 + }, + "extra": { + "input_cost_per_second": 0.01475 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/6-month-commitment/anthropic.claude-instant-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.008194 + }, + "extra": { + "input_cost_per_second": 0.008194 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/anthropic.claude-instant-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.23, + "output": 7.55 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-central-1/1-month-commitment/anthropic.claude-instant-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.01635 + }, + "extra": { + "input_cost_per_second": 0.01635 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-central-1/6-month-commitment/anthropic.claude-instant-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.009083 + }, + "extra": { + "input_cost_per_second": 0.009083 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-central-1/anthropic.claude-instant-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.48, + "output": 8.38 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/1-month-commitment/anthropic.claude-instant-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.011 + }, + "extra": { + "input_cost_per_second": 0.011 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/6-month-commitment/anthropic.claude-instant-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.00611 + }, + "extra": { + "input_cost_per_second": 0.00611 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/anthropic.claude-instant-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 2.4 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/1-month-commitment/anthropic.claude-instant-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.011 + }, + "extra": { + "input_cost_per_second": 0.011 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/6-month-commitment/anthropic.claude-instant-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.00611 + }, + "extra": { + "input_cost_per_second": 0.00611 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/anthropic.claude-instant-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 2.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 13 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "anthropic.claude-instant-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/1-month-commitment/anthropic.claude-instant-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/6-month-commitment/anthropic.claude-instant-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/anthropic.claude-instant-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-central-1/1-month-commitment/anthropic.claude-instant-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-central-1/6-month-commitment/anthropic.claude-instant-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-central-1/anthropic.claude-instant-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/1-month-commitment/anthropic.claude-instant-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/6-month-commitment/anthropic.claude-instant-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/anthropic.claude-instant-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/1-month-commitment/anthropic.claude-instant-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/6-month-commitment/anthropic.claude-instant-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/anthropic.claude-instant-v1", + "mode": "chat" + } + ] + }, + { + "id": "amazon/anthropic.claude-mythos-preview", + "provider": "amazon", + "model": "anthropic.claude-mythos-preview", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/anthropic.claude-mythos-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "anthropic.claude-mythos-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "anthropic.claude-mythos-preview", + "mode": "chat" + } + ] + }, + { + "id": "amazon/anthropic.claude-sonnet-4-5-20250929-v1:0", + "provider": "amazon", + "model": "anthropic.claude-sonnet-4-5-20250929-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us-gov-east-1/anthropic.claude-sonnet-4-5-20250929-v1:0", + "bedrock/us-gov-west-1/anthropic.claude-sonnet-4-5-20250929-v1:0" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/anthropic.claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.36, + "cacheWrite": 4.5, + "input": 3.6, + "output": 18 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000072 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/anthropic.claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.36, + "cacheWrite": 4.5, + "input": 3.6, + "output": 18 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000072 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/anthropic.claude-sonnet-4-5-20250929-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/anthropic.claude-sonnet-4-5-20250929-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/anthropic.claude-v1", + "provider": "amazon", + "model": "anthropic.claude-v1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/anthropic.claude-v1", + "bedrock/ap-northeast-1/1-month-commitment/anthropic.claude-v1", + "bedrock/ap-northeast-1/6-month-commitment/anthropic.claude-v1", + "bedrock/ap-northeast-1/anthropic.claude-v1", + "bedrock/eu-central-1/1-month-commitment/anthropic.claude-v1", + "bedrock/eu-central-1/6-month-commitment/anthropic.claude-v1", + "bedrock/eu-central-1/anthropic.claude-v1", + "bedrock/us-east-1/1-month-commitment/anthropic.claude-v1", + "bedrock/us-east-1/6-month-commitment/anthropic.claude-v1", + "bedrock/us-east-1/anthropic.claude-v1", + "bedrock/us-west-2/1-month-commitment/anthropic.claude-v1", + "bedrock/us-west-2/6-month-commitment/anthropic.claude-v1", + "bedrock/us-west-2/anthropic.claude-v1" + ], + "mergedProviderModelRecords": 13, + "limits": { + "contextTokens": 100000, + "inputTokens": 100000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "toolChoice": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "anthropic.claude-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 8, + "output": 24 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/1-month-commitment/anthropic.claude-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.0455 + }, + "extra": { + "input_cost_per_second": 0.0455 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/6-month-commitment/anthropic.claude-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.02527 + }, + "extra": { + "input_cost_per_second": 0.02527 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/anthropic.claude-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 8, + "output": 24 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-central-1/1-month-commitment/anthropic.claude-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.0415 + }, + "extra": { + "input_cost_per_second": 0.0415 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-central-1/6-month-commitment/anthropic.claude-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.02305 + }, + "extra": { + "input_cost_per_second": 0.02305 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-central-1/anthropic.claude-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 8, + "output": 24 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/1-month-commitment/anthropic.claude-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.0175 + }, + "extra": { + "input_cost_per_second": 0.0175 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/6-month-commitment/anthropic.claude-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.00972 + }, + "extra": { + "input_cost_per_second": 0.00972 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/anthropic.claude-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 8, + "output": 24 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/1-month-commitment/anthropic.claude-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.0175 + }, + "extra": { + "input_cost_per_second": 0.0175 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/6-month-commitment/anthropic.claude-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.00972 + }, + "extra": { + "input_cost_per_second": 0.00972 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/anthropic.claude-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 8, + "output": 24 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 13 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "anthropic.claude-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/1-month-commitment/anthropic.claude-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/6-month-commitment/anthropic.claude-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/anthropic.claude-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-central-1/1-month-commitment/anthropic.claude-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-central-1/6-month-commitment/anthropic.claude-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-central-1/anthropic.claude-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/1-month-commitment/anthropic.claude-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/6-month-commitment/anthropic.claude-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/anthropic.claude-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/1-month-commitment/anthropic.claude-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/6-month-commitment/anthropic.claude-v1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/anthropic.claude-v1", + "mode": "chat" + } + ] + }, + { + "id": "amazon/anthropic.claude-v2:1", + "provider": "amazon", + "model": "anthropic.claude-v2:1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/anthropic.claude-v2:1", + "bedrock/ap-northeast-1/1-month-commitment/anthropic.claude-v2:1", + "bedrock/ap-northeast-1/6-month-commitment/anthropic.claude-v2:1", + "bedrock/ap-northeast-1/anthropic.claude-v2:1", + "bedrock/eu-central-1/1-month-commitment/anthropic.claude-v2:1", + "bedrock/eu-central-1/6-month-commitment/anthropic.claude-v2:1", + "bedrock/eu-central-1/anthropic.claude-v2:1", + "bedrock/us-east-1/1-month-commitment/anthropic.claude-v2:1", + "bedrock/us-east-1/6-month-commitment/anthropic.claude-v2:1", + "bedrock/us-east-1/anthropic.claude-v2:1", + "bedrock/us-west-2/1-month-commitment/anthropic.claude-v2:1", + "bedrock/us-west-2/6-month-commitment/anthropic.claude-v2:1", + "bedrock/us-west-2/anthropic.claude-v2:1" + ], + "mergedProviderModelRecords": 13, + "limits": { + "contextTokens": 100000, + "inputTokens": 100000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "anthropic.claude-v2:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 8, + "output": 24 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/1-month-commitment/anthropic.claude-v2:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.0455 + }, + "extra": { + "input_cost_per_second": 0.0455 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/6-month-commitment/anthropic.claude-v2:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.02527 + }, + "extra": { + "input_cost_per_second": 0.02527 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/anthropic.claude-v2:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 8, + "output": 24 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-central-1/1-month-commitment/anthropic.claude-v2:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.0415 + }, + "extra": { + "input_cost_per_second": 0.0415 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-central-1/6-month-commitment/anthropic.claude-v2:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.02305 + }, + "extra": { + "input_cost_per_second": 0.02305 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-central-1/anthropic.claude-v2:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 8, + "output": 24 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/1-month-commitment/anthropic.claude-v2:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.0175 + }, + "extra": { + "input_cost_per_second": 0.0175 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/6-month-commitment/anthropic.claude-v2:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.00972 + }, + "extra": { + "input_cost_per_second": 0.00972 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/anthropic.claude-v2:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 8, + "output": 24 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/1-month-commitment/anthropic.claude-v2:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.0175 + }, + "extra": { + "input_cost_per_second": 0.0175 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/6-month-commitment/anthropic.claude-v2:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.00972 + }, + "extra": { + "input_cost_per_second": 0.00972 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/anthropic.claude-v2:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 8, + "output": 24 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 13 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "anthropic.claude-v2:1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/1-month-commitment/anthropic.claude-v2:1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/6-month-commitment/anthropic.claude-v2:1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/anthropic.claude-v2:1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-central-1/1-month-commitment/anthropic.claude-v2:1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-central-1/6-month-commitment/anthropic.claude-v2:1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-central-1/anthropic.claude-v2:1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/1-month-commitment/anthropic.claude-v2:1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/6-month-commitment/anthropic.claude-v2:1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/anthropic.claude-v2:1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/1-month-commitment/anthropic.claude-v2:1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/6-month-commitment/anthropic.claude-v2:1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/anthropic.claude-v2:1", + "mode": "chat" + } + ] + }, + { + "id": "amazon/apac.anthropic.claude-3-5-sonnet-20240620-v1:0", + "provider": "amazon", + "model": "apac.anthropic.claude-3-5-sonnet-20240620-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/apac.anthropic.claude-3-5-sonnet-20240620-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "apac.anthropic.claude-3-5-sonnet-20240620-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "apac.anthropic.claude-3-5-sonnet-20240620-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/apac.anthropic.claude-3-5-sonnet-20241022-v2:0", + "provider": "amazon", + "model": "apac.anthropic.claude-3-5-sonnet-20241022-v2:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/apac.anthropic.claude-3-5-sonnet-20241022-v2:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "apac.anthropic.claude-3-5-sonnet-20241022-v2:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "apac.anthropic.claude-3-5-sonnet-20241022-v2:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/apac.anthropic.claude-3-haiku-20240307-v1:0", + "provider": "amazon", + "model": "apac.anthropic.claude-3-haiku-20240307-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/apac.anthropic.claude-3-haiku-20240307-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "apac.anthropic.claude-3-haiku-20240307-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 0.3125, + "input": 0.25, + "output": 1.25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "apac.anthropic.claude-3-haiku-20240307-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/apac.anthropic.claude-3-sonnet-20240229-v1:0", + "provider": "amazon", + "model": "apac.anthropic.claude-3-sonnet-20240229-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/apac.anthropic.claude-3-sonnet-20240229-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "apac.anthropic.claude-3-sonnet-20240229-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "apac.anthropic.claude-3-sonnet-20240229-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/claude-sonnet-4-5-20250929-v1:0", + "provider": "amazon", + "model": "claude-sonnet-4-5-20250929-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us-gov-east-1/claude-sonnet-4-5-20250929-v1:0", + "bedrock/us-gov-west-1/claude-sonnet-4-5-20250929-v1:0" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.36, + "cacheWrite": 4.5, + "input": 3.6, + "output": 18 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000072 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.36, + "cacheWrite": 4.5, + "input": 3.6, + "output": 18 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000072 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/claude-sonnet-4-5-20250929-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/claude-sonnet-4-5-20250929-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/cohere.command-light-text-v14", + "provider": "amazon", + "model": "cohere.command-light-text-v14", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/*/1-month-commitment/cohere.command-light-text-v14", + "bedrock/*/6-month-commitment/cohere.command-light-text-v14", + "bedrock/cohere.command-light-text-v14" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/*/1-month-commitment/cohere.command-light-text-v14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.001902 + }, + "extra": { + "input_cost_per_second": 0.001902 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/*/6-month-commitment/cohere.command-light-text-v14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.0011416 + }, + "extra": { + "input_cost_per_second": 0.0011416 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "cohere.command-light-text-v14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/*/1-month-commitment/cohere.command-light-text-v14", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/*/6-month-commitment/cohere.command-light-text-v14", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "cohere.command-light-text-v14", + "mode": "chat" + } + ] + }, + { + "id": "amazon/cohere.command-r-plus-v1:0", + "provider": "amazon", + "model": "cohere.command-r-plus-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/cohere.command-r-plus-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "cohere.command-r-plus-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "cohere.command-r-plus-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/cohere.command-r-v1:0", + "provider": "amazon", + "model": "cohere.command-r-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/cohere.command-r-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "cohere.command-r-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "cohere.command-r-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/cohere.command-text-v14", + "provider": "amazon", + "model": "cohere.command-text-v14", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/*/1-month-commitment/cohere.command-text-v14", + "bedrock/*/6-month-commitment/cohere.command-text-v14", + "bedrock/cohere.command-text-v14" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/*/1-month-commitment/cohere.command-text-v14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.011 + }, + "extra": { + "input_cost_per_second": 0.011 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/*/6-month-commitment/cohere.command-text-v14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.0066027 + }, + "extra": { + "input_cost_per_second": 0.0066027 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "cohere.command-text-v14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.5, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/*/1-month-commitment/cohere.command-text-v14", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/*/6-month-commitment/cohere.command-text-v14", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "cohere.command-text-v14", + "mode": "chat" + } + ] + }, + { + "id": "amazon/cohere.embed-english-v3", + "provider": "amazon", + "model": "cohere.embed-english-v3", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/cohere.embed-english-v3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "cohere.embed-english-v3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "cohere.embed-english-v3", + "mode": "embedding" + } + ] + }, + { + "id": "amazon/cohere.embed-multilingual-v3", + "provider": "amazon", + "model": "cohere.embed-multilingual-v3", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/cohere.embed-multilingual-v3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "cohere.embed-multilingual-v3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "cohere.embed-multilingual-v3", + "mode": "embedding" + } + ] + }, + { + "id": "amazon/cohere.embed-v4:0", + "provider": "amazon", + "model": "cohere.embed-v4:0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/cohere.embed-v4:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "outputVectorSize": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "cohere.embed-v4:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "cohere.embed-v4:0", + "mode": "embedding" + } + ] + }, + { + "id": "amazon/cohere.rerank-v3-5:0", + "provider": "amazon", + "model": "cohere.rerank-v3-5:0", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/cohere.rerank-v3-5:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxDocumentChunksPerQuery": 100, + "maxQueryTokens": 32000, + "maxTokens": 32000, + "maxTokensPerDocumentChunk": 512, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "cohere.rerank-v3-5:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perQuery": { + "input": 0.002 + }, + "extra": { + "max_document_chunks_per_query": 100, + "max_tokens_per_document_chunk": 512 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "cohere.rerank-v3-5:0", + "mode": "rerank" + } + ] + }, + { + "id": "amazon/deepseek.v3.2", + "provider": "amazon", + "model": "deepseek.v3.2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/ap-northeast-1/deepseek.v3.2", + "bedrock/ap-south-1/deepseek.v3.2", + "bedrock/ap-southeast-3/deepseek.v3.2", + "bedrock/eu-north-1/deepseek.v3.2", + "bedrock/sa-east-1/deepseek.v3.2", + "bedrock/us-east-1/deepseek.v3.2", + "bedrock/us-east-2/deepseek.v3.2", + "bedrock/us-west-2/deepseek.v3.2" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/deepseek.v3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.74, + "output": 2.22 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-south-1/deepseek.v3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.74, + "output": 2.22 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-southeast-3/deepseek.v3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.74, + "output": 2.22 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-north-1/deepseek.v3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.74, + "output": 2.22 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/sa-east-1/deepseek.v3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.74, + "output": 2.22 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/deepseek.v3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.62, + "output": 1.85 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-2/deepseek.v3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.62, + "output": 1.85 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/deepseek.v3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.62, + "output": 1.85 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/deepseek.v3.2", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-south-1/deepseek.v3.2", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-southeast-3/deepseek.v3.2", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-north-1/deepseek.v3.2", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/sa-east-1/deepseek.v3.2", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/deepseek.v3.2", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-2/deepseek.v3.2", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/deepseek.v3.2", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "amazon/eu.anthropic.claude-3-5-haiku-20241022-v1:0", + "provider": "amazon", + "model": "eu.anthropic.claude-3-5-haiku-20241022-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/eu.anthropic.claude-3-5-haiku-20241022-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "eu.anthropic.claude-3-5-haiku-20241022-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 0.3125, + "input": 0.25, + "output": 1.25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "eu.anthropic.claude-3-5-haiku-20241022-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/eu.anthropic.claude-3-5-sonnet-20240620-v1:0", + "provider": "amazon", + "model": "eu.anthropic.claude-3-5-sonnet-20240620-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/eu.anthropic.claude-3-5-sonnet-20240620-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "eu.anthropic.claude-3-5-sonnet-20240620-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "eu.anthropic.claude-3-5-sonnet-20240620-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/eu.anthropic.claude-3-5-sonnet-20241022-v2:0", + "provider": "amazon", + "model": "eu.anthropic.claude-3-5-sonnet-20241022-v2:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/eu.anthropic.claude-3-5-sonnet-20241022-v2:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "eu.anthropic.claude-3-5-sonnet-20241022-v2:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "eu.anthropic.claude-3-5-sonnet-20241022-v2:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/eu.anthropic.claude-3-7-sonnet-20250219-v1:0", + "provider": "amazon", + "model": "eu.anthropic.claude-3-7-sonnet-20250219-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/eu.anthropic.claude-3-7-sonnet-20250219-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "eu.anthropic.claude-3-7-sonnet-20250219-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "eu.anthropic.claude-3-7-sonnet-20250219-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/eu.anthropic.claude-3-haiku-20240307-v1:0", + "provider": "amazon", + "model": "eu.anthropic.claude-3-haiku-20240307-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/eu.anthropic.claude-3-haiku-20240307-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "eu.anthropic.claude-3-haiku-20240307-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 0.3125, + "input": 0.25, + "output": 1.25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "eu.anthropic.claude-3-haiku-20240307-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/eu.anthropic.claude-3-opus-20240229-v1:0", + "provider": "amazon", + "model": "eu.anthropic.claude-3-opus-20240229-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/eu.anthropic.claude-3-opus-20240229-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "eu.anthropic.claude-3-opus-20240229-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "eu.anthropic.claude-3-opus-20240229-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/eu.anthropic.claude-3-sonnet-20240229-v1:0", + "provider": "amazon", + "model": "eu.anthropic.claude-3-sonnet-20240229-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/eu.anthropic.claude-3-sonnet-20240229-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "eu.anthropic.claude-3-sonnet-20240229-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "eu.anthropic.claude-3-sonnet-20240229-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/eu.meta.llama3-2-1b-instruct-v1:0", + "provider": "amazon", + "model": "eu.meta.llama3-2-1b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/eu.meta.llama3-2-1b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "eu.meta.llama3-2-1b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0.13 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "eu.meta.llama3-2-1b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/eu.meta.llama3-2-3b-instruct-v1:0", + "provider": "amazon", + "model": "eu.meta.llama3-2-3b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/eu.meta.llama3-2-3b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "eu.meta.llama3-2-3b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.19, + "output": 0.19 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "eu.meta.llama3-2-3b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/eu.twelvelabs.marengo-embed-2-7-v1:0", + "provider": "amazon", + "model": "eu.twelvelabs.marengo-embed-2-7-v1:0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/eu.twelvelabs.marengo-embed-2-7-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "maxTokens": 77, + "outputTokens": 77, + "outputVectorSize": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "eu.twelvelabs.marengo-embed-2-7-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 70, + "output": 0 + }, + "perImage": { + "input": 0.0001 + }, + "perAudioSecond": { + "input": 0.00014 + }, + "perVideoSecond": { + "input": 0.0007 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "eu.twelvelabs.marengo-embed-2-7-v1:0", + "mode": "embedding" + } + ] + }, + { + "id": "amazon/eu.twelvelabs.pegasus-1-2-v1:0", + "provider": "amazon", + "model": "eu.twelvelabs.pegasus-1-2-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/eu.twelvelabs.pegasus-1-2-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "eu.twelvelabs.pegasus-1-2-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "output": 7.5 + }, + "perVideoSecond": { + "input": 0.00049 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "eu.twelvelabs.pegasus-1-2-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/meta.llama2-13b-chat-v1", + "provider": "amazon", + "model": "meta.llama2-13b-chat-v1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/meta.llama2-13b-chat-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "meta.llama2-13b-chat-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.75, + "output": 1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "meta.llama2-13b-chat-v1", + "mode": "chat" + } + ] + }, + { + "id": "amazon/meta.llama2-70b-chat-v1", + "provider": "amazon", + "model": "meta.llama2-70b-chat-v1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/meta.llama2-70b-chat-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "meta.llama2-70b-chat-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.95, + "output": 2.56 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "meta.llama2-70b-chat-v1", + "mode": "chat" + } + ] + }, + { + "id": "amazon/meta.llama3-1-405b-instruct-v1:0", + "provider": "amazon", + "model": "meta.llama3-1-405b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/meta.llama3-1-405b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "meta.llama3-1-405b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5.32, + "output": 16 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "meta.llama3-1-405b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/meta.llama3-1-70b-instruct-v1:0", + "provider": "amazon", + "model": "meta.llama3-1-70b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/meta.llama3-1-70b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 2048, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "meta.llama3-1-70b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.99, + "output": 0.99 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "meta.llama3-1-70b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/meta.llama3-1-8b-instruct-v1:0", + "provider": "amazon", + "model": "meta.llama3-1-8b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/meta.llama3-1-8b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 2048, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "meta.llama3-1-8b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.22, + "output": 0.22 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "meta.llama3-1-8b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/meta.llama3-2-11b-instruct-v1:0", + "provider": "amazon", + "model": "meta.llama3-2-11b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/meta.llama3-2-11b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "meta.llama3-2-11b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.35, + "output": 0.35 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "meta.llama3-2-11b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/meta.llama3-2-1b-instruct-v1:0", + "provider": "amazon", + "model": "meta.llama3-2-1b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/meta.llama3-2-1b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "meta.llama3-2-1b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "meta.llama3-2-1b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/meta.llama3-2-3b-instruct-v1:0", + "provider": "amazon", + "model": "meta.llama3-2-3b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/meta.llama3-2-3b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "meta.llama3-2-3b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "meta.llama3-2-3b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/meta.llama3-2-90b-instruct-v1:0", + "provider": "amazon", + "model": "meta.llama3-2-90b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/meta.llama3-2-90b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "meta.llama3-2-90b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "meta.llama3-2-90b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/meta.llama3-70b-instruct-v1:0", + "provider": "amazon", + "model": "meta.llama3-70b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/ap-south-1/meta.llama3-70b-instruct-v1:0", + "bedrock/ca-central-1/meta.llama3-70b-instruct-v1:0", + "bedrock/eu-west-1/meta.llama3-70b-instruct-v1:0", + "bedrock/eu-west-2/meta.llama3-70b-instruct-v1:0", + "bedrock/meta.llama3-70b-instruct-v1:0", + "bedrock/sa-east-1/meta.llama3-70b-instruct-v1:0", + "bedrock/us-east-1/meta.llama3-70b-instruct-v1:0", + "bedrock/us-gov-east-1/meta.llama3-70b-instruct-v1:0", + "bedrock/us-gov-west-1/meta.llama3-70b-instruct-v1:0", + "bedrock/us-west-1/meta.llama3-70b-instruct-v1:0" + ], + "mergedProviderModelRecords": 10, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-south-1/meta.llama3-70b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3.18, + "output": 4.2 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ca-central-1/meta.llama3-70b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3.05, + "output": 4.03 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-west-1/meta.llama3-70b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.86, + "output": 3.78 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-west-2/meta.llama3-70b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3.45, + "output": 4.55 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/sa-east-1/meta.llama3-70b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 4.45, + "output": 5.88 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/meta.llama3-70b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.65, + "output": 3.5 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/meta.llama3-70b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.65, + "output": 3.5 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/meta.llama3-70b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.65, + "output": 3.5 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-1/meta.llama3-70b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.65, + "output": 3.5 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "meta.llama3-70b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.65, + "output": 3.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 10 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-south-1/meta.llama3-70b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ca-central-1/meta.llama3-70b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-west-1/meta.llama3-70b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-west-2/meta.llama3-70b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/sa-east-1/meta.llama3-70b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/meta.llama3-70b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/meta.llama3-70b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/meta.llama3-70b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-1/meta.llama3-70b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "meta.llama3-70b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/meta.llama3-8b-instruct-v1:0", + "provider": "amazon", + "model": "meta.llama3-8b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/ap-south-1/meta.llama3-8b-instruct-v1:0", + "bedrock/ca-central-1/meta.llama3-8b-instruct-v1:0", + "bedrock/eu-west-1/meta.llama3-8b-instruct-v1:0", + "bedrock/eu-west-2/meta.llama3-8b-instruct-v1:0", + "bedrock/meta.llama3-8b-instruct-v1:0", + "bedrock/sa-east-1/meta.llama3-8b-instruct-v1:0", + "bedrock/us-east-1/meta.llama3-8b-instruct-v1:0", + "bedrock/us-gov-east-1/meta.llama3-8b-instruct-v1:0", + "bedrock/us-gov-west-1/meta.llama3-8b-instruct-v1:0", + "bedrock/us-west-1/meta.llama3-8b-instruct-v1:0" + ], + "mergedProviderModelRecords": 10, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-south-1/meta.llama3-8b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 0.72 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ca-central-1/meta.llama3-8b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.35, + "output": 0.69 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-west-1/meta.llama3-8b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.32, + "output": 0.65 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-west-2/meta.llama3-8b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.39, + "output": 0.78 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/sa-east-1/meta.llama3-8b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.01 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/meta.llama3-8b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/meta.llama3-8b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 2.65 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/meta.llama3-8b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 2.65 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-1/meta.llama3-8b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "meta.llama3-8b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 10 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-south-1/meta.llama3-8b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ca-central-1/meta.llama3-8b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-west-1/meta.llama3-8b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-west-2/meta.llama3-8b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/sa-east-1/meta.llama3-8b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/meta.llama3-8b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-east-1/meta.llama3-8b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-gov-west-1/meta.llama3-8b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-1/meta.llama3-8b-instruct-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "meta.llama3-8b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/minimax.minimax-m2.1", + "provider": "amazon", + "model": "minimax.minimax-m2.1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/ap-northeast-1/minimax.minimax-m2.1", + "bedrock/ap-south-1/minimax.minimax-m2.1", + "bedrock/ap-southeast-3/minimax.minimax-m2.1", + "bedrock/eu-central-1/minimax.minimax-m2.1", + "bedrock/eu-north-1/minimax.minimax-m2.1", + "bedrock/eu-south-1/minimax.minimax-m2.1", + "bedrock/eu-west-1/minimax.minimax-m2.1", + "bedrock/eu-west-2/minimax.minimax-m2.1", + "bedrock/sa-east-1/minimax.minimax-m2.1", + "bedrock/us-east-1/minimax.minimax-m2.1", + "bedrock/us-east-2/minimax.minimax-m2.1", + "bedrock/us-west-2/minimax.minimax-m2.1" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 196000, + "inputTokens": 196000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/minimax.minimax-m2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-south-1/minimax.minimax-m2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-southeast-3/minimax.minimax-m2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-central-1/minimax.minimax-m2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-north-1/minimax.minimax-m2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-south-1/minimax.minimax-m2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-west-1/minimax.minimax-m2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-west-2/minimax.minimax-m2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.47, + "output": 1.86 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/sa-east-1/minimax.minimax-m2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/minimax.minimax-m2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-2/minimax.minimax-m2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/minimax.minimax-m2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/minimax.minimax-m2.1", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-south-1/minimax.minimax-m2.1", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-southeast-3/minimax.minimax-m2.1", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-central-1/minimax.minimax-m2.1", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-north-1/minimax.minimax-m2.1", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-south-1/minimax.minimax-m2.1", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-west-1/minimax.minimax-m2.1", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-west-2/minimax.minimax-m2.1", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/sa-east-1/minimax.minimax-m2.1", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/minimax.minimax-m2.1", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-2/minimax.minimax-m2.1", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/minimax.minimax-m2.1", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "amazon/minimax.minimax-m2.5", + "provider": "amazon", + "model": "minimax.minimax-m2.5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/ap-northeast-1/minimax.minimax-m2.5", + "bedrock/ap-south-1/minimax.minimax-m2.5", + "bedrock/ap-southeast-2/minimax.minimax-m2.5", + "bedrock/ap-southeast-3/minimax.minimax-m2.5", + "bedrock/eu-central-1/minimax.minimax-m2.5", + "bedrock/eu-north-1/minimax.minimax-m2.5", + "bedrock/eu-south-1/minimax.minimax-m2.5", + "bedrock/eu-west-1/minimax.minimax-m2.5", + "bedrock/eu-west-2/minimax.minimax-m2.5", + "bedrock/sa-east-1/minimax.minimax-m2.5", + "bedrock/us-east-1/minimax.minimax-m2.5", + "bedrock/us-east-2/minimax.minimax-m2.5", + "bedrock/us-west-2/minimax.minimax-m2.5" + ], + "mergedProviderModelRecords": 13, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/minimax.minimax-m2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-south-1/minimax.minimax-m2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-southeast-2/minimax.minimax-m2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.309, + "output": 1.236 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-southeast-3/minimax.minimax-m2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-central-1/minimax.minimax-m2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-north-1/minimax.minimax-m2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-south-1/minimax.minimax-m2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-west-1/minimax.minimax-m2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-west-2/minimax.minimax-m2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.47, + "output": 1.86 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/sa-east-1/minimax.minimax-m2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.36, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/minimax.minimax-m2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-2/minimax.minimax-m2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/minimax.minimax-m2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 13 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/minimax.minimax-m2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-south-1/minimax.minimax-m2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-southeast-2/minimax.minimax-m2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-southeast-3/minimax.minimax-m2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-central-1/minimax.minimax-m2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-north-1/minimax.minimax-m2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-south-1/minimax.minimax-m2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-west-1/minimax.minimax-m2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-west-2/minimax.minimax-m2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/sa-east-1/minimax.minimax-m2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/minimax.minimax-m2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-2/minimax.minimax-m2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/minimax.minimax-m2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "amazon/mistral.mistral-7b-instruct-v0:2", + "provider": "amazon", + "model": "mistral.mistral-7b-instruct-v0:2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/eu-west-3/mistral.mistral-7b-instruct-v0:2", + "bedrock/us-east-1/mistral.mistral-7b-instruct-v0:2", + "bedrock/us-west-2/mistral.mistral-7b-instruct-v0:2" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-west-3/mistral.mistral-7b-instruct-v0:2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.26 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/mistral.mistral-7b-instruct-v0:2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/mistral.mistral-7b-instruct-v0:2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-west-3/mistral.mistral-7b-instruct-v0:2", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/mistral.mistral-7b-instruct-v0:2", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/mistral.mistral-7b-instruct-v0:2", + "mode": "chat" + } + ] + }, + { + "id": "amazon/mistral.mistral-large-2402-v1:0", + "provider": "amazon", + "model": "mistral.mistral-large-2402-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/eu-west-3/mistral.mistral-large-2402-v1:0", + "bedrock/us-east-1/mistral.mistral-large-2402-v1:0", + "bedrock/us-west-2/mistral.mistral-large-2402-v1:0" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-west-3/mistral.mistral-large-2402-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10.4, + "output": 31.2 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/mistral.mistral-large-2402-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 8, + "output": 24 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/mistral.mistral-large-2402-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 8, + "output": 24 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-west-3/mistral.mistral-large-2402-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/mistral.mistral-large-2402-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/mistral.mistral-large-2402-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/mistral.mixtral-8x7b-instruct-v0:1", + "provider": "amazon", + "model": "mistral.mixtral-8x7b-instruct-v0:1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/eu-west-3/mistral.mixtral-8x7b-instruct-v0:1", + "bedrock/us-east-1/mistral.mixtral-8x7b-instruct-v0:1", + "bedrock/us-west-2/mistral.mixtral-8x7b-instruct-v0:1" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-west-3/mistral.mixtral-8x7b-instruct-v0:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.59, + "output": 0.91 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/mistral.mixtral-8x7b-instruct-v0:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.45, + "output": 0.7 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/mistral.mixtral-8x7b-instruct-v0:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.45, + "output": 0.7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-west-3/mistral.mixtral-8x7b-instruct-v0:1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/mistral.mixtral-8x7b-instruct-v0:1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/mistral.mixtral-8x7b-instruct-v0:1", + "mode": "chat" + } + ] + }, + { + "id": "amazon/moonshotai.kimi-k2-thinking", + "provider": "amazon", + "model": "moonshotai.kimi-k2-thinking", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/ap-northeast-1/moonshotai.kimi-k2-thinking", + "bedrock/ap-south-1/moonshotai.kimi-k2-thinking", + "bedrock/moonshotai.kimi-k2-thinking", + "bedrock/sa-east-1/moonshotai.kimi-k2-thinking", + "bedrock/us-east-1/moonshotai.kimi-k2-thinking", + "bedrock/us-east-2/moonshotai.kimi-k2-thinking", + "bedrock/us-west-2/moonshotai.kimi-k2-thinking" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/moonshotai.kimi-k2-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.73, + "output": 3.03 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-south-1/moonshotai.kimi-k2-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.71, + "output": 2.94 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/moonshotai.kimi-k2-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.73, + "output": 3.03 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/sa-east-1/moonshotai.kimi-k2-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.73, + "output": 3.03 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/moonshotai.kimi-k2-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-2/moonshotai.kimi-k2-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/moonshotai.kimi-k2-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/moonshotai.kimi-k2-thinking", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-south-1/moonshotai.kimi-k2-thinking", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/moonshotai.kimi-k2-thinking", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/sa-east-1/moonshotai.kimi-k2-thinking", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/moonshotai.kimi-k2-thinking", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-2/moonshotai.kimi-k2-thinking", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/moonshotai.kimi-k2-thinking", + "mode": "chat" + } + ] + }, + { + "id": "amazon/moonshotai.kimi-k2.5", + "provider": "amazon", + "model": "moonshotai.kimi-k2.5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/ap-northeast-1/moonshotai.kimi-k2.5", + "bedrock/ap-south-1/moonshotai.kimi-k2.5", + "bedrock/ap-southeast-3/moonshotai.kimi-k2.5", + "bedrock/eu-north-1/moonshotai.kimi-k2.5", + "bedrock/moonshotai.kimi-k2.5", + "bedrock/sa-east-1/moonshotai.kimi-k2.5", + "bedrock/us-east-1/moonshotai.kimi-k2.5", + "bedrock/us-east-2/moonshotai.kimi-k2.5", + "bedrock/us-west-2/moonshotai.kimi-k2.5" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": true, + "vision": true, + "supports1MContext": false, + "reasoning": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/moonshotai.kimi-k2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 3.6 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-south-1/moonshotai.kimi-k2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 3.6 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-southeast-3/moonshotai.kimi-k2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 3.6 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-north-1/moonshotai.kimi-k2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 3.6 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/moonshotai.kimi-k2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 3.03 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/sa-east-1/moonshotai.kimi-k2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 3.6 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/moonshotai.kimi-k2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-2/moonshotai.kimi-k2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/moonshotai.kimi-k2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/moonshotai.kimi-k2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-south-1/moonshotai.kimi-k2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-southeast-3/moonshotai.kimi-k2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-north-1/moonshotai.kimi-k2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/moonshotai.kimi-k2.5", + "mode": "chat", + "metadata": { + "source": "https://platform.moonshot.ai/docs/guide/kimi-k2-5-quickstart" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/sa-east-1/moonshotai.kimi-k2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/moonshotai.kimi-k2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-2/moonshotai.kimi-k2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/moonshotai.kimi-k2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "amazon/nova-2", + "provider": "amazon", + "model": "nova-2", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/nova-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/nova-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00007167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/nova-2", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0043/60 seconds = $0.00007167 per second", + "original_pricing_per_minute": 0.0043 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "amazon/nova-2-atc", + "provider": "amazon", + "model": "nova-2-atc", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/nova-2-atc" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/nova-2-atc", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00007167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/nova-2-atc", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0043/60 seconds = $0.00007167 per second", + "original_pricing_per_minute": 0.0043 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "amazon/nova-2-automotive", + "provider": "amazon", + "model": "nova-2-automotive", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/nova-2-automotive" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/nova-2-automotive", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00007167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/nova-2-automotive", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0043/60 seconds = $0.00007167 per second", + "original_pricing_per_minute": 0.0043 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "amazon/nova-2-conversationalai", + "provider": "amazon", + "model": "nova-2-conversationalai", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/nova-2-conversationalai" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/nova-2-conversationalai", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00007167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/nova-2-conversationalai", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0043/60 seconds = $0.00007167 per second", + "original_pricing_per_minute": 0.0043 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "amazon/nova-2-drivethru", + "provider": "amazon", + "model": "nova-2-drivethru", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/nova-2-drivethru" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/nova-2-drivethru", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00007167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/nova-2-drivethru", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0043/60 seconds = $0.00007167 per second", + "original_pricing_per_minute": 0.0043 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "amazon/nova-2-finance", + "provider": "amazon", + "model": "nova-2-finance", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/nova-2-finance" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/nova-2-finance", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00007167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/nova-2-finance", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0043/60 seconds = $0.00007167 per second", + "original_pricing_per_minute": 0.0043 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "amazon/nova-2-general", + "provider": "amazon", + "model": "nova-2-general", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/nova-2-general" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/nova-2-general", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00007167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/nova-2-general", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0043/60 seconds = $0.00007167 per second", + "original_pricing_per_minute": 0.0043 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "amazon/nova-2-lite", + "provider": "amazon", + "model": "nova-2-lite", + "displayName": "Nova 2 Lite", + "family": "nova", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/amazon/nova-2-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 1000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "amazon/nova-2-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nova 2 Lite" + ], + "families": [ + "nova" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-12-01", + "lastUpdated": "2024-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "amazon/nova-2-lite", + "modelKey": "amazon/nova-2-lite", + "displayName": "Nova 2 Lite", + "family": "nova", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-12-01", + "openWeights": false, + "releaseDate": "2024-12-01", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "amazon/nova-2-lite-v1", + "provider": "amazon", + "model": "nova-2-lite-v1", + "displayName": "Amazon: Nova 2 Lite", + "family": "nova", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "nova", + "openrouter" + ], + "aliases": [ + "kilo/amazon/nova-2-lite-v1", + "nano-gpt/amazon/nova-2-lite-v1", + "nova/nova-2-lite-v1", + "openrouter/amazon/nova-2-lite-v1" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 65535, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "amazon/nova-2-lite-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "amazon/nova-2-lite-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5099999999999999, + "output": 4.25 + } + }, + { + "source": "models.dev", + "provider": "nova", + "model": "nova-2-lite-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0, + "reasoningOutput": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "amazon/nova-2-lite-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "amazon/nova-2-lite-v1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Amazon Nova 2 Lite", + "Amazon: Nova 2 Lite", + "Nova 2 Lite" + ], + "families": [ + "nova", + "nova-lite" + ], + "releaseDate": "2024-12-01", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "amazon/nova-2-lite-v1", + "modelKey": "amazon/nova-2-lite-v1", + "displayName": "Amazon: Nova 2 Lite", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "amazon/nova-2-lite-v1", + "modelKey": "amazon/nova-2-lite-v1", + "displayName": "Amazon Nova 2 Lite", + "family": "nova", + "metadata": { + "lastUpdated": "2024-12-03", + "openWeights": false, + "releaseDate": "2024-12-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nova", + "providerName": "Nova", + "providerApi": "https://api.nova.amazon.com/v1", + "providerDoc": "https://nova.amazon.com/dev/documentation", + "model": "nova-2-lite-v1", + "modelKey": "nova-2-lite-v1", + "displayName": "Nova 2 Lite", + "family": "nova-lite", + "metadata": { + "lastUpdated": "2025-12-01", + "openWeights": false, + "releaseDate": "2025-12-01", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "amazon/nova-2-lite-v1", + "modelKey": "amazon/nova-2-lite-v1", + "displayName": "Nova 2 Lite", + "family": "nova", + "metadata": { + "lastUpdated": "2025-12-02", + "openWeights": false, + "releaseDate": "2025-12-02" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "amazon/nova-2-lite-v1", + "displayName": "Amazon: Nova 2 Lite", + "metadata": { + "canonicalSlug": "amazon/nova-2-lite-v1", + "createdAt": "2025-12-02T17:31:12.000Z", + "links": { + "details": "/api/v1/models/amazon/nova-2-lite-v1/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Nova", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 65535, + "is_moderated": true + } + } + } + ] + }, + { + "id": "amazon/nova-2-meeting", + "provider": "amazon", + "model": "nova-2-meeting", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/nova-2-meeting" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/nova-2-meeting", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00007167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/nova-2-meeting", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0043/60 seconds = $0.00007167 per second", + "original_pricing_per_minute": 0.0043 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "amazon/nova-2-phonecall", + "provider": "amazon", + "model": "nova-2-phonecall", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/nova-2-phonecall" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/nova-2-phonecall", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00007167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/nova-2-phonecall", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0043/60 seconds = $0.00007167 per second", + "original_pricing_per_minute": 0.0043 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "amazon/nova-2-pro-v1", + "provider": "amazon", + "model": "nova-2-pro-v1", + "displayName": "Nova 2 Pro", + "family": "nova-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "nova" + ], + "aliases": [ + "nova/nova-2-pro-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nova", + "model": "nova-2-pro-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0, + "reasoningOutput": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nova 2 Pro" + ], + "families": [ + "nova-pro" + ], + "releaseDate": "2025-12-03", + "lastUpdated": "2026-01-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nova", + "providerName": "Nova", + "providerApi": "https://api.nova.amazon.com/v1", + "providerDoc": "https://nova.amazon.com/dev/documentation", + "model": "nova-2-pro-v1", + "modelKey": "nova-2-pro-v1", + "displayName": "Nova 2 Pro", + "family": "nova-pro", + "metadata": { + "lastUpdated": "2026-01-03", + "openWeights": false, + "releaseDate": "2025-12-03" + } + } + ] + }, + { + "id": "amazon/nova-2-video", + "provider": "amazon", + "model": "nova-2-video", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/nova-2-video" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/nova-2-video", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00007167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/nova-2-video", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0043/60 seconds = $0.00007167 per second", + "original_pricing_per_minute": 0.0043 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "amazon/nova-2-voicemail", + "provider": "amazon", + "model": "nova-2-voicemail", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/nova-2-voicemail" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/nova-2-voicemail", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00007167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/nova-2-voicemail", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0043/60 seconds = $0.00007167 per second", + "original_pricing_per_minute": 0.0043 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "amazon/nova-3", + "provider": "amazon", + "model": "nova-3", + "displayName": "Deepgram Nova 3", + "family": "nova", + "mode": "audio_transcription", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway", + "deepgram" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/deepgram/nova-3", + "deepgram/nova-3" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": true, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/deepgram/nova-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/nova-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00007167 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Deepgram Nova 3" + ], + "families": [ + "nova" + ], + "modes": [ + "audio_transcription" + ], + "releaseDate": "2025-11-14", + "lastUpdated": "2025-11-14", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/deepgram/nova-3", + "modelKey": "workers-ai/@cf/deepgram/nova-3", + "displayName": "Deepgram Nova 3", + "family": "nova", + "metadata": { + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/nova-3", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0043/60 seconds = $0.00007167 per second", + "original_pricing_per_minute": 0.0043 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "amazon/nova-3-general", + "provider": "amazon", + "model": "nova-3-general", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/nova-3-general" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/nova-3-general", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00007167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/nova-3-general", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0043/60 seconds = $0.00007167 per second", + "original_pricing_per_minute": 0.0043 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "amazon/nova-3-medical", + "provider": "amazon", + "model": "nova-3-medical", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/nova-3-medical" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/nova-3-medical", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00008667 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/nova-3-medical", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0052/60 seconds = $0.00008667 per second (multilingual)", + "original_pricing_per_minute": 0.0052 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "amazon/nova-general", + "provider": "amazon", + "model": "nova-general", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/nova-general" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/nova-general", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00007167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/nova-general", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0043/60 seconds = $0.00007167 per second", + "original_pricing_per_minute": 0.0043 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "amazon/nova-lite", + "provider": "amazon", + "model": "nova-lite", + "displayName": "Nova Lite", + "family": "nova-lite", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "vercel/amazon/nova-lite", + "vercel_ai_gateway/amazon/nova-lite" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 300000, + "inputTokens": 300000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "amazon/nova-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.06, + "output": 0.24 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/amazon/nova-lite", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.24 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nova Lite" + ], + "families": [ + "nova-lite" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-12-03", + "lastUpdated": "2024-12-03", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "amazon/nova-lite", + "modelKey": "amazon/nova-lite", + "displayName": "Nova Lite", + "family": "nova-lite", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-12-03", + "openWeights": false, + "releaseDate": "2024-12-03" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/amazon/nova-lite", + "mode": "chat" + } + ] + }, + { + "id": "amazon/nova-lite-v1", + "provider": "amazon", + "model": "nova-lite-v1", + "displayName": "Amazon: Nova Lite 1.0", + "family": "nova-lite", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "amazon_nova", + "kilo", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "amazon_nova/amazon-nova/nova-lite-v1", + "kilo/amazon/nova-lite-v1", + "nano-gpt/amazon/nova-lite-v1", + "openrouter/amazon/nova-lite-v1" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 300000, + "inputTokens": 300000, + "maxTokens": 10000, + "outputTokens": 10000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "amazon/nova-lite-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.06, + "output": 0.24 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "amazon/nova-lite-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0595, + "output": 0.238 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "amazon/nova-lite-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.06, + "output": 0.24 + } + }, + { + "source": "litellm", + "provider": "amazon_nova", + "model": "amazon-nova/nova-lite-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.24 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "amazon/nova-lite-v1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.24 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Amazon Nova Lite 1.0", + "Amazon: Nova Lite 1.0", + "Nova Lite 1.0" + ], + "families": [ + "nova-lite" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10-31", + "releaseDate": "2024-12-06", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "amazon/nova-lite-v1", + "modelKey": "amazon/nova-lite-v1", + "displayName": "Amazon: Nova Lite 1.0", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "amazon/nova-lite-v1", + "modelKey": "amazon/nova-lite-v1", + "displayName": "Amazon Nova Lite 1.0", + "family": "nova-lite", + "metadata": { + "lastUpdated": "2024-12-03", + "openWeights": false, + "releaseDate": "2024-12-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "amazon/nova-lite-v1", + "modelKey": "amazon/nova-lite-v1", + "displayName": "Nova Lite 1.0", + "family": "nova-lite", + "metadata": { + "knowledgeCutoff": "2024-10-31", + "lastUpdated": "2024-12-05", + "openWeights": false, + "releaseDate": "2024-12-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "amazon_nova", + "model": "amazon-nova/nova-lite-v1", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "amazon/nova-lite-v1", + "displayName": "Amazon: Nova Lite 1.0", + "metadata": { + "canonicalSlug": "amazon/nova-lite-v1", + "createdAt": "2024-12-05T22:22:43.000Z", + "knowledgeCutoff": "2024-10-31", + "links": { + "details": "/api/v1/models/amazon/nova-lite-v1/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Nova", + "topProvider": { + "context_length": 300000, + "max_completion_tokens": 5120, + "is_moderated": true + } + } + } + ] + }, + { + "id": "amazon/nova-micro", + "provider": "amazon", + "model": "nova-micro", + "displayName": "Nova Micro", + "family": "nova-micro", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "vercel/amazon/nova-micro", + "vercel_ai_gateway/amazon/nova-micro" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "amazon/nova-micro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.00875, + "input": 0.035, + "output": 0.14 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/amazon/nova-micro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.035, + "output": 0.14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nova Micro" + ], + "families": [ + "nova-micro" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-12-03", + "lastUpdated": "2024-12-03", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "amazon/nova-micro", + "modelKey": "amazon/nova-micro", + "displayName": "Nova Micro", + "family": "nova-micro", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-12-03", + "openWeights": false, + "releaseDate": "2024-12-03" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/amazon/nova-micro", + "mode": "chat" + } + ] + }, + { + "id": "amazon/nova-micro-v1", + "provider": "amazon", + "model": "nova-micro-v1", + "displayName": "Amazon: Nova Micro 1.0", + "family": "nova-micro", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "amazon_nova", + "kilo", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "amazon_nova/amazon-nova/nova-micro-v1", + "kilo/amazon/nova-micro-v1", + "nano-gpt/amazon/nova-micro-v1", + "openrouter/amazon/nova-micro-v1" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 10000, + "outputTokens": 10000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "amazon/nova-micro-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.035, + "output": 0.14 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "amazon/nova-micro-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0357, + "output": 0.1394 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "amazon/nova-micro-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.035, + "output": 0.14 + } + }, + { + "source": "litellm", + "provider": "amazon_nova", + "model": "amazon-nova/nova-micro-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.035, + "output": 0.14 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "amazon/nova-micro-v1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.035, + "output": 0.14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Amazon Nova Micro 1.0", + "Amazon: Nova Micro 1.0", + "Nova Micro 1.0" + ], + "families": [ + "nova-micro" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10-31", + "releaseDate": "2024-12-06", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "amazon/nova-micro-v1", + "modelKey": "amazon/nova-micro-v1", + "displayName": "Amazon: Nova Micro 1.0", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "amazon/nova-micro-v1", + "modelKey": "amazon/nova-micro-v1", + "displayName": "Amazon Nova Micro 1.0", + "family": "nova-micro", + "metadata": { + "lastUpdated": "2024-12-03", + "openWeights": false, + "releaseDate": "2024-12-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "amazon/nova-micro-v1", + "modelKey": "amazon/nova-micro-v1", + "displayName": "Nova Micro 1.0", + "family": "nova-micro", + "metadata": { + "knowledgeCutoff": "2024-10-31", + "lastUpdated": "2024-12-05", + "openWeights": false, + "releaseDate": "2024-12-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "amazon_nova", + "model": "amazon-nova/nova-micro-v1", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "amazon/nova-micro-v1", + "displayName": "Amazon: Nova Micro 1.0", + "metadata": { + "canonicalSlug": "amazon/nova-micro-v1", + "createdAt": "2024-12-05T22:20:37.000Z", + "knowledgeCutoff": "2024-10-31", + "links": { + "details": "/api/v1/models/amazon/nova-micro-v1/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Nova", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 5120, + "is_moderated": true + } + } + } + ] + }, + { + "id": "amazon/nova-phonecall", + "provider": "amazon", + "model": "nova-phonecall", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/nova-phonecall" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/nova-phonecall", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00007167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/nova-phonecall", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0043/60 seconds = $0.00007167 per second", + "original_pricing_per_minute": 0.0043 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "amazon/nova-premier-v1", + "provider": "amazon", + "model": "nova-premier-v1", + "displayName": "Amazon: Nova Premier 1.0", + "family": "nova", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "amazon_nova", + "kilo", + "openrouter" + ], + "aliases": [ + "amazon_nova/amazon-nova/nova-premier-v1", + "kilo/amazon/nova-premier-v1", + "openrouter/amazon/nova-premier-v1" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 10000, + "outputTokens": 32000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "amazon/nova-premier-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 12.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "amazon/nova-premier-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.625, + "input": 2.5, + "output": 12.5 + } + }, + { + "source": "litellm", + "provider": "amazon_nova", + "model": "amazon-nova/nova-premier-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 12.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "amazon/nova-premier-v1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.625, + "input": 2.5, + "output": 12.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Amazon: Nova Premier 1.0", + "Nova Premier 1.0" + ], + "families": [ + "nova" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-11-01", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "amazon/nova-premier-v1", + "modelKey": "amazon/nova-premier-v1", + "displayName": "Amazon: Nova Premier 1.0", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "amazon/nova-premier-v1", + "modelKey": "amazon/nova-premier-v1", + "displayName": "Nova Premier 1.0", + "family": "nova", + "metadata": { + "lastUpdated": "2025-10-31", + "openWeights": false, + "releaseDate": "2025-10-31" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "amazon_nova", + "model": "amazon-nova/nova-premier-v1", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "amazon/nova-premier-v1", + "displayName": "Amazon: Nova Premier 1.0", + "metadata": { + "canonicalSlug": "amazon/nova-premier-v1", + "createdAt": "2025-10-31T22:38:52.000Z", + "links": { + "details": "/api/v1/models/amazon/nova-premier-v1/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Nova", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 32000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "amazon/nova-pro", + "provider": "amazon", + "model": "nova-pro", + "displayName": "Nova Pro", + "family": "nova-pro", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "vercel/amazon/nova-pro", + "vercel_ai_gateway/amazon/nova-pro" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 300000, + "inputTokens": 300000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "amazon/nova-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.8, + "output": 3.2 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/amazon/nova-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 3.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nova Pro" + ], + "families": [ + "nova-pro" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-12-03", + "lastUpdated": "2024-12-03", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "amazon/nova-pro", + "modelKey": "amazon/nova-pro", + "displayName": "Nova Pro", + "family": "nova-pro", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-12-03", + "openWeights": false, + "releaseDate": "2024-12-03" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/amazon/nova-pro", + "mode": "chat" + } + ] + }, + { + "id": "amazon/nova-pro-v1", + "provider": "amazon", + "model": "nova-pro-v1", + "displayName": "Nova Pro 1.0", + "family": "nova-pro", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "amazon_nova", + "cortecs", + "kilo", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "amazon_nova/amazon-nova/nova-pro-v1", + "cortecs/nova-pro-v1", + "kilo/amazon/nova-pro-v1", + "nano-gpt/amazon/nova-pro-v1", + "openrouter/amazon/nova-pro-v1" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 300000, + "inputTokens": 300000, + "maxTokens": 10000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "nova-pro-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.016, + "output": 4.061 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "amazon/nova-pro-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "amazon/nova-pro-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7989999999999999, + "output": 3.1959999999999997 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "amazon/nova-pro-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 3.2 + } + }, + { + "source": "litellm", + "provider": "amazon_nova", + "model": "amazon-nova/nova-pro-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 3.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "amazon/nova-pro-v1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 3.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Amazon Nova Pro 1.0", + "Amazon: Nova Pro 1.0", + "Nova Pro 1.0" + ], + "families": [ + "nova-pro" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-12-03", + "lastUpdated": "2024-12-03", + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "nova-pro-v1", + "modelKey": "nova-pro-v1", + "displayName": "Nova Pro 1.0", + "family": "nova-pro", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-12-03", + "openWeights": false, + "releaseDate": "2024-12-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "amazon/nova-pro-v1", + "modelKey": "amazon/nova-pro-v1", + "displayName": "Amazon: Nova Pro 1.0", + "metadata": { + "lastUpdated": "2024-12-03", + "openWeights": false, + "releaseDate": "2024-12-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "amazon/nova-pro-v1", + "modelKey": "amazon/nova-pro-v1", + "displayName": "Amazon Nova Pro 1.0", + "family": "nova-pro", + "metadata": { + "lastUpdated": "2024-12-03", + "openWeights": false, + "releaseDate": "2024-12-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "amazon/nova-pro-v1", + "modelKey": "amazon/nova-pro-v1", + "displayName": "Nova Pro 1.0", + "family": "nova-pro", + "metadata": { + "knowledgeCutoff": "2024-10-31", + "lastUpdated": "2024-12-05", + "openWeights": false, + "releaseDate": "2024-12-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "amazon_nova", + "model": "amazon-nova/nova-pro-v1", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "amazon/nova-pro-v1", + "displayName": "Amazon: Nova Pro 1.0", + "metadata": { + "canonicalSlug": "amazon/nova-pro-v1", + "createdAt": "2024-12-05T22:05:03.000Z", + "knowledgeCutoff": "2024-10-31", + "links": { + "details": "/api/v1/models/amazon/nova-pro-v1/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Nova", + "topProvider": { + "context_length": 300000, + "max_completion_tokens": 5120, + "is_moderated": true + } + } + } + ] + }, + { + "id": "amazon/qwen.qwen3-coder-next", + "provider": "amazon", + "model": "qwen.qwen3-coder-next", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/ap-northeast-1/qwen.qwen3-coder-next", + "bedrock/ap-south-1/qwen.qwen3-coder-next", + "bedrock/ap-southeast-3/qwen.qwen3-coder-next", + "bedrock/eu-central-1/qwen.qwen3-coder-next", + "bedrock/eu-south-1/qwen.qwen3-coder-next", + "bedrock/eu-west-1/qwen.qwen3-coder-next", + "bedrock/eu-west-2/qwen.qwen3-coder-next", + "bedrock/sa-east-1/qwen.qwen3-coder-next", + "bedrock/us-east-1/qwen.qwen3-coder-next", + "bedrock/us-east-2/qwen.qwen3-coder-next", + "bedrock/us-west-2/qwen.qwen3-coder-next" + ], + "mergedProviderModelRecords": 11, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/qwen.qwen3-coder-next", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-south-1/qwen.qwen3-coder-next", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/ap-southeast-3/qwen.qwen3-coder-next", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-central-1/qwen.qwen3-coder-next", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-south-1/qwen.qwen3-coder-next", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-west-1/qwen.qwen3-coder-next", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/eu-west-2/qwen.qwen3-coder-next", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.78, + "output": 1.86 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/sa-east-1/qwen.qwen3-coder-next", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 1.44 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/qwen.qwen3-coder-next", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-2/qwen.qwen3-coder-next", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/qwen.qwen3-coder-next", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 11 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-northeast-1/qwen.qwen3-coder-next", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-south-1/qwen.qwen3-coder-next", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/ap-southeast-3/qwen.qwen3-coder-next", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-central-1/qwen.qwen3-coder-next", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-south-1/qwen.qwen3-coder-next", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-west-1/qwen.qwen3-coder-next", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/eu-west-2/qwen.qwen3-coder-next", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/sa-east-1/qwen.qwen3-coder-next", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/qwen.qwen3-coder-next", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-2/qwen.qwen3-coder-next", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/qwen.qwen3-coder-next", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "amazon/stability.sd3-5-large-v1:0", + "provider": "amazon", + "model": "stability.sd3-5-large-v1:0", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.sd3-5-large-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "maxTokens": 77, + "outputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.sd3-5-large-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.08 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.sd3-5-large-v1:0", + "mode": "image_generation" + } + ] + }, + { + "id": "amazon/stability.sd3-large-v1:0", + "provider": "amazon", + "model": "stability.sd3-large-v1:0", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.sd3-large-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "maxTokens": 77, + "outputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.sd3-large-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.08 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.sd3-large-v1:0", + "mode": "image_generation" + } + ] + }, + { + "id": "amazon/stability.stable-conservative-upscale-v1:0", + "provider": "amazon", + "model": "stability.stable-conservative-upscale-v1:0", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.stable-conservative-upscale-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.stable-conservative-upscale-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.4 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.stable-conservative-upscale-v1:0", + "mode": "image_edit" + } + ] + }, + { + "id": "amazon/stability.stable-creative-upscale-v1:0", + "provider": "amazon", + "model": "stability.stable-creative-upscale-v1:0", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.stable-creative-upscale-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.stable-creative-upscale-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.stable-creative-upscale-v1:0", + "mode": "image_edit" + } + ] + }, + { + "id": "amazon/stability.stable-diffusion-xl-v0", + "provider": "amazon", + "model": "stability.stable-diffusion-xl-v0", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/512-x-512/50-steps/stability.stable-diffusion-xl-v0", + "bedrock/512-x-512/max-steps/stability.stable-diffusion-xl-v0", + "bedrock/max-x-max/50-steps/stability.stable-diffusion-xl-v0", + "bedrock/max-x-max/max-steps/stability.stable-diffusion-xl-v0" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "maxTokens": 77, + "outputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "512-x-512/50-steps/stability.stable-diffusion-xl-v0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.018 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "512-x-512/max-steps/stability.stable-diffusion-xl-v0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.036 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "max-x-max/50-steps/stability.stable-diffusion-xl-v0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.036 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "max-x-max/max-steps/stability.stable-diffusion-xl-v0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.072 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "512-x-512/50-steps/stability.stable-diffusion-xl-v0", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "512-x-512/max-steps/stability.stable-diffusion-xl-v0", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "max-x-max/50-steps/stability.stable-diffusion-xl-v0", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "max-x-max/max-steps/stability.stable-diffusion-xl-v0", + "mode": "image_generation" + } + ] + }, + { + "id": "amazon/stability.stable-diffusion-xl-v1", + "provider": "amazon", + "model": "stability.stable-diffusion-xl-v1", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/1024-x-1024/50-steps/stability.stable-diffusion-xl-v1", + "bedrock/1024-x-1024/max-steps/stability.stable-diffusion-xl-v1" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "maxTokens": 77, + "outputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "1024-x-1024/50-steps/stability.stable-diffusion-xl-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "1024-x-1024/max-steps/stability.stable-diffusion-xl-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.08 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "1024-x-1024/50-steps/stability.stable-diffusion-xl-v1", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "1024-x-1024/max-steps/stability.stable-diffusion-xl-v1", + "mode": "image_generation" + } + ] + }, + { + "id": "amazon/stability.stable-fast-upscale-v1:0", + "provider": "amazon", + "model": "stability.stable-fast-upscale-v1:0", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.stable-fast-upscale-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.stable-fast-upscale-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.03 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.stable-fast-upscale-v1:0", + "mode": "image_edit" + } + ] + }, + { + "id": "amazon/stability.stable-image-control-sketch-v1:0", + "provider": "amazon", + "model": "stability.stable-image-control-sketch-v1:0", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.stable-image-control-sketch-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.stable-image-control-sketch-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.07 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.stable-image-control-sketch-v1:0", + "mode": "image_edit" + } + ] + }, + { + "id": "amazon/stability.stable-image-control-structure-v1:0", + "provider": "amazon", + "model": "stability.stable-image-control-structure-v1:0", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.stable-image-control-structure-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.stable-image-control-structure-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.07 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.stable-image-control-structure-v1:0", + "mode": "image_edit" + } + ] + }, + { + "id": "amazon/stability.stable-image-core-v1:0", + "provider": "amazon", + "model": "stability.stable-image-core-v1:0", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.stable-image-core-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "maxTokens": 77, + "outputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.stable-image-core-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.stable-image-core-v1:0", + "mode": "image_generation" + } + ] + }, + { + "id": "amazon/stability.stable-image-core-v1:1", + "provider": "amazon", + "model": "stability.stable-image-core-v1:1", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.stable-image-core-v1:1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "maxTokens": 77, + "outputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.stable-image-core-v1:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.stable-image-core-v1:1", + "mode": "image_generation" + } + ] + }, + { + "id": "amazon/stability.stable-image-erase-object-v1:0", + "provider": "amazon", + "model": "stability.stable-image-erase-object-v1:0", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.stable-image-erase-object-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.stable-image-erase-object-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.07 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.stable-image-erase-object-v1:0", + "mode": "image_edit" + } + ] + }, + { + "id": "amazon/stability.stable-image-inpaint-v1:0", + "provider": "amazon", + "model": "stability.stable-image-inpaint-v1:0", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.stable-image-inpaint-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.stable-image-inpaint-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.07 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.stable-image-inpaint-v1:0", + "mode": "image_edit" + } + ] + }, + { + "id": "amazon/stability.stable-image-remove-background-v1:0", + "provider": "amazon", + "model": "stability.stable-image-remove-background-v1:0", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.stable-image-remove-background-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.stable-image-remove-background-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.07 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.stable-image-remove-background-v1:0", + "mode": "image_edit" + } + ] + }, + { + "id": "amazon/stability.stable-image-search-recolor-v1:0", + "provider": "amazon", + "model": "stability.stable-image-search-recolor-v1:0", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.stable-image-search-recolor-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.stable-image-search-recolor-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.07 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.stable-image-search-recolor-v1:0", + "mode": "image_edit" + } + ] + }, + { + "id": "amazon/stability.stable-image-search-replace-v1:0", + "provider": "amazon", + "model": "stability.stable-image-search-replace-v1:0", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.stable-image-search-replace-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.stable-image-search-replace-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.07 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.stable-image-search-replace-v1:0", + "mode": "image_edit" + } + ] + }, + { + "id": "amazon/stability.stable-image-style-guide-v1:0", + "provider": "amazon", + "model": "stability.stable-image-style-guide-v1:0", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.stable-image-style-guide-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.stable-image-style-guide-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.07 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.stable-image-style-guide-v1:0", + "mode": "image_edit" + } + ] + }, + { + "id": "amazon/stability.stable-image-ultra-v1:0", + "provider": "amazon", + "model": "stability.stable-image-ultra-v1:0", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.stable-image-ultra-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "maxTokens": 77, + "outputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.stable-image-ultra-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.14 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.stable-image-ultra-v1:0", + "mode": "image_generation" + } + ] + }, + { + "id": "amazon/stability.stable-image-ultra-v1:1", + "provider": "amazon", + "model": "stability.stable-image-ultra-v1:1", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.stable-image-ultra-v1:1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "maxTokens": 77, + "outputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.stable-image-ultra-v1:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.14 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.stable-image-ultra-v1:1", + "mode": "image_generation" + } + ] + }, + { + "id": "amazon/stability.stable-outpaint-v1:0", + "provider": "amazon", + "model": "stability.stable-outpaint-v1:0", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.stable-outpaint-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.stable-outpaint-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.06 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.stable-outpaint-v1:0", + "mode": "image_edit" + } + ] + }, + { + "id": "amazon/stability.stable-style-transfer-v1:0", + "provider": "amazon", + "model": "stability.stable-style-transfer-v1:0", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/stability.stable-style-transfer-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "stability.stable-style-transfer-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.08 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "stability.stable-style-transfer-v1:0", + "mode": "image_edit" + } + ] + }, + { + "id": "amazon/titan-embed-text-v2", + "provider": "amazon", + "model": "titan-embed-text-v2", + "displayName": "Titan Text Embeddings V2", + "family": "titan-embed", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "vercel/amazon/titan-embed-text-v2", + "vercel_ai_gateway/amazon/titan-embed-text-v2" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 8192, + "inputTokens": 0, + "maxTokens": 0, + "outputTokens": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/amazon/titan-embed-text-v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Titan Text Embeddings V2" + ], + "families": [ + "titan-embed" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-04-01", + "lastUpdated": "2024-04", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "amazon/titan-embed-text-v2", + "modelKey": "amazon/titan-embed-text-v2", + "displayName": "Titan Text Embeddings V2", + "family": "titan-embed", + "metadata": { + "lastUpdated": "2024-04", + "openWeights": false, + "releaseDate": "2024-04-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/amazon/titan-embed-text-v2", + "mode": "chat" + } + ] + }, + { + "id": "amazon/twelvelabs.marengo-embed-2-7-v1:0", + "provider": "amazon", + "model": "twelvelabs.marengo-embed-2-7-v1:0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/twelvelabs.marengo-embed-2-7-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "maxTokens": 77, + "outputTokens": 77, + "outputVectorSize": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "twelvelabs.marengo-embed-2-7-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 70, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "twelvelabs.marengo-embed-2-7-v1:0", + "mode": "embedding" + } + ] + }, + { + "id": "amazon/twelvelabs.pegasus-1-2-v1:0", + "provider": "amazon", + "model": "twelvelabs.pegasus-1-2-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/twelvelabs.pegasus-1-2-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "twelvelabs.pegasus-1-2-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "output": 7.5 + }, + "perVideoSecond": { + "input": 0.00049 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "twelvelabs.pegasus-1-2-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/us.amazon.nova-canvas-v1:0", + "provider": "amazon", + "model": "us.amazon.nova-canvas-v1:0", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us.amazon.nova-canvas-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2600, + "inputTokens": 2600, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageEditing": true, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "us.amazon.nova-canvas-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.06 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "us.amazon.nova-canvas-v1:0", + "mode": "image_generation" + } + ] + }, + { + "id": "amazon/us.anthropic.claude-3-5-haiku-20241022-v1:0", + "provider": "amazon", + "model": "us.anthropic.claude-3-5-haiku-20241022-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us.anthropic.claude-3-5-haiku-20241022-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us.anthropic.claude-3-5-haiku-20241022-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.8, + "output": 4 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "us.anthropic.claude-3-5-haiku-20241022-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.8, + "output": 4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us.anthropic.claude-3-5-haiku-20241022-v1:0", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "us.anthropic.claude-3-5-haiku-20241022-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/us.anthropic.claude-3-5-sonnet-20240620-v1:0", + "provider": "amazon", + "model": "us.anthropic.claude-3-5-sonnet-20240620-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us.anthropic.claude-3-5-sonnet-20240620-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "us.anthropic.claude-3-5-sonnet-20240620-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "us.anthropic.claude-3-5-sonnet-20240620-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/us.anthropic.claude-3-5-sonnet-20241022-v2:0", + "provider": "amazon", + "model": "us.anthropic.claude-3-5-sonnet-20241022-v2:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "us.anthropic.claude-3-5-sonnet-20241022-v2:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "us.anthropic.claude-3-5-sonnet-20241022-v2:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/us.anthropic.claude-3-haiku-20240307-v1:0", + "provider": "amazon", + "model": "us.anthropic.claude-3-haiku-20240307-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us.anthropic.claude-3-haiku-20240307-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "us.anthropic.claude-3-haiku-20240307-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 0.3125, + "input": 0.25, + "output": 1.25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "us.anthropic.claude-3-haiku-20240307-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/us.anthropic.claude-3-opus-20240229-v1:0", + "provider": "amazon", + "model": "us.anthropic.claude-3-opus-20240229-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us.anthropic.claude-3-opus-20240229-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "us.anthropic.claude-3-opus-20240229-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "us.anthropic.claude-3-opus-20240229-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/us.anthropic.claude-3-sonnet-20240229-v1:0", + "provider": "amazon", + "model": "us.anthropic.claude-3-sonnet-20240229-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us.anthropic.claude-3-sonnet-20240229-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "us.anthropic.claude-3-sonnet-20240229-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "us.anthropic.claude-3-sonnet-20240229-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/us.meta.llama3-1-405b-instruct-v1:0", + "provider": "amazon", + "model": "us.meta.llama3-1-405b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us.meta.llama3-1-405b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "us.meta.llama3-1-405b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5.32, + "output": 16 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "us.meta.llama3-1-405b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/us.meta.llama3-1-70b-instruct-v1:0", + "provider": "amazon", + "model": "us.meta.llama3-1-70b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us.meta.llama3-1-70b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 2048, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "us.meta.llama3-1-70b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.99, + "output": 0.99 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "us.meta.llama3-1-70b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/us.meta.llama3-1-8b-instruct-v1:0", + "provider": "amazon", + "model": "us.meta.llama3-1-8b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us.meta.llama3-1-8b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 2048, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "us.meta.llama3-1-8b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.22, + "output": 0.22 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "us.meta.llama3-1-8b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/us.meta.llama3-2-11b-instruct-v1:0", + "provider": "amazon", + "model": "us.meta.llama3-2-11b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us.meta.llama3-2-11b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "us.meta.llama3-2-11b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.35, + "output": 0.35 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "us.meta.llama3-2-11b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/us.meta.llama3-2-1b-instruct-v1:0", + "provider": "amazon", + "model": "us.meta.llama3-2-1b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us.meta.llama3-2-1b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "us.meta.llama3-2-1b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "us.meta.llama3-2-1b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/us.meta.llama3-2-3b-instruct-v1:0", + "provider": "amazon", + "model": "us.meta.llama3-2-3b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us.meta.llama3-2-3b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "us.meta.llama3-2-3b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "us.meta.llama3-2-3b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/us.meta.llama3-2-90b-instruct-v1:0", + "provider": "amazon", + "model": "us.meta.llama3-2-90b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us.meta.llama3-2-90b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "us.meta.llama3-2-90b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "us.meta.llama3-2-90b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/us.twelvelabs.marengo-embed-2-7-v1:0", + "provider": "amazon", + "model": "us.twelvelabs.marengo-embed-2-7-v1:0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us.twelvelabs.marengo-embed-2-7-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "maxTokens": 77, + "outputTokens": 77, + "outputVectorSize": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "us.twelvelabs.marengo-embed-2-7-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 70, + "output": 0 + }, + "perImage": { + "input": 0.0001 + }, + "perAudioSecond": { + "input": 0.00014 + }, + "perVideoSecond": { + "input": 0.0007 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "us.twelvelabs.marengo-embed-2-7-v1:0", + "mode": "embedding" + } + ] + }, + { + "id": "amazon/us.twelvelabs.pegasus-1-2-v1:0", + "provider": "amazon", + "model": "us.twelvelabs.pegasus-1-2-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us.twelvelabs.pegasus-1-2-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "us.twelvelabs.pegasus-1-2-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "output": 7.5 + }, + "perVideoSecond": { + "input": 0.00049 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "us.twelvelabs.pegasus-1-2-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "amazon/zai.glm-5", + "provider": "amazon", + "model": "zai.glm-5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/us-east-1/zai.glm-5", + "bedrock/us-west-2/zai.glm-5" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-east-1/zai.glm-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3.2 + } + }, + { + "source": "litellm", + "provider": "bedrock", + "model": "bedrock/us-west-2/zai.glm-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-east-1/zai.glm-5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "bedrock/us-west-2/zai.glm-5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "anthropic/claude-3-5-haiku", + "provider": "anthropic", + "model": "claude-3-5-haiku", + "displayName": "Claude Haiku 3.5 (latest)", + "family": "claude-haiku", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway", + "heroku", + "llmgateway", + "opencode", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "cloudflare-ai-gateway/anthropic/claude-3-5-haiku", + "heroku/claude-3-5-haiku", + "llmgateway/claude-3-5-haiku", + "opencode/claude-3-5-haiku", + "vertex_ai-anthropic_models/vertex_ai/claude-3-5-haiku" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "assistantPrefill": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "anthropic/claude-3-5-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.8, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "claude-3-5-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.8, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "claude-3-5-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.8, + "output": 4 + } + }, + { + "source": "litellm", + "provider": "heroku", + "model": "heroku/claude-3-5-haiku", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-5-haiku", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 3.5 Haiku", + "Claude Haiku 3.5", + "Claude Haiku 3.5 (latest)" + ], + "families": [ + "claude", + "claude-haiku" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-07-31", + "releaseDate": "2024-10-22", + "lastUpdated": "2024-10-22", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "anthropic/claude-3-5-haiku", + "modelKey": "anthropic/claude-3-5-haiku", + "displayName": "Claude Haiku 3.5 (latest)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2024-07-31", + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "claude-3-5-haiku", + "modelKey": "claude-3-5-haiku", + "displayName": "Claude 3.5 Haiku", + "family": "claude", + "status": "deprecated", + "metadata": { + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "claude-3-5-haiku", + "modelKey": "claude-3-5-haiku", + "displayName": "Claude Haiku 3.5", + "family": "claude-haiku", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-07-31", + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "heroku", + "model": "heroku/claude-3-5-haiku", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-5-haiku", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-3-5-haiku-20241022", + "provider": "anthropic", + "model": "claude-3-5-haiku-20241022", + "displayName": "Claude Haiku 3.5", + "family": "claude-haiku", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai", + "anthropic", + "nano-gpt" + ], + "aliases": [ + "302ai/claude-3-5-haiku-20241022", + "anthropic/claude-3-5-haiku-20241022", + "nano-gpt/claude-3-5-haiku-20241022" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-3-5-haiku-20241022", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-3-5-haiku-20241022", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.8, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-3-5-haiku-20241022", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 3.5 Haiku", + "Claude Haiku 3.5", + "claude-3-5-haiku-20241022" + ], + "families": [ + "claude-haiku" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-07-31", + "releaseDate": "2024-10-22", + "lastUpdated": "2024-10-22", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-3-5-haiku-20241022", + "modelKey": "claude-3-5-haiku-20241022", + "displayName": "claude-3-5-haiku-20241022", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2024-07-31", + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-3-5-haiku-20241022", + "modelKey": "claude-3-5-haiku-20241022", + "displayName": "Claude Haiku 3.5", + "family": "claude-haiku", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-07-31", + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-3-5-haiku-20241022", + "modelKey": "claude-3-5-haiku-20241022", + "displayName": "Claude 3.5 Haiku", + "metadata": { + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + } + ] + }, + { + "id": "anthropic/claude-3-5-haiku-latest", + "provider": "anthropic", + "model": "claude-3-5-haiku-latest", + "displayName": "Claude Haiku 3.5 (latest)", + "family": "claude-haiku", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai", + "anthropic" + ], + "aliases": [ + "302ai/claude-3-5-haiku-latest", + "anthropic/claude-3-5-haiku-latest" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 200000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-3-5-haiku-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-3-5-haiku-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.8, + "output": 4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Haiku 3.5 (latest)", + "claude-3-5-haiku-latest" + ], + "families": [ + "claude-haiku" + ], + "knowledgeCutoff": "2024-07-31", + "releaseDate": "2024-10-22", + "lastUpdated": "2024-10-22", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-3-5-haiku-latest", + "modelKey": "claude-3-5-haiku-latest", + "displayName": "claude-3-5-haiku-latest", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2024-07-31", + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-3-5-haiku-latest", + "modelKey": "claude-3-5-haiku-latest", + "displayName": "Claude Haiku 3.5 (latest)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2024-07-31", + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + } + ] + }, + { + "id": "anthropic/claude-3-5-haiku@20241022", + "provider": "anthropic", + "model": "claude-3-5-haiku@20241022", + "displayName": "Claude Haiku 3.5", + "family": "claude-haiku", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "google-vertex-anthropic", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "google-vertex-anthropic/claude-3-5-haiku@20241022", + "google-vertex/claude-3-5-haiku@20241022", + "vertex_ai-anthropic_models/vertex_ai/claude-3-5-haiku@20241022" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex-anthropic", + "model": "claude-3-5-haiku@20241022", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.8, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "claude-3-5-haiku@20241022", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.8, + "output": 4 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-5-haiku@20241022", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Haiku 3.5" + ], + "families": [ + "claude-haiku" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-07-31", + "releaseDate": "2024-10-22", + "lastUpdated": "2024-10-22", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex-anthropic", + "providerName": "Vertex (Anthropic)", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude", + "model": "claude-3-5-haiku@20241022", + "modelKey": "claude-3-5-haiku@20241022", + "displayName": "Claude Haiku 3.5", + "family": "claude-haiku", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-07-31", + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "claude-3-5-haiku@20241022", + "modelKey": "claude-3-5-haiku@20241022", + "displayName": "Claude Haiku 3.5", + "family": "claude-haiku", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-07-31", + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-5-haiku@20241022", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-3-5-sonnet", + "provider": "anthropic", + "model": "claude-3-5-sonnet", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake", + "vercel_ai_gateway", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "snowflake/claude-3-5-sonnet", + "vercel_ai_gateway/anthropic/claude-3-5-sonnet", + "vertex_ai-anthropic_models/vertex_ai/claude-3-5-sonnet" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false, + "assistantPrefill": true, + "toolChoice": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/claude-3-5-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-3-5-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-5-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/claude-3-5-sonnet", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-3-5-sonnet", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-5-sonnet", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-3-5-sonnet-20240620", + "provider": "anthropic", + "model": "claude-3-5-sonnet-20240620", + "displayName": "Claude Sonnet 3.5", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "anthropic" + ], + "aliases": [ + "anthropic/claude-3-5-sonnet-20240620" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-3-5-sonnet-20240620", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 3.5" + ], + "families": [ + "claude-sonnet" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-04-30", + "releaseDate": "2024-06-20", + "lastUpdated": "2024-06-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-3-5-sonnet-20240620", + "modelKey": "claude-3-5-sonnet-20240620", + "displayName": "Claude Sonnet 3.5", + "family": "claude-sonnet", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-04-30", + "lastUpdated": "2024-06-20", + "openWeights": false, + "releaseDate": "2024-06-20" + } + } + ] + }, + { + "id": "anthropic/claude-3-5-sonnet-20241022", + "provider": "anthropic", + "model": "claude-3-5-sonnet-20241022", + "displayName": "Claude Sonnet 3.5 v2", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "anthropic", + "llmgateway", + "vercel_ai_gateway" + ], + "aliases": [ + "anthropic/claude-3-5-sonnet-20241022", + "llmgateway/claude-3-5-sonnet-20241022", + "vercel_ai_gateway/anthropic/claude-3-5-sonnet-20241022" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-3-5-sonnet-20241022", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "claude-3-5-sonnet-20241022", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-3-5-sonnet-20241022", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 3.5 v2" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-04-30", + "releaseDate": "2024-10-22", + "lastUpdated": "2024-10-22", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-3-5-sonnet-20241022", + "modelKey": "claude-3-5-sonnet-20241022", + "displayName": "Claude Sonnet 3.5 v2", + "family": "claude-sonnet", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-04-30", + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "claude-3-5-sonnet-20241022", + "modelKey": "claude-3-5-sonnet-20241022", + "displayName": "Claude Sonnet 3.5 v2", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2024-04-30", + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-3-5-sonnet-20241022", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-3-5-sonnet-latest", + "provider": "anthropic", + "model": "claude-3-5-sonnet-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "heroku" + ], + "aliases": [ + "heroku/claude-3-5-sonnet-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "heroku", + "model": "heroku/claude-3-5-sonnet-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "heroku", + "model": "heroku/claude-3-5-sonnet-latest", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-3-5-sonnet@20240620", + "provider": "anthropic", + "model": "claude-3-5-sonnet@20240620", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-anthropic_models" + ], + "aliases": [ + "vertex_ai-anthropic_models/vertex_ai/claude-3-5-sonnet@20240620" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-5-sonnet@20240620", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-5-sonnet@20240620", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-3-7-sonnet", + "provider": "anthropic", + "model": "claude-3-7-sonnet", + "displayName": "Claude 3.7 Sonnet", + "family": "claude", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "heroku", + "llmgateway", + "requesty", + "snowflake", + "vercel_ai_gateway" + ], + "aliases": [ + "heroku/claude-3-7-sonnet", + "llmgateway/claude-3-7-sonnet", + "requesty/anthropic/claude-3-7-sonnet", + "snowflake/claude-3-7-sonnet", + "vercel_ai_gateway/anthropic/claude-3-7-sonnet" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "promptCaching": true, + "responseSchema": true, + "vision": true, + "assistantPrefill": true, + "computerUse": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "claude-3-7-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "anthropic/claude-3-7-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "heroku", + "model": "heroku/claude-3-7-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/claude-3-7-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-3-7-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 3.7 Sonnet", + "Claude Sonnet 3.7" + ], + "families": [ + "claude", + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-01", + "releaseDate": "2025-02-24", + "lastUpdated": "2025-02-24", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "claude-3-7-sonnet", + "modelKey": "claude-3-7-sonnet", + "displayName": "Claude 3.7 Sonnet", + "family": "claude", + "metadata": { + "lastUpdated": "2025-02-24", + "openWeights": false, + "releaseDate": "2025-02-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "anthropic/claude-3-7-sonnet", + "modelKey": "anthropic/claude-3-7-sonnet", + "displayName": "Claude Sonnet 3.7", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2024-01", + "lastUpdated": "2025-02-19", + "openWeights": false, + "releaseDate": "2025-02-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "heroku", + "model": "heroku/claude-3-7-sonnet", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/claude-3-7-sonnet", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-3-7-sonnet", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-3-7-sonnet-20250219", + "provider": "anthropic", + "model": "claude-3-7-sonnet-20250219", + "displayName": "Claude Sonnet 3.7", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "abacus", + "anthropic", + "llmgateway" + ], + "aliases": [ + "abacus/claude-3-7-sonnet-20250219", + "anthropic/claude-3-7-sonnet-20250219", + "llmgateway/claude-3-7-sonnet-20250219" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "claude-3-7-sonnet-20250219", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-3-7-sonnet-20250219", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "claude-3-7-sonnet-20250219", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-3-7-sonnet-20250219", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000006 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 3.7" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-10-31", + "releaseDate": "2025-02-19", + "lastUpdated": "2025-02-19", + "deprecationDate": "2026-02-19", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "claude-3-7-sonnet-20250219", + "modelKey": "claude-3-7-sonnet-20250219", + "displayName": "Claude Sonnet 3.7", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2024-10-31", + "lastUpdated": "2025-02-19", + "openWeights": false, + "releaseDate": "2025-02-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-3-7-sonnet-20250219", + "modelKey": "claude-3-7-sonnet-20250219", + "displayName": "Claude Sonnet 3.7", + "family": "claude-sonnet", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-10-31", + "lastUpdated": "2025-02-19", + "openWeights": false, + "releaseDate": "2025-02-19", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "claude-3-7-sonnet-20250219", + "modelKey": "claude-3-7-sonnet-20250219", + "displayName": "Claude Sonnet 3.7", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2024-10-31", + "lastUpdated": "2025-02-19", + "openWeights": false, + "releaseDate": "2025-02-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-3-7-sonnet-20250219", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-02-19" + } + } + ] + }, + { + "id": "anthropic/claude-3-7-sonnet-latest", + "provider": "anthropic", + "model": "claude-3-7-sonnet-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepinfra" + ], + "aliases": [ + "deepinfra/anthropic/claude-3-7-sonnet-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 200000, + "outputTokens": 200000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/anthropic/claude-3-7-sonnet-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.33, + "input": 3.3, + "output": 16.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/anthropic/claude-3-7-sonnet-latest", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-3-7-sonnet@20250219", + "provider": "anthropic", + "model": "claude-3-7-sonnet@20250219", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-anthropic_models" + ], + "aliases": [ + "vertex_ai-anthropic_models/vertex_ai/claude-3-7-sonnet@20250219" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-7-sonnet@20250219", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000006 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2026-05-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-7-sonnet@20250219", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-11" + } + } + ] + }, + { + "id": "anthropic/claude-3-haiku", + "provider": "anthropic", + "model": "claude-3-haiku", + "displayName": "Claude 3 Haiku", + "family": "claude", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "cloudflare-ai-gateway", + "kilo", + "openrouter", + "vercel", + "vercel_ai_gateway", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "cloudflare-ai-gateway/anthropic/claude-3-haiku", + "kilo/anthropic/claude-3-haiku", + "openrouter/anthropic/claude-3-haiku", + "vercel/anthropic/claude-3-haiku", + "vercel_ai_gateway/anthropic/claude-3-haiku", + "vertex_ai-anthropic_models/vertex_ai/claude-3-haiku" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false, + "assistantPrefill": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "anthropic/claude-3-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.3, + "input": 0.25, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "anthropic/claude-3-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.3, + "input": 0.25, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "anthropic/claude-3-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.3, + "input": 0.25, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "anthropic/claude-3-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.3, + "input": 0.25, + "output": 1.25 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-3-haiku", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 1.25 + }, + "perImage": { + "input": 0.0004 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-3-haiku", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.3, + "input": 0.25, + "output": 1.25 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-haiku", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 1.25 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "anthropic/claude-3-haiku", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.3, + "input": 0.25, + "output": 1.25 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude 3 Haiku", + "Claude 3 Haiku", + "Claude Haiku 3" + ], + "families": [ + "claude", + "claude-haiku" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2023-08-31", + "releaseDate": "2024-03-13", + "lastUpdated": "2024-03-13", + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "anthropic/claude-3-haiku", + "modelKey": "anthropic/claude-3-haiku", + "displayName": "Claude Haiku 3", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2023-08-31", + "lastUpdated": "2024-03-13", + "openWeights": false, + "releaseDate": "2024-03-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "anthropic/claude-3-haiku", + "modelKey": "anthropic/claude-3-haiku", + "displayName": "Anthropic: Claude 3 Haiku", + "metadata": { + "lastUpdated": "2024-03-07", + "openWeights": false, + "releaseDate": "2024-03-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "anthropic/claude-3-haiku", + "modelKey": "anthropic/claude-3-haiku", + "displayName": "Claude 3 Haiku", + "family": "claude", + "metadata": { + "knowledgeCutoff": "2023-08-31", + "lastUpdated": "2024-03-13", + "openWeights": false, + "releaseDate": "2024-03-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "anthropic/claude-3-haiku", + "modelKey": "anthropic/claude-3-haiku", + "displayName": "Claude Haiku 3", + "family": "claude-haiku", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2023-08-31", + "lastUpdated": "2024-03-13", + "openWeights": false, + "releaseDate": "2024-03-13" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-3-haiku", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-3-haiku", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-haiku", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "anthropic/claude-3-haiku", + "displayName": "Anthropic: Claude 3 Haiku", + "metadata": { + "canonicalSlug": "anthropic/claude-3-haiku", + "createdAt": "2024-03-13T00:00:00.000Z", + "knowledgeCutoff": "2023-08-31", + "links": { + "details": "/api/v1/models/anthropic/claude-3-haiku/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Claude", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 4096, + "is_moderated": true + } + } + } + ] + }, + { + "id": "anthropic/claude-3-haiku-20240307", + "provider": "anthropic", + "model": "claude-3-haiku-20240307", + "displayName": "Claude Haiku 3", + "family": "claude-haiku", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "anthropic", + "helicone" + ], + "aliases": [ + "anthropic/claude-3-haiku-20240307", + "helicone/claude-3-haiku-20240307" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-3-haiku-20240307", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.3, + "input": 0.25, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "claude-3-haiku-20240307", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.3, + "input": 0.25, + "output": 1.25 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-3-haiku-20240307", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.3, + "input": 0.25, + "output": 1.25 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000006 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude 3 Haiku", + "Claude Haiku 3" + ], + "families": [ + "claude-haiku" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2023-08-31", + "releaseDate": "2024-03-13", + "lastUpdated": "2024-03-13", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-3-haiku-20240307", + "modelKey": "claude-3-haiku-20240307", + "displayName": "Claude Haiku 3", + "family": "claude-haiku", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2023-08-31", + "lastUpdated": "2024-03-13", + "openWeights": false, + "releaseDate": "2024-03-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "claude-3-haiku-20240307", + "modelKey": "claude-3-haiku-20240307", + "displayName": "Anthropic: Claude 3 Haiku", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2024-03", + "lastUpdated": "2024-03-07", + "openWeights": false, + "releaseDate": "2024-03-07" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-3-haiku-20240307", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-3-haiku@20240307", + "provider": "anthropic", + "model": "claude-3-haiku@20240307", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-anthropic_models" + ], + "aliases": [ + "vertex_ai-anthropic_models/vertex_ai/claude-3-haiku@20240307" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-haiku@20240307", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 1.25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-haiku@20240307", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-3-opus", + "provider": "anthropic", + "model": "claude-3-opus", + "displayName": "Claude Opus 3", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway", + "llmgateway", + "vercel_ai_gateway", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "cloudflare-ai-gateway/anthropic/claude-3-opus", + "llmgateway/claude-3-opus", + "vercel_ai_gateway/anthropic/claude-3-opus", + "vertex_ai-anthropic_models/vertex_ai/claude-3-opus" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "assistantPrefill": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "anthropic/claude-3-opus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "claude-3-opus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "input": 15, + "output": 75 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-3-opus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-opus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 3 Opus", + "Claude Opus 3" + ], + "families": [ + "claude", + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-08-31", + "releaseDate": "2024-02-29", + "lastUpdated": "2024-02-29", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "anthropic/claude-3-opus", + "modelKey": "anthropic/claude-3-opus", + "displayName": "Claude Opus 3", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2023-08-31", + "lastUpdated": "2024-02-29", + "openWeights": false, + "releaseDate": "2024-02-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "claude-3-opus", + "modelKey": "claude-3-opus", + "displayName": "Claude 3 Opus", + "family": "claude", + "metadata": { + "lastUpdated": "2024-03-04", + "openWeights": false, + "releaseDate": "2024-03-04" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-3-opus", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-opus", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-3-opus-20240229", + "provider": "anthropic", + "model": "claude-3-opus-20240229", + "displayName": "Claude Opus 3", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "anthropic" + ], + "aliases": [ + "anthropic/claude-3-opus-20240229" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-3-opus-20240229", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-3-opus-20240229", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000006 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 3" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2023-08-31", + "releaseDate": "2024-02-29", + "lastUpdated": "2024-02-29", + "deprecationDate": "2026-05-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-3-opus-20240229", + "modelKey": "claude-3-opus-20240229", + "displayName": "Claude Opus 3", + "family": "claude-opus", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2023-08-31", + "lastUpdated": "2024-02-29", + "openWeights": false, + "releaseDate": "2024-02-29" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-3-opus-20240229", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-01" + } + } + ] + }, + { + "id": "anthropic/claude-3-opus@20240229", + "provider": "anthropic", + "model": "claude-3-opus@20240229", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-anthropic_models" + ], + "aliases": [ + "vertex_ai-anthropic_models/vertex_ai/claude-3-opus@20240229" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-opus@20240229", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-opus@20240229", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-3-sonnet", + "provider": "anthropic", + "model": "claude-3-sonnet", + "displayName": "Claude Sonnet 3", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "cloudflare-ai-gateway/anthropic/claude-3-sonnet", + "vertex_ai-anthropic_models/vertex_ai/claude-3-sonnet" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "anthropic/claude-3-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 0.3, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 3" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-08-31", + "releaseDate": "2024-03-04", + "lastUpdated": "2024-03-04", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "anthropic/claude-3-sonnet", + "modelKey": "anthropic/claude-3-sonnet", + "displayName": "Claude Sonnet 3", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2023-08-31", + "lastUpdated": "2024-03-04", + "openWeights": false, + "releaseDate": "2024-03-04" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-sonnet", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-3-sonnet-20240229", + "provider": "anthropic", + "model": "claude-3-sonnet-20240229", + "displayName": "Claude Sonnet 3", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "anthropic" + ], + "aliases": [ + "anthropic/claude-3-sonnet-20240229" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-3-sonnet-20240229", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 0.3, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 3" + ], + "families": [ + "claude-sonnet" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2023-08-31", + "releaseDate": "2024-03-04", + "lastUpdated": "2024-03-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-3-sonnet-20240229", + "modelKey": "claude-3-sonnet-20240229", + "displayName": "Claude Sonnet 3", + "family": "claude-sonnet", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2023-08-31", + "lastUpdated": "2024-03-04", + "openWeights": false, + "releaseDate": "2024-03-04" + } + } + ] + }, + { + "id": "anthropic/claude-3-sonnet@20240229", + "provider": "anthropic", + "model": "claude-3-sonnet@20240229", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-anthropic_models" + ], + "aliases": [ + "vertex_ai-anthropic_models/vertex_ai/claude-3-sonnet@20240229" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-sonnet@20240229", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-3-sonnet@20240229", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-3.5-haiku", + "provider": "anthropic", + "model": "claude-3.5-haiku", + "displayName": "Claude Haiku 3.5 (latest)", + "family": "claude-haiku", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "cloudflare-ai-gateway", + "helicone", + "kilo", + "openrouter", + "qiniu-ai", + "replicate", + "vercel", + "vercel_ai_gateway", + "zenmux" + ], + "aliases": [ + "cloudflare-ai-gateway/anthropic/claude-3.5-haiku", + "helicone/claude-3.5-haiku", + "kilo/anthropic/claude-3.5-haiku", + "openrouter/anthropic/claude-3.5-haiku", + "qiniu-ai/claude-3.5-haiku", + "replicate/anthropic/claude-3.5-haiku", + "vercel/anthropic/claude-3.5-haiku", + "vercel_ai_gateway/anthropic/claude-3.5-haiku", + "zenmux/anthropic/claude-3.5-haiku" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "anthropic/claude-3.5-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.8, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "claude-3.5-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.7999999999999999, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "anthropic/claude-3.5-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.8, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "anthropic/claude-3.5-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.8, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "anthropic/claude-3.5-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.8, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "anthropic/claude-3.5-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.8, + "output": 4 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/anthropic/claude-3.5-haiku", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 5 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-3.5-haiku", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.8, + "output": 4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "anthropic/claude-3.5-haiku", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.8, + "output": 4 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude 3.5 Haiku", + "Claude 3.5 Haiku", + "Claude Haiku 3.5", + "Claude Haiku 3.5 (latest)" + ], + "families": [ + "claude", + "claude-haiku" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-07-31", + "releaseDate": "2024-10-22", + "lastUpdated": "2024-10-22", + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "anthropic/claude-3.5-haiku", + "modelKey": "anthropic/claude-3.5-haiku", + "displayName": "Claude Haiku 3.5 (latest)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2024-07-31", + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "claude-3.5-haiku", + "modelKey": "claude-3.5-haiku", + "displayName": "Anthropic: Claude 3.5 Haiku", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "anthropic/claude-3.5-haiku", + "modelKey": "anthropic/claude-3.5-haiku", + "displayName": "Anthropic: Claude 3.5 Haiku", + "metadata": { + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "anthropic/claude-3.5-haiku", + "modelKey": "anthropic/claude-3.5-haiku", + "displayName": "Claude 3.5 Haiku", + "family": "claude", + "metadata": { + "knowledgeCutoff": "2024-07-31", + "lastUpdated": "2024-11-04", + "openWeights": false, + "releaseDate": "2024-11-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "claude-3.5-haiku", + "modelKey": "claude-3.5-haiku", + "displayName": "Claude 3.5 Haiku", + "metadata": { + "lastUpdated": "2025-08-26", + "openWeights": false, + "releaseDate": "2025-08-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "anthropic/claude-3.5-haiku", + "modelKey": "anthropic/claude-3.5-haiku", + "displayName": "Claude Haiku 3.5", + "family": "claude-haiku", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-07-31", + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "anthropic/claude-3.5-haiku", + "modelKey": "anthropic/claude-3.5-haiku", + "displayName": "Claude 3.5 Haiku", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2024-11-04", + "openWeights": false, + "releaseDate": "2024-11-04" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/anthropic/claude-3.5-haiku", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-3.5-haiku", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "anthropic/claude-3.5-haiku", + "displayName": "Anthropic: Claude 3.5 Haiku", + "metadata": { + "canonicalSlug": "anthropic/claude-3-5-haiku", + "createdAt": "2024-11-04T00:00:00.000Z", + "knowledgeCutoff": "2024-07-31", + "links": { + "details": "/api/v1/models/anthropic/claude-3-5-haiku/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Claude", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 8192, + "is_moderated": true + } + } + } + ] + }, + { + "id": "anthropic/claude-3.5-sonnet", + "provider": "anthropic", + "model": "claude-3.5-sonnet", + "displayName": "Claude Sonnet 3.5 v2", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway", + "openrouter", + "qiniu-ai", + "replicate", + "vercel_ai_gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/anthropic/claude-3.5-sonnet", + "openrouter/anthropic/claude-3.5-sonnet", + "qiniu-ai/claude-3.5-sonnet", + "replicate/anthropic/claude-3.5-sonnet", + "vercel_ai_gateway/anthropic/claude-3.5-sonnet" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8200, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "responseSchema": true, + "systemMessages": true, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "anthropic/claude-3.5-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-3.5-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/anthropic/claude-3.5-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3.75, + "output": 18.75 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-3.5-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 3.5 Sonnet", + "Claude Sonnet 3.5 v2" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04-30", + "releaseDate": "2024-10-22", + "lastUpdated": "2024-10-22", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "anthropic/claude-3.5-sonnet", + "modelKey": "anthropic/claude-3.5-sonnet", + "displayName": "Claude Sonnet 3.5 v2", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2024-04-30", + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "claude-3.5-sonnet", + "modelKey": "claude-3.5-sonnet", + "displayName": "Claude 3.5 Sonnet", + "metadata": { + "lastUpdated": "2025-09-09", + "openWeights": false, + "releaseDate": "2025-09-09" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-3.5-sonnet", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/anthropic/claude-3.5-sonnet", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-3.5-sonnet", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-3.5-sonnet-v2", + "provider": "anthropic", + "model": "claude-3.5-sonnet-v2", + "displayName": "Anthropic: Claude 3.5 Sonnet v2", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "helicone" + ], + "aliases": [ + "helicone/claude-3.5-sonnet-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "claude-3.5-sonnet-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.30000000000000004, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude 3.5 Sonnet v2" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-10-22", + "lastUpdated": "2024-10-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "claude-3.5-sonnet-v2", + "modelKey": "claude-3.5-sonnet-v2", + "displayName": "Anthropic: Claude 3.5 Sonnet v2", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + } + ] + }, + { + "id": "anthropic/claude-3.7-sonnet", + "provider": "anthropic", + "model": "claude-3.7-sonnet", + "displayName": "Anthropic: Claude 3.7 Sonnet", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "helicone", + "openrouter", + "qiniu-ai", + "replicate", + "vercel_ai_gateway", + "zenmux" + ], + "aliases": [ + "helicone/claude-3.7-sonnet", + "openrouter/anthropic/claude-3.7-sonnet", + "qiniu-ai/claude-3.7-sonnet", + "replicate/anthropic/claude-3.7-sonnet", + "vercel_ai_gateway/anthropic/claude-3.7-sonnet", + "zenmux/anthropic/claude-3.7-sonnet" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "responseSchema": true, + "systemMessages": true, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "claude-3.7-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.30000000000000004, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "anthropic/claude-3.7-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-3.7-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + }, + "perImage": { + "input": 0.0048 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/anthropic/claude-3.7-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-3.7-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude 3.7 Sonnet", + "Claude 3.7 Sonnet" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-02", + "releaseDate": "2025-02-19", + "lastUpdated": "2025-02-19", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "claude-3.7-sonnet", + "modelKey": "claude-3.7-sonnet", + "displayName": "Anthropic: Claude 3.7 Sonnet", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-02", + "lastUpdated": "2025-02-19", + "openWeights": false, + "releaseDate": "2025-02-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "claude-3.7-sonnet", + "modelKey": "claude-3.7-sonnet", + "displayName": "Claude 3.7 Sonnet", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "anthropic/claude-3.7-sonnet", + "modelKey": "anthropic/claude-3.7-sonnet", + "displayName": "Claude 3.7 Sonnet", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-02-24", + "openWeights": false, + "releaseDate": "2025-02-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-3.7-sonnet", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/anthropic/claude-3.7-sonnet", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-3.7-sonnet", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-4-5-sonnet", + "provider": "anthropic", + "model": "claude-4-5-sonnet", + "displayName": "Claude 4.5 Sonnet", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "cortecs" + ], + "aliases": [ + "cortecs/claude-4-5-sonnet" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 200000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "claude-4-5-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3.259, + "output": 16.296 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4.5 Sonnet" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-07-31", + "releaseDate": "2025-09-29", + "lastUpdated": "2025-09-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "claude-4-5-sonnet", + "modelKey": "claude-4-5-sonnet", + "displayName": "Claude 4.5 Sonnet", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + } + ] + }, + { + "id": "anthropic/claude-4-6-sonnet", + "provider": "anthropic", + "model": "claude-4-6-sonnet", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "cortecs" + ], + "aliases": [ + "cortecs/claude-4-6-sonnet" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 1000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "claude-4-6-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3.59, + "output": 17.92 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.6" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-17", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "claude-4-6-sonnet", + "modelKey": "claude-4-6-sonnet", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17" + } + } + ] + }, + { + "id": "anthropic/claude-4-opus", + "provider": "anthropic", + "model": "claude-4-opus", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepinfra", + "snowflake", + "vercel_ai_gateway" + ], + "aliases": [ + "deepinfra/anthropic/claude-4-opus", + "snowflake/claude-4-opus", + "vercel_ai_gateway/anthropic/claude-4-opus" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 200000, + "outputTokens": 200000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "promptCaching": true, + "reasoning": true, + "responseSchema": true, + "systemMessages": true, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/anthropic/claude-4-opus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 16.5, + "output": 82.5 + } + }, + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/claude-4-opus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 25 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-4-opus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/anthropic/claude-4-opus", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/claude-4-opus", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-4-opus", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-4-opus-20250514", + "provider": "anthropic", + "model": "claude-4-opus-20250514", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "anthropic" + ], + "aliases": [ + "anthropic/claude-4-opus-20250514" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-4-opus-20250514", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-4-opus-20250514", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-4-sonnet", + "provider": "anthropic", + "model": "claude-4-sonnet", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepinfra", + "heroku", + "replicate", + "snowflake", + "vercel_ai_gateway" + ], + "aliases": [ + "deepinfra/anthropic/claude-4-sonnet", + "heroku/claude-4-sonnet", + "replicate/anthropic/claude-4-sonnet", + "snowflake/claude-4-sonnet", + "vercel_ai_gateway/anthropic/claude-4-sonnet" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 200000, + "outputTokens": 200000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "systemMessages": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "responseSchema": true, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/anthropic/claude-4-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3.3, + "output": 16.5 + } + }, + { + "source": "litellm", + "provider": "heroku", + "model": "heroku/claude-4-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/anthropic/claude-4-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/claude-4-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-4-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/anthropic/claude-4-sonnet", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "heroku", + "model": "heroku/claude-4-sonnet", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/anthropic/claude-4-sonnet", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/claude-4-sonnet", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-4-sonnet", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-4-sonnet-20250514", + "provider": "anthropic", + "model": "claude-4-sonnet-20250514", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "anthropic" + ], + "aliases": [ + "anthropic/claude-4-sonnet-20250514" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-4-sonnet-20250514", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7, + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-4-sonnet-20250514", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-4.0-opus", + "provider": "anthropic", + "model": "claude-4.0-opus", + "displayName": "Claude 4.0 Opus", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/claude-4.0-opus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Claude 4.0 Opus" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "claude-4.0-opus", + "modelKey": "claude-4.0-opus", + "displayName": "Claude 4.0 Opus", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + } + ] + }, + { + "id": "anthropic/claude-4.0-sonnet", + "provider": "anthropic", + "model": "claude-4.0-sonnet", + "displayName": "Claude 4.0 Sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/claude-4.0-sonnet" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Claude 4.0 Sonnet" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "claude-4.0-sonnet", + "modelKey": "claude-4.0-sonnet", + "displayName": "Claude 4.0 Sonnet", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + } + ] + }, + { + "id": "anthropic/claude-4.1-opus", + "provider": "anthropic", + "model": "claude-4.1-opus", + "displayName": "Claude 4.1 Opus", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/claude-4.1-opus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Claude 4.1 Opus" + ], + "releaseDate": "2025-08-06", + "lastUpdated": "2025-08-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "claude-4.1-opus", + "modelKey": "claude-4.1-opus", + "displayName": "Claude 4.1 Opus", + "metadata": { + "lastUpdated": "2025-08-06", + "openWeights": false, + "releaseDate": "2025-08-06" + } + } + ] + }, + { + "id": "anthropic/claude-4.5-haiku", + "provider": "anthropic", + "model": "claude-4.5-haiku", + "displayName": "Anthropic: Claude 4.5 Haiku", + "family": "claude-haiku", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "helicone", + "qiniu-ai", + "replicate" + ], + "aliases": [ + "helicone/claude-4.5-haiku", + "qiniu-ai/claude-4.5-haiku", + "replicate/anthropic/claude-4.5-haiku" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "claude-4.5-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.09999999999999999, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/anthropic/claude-4.5-haiku", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude 4.5 Haiku", + "Claude 4.5 Haiku" + ], + "families": [ + "claude-haiku" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-10", + "releaseDate": "2025-10-01", + "lastUpdated": "2025-10-01", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "claude-4.5-haiku", + "modelKey": "claude-4.5-haiku", + "displayName": "Anthropic: Claude 4.5 Haiku", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-10", + "lastUpdated": "2025-10-01", + "openWeights": false, + "releaseDate": "2025-10-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "claude-4.5-haiku", + "modelKey": "claude-4.5-haiku", + "displayName": "Claude 4.5 Haiku", + "metadata": { + "lastUpdated": "2025-10-16", + "openWeights": false, + "releaseDate": "2025-10-16" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/anthropic/claude-4.5-haiku", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-4.5-opus", + "provider": "anthropic", + "model": "claude-4.5-opus", + "displayName": "Anthropic: Claude Opus 4.5", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "helicone", + "qiniu-ai" + ], + "aliases": [ + "helicone/claude-4.5-opus", + "qiniu-ai/claude-4.5-opus" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 200000, + "outputTokens": 200000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "claude-4.5-opus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Opus 4.5", + "Claude 4.5 Opus" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-11", + "releaseDate": "2025-11-24", + "lastUpdated": "2025-11-24", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "claude-4.5-opus", + "modelKey": "claude-4.5-opus", + "displayName": "Anthropic: Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-11", + "lastUpdated": "2025-11-24", + "openWeights": false, + "releaseDate": "2025-11-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "claude-4.5-opus", + "modelKey": "claude-4.5-opus", + "displayName": "Claude 4.5 Opus", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-11-25" + } + } + ] + }, + { + "id": "anthropic/claude-4.5-sonnet", + "provider": "anthropic", + "model": "claude-4.5-sonnet", + "displayName": "Anthropic: Claude Sonnet 4.5", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "helicone", + "qiniu-ai", + "replicate" + ], + "aliases": [ + "helicone/claude-4.5-sonnet", + "qiniu-ai/claude-4.5-sonnet", + "replicate/anthropic/claude-4.5-sonnet" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "claude-4.5-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.30000000000000004, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/anthropic/claude-4.5-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Sonnet 4.5", + "Claude 4.5 Sonnet" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-09", + "releaseDate": "2025-09-29", + "lastUpdated": "2025-09-29", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "claude-4.5-sonnet", + "modelKey": "claude-4.5-sonnet", + "displayName": "Anthropic: Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "claude-4.5-sonnet", + "modelKey": "claude-4.5-sonnet", + "displayName": "Claude 4.5 Sonnet", + "metadata": { + "lastUpdated": "2025-09-30", + "openWeights": false, + "releaseDate": "2025-09-30" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/anthropic/claude-4.5-sonnet", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-code", + "provider": "anthropic", + "model": "claude-code", + "displayName": "claude-code", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/poetools/claude-code" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "claude-code" + ], + "releaseDate": "2025-11-27", + "lastUpdated": "2025-11-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "poetools/claude-code", + "modelKey": "poetools/claude-code", + "displayName": "claude-code", + "metadata": { + "lastUpdated": "2025-11-27", + "openWeights": false, + "releaseDate": "2025-11-27" + } + } + ] + }, + { + "id": "anthropic/claude-fable-5", + "provider": "anthropic", + "model": "claude-fable-5", + "displayName": "Claude Fable 5", + "family": "claude-fable", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "anthropic", + "azure", + "azure_ai", + "cloudflare-ai-gateway", + "freemodel", + "github-copilot", + "opencode", + "openrouter", + "snowflake-cortex", + "venice", + "vertex_ai-anthropic_models", + "zenmux" + ], + "aliases": [ + "anthropic/claude-fable-5", + "azure/claude-fable-5", + "azure_ai/claude-fable-5", + "cloudflare-ai-gateway/anthropic/claude-fable-5", + "freemodel/claude-fable-5", + "github-copilot/claude-fable-5", + "opencode/claude-fable-5", + "openrouter/anthropic/claude-fable-5", + "snowflake-cortex/claude-fable-5", + "venice/claude-fable-5", + "vertex_ai-anthropic_models/vertex_ai/claude-fable-5", + "zenmux/anthropic/claude-fable-5" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "adaptiveThinking": true, + "assistantPrefill": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "maxReasoningEffort": true, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-fable-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "claude-fable-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "anthropic/claude-fable-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + } + }, + { + "source": "models.dev", + "provider": "freemodel", + "model": "claude-fable-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + } + }, + { + "source": "models.dev", + "provider": "github-copilot", + "model": "claude-fable-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "claude-fable-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "claude-fable-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.2, + "cacheWrite": 15, + "input": 12, + "output": 60 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "anthropic/claude-fable-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-fable-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00002 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/claude-fable-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00002 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-fable-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00002 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "anthropic/claude-fable-5", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Fable 5", + "Claude Fable 5" + ], + "families": [ + "claude-fable" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-06-09", + "lastUpdated": "2026-06-09", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "tool_choice", + "tools", + "verbosity" + ], + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-fable-5", + "modelKey": "claude-fable-5", + "displayName": "Claude Fable 5", + "family": "claude-fable", + "metadata": { + "lastUpdated": "2026-06-09", + "openWeights": false, + "releaseDate": "2026-06-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "claude-fable-5", + "modelKey": "claude-fable-5", + "displayName": "Claude Fable 5", + "family": "claude-fable", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-06-09", + "openWeights": false, + "releaseDate": "2026-06-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "anthropic/claude-fable-5", + "modelKey": "anthropic/claude-fable-5", + "displayName": "Claude Fable 5", + "family": "claude-fable", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-06-09", + "openWeights": false, + "releaseDate": "2026-06-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "freemodel", + "providerName": "FreeModel", + "providerApi": "https://cc.freemodel.dev/v1", + "providerDoc": "https://freemodel.dev", + "model": "claude-fable-5", + "modelKey": "claude-fable-5", + "displayName": "Claude Fable 5", + "family": "claude-fable", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-06-09", + "openWeights": false, + "releaseDate": "2026-06-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "claude-fable-5", + "modelKey": "claude-fable-5", + "displayName": "Claude Fable 5", + "family": "claude-fable", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-06-09", + "openWeights": false, + "releaseDate": "2026-06-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "claude-fable-5", + "modelKey": "claude-fable-5", + "displayName": "Claude Fable 5", + "family": "claude-fable", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-06-09", + "openWeights": false, + "releaseDate": "2026-06-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "claude-fable-5", + "modelKey": "claude-fable-5", + "displayName": "Claude Fable 5", + "family": "claude-fable", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-06-09", + "openWeights": false, + "releaseDate": "2026-06-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "claude-fable-5", + "modelKey": "claude-fable-5", + "displayName": "Claude Fable 5", + "family": "claude-fable", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-06-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "anthropic/claude-fable-5", + "modelKey": "anthropic/claude-fable-5", + "displayName": "Claude Fable 5", + "family": "claude-fable", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-06-09", + "openWeights": false, + "releaseDate": "2026-06-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-fable-5", + "mode": "chat", + "metadata": { + "providerSpecificEntry": { + "us": 1.1 + } + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/claude-fable-5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-fable-5", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "anthropic/claude-fable-5", + "displayName": "Anthropic: Claude Fable 5", + "metadata": { + "canonicalSlug": "anthropic/claude-5-fable-20260609", + "createdAt": "2026-06-09T12:18:35.000Z", + "links": { + "details": "/api/v1/models/anthropic/claude-5-fable-20260609/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "tool_choice", + "tools", + "verbosity" + ], + "tokenizer": "Claude", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "anthropic/claude-fable-5@default", + "provider": "anthropic", + "model": "claude-fable-5@default", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-anthropic_models" + ], + "aliases": [ + "vertex_ai-anthropic_models/vertex_ai/claude-fable-5@default" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "adaptiveThinking": true, + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-fable-5@default", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00002 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-fable-5@default", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-fable-latest", + "provider": "anthropic", + "model": "claude-fable-latest", + "displayName": "Claude Fable Latest", + "family": "claude-fable", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/~anthropic/claude-fable-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "~anthropic/claude-fable-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "~anthropic/claude-fable-latest", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Fable Latest", + "Claude Fable Latest" + ], + "families": [ + "claude-fable" + ], + "releaseDate": "2026-06-09", + "lastUpdated": "2026-06-09", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "tool_choice", + "tools", + "verbosity" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "~anthropic/claude-fable-latest", + "modelKey": "~anthropic/claude-fable-latest", + "displayName": "Claude Fable Latest", + "family": "claude-fable", + "metadata": { + "lastUpdated": "2026-06-09", + "openWeights": false, + "releaseDate": "2026-06-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "~anthropic/claude-fable-latest", + "displayName": "Anthropic: Claude Fable Latest", + "metadata": { + "canonicalSlug": "~anthropic/claude-fable-latest", + "createdAt": "2026-06-09T18:32:24.000Z", + "links": { + "details": "/api/v1/models/~anthropic/claude-fable-latest/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "tool_choice", + "tools", + "verbosity" + ], + "tokenizer": "Router", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "anthropic/claude-haiku-3", + "provider": "anthropic", + "model": "claude-haiku-3", + "displayName": "Claude-Haiku-3", + "family": "claude-haiku", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/anthropic/claude-haiku-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 189096, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "anthropic/claude-haiku-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.021, + "cacheWrite": 0.26, + "input": 0.21, + "output": 1.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude-Haiku-3" + ], + "families": [ + "claude-haiku" + ], + "releaseDate": "2024-03-09", + "lastUpdated": "2024-03-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "anthropic/claude-haiku-3", + "modelKey": "anthropic/claude-haiku-3", + "displayName": "Claude-Haiku-3", + "family": "claude-haiku", + "metadata": { + "lastUpdated": "2024-03-09", + "openWeights": false, + "releaseDate": "2024-03-09" + } + } + ] + }, + { + "id": "anthropic/claude-haiku-3.5", + "provider": "anthropic", + "model": "claude-haiku-3.5", + "displayName": "Claude-Haiku-3.5", + "family": "claude-haiku", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/anthropic/claude-haiku-3.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 189096, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "anthropic/claude-haiku-3.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.068, + "cacheWrite": 0.85, + "input": 0.68, + "output": 3.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude-Haiku-3.5" + ], + "families": [ + "claude-haiku" + ], + "releaseDate": "2024-10-01", + "lastUpdated": "2024-10-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "anthropic/claude-haiku-3.5", + "modelKey": "anthropic/claude-haiku-3.5", + "displayName": "Claude-Haiku-3.5", + "family": "claude-haiku", + "metadata": { + "lastUpdated": "2024-10-01", + "openWeights": false, + "releaseDate": "2024-10-01" + } + } + ] + }, + { + "id": "anthropic/claude-haiku-4-5", + "provider": "anthropic", + "model": "claude-haiku-4-5", + "displayName": "Claude Haiku 4.5 (latest)", + "family": "claude-haiku", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "anthropic", + "anyapi", + "azure", + "azure-cognitive-services", + "azure_ai", + "cloudflare-ai-gateway", + "cortecs", + "frogbot", + "llmgateway", + "nearai", + "neon", + "opencode", + "perplexity-agent", + "requesty", + "snowflake", + "snowflake-cortex", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "302ai/claude-haiku-4-5", + "anthropic/claude-haiku-4-5", + "anyapi/anthropic/claude-haiku-4-5", + "azure-cognitive-services/claude-haiku-4-5", + "azure/claude-haiku-4-5", + "azure_ai/claude-haiku-4-5", + "cloudflare-ai-gateway/anthropic/claude-haiku-4-5", + "cortecs/claude-haiku-4-5", + "frogbot/claude-haiku-4-5", + "llmgateway/claude-haiku-4-5", + "nearai/anthropic/claude-haiku-4-5", + "neon/claude-haiku-4-5", + "opencode/claude-haiku-4-5", + "perplexity-agent/anthropic/claude-haiku-4-5", + "requesty/anthropic/claude-haiku-4-5", + "snowflake-cortex/claude-haiku-4-5", + "snowflake/claude-haiku-4-5", + "vertex_ai-anthropic_models/vertex_ai/claude-haiku-4-5" + ], + "mergedProviderModelRecords": 18, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 200000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "structuredOutput": true, + "systemMessages": true, + "nativeStreaming": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-haiku-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-haiku-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "claude-haiku-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "claude-haiku-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "anthropic/claude-haiku-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "claude-haiku-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.09, + "output": 5.43 + } + }, + { + "source": "models.dev", + "provider": "frogbot", + "model": "claude-haiku-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "claude-haiku-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "anthropic/claude-haiku-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "neon", + "model": "claude-haiku-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "claude-haiku-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "anthropic/claude-haiku-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "anthropic/claude-haiku-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-haiku-4-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000002 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/claude-haiku-4-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000002 + } + }, + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/claude-haiku-4-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "input": 1, + "output": 5 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-haiku-4-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000002 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Haiku 4.5", + "Claude Haiku 4.5 (latest)", + "claude-haiku-4-5" + ], + "families": [ + "claude-haiku" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-02-28", + "releaseDate": "2025-10-16", + "lastUpdated": "2025-10-16", + "providerModelRecordCount": 18 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-haiku-4-5", + "modelKey": "claude-haiku-4-5", + "displayName": "claude-haiku-4-5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-16", + "openWeights": false, + "releaseDate": "2025-10-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-haiku-4-5", + "modelKey": "claude-haiku-4-5", + "displayName": "Claude Haiku 4.5 (latest)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "anthropic/claude-haiku-4-5", + "modelKey": "anthropic/claude-haiku-4-5", + "displayName": "Claude Haiku 4.5 (latest)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "claude-haiku-4-5", + "modelKey": "claude-haiku-4-5", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-31", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "claude-haiku-4-5", + "modelKey": "claude-haiku-4-5", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-31", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "anthropic/claude-haiku-4-5", + "modelKey": "anthropic/claude-haiku-4-5", + "displayName": "Claude Haiku 4.5 (latest)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "claude-haiku-4-5", + "modelKey": "claude-haiku-4-5", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "claude-haiku-4-5", + "modelKey": "claude-haiku-4-5", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "claude-haiku-4-5", + "modelKey": "claude-haiku-4-5", + "displayName": "Claude Haiku 4.5 (latest)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "anthropic/claude-haiku-4-5", + "modelKey": "anthropic/claude-haiku-4-5", + "displayName": "Claude Haiku 4.5 (latest)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "claude-haiku-4-5", + "modelKey": "claude-haiku-4-5", + "displayName": "Claude Haiku 4.5 (latest)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "claude-haiku-4-5", + "modelKey": "claude-haiku-4-5", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "anthropic/claude-haiku-4-5", + "modelKey": "anthropic/claude-haiku-4-5", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "anthropic/claude-haiku-4-5", + "modelKey": "anthropic/claude-haiku-4-5", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-01", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "claude-haiku-4-5", + "modelKey": "claude-haiku-4-5", + "displayName": "Claude Haiku 4.5 (latest)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-haiku-4-5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/claude-haiku-4-5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/claude-haiku-4-5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-haiku-4-5", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude/haiku-4-5" + } + } + ] + }, + { + "id": "anthropic/claude-haiku-4-5-20251001", + "provider": "anthropic", + "model": "claude-haiku-4-5-20251001", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "abacus", + "anthropic", + "freemodel", + "helicone", + "jiekou", + "llmgateway", + "merge-gateway", + "nano-gpt", + "qihang-ai" + ], + "aliases": [ + "302ai/claude-haiku-4-5-20251001", + "abacus/claude-haiku-4-5-20251001", + "anthropic/claude-haiku-4-5-20251001", + "freemodel/claude-haiku-4-5-20251001", + "helicone/claude-haiku-4-5-20251001", + "jiekou/claude-haiku-4-5-20251001", + "llmgateway/claude-haiku-4-5-20251001", + "merge-gateway/anthropic/claude-haiku-4-5-20251001", + "nano-gpt/claude-haiku-4-5-20251001", + "qihang-ai/claude-haiku-4-5-20251001" + ], + "mergedProviderModelRecords": 10, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-haiku-4-5-20251001", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "claude-haiku-4-5-20251001", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-haiku-4-5-20251001", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "freemodel", + "model": "claude-haiku-4-5-20251001", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "claude-haiku-4-5-20251001", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.09999999999999999, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "claude-haiku-4-5-20251001", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.9, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "claude-haiku-4-5-20251001", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "anthropic/claude-haiku-4-5-20251001", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-haiku-4-5-20251001", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "qihang-ai", + "model": "claude-haiku-4-5-20251001", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.71 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-haiku-4-5-20251001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000002 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude 4.5 Haiku (20251001)", + "Claude Haiku 4.5", + "claude-haiku-4-5-20251001" + ], + "families": [ + "claude-haiku" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-02-28", + "releaseDate": "2025-10-16", + "lastUpdated": "2025-10-16", + "providerModelRecordCount": 10 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-haiku-4-5-20251001", + "modelKey": "claude-haiku-4-5-20251001", + "displayName": "claude-haiku-4-5-20251001", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-16", + "openWeights": false, + "releaseDate": "2025-10-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "claude-haiku-4-5-20251001", + "modelKey": "claude-haiku-4-5-20251001", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-haiku-4-5-20251001", + "modelKey": "claude-haiku-4-5-20251001", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "freemodel", + "providerName": "FreeModel", + "providerApi": "https://cc.freemodel.dev/v1", + "providerDoc": "https://freemodel.dev", + "model": "claude-haiku-4-5-20251001", + "modelKey": "claude-haiku-4-5-20251001", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "claude-haiku-4-5-20251001", + "modelKey": "claude-haiku-4-5-20251001", + "displayName": "Anthropic: Claude 4.5 Haiku (20251001)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-10", + "lastUpdated": "2025-10-01", + "openWeights": false, + "releaseDate": "2025-10-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "claude-haiku-4-5-20251001", + "modelKey": "claude-haiku-4-5-20251001", + "displayName": "claude-haiku-4-5-20251001", + "family": "claude-haiku", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "claude-haiku-4-5-20251001", + "modelKey": "claude-haiku-4-5-20251001", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "anthropic/claude-haiku-4-5-20251001", + "modelKey": "anthropic/claude-haiku-4-5-20251001", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-haiku-4-5-20251001", + "modelKey": "claude-haiku-4-5-20251001", + "displayName": "Claude Haiku 4.5", + "metadata": { + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qihang-ai", + "providerName": "QiHang", + "providerApi": "https://api.qhaigc.net/v1", + "providerDoc": "https://www.qhaigc.net/docs", + "model": "claude-haiku-4-5-20251001", + "modelKey": "claude-haiku-4-5-20251001", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-10-01", + "openWeights": false, + "releaseDate": "2025-10-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-haiku-4-5-20251001", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-haiku-4-5-20251001-thinking", + "provider": "anthropic", + "model": "claude-haiku-4-5-20251001-thinking", + "displayName": "Claude Haiku 4.5 Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claude-haiku-4-5-20251001-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-haiku-4-5-20251001-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 1, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Haiku 4.5 Thinking" + ], + "releaseDate": "2025-10-15", + "lastUpdated": "2025-10-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-haiku-4-5-20251001-thinking", + "modelKey": "claude-haiku-4-5-20251001-thinking", + "displayName": "Claude Haiku 4.5 Thinking", + "metadata": { + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + } + ] + }, + { + "id": "anthropic/claude-haiku-4-5@20251001", + "provider": "anthropic", + "model": "claude-haiku-4-5@20251001", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "google-vertex-anthropic", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "google-vertex-anthropic/claude-haiku-4-5@20251001", + "google-vertex/claude-haiku-4-5@20251001", + "vertex_ai-anthropic_models/vertex_ai/claude-haiku-4-5@20251001" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStreaming": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex-anthropic", + "model": "claude-haiku-4-5@20251001", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "claude-haiku-4-5@20251001", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-haiku-4-5@20251001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000002 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Haiku 4.5" + ], + "families": [ + "claude-haiku" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-02-28", + "releaseDate": "2025-10-15", + "lastUpdated": "2025-10-15", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex-anthropic", + "providerName": "Vertex (Anthropic)", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude", + "model": "claude-haiku-4-5@20251001", + "modelKey": "claude-haiku-4-5@20251001", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "claude-haiku-4-5@20251001", + "modelKey": "claude-haiku-4-5@20251001", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-haiku-4-5@20251001", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude/haiku-4-5" + } + } + ] + }, + { + "id": "anthropic/claude-haiku-4.5", + "provider": "anthropic", + "model": "claude-haiku-4.5", + "displayName": "Claude Haiku 4.5 (latest)", + "family": "claude-haiku", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "github-copilot", + "github_copilot", + "kilo", + "openrouter", + "orcarouter", + "poe", + "vercel", + "vercel_ai_gateway", + "zenmux" + ], + "aliases": [ + "github-copilot/claude-haiku-4.5", + "github_copilot/claude-haiku-4.5", + "kilo/anthropic/claude-haiku-4.5", + "openrouter/anthropic/claude-haiku-4.5", + "orcarouter/anthropic/claude-haiku-4.5", + "poe/anthropic/claude-haiku-4.5", + "vercel/anthropic/claude-haiku-4.5", + "vercel_ai_gateway/anthropic/claude-haiku-4.5", + "zenmux/anthropic/claude-haiku-4.5" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 200000, + "outputTokens": 200000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false, + "interleaved": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-copilot", + "model": "claude-haiku-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "anthropic/claude-haiku-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "anthropic/claude-haiku-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "anthropic/claude-haiku-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "anthropic/claude-haiku-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.085, + "cacheWrite": 1.1, + "input": 0.85, + "output": 4.3 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "anthropic/claude-haiku-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "anthropic/claude-haiku-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/claude-haiku-4.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-haiku-4.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-haiku-4.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "anthropic/claude-haiku-4.5", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Haiku 4.5", + "Claude Haiku 4.5", + "Claude Haiku 4.5 (latest)", + "Claude-Haiku-4.5" + ], + "families": [ + "claude-haiku" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-02-28", + "releaseDate": "2025-10-15", + "lastUpdated": "2025-10-15", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "claude-haiku-4.5", + "modelKey": "claude-haiku-4.5", + "displayName": "Claude Haiku 4.5 (latest)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "anthropic/claude-haiku-4.5", + "modelKey": "anthropic/claude-haiku-4.5", + "displayName": "Anthropic: Claude Haiku 4.5", + "metadata": { + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "anthropic/claude-haiku-4.5", + "modelKey": "anthropic/claude-haiku-4.5", + "displayName": "Claude Haiku 4.5 (latest)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "anthropic/claude-haiku-4.5", + "modelKey": "anthropic/claude-haiku-4.5", + "displayName": "Claude Haiku 4.5 (latest)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "anthropic/claude-haiku-4.5", + "modelKey": "anthropic/claude-haiku-4.5", + "displayName": "Claude-Haiku-4.5", + "family": "claude-haiku", + "metadata": { + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "anthropic/claude-haiku-4.5", + "modelKey": "anthropic/claude-haiku-4.5", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "anthropic/claude-haiku-4.5", + "modelKey": "anthropic/claude-haiku-4.5", + "displayName": "Claude Haiku 4.5", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/claude-haiku-4.5", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-haiku-4.5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-haiku-4.5", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "anthropic/claude-haiku-4.5", + "displayName": "Anthropic: Claude Haiku 4.5", + "metadata": { + "canonicalSlug": "anthropic/claude-4.5-haiku-20251001", + "createdAt": "2025-10-15T17:00:38.000Z", + "links": { + "details": "/api/v1/models/anthropic/claude-4.5-haiku-20251001/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Claude", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 64000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "anthropic/claude-haiku-latest", + "provider": "anthropic", + "model": "claude-haiku-latest", + "displayName": "Anthropic: Claude Haiku Latest", + "family": "claude-haiku", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "kilo/~anthropic/claude-haiku-latest", + "nano-gpt/anthropic/claude-haiku-latest", + "openrouter/~anthropic/claude-haiku-latest" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "~anthropic/claude-haiku-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "anthropic/claude-haiku-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 1, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "~anthropic/claude-haiku-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "~anthropic/claude-haiku-latest", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic Claude Haiku Latest", + "Anthropic: Claude Haiku Latest", + "Claude Haiku Latest" + ], + "families": [ + "claude-haiku" + ], + "releaseDate": "2026-04-27", + "lastUpdated": "2026-05-01", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "~anthropic/claude-haiku-latest", + "modelKey": "~anthropic/claude-haiku-latest", + "displayName": "Anthropic: Claude Haiku Latest", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "anthropic/claude-haiku-latest", + "modelKey": "anthropic/claude-haiku-latest", + "displayName": "Claude Haiku Latest", + "metadata": { + "lastUpdated": "2026-03-29", + "openWeights": false, + "releaseDate": "2026-03-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "~anthropic/claude-haiku-latest", + "modelKey": "~anthropic/claude-haiku-latest", + "displayName": "Anthropic Claude Haiku Latest", + "family": "claude-haiku", + "metadata": { + "lastUpdated": "2026-04-27", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "~anthropic/claude-haiku-latest", + "displayName": "Anthropic Claude Haiku Latest", + "metadata": { + "canonicalSlug": "~anthropic/claude-haiku-latest", + "createdAt": "2026-04-27T19:34:52.000Z", + "links": { + "details": "/api/v1/models/~anthropic/claude-haiku-latest/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Router", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 64000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "anthropic/claude-opus-4", + "provider": "anthropic", + "model": "claude-opus-4", + "displayName": "Claude Opus 4", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "cloudflare-ai-gateway", + "gmi", + "helicone", + "kilo", + "openrouter", + "orcarouter", + "poe", + "requesty", + "vercel", + "vercel_ai_gateway", + "vertex_ai-anthropic_models", + "zenmux" + ], + "aliases": [ + "cloudflare-ai-gateway/anthropic/claude-opus-4", + "gmi/anthropic/claude-opus-4", + "helicone/claude-opus-4", + "kilo/anthropic/claude-opus-4", + "openrouter/anthropic/claude-opus-4", + "orcarouter/anthropic/claude-opus-4", + "poe/anthropic/claude-opus-4", + "requesty/anthropic/claude-opus-4", + "vercel/anthropic/claude-opus-4", + "vercel_ai_gateway/anthropic/claude-opus-4", + "vertex_ai-anthropic_models/vertex_ai/claude-opus-4", + "zenmux/anthropic/claude-opus-4" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 409600, + "inputTokens": 409600, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "anthropic/claude-opus-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "claude-opus-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "anthropic/claude-opus-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "anthropic/claude-opus-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "anthropic/claude-opus-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "anthropic/claude-opus-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.3, + "cacheWrite": 16, + "input": 13, + "output": 64 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "anthropic/claude-opus-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "anthropic/claude-opus-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "anthropic/claude-opus-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "litellm", + "provider": "gmi", + "model": "gmi/anthropic/claude-opus-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 15, + "output": 75 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-opus-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "perImage": { + "input": 0.0048 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-opus-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00003 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "anthropic/claude-opus-4", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Opus 4", + "Claude Opus 4", + "Claude Opus 4 (latest)", + "Claude-Opus-4" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "stop", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "anthropic/claude-opus-4", + "modelKey": "anthropic/claude-opus-4", + "displayName": "Claude Opus 4 (latest)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "claude-opus-4", + "modelKey": "claude-opus-4", + "displayName": "Anthropic: Claude Opus 4", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-05-14", + "openWeights": false, + "releaseDate": "2025-05-14", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 31999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "anthropic/claude-opus-4", + "modelKey": "anthropic/claude-opus-4", + "displayName": "Anthropic: Claude Opus 4", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-05-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "anthropic/claude-opus-4", + "modelKey": "anthropic/claude-opus-4", + "displayName": "Claude Opus 4", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-01-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 31999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "anthropic/claude-opus-4", + "modelKey": "anthropic/claude-opus-4", + "displayName": "Claude Opus 4 (latest)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "anthropic/claude-opus-4", + "modelKey": "anthropic/claude-opus-4", + "displayName": "Claude-Opus-4", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2025-05-21", + "openWeights": false, + "releaseDate": "2025-05-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "anthropic/claude-opus-4", + "modelKey": "anthropic/claude-opus-4", + "displayName": "Claude Opus 4", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "anthropic/claude-opus-4", + "modelKey": "anthropic/claude-opus-4", + "displayName": "Claude Opus 4", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "anthropic/claude-opus-4", + "modelKey": "anthropic/claude-opus-4", + "displayName": "Claude Opus 4", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gmi", + "model": "gmi/anthropic/claude-opus-4", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-opus-4", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-opus-4", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "anthropic/claude-opus-4", + "displayName": "Anthropic: Claude Opus 4", + "metadata": { + "canonicalSlug": "anthropic/claude-4-opus-20250522", + "createdAt": "2025-05-22T16:27:25.000Z", + "knowledgeCutoff": "2025-01-31", + "links": { + "details": "/api/v1/models/anthropic/claude-4-opus-20250522/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "stop", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Claude", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 32000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-0", + "provider": "anthropic", + "model": "claude-opus-4-0", + "displayName": "Claude Opus 4 (latest)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "anthropic" + ], + "aliases": [ + "anthropic/claude-opus-4-0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-opus-4-0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4 (latest)" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-opus-4-0", + "modelKey": "claude-opus-4-0", + "displayName": "Claude Opus 4 (latest)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-1", + "provider": "anthropic", + "model": "claude-opus-4-1", + "displayName": "Claude Opus 4.1 (latest)", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "anthropic", + "azure", + "azure-cognitive-services", + "azure_ai", + "cloudflare-ai-gateway", + "helicone", + "neon", + "opencode", + "requesty", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "anthropic/claude-opus-4-1", + "azure-cognitive-services/claude-opus-4-1", + "azure/claude-opus-4-1", + "azure_ai/claude-opus-4-1", + "cloudflare-ai-gateway/anthropic/claude-opus-4-1", + "helicone/claude-opus-4-1", + "neon/claude-opus-4-1", + "opencode/claude-opus-4-1", + "requesty/anthropic/claude-opus-4-1", + "vertex_ai-anthropic_models/vertex_ai/claude-opus-4-1" + ], + "mergedProviderModelRecords": 10, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-opus-4-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "claude-opus-4-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "claude-opus-4-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "anthropic/claude-opus-4-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "claude-opus-4-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "neon", + "model": "claude-opus-4-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "claude-opus-4-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "anthropic/claude-opus-4-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-opus-4-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00003 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/claude-opus-4-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00003 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00003, + "input_cost_per_token_batches": 0.0000075, + "output_cost_per_token_batches": 0.0000375 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Opus 4.1", + "Claude Opus 4.1", + "Claude Opus 4.1 (latest)" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 10 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-opus-4-1", + "modelKey": "claude-opus-4-1", + "displayName": "Claude Opus 4.1 (latest)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "claude-opus-4-1", + "modelKey": "claude-opus-4-1", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "claude-opus-4-1", + "modelKey": "claude-opus-4-1", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "anthropic/claude-opus-4-1", + "modelKey": "anthropic/claude-opus-4-1", + "displayName": "Claude Opus 4.1 (latest)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "claude-opus-4-1", + "modelKey": "claude-opus-4-1", + "displayName": "Anthropic: Claude Opus 4.1", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-08", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 31999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "claude-opus-4-1", + "modelKey": "claude-opus-4-1", + "displayName": "Claude Opus 4.1 (latest)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 31999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "claude-opus-4-1", + "modelKey": "claude-opus-4-1", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024, + "max": 31999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "anthropic/claude-opus-4-1", + "modelKey": "anthropic/claude-opus-4-1", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-opus-4-1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/claude-opus-4-1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-1", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-opus-4-1-20250805", + "provider": "anthropic", + "model": "claude-opus-4-1-20250805", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "abacus", + "anthropic", + "helicone", + "jiekou", + "llmgateway", + "merge-gateway", + "nano-gpt" + ], + "aliases": [ + "302ai/claude-opus-4-1-20250805", + "abacus/claude-opus-4-1-20250805", + "anthropic/claude-opus-4-1-20250805", + "helicone/claude-opus-4-1-20250805", + "jiekou/claude-opus-4-1-20250805", + "llmgateway/claude-opus-4-1-20250805", + "merge-gateway/anthropic/claude-opus-4-1-20250805", + "nano-gpt/claude-opus-4-1-20250805" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-opus-4-1-20250805", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "claude-opus-4-1-20250805", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-opus-4-1-20250805", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "claude-opus-4-1-20250805", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "claude-opus-4-1-20250805", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 13.5, + "output": 67.5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "claude-opus-4-1-20250805", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "anthropic/claude-opus-4-1-20250805", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-opus-4-1-20250805", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14.994, + "output": 75.004 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-opus-4-1-20250805", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00003 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Opus 4.1 (20250805)", + "Claude 4.1 Opus", + "Claude Opus 4.1", + "claude-opus-4-1-20250805" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "deprecationDate": "2026-08-05", + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-opus-4-1-20250805", + "modelKey": "claude-opus-4-1-20250805", + "displayName": "claude-opus-4-1-20250805", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "claude-opus-4-1-20250805", + "modelKey": "claude-opus-4-1-20250805", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-opus-4-1-20250805", + "modelKey": "claude-opus-4-1-20250805", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "claude-opus-4-1-20250805", + "modelKey": "claude-opus-4-1-20250805", + "displayName": "Anthropic: Claude Opus 4.1 (20250805)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-08", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 31999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "claude-opus-4-1-20250805", + "modelKey": "claude-opus-4-1-20250805", + "displayName": "claude-opus-4-1-20250805", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "claude-opus-4-1-20250805", + "modelKey": "claude-opus-4-1-20250805", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "anthropic/claude-opus-4-1-20250805", + "modelKey": "anthropic/claude-opus-4-1-20250805", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-opus-4-1-20250805", + "modelKey": "claude-opus-4-1-20250805", + "displayName": "Claude 4.1 Opus", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-opus-4-1-20250805", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-08-05" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-1-20250805-thinking", + "provider": "anthropic", + "model": "claude-opus-4-1-20250805-thinking", + "displayName": "claude-opus-4-1-20250805-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai" + ], + "aliases": [ + "302ai/claude-opus-4-1-20250805-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-opus-4-1-20250805-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "claude-opus-4-1-20250805-thinking" + ], + "knowledgeCutoff": "2025-03", + "releaseDate": "2025-05-27", + "lastUpdated": "2025-05-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-opus-4-1-20250805-thinking", + "modelKey": "claude-opus-4-1-20250805-thinking", + "displayName": "claude-opus-4-1-20250805-thinking", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2025-05-27", + "openWeights": false, + "releaseDate": "2025-05-27" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-1-thinking", + "provider": "anthropic", + "model": "claude-opus-4-1-thinking", + "displayName": "Claude 4.1 Opus Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claude-opus-4-1-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-opus-4-1-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14.994, + "output": 75.004 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4.1 Opus Thinking" + ], + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-opus-4-1-thinking", + "modelKey": "claude-opus-4-1-thinking", + "displayName": "Claude 4.1 Opus Thinking", + "metadata": { + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-1-thinking:1024", + "provider": "anthropic", + "model": "claude-opus-4-1-thinking:1024", + "displayName": "Claude 4.1 Opus Thinking (1K)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claude-opus-4-1-thinking:1024" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-opus-4-1-thinking:1024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14.994, + "output": 75.004 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4.1 Opus Thinking (1K)" + ], + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-opus-4-1-thinking:1024", + "modelKey": "claude-opus-4-1-thinking:1024", + "displayName": "Claude 4.1 Opus Thinking (1K)", + "metadata": { + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-1-thinking:32000", + "provider": "anthropic", + "model": "claude-opus-4-1-thinking:32000", + "displayName": "Claude 4.1 Opus Thinking (32K)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claude-opus-4-1-thinking:32000" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-opus-4-1-thinking:32000", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14.994, + "output": 75.004 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4.1 Opus Thinking (32K)" + ], + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-opus-4-1-thinking:32000", + "modelKey": "claude-opus-4-1-thinking:32000", + "displayName": "Claude 4.1 Opus Thinking (32K)", + "metadata": { + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-1-thinking:32768", + "provider": "anthropic", + "model": "claude-opus-4-1-thinking:32768", + "displayName": "Claude 4.1 Opus Thinking (32K)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claude-opus-4-1-thinking:32768" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-opus-4-1-thinking:32768", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14.994, + "output": 75.004 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4.1 Opus Thinking (32K)" + ], + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-opus-4-1-thinking:32768", + "modelKey": "claude-opus-4-1-thinking:32768", + "displayName": "Claude 4.1 Opus Thinking (32K)", + "metadata": { + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-1-thinking:8192", + "provider": "anthropic", + "model": "claude-opus-4-1-thinking:8192", + "displayName": "Claude 4.1 Opus Thinking (8K)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claude-opus-4-1-thinking:8192" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-opus-4-1-thinking:8192", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14.994, + "output": 75.004 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4.1 Opus Thinking (8K)" + ], + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-opus-4-1-thinking:8192", + "modelKey": "claude-opus-4-1-thinking:8192", + "displayName": "Claude 4.1 Opus Thinking (8K)", + "metadata": { + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-1@20250805", + "provider": "anthropic", + "model": "claude-opus-4-1@20250805", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "google-vertex-anthropic", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "google-vertex-anthropic/claude-opus-4-1@20250805", + "google-vertex/claude-opus-4-1@20250805", + "vertex_ai-anthropic_models/vertex_ai/claude-opus-4-1@20250805" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex-anthropic", + "model": "claude-opus-4-1@20250805", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "claude-opus-4-1@20250805", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-1@20250805", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00003, + "input_cost_per_token_batches": 0.0000075, + "output_cost_per_token_batches": 0.0000375 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.1" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex-anthropic", + "providerName": "Vertex (Anthropic)", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude", + "model": "claude-opus-4-1@20250805", + "modelKey": "claude-opus-4-1@20250805", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "claude-opus-4-1@20250805", + "modelKey": "claude-opus-4-1@20250805", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-1@20250805", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-opus-4-20250514", + "provider": "anthropic", + "model": "claude-opus-4-20250514", + "displayName": "Claude Opus 4", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "abacus", + "anthropic", + "jiekou", + "llmgateway", + "merge-gateway", + "nano-gpt" + ], + "aliases": [ + "302ai/claude-opus-4-20250514", + "abacus/claude-opus-4-20250514", + "anthropic/claude-opus-4-20250514", + "jiekou/claude-opus-4-20250514", + "llmgateway/claude-opus-4-20250514", + "merge-gateway/anthropic/claude-opus-4-20250514", + "nano-gpt/claude-opus-4-20250514" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-opus-4-20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "claude-opus-4-20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-opus-4-20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "claude-opus-4-20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 13.5, + "output": 67.5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "claude-opus-4-20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "anthropic/claude-opus-4-20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-opus-4-20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14.994, + "output": 75.004 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-opus-4-20250514", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00003 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4 Opus", + "Claude Opus 4", + "claude-opus-4-20250514" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "deprecationDate": "2026-05-14", + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-opus-4-20250514", + "modelKey": "claude-opus-4-20250514", + "displayName": "claude-opus-4-20250514", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "claude-opus-4-20250514", + "modelKey": "claude-opus-4-20250514", + "displayName": "Claude Opus 4", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2025-05-14", + "openWeights": false, + "releaseDate": "2025-05-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-opus-4-20250514", + "modelKey": "claude-opus-4-20250514", + "displayName": "Claude Opus 4", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "claude-opus-4-20250514", + "modelKey": "claude-opus-4-20250514", + "displayName": "claude-opus-4-20250514", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "claude-opus-4-20250514", + "modelKey": "claude-opus-4-20250514", + "displayName": "Claude Opus 4", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "anthropic/claude-opus-4-20250514", + "modelKey": "anthropic/claude-opus-4-20250514", + "displayName": "Claude Opus 4", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-opus-4-20250514", + "modelKey": "claude-opus-4-20250514", + "displayName": "Claude 4 Opus", + "metadata": { + "lastUpdated": "2025-05-14", + "openWeights": false, + "releaseDate": "2025-05-14" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-opus-4-20250514", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-14" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-5", + "provider": "anthropic", + "model": "claude-opus-4-5", + "displayName": "Claude Opus 4.5 (latest)", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "anthropic", + "azure", + "azure-cognitive-services", + "azure_ai", + "cloudflare-ai-gateway", + "neon", + "opencode", + "perplexity-agent", + "requesty", + "venice", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "302ai/claude-opus-4-5", + "anthropic/claude-opus-4-5", + "azure-cognitive-services/claude-opus-4-5", + "azure/claude-opus-4-5", + "azure_ai/claude-opus-4-5", + "cloudflare-ai-gateway/anthropic/claude-opus-4-5", + "neon/claude-opus-4-5", + "opencode/claude-opus-4-5", + "perplexity-agent/anthropic/claude-opus-4-5", + "requesty/anthropic/claude-opus-4-5", + "venice/claude-opus-4-5", + "vertex_ai-anthropic_models/vertex_ai/claude-opus-4-5" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-opus-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-opus-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "claude-opus-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "claude-opus-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "anthropic/claude-opus-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "neon", + "model": "claude-opus-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "claude-opus-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "anthropic/claude-opus-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "anthropic/claude-opus-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "claude-opus-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.6, + "cacheWrite": 7.5, + "input": 6, + "output": 30 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-opus-4-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/claude-opus-4-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.5", + "Claude Opus 4.5 (latest)", + "claude-opus-4-5" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-11-25", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-opus-4-5", + "modelKey": "claude-opus-4-5", + "displayName": "claude-opus-4-5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-11-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-opus-4-5", + "modelKey": "claude-opus-4-5", + "displayName": "Claude Opus 4.5 (latest)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-24", + "openWeights": false, + "releaseDate": "2025-11-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "claude-opus-4-5", + "modelKey": "claude-opus-4-5", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-01", + "openWeights": false, + "releaseDate": "2025-11-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "claude-opus-4-5", + "modelKey": "claude-opus-4-5", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-01", + "openWeights": false, + "releaseDate": "2025-11-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "anthropic/claude-opus-4-5", + "modelKey": "anthropic/claude-opus-4-5", + "displayName": "Claude Opus 4.5 (latest)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-24", + "openWeights": false, + "releaseDate": "2025-11-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "claude-opus-4-5", + "modelKey": "claude-opus-4-5", + "displayName": "Claude Opus 4.5 (latest)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-24", + "openWeights": false, + "releaseDate": "2025-11-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "claude-opus-4-5", + "modelKey": "claude-opus-4-5", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-24", + "openWeights": false, + "releaseDate": "2025-11-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "anthropic/claude-opus-4-5", + "modelKey": "anthropic/claude-opus-4-5", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-24", + "openWeights": false, + "releaseDate": "2025-11-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "anthropic/claude-opus-4-5", + "modelKey": "anthropic/claude-opus-4-5", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-24", + "openWeights": false, + "releaseDate": "2025-11-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "claude-opus-4-5", + "modelKey": "claude-opus-4-5", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2025-12-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-opus-4-5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/claude-opus-4-5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-5", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-opus-4-5-20251101", + "provider": "anthropic", + "model": "claude-opus-4-5-20251101", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "abacus", + "anthropic", + "jiekou", + "llmgateway", + "merge-gateway", + "nano-gpt", + "qihang-ai" + ], + "aliases": [ + "302ai/claude-opus-4-5-20251101", + "abacus/claude-opus-4-5-20251101", + "anthropic/claude-opus-4-5-20251101", + "jiekou/claude-opus-4-5-20251101", + "llmgateway/claude-opus-4-5-20251101", + "merge-gateway/anthropic/claude-opus-4-5-20251101", + "nano-gpt/claude-opus-4-5-20251101", + "qihang-ai/claude-opus-4-5-20251101" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-opus-4-5-20251101", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "claude-opus-4-5-20251101", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-opus-4-5-20251101", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "claude-opus-4-5-20251101", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4.5, + "output": 22.5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "claude-opus-4-5-20251101", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "anthropic/claude-opus-4-5-20251101", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-opus-4-5-20251101", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4.998, + "output": 25.007 + } + }, + { + "source": "models.dev", + "provider": "qihang-ai", + "model": "claude-opus-4-5-20251101", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.71, + "output": 3.57 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-opus-4-5-20251101", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4.5 Opus", + "Claude Opus 4.5", + "claude-opus-4-5-20251101" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-11-25", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-opus-4-5-20251101", + "modelKey": "claude-opus-4-5-20251101", + "displayName": "claude-opus-4-5-20251101", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-11-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "claude-opus-4-5-20251101", + "modelKey": "claude-opus-4-5-20251101", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-01", + "openWeights": false, + "releaseDate": "2025-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-opus-4-5-20251101", + "modelKey": "claude-opus-4-5-20251101", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-01", + "openWeights": false, + "releaseDate": "2025-11-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "claude-opus-4-5-20251101", + "modelKey": "claude-opus-4-5-20251101", + "displayName": "claude-opus-4-5-20251101", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "claude-opus-4-5-20251101", + "modelKey": "claude-opus-4-5-20251101", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-01", + "openWeights": false, + "releaseDate": "2025-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "anthropic/claude-opus-4-5-20251101", + "modelKey": "anthropic/claude-opus-4-5-20251101", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-01", + "openWeights": false, + "releaseDate": "2025-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-opus-4-5-20251101", + "modelKey": "claude-opus-4-5-20251101", + "displayName": "Claude 4.5 Opus", + "metadata": { + "lastUpdated": "2025-11-01", + "openWeights": false, + "releaseDate": "2025-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qihang-ai", + "providerName": "QiHang", + "providerApi": "https://api.qhaigc.net/v1", + "providerDoc": "https://www.qhaigc.net/docs", + "model": "claude-opus-4-5-20251101", + "modelKey": "claude-opus-4-5-20251101", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2025-11-01", + "openWeights": false, + "releaseDate": "2025-11-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-opus-4-5-20251101", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-opus-4-5-20251101-thinking", + "provider": "anthropic", + "model": "claude-opus-4-5-20251101-thinking", + "displayName": "claude-opus-4-5-20251101-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai" + ], + "aliases": [ + "302ai/claude-opus-4-5-20251101-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-opus-4-5-20251101-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "claude-opus-4-5-20251101-thinking" + ], + "knowledgeCutoff": "2025-03", + "releaseDate": "2025-11-25", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-opus-4-5-20251101-thinking", + "modelKey": "claude-opus-4-5-20251101-thinking", + "displayName": "claude-opus-4-5-20251101-thinking", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-11-25" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-5-20251101:thinking", + "provider": "anthropic", + "model": "claude-opus-4-5-20251101:thinking", + "displayName": "Claude 4.5 Opus Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claude-opus-4-5-20251101:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-opus-4-5-20251101:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4.998, + "output": 25.007 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4.5 Opus Thinking" + ], + "releaseDate": "2025-11-01", + "lastUpdated": "2025-11-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-opus-4-5-20251101:thinking", + "modelKey": "claude-opus-4-5-20251101:thinking", + "displayName": "Claude 4.5 Opus Thinking", + "metadata": { + "lastUpdated": "2025-11-01", + "openWeights": false, + "releaseDate": "2025-11-01" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-5@20251101", + "provider": "anthropic", + "model": "claude-opus-4-5@20251101", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "google-vertex-anthropic", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "google-vertex-anthropic/claude-opus-4-5@20251101", + "google-vertex/claude-opus-4-5@20251101", + "vertex_ai-anthropic_models/vertex_ai/claude-opus-4-5@20251101" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStreaming": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex-anthropic", + "model": "claude-opus-4-5@20251101", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "claude-opus-4-5@20251101", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-5@20251101", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.5" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-11-01", + "lastUpdated": "2025-11-01", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex-anthropic", + "providerName": "Vertex (Anthropic)", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude", + "model": "claude-opus-4-5@20251101", + "modelKey": "claude-opus-4-5@20251101", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-01", + "openWeights": false, + "releaseDate": "2025-11-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "claude-opus-4-5@20251101", + "modelKey": "claude-opus-4-5@20251101", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-01", + "openWeights": false, + "releaseDate": "2025-11-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-5@20251101", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-opus-4-6", + "provider": "anthropic", + "model": "claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "abacus", + "aihubmix", + "anthropic", + "anyapi", + "auriko", + "azure", + "azure-cognitive-services", + "azure_ai", + "cloudflare-ai-gateway", + "freemodel", + "frogbot", + "jiekou", + "llmgateway", + "merge-gateway", + "nearai", + "neon", + "opencode", + "perplexity-agent", + "requesty", + "venice", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "302ai/claude-opus-4-6", + "abacus/claude-opus-4-6", + "aihubmix/claude-opus-4-6", + "anthropic/claude-opus-4-6", + "anyapi/anthropic/claude-opus-4-6", + "auriko/claude-opus-4-6", + "azure-cognitive-services/claude-opus-4-6", + "azure/claude-opus-4-6", + "azure_ai/claude-opus-4-6", + "cloudflare-ai-gateway/anthropic/claude-opus-4-6", + "freemodel/claude-opus-4-6", + "frogbot/claude-opus-4-6", + "jiekou/claude-opus-4-6", + "llmgateway/claude-opus-4-6", + "merge-gateway/anthropic/claude-opus-4-6", + "nearai/anthropic/claude-opus-4-6", + "neon/claude-opus-4-6", + "opencode/claude-opus-4-6", + "perplexity-agent/anthropic/claude-opus-4-6", + "requesty/anthropic/claude-opus-4-6", + "venice/claude-opus-4-6", + "vertex_ai-anthropic_models/vertex_ai/claude-opus-4-6" + ], + "mergedProviderModelRecords": 22, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "adaptiveThinking": true, + "assistantPrefill": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "maxReasoningEffort": true, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": true, + "interleaved": true, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "aihubmix", + "model": "claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "auriko", + "model": "claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "anthropic/claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "freemodel", + "model": "claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "frogbot", + "model": "claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "anthropic/claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "anthropic/claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "neon", + "model": "claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "anthropic/claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "anthropic/claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.6, + "cacheWrite": 7.5, + "input": 6, + "output": 30 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-opus-4-6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/claude-opus-4-6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.6", + "Claude Opus 4.6 (latest)", + "claude-opus-4-6" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-05-31", + "releaseDate": "2026-02-06", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 22 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-opus-4-6", + "modelKey": "claude-opus-4-6", + "displayName": "claude-opus-4-6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "claude-opus-4-6", + "modelKey": "claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "claude-opus-4-6", + "modelKey": "claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-opus-4-6", + "modelKey": "claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "anthropic/claude-opus-4-6", + "modelKey": "anthropic/claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 127999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "auriko", + "providerName": "Auriko", + "providerApi": "https://api.auriko.ai/v1", + "providerDoc": "https://docs.auriko.ai", + "model": "claude-opus-4-6", + "modelKey": "claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "claude-opus-4-6", + "modelKey": "claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "claude-opus-4-6", + "modelKey": "claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "anthropic/claude-opus-4-6", + "modelKey": "anthropic/claude-opus-4-6", + "displayName": "Claude Opus 4.6 (latest)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "freemodel", + "providerName": "FreeModel", + "providerApi": "https://cc.freemodel.dev/v1", + "providerDoc": "https://freemodel.dev", + "model": "claude-opus-4-6", + "modelKey": "claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "claude-opus-4-6", + "modelKey": "claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "claude-opus-4-6", + "modelKey": "claude-opus-4-6", + "displayName": "claude-opus-4-6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-02", + "openWeights": false, + "releaseDate": "2026-02", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 127999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "claude-opus-4-6", + "modelKey": "claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "anthropic/claude-opus-4-6", + "modelKey": "anthropic/claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "anthropic/claude-opus-4-6", + "modelKey": "anthropic/claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "claude-opus-4-6", + "modelKey": "claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 127999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "claude-opus-4-6", + "modelKey": "claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 127999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "anthropic/claude-opus-4-6", + "modelKey": "anthropic/claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "anthropic/claude-opus-4-6", + "modelKey": "anthropic/claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "claude-opus-4-6", + "modelKey": "claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-opus-4-6", + "mode": "chat", + "metadata": { + "providerSpecificEntry": { + "us": 1.1, + "fast": 6 + } + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/claude-opus-4-6", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-6", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-opus-4-6-20260205", + "provider": "anthropic", + "model": "claude-opus-4-6-20260205", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "anthropic" + ], + "aliases": [ + "anthropic/claude-opus-4-6-20260205" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "adaptiveThinking": true, + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-opus-4-6-20260205", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-opus-4-6-20260205", + "mode": "chat", + "metadata": { + "providerSpecificEntry": { + "us": 1.1, + "fast": 6 + } + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-6-fast", + "provider": "anthropic", + "model": "claude-opus-4-6-fast", + "displayName": "Claude Opus 4.6 Fast", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/claude-opus-4-6-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "claude-opus-4-6-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 3.6, + "cacheWrite": 45, + "input": 36, + "output": 180 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.6 Fast" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-05-31", + "releaseDate": "2026-04-08", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "claude-opus-4-6-fast", + "modelKey": "claude-opus-4-6-fast", + "displayName": "Claude Opus 4.6 Fast", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-04-08" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-6-think", + "provider": "anthropic", + "model": "claude-opus-4-6-think", + "displayName": "Claude Opus 4.6 Thinking", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/claude-opus-4-6-think" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "claude-opus-4-6-think", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.6 Thinking" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-05-31", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "claude-opus-4-6-think", + "modelKey": "claude-opus-4-6-think", + "displayName": "Claude Opus 4.6 Thinking", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-6-thinking", + "provider": "anthropic", + "model": "claude-opus-4-6-thinking", + "displayName": "claude-opus-4-6-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai" + ], + "aliases": [ + "302ai/claude-opus-4-6-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-opus-4-6-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "claude-opus-4-6-thinking" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2026-02-06", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-opus-4-6-thinking", + "modelKey": "claude-opus-4-6-thinking", + "displayName": "claude-opus-4-6-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-06" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-6@default", + "provider": "anthropic", + "model": "claude-opus-4-6@default", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "google-vertex-anthropic", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "google-vertex-anthropic/claude-opus-4-6@default", + "google-vertex/claude-opus-4-6@default", + "vertex_ai-anthropic_models/vertex_ai/claude-opus-4-6@default" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "assistantPrefill": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "maxReasoningEffort": true, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex-anthropic", + "model": "claude-opus-4-6@default", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "claude-opus-4-6@default", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-6@default", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.6" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-05-31", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex-anthropic", + "providerName": "Vertex (Anthropic)", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude", + "model": "claude-opus-4-6@default", + "modelKey": "claude-opus-4-6@default", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "claude-opus-4-6@default", + "modelKey": "claude-opus-4-6@default", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-6@default", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-opus-4-7", + "provider": "anthropic", + "model": "claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "aihubmix", + "anthropic", + "anyapi", + "auriko", + "azure_ai", + "cloudflare-ai-gateway", + "freemodel", + "frogbot", + "llmgateway", + "merge-gateway", + "nearai", + "neon", + "opencode", + "perplexity-agent", + "snowflake-cortex", + "venice", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "302ai/claude-opus-4-7", + "aihubmix/claude-opus-4-7", + "anthropic/claude-opus-4-7", + "anyapi/anthropic/claude-opus-4-7", + "auriko/claude-opus-4-7", + "azure_ai/claude-opus-4-7", + "cloudflare-ai-gateway/anthropic/claude-opus-4-7", + "freemodel/claude-opus-4-7", + "frogbot/claude-opus-4-7", + "llmgateway/claude-opus-4-7", + "merge-gateway/anthropic/claude-opus-4-7", + "nearai/anthropic/claude-opus-4-7", + "neon/claude-opus-4-7", + "opencode/claude-opus-4-7", + "perplexity-agent/anthropic/claude-opus-4-7", + "snowflake-cortex/claude-opus-4-7", + "venice/claude-opus-4-7", + "vertex_ai-anthropic_models/vertex_ai/claude-opus-4-7" + ], + "mergedProviderModelRecords": 18, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "adaptiveThinking": true, + "assistantPrefill": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "maxReasoningEffort": true, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true, + "interleaved": true, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "aihubmix", + "model": "claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "auriko", + "model": "claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "anthropic/claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "freemodel", + "model": "claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "frogbot", + "model": "claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "anthropic/claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "anthropic/claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "neon", + "model": "claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "anthropic/claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.6, + "cacheWrite": 7.5, + "input": 6, + "output": 30 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-opus-4-7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/claude-opus-4-7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.7", + "claude-opus-4-7" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-04-17", + "lastUpdated": "2026-04-17", + "providerModelRecordCount": 18 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-opus-4-7", + "modelKey": "claude-opus-4-7", + "displayName": "claude-opus-4-7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-17", + "openWeights": false, + "releaseDate": "2026-04-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "claude-opus-4-7", + "modelKey": "claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-opus-4-7", + "modelKey": "claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "anthropic/claude-opus-4-7", + "modelKey": "anthropic/claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "auriko", + "providerName": "Auriko", + "providerApi": "https://api.auriko.ai/v1", + "providerDoc": "https://docs.auriko.ai", + "model": "claude-opus-4-7", + "modelKey": "claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "anthropic/claude-opus-4-7", + "modelKey": "anthropic/claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "freemodel", + "providerName": "FreeModel", + "providerApi": "https://cc.freemodel.dev/v1", + "providerDoc": "https://freemodel.dev", + "model": "claude-opus-4-7", + "modelKey": "claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "claude-opus-4-7", + "modelKey": "claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "claude-opus-4-7", + "modelKey": "claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "anthropic/claude-opus-4-7", + "modelKey": "anthropic/claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "anthropic/claude-opus-4-7", + "modelKey": "anthropic/claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "claude-opus-4-7", + "modelKey": "claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 127999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "claude-opus-4-7", + "modelKey": "claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "anthropic/claude-opus-4-7", + "modelKey": "anthropic/claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "claude-opus-4-7", + "modelKey": "claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "status": "beta", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "claude-opus-4-7", + "modelKey": "claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-04-16" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-opus-4-7", + "mode": "chat", + "metadata": { + "providerSpecificEntry": { + "us": 1.1, + "fast": 6 + } + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/claude-opus-4-7", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-7", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-opus-4-7-20260416", + "provider": "anthropic", + "model": "claude-opus-4-7-20260416", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "anthropic" + ], + "aliases": [ + "anthropic/claude-opus-4-7-20260416" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "adaptiveThinking": true, + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-opus-4-7-20260416", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-opus-4-7-20260416", + "mode": "chat", + "metadata": { + "providerSpecificEntry": { + "us": 1.1, + "fast": 6 + } + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-7-fast", + "provider": "anthropic", + "model": "claude-opus-4-7-fast", + "displayName": "Claude Opus 4.7 Fast", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/claude-opus-4-7-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "claude-opus-4-7-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 3.6, + "cacheWrite": 45, + "input": 36, + "output": 180 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.7 Fast" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-05-14", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "claude-opus-4-7-fast", + "modelKey": "claude-opus-4-7-fast", + "displayName": "Claude Opus 4.7 Fast", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-05-14" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-7-think", + "provider": "anthropic", + "model": "claude-opus-4-7-think", + "displayName": "Claude Opus 4.7 Thinking", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/claude-opus-4-7-think" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "claude-opus-4-7-think", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.7 Thinking" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "claude-opus-4-7-think", + "modelKey": "claude-opus-4-7-think", + "displayName": "Claude Opus 4.7 Thinking", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-7@default", + "provider": "anthropic", + "model": "claude-opus-4-7@default", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "google-vertex-anthropic", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "google-vertex-anthropic/claude-opus-4-7@default", + "google-vertex/claude-opus-4-7@default", + "vertex_ai-anthropic_models/vertex_ai/claude-opus-4-7@default" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "assistantPrefill": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "maxReasoningEffort": true, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "xhighReasoningEffort": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex-anthropic", + "model": "claude-opus-4-7@default", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "claude-opus-4-7@default", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-7@default", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.7" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex-anthropic", + "providerName": "Vertex (Anthropic)", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude", + "model": "claude-opus-4-7@default", + "modelKey": "claude-opus-4-7@default", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "claude-opus-4-7@default", + "modelKey": "claude-opus-4-7@default", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-7@default", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-opus-4-8", + "provider": "anthropic", + "model": "claude-opus-4-8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "anthropic", + "azure_ai", + "cloudflare-ai-gateway", + "freemodel", + "llmgateway", + "opencode", + "snowflake-cortex", + "venice", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "anthropic/claude-opus-4-8", + "azure_ai/claude-opus-4-8", + "cloudflare-ai-gateway/anthropic/claude-opus-4-8", + "freemodel/claude-opus-4-8", + "llmgateway/claude-opus-4-8", + "opencode/claude-opus-4-8", + "snowflake-cortex/claude-opus-4-8", + "venice/claude-opus-4-8", + "vertex_ai-anthropic_models/vertex_ai/claude-opus-4-8" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "adaptiveThinking": true, + "assistantPrefill": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "maxReasoningEffort": true, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-opus-4-8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "anthropic/claude-opus-4-8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "freemodel", + "model": "claude-opus-4-8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "claude-opus-4-8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "claude-opus-4-8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "claude-opus-4-8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.6, + "cacheWrite": 7.5, + "input": 6, + "output": 30 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-opus-4-8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/claude-opus-4-8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.8" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-05-28", + "lastUpdated": "2026-05-28", + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-opus-4-8", + "modelKey": "claude-opus-4-8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "anthropic/claude-opus-4-8", + "modelKey": "anthropic/claude-opus-4-8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "freemodel", + "providerName": "FreeModel", + "providerApi": "https://cc.freemodel.dev/v1", + "providerDoc": "https://freemodel.dev", + "model": "claude-opus-4-8", + "modelKey": "claude-opus-4-8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "claude-opus-4-8", + "modelKey": "claude-opus-4-8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "claude-opus-4-8", + "modelKey": "claude-opus-4-8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "claude-opus-4-8", + "modelKey": "claude-opus-4-8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "claude-opus-4-8", + "modelKey": "claude-opus-4-8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-05-28" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-opus-4-8", + "mode": "chat", + "metadata": { + "providerSpecificEntry": { + "us": 1.1, + "fast": 2 + } + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/claude-opus-4-8", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-8", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-opus-4-8-fast", + "provider": "anthropic", + "model": "claude-opus-4-8-fast", + "displayName": "Claude Opus 4.8 Fast", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/claude-opus-4-8-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "claude-opus-4-8-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.2, + "cacheWrite": 15, + "input": 12, + "output": 60 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.8 Fast" + ], + "families": [ + "claude-opus" + ], + "releaseDate": "2026-05-28", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "claude-opus-4-8-fast", + "modelKey": "claude-opus-4-8-fast", + "displayName": "Claude Opus 4.8 Fast", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-05-28" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-8@default", + "provider": "anthropic", + "model": "claude-opus-4-8@default", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "google-vertex-anthropic", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "google-vertex-anthropic/claude-opus-4-8@default", + "google-vertex/claude-opus-4-8@default", + "vertex_ai-anthropic_models/vertex_ai/claude-opus-4-8@default" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "adaptiveThinking": true, + "assistantPrefill": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "maxReasoningEffort": true, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "xhighReasoningEffort": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex-anthropic", + "model": "claude-opus-4-8@default", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "claude-opus-4-8@default", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-8@default", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.8" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-05-28", + "lastUpdated": "2026-05-28", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex-anthropic", + "providerName": "Vertex (Anthropic)", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude", + "model": "claude-opus-4-8@default", + "modelKey": "claude-opus-4-8@default", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "claude-opus-4-8@default", + "modelKey": "claude-opus-4-8@default", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4-8@default", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-opus-4-thinking", + "provider": "anthropic", + "model": "claude-opus-4-thinking", + "displayName": "Claude 4 Opus Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claude-opus-4-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-opus-4-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14.994, + "output": 75.004 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4 Opus Thinking" + ], + "releaseDate": "2025-07-15", + "lastUpdated": "2025-07-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-opus-4-thinking", + "modelKey": "claude-opus-4-thinking", + "displayName": "Claude 4 Opus Thinking", + "metadata": { + "lastUpdated": "2025-07-15", + "openWeights": false, + "releaseDate": "2025-07-15" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-thinking:1024", + "provider": "anthropic", + "model": "claude-opus-4-thinking:1024", + "displayName": "Claude 4 Opus Thinking (1K)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claude-opus-4-thinking:1024" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-opus-4-thinking:1024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14.994, + "output": 75.004 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4 Opus Thinking (1K)" + ], + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-opus-4-thinking:1024", + "modelKey": "claude-opus-4-thinking:1024", + "displayName": "Claude 4 Opus Thinking (1K)", + "metadata": { + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-thinking:32000", + "provider": "anthropic", + "model": "claude-opus-4-thinking:32000", + "displayName": "Claude 4 Opus Thinking (32K)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claude-opus-4-thinking:32000" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-opus-4-thinking:32000", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14.994, + "output": 75.004 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4 Opus Thinking (32K)" + ], + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-opus-4-thinking:32000", + "modelKey": "claude-opus-4-thinking:32000", + "displayName": "Claude 4 Opus Thinking (32K)", + "metadata": { + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-thinking:32768", + "provider": "anthropic", + "model": "claude-opus-4-thinking:32768", + "displayName": "Claude 4 Opus Thinking (32K)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claude-opus-4-thinking:32768" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-opus-4-thinking:32768", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14.994, + "output": 75.004 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4 Opus Thinking (32K)" + ], + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-opus-4-thinking:32768", + "modelKey": "claude-opus-4-thinking:32768", + "displayName": "Claude 4 Opus Thinking (32K)", + "metadata": { + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4-thinking:8192", + "provider": "anthropic", + "model": "claude-opus-4-thinking:8192", + "displayName": "Claude 4 Opus Thinking (8K)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claude-opus-4-thinking:8192" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-opus-4-thinking:8192", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14.994, + "output": 75.004 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4 Opus Thinking (8K)" + ], + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-opus-4-thinking:8192", + "modelKey": "claude-opus-4-thinking:8192", + "displayName": "Claude 4 Opus Thinking (8K)", + "metadata": { + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4.1", + "provider": "anthropic", + "model": "claude-opus-4.1", + "displayName": "Claude Opus 4.1 (latest)", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "fastrouter", + "kilo", + "openrouter", + "orcarouter", + "poe", + "vercel", + "vercel_ai_gateway", + "zenmux" + ], + "aliases": [ + "fastrouter/anthropic/claude-opus-4.1", + "kilo/anthropic/claude-opus-4.1", + "openrouter/anthropic/claude-opus-4.1", + "orcarouter/anthropic/claude-opus-4.1", + "poe/anthropic/claude-opus-4.1", + "vercel/anthropic/claude-opus-4.1", + "vercel_ai_gateway/anthropic/claude-opus-4.1", + "zenmux/anthropic/claude-opus-4.1" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 32000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fastrouter", + "model": "anthropic/claude-opus-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "anthropic/claude-opus-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "anthropic/claude-opus-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "anthropic/claude-opus-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.3, + "cacheWrite": 16, + "input": 13, + "output": 64 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "anthropic/claude-opus-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "anthropic/claude-opus-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-opus-4.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "perImage": { + "input": 0.0048 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00003 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-opus-4.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Opus 4.1", + "Claude Opus 4.1", + "Claude Opus 4.1 (latest)", + "Claude-Opus-4.1" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "anthropic/claude-opus-4.1", + "modelKey": "anthropic/claude-opus-4.1", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024, + "max": 32000 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "anthropic/claude-opus-4.1", + "modelKey": "anthropic/claude-opus-4.1", + "displayName": "Anthropic: Claude Opus 4.1", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "anthropic/claude-opus-4.1", + "modelKey": "anthropic/claude-opus-4.1", + "displayName": "Claude Opus 4.1 (latest)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 31999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "anthropic/claude-opus-4.1", + "modelKey": "anthropic/claude-opus-4.1", + "displayName": "Claude Opus 4.1 (latest)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "anthropic/claude-opus-4.1", + "modelKey": "anthropic/claude-opus-4.1", + "displayName": "Claude-Opus-4.1", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "anthropic/claude-opus-4.1", + "modelKey": "anthropic/claude-opus-4.1", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "anthropic/claude-opus-4.1", + "modelKey": "anthropic/claude-opus-4.1", + "displayName": "Claude Opus 4.1", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-opus-4.1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-opus-4.1", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.1", + "displayName": "Anthropic: Claude Opus 4.1", + "metadata": { + "canonicalSlug": "anthropic/claude-4.1-opus-20250805", + "createdAt": "2025-08-05T16:33:11.000Z", + "knowledgeCutoff": "2025-01-31", + "links": { + "details": "/api/v1/models/anthropic/claude-4.1-opus-20250805/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Claude", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 32000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "anthropic/claude-opus-4.5", + "provider": "anthropic", + "model": "claude-opus-4.5", + "displayName": "Claude Opus 4.5 (latest)", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "github-copilot", + "github_copilot", + "gmi", + "kilo", + "openrouter", + "orcarouter", + "poe", + "vercel", + "vercel_ai_gateway", + "zenmux" + ], + "aliases": [ + "github-copilot/claude-opus-4.5", + "github_copilot/claude-opus-4.5", + "gmi/anthropic/claude-opus-4.5", + "kilo/anthropic/claude-opus-4.5", + "openrouter/anthropic/claude-opus-4.5", + "orcarouter/anthropic/claude-opus-4.5", + "poe/anthropic/claude-opus-4.5", + "vercel/anthropic/claude-opus-4.5", + "vercel_ai_gateway/anthropic/claude-opus-4.5", + "zenmux/anthropic/claude-opus-4.5" + ], + "mergedProviderModelRecords": 10, + "limits": { + "contextTokens": 409600, + "inputTokens": 409600, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false, + "interleaved": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-copilot", + "model": "claude-opus-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "anthropic/claude-opus-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "anthropic/claude-opus-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "anthropic/claude-opus-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.43, + "cacheWrite": 5.3, + "input": 4.3, + "output": 21 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "anthropic/claude-opus-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "anthropic/claude-opus-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/claude-opus-4.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "gmi", + "model": "gmi/anthropic/claude-opus-4.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5, + "output": 25 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-opus-4.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-opus-4.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.5", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Opus 4.5", + "Claude Opus 4.5", + "Claude Opus 4.5 (latest)", + "Claude-Opus-4.5" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-11-24", + "lastUpdated": "2025-11-24", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "verbosity" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 10 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "claude-opus-4.5", + "modelKey": "claude-opus-4.5", + "displayName": "Claude Opus 4.5 (latest)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-24", + "openWeights": false, + "releaseDate": "2025-11-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "anthropic/claude-opus-4.5", + "modelKey": "anthropic/claude-opus-4.5", + "displayName": "Anthropic: Claude Opus 4.5", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-11-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "anthropic/claude-opus-4.5", + "modelKey": "anthropic/claude-opus-4.5", + "displayName": "Claude Opus 4.5 (latest)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-24", + "openWeights": false, + "releaseDate": "2025-11-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "anthropic/claude-opus-4.5", + "modelKey": "anthropic/claude-opus-4.5", + "displayName": "Claude Opus 4.5 (latest)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-24", + "openWeights": false, + "releaseDate": "2025-11-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "anthropic/claude-opus-4.5", + "modelKey": "anthropic/claude-opus-4.5", + "displayName": "Claude-Opus-4.5", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2025-11-21", + "openWeights": false, + "releaseDate": "2025-11-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "anthropic/claude-opus-4.5", + "modelKey": "anthropic/claude-opus-4.5", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-24", + "openWeights": false, + "releaseDate": "2024-11-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "anthropic/claude-opus-4.5", + "modelKey": "anthropic/claude-opus-4.5", + "displayName": "Claude Opus 4.5", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-11-24", + "openWeights": false, + "releaseDate": "2025-11-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/claude-opus-4.5", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gmi", + "model": "gmi/anthropic/claude-opus-4.5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-opus-4.5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-opus-4.5", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.5", + "displayName": "Anthropic: Claude Opus 4.5", + "metadata": { + "canonicalSlug": "anthropic/claude-4.5-opus-20251124", + "createdAt": "2025-11-24T18:56:20.000Z", + "links": { + "details": "/api/v1/models/anthropic/claude-4.5-opus-20251124/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "verbosity" + ], + "tokenizer": "Claude", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 64000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "anthropic/claude-opus-4.6", + "provider": "anthropic", + "model": "claude-opus-4.6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "github-copilot", + "gmicloud", + "kilo", + "nano-gpt", + "openrouter", + "orcarouter", + "poe", + "vercel", + "vercel_ai_gateway", + "zenmux" + ], + "aliases": [ + "github-copilot/claude-opus-4.6", + "gmicloud/anthropic/claude-opus-4.6", + "kilo/anthropic/claude-opus-4.6", + "kilo/stealth/claude-opus-4.6", + "nano-gpt/anthropic/claude-opus-4.6", + "openrouter/anthropic/claude-opus-4.6", + "orcarouter/anthropic/claude-opus-4.6", + "poe/anthropic/claude-opus-4.6", + "vercel/anthropic/claude-opus-4.6", + "vercel_ai_gateway/anthropic/claude-opus-4.6", + "zenmux/anthropic/claude-opus-4.6" + ], + "mergedProviderModelRecords": 11, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "maxReasoningEffort": true, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": true, + "interleaved": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-copilot", + "model": "claude-opus-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "gmicloud", + "model": "anthropic/claude-opus-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "anthropic/claude-opus-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "stealth/claude-opus-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.4, + "cacheWrite": 5, + "input": 4, + "output": 20 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "anthropic/claude-opus-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4.998, + "output": 25.007 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "anthropic/claude-opus-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "anthropic/claude-opus-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.43, + "cacheWrite": 5.3, + "input": 4.3, + "output": 21 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "anthropic/claude-opus-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "anthropic/claude-opus-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-opus-4.6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-opus-4.6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.6", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Opus 4.6", + "Claude 4.6 Opus", + "Claude Opus 4.6", + "Claude-Opus-4.6", + "Stealth: Claude Opus 4.6 (20% off)" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-05-31", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-03-13", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p", + "verbosity" + ], + "providerModelRecordCount": 11 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "claude-opus-4.6", + "modelKey": "claude-opus-4.6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gmicloud", + "providerName": "GMI Cloud", + "providerApi": "https://api.gmi-serving.com/v1", + "providerDoc": "https://docs.gmicloud.ai/inference-engine/api-reference/llm-api-reference", + "model": "anthropic/claude-opus-4.6", + "modelKey": "anthropic/claude-opus-4.6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024, + "max": 127999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "anthropic/claude-opus-4.6", + "modelKey": "anthropic/claude-opus-4.6", + "displayName": "Anthropic: Claude Opus 4.6", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "stealth/claude-opus-4.6", + "modelKey": "stealth/claude-opus-4.6", + "displayName": "Stealth: Claude Opus 4.6 (20% off)", + "metadata": { + "lastUpdated": "2026-05-27", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "anthropic/claude-opus-4.6", + "modelKey": "anthropic/claude-opus-4.6", + "displayName": "Claude 4.6 Opus", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "anthropic/claude-opus-4.6", + "modelKey": "anthropic/claude-opus-4.6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 127999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "anthropic/claude-opus-4.6", + "modelKey": "anthropic/claude-opus-4.6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "anthropic/claude-opus-4.6", + "modelKey": "anthropic/claude-opus-4.6", + "displayName": "Claude-Opus-4.6", + "metadata": { + "lastUpdated": "2026-02-04", + "openWeights": false, + "releaseDate": "2026-02-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "anthropic/claude-opus-4.6", + "modelKey": "anthropic/claude-opus-4.6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "anthropic/claude-opus-4.6", + "modelKey": "anthropic/claude-opus-4.6", + "displayName": "Claude Opus 4.6", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-02-06", + "openWeights": false, + "releaseDate": "2026-02-06", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-opus-4.6", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-opus-4.6", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.6", + "displayName": "Anthropic: Claude Opus 4.6", + "metadata": { + "canonicalSlug": "anthropic/claude-4.6-opus-20260205", + "createdAt": "2026-02-04T15:30:50.000Z", + "links": { + "details": "/api/v1/models/anthropic/claude-4.6-opus-20260205/endpoints" + }, + "reasoning": { + "mandatory": false, + "supports_max_tokens": true + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p", + "verbosity" + ], + "tokenizer": "Claude", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 128000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "anthropic/claude-opus-4.6-fast", + "provider": "anthropic", + "model": "claude-opus-4.6-fast", + "displayName": "Anthropic: Claude Opus 4.6 (Fast)", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "github_copilot", + "kilo", + "openrouter" + ], + "aliases": [ + "github_copilot/claude-opus-4.6-fast", + "kilo/anthropic/claude-opus-4.6-fast", + "openrouter/anthropic/claude-opus-4.6-fast" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1000000, + "inputTokens": 128000, + "maxTokens": 16000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "anthropic/claude-opus-4.6-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 3, + "cacheWrite": 37.5, + "input": 30, + "output": 150 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.6-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 3, + "cacheWrite": 37.5, + "input": 30, + "output": 150 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/claude-opus-4.6-fast", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.6-fast", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 3, + "cacheWrite": 37.5, + "input": 30, + "output": 150 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Opus 4.6 (Fast)", + "Claude Opus 4.6 (Fast)" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-05-31", + "releaseDate": "2026-04-07", + "lastUpdated": "2026-04-11", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p", + "verbosity" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "anthropic/claude-opus-4.6-fast", + "modelKey": "anthropic/claude-opus-4.6-fast", + "displayName": "Anthropic: Claude Opus 4.6 (Fast)", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-04-11", + "openWeights": false, + "releaseDate": "2026-04-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "anthropic/claude-opus-4.6-fast", + "modelKey": "anthropic/claude-opus-4.6-fast", + "displayName": "Claude Opus 4.6 (Fast)", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": false, + "releaseDate": "2026-04-07", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 127999 + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/claude-opus-4.6-fast", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.6-fast", + "displayName": "Anthropic: Claude Opus 4.6 (Fast)", + "metadata": { + "canonicalSlug": "anthropic/claude-4.6-opus-fast-20260407", + "createdAt": "2026-04-07T20:07:52.000Z", + "expirationDate": "2026-06-29", + "links": { + "details": "/api/v1/models/anthropic/claude-4.6-opus-fast-20260407/endpoints" + }, + "reasoning": { + "mandatory": false, + "supports_max_tokens": true + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p", + "verbosity" + ], + "tokenizer": "Claude", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "anthropic/claude-opus-4.6:thinking", + "provider": "anthropic", + "model": "claude-opus-4.6:thinking", + "displayName": "Claude 4.6 Opus Thinking", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/anthropic/claude-opus-4.6:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "anthropic/claude-opus-4.6:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4.998, + "output": 25.007 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4.6 Opus Thinking" + ], + "families": [ + "claude-opus" + ], + "releaseDate": "2026-02-05", + "lastUpdated": "2026-02-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "anthropic/claude-opus-4.6:thinking", + "modelKey": "anthropic/claude-opus-4.6:thinking", + "displayName": "Claude 4.6 Opus Thinking", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4.6:thinking:low", + "provider": "anthropic", + "model": "claude-opus-4.6:thinking:low", + "displayName": "Claude 4.6 Opus Thinking Low", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/anthropic/claude-opus-4.6:thinking:low" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "anthropic/claude-opus-4.6:thinking:low", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4.998, + "output": 25.007 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4.6 Opus Thinking Low" + ], + "families": [ + "claude-opus" + ], + "releaseDate": "2026-02-05", + "lastUpdated": "2026-02-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "anthropic/claude-opus-4.6:thinking:low", + "modelKey": "anthropic/claude-opus-4.6:thinking:low", + "displayName": "Claude 4.6 Opus Thinking Low", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4.6:thinking:max", + "provider": "anthropic", + "model": "claude-opus-4.6:thinking:max", + "displayName": "Claude 4.6 Opus Thinking Max", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/anthropic/claude-opus-4.6:thinking:max" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "anthropic/claude-opus-4.6:thinking:max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4.998, + "output": 25.007 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4.6 Opus Thinking Max" + ], + "families": [ + "claude-opus" + ], + "releaseDate": "2026-02-05", + "lastUpdated": "2026-02-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "anthropic/claude-opus-4.6:thinking:max", + "modelKey": "anthropic/claude-opus-4.6:thinking:max", + "displayName": "Claude 4.6 Opus Thinking Max", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4.6:thinking:medium", + "provider": "anthropic", + "model": "claude-opus-4.6:thinking:medium", + "displayName": "Claude 4.6 Opus Thinking Medium", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/anthropic/claude-opus-4.6:thinking:medium" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "anthropic/claude-opus-4.6:thinking:medium", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4.998, + "output": 25.007 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4.6 Opus Thinking Medium" + ], + "families": [ + "claude-opus" + ], + "releaseDate": "2026-02-05", + "lastUpdated": "2026-02-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "anthropic/claude-opus-4.6:thinking:medium", + "modelKey": "anthropic/claude-opus-4.6:thinking:medium", + "displayName": "Claude 4.6 Opus Thinking Medium", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4.7", + "provider": "anthropic", + "model": "claude-opus-4.7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "github-copilot", + "gmicloud", + "kilo", + "nano-gpt", + "openrouter", + "orcarouter", + "poe", + "vercel", + "zenmux" + ], + "aliases": [ + "github-copilot/claude-opus-4.7", + "gmicloud/anthropic/claude-opus-4.7", + "kilo/anthropic/claude-opus-4.7", + "kilo/stealth/claude-opus-4.7", + "nano-gpt/anthropic/claude-opus-4.7", + "openrouter/anthropic/claude-opus-4.7", + "orcarouter/anthropic/claude-opus-4.7", + "poe/anthropic/claude-opus-4.7", + "vercel/anthropic/claude-opus-4.7", + "zenmux/anthropic/claude-opus-4.7" + ], + "mergedProviderModelRecords": 10, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "maxReasoningEffort": true, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "xhighReasoningEffort": true, + "parallelFunctionCalling": false, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-copilot", + "model": "claude-opus-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "gmicloud", + "model": "anthropic/claude-opus-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.45, + "input": 4.5, + "output": 22.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "anthropic/claude-opus-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "stealth/claude-opus-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.4, + "cacheWrite": 5, + "input": 4, + "output": 20 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "anthropic/claude-opus-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.4998, + "input": 4.998, + "output": 25.007 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 1, + "cache_write": 12.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "anthropic/claude-opus-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "anthropic/claude-opus-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.43, + "cacheWrite": 5.4, + "input": 4.3, + "output": 21 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "anthropic/claude-opus-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "anthropic/claude-opus-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-opus-4.7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.7", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Opus 4.7", + "Claude 4.7 Opus", + "Claude Opus 4.7", + "Claude-Opus-4.7", + "Stealth: Claude Opus 4.7 (20% off)" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "tool_choice", + "tools", + "verbosity" + ], + "providerModelRecordCount": 10 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "claude-opus-4.7", + "modelKey": "claude-opus-4.7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gmicloud", + "providerName": "GMI Cloud", + "providerApi": "https://api.gmi-serving.com/v1", + "providerDoc": "https://docs.gmicloud.ai/inference-engine/api-reference/llm-api-reference", + "model": "anthropic/claude-opus-4.7", + "modelKey": "anthropic/claude-opus-4.7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "anthropic/claude-opus-4.7", + "modelKey": "anthropic/claude-opus-4.7", + "displayName": "Anthropic: Claude Opus 4.7", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "stealth/claude-opus-4.7", + "modelKey": "stealth/claude-opus-4.7", + "displayName": "Stealth: Claude Opus 4.7 (20% off)", + "metadata": { + "lastUpdated": "2026-05-27", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "anthropic/claude-opus-4.7", + "modelKey": "anthropic/claude-opus-4.7", + "displayName": "Claude 4.7 Opus", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "anthropic/claude-opus-4.7", + "modelKey": "anthropic/claude-opus-4.7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "anthropic/claude-opus-4.7", + "modelKey": "anthropic/claude-opus-4.7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "anthropic/claude-opus-4.7", + "modelKey": "anthropic/claude-opus-4.7", + "displayName": "Claude-Opus-4.7", + "metadata": { + "lastUpdated": "2026-04-15", + "openWeights": false, + "releaseDate": "2026-04-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "anthropic/claude-opus-4.7", + "modelKey": "anthropic/claude-opus-4.7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "anthropic/claude-opus-4.7", + "modelKey": "anthropic/claude-opus-4.7", + "displayName": "Claude Opus 4.7", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-opus-4.7", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.7", + "displayName": "Anthropic: Claude Opus 4.7", + "metadata": { + "canonicalSlug": "anthropic/claude-4.7-opus-20260416", + "createdAt": "2026-04-16T14:51:40.000Z", + "links": { + "details": "/api/v1/models/anthropic/claude-4.7-opus-20260416/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "tool_choice", + "tools", + "verbosity" + ], + "tokenizer": "Claude", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 128000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "anthropic/claude-opus-4.7-fast", + "provider": "anthropic", + "model": "claude-opus-4.7-fast", + "displayName": "Anthropic: Claude Opus 4.7 (Fast)", + "family": "claude-opus", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/anthropic/claude-opus-4.7-fast", + "openrouter/anthropic/claude-opus-4.7-fast" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "anthropic/claude-opus-4.7-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 3, + "cacheWrite": 37.5, + "input": 30, + "output": 150 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.7-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 3, + "cacheWrite": 37.5, + "input": 30, + "output": 150 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.7-fast", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 3, + "cacheWrite": 37.5, + "input": 30, + "output": 150 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Opus 4.7 (Fast)", + "Claude Opus 4.7 (Fast)" + ], + "families": [ + "claude-opus" + ], + "releaseDate": "2026-05-12", + "lastUpdated": "2026-05-16", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "tool_choice", + "tools", + "verbosity" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "anthropic/claude-opus-4.7-fast", + "modelKey": "anthropic/claude-opus-4.7-fast", + "displayName": "Anthropic: Claude Opus 4.7 (Fast)", + "metadata": { + "lastUpdated": "2026-05-16", + "openWeights": false, + "releaseDate": "2026-05-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "anthropic/claude-opus-4.7-fast", + "modelKey": "anthropic/claude-opus-4.7-fast", + "displayName": "Claude Opus 4.7 (Fast)", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-12", + "openWeights": false, + "releaseDate": "2026-05-12", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.7-fast", + "displayName": "Anthropic: Claude Opus 4.7 (Fast)", + "metadata": { + "canonicalSlug": "anthropic/claude-4.7-opus-fast-20260512", + "createdAt": "2026-05-12T19:10:11.000Z", + "links": { + "details": "/api/v1/models/anthropic/claude-4.7-opus-fast-20260512/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "tool_choice", + "tools", + "verbosity" + ], + "tokenizer": "Claude", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "anthropic/claude-opus-4.7:thinking", + "provider": "anthropic", + "model": "claude-opus-4.7:thinking", + "displayName": "Claude 4.7 Opus Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/anthropic/claude-opus-4.7:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "anthropic/claude-opus-4.7:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.4998, + "input": 4.998, + "output": 25.007 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4.7 Opus Thinking" + ], + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "anthropic/claude-opus-4.7:thinking", + "modelKey": "anthropic/claude-opus-4.7:thinking", + "displayName": "Claude 4.7 Opus Thinking", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4.8", + "provider": "anthropic", + "model": "claude-opus-4.8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "fastrouter", + "github-copilot", + "nano-gpt", + "openrouter", + "poe", + "vercel", + "zenmux" + ], + "aliases": [ + "fastrouter/anthropic/claude-opus-4.8", + "github-copilot/claude-opus-4.8", + "nano-gpt/anthropic/claude-opus-4.8", + "openrouter/anthropic/claude-opus-4.8", + "poe/anthropic/claude-opus-4.8", + "vercel/anthropic/claude-opus-4.8", + "zenmux/anthropic/claude-opus-4.8" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fastrouter", + "model": "anthropic/claude-opus-4.8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "github-copilot", + "model": "claude-opus-4.8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "anthropic/claude-opus-4.8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.4998, + "input": 4.998, + "output": 25.007 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "anthropic/claude-opus-4.8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4.2929, + "output": 21.4646 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "anthropic/claude-opus-4.8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "anthropic/claude-opus-4.8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.8", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Opus 4.8", + "Claude Opus 4.8", + "Claude-Opus-4.8" + ], + "families": [ + "claude-opus" + ], + "releaseDate": "2026-05-28", + "lastUpdated": "2026-05-28", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "tool_choice", + "tools", + "verbosity" + ], + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "anthropic/claude-opus-4.8", + "modelKey": "anthropic/claude-opus-4.8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024, + "max": 32000 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "claude-opus-4.8", + "modelKey": "claude-opus-4.8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "anthropic/claude-opus-4.8", + "modelKey": "anthropic/claude-opus-4.8", + "displayName": "Claude Opus 4.8", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "anthropic/claude-opus-4.8", + "modelKey": "anthropic/claude-opus-4.8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "anthropic/claude-opus-4.8", + "modelKey": "anthropic/claude-opus-4.8", + "displayName": "Claude-Opus-4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "anthropic/claude-opus-4.8", + "modelKey": "anthropic/claude-opus-4.8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "anthropic/claude-opus-4.8", + "modelKey": "anthropic/claude-opus-4.8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.8", + "displayName": "Anthropic: Claude Opus 4.8", + "metadata": { + "canonicalSlug": "anthropic/claude-4.8-opus-20260528", + "createdAt": "2026-05-27T18:04:51.000Z", + "links": { + "details": "/api/v1/models/anthropic/claude-4.8-opus-20260528/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "tool_choice", + "tools", + "verbosity" + ], + "tokenizer": "Claude", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 128000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "anthropic/claude-opus-4.8-fast", + "provider": "anthropic", + "model": "claude-opus-4.8-fast", + "displayName": "Claude Opus 4.8 (Fast)", + "family": "claude-opus", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/anthropic/claude-opus-4.8-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.8-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.8-fast", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Opus 4.8 (Fast)", + "Claude Opus 4.8 (Fast)" + ], + "families": [ + "claude-opus" + ], + "releaseDate": "2026-05-27", + "lastUpdated": "2026-05-27", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "tool_choice", + "tools", + "verbosity" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "anthropic/claude-opus-4.8-fast", + "modelKey": "anthropic/claude-opus-4.8-fast", + "displayName": "Claude Opus 4.8 (Fast)", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-27", + "openWeights": false, + "releaseDate": "2026-05-27", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "anthropic/claude-opus-4.8-fast", + "displayName": "Anthropic: Claude Opus 4.8 (Fast)", + "metadata": { + "canonicalSlug": "anthropic/claude-4.8-opus-fast-20260528", + "createdAt": "2026-05-27T20:28:23.000Z", + "links": { + "details": "/api/v1/models/anthropic/claude-4.8-opus-fast-20260528/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "tool_choice", + "tools", + "verbosity" + ], + "tokenizer": "Claude", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "anthropic/claude-opus-4.8:thinking", + "provider": "anthropic", + "model": "claude-opus-4.8:thinking", + "displayName": "Claude Opus 4.8 Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/anthropic/claude-opus-4.8:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "anthropic/claude-opus-4.8:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.4998, + "input": 4.998, + "output": 25.007 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.8 Thinking" + ], + "releaseDate": "2026-05-28", + "lastUpdated": "2026-05-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "anthropic/claude-opus-4.8:thinking", + "modelKey": "anthropic/claude-opus-4.8:thinking", + "displayName": "Claude Opus 4.8 Thinking", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28" + } + } + ] + }, + { + "id": "anthropic/claude-opus-4@20250514", + "provider": "anthropic", + "model": "claude-opus-4@20250514", + "displayName": "Claude Opus 4", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "google-vertex-anthropic", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "google-vertex-anthropic/claude-opus-4@20250514", + "google-vertex/claude-opus-4@20250514", + "vertex_ai-anthropic_models/vertex_ai/claude-opus-4@20250514" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex-anthropic", + "model": "claude-opus-4@20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "claude-opus-4@20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4@20250514", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00003 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex-anthropic", + "providerName": "Vertex (Anthropic)", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude", + "model": "claude-opus-4@20250514", + "modelKey": "claude-opus-4@20250514", + "displayName": "Claude Opus 4", + "family": "claude-opus", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "claude-opus-4@20250514", + "modelKey": "claude-opus-4@20250514", + "displayName": "Claude Opus 4", + "family": "claude-opus", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-opus-4@20250514", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-opus-41", + "provider": "anthropic", + "model": "claude-opus-41", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "github_copilot" + ], + "aliases": [ + "github_copilot/claude-opus-41" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 80000, + "inputTokens": 80000, + "maxTokens": 16000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/claude-opus-41", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/claude-opus-41", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + } + ] + }, + { + "id": "anthropic/claude-opus-latest", + "provider": "anthropic", + "model": "claude-opus-latest", + "displayName": "Anthropic: Claude Opus Latest", + "family": "claude-opus", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "kilo/~anthropic/claude-opus-latest", + "nano-gpt/anthropic/claude-opus-latest", + "openrouter/~anthropic/claude-opus-latest" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "~anthropic/claude-opus-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "anthropic/claude-opus-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.4998, + "input": 4.998, + "output": 25.007 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "~anthropic/claude-opus-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "~anthropic/claude-opus-latest", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Opus Latest", + "Claude Opus Latest" + ], + "families": [ + "claude-opus" + ], + "releaseDate": "2026-04-16", + "lastUpdated": "2026-05-01", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "tool_choice", + "tools", + "verbosity" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "~anthropic/claude-opus-latest", + "modelKey": "~anthropic/claude-opus-latest", + "displayName": "Anthropic: Claude Opus Latest", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "anthropic/claude-opus-latest", + "modelKey": "anthropic/claude-opus-latest", + "displayName": "Claude Opus Latest", + "metadata": { + "lastUpdated": "2026-03-29", + "openWeights": false, + "releaseDate": "2026-03-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "~anthropic/claude-opus-latest", + "modelKey": "~anthropic/claude-opus-latest", + "displayName": "Claude Opus Latest", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": false, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "~anthropic/claude-opus-latest", + "displayName": "Anthropic: Claude Opus Latest", + "metadata": { + "canonicalSlug": "~anthropic/claude-opus-latest", + "createdAt": "2026-04-21T18:16:01.000Z", + "links": { + "details": "/api/v1/models/~anthropic/claude-opus-latest/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "tool_choice", + "tools", + "verbosity" + ], + "tokenizer": "Router", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 128000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "anthropic/claude-opus4-5", + "provider": "anthropic", + "model": "claude-opus4-5", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "cortecs" + ], + "aliases": [ + "cortecs/claude-opus4-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 200000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "claude-opus4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5.98, + "output": 29.89 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.5" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-11-24", + "lastUpdated": "2025-11-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "claude-opus4-5", + "modelKey": "claude-opus4-5", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-24", + "openWeights": false, + "releaseDate": "2025-11-24" + } + } + ] + }, + { + "id": "anthropic/claude-opus4-6", + "provider": "anthropic", + "model": "claude-opus4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "cortecs" + ], + "aliases": [ + "cortecs/claude-opus4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 1000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "claude-opus4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5.98, + "output": 29.89 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.6" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-05-31", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "claude-opus4-6", + "modelKey": "claude-opus4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05" + } + } + ] + }, + { + "id": "anthropic/claude-opus4-7", + "provider": "anthropic", + "model": "claude-opus4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "cortecs" + ], + "aliases": [ + "cortecs/claude-opus4-7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "claude-opus4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.56, + "cacheWrite": 6.99, + "input": 5.6, + "output": 27.99 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.7" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "claude-opus4-7", + "modelKey": "claude-opus4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + } + ] + }, + { + "id": "anthropic/claude-opus4-8", + "provider": "anthropic", + "model": "claude-opus4-8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "cortecs" + ], + "aliases": [ + "cortecs/claude-opus4-8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "claude-opus4-8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.563, + "cacheWrite": 7.049, + "input": 5.64, + "output": 28.198 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.8" + ], + "families": [ + "claude-opus" + ], + "releaseDate": "2026-05-28", + "lastUpdated": "2026-05-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "claude-opus4-8", + "modelKey": "claude-opus4-8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28" + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-3.5", + "provider": "anthropic", + "model": "claude-sonnet-3.5", + "displayName": "Claude-Sonnet-3.5", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/anthropic/claude-sonnet-3.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 189096, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "anthropic/claude-sonnet-3.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "cacheWrite": 3.2, + "input": 2.6, + "output": 13 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude-Sonnet-3.5" + ], + "families": [ + "claude-sonnet" + ], + "statuses": [ + "deprecated" + ], + "releaseDate": "2024-06-05", + "lastUpdated": "2024-06-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "anthropic/claude-sonnet-3.5", + "modelKey": "anthropic/claude-sonnet-3.5", + "displayName": "Claude-Sonnet-3.5", + "family": "claude-sonnet", + "status": "deprecated", + "metadata": { + "lastUpdated": "2024-06-05", + "openWeights": false, + "releaseDate": "2024-06-05" + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-3.5-june", + "provider": "anthropic", + "model": "claude-sonnet-3.5-june", + "displayName": "Claude-Sonnet-3.5-June", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/anthropic/claude-sonnet-3.5-june" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 189096, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "anthropic/claude-sonnet-3.5-june", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "cacheWrite": 3.2, + "input": 2.6, + "output": 13 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude-Sonnet-3.5-June" + ], + "families": [ + "claude-sonnet" + ], + "statuses": [ + "deprecated" + ], + "releaseDate": "2024-11-18", + "lastUpdated": "2024-11-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "anthropic/claude-sonnet-3.5-june", + "modelKey": "anthropic/claude-sonnet-3.5-june", + "displayName": "Claude-Sonnet-3.5-June", + "family": "claude-sonnet", + "status": "deprecated", + "metadata": { + "lastUpdated": "2024-11-18", + "openWeights": false, + "releaseDate": "2024-11-18" + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-3.7", + "provider": "anthropic", + "model": "claude-sonnet-3.7", + "displayName": "Claude-Sonnet-3.7", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/anthropic/claude-sonnet-3.7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 196608, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "anthropic/claude-sonnet-3.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "cacheWrite": 3.2, + "input": 2.6, + "output": 13 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude-Sonnet-3.7" + ], + "families": [ + "claude-sonnet" + ], + "releaseDate": "2025-02-19", + "lastUpdated": "2025-02-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "anthropic/claude-sonnet-3.7", + "modelKey": "anthropic/claude-sonnet-3.7", + "displayName": "Claude-Sonnet-3.7", + "family": "claude-sonnet", + "metadata": { + "lastUpdated": "2025-02-19", + "openWeights": false, + "releaseDate": "2025-02-19" + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-4", + "provider": "anthropic", + "model": "claude-sonnet-4", + "displayName": "Claude Sonnet 4", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "cloudflare-ai-gateway", + "cortecs", + "fastrouter", + "github-copilot", + "github_copilot", + "gmi", + "helicone", + "kilo", + "neon", + "opencode", + "openrouter", + "orcarouter", + "poe", + "requesty", + "vercel", + "vercel_ai_gateway", + "vertex_ai-anthropic_models", + "zenmux" + ], + "aliases": [ + "cloudflare-ai-gateway/anthropic/claude-sonnet-4", + "cortecs/claude-sonnet-4", + "fastrouter/anthropic/claude-sonnet-4", + "github-copilot/claude-sonnet-4", + "github_copilot/claude-sonnet-4", + "gmi/anthropic/claude-sonnet-4", + "helicone/claude-sonnet-4", + "kilo/anthropic/claude-sonnet-4", + "neon/claude-sonnet-4", + "opencode/claude-sonnet-4", + "openrouter/anthropic/claude-sonnet-4", + "orcarouter/anthropic/claude-sonnet-4", + "poe/anthropic/claude-sonnet-4", + "requesty/anthropic/claude-sonnet-4", + "vercel/anthropic/claude-sonnet-4", + "vercel_ai_gateway/anthropic/claude-sonnet-4", + "vertex_ai-anthropic_models/vertex_ai/claude-sonnet-4", + "zenmux/anthropic/claude-sonnet-4" + ], + "mergedProviderModelRecords": 18, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "anthropic/claude-sonnet-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "claude-sonnet-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3.307, + "output": 16.536 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "anthropic/claude-sonnet-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "github-copilot", + "model": "claude-sonnet-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "claude-sonnet-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.30000000000000004, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "anthropic/claude-sonnet-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "neon", + "model": "claude-sonnet-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "claude-sonnet-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5 + }, + "tiers": [ + { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "anthropic/claude-sonnet-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5 + }, + "tiers": [ + { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "anthropic/claude-sonnet-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "anthropic/claude-sonnet-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "cacheWrite": 3.2, + "input": 2.6, + "output": 13 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "anthropic/claude-sonnet-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "anthropic/claude-sonnet-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "anthropic/claude-sonnet-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/claude-sonnet-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "gmi", + "model": "gmi/anthropic/claude-sonnet-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-sonnet-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "perImage": { + "input": 0.0048 + }, + "extra": { + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7, + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-sonnet-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-sonnet-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000006, + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "anthropic/claude-sonnet-4", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Sonnet 4", + "Claude Sonnet 4", + "Claude Sonnet 4 (latest)", + "Claude Sonnet 4.5", + "Claude-Sonnet-4" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 18 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "anthropic/claude-sonnet-4", + "modelKey": "anthropic/claude-sonnet-4", + "displayName": "Claude Sonnet 4 (latest)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "claude-sonnet-4", + "modelKey": "claude-sonnet-4", + "displayName": "Claude Sonnet 4", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "anthropic/claude-sonnet-4", + "modelKey": "anthropic/claude-sonnet-4", + "displayName": "Claude Sonnet 4", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024, + "max": 32000 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "claude-sonnet-4", + "modelKey": "claude-sonnet-4", + "displayName": "Claude Sonnet 4 (latest)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "claude-sonnet-4", + "modelKey": "claude-sonnet-4", + "displayName": "Anthropic: Claude Sonnet 4", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-05-14", + "openWeights": false, + "releaseDate": "2025-05-14", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "anthropic/claude-sonnet-4", + "modelKey": "anthropic/claude-sonnet-4", + "displayName": "Anthropic: Claude Sonnet 4", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-05-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "claude-sonnet-4", + "modelKey": "claude-sonnet-4", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "claude-sonnet-4", + "modelKey": "claude-sonnet-4", + "displayName": "Claude Sonnet 4", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "anthropic/claude-sonnet-4", + "modelKey": "anthropic/claude-sonnet-4", + "displayName": "Claude Sonnet 4", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-01-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "anthropic/claude-sonnet-4", + "modelKey": "anthropic/claude-sonnet-4", + "displayName": "Claude Sonnet 4 (latest)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "anthropic/claude-sonnet-4", + "modelKey": "anthropic/claude-sonnet-4", + "displayName": "Claude-Sonnet-4", + "family": "claude-sonnet", + "metadata": { + "lastUpdated": "2025-05-21", + "openWeights": false, + "releaseDate": "2025-05-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "anthropic/claude-sonnet-4", + "modelKey": "anthropic/claude-sonnet-4", + "displayName": "Claude Sonnet 4", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "anthropic/claude-sonnet-4", + "modelKey": "anthropic/claude-sonnet-4", + "displayName": "Claude Sonnet 4", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "anthropic/claude-sonnet-4", + "modelKey": "anthropic/claude-sonnet-4", + "displayName": "Claude Sonnet 4", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/claude-sonnet-4", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gmi", + "model": "gmi/anthropic/claude-sonnet-4", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-sonnet-4", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-sonnet-4", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-sonnet-4", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "anthropic/claude-sonnet-4", + "displayName": "Anthropic: Claude Sonnet 4", + "metadata": { + "canonicalSlug": "anthropic/claude-4-sonnet-20250522", + "createdAt": "2025-05-22T16:12:51.000Z", + "knowledgeCutoff": "2025-01-31", + "links": { + "details": "/api/v1/models/anthropic/claude-4-sonnet-20250522/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Claude", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 64000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-4-0", + "provider": "anthropic", + "model": "claude-sonnet-4-0", + "displayName": "Claude Sonnet 4 (latest)", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "anthropic" + ], + "aliases": [ + "anthropic/claude-sonnet-4-0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-sonnet-4-0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4 (latest)" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-sonnet-4-0", + "modelKey": "claude-sonnet-4-0", + "displayName": "Claude Sonnet 4 (latest)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-4-20250514", + "provider": "anthropic", + "model": "claude-sonnet-4-20250514", + "displayName": "Claude Sonnet 4", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "abacus", + "anthropic", + "jiekou", + "llmgateway", + "merge-gateway", + "nano-gpt" + ], + "aliases": [ + "302ai/claude-sonnet-4-20250514", + "abacus/claude-sonnet-4-20250514", + "anthropic/claude-sonnet-4-20250514", + "jiekou/claude-sonnet-4-20250514", + "llmgateway/claude-sonnet-4-20250514", + "merge-gateway/anthropic/claude-sonnet-4-20250514", + "nano-gpt/claude-sonnet-4-20250514" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": true, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-sonnet-4-20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "claude-sonnet-4-20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-sonnet-4-20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "claude-sonnet-4-20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.7, + "output": 13.5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "claude-sonnet-4-20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "anthropic/claude-sonnet-4-20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-sonnet-4-20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.992, + "output": 14.994 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-sonnet-4-20250514", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000006, + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4 Sonnet", + "Claude Sonnet 4", + "claude-sonnet-4-20250514" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "deprecationDate": "2026-05-14", + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-sonnet-4-20250514", + "modelKey": "claude-sonnet-4-20250514", + "displayName": "claude-sonnet-4-20250514", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "claude-sonnet-4-20250514", + "modelKey": "claude-sonnet-4-20250514", + "displayName": "Claude Sonnet 4", + "family": "claude-sonnet", + "metadata": { + "lastUpdated": "2025-05-14", + "openWeights": false, + "releaseDate": "2025-05-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-sonnet-4-20250514", + "modelKey": "claude-sonnet-4-20250514", + "displayName": "Claude Sonnet 4", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "claude-sonnet-4-20250514", + "modelKey": "claude-sonnet-4-20250514", + "displayName": "claude-sonnet-4-20250514", + "family": "claude-sonnet", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "claude-sonnet-4-20250514", + "modelKey": "claude-sonnet-4-20250514", + "displayName": "Claude Sonnet 4", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "anthropic/claude-sonnet-4-20250514", + "modelKey": "anthropic/claude-sonnet-4-20250514", + "displayName": "Claude Sonnet 4", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-sonnet-4-20250514", + "modelKey": "claude-sonnet-4-20250514", + "displayName": "Claude 4 Sonnet", + "metadata": { + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-sonnet-4-20250514", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-14" + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-4-5", + "provider": "anthropic", + "model": "claude-sonnet-4-5", + "displayName": "Claude Sonnet 4.5 (latest)", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "anthropic", + "anyapi", + "azure", + "azure-cognitive-services", + "azure_ai", + "cloudflare-ai-gateway", + "llmgateway", + "nearai", + "neon", + "opencode", + "perplexity-agent", + "requesty", + "snowflake", + "snowflake-cortex", + "venice", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "302ai/claude-sonnet-4-5", + "anthropic/claude-sonnet-4-5", + "anyapi/anthropic/claude-sonnet-4-5", + "azure-cognitive-services/claude-sonnet-4-5", + "azure/claude-sonnet-4-5", + "azure_ai/claude-sonnet-4-5", + "cloudflare-ai-gateway/anthropic/claude-sonnet-4-5", + "llmgateway/claude-sonnet-4-5", + "nearai/anthropic/claude-sonnet-4-5", + "neon/claude-sonnet-4-5", + "opencode/claude-sonnet-4-5", + "perplexity-agent/anthropic/claude-sonnet-4-5", + "requesty/anthropic/claude-sonnet-4-5", + "snowflake-cortex/claude-sonnet-4-5", + "snowflake/claude-sonnet-4-5", + "venice/claude-sonnet-4-5", + "vertex_ai-anthropic_models/vertex_ai/claude-sonnet-4-5" + ], + "mergedProviderModelRecords": 17, + "limits": { + "contextTokens": 1000000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": true, + "structuredOutput": true, + "interleaved": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-sonnet-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-sonnet-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "claude-sonnet-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "claude-sonnet-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "anthropic/claude-sonnet-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "claude-sonnet-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "anthropic/claude-sonnet-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15.5 + } + }, + { + "source": "models.dev", + "provider": "neon", + "model": "claude-sonnet-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "claude-sonnet-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5 + }, + "tiers": [ + { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "anthropic/claude-sonnet-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "anthropic/claude-sonnet-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "claude-sonnet-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.375, + "cacheWrite": 4.69, + "input": 3.75, + "output": 18.75 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-sonnet-4-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/claude-sonnet-4-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000006 + } + }, + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/claude-sonnet-4-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-sonnet-4-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000006, + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7, + "input_cost_per_token_batches": 0.0000015, + "output_cost_per_token_batches": 0.0000075 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.5", + "Claude Sonnet 4.5 (latest)", + "claude-sonnet-4-5" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-07-31", + "releaseDate": "2025-09-30", + "lastUpdated": "2025-09-30", + "providerModelRecordCount": 17 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-sonnet-4-5", + "modelKey": "claude-sonnet-4-5", + "displayName": "claude-sonnet-4-5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-30", + "openWeights": false, + "releaseDate": "2025-09-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-sonnet-4-5", + "modelKey": "claude-sonnet-4-5", + "displayName": "Claude Sonnet 4.5 (latest)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "anthropic/claude-sonnet-4-5", + "modelKey": "anthropic/claude-sonnet-4-5", + "displayName": "Claude Sonnet 4.5 (latest)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "claude-sonnet-4-5", + "modelKey": "claude-sonnet-4-5", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "claude-sonnet-4-5", + "modelKey": "claude-sonnet-4-5", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "anthropic/claude-sonnet-4-5", + "modelKey": "anthropic/claude-sonnet-4-5", + "displayName": "Claude Sonnet 4.5 (latest)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "claude-sonnet-4-5", + "modelKey": "claude-sonnet-4-5", + "displayName": "Claude Sonnet 4.5 (latest)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "anthropic/claude-sonnet-4-5", + "modelKey": "anthropic/claude-sonnet-4-5", + "displayName": "Claude Sonnet 4.5 (latest)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "claude-sonnet-4-5", + "modelKey": "claude-sonnet-4-5", + "displayName": "Claude Sonnet 4.5 (latest)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "claude-sonnet-4-5", + "modelKey": "claude-sonnet-4-5", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "anthropic/claude-sonnet-4-5", + "modelKey": "anthropic/claude-sonnet-4-5", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "anthropic/claude-sonnet-4-5", + "modelKey": "anthropic/claude-sonnet-4-5", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "claude-sonnet-4-5", + "modelKey": "claude-sonnet-4-5", + "displayName": "Claude Sonnet 4.5 (latest)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "claude-sonnet-4-5", + "modelKey": "claude-sonnet-4-5", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2025-01-15" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-sonnet-4-5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/claude-sonnet-4-5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/claude-sonnet-4-5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-sonnet-4-5", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-sonnet-4-5-20250929", + "provider": "anthropic", + "model": "claude-sonnet-4-5-20250929", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "abacus", + "anthropic", + "helicone", + "jiekou", + "llmgateway", + "merge-gateway", + "nano-gpt", + "qihang-ai" + ], + "aliases": [ + "302ai/claude-sonnet-4-5-20250929", + "abacus/claude-sonnet-4-5-20250929", + "anthropic/claude-sonnet-4-5-20250929", + "helicone/claude-sonnet-4-5-20250929", + "jiekou/claude-sonnet-4-5-20250929", + "llmgateway/claude-sonnet-4-5-20250929", + "merge-gateway/anthropic/claude-sonnet-4-5-20250929", + "nano-gpt/claude-sonnet-4-5-20250929", + "qihang-ai/claude-sonnet-4-5-20250929" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "supports1MContext": true, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-sonnet-4-5-20250929", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "claude-sonnet-4-5-20250929", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-sonnet-4-5-20250929", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "claude-sonnet-4-5-20250929", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.30000000000000004, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "claude-sonnet-4-5-20250929", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.7, + "output": 13.5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "claude-sonnet-4-5-20250929", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "anthropic/claude-sonnet-4-5-20250929", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-sonnet-4-5-20250929", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.992, + "output": 14.994 + } + }, + { + "source": "models.dev", + "provider": "qihang-ai", + "model": "claude-sonnet-4-5-20250929", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.43, + "output": 2.14 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-sonnet-4-5-20250929", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Sonnet 4.5 (20250929)", + "Claude Sonnet 4.5", + "claude-sonnet-4-5-20250929" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-07-31", + "releaseDate": "2025-09-30", + "lastUpdated": "2025-09-30", + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-sonnet-4-5-20250929", + "modelKey": "claude-sonnet-4-5-20250929", + "displayName": "claude-sonnet-4-5-20250929", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-30", + "openWeights": false, + "releaseDate": "2025-09-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "claude-sonnet-4-5-20250929", + "modelKey": "claude-sonnet-4-5-20250929", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-sonnet-4-5-20250929", + "modelKey": "claude-sonnet-4-5-20250929", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "claude-sonnet-4-5-20250929", + "modelKey": "claude-sonnet-4-5-20250929", + "displayName": "Anthropic: Claude Sonnet 4.5 (20250929)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "claude-sonnet-4-5-20250929", + "modelKey": "claude-sonnet-4-5-20250929", + "displayName": "claude-sonnet-4-5-20250929", + "family": "claude-sonnet", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "claude-sonnet-4-5-20250929", + "modelKey": "claude-sonnet-4-5-20250929", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "anthropic/claude-sonnet-4-5-20250929", + "modelKey": "anthropic/claude-sonnet-4-5-20250929", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-sonnet-4-5-20250929", + "modelKey": "claude-sonnet-4-5-20250929", + "displayName": "Claude Sonnet 4.5", + "metadata": { + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qihang-ai", + "providerName": "QiHang", + "providerApi": "https://api.qhaigc.net/v1", + "providerDoc": "https://www.qhaigc.net/docs", + "model": "claude-sonnet-4-5-20250929", + "modelKey": "claude-sonnet-4-5-20250929", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-sonnet-4-5-20250929", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-sonnet-4-5-20250929-thinking", + "provider": "anthropic", + "model": "claude-sonnet-4-5-20250929-thinking", + "displayName": "claude-sonnet-4-5-20250929-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai", + "nano-gpt" + ], + "aliases": [ + "302ai/claude-sonnet-4-5-20250929-thinking", + "nano-gpt/claude-sonnet-4-5-20250929-thinking" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-sonnet-4-5-20250929-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-sonnet-4-5-20250929-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.992, + "output": 14.994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.5 Thinking", + "claude-sonnet-4-5-20250929-thinking" + ], + "knowledgeCutoff": "2025-03", + "releaseDate": "2025-09-30", + "lastUpdated": "2025-09-30", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-sonnet-4-5-20250929-thinking", + "modelKey": "claude-sonnet-4-5-20250929-thinking", + "displayName": "claude-sonnet-4-5-20250929-thinking", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2025-09-30", + "openWeights": false, + "releaseDate": "2025-09-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-sonnet-4-5-20250929-thinking", + "modelKey": "claude-sonnet-4-5-20250929-thinking", + "displayName": "Claude Sonnet 4.5 Thinking", + "metadata": { + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-4-5-20250929-v1:0", + "provider": "anthropic", + "model": "claude-sonnet-4-5-20250929-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/claude-sonnet-4-5-20250929-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "extra": { + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "claude-sonnet-4-5-20250929-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-sonnet-4-5@20250929", + "provider": "anthropic", + "model": "claude-sonnet-4-5@20250929", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "google-vertex-anthropic", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "google-vertex-anthropic/claude-sonnet-4-5@20250929", + "google-vertex/claude-sonnet-4-5@20250929", + "vertex_ai-anthropic_models/vertex_ai/claude-sonnet-4-5@20250929" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStreaming": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex-anthropic", + "model": "claude-sonnet-4-5@20250929", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "claude-sonnet-4-5@20250929", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-sonnet-4-5@20250929", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000006, + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7, + "input_cost_per_token_batches": 0.0000015, + "output_cost_per_token_batches": 0.0000075 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.5" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-07-31", + "releaseDate": "2025-09-29", + "lastUpdated": "2025-09-29", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex-anthropic", + "providerName": "Vertex (Anthropic)", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude", + "model": "claude-sonnet-4-5@20250929", + "modelKey": "claude-sonnet-4-5@20250929", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "claude-sonnet-4-5@20250929", + "modelKey": "claude-sonnet-4-5@20250929", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-sonnet-4-5@20250929", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-sonnet-4-6", + "provider": "anthropic", + "model": "claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "abacus", + "aihubmix", + "anthropic", + "anyapi", + "auriko", + "azure", + "azure_ai", + "cloudflare-ai-gateway", + "freemodel", + "frogbot", + "llmgateway", + "merge-gateway", + "nearai", + "neon", + "opencode", + "perplexity-agent", + "requesty", + "snowflake", + "snowflake-cortex", + "venice", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "302ai/claude-sonnet-4-6", + "abacus/claude-sonnet-4-6", + "aihubmix/claude-sonnet-4-6", + "anthropic/claude-sonnet-4-6", + "anyapi/anthropic/claude-sonnet-4-6", + "auriko/claude-sonnet-4-6", + "azure/claude-sonnet-4-6", + "azure_ai/claude-sonnet-4-6", + "cloudflare-ai-gateway/anthropic/claude-sonnet-4-6", + "freemodel/claude-sonnet-4-6", + "frogbot/claude-sonnet-4-6", + "llmgateway/claude-sonnet-4-6", + "merge-gateway/anthropic/claude-sonnet-4-6", + "nearai/anthropic/claude-sonnet-4-6", + "neon/claude-sonnet-4-6", + "opencode/claude-sonnet-4-6", + "perplexity-agent/anthropic/claude-sonnet-4-6", + "requesty/anthropic/claude-sonnet-4-6", + "snowflake-cortex/claude-sonnet-4-6", + "snowflake/claude-sonnet-4-6", + "venice/claude-sonnet-4-6", + "vertex_ai-anthropic_models/vertex_ai/claude-sonnet-4-6" + ], + "mergedProviderModelRecords": 22, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "adaptiveThinking": true, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "maxReasoningEffort": true, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": true, + "interleaved": true, + "structuredOutput": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "aihubmix", + "model": "claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5 + }, + "tiers": [ + { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "anthropic", + "model": "claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "auriko", + "model": "claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "anthropic/claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5 + }, + "tiers": [ + { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "freemodel", + "model": "claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "frogbot", + "model": "claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "anthropic/claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "anthropic/claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "neon", + "model": "claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "anthropic/claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "anthropic/claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5 + }, + "tiers": [ + { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.36, + "cacheWrite": 4.5, + "input": 3.6, + "output": 18 + } + }, + { + "source": "litellm", + "provider": "anthropic", + "model": "claude-sonnet-4-6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/claude-sonnet-4-6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000006 + } + }, + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/claude-sonnet-4-6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-sonnet-4-6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000006 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.6", + "claude-sonnet-4-6" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-18", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 22 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-sonnet-4-6", + "modelKey": "claude-sonnet-4-6", + "displayName": "claude-sonnet-4-6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-18", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "claude-sonnet-4-6", + "modelKey": "claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-17", + "openWeights": false, + "releaseDate": "2026-02-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "claude-sonnet-4-6", + "modelKey": "claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anthropic", + "providerName": "Anthropic", + "providerDoc": "https://docs.anthropic.com/en/docs/about-claude/models", + "model": "claude-sonnet-4-6", + "modelKey": "claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "anthropic/claude-sonnet-4-6", + "modelKey": "anthropic/claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "auriko", + "providerName": "Auriko", + "providerApi": "https://api.auriko.ai/v1", + "providerDoc": "https://docs.auriko.ai", + "model": "claude-sonnet-4-6", + "modelKey": "claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "claude-sonnet-4-6", + "modelKey": "claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "anthropic/claude-sonnet-4-6", + "modelKey": "anthropic/claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-17", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "freemodel", + "providerName": "FreeModel", + "providerApi": "https://cc.freemodel.dev/v1", + "providerDoc": "https://freemodel.dev", + "model": "claude-sonnet-4-6", + "modelKey": "claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "claude-sonnet-4-6", + "modelKey": "claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-17", + "openWeights": false, + "releaseDate": "2026-02-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "claude-sonnet-4-6", + "modelKey": "claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "anthropic/claude-sonnet-4-6", + "modelKey": "anthropic/claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "anthropic/claude-sonnet-4-6", + "modelKey": "anthropic/claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "claude-sonnet-4-6", + "modelKey": "claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "claude-sonnet-4-6", + "modelKey": "claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-17", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "anthropic/claude-sonnet-4-6", + "modelKey": "anthropic/claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-17", + "openWeights": false, + "releaseDate": "2026-02-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "anthropic/claude-sonnet-4-6", + "modelKey": "anthropic/claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-17", + "openWeights": false, + "releaseDate": "2026-02-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "claude-sonnet-4-6", + "modelKey": "claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "claude-sonnet-4-6", + "modelKey": "claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-02-17" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anthropic", + "model": "claude-sonnet-4-6", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/claude-sonnet-4-6", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/claude-sonnet-4-6", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-sonnet-4-6", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-sonnet-4-6-think", + "provider": "anthropic", + "model": "claude-sonnet-4-6-think", + "displayName": "Claude Sonnet 4.6 Thinking", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "aihubmix" + ], + "aliases": [ + "aihubmix/claude-sonnet-4-6-think" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "claude-sonnet-4-6-think", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5 + }, + "tiers": [ + { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.6 Thinking" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-17", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "claude-sonnet-4-6-think", + "modelKey": "claude-sonnet-4-6-think", + "displayName": "Claude Sonnet 4.6 Thinking", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17" + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-4-6-thinking", + "provider": "anthropic", + "model": "claude-sonnet-4-6-thinking", + "displayName": "claude-sonnet-4-6-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai" + ], + "aliases": [ + "302ai/claude-sonnet-4-6-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "claude-sonnet-4-6-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "claude-sonnet-4-6-thinking" + ], + "knowledgeCutoff": "2025-08", + "releaseDate": "2026-02-18", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "claude-sonnet-4-6-thinking", + "modelKey": "claude-sonnet-4-6-thinking", + "displayName": "claude-sonnet-4-6-thinking", + "metadata": { + "knowledgeCutoff": "2025-08", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-18" + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-4-6@default", + "provider": "anthropic", + "model": "claude-sonnet-4-6@default", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "google-vertex-anthropic", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "google-vertex-anthropic/claude-sonnet-4-6@default", + "google-vertex/claude-sonnet-4-6@default", + "vertex_ai-anthropic_models/vertex_ai/claude-sonnet-4-6@default" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "maxReasoningEffort": true, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex-anthropic", + "model": "claude-sonnet-4-6@default", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5 + }, + "tiers": [ + { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "claude-sonnet-4-6@default", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5 + }, + "tiers": [ + { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-sonnet-4-6@default", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000006 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.6" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-17", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex-anthropic", + "providerName": "Vertex (Anthropic)", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude", + "model": "claude-sonnet-4-6@default", + "modelKey": "claude-sonnet-4-6@default", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "claude-sonnet-4-6@default", + "modelKey": "claude-sonnet-4-6@default", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-sonnet-4-6@default", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-sonnet-4-thinking", + "provider": "anthropic", + "model": "claude-sonnet-4-thinking", + "displayName": "Claude 4 Sonnet Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claude-sonnet-4-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-sonnet-4-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.992, + "output": 14.994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4 Sonnet Thinking" + ], + "releaseDate": "2025-02-24", + "lastUpdated": "2025-02-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-sonnet-4-thinking", + "modelKey": "claude-sonnet-4-thinking", + "displayName": "Claude 4 Sonnet Thinking", + "metadata": { + "lastUpdated": "2025-02-24", + "openWeights": false, + "releaseDate": "2025-02-24" + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-4-thinking:1024", + "provider": "anthropic", + "model": "claude-sonnet-4-thinking:1024", + "displayName": "Claude 4 Sonnet Thinking (1K)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claude-sonnet-4-thinking:1024" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-sonnet-4-thinking:1024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.992, + "output": 14.994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4 Sonnet Thinking (1K)" + ], + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-sonnet-4-thinking:1024", + "modelKey": "claude-sonnet-4-thinking:1024", + "displayName": "Claude 4 Sonnet Thinking (1K)", + "metadata": { + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-4-thinking:32768", + "provider": "anthropic", + "model": "claude-sonnet-4-thinking:32768", + "displayName": "Claude 4 Sonnet Thinking (32K)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claude-sonnet-4-thinking:32768" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-sonnet-4-thinking:32768", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.992, + "output": 14.994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4 Sonnet Thinking (32K)" + ], + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-sonnet-4-thinking:32768", + "modelKey": "claude-sonnet-4-thinking:32768", + "displayName": "Claude 4 Sonnet Thinking (32K)", + "metadata": { + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-4-thinking:64000", + "provider": "anthropic", + "model": "claude-sonnet-4-thinking:64000", + "displayName": "Claude 4 Sonnet Thinking (64K)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claude-sonnet-4-thinking:64000" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-sonnet-4-thinking:64000", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.992, + "output": 14.994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4 Sonnet Thinking (64K)" + ], + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-sonnet-4-thinking:64000", + "modelKey": "claude-sonnet-4-thinking:64000", + "displayName": "Claude 4 Sonnet Thinking (64K)", + "metadata": { + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-4-thinking:8192", + "provider": "anthropic", + "model": "claude-sonnet-4-thinking:8192", + "displayName": "Claude 4 Sonnet Thinking (8K)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claude-sonnet-4-thinking:8192" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claude-sonnet-4-thinking:8192", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.992, + "output": 14.994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 4 Sonnet Thinking (8K)" + ], + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claude-sonnet-4-thinking:8192", + "modelKey": "claude-sonnet-4-thinking:8192", + "displayName": "Claude 4 Sonnet Thinking (8K)", + "metadata": { + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-4.5", + "provider": "anthropic", + "model": "claude-sonnet-4.5", + "displayName": "Claude Sonnet 4.5 (latest)", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "github-copilot", + "github_copilot", + "gmi", + "kilo", + "openrouter", + "orcarouter", + "poe", + "vercel", + "vercel_ai_gateway", + "zenmux" + ], + "aliases": [ + "github-copilot/claude-sonnet-4.5", + "github_copilot/claude-sonnet-4.5", + "gmi/anthropic/claude-sonnet-4.5", + "kilo/anthropic/claude-sonnet-4.5", + "openrouter/anthropic/claude-sonnet-4.5", + "orcarouter/anthropic/claude-sonnet-4.5", + "poe/anthropic/claude-sonnet-4.5", + "vercel/anthropic/claude-sonnet-4.5", + "vercel_ai_gateway/anthropic/claude-sonnet-4.5", + "zenmux/anthropic/claude-sonnet-4.5" + ], + "mergedProviderModelRecords": 10, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 1000000, + "outputTokens": 1000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-copilot", + "model": "claude-sonnet-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "anthropic/claude-sonnet-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "anthropic/claude-sonnet-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5 + }, + "tiers": [ + { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "anthropic/claude-sonnet-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "anthropic/claude-sonnet-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "cacheWrite": 3.2, + "input": 2.6, + "output": 13 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "anthropic/claude-sonnet-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "anthropic/claude-sonnet-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/claude-sonnet-4.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "gmi", + "model": "gmi/anthropic/claude-sonnet-4.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-sonnet-4.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "perImage": { + "input": 0.0048 + }, + "extra": { + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-sonnet-4.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "anthropic/claude-sonnet-4.5", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Sonnet 4.5", + "Claude Sonnet 4.5", + "Claude Sonnet 4.5 (latest)", + "Claude-Sonnet-4.5" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-07-31", + "releaseDate": "2025-09-29", + "lastUpdated": "2025-09-29", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 10 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "claude-sonnet-4.5", + "modelKey": "claude-sonnet-4.5", + "displayName": "Claude Sonnet 4.5 (latest)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "anthropic/claude-sonnet-4.5", + "modelKey": "anthropic/claude-sonnet-4.5", + "displayName": "Anthropic: Claude Sonnet 4.5", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "anthropic/claude-sonnet-4.5", + "modelKey": "anthropic/claude-sonnet-4.5", + "displayName": "Claude Sonnet 4.5 (latest)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "anthropic/claude-sonnet-4.5", + "modelKey": "anthropic/claude-sonnet-4.5", + "displayName": "Claude Sonnet 4.5 (latest)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "anthropic/claude-sonnet-4.5", + "modelKey": "anthropic/claude-sonnet-4.5", + "displayName": "Claude-Sonnet-4.5", + "family": "claude-sonnet", + "metadata": { + "lastUpdated": "2025-09-26", + "openWeights": false, + "releaseDate": "2025-09-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "anthropic/claude-sonnet-4.5", + "modelKey": "anthropic/claude-sonnet-4.5", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "anthropic/claude-sonnet-4.5", + "modelKey": "anthropic/claude-sonnet-4.5", + "displayName": "Claude Sonnet 4.5", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/claude-sonnet-4.5", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gmi", + "model": "gmi/anthropic/claude-sonnet-4.5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-sonnet-4.5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/anthropic/claude-sonnet-4.5", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "anthropic/claude-sonnet-4.5", + "displayName": "Anthropic: Claude Sonnet 4.5", + "metadata": { + "canonicalSlug": "anthropic/claude-4.5-sonnet-20250929", + "createdAt": "2025-09-29T16:01:16.000Z", + "knowledgeCutoff": "2025-01-31", + "links": { + "details": "/api/v1/models/anthropic/claude-4.5-sonnet-20250929/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Claude", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 64000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-4.6", + "provider": "anthropic", + "model": "claude-sonnet-4.6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "fastrouter", + "github-copilot", + "gmicloud", + "kilo", + "nano-gpt", + "openrouter", + "orcarouter", + "poe", + "vercel", + "zenmux" + ], + "aliases": [ + "fastrouter/anthropic/claude-sonnet-4.6", + "github-copilot/claude-sonnet-4.6", + "gmicloud/anthropic/claude-sonnet-4.6", + "kilo/anthropic/claude-sonnet-4.6", + "kilo/stealth/claude-sonnet-4.6", + "nano-gpt/anthropic/claude-sonnet-4.6", + "openrouter/anthropic/claude-sonnet-4.6", + "orcarouter/anthropic/claude-sonnet-4.6", + "poe/anthropic/claude-sonnet-4.6", + "vercel/anthropic/claude-sonnet-4.6", + "zenmux/anthropic/claude-sonnet-4.6" + ], + "mergedProviderModelRecords": 11, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "maxReasoningEffort": true, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": true, + "interleaved": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fastrouter", + "model": "anthropic/claude-sonnet-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "github-copilot", + "model": "claude-sonnet-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "gmicloud", + "model": "anthropic/claude-sonnet-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "anthropic/claude-sonnet-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "stealth/claude-sonnet-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "cacheWrite": 3, + "input": 2.4, + "output": 12 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "anthropic/claude-sonnet-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.992, + "output": 14.993999999999998 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "anthropic/claude-sonnet-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5 + }, + "tiers": [ + { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "anthropic/claude-sonnet-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "anthropic/claude-sonnet-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "cacheWrite": 3.2, + "input": 2.6, + "output": 13 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "anthropic/claude-sonnet-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5 + }, + "tiers": [ + { + "input": 6, + "output": 22.5, + "cache_read": 0.6, + "cache_write": 7.5, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "anthropic/claude-sonnet-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-sonnet-4.6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "extra": { + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7, + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "anthropic/claude-sonnet-4.6", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic: Claude Sonnet 4.6", + "Claude Sonnet 4.6", + "Claude-Sonnet-4.6", + "Stealth: Claude Sonnet 4.6 (20% off)" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-17", + "lastUpdated": "2026-03-13", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p", + "verbosity" + ], + "providerModelRecordCount": 11 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "anthropic/claude-sonnet-4.6", + "modelKey": "anthropic/claude-sonnet-4.6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024, + "max": 32000 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "claude-sonnet-4.6", + "modelKey": "claude-sonnet-4.6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gmicloud", + "providerName": "GMI Cloud", + "providerApi": "https://api.gmi-serving.com/v1", + "providerDoc": "https://docs.gmicloud.ai/inference-engine/api-reference/llm-api-reference", + "model": "anthropic/claude-sonnet-4.6", + "modelKey": "anthropic/claude-sonnet-4.6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024, + "max": 63999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "anthropic/claude-sonnet-4.6", + "modelKey": "anthropic/claude-sonnet-4.6", + "displayName": "Anthropic: Claude Sonnet 4.6", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-02-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "stealth/claude-sonnet-4.6", + "modelKey": "stealth/claude-sonnet-4.6", + "displayName": "Stealth: Claude Sonnet 4.6 (20% off)", + "metadata": { + "lastUpdated": "2026-05-27", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "anthropic/claude-sonnet-4.6", + "modelKey": "anthropic/claude-sonnet-4.6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-17", + "openWeights": false, + "releaseDate": "2026-02-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "anthropic/claude-sonnet-4.6", + "modelKey": "anthropic/claude-sonnet-4.6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 127999 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "anthropic/claude-sonnet-4.6", + "modelKey": "anthropic/claude-sonnet-4.6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "anthropic/claude-sonnet-4.6", + "modelKey": "anthropic/claude-sonnet-4.6", + "displayName": "Claude-Sonnet-4.6", + "metadata": { + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "anthropic/claude-sonnet-4.6", + "modelKey": "anthropic/claude-sonnet-4.6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "anthropic/claude-sonnet-4.6", + "modelKey": "anthropic/claude-sonnet-4.6", + "displayName": "Claude Sonnet 4.6", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-18", + "openWeights": false, + "releaseDate": "2026-02-18", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/anthropic/claude-sonnet-4.6", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/anthropic/claude-sonnet-4.6" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "anthropic/claude-sonnet-4.6", + "displayName": "Anthropic: Claude Sonnet 4.6", + "metadata": { + "canonicalSlug": "anthropic/claude-4.6-sonnet-20260217", + "createdAt": "2026-02-17T15:43:10.000Z", + "links": { + "details": "/api/v1/models/anthropic/claude-4.6-sonnet-20260217/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p", + "verbosity" + ], + "tokenizer": "Claude", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-4.6:thinking", + "provider": "anthropic", + "model": "claude-sonnet-4.6:thinking", + "displayName": "Claude Sonnet 4.6 Thinking", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/anthropic/claude-sonnet-4.6:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "anthropic/claude-sonnet-4.6:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.992, + "output": 14.993999999999998 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.6 Thinking" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-17", + "lastUpdated": "2026-02-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "anthropic/claude-sonnet-4.6:thinking", + "modelKey": "anthropic/claude-sonnet-4.6:thinking", + "displayName": "Claude Sonnet 4.6 Thinking", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-17", + "openWeights": false, + "releaseDate": "2026-02-17" + } + } + ] + }, + { + "id": "anthropic/claude-sonnet-4@20250514", + "provider": "anthropic", + "model": "claude-sonnet-4@20250514", + "displayName": "Claude Sonnet 4", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "google-vertex-anthropic", + "vertex_ai-anthropic_models" + ], + "aliases": [ + "google-vertex-anthropic/claude-sonnet-4@20250514", + "google-vertex/claude-sonnet-4@20250514", + "vertex_ai-anthropic_models/vertex_ai/claude-sonnet-4@20250514" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "assistantPrefill": true, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex-anthropic", + "model": "claude-sonnet-4@20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "claude-sonnet-4@20250514", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-sonnet-4@20250514", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000006, + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex-anthropic", + "providerName": "Vertex (Anthropic)", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude", + "model": "claude-sonnet-4@20250514", + "modelKey": "claude-sonnet-4@20250514", + "displayName": "Claude Sonnet 4", + "family": "claude-sonnet", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "claude-sonnet-4@20250514", + "modelKey": "claude-sonnet-4@20250514", + "displayName": "Claude Sonnet 4", + "family": "claude-sonnet", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024 + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-anthropic_models", + "model": "vertex_ai/claude-sonnet-4@20250514", + "mode": "chat" + } + ] + }, + { + "id": "anthropic/claude-sonnet-latest", + "provider": "anthropic", + "model": "claude-sonnet-latest", + "displayName": "Anthropic: Claude Sonnet Latest", + "family": "claude-sonnet", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "kilo/~anthropic/claude-sonnet-latest", + "nano-gpt/anthropic/claude-sonnet-latest", + "openrouter/~anthropic/claude-sonnet-latest" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "~anthropic/claude-sonnet-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "anthropic/claude-sonnet-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2992, + "input": 2.992, + "output": 14.994 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "~anthropic/claude-sonnet-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "~anthropic/claude-sonnet-latest", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anthropic Claude Sonnet Latest", + "Anthropic: Claude Sonnet Latest", + "Claude Sonnet Latest" + ], + "families": [ + "claude-sonnet" + ], + "releaseDate": "2026-04-27", + "lastUpdated": "2026-05-01", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p", + "verbosity" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "~anthropic/claude-sonnet-latest", + "modelKey": "~anthropic/claude-sonnet-latest", + "displayName": "Anthropic: Claude Sonnet Latest", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "anthropic/claude-sonnet-latest", + "modelKey": "anthropic/claude-sonnet-latest", + "displayName": "Claude Sonnet Latest", + "metadata": { + "lastUpdated": "2026-03-01", + "openWeights": false, + "releaseDate": "2026-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "~anthropic/claude-sonnet-latest", + "modelKey": "~anthropic/claude-sonnet-latest", + "displayName": "Anthropic Claude Sonnet Latest", + "family": "claude-sonnet", + "metadata": { + "lastUpdated": "2026-04-27", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + }, + { + "type": "budget_tokens", + "min": 1024, + "max": 127999 + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "~anthropic/claude-sonnet-latest", + "displayName": "Anthropic Claude Sonnet Latest", + "metadata": { + "canonicalSlug": "~anthropic/claude-sonnet-latest", + "createdAt": "2026-04-27T19:32:48.000Z", + "links": { + "details": "/api/v1/models/~anthropic/claude-sonnet-latest/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p", + "verbosity" + ], + "tokenizer": "Router", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "anyscale/zephyr-7b-beta", + "provider": "anyscale", + "model": "zephyr-7b-beta", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "anyscale" + ], + "aliases": [ + "anyscale/HuggingFaceH4/zephyr-7b-beta" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "anyscale", + "model": "anyscale/HuggingFaceH4/zephyr-7b-beta", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anyscale", + "model": "anyscale/HuggingFaceH4/zephyr-7b-beta", + "mode": "chat" + } + ] + }, + { + "id": "apiserpent/deep-search", + "provider": "apiserpent", + "model": "deep-search", + "mode": "search", + "sources": [ + "litellm" + ], + "providers": [ + "apiserpent" + ], + "aliases": [ + "apiserpent/deep_search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "apiserpent", + "model": "apiserpent/deep_search", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perQuery": { + "input": 0.0006 + } + } + ] + }, + "metadata": { + "modes": [ + "search" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "apiserpent", + "model": "apiserpent/deep_search", + "mode": "search", + "metadata": { + "metadata": { + "notes": "APISerpent deep search (/api/search), multi-engine (Google, Bing, Yahoo, DuckDuckGo). Pricing: $0.60/1k searches." + } + } + } + ] + }, + { + "id": "apiserpent/search", + "provider": "apiserpent", + "model": "search", + "mode": "search", + "sources": [ + "litellm" + ], + "providers": [ + "apiserpent" + ], + "aliases": [ + "apiserpent/search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "apiserpent", + "model": "apiserpent/search", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perQuery": { + "input": 0.0006 + } + } + ] + }, + "metadata": { + "modes": [ + "search" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "apiserpent", + "model": "apiserpent/search", + "mode": "search", + "metadata": { + "metadata": { + "notes": "APISerpent quick search (/api/search/quick), multi-engine (Google, Bing, Yahoo, DuckDuckGo). Pricing: $0.60/1k searches." + } + } + } + ] + }, + { + "id": "assemblyai/best", + "provider": "assemblyai", + "model": "best", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "assemblyai" + ], + "aliases": [ + "assemblyai/best" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "assemblyai", + "model": "assemblyai/best", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00003333 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "assemblyai", + "model": "assemblyai/best", + "mode": "audio_transcription" + } + ] + }, + { + "id": "assemblyai/nano", + "provider": "assemblyai", + "model": "nano", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "assemblyai" + ], + "aliases": [ + "assemblyai/nano" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "assemblyai", + "model": "assemblyai/nano", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00010278 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "assemblyai", + "model": "assemblyai/nano", + "mode": "audio_transcription" + } + ] + }, + { + "id": "atomic-chat/gemma-4-e4b-it-iq4-xs", + "provider": "atomic-chat", + "model": "gemma-4-e4b-it-iq4-xs", + "displayName": "Gemma 4 E4B Instruct (IQ4_XS)", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "atomic-chat" + ], + "aliases": [ + "atomic-chat/gemma-4-E4B-it-IQ4_XS" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "atomic-chat", + "model": "gemma-4-E4B-it-IQ4_XS", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 E4B Instruct (IQ4_XS)" + ], + "families": [ + "gemma" + ], + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "atomic-chat", + "providerName": "Atomic Chat", + "providerApi": "http://127.0.0.1:1337/v1", + "providerDoc": "https://atomic.chat", + "model": "gemma-4-E4B-it-IQ4_XS", + "modelKey": "gemma-4-E4B-it-IQ4_XS", + "displayName": "Gemma 4 E4B Instruct (IQ4_XS)", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02" + } + } + ] + }, + { + "id": "atomic-chat/gemma-4-e4b-it-mlx-4bit", + "provider": "atomic-chat", + "model": "gemma-4-e4b-it-mlx-4bit", + "displayName": "Gemma 4 E4B Instruct (MLX 4-bit)", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "atomic-chat" + ], + "aliases": [ + "atomic-chat/gemma-4-E4B-it-MLX-4bit" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "atomic-chat", + "model": "gemma-4-E4B-it-MLX-4bit", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 E4B Instruct (MLX 4-bit)" + ], + "families": [ + "gemma" + ], + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "atomic-chat", + "providerName": "Atomic Chat", + "providerApi": "http://127.0.0.1:1337/v1", + "providerDoc": "https://atomic.chat", + "model": "gemma-4-E4B-it-MLX-4bit", + "modelKey": "gemma-4-E4B-it-MLX-4bit", + "displayName": "Gemma 4 E4B Instruct (MLX 4-bit)", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02" + } + } + ] + }, + { + "id": "aws-polly/generative", + "provider": "aws-polly", + "model": "generative", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "aws_polly" + ], + "aliases": [ + "aws_polly/generative" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "aws_polly", + "model": "aws_polly/generative", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.00003 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "aws_polly", + "model": "aws_polly/generative", + "mode": "audio_speech", + "metadata": { + "source": "https://aws.amazon.com/polly/pricing/", + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "aws-polly/long-form", + "provider": "aws-polly", + "model": "long-form", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "aws_polly" + ], + "aliases": [ + "aws_polly/long-form" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "aws_polly", + "model": "aws_polly/long-form", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.0001 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "aws_polly", + "model": "aws_polly/long-form", + "mode": "audio_speech", + "metadata": { + "source": "https://aws.amazon.com/polly/pricing/", + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "aws-polly/neural", + "provider": "aws-polly", + "model": "neural", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "aws_polly" + ], + "aliases": [ + "aws_polly/neural" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "aws_polly", + "model": "aws_polly/neural", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.000016 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "aws_polly", + "model": "aws_polly/neural", + "mode": "audio_speech", + "metadata": { + "source": "https://aws.amazon.com/polly/pricing/", + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "aws-polly/standard", + "provider": "aws-polly", + "model": "standard", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "aws_polly" + ], + "aliases": [ + "aws_polly/standard" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "aws_polly", + "model": "aws_polly/standard", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.000004 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "aws_polly", + "model": "aws_polly/standard", + "mode": "audio_speech", + "metadata": { + "source": "https://aws.amazon.com/polly/pricing/", + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "azure-ai/cohere-embed-v3-english", + "provider": "azure-ai", + "model": "cohere-embed-v3-english", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/Cohere-embed-v3-english" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "outputVectorSize": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Cohere-embed-v3-english", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Cohere-embed-v3-english", + "mode": "embedding", + "metadata": { + "source": "https://azuremarketplace.microsoft.com/en-us/marketplace/apps/cohere.cohere-embed-v3-english-offer?tab=PlansAndPrice" + } + } + ] + }, + { + "id": "azure-ai/cohere-embed-v3-multilingual", + "provider": "azure-ai", + "model": "cohere-embed-v3-multilingual", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/Cohere-embed-v3-multilingual" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "outputVectorSize": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Cohere-embed-v3-multilingual", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Cohere-embed-v3-multilingual", + "mode": "embedding", + "metadata": { + "source": "https://azuremarketplace.microsoft.com/en-us/marketplace/apps/cohere.cohere-embed-v3-english-offer?tab=PlansAndPrice" + } + } + ] + }, + { + "id": "azure-ai/cohere-rerank-v3-english", + "provider": "azure-ai", + "model": "cohere-rerank-v3-english", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/cohere-rerank-v3-english" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxQueryTokens": 2048, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/cohere-rerank-v3-english", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perQuery": { + "input": 0.002 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/cohere-rerank-v3-english", + "mode": "rerank" + } + ] + }, + { + "id": "azure-ai/cohere-rerank-v3-multilingual", + "provider": "azure-ai", + "model": "cohere-rerank-v3-multilingual", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/cohere-rerank-v3-multilingual" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxQueryTokens": 2048, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/cohere-rerank-v3-multilingual", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perQuery": { + "input": 0.002 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/cohere-rerank-v3-multilingual", + "mode": "rerank" + } + ] + }, + { + "id": "azure-ai/cohere-rerank-v3.5", + "provider": "azure-ai", + "model": "cohere-rerank-v3.5", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/cohere-rerank-v3.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxQueryTokens": 2048, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/cohere-rerank-v3.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perQuery": { + "input": 0.002 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/cohere-rerank-v3.5", + "mode": "rerank" + } + ] + }, + { + "id": "azure-ai/cohere-rerank-v4.0-fast", + "provider": "azure-ai", + "model": "cohere-rerank-v4.0-fast", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/cohere-rerank-v4.0-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxQueryTokens": 4096, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/cohere-rerank-v4.0-fast", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perQuery": { + "input": 0.002 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/cohere-rerank-v4.0-fast", + "mode": "rerank", + "metadata": { + "source": "https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/introducing-cohere-rerank-4-0-in-microsoft-foundry/4477076" + } + } + ] + }, + { + "id": "azure-ai/cohere-rerank-v4.0-pro", + "provider": "azure-ai", + "model": "cohere-rerank-v4.0-pro", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/cohere-rerank-v4.0-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxQueryTokens": 4096, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/cohere-rerank-v4.0-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perQuery": { + "input": 0.0025 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/cohere-rerank-v4.0-pro", + "mode": "rerank", + "metadata": { + "source": "https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/introducing-cohere-rerank-4-0-in-microsoft-foundry/4477076" + } + } + ] + }, + { + "id": "azure-ai/embed-v-4-0", + "provider": "azure-ai", + "model": "embed-v-4-0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/embed-v-4-0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "outputVectorSize": 3072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/embed-v-4-0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "supportedEndpoints": [ + "/v1/embeddings" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/embed-v-4-0", + "mode": "embedding", + "metadata": { + "source": "https://azuremarketplace.microsoft.com/pt-br/marketplace/apps/cohere.cohere-embed-4-offer?tab=PlansAndPrice", + "supportedEndpoints": [ + "/v1/embeddings" + ] + } + } + ] + }, + { + "id": "azure-ai/flux-1.1-pro", + "provider": "azure-ai", + "model": "flux-1.1-pro", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/FLUX-1.1-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/FLUX-1.1-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/FLUX-1.1-pro", + "mode": "image_generation", + "metadata": { + "source": "https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/black-forest-labs-flux-1-kontext-pro-and-flux1-1-pro-now-available-in-azure-ai-f/4434659", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "azure-ai/flux.1-kontext-pro", + "provider": "azure-ai", + "model": "flux.1-kontext-pro", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/FLUX.1-Kontext-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/FLUX.1-Kontext-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/FLUX.1-Kontext-pro", + "mode": "image_generation", + "metadata": { + "source": "https://azuremarketplace.microsoft.com/pt-br/marketplace/apps/cohere.cohere-embed-4-offer?tab=PlansAndPrice", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "azure-ai/flux.2-pro", + "provider": "azure-ai", + "model": "flux.2-pro", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/flux.2-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/flux.2-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/flux.2-pro", + "mode": "image_generation", + "metadata": { + "source": "https://ai.azure.com/explore/models/flux.2-pro/version/1/registry/azureml-blackforestlabs", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "azure-ai/jais-30b-chat", + "provider": "azure-ai", + "model": "jais-30b-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/jais-30b-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/jais-30b-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3200, + "output": 9710 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/jais-30b-chat", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/products/ai-services/ai-foundry/models/jais-30b-chat" + } + } + ] + }, + { + "id": "azure-ai/jamba-instruct", + "provider": "azure-ai", + "model": "jamba-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/jamba-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 70000, + "inputTokens": 70000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/jamba-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 0.7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/jamba-instruct", + "mode": "chat" + } + ] + }, + { + "id": "azure-ai/mai-ds-r1", + "provider": "azure-ai", + "model": "mai-ds-r1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/MAI-DS-R1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/MAI-DS-R1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.35, + "output": 5.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/MAI-DS-R1", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/ai-foundry-models/microsoft/" + } + } + ] + }, + { + "id": "azure-ai/model-router", + "provider": "azure-ai", + "model": "model-router", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/model_router" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/model_router", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.14, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/model_router", + "mode": "chat", + "metadata": { + "comment": "Flat cost of $0.14 per M input tokens for Azure AI Foundry Model Router infrastructure. Use pattern: azure_ai/model_router/ where deployment-name is your Azure deployment (e.g., azure-model-router)", + "source": "https://azure.microsoft.com/en-us/pricing/details/ai-services/" + } + } + ] + }, + { + "id": "azure-ai/phi-3-medium-128k-instruct", + "provider": "azure-ai", + "model": "phi-3-medium-128k-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/Phi-3-medium-128k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Phi-3-medium-128k-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.17, + "output": 0.68 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Phi-3-medium-128k-instruct", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/phi-3/" + } + } + ] + }, + { + "id": "azure-ai/phi-3-medium-4k-instruct", + "provider": "azure-ai", + "model": "phi-3-medium-4k-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/Phi-3-medium-4k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Phi-3-medium-4k-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.17, + "output": 0.68 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Phi-3-medium-4k-instruct", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/phi-3/" + } + } + ] + }, + { + "id": "azure-ai/phi-3-mini-128k-instruct", + "provider": "azure-ai", + "model": "phi-3-mini-128k-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/Phi-3-mini-128k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Phi-3-mini-128k-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0.52 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Phi-3-mini-128k-instruct", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/phi-3/" + } + } + ] + }, + { + "id": "azure-ai/phi-3-mini-4k-instruct", + "provider": "azure-ai", + "model": "phi-3-mini-4k-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/Phi-3-mini-4k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Phi-3-mini-4k-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0.52 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Phi-3-mini-4k-instruct", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/phi-3/" + } + } + ] + }, + { + "id": "azure-ai/phi-3-small-128k-instruct", + "provider": "azure-ai", + "model": "phi-3-small-128k-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/Phi-3-small-128k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Phi-3-small-128k-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Phi-3-small-128k-instruct", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/phi-3/" + } + } + ] + }, + { + "id": "azure-ai/phi-3-small-8k-instruct", + "provider": "azure-ai", + "model": "phi-3-small-8k-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/Phi-3-small-8k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Phi-3-small-8k-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Phi-3-small-8k-instruct", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/phi-3/" + } + } + ] + }, + { + "id": "azure-ai/phi-3.5-mini-instruct", + "provider": "azure-ai", + "model": "phi-3.5-mini-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/Phi-3.5-mini-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Phi-3.5-mini-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0.52 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Phi-3.5-mini-instruct", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/phi-3/" + } + } + ] + }, + { + "id": "azure-ai/phi-3.5-moe-instruct", + "provider": "azure-ai", + "model": "phi-3.5-moe-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/Phi-3.5-MoE-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Phi-3.5-MoE-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.16, + "output": 0.64 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Phi-3.5-MoE-instruct", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/phi-3/" + } + } + ] + }, + { + "id": "azure-ai/phi-3.5-vision-instruct", + "provider": "azure-ai", + "model": "phi-3.5-vision-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/Phi-3.5-vision-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Phi-3.5-vision-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0.52 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Phi-3.5-vision-instruct", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/phi-3/" + } + } + ] + }, + { + "id": "azure-ai/phi-4", + "provider": "azure-ai", + "model": "phi-4", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/Phi-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Phi-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.125, + "output": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Phi-4", + "mode": "chat", + "metadata": { + "source": "https://techcommunity.microsoft.com/blog/machinelearningblog/affordable-innovation-unveiling-the-pricing-of-phi-3-slms-on-models-as-a-service/4156495" + } + } + ] + }, + { + "id": "azure-ai/phi-4-mini-instruct", + "provider": "azure-ai", + "model": "phi-4-mini-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/Phi-4-mini-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Phi-4-mini-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Phi-4-mini-instruct", + "mode": "chat", + "metadata": { + "source": "https://techcommunity.microsoft.com/blog/Azure-AI-Services-blog/announcing-new-phi-pricing-empowering-your-business-with-small-language-models/4395112" + } + } + ] + }, + { + "id": "azure-ai/phi-4-mini-reasoning", + "provider": "azure-ai", + "model": "phi-4-mini-reasoning", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/Phi-4-mini-reasoning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Phi-4-mini-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.32 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Phi-4-mini-reasoning", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/ai-foundry-models/microsoft/" + } + } + ] + }, + { + "id": "azure-ai/phi-4-multimodal-instruct", + "provider": "azure-ai", + "model": "phi-4-multimodal-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/Phi-4-multimodal-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Phi-4-multimodal-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "inputAudio": 4, + "output": 0.32 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Phi-4-multimodal-instruct", + "mode": "chat", + "metadata": { + "source": "https://techcommunity.microsoft.com/blog/Azure-AI-Services-blog/announcing-new-phi-pricing-empowering-your-business-with-small-language-models/4395112" + } + } + ] + }, + { + "id": "azure-ai/phi-4-reasoning", + "provider": "azure-ai", + "model": "phi-4-reasoning", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/Phi-4-reasoning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Phi-4-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.125, + "output": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Phi-4-reasoning", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/ai-foundry-models/microsoft/" + } + } + ] + }, + { + "id": "azure-ai/prebuilt-document", + "provider": "azure-ai", + "model": "prebuilt-document", + "mode": "ocr", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/doc-intelligence/prebuilt-document" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/doc-intelligence/prebuilt-document", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPage": { + "ocr": 0.01 + } + } + ] + }, + "metadata": { + "modes": [ + "ocr" + ], + "supportedEndpoints": [ + "/v1/ocr" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/doc-intelligence/prebuilt-document", + "mode": "ocr", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/ai-document-intelligence/", + "supportedEndpoints": [ + "/v1/ocr" + ] + } + } + ] + }, + { + "id": "azure-ai/prebuilt-layout", + "provider": "azure-ai", + "model": "prebuilt-layout", + "mode": "ocr", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/doc-intelligence/prebuilt-layout" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/doc-intelligence/prebuilt-layout", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPage": { + "ocr": 0.01 + } + } + ] + }, + "metadata": { + "modes": [ + "ocr" + ], + "supportedEndpoints": [ + "/v1/ocr" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/doc-intelligence/prebuilt-layout", + "mode": "ocr", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/ai-document-intelligence/", + "supportedEndpoints": [ + "/v1/ocr" + ] + } + } + ] + }, + { + "id": "azure-ai/prebuilt-read", + "provider": "azure-ai", + "model": "prebuilt-read", + "mode": "ocr", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/doc-intelligence/prebuilt-read" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/doc-intelligence/prebuilt-read", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPage": { + "ocr": 0.0015 + } + } + ] + }, + "metadata": { + "modes": [ + "ocr" + ], + "supportedEndpoints": [ + "/v1/ocr" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/doc-intelligence/prebuilt-read", + "mode": "ocr", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/ai-document-intelligence/", + "supportedEndpoints": [ + "/v1/ocr" + ] + } + } + ] + }, + { + "id": "azure-cognitive-services/cohere-command-a", + "provider": "azure-cognitive-services", + "model": "cohere-command-a", + "displayName": "Command A", + "family": "command-a", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/cohere-command-a" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "cohere-command-a", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Command A" + ], + "families": [ + "command-a" + ], + "knowledgeCutoff": "2024-06-01", + "releaseDate": "2025-03-13", + "lastUpdated": "2025-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "cohere-command-a", + "modelKey": "cohere-command-a", + "displayName": "Command A", + "family": "command-a", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2025-03-13", + "openWeights": true, + "releaseDate": "2025-03-13" + } + } + ] + }, + { + "id": "azure-cognitive-services/cohere-command-r-08-2024", + "provider": "azure-cognitive-services", + "model": "cohere-command-r-08-2024", + "displayName": "Command R", + "family": "command-r", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/cohere-command-r-08-2024" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "cohere-command-r-08-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Command R" + ], + "families": [ + "command-r" + ], + "knowledgeCutoff": "2024-06-01", + "releaseDate": "2024-08-30", + "lastUpdated": "2024-08-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "cohere-command-r-08-2024", + "modelKey": "cohere-command-r-08-2024", + "displayName": "Command R", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2024-08-30", + "openWeights": true, + "releaseDate": "2024-08-30" + } + } + ] + }, + { + "id": "azure-cognitive-services/cohere-command-r-plus-08-2024", + "provider": "azure-cognitive-services", + "model": "cohere-command-r-plus-08-2024", + "displayName": "Command R+", + "family": "command-r", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/cohere-command-r-plus-08-2024" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "cohere-command-r-plus-08-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Command R+" + ], + "families": [ + "command-r" + ], + "knowledgeCutoff": "2024-06-01", + "releaseDate": "2024-08-30", + "lastUpdated": "2024-08-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "cohere-command-r-plus-08-2024", + "modelKey": "cohere-command-r-plus-08-2024", + "displayName": "Command R+", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2024-08-30", + "openWeights": true, + "releaseDate": "2024-08-30" + } + } + ] + }, + { + "id": "azure-cognitive-services/cohere-embed-v-4-0", + "provider": "azure-cognitive-services", + "model": "cohere-embed-v-4-0", + "displayName": "Embed v4", + "family": "cohere-embed", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/cohere-embed-v-4-0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "cohere-embed-v-4-0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Embed v4" + ], + "families": [ + "cohere-embed" + ], + "releaseDate": "2025-04-15", + "lastUpdated": "2025-04-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "cohere-embed-v-4-0", + "modelKey": "cohere-embed-v-4-0", + "displayName": "Embed v4", + "family": "cohere-embed", + "metadata": { + "lastUpdated": "2025-04-15", + "openWeights": true, + "releaseDate": "2025-04-15" + } + } + ] + }, + { + "id": "azure-cognitive-services/cohere-embed-v3-english", + "provider": "azure-cognitive-services", + "model": "cohere-embed-v3-english", + "displayName": "Embed v3 English", + "family": "cohere-embed", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/cohere-embed-v3-english" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "cohere-embed-v3-english", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Embed v3 English" + ], + "families": [ + "cohere-embed" + ], + "releaseDate": "2023-11-07", + "lastUpdated": "2023-11-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "cohere-embed-v3-english", + "modelKey": "cohere-embed-v3-english", + "displayName": "Embed v3 English", + "family": "cohere-embed", + "metadata": { + "lastUpdated": "2023-11-07", + "openWeights": true, + "releaseDate": "2023-11-07" + } + } + ] + }, + { + "id": "azure-cognitive-services/cohere-embed-v3-multilingual", + "provider": "azure-cognitive-services", + "model": "cohere-embed-v3-multilingual", + "displayName": "Embed v3 Multilingual", + "family": "cohere-embed", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/cohere-embed-v3-multilingual" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "cohere-embed-v3-multilingual", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Embed v3 Multilingual" + ], + "families": [ + "cohere-embed" + ], + "releaseDate": "2023-11-07", + "lastUpdated": "2023-11-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "cohere-embed-v3-multilingual", + "modelKey": "cohere-embed-v3-multilingual", + "displayName": "Embed v3 Multilingual", + "family": "cohere-embed", + "metadata": { + "lastUpdated": "2023-11-07", + "openWeights": true, + "releaseDate": "2023-11-07" + } + } + ] + }, + { + "id": "azure-cognitive-services/model-router", + "provider": "azure-cognitive-services", + "model": "model-router", + "displayName": "Model Router", + "family": "model-router", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/model-router" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "model-router", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Model Router" + ], + "families": [ + "model-router" + ], + "releaseDate": "2025-05-19", + "lastUpdated": "2025-11-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "model-router", + "modelKey": "model-router", + "displayName": "Model Router", + "family": "model-router", + "metadata": { + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-05-19" + } + } + ] + }, + { + "id": "azure-cognitive-services/o1", + "provider": "azure-cognitive-services", + "model": "o1", + "displayName": "o1", + "family": "o", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/o1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "o1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + } + ] + }, + "metadata": { + "displayNames": [ + "o1" + ], + "families": [ + "o" + ], + "knowledgeCutoff": "2023-09", + "releaseDate": "2024-12-05", + "lastUpdated": "2024-12-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "o1", + "modelKey": "o1", + "displayName": "o1", + "family": "o", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-12-05", + "openWeights": false, + "releaseDate": "2024-12-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "azure-cognitive-services/o3", + "provider": "azure-cognitive-services", + "model": "o3", + "displayName": "o3", + "family": "o", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/o3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "o3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "o3" + ], + "families": [ + "o" + ], + "knowledgeCutoff": "2024-05", + "releaseDate": "2025-04-16", + "lastUpdated": "2025-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "o3", + "modelKey": "o3", + "displayName": "o3", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "azure-cognitive-services/phi-3-medium-128k-instruct", + "provider": "azure-cognitive-services", + "model": "phi-3-medium-128k-instruct", + "displayName": "Phi-3-medium-instruct (128k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/phi-3-medium-128k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "phi-3-medium-128k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.17, + "output": 0.68 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-medium-instruct (128k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-3-medium-128k-instruct", + "modelKey": "phi-3-medium-128k-instruct", + "displayName": "Phi-3-medium-instruct (128k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "azure-cognitive-services/phi-3-medium-4k-instruct", + "provider": "azure-cognitive-services", + "model": "phi-3-medium-4k-instruct", + "displayName": "Phi-3-medium-instruct (4k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/phi-3-medium-4k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "phi-3-medium-4k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.17, + "output": 0.68 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-medium-instruct (4k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-3-medium-4k-instruct", + "modelKey": "phi-3-medium-4k-instruct", + "displayName": "Phi-3-medium-instruct (4k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "azure-cognitive-services/phi-3-mini-128k-instruct", + "provider": "azure-cognitive-services", + "model": "phi-3-mini-128k-instruct", + "displayName": "Phi-3-mini-instruct (128k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/phi-3-mini-128k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "phi-3-mini-128k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.52 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-mini-instruct (128k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-3-mini-128k-instruct", + "modelKey": "phi-3-mini-128k-instruct", + "displayName": "Phi-3-mini-instruct (128k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "azure-cognitive-services/phi-3-mini-4k-instruct", + "provider": "azure-cognitive-services", + "model": "phi-3-mini-4k-instruct", + "displayName": "Phi-3-mini-instruct (4k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/phi-3-mini-4k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "phi-3-mini-4k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.52 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-mini-instruct (4k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-3-mini-4k-instruct", + "modelKey": "phi-3-mini-4k-instruct", + "displayName": "Phi-3-mini-instruct (4k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "azure-cognitive-services/phi-3-small-128k-instruct", + "provider": "azure-cognitive-services", + "model": "phi-3-small-128k-instruct", + "displayName": "Phi-3-small-instruct (128k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/phi-3-small-128k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "phi-3-small-128k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-small-instruct (128k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-3-small-128k-instruct", + "modelKey": "phi-3-small-128k-instruct", + "displayName": "Phi-3-small-instruct (128k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "azure-cognitive-services/phi-3-small-8k-instruct", + "provider": "azure-cognitive-services", + "model": "phi-3-small-8k-instruct", + "displayName": "Phi-3-small-instruct (8k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/phi-3-small-8k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "phi-3-small-8k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-small-instruct (8k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-3-small-8k-instruct", + "modelKey": "phi-3-small-8k-instruct", + "displayName": "Phi-3-small-instruct (8k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "azure-cognitive-services/phi-3.5-mini-instruct", + "provider": "azure-cognitive-services", + "model": "phi-3.5-mini-instruct", + "displayName": "Phi-3.5-mini-instruct", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/phi-3.5-mini-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "phi-3.5-mini-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.52 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3.5-mini-instruct" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-08-20", + "lastUpdated": "2024-08-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-3.5-mini-instruct", + "modelKey": "phi-3.5-mini-instruct", + "displayName": "Phi-3.5-mini-instruct", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-08-20", + "openWeights": true, + "releaseDate": "2024-08-20" + } + } + ] + }, + { + "id": "azure-cognitive-services/phi-3.5-moe-instruct", + "provider": "azure-cognitive-services", + "model": "phi-3.5-moe-instruct", + "displayName": "Phi-3.5-MoE-instruct", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/phi-3.5-moe-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "phi-3.5-moe-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.16, + "output": 0.64 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3.5-MoE-instruct" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-08-20", + "lastUpdated": "2024-08-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-3.5-moe-instruct", + "modelKey": "phi-3.5-moe-instruct", + "displayName": "Phi-3.5-MoE-instruct", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-08-20", + "openWeights": true, + "releaseDate": "2024-08-20" + } + } + ] + }, + { + "id": "azure-cognitive-services/phi-4", + "provider": "azure-cognitive-services", + "model": "phi-4", + "displayName": "Phi-4", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/phi-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "phi-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.125, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-4", + "modelKey": "phi-4", + "displayName": "Phi-4", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "azure-cognitive-services/phi-4-mini", + "provider": "azure-cognitive-services", + "model": "phi-4-mini", + "displayName": "Phi-4-mini", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/phi-4-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "phi-4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4-mini" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-4-mini", + "modelKey": "phi-4-mini", + "displayName": "Phi-4-mini", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "azure-cognitive-services/phi-4-mini-reasoning", + "provider": "azure-cognitive-services", + "model": "phi-4-mini-reasoning", + "displayName": "Phi-4-mini-reasoning", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/phi-4-mini-reasoning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "phi-4-mini-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4-mini-reasoning" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-4-mini-reasoning", + "modelKey": "phi-4-mini-reasoning", + "displayName": "Phi-4-mini-reasoning", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "azure-cognitive-services/phi-4-multimodal", + "provider": "azure-cognitive-services", + "model": "phi-4-multimodal", + "displayName": "Phi-4-multimodal", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/phi-4-multimodal" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "phi-4-multimodal", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "inputAudio": 4, + "output": 0.32 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4-multimodal" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-4-multimodal", + "modelKey": "phi-4-multimodal", + "displayName": "Phi-4-multimodal", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "azure-cognitive-services/phi-4-reasoning", + "provider": "azure-cognitive-services", + "model": "phi-4-reasoning", + "displayName": "Phi-4-reasoning", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/phi-4-reasoning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "phi-4-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.125, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4-reasoning" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-4-reasoning", + "modelKey": "phi-4-reasoning", + "displayName": "Phi-4-reasoning", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "azure-cognitive-services/phi-4-reasoning-plus", + "provider": "azure-cognitive-services", + "model": "phi-4-reasoning-plus", + "displayName": "Phi-4-reasoning-plus", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/phi-4-reasoning-plus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "phi-4-reasoning-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.125, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4-reasoning-plus" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-4-reasoning-plus", + "modelKey": "phi-4-reasoning-plus", + "displayName": "Phi-4-reasoning-plus", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "azure/ada", + "provider": "azure", + "model": "ada", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/ada" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8191, + "inputTokens": 8191, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/ada", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/ada", + "mode": "embedding" + } + ] + }, + { + "id": "azure/azure-stt", + "provider": "azure", + "model": "azure-stt", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/speech/azure-stt" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/speech/azure-stt", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.0002777778 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/speech/azure-stt", + "mode": "audio_transcription", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/cognitive-services/speech-services/", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "azure/azure-tts", + "provider": "azure", + "model": "azure-tts", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/speech/azure-tts" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/speech/azure-tts", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.000015 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/speech/azure-tts", + "mode": "audio_speech", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/calculator/" + } + } + ] + }, + { + "id": "azure/azure-tts-hd", + "provider": "azure", + "model": "azure-tts-hd", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/speech/azure-tts-hd" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/speech/azure-tts-hd", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.00003 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/speech/azure-tts-hd", + "mode": "audio_speech", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/calculator/" + } + } + ] + }, + { + "id": "azure/cohere-command-a", + "provider": "azure", + "model": "cohere-command-a", + "displayName": "Command A", + "family": "command-a", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/cohere-command-a" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "cohere-command-a", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Command A" + ], + "families": [ + "command-a" + ], + "knowledgeCutoff": "2024-06-01", + "releaseDate": "2025-03-13", + "lastUpdated": "2025-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "cohere-command-a", + "modelKey": "cohere-command-a", + "displayName": "Command A", + "family": "command-a", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2025-03-13", + "openWeights": true, + "releaseDate": "2025-03-13" + } + } + ] + }, + { + "id": "azure/cohere-command-r-08-2024", + "provider": "azure", + "model": "cohere-command-r-08-2024", + "displayName": "Command R", + "family": "command-r", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/cohere-command-r-08-2024" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "cohere-command-r-08-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Command R" + ], + "families": [ + "command-r" + ], + "knowledgeCutoff": "2024-06-01", + "releaseDate": "2024-08-30", + "lastUpdated": "2024-08-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "cohere-command-r-08-2024", + "modelKey": "cohere-command-r-08-2024", + "displayName": "Command R", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2024-08-30", + "openWeights": true, + "releaseDate": "2024-08-30" + } + } + ] + }, + { + "id": "azure/cohere-command-r-plus-08-2024", + "provider": "azure", + "model": "cohere-command-r-plus-08-2024", + "displayName": "Command R+", + "family": "command-r", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/cohere-command-r-plus-08-2024" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "cohere-command-r-plus-08-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Command R+" + ], + "families": [ + "command-r" + ], + "knowledgeCutoff": "2024-06-01", + "releaseDate": "2024-08-30", + "lastUpdated": "2024-08-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "cohere-command-r-plus-08-2024", + "modelKey": "cohere-command-r-plus-08-2024", + "displayName": "Command R+", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2024-08-30", + "openWeights": true, + "releaseDate": "2024-08-30" + } + } + ] + }, + { + "id": "azure/cohere-embed-v-4-0", + "provider": "azure", + "model": "cohere-embed-v-4-0", + "displayName": "Embed v4", + "family": "cohere-embed", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/cohere-embed-v-4-0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "cohere-embed-v-4-0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Embed v4" + ], + "families": [ + "cohere-embed" + ], + "releaseDate": "2025-04-15", + "lastUpdated": "2025-04-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "cohere-embed-v-4-0", + "modelKey": "cohere-embed-v-4-0", + "displayName": "Embed v4", + "family": "cohere-embed", + "metadata": { + "lastUpdated": "2025-04-15", + "openWeights": true, + "releaseDate": "2025-04-15" + } + } + ] + }, + { + "id": "azure/cohere-embed-v3-english", + "provider": "azure", + "model": "cohere-embed-v3-english", + "displayName": "Embed v3 English", + "family": "cohere-embed", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/cohere-embed-v3-english" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "cohere-embed-v3-english", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Embed v3 English" + ], + "families": [ + "cohere-embed" + ], + "releaseDate": "2023-11-07", + "lastUpdated": "2023-11-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "cohere-embed-v3-english", + "modelKey": "cohere-embed-v3-english", + "displayName": "Embed v3 English", + "family": "cohere-embed", + "metadata": { + "lastUpdated": "2023-11-07", + "openWeights": true, + "releaseDate": "2023-11-07" + } + } + ] + }, + { + "id": "azure/cohere-embed-v3-multilingual", + "provider": "azure", + "model": "cohere-embed-v3-multilingual", + "displayName": "Embed v3 Multilingual", + "family": "cohere-embed", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/cohere-embed-v3-multilingual" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "cohere-embed-v3-multilingual", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Embed v3 Multilingual" + ], + "families": [ + "cohere-embed" + ], + "releaseDate": "2023-11-07", + "lastUpdated": "2023-11-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "cohere-embed-v3-multilingual", + "modelKey": "cohere-embed-v3-multilingual", + "displayName": "Embed v3 Multilingual", + "family": "cohere-embed", + "metadata": { + "lastUpdated": "2023-11-07", + "openWeights": true, + "releaseDate": "2023-11-07" + } + } + ] + }, + { + "id": "azure/computer-use-preview", + "provider": "azure", + "model": "computer-use-preview", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/computer-use-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/computer-use-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 12 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "computer-use-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 12 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/computer-use-preview", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "computer-use-preview", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + } + ] + }, + { + "id": "azure/container", + "provider": "azure", + "model": "container", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/container" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/container", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perSession": { + "codeInterpreter": 0.03 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/container", + "mode": "chat" + } + ] + }, + { + "id": "azure/model-router", + "provider": "azure", + "model": "model-router", + "displayName": "Model Router", + "family": "model-router", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/model-router" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "model-router", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Model Router" + ], + "families": [ + "model-router" + ], + "releaseDate": "2025-05-19", + "lastUpdated": "2025-11-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "model-router", + "modelKey": "model-router", + "displayName": "Model Router", + "family": "model-router", + "metadata": { + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-05-19" + } + } + ] + }, + { + "id": "azure/o1", + "provider": "azure", + "model": "o1", + "displayName": "o1", + "family": "o", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/o1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "o1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/o1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + } + ] + }, + "metadata": { + "displayNames": [ + "o1" + ], + "families": [ + "o" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-09", + "releaseDate": "2024-12-05", + "lastUpdated": "2024-12-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "o1", + "modelKey": "o1", + "displayName": "o1", + "family": "o", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-12-05", + "openWeights": false, + "releaseDate": "2024-12-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/o1", + "mode": "chat" + } + ] + }, + { + "id": "azure/o3", + "provider": "azure", + "model": "o3", + "displayName": "o3", + "family": "o", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/o3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "o3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/o3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "o3" + ], + "families": [ + "o" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-05", + "releaseDate": "2025-04-16", + "lastUpdated": "2025-04-16", + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "o3", + "modelKey": "o3", + "displayName": "o3", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/o3", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "azure/phi-3-medium-128k-instruct", + "provider": "azure", + "model": "phi-3-medium-128k-instruct", + "displayName": "Phi-3-medium-instruct (128k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/phi-3-medium-128k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "phi-3-medium-128k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.17, + "output": 0.68 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-medium-instruct (128k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-3-medium-128k-instruct", + "modelKey": "phi-3-medium-128k-instruct", + "displayName": "Phi-3-medium-instruct (128k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "azure/phi-3-medium-4k-instruct", + "provider": "azure", + "model": "phi-3-medium-4k-instruct", + "displayName": "Phi-3-medium-instruct (4k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/phi-3-medium-4k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "phi-3-medium-4k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.17, + "output": 0.68 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-medium-instruct (4k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-3-medium-4k-instruct", + "modelKey": "phi-3-medium-4k-instruct", + "displayName": "Phi-3-medium-instruct (4k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "azure/phi-3-mini-128k-instruct", + "provider": "azure", + "model": "phi-3-mini-128k-instruct", + "displayName": "Phi-3-mini-instruct (128k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/phi-3-mini-128k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "phi-3-mini-128k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.52 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-mini-instruct (128k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-3-mini-128k-instruct", + "modelKey": "phi-3-mini-128k-instruct", + "displayName": "Phi-3-mini-instruct (128k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "azure/phi-3-mini-4k-instruct", + "provider": "azure", + "model": "phi-3-mini-4k-instruct", + "displayName": "Phi-3-mini-instruct (4k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/phi-3-mini-4k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "phi-3-mini-4k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.52 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-mini-instruct (4k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-3-mini-4k-instruct", + "modelKey": "phi-3-mini-4k-instruct", + "displayName": "Phi-3-mini-instruct (4k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "azure/phi-3-small-128k-instruct", + "provider": "azure", + "model": "phi-3-small-128k-instruct", + "displayName": "Phi-3-small-instruct (128k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/phi-3-small-128k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "phi-3-small-128k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-small-instruct (128k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-3-small-128k-instruct", + "modelKey": "phi-3-small-128k-instruct", + "displayName": "Phi-3-small-instruct (128k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "azure/phi-3-small-8k-instruct", + "provider": "azure", + "model": "phi-3-small-8k-instruct", + "displayName": "Phi-3-small-instruct (8k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/phi-3-small-8k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "phi-3-small-8k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-small-instruct (8k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-3-small-8k-instruct", + "modelKey": "phi-3-small-8k-instruct", + "displayName": "Phi-3-small-instruct (8k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "azure/phi-3.5-mini-instruct", + "provider": "azure", + "model": "phi-3.5-mini-instruct", + "displayName": "Phi-3.5-mini-instruct", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/phi-3.5-mini-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "phi-3.5-mini-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.52 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3.5-mini-instruct" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-08-20", + "lastUpdated": "2024-08-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-3.5-mini-instruct", + "modelKey": "phi-3.5-mini-instruct", + "displayName": "Phi-3.5-mini-instruct", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-08-20", + "openWeights": true, + "releaseDate": "2024-08-20" + } + } + ] + }, + { + "id": "azure/phi-3.5-moe-instruct", + "provider": "azure", + "model": "phi-3.5-moe-instruct", + "displayName": "Phi-3.5-MoE-instruct", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/phi-3.5-moe-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "phi-3.5-moe-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.16, + "output": 0.64 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3.5-MoE-instruct" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-08-20", + "lastUpdated": "2024-08-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-3.5-moe-instruct", + "modelKey": "phi-3.5-moe-instruct", + "displayName": "Phi-3.5-MoE-instruct", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-08-20", + "openWeights": true, + "releaseDate": "2024-08-20" + } + } + ] + }, + { + "id": "azure/phi-4", + "provider": "azure", + "model": "phi-4", + "displayName": "Phi-4", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/phi-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "phi-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.125, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-4", + "modelKey": "phi-4", + "displayName": "Phi-4", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "azure/phi-4-mini", + "provider": "azure", + "model": "phi-4-mini", + "displayName": "Phi-4-mini", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/phi-4-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "phi-4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4-mini" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-4-mini", + "modelKey": "phi-4-mini", + "displayName": "Phi-4-mini", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "azure/phi-4-mini-reasoning", + "provider": "azure", + "model": "phi-4-mini-reasoning", + "displayName": "Phi-4-mini-reasoning", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/phi-4-mini-reasoning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "phi-4-mini-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4-mini-reasoning" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-4-mini-reasoning", + "modelKey": "phi-4-mini-reasoning", + "displayName": "Phi-4-mini-reasoning", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "azure/phi-4-multimodal", + "provider": "azure", + "model": "phi-4-multimodal", + "displayName": "Phi-4-multimodal", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/phi-4-multimodal" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "phi-4-multimodal", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "inputAudio": 4, + "output": 0.32 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4-multimodal" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-4-multimodal", + "modelKey": "phi-4-multimodal", + "displayName": "Phi-4-multimodal", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "azure/phi-4-reasoning", + "provider": "azure", + "model": "phi-4-reasoning", + "displayName": "Phi-4-reasoning", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/phi-4-reasoning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "phi-4-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.125, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4-reasoning" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-4-reasoning", + "modelKey": "phi-4-reasoning", + "displayName": "Phi-4-reasoning", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "azure/phi-4-reasoning-plus", + "provider": "azure", + "model": "phi-4-reasoning-plus", + "displayName": "Phi-4-reasoning-plus", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/phi-4-reasoning-plus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "phi-4-reasoning-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.125, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4-reasoning-plus" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "phi-4-reasoning-plus", + "modelKey": "phi-4-reasoning-plus", + "displayName": "Phi-4-reasoning-plus", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "azure/sora-2", + "provider": "azure", + "model": "sora-2", + "mode": "video_generation", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/sora-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/sora-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perVideoSecond": { + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "video_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/sora-2", + "mode": "video_generation", + "metadata": { + "source": "https://azure.microsoft.com/en-us/products/ai-services/video-generation" + } + } + ] + }, + { + "id": "azure/sora-2-pro", + "provider": "azure", + "model": "sora-2-pro", + "mode": "video_generation", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/sora-2-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/sora-2-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perVideoSecond": { + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "video_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/sora-2-pro", + "mode": "video_generation", + "metadata": { + "source": "https://azure.microsoft.com/en-us/products/ai-services/video-generation" + } + } + ] + }, + { + "id": "azure/sora-2-pro-high-res", + "provider": "azure", + "model": "sora-2-pro-high-res", + "mode": "video_generation", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/sora-2-pro-high-res" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/sora-2-pro-high-res", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perVideoSecond": { + "output": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "video_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/sora-2-pro-high-res", + "mode": "video_generation", + "metadata": { + "source": "https://azure.microsoft.com/en-us/products/ai-services/video-generation" + } + } + ] + }, + { + "id": "bailing/ling-1t", + "provider": "bailing", + "model": "ling-1t", + "displayName": "Ling-1T", + "family": "ling", + "sources": [ + "models.dev" + ], + "providers": [ + "bailing" + ], + "aliases": [ + "bailing/Ling-1T" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "bailing", + "model": "Ling-1T", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.57, + "output": 2.29 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ling-1T" + ], + "families": [ + "ling" + ], + "knowledgeCutoff": "2024-06", + "releaseDate": "2025-10", + "lastUpdated": "2025-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "bailing", + "providerName": "Bailing", + "providerApi": "https://api.tbox.cn/api/llm/v1/chat/completions", + "providerDoc": "https://alipaytbox.yuque.com/sxs0ba/ling/intro", + "model": "Ling-1T", + "modelKey": "Ling-1T", + "displayName": "Ling-1T", + "family": "ling", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2025-10", + "openWeights": true, + "releaseDate": "2025-10" + } + } + ] + }, + { + "id": "bailing/ring-1t", + "provider": "bailing", + "model": "ring-1t", + "displayName": "Ring-1T", + "family": "ring", + "sources": [ + "models.dev" + ], + "providers": [ + "bailing" + ], + "aliases": [ + "bailing/Ring-1T" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "bailing", + "model": "Ring-1T", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.57, + "output": 2.29 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ring-1T" + ], + "families": [ + "ring" + ], + "knowledgeCutoff": "2024-06", + "releaseDate": "2025-10", + "lastUpdated": "2025-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "bailing", + "providerName": "Bailing", + "providerApi": "https://api.tbox.cn/api/llm/v1/chat/completions", + "providerDoc": "https://alipaytbox.yuque.com/sxs0ba/ling/intro", + "model": "Ring-1T", + "modelKey": "Ring-1T", + "displayName": "Ring-1T", + "family": "ring", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2025-10", + "openWeights": true, + "releaseDate": "2025-10" + } + } + ] + }, + { + "id": "baseten/nemotron-120b-a12b", + "provider": "baseten", + "model": "nemotron-120b-a12b", + "displayName": "Nemotron Super", + "family": "nemotron", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "baseten" + ], + "aliases": [ + "baseten/nvidia/Nemotron-120B-A12B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 202800, + "outputTokens": 202800, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "baseten", + "model": "nvidia/Nemotron-120B-A12B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 0.75 + } + }, + { + "source": "litellm", + "provider": "baseten", + "model": "baseten/nvidia/Nemotron-120B-A12B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron Super" + ], + "families": [ + "nemotron" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2026-02", + "releaseDate": "2026-03-11", + "lastUpdated": "2026-03-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "baseten", + "providerName": "Baseten", + "providerApi": "https://inference.baseten.co/v1", + "providerDoc": "https://docs.baseten.co/inference/model-apis/overview", + "model": "nvidia/Nemotron-120B-A12B", + "modelKey": "nvidia/Nemotron-120B-A12B", + "displayName": "Nemotron Super", + "family": "nemotron", + "metadata": { + "knowledgeCutoff": "2026-02", + "lastUpdated": "2026-03-11", + "openWeights": true, + "releaseDate": "2026-03-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "baseten", + "model": "baseten/nvidia/Nemotron-120B-A12B", + "mode": "chat" + } + ] + }, + { + "id": "baseten/nvidia-nemotron-3-ultra-550b-a55b", + "provider": "baseten", + "model": "nvidia-nemotron-3-ultra-550b-a55b", + "displayName": "Nemotron Ultra", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "baseten" + ], + "aliases": [ + "baseten/nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 202800, + "outputTokens": 202800, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "baseten", + "model": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12, + "input": 0.6, + "output": 2.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron Ultra" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-06-04", + "lastUpdated": "2026-06-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "baseten", + "providerName": "Baseten", + "providerApi": "https://inference.baseten.co/v1", + "providerDoc": "https://docs.baseten.co/inference/model-apis/overview", + "model": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B", + "modelKey": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B", + "displayName": "Nemotron Ultra", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-06-04", + "openWeights": true, + "releaseDate": "2026-06-04", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "bedrock-converse/amazon.nova-2-lite-v1:0", + "provider": "bedrock-converse", + "model": "amazon.nova-2-lite-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/amazon.nova-2-lite-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": true, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "amazon.nova-2-lite-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3, + "output": 2.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "amazon.nova-2-lite-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/amazon.nova-2-pro-preview-20251202-v1:0", + "provider": "bedrock-converse", + "model": "amazon.nova-2-pro-preview-20251202-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/amazon.nova-2-pro-preview-20251202-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": true, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "amazon.nova-2-pro-preview-20251202-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.546875, + "input": 2.1875, + "inputAudio": 2.1875, + "inputImage": 2.1875, + "output": 17.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "amazon.nova-2-pro-preview-20251202-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/amazon.nova-lite-v1:0", + "provider": "bedrock-converse", + "model": "amazon.nova-lite-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/amazon.nova-lite-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 300000, + "inputTokens": 300000, + "maxTokens": 10000, + "outputTokens": 10000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "amazon.nova-lite-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.24 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "amazon.nova-lite-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/amazon.nova-micro-v1:0", + "provider": "bedrock-converse", + "model": "amazon.nova-micro-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/amazon.nova-micro-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 10000, + "outputTokens": 10000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "amazon.nova-micro-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.035, + "output": 0.14 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "amazon.nova-micro-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/amazon.nova-pro-v1:0", + "provider": "bedrock-converse", + "model": "amazon.nova-pro-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/amazon.nova-pro-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 300000, + "inputTokens": 300000, + "maxTokens": 10000, + "outputTokens": 10000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "amazon.nova-pro-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 3.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "amazon.nova-pro-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/anthropic.claude-3-7-sonnet-20250219-v1:0", + "provider": "bedrock-converse", + "model": "anthropic.claude-3-7-sonnet-20250219-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/anthropic.claude-3-7-sonnet-20250219-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "anthropic.claude-3-7-sonnet-20250219-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "anthropic.claude-3-7-sonnet-20250219-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/anthropic.claude-fable-5", + "provider": "bedrock-converse", + "model": "anthropic.claude-fable-5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/anthropic.claude-fable-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "adaptiveThinking": true, + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "anthropic.claude-fable-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00002 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "anthropic.claude-fable-5", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/anthropic.claude-haiku-4-5-20251001-v1:0", + "provider": "bedrock-converse", + "model": "anthropic.claude-haiku-4-5-20251001-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/anthropic.claude-haiku-4-5-20251001-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "anthropic.claude-haiku-4-5-20251001-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000002 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "anthropic.claude-haiku-4-5-20251001-v1:0", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/about-aws/whats-new/2025/10/claude-4-5-haiku-anthropic-amazon-bedrock" + } + } + ] + }, + { + "id": "bedrock-converse/anthropic.claude-haiku-4-5@20251001", + "provider": "bedrock-converse", + "model": "anthropic.claude-haiku-4-5@20251001", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/anthropic.claude-haiku-4-5@20251001" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "anthropic.claude-haiku-4-5@20251001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000002 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "anthropic.claude-haiku-4-5@20251001", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/about-aws/whats-new/2025/10/claude-4-5-haiku-anthropic-amazon-bedrock" + } + } + ] + }, + { + "id": "bedrock-converse/anthropic.claude-opus-4-1-20250805-v1:0", + "provider": "bedrock-converse", + "model": "anthropic.claude-opus-4-1-20250805-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/anthropic.claude-opus-4-1-20250805-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "anthropic.claude-opus-4-1-20250805-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "anthropic.claude-opus-4-1-20250805-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/anthropic.claude-opus-4-20250514-v1:0", + "provider": "bedrock-converse", + "model": "anthropic.claude-opus-4-20250514-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/anthropic.claude-opus-4-20250514-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "anthropic.claude-opus-4-20250514-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "anthropic.claude-opus-4-20250514-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/anthropic.claude-opus-4-5-20251101-v1:0", + "provider": "bedrock-converse", + "model": "anthropic.claude-opus-4-5-20251101-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/anthropic.claude-opus-4-5-20251101-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "anthropic.claude-opus-4-5-20251101-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "anthropic.claude-opus-4-5-20251101-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/anthropic.claude-opus-4-6-v1", + "provider": "bedrock-converse", + "model": "anthropic.claude-opus-4-6-v1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/anthropic.claude-opus-4-6-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "anthropic.claude-opus-4-6-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "anthropic.claude-opus-4-6-v1", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/anthropic.claude-opus-4-7", + "provider": "bedrock-converse", + "model": "anthropic.claude-opus-4-7", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/anthropic.claude-opus-4-7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "anthropic.claude-opus-4-7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "anthropic.claude-opus-4-7", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/anthropic.claude-opus-4-8", + "provider": "bedrock-converse", + "model": "anthropic.claude-opus-4-8", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/anthropic.claude-opus-4-8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "adaptiveThinking": true, + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "anthropic.claude-opus-4-8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "anthropic.claude-opus-4-8", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/anthropic.claude-sonnet-4-20250514-v1:0", + "provider": "bedrock-converse", + "model": "anthropic.claude-sonnet-4-20250514-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/anthropic.claude-sonnet-4-20250514-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "anthropic.claude-sonnet-4-20250514-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "anthropic.claude-sonnet-4-20250514-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/anthropic.claude-sonnet-4-5-20250929-v1:0", + "provider": "bedrock-converse", + "model": "anthropic.claude-sonnet-4-5-20250929-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/anthropic.claude-sonnet-4-5-20250929-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "anthropic.claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000006, + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_creation_input_token_cost_above_1hr_above_200k_tokens": 0.000012, + "cache_read_input_token_cost_above_200k_tokens": 6e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "anthropic.claude-sonnet-4-5-20250929-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/anthropic.claude-sonnet-4-6", + "provider": "bedrock-converse", + "model": "anthropic.claude-sonnet-4-6", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/anthropic.claude-sonnet-4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "anthropic.claude-sonnet-4-6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000006 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "anthropic.claude-sonnet-4-6", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/apac.amazon.nova-2-lite-v1:0", + "provider": "bedrock-converse", + "model": "apac.amazon.nova-2-lite-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/apac.amazon.nova-2-lite-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": true, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "apac.amazon.nova-2-lite-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.0825, + "input": 0.33, + "output": 2.75 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "apac.amazon.nova-2-lite-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/apac.amazon.nova-2-pro-preview-20251202-v1:0", + "provider": "bedrock-converse", + "model": "apac.amazon.nova-2-pro-preview-20251202-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/apac.amazon.nova-2-pro-preview-20251202-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": true, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "apac.amazon.nova-2-pro-preview-20251202-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.546875, + "input": 2.1875, + "inputAudio": 2.1875, + "inputImage": 2.1875, + "output": 17.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "apac.amazon.nova-2-pro-preview-20251202-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/apac.amazon.nova-lite-v1:0", + "provider": "bedrock-converse", + "model": "apac.amazon.nova-lite-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/apac.amazon.nova-lite-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 300000, + "inputTokens": 300000, + "maxTokens": 10000, + "outputTokens": 10000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "apac.amazon.nova-lite-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.063, + "output": 0.252 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "apac.amazon.nova-lite-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/apac.amazon.nova-micro-v1:0", + "provider": "bedrock-converse", + "model": "apac.amazon.nova-micro-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/apac.amazon.nova-micro-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 10000, + "outputTokens": 10000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "apac.amazon.nova-micro-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.037, + "output": 0.148 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "apac.amazon.nova-micro-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/apac.amazon.nova-pro-v1:0", + "provider": "bedrock-converse", + "model": "apac.amazon.nova-pro-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/apac.amazon.nova-pro-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 300000, + "inputTokens": 300000, + "maxTokens": 10000, + "outputTokens": 10000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "apac.amazon.nova-pro-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.84, + "output": 3.36 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "apac.amazon.nova-pro-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/apac.anthropic.claude-haiku-4-5-20251001-v1:0", + "provider": "bedrock-converse", + "model": "apac.anthropic.claude-haiku-4-5-20251001-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/apac.anthropic.claude-haiku-4-5-20251001-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "apac.anthropic.claude-haiku-4-5-20251001-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 1.375, + "input": 1.1, + "output": 5.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "apac.anthropic.claude-haiku-4-5-20251001-v1:0", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/about-aws/whats-new/2025/10/claude-4-5-haiku-anthropic-amazon-bedrock" + } + } + ] + }, + { + "id": "bedrock-converse/apac.anthropic.claude-sonnet-4-20250514-v1:0", + "provider": "bedrock-converse", + "model": "apac.anthropic.claude-sonnet-4-20250514-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/apac.anthropic.claude-sonnet-4-20250514-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "apac.anthropic.claude-sonnet-4-20250514-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "apac.anthropic.claude-sonnet-4-20250514-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/au.anthropic.claude-haiku-4-5-20251001-v1:0", + "provider": "bedrock-converse", + "model": "au.anthropic.claude-haiku-4-5-20251001-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/au.anthropic.claude-haiku-4-5-20251001-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "au.anthropic.claude-haiku-4-5-20251001-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 1.375, + "input": 1.1, + "output": 5.5 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000022 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "au.anthropic.claude-haiku-4-5-20251001-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/au.anthropic.claude-opus-4-6-v1", + "provider": "bedrock-converse", + "model": "au.anthropic.claude-opus-4-6-v1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/au.anthropic.claude-opus-4-6-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "au.anthropic.claude-opus-4-6-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "cacheWrite": 6.875, + "input": 5.5, + "output": 27.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000011 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "au.anthropic.claude-opus-4-6-v1", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/au.anthropic.claude-opus-4-7", + "provider": "bedrock-converse", + "model": "au.anthropic.claude-opus-4-7", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/au.anthropic.claude-opus-4-7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "au.anthropic.claude-opus-4-7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "cacheWrite": 6.875, + "input": 5.5, + "output": 27.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000011 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "au.anthropic.claude-opus-4-7", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/au.anthropic.claude-opus-4-8", + "provider": "bedrock-converse", + "model": "au.anthropic.claude-opus-4-8", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/au.anthropic.claude-opus-4-8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "adaptiveThinking": true, + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "au.anthropic.claude-opus-4-8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "cacheWrite": 6.875, + "input": 5.5, + "output": 27.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000011 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "au.anthropic.claude-opus-4-8", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/au.anthropic.claude-sonnet-4-5-20250929-v1:0", + "provider": "bedrock-converse", + "model": "au.anthropic.claude-sonnet-4-5-20250929-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/au.anthropic.claude-sonnet-4-5-20250929-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "au.anthropic.claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.33, + "cacheWrite": 4.125, + "input": 3.3, + "output": 16.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000066, + "input_cost_per_token_above_200k_tokens": 0.0000066, + "output_cost_per_token_above_200k_tokens": 0.00002475, + "cache_creation_input_token_cost_above_200k_tokens": 0.00000825, + "cache_creation_input_token_cost_above_1hr_above_200k_tokens": 0.0000132, + "cache_read_input_token_cost_above_200k_tokens": 6.6e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "au.anthropic.claude-sonnet-4-5-20250929-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/au.anthropic.claude-sonnet-4-6", + "provider": "bedrock-converse", + "model": "au.anthropic.claude-sonnet-4-6", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/au.anthropic.claude-sonnet-4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "au.anthropic.claude-sonnet-4-6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.33, + "cacheWrite": 4.125, + "input": 3.3, + "output": 16.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000066 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "au.anthropic.claude-sonnet-4-6", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/deepseek.v3-v1:0", + "provider": "bedrock-converse", + "model": "deepseek.v3-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/deepseek.v3-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 81920, + "outputTokens": 81920, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "deepseek.v3-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.58, + "output": 1.68 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "deepseek.v3-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/deepseek.v3.2", + "provider": "bedrock-converse", + "model": "deepseek.v3.2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/deepseek.v3.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "deepseek.v3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.62, + "output": 1.85 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "deepseek.v3.2", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "bedrock-converse/eu.amazon.nova-2-lite-v1:0", + "provider": "bedrock-converse", + "model": "eu.amazon.nova-2-lite-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.amazon.nova-2-lite-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": true, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.amazon.nova-2-lite-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.0825, + "input": 0.33, + "output": 2.75 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.amazon.nova-2-lite-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/eu.amazon.nova-2-pro-preview-20251202-v1:0", + "provider": "bedrock-converse", + "model": "eu.amazon.nova-2-pro-preview-20251202-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.amazon.nova-2-pro-preview-20251202-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": true, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.amazon.nova-2-pro-preview-20251202-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.546875, + "input": 2.1875, + "inputAudio": 2.1875, + "inputImage": 2.1875, + "output": 17.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.amazon.nova-2-pro-preview-20251202-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/eu.amazon.nova-lite-v1:0", + "provider": "bedrock-converse", + "model": "eu.amazon.nova-lite-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.amazon.nova-lite-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 300000, + "inputTokens": 300000, + "maxTokens": 10000, + "outputTokens": 10000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.amazon.nova-lite-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.078, + "output": 0.312 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.amazon.nova-lite-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/eu.amazon.nova-micro-v1:0", + "provider": "bedrock-converse", + "model": "eu.amazon.nova-micro-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.amazon.nova-micro-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 10000, + "outputTokens": 10000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.amazon.nova-micro-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.046, + "output": 0.184 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.amazon.nova-micro-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/eu.amazon.nova-pro-v1:0", + "provider": "bedrock-converse", + "model": "eu.amazon.nova-pro-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.amazon.nova-pro-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 300000, + "inputTokens": 300000, + "maxTokens": 10000, + "outputTokens": 10000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.amazon.nova-pro-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.05, + "output": 4.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.amazon.nova-pro-v1:0", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "bedrock-converse/eu.anthropic.claude-fable-5", + "provider": "bedrock-converse", + "model": "eu.anthropic.claude-fable-5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.anthropic.claude-fable-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "adaptiveThinking": true, + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-fable-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.1, + "cacheWrite": 13.75, + "input": 11, + "output": 55 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000022 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-fable-5", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/eu.anthropic.claude-haiku-4-5-20251001-v1:0", + "provider": "bedrock-converse", + "model": "eu.anthropic.claude-haiku-4-5-20251001-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.anthropic.claude-haiku-4-5-20251001-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-haiku-4-5-20251001-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 1.375, + "input": 1.1, + "output": 5.5 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000022 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2026-10-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-haiku-4-5-20251001-v1:0", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-10-15", + "source": "https://aws.amazon.com/about-aws/whats-new/2025/10/claude-4-5-haiku-anthropic-amazon-bedrock" + } + } + ] + }, + { + "id": "bedrock-converse/eu.anthropic.claude-opus-4-1-20250805-v1:0", + "provider": "bedrock-converse", + "model": "eu.anthropic.claude-opus-4-1-20250805-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.anthropic.claude-opus-4-1-20250805-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-opus-4-1-20250805-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-opus-4-1-20250805-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/eu.anthropic.claude-opus-4-20250514-v1:0", + "provider": "bedrock-converse", + "model": "eu.anthropic.claude-opus-4-20250514-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.anthropic.claude-opus-4-20250514-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-opus-4-20250514-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-opus-4-20250514-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/eu.anthropic.claude-opus-4-5-20251101-v1:0", + "provider": "bedrock-converse", + "model": "eu.anthropic.claude-opus-4-5-20251101-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.anthropic.claude-opus-4-5-20251101-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-opus-4-5-20251101-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-opus-4-5-20251101-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/eu.anthropic.claude-opus-4-6-v1", + "provider": "bedrock-converse", + "model": "eu.anthropic.claude-opus-4-6-v1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.anthropic.claude-opus-4-6-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-opus-4-6-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "cacheWrite": 6.875, + "input": 5.5, + "output": 27.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000011 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-opus-4-6-v1", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/eu.anthropic.claude-opus-4-7", + "provider": "bedrock-converse", + "model": "eu.anthropic.claude-opus-4-7", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.anthropic.claude-opus-4-7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-opus-4-7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "cacheWrite": 6.875, + "input": 5.5, + "output": 27.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000011 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-opus-4-7", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/eu.anthropic.claude-opus-4-8", + "provider": "bedrock-converse", + "model": "eu.anthropic.claude-opus-4-8", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.anthropic.claude-opus-4-8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "adaptiveThinking": true, + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-opus-4-8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "cacheWrite": 6.875, + "input": 5.5, + "output": 27.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000011 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-opus-4-8", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/eu.anthropic.claude-sonnet-4-20250514-v1:0", + "provider": "bedrock-converse", + "model": "eu.anthropic.claude-sonnet-4-20250514-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.anthropic.claude-sonnet-4-20250514-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-sonnet-4-20250514-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-sonnet-4-20250514-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/eu.anthropic.claude-sonnet-4-5-20250929-v1:0", + "provider": "bedrock-converse", + "model": "eu.anthropic.claude-sonnet-4-5-20250929-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.anthropic.claude-sonnet-4-5-20250929-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.33, + "cacheWrite": 4.125, + "input": 3.3, + "output": 16.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000066, + "input_cost_per_token_above_200k_tokens": 0.0000066, + "output_cost_per_token_above_200k_tokens": 0.00002475, + "cache_creation_input_token_cost_above_200k_tokens": 0.00000825, + "cache_creation_input_token_cost_above_1hr_above_200k_tokens": 0.0000132, + "cache_read_input_token_cost_above_200k_tokens": 6.6e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-sonnet-4-5-20250929-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/eu.anthropic.claude-sonnet-4-6", + "provider": "bedrock-converse", + "model": "eu.anthropic.claude-sonnet-4-6", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.anthropic.claude-sonnet-4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-sonnet-4-6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.33, + "cacheWrite": 4.125, + "input": 3.3, + "output": 16.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000066 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.anthropic.claude-sonnet-4-6", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/eu.deepseek.v3.2", + "provider": "bedrock-converse", + "model": "eu.deepseek.v3.2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.deepseek.v3.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.deepseek.v3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.74, + "output": 2.22 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.deepseek.v3.2", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/eu.mistral.pixtral-large-2502-v1:0", + "provider": "bedrock-converse", + "model": "eu.mistral.pixtral-large-2502-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/eu.mistral.pixtral-large-2502-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "eu.mistral.pixtral-large-2502-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "eu.mistral.pixtral-large-2502-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/global.amazon.nova-2-lite-v1:0", + "provider": "bedrock-converse", + "model": "global.amazon.nova-2-lite-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/global.amazon.nova-2-lite-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": true, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "global.amazon.nova-2-lite-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3, + "output": 2.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "global.amazon.nova-2-lite-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/global.anthropic.claude-fable-5", + "provider": "bedrock-converse", + "model": "global.anthropic.claude-fable-5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/global.anthropic.claude-fable-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "adaptiveThinking": true, + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-fable-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 12.5, + "input": 10, + "output": 50 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00002 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-fable-5", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/global.anthropic.claude-haiku-4-5-20251001-v1:0", + "provider": "bedrock-converse", + "model": "global.anthropic.claude-haiku-4-5-20251001-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/global.anthropic.claude-haiku-4-5-20251001-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-haiku-4-5-20251001-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000002 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-haiku-4-5-20251001-v1:0", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/about-aws/whats-new/2025/10/claude-4-5-haiku-anthropic-amazon-bedrock" + } + } + ] + }, + { + "id": "bedrock-converse/global.anthropic.claude-opus-4-5-20251101-v1:0", + "provider": "bedrock-converse", + "model": "global.anthropic.claude-opus-4-5-20251101-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/global.anthropic.claude-opus-4-5-20251101-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-opus-4-5-20251101-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-opus-4-5-20251101-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/global.anthropic.claude-opus-4-6-v1", + "provider": "bedrock-converse", + "model": "global.anthropic.claude-opus-4-6-v1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/global.anthropic.claude-opus-4-6-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-opus-4-6-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-opus-4-6-v1", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/global.anthropic.claude-opus-4-7", + "provider": "bedrock-converse", + "model": "global.anthropic.claude-opus-4-7", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/global.anthropic.claude-opus-4-7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-opus-4-7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-opus-4-7", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/global.anthropic.claude-opus-4-8", + "provider": "bedrock-converse", + "model": "global.anthropic.claude-opus-4-8", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/global.anthropic.claude-opus-4-8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "adaptiveThinking": true, + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-opus-4-8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.00001 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-opus-4-8", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/global.anthropic.claude-sonnet-4-20250514-v1:0", + "provider": "bedrock-converse", + "model": "global.anthropic.claude-sonnet-4-20250514-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/global.anthropic.claude-sonnet-4-20250514-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-sonnet-4-20250514-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-sonnet-4-20250514-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/global.anthropic.claude-sonnet-4-5-20250929-v1:0", + "provider": "bedrock-converse", + "model": "global.anthropic.claude-sonnet-4-5-20250929-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/global.anthropic.claude-sonnet-4-5-20250929-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000006, + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_creation_input_token_cost_above_1hr_above_200k_tokens": 0.000012, + "cache_read_input_token_cost_above_200k_tokens": 6e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-sonnet-4-5-20250929-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/global.anthropic.claude-sonnet-4-6", + "provider": "bedrock-converse", + "model": "global.anthropic.claude-sonnet-4-6", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/global.anthropic.claude-sonnet-4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-sonnet-4-6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000006 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "global.anthropic.claude-sonnet-4-6", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/google.gemma-3-12b-it", + "provider": "bedrock-converse", + "model": "google.gemma-3-12b-it", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/google.gemma-3-12b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "google.gemma-3-12b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.09, + "output": 0.29 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "google.gemma-3-12b-it", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/google.gemma-3-27b-it", + "provider": "bedrock-converse", + "model": "google.gemma-3-27b-it", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/google.gemma-3-27b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "google.gemma-3-27b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.23, + "output": 0.38 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "google.gemma-3-27b-it", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/google.gemma-3-4b-it", + "provider": "bedrock-converse", + "model": "google.gemma-3-4b-it", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/google.gemma-3-4b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "google.gemma-3-4b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.08 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "google.gemma-3-4b-it", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/jp.anthropic.claude-haiku-4-5-20251001-v1:0", + "provider": "bedrock-converse", + "model": "jp.anthropic.claude-haiku-4-5-20251001-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/jp.anthropic.claude-haiku-4-5-20251001-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "jp.anthropic.claude-haiku-4-5-20251001-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 1.375, + "input": 1.1, + "output": 5.5 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000022 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "jp.anthropic.claude-haiku-4-5-20251001-v1:0", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/about-aws/whats-new/2025/10/claude-4-5-haiku-anthropic-amazon-bedrock" + } + } + ] + }, + { + "id": "bedrock-converse/jp.anthropic.claude-opus-4-7", + "provider": "bedrock-converse", + "model": "jp.anthropic.claude-opus-4-7", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/jp.anthropic.claude-opus-4-7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "jp.anthropic.claude-opus-4-7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "cacheWrite": 6.875, + "input": 5.5, + "output": 27.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "jp.anthropic.claude-opus-4-7", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/jp.anthropic.claude-sonnet-4-5-20250929-v1:0", + "provider": "bedrock-converse", + "model": "jp.anthropic.claude-sonnet-4-5-20250929-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/jp.anthropic.claude-sonnet-4-5-20250929-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "jp.anthropic.claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.33, + "cacheWrite": 4.125, + "input": 3.3, + "output": 16.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000066, + "input_cost_per_token_above_200k_tokens": 0.0000066, + "output_cost_per_token_above_200k_tokens": 0.00002475, + "cache_creation_input_token_cost_above_200k_tokens": 0.00000825, + "cache_creation_input_token_cost_above_1hr_above_200k_tokens": 0.0000132, + "cache_read_input_token_cost_above_200k_tokens": 6.6e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "jp.anthropic.claude-sonnet-4-5-20250929-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/jp.anthropic.claude-sonnet-4-6", + "provider": "bedrock-converse", + "model": "jp.anthropic.claude-sonnet-4-6", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/jp.anthropic.claude-sonnet-4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "jp.anthropic.claude-sonnet-4-6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.33, + "cacheWrite": 4.125, + "input": 3.3, + "output": 16.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000066 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "jp.anthropic.claude-sonnet-4-6", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/meta.llama3-3-70b-instruct-v1:0", + "provider": "bedrock-converse", + "model": "meta.llama3-3-70b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/meta.llama3-3-70b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "meta.llama3-3-70b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "meta.llama3-3-70b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/meta.llama4-maverick-17b-instruct-v1:0", + "provider": "bedrock-converse", + "model": "meta.llama4-maverick-17b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/meta.llama4-maverick-17b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "meta.llama4-maverick-17b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.24, + "output": 0.97 + }, + "extra": { + "input_cost_per_token_batches": 1.2e-7, + "output_cost_per_token_batches": 4.85e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "meta.llama4-maverick-17b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/meta.llama4-scout-17b-instruct-v1:0", + "provider": "bedrock-converse", + "model": "meta.llama4-scout-17b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/meta.llama4-scout-17b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "meta.llama4-scout-17b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.17, + "output": 0.66 + }, + "extra": { + "input_cost_per_token_batches": 8.5e-8, + "output_cost_per_token_batches": 3.3e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "meta.llama4-scout-17b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/moonshot.kimi-k2-thinking", + "provider": "bedrock-converse", + "model": "moonshot.kimi-k2-thinking", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/moonshot.kimi-k2-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "moonshot.kimi-k2-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "moonshot.kimi-k2-thinking", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/moonshotai.kimi-k2.5", + "provider": "bedrock-converse", + "model": "moonshotai.kimi-k2.5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/moonshotai.kimi-k2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "moonshotai.kimi-k2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "moonshotai.kimi-k2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "bedrock-converse/nvidia.nemotron-nano-12b-v2", + "provider": "bedrock-converse", + "model": "nvidia.nemotron-nano-12b-v2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/nvidia.nemotron-nano-12b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "nvidia.nemotron-nano-12b-v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "nvidia.nemotron-nano-12b-v2", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/nvidia.nemotron-nano-3-30b", + "provider": "bedrock-converse", + "model": "nvidia.nemotron-nano-3-30b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/nvidia.nemotron-nano-3-30b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "nvidia.nemotron-nano-3-30b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.24 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "nvidia.nemotron-nano-3-30b", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "bedrock-converse/nvidia.nemotron-nano-9b-v2", + "provider": "bedrock-converse", + "model": "nvidia.nemotron-nano-9b-v2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/nvidia.nemotron-nano-9b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "nvidia.nemotron-nano-9b-v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.23 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "nvidia.nemotron-nano-9b-v2", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/nvidia.nemotron-super-3-120b", + "provider": "bedrock-converse", + "model": "nvidia.nemotron-super-3-120b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/nvidia.nemotron-super-3-120b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "nvidia.nemotron-super-3-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.65 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "nvidia.nemotron-super-3-120b", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "bedrock-converse/openai.gpt-oss-120b-1:0", + "provider": "bedrock-converse", + "model": "openai.gpt-oss-120b-1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/openai.gpt-oss-120b-1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "openai.gpt-oss-120b-1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "openai.gpt-oss-120b-1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/openai.gpt-oss-20b-1:0", + "provider": "bedrock-converse", + "model": "openai.gpt-oss-20b-1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/openai.gpt-oss-20b-1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "openai.gpt-oss-20b-1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "openai.gpt-oss-20b-1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/openai.gpt-oss-safeguard-120b", + "provider": "bedrock-converse", + "model": "openai.gpt-oss-safeguard-120b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/openai.gpt-oss-safeguard-120b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "openai.gpt-oss-safeguard-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "openai.gpt-oss-safeguard-120b", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/openai.gpt-oss-safeguard-20b", + "provider": "bedrock-converse", + "model": "openai.gpt-oss-safeguard-20b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/openai.gpt-oss-safeguard-20b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "openai.gpt-oss-safeguard-20b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "openai.gpt-oss-safeguard-20b", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us-gov.anthropic.claude-sonnet-4-5-20250929-v1:0", + "provider": "bedrock-converse", + "model": "us-gov.anthropic.claude-sonnet-4-5-20250929-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us-gov.anthropic.claude-sonnet-4-5-20250929-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us-gov.anthropic.claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.36, + "cacheWrite": 4.5, + "input": 3.6, + "output": 18 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000072, + "input_cost_per_token_above_200k_tokens": 0.0000072, + "output_cost_per_token_above_200k_tokens": 0.000027, + "cache_creation_input_token_cost_above_200k_tokens": 0.000009, + "cache_creation_input_token_cost_above_1hr_above_200k_tokens": 0.0000144, + "cache_read_input_token_cost_above_200k_tokens": 7.2e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us-gov.anthropic.claude-sonnet-4-5-20250929-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.amazon.nova-2-lite-v1:0", + "provider": "bedrock-converse", + "model": "us.amazon.nova-2-lite-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.amazon.nova-2-lite-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": true, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.amazon.nova-2-lite-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.0825, + "input": 0.33, + "output": 2.75 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.amazon.nova-2-lite-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.amazon.nova-2-pro-preview-20251202-v1:0", + "provider": "bedrock-converse", + "model": "us.amazon.nova-2-pro-preview-20251202-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.amazon.nova-2-pro-preview-20251202-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": true, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.amazon.nova-2-pro-preview-20251202-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.546875, + "input": 2.1875, + "inputAudio": 2.1875, + "inputImage": 2.1875, + "output": 17.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.amazon.nova-2-pro-preview-20251202-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.amazon.nova-lite-v1:0", + "provider": "bedrock-converse", + "model": "us.amazon.nova-lite-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.amazon.nova-lite-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 300000, + "inputTokens": 300000, + "maxTokens": 10000, + "outputTokens": 10000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.amazon.nova-lite-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.24 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.amazon.nova-lite-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.amazon.nova-micro-v1:0", + "provider": "bedrock-converse", + "model": "us.amazon.nova-micro-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.amazon.nova-micro-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 10000, + "outputTokens": 10000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.amazon.nova-micro-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.035, + "output": 0.14 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.amazon.nova-micro-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.amazon.nova-premier-v1:0", + "provider": "bedrock-converse", + "model": "us.amazon.nova-premier-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.amazon.nova-premier-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 10000, + "outputTokens": 10000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.amazon.nova-premier-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 12.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.amazon.nova-premier-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.amazon.nova-pro-v1:0", + "provider": "bedrock-converse", + "model": "us.amazon.nova-pro-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.amazon.nova-pro-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 300000, + "inputTokens": 300000, + "maxTokens": 10000, + "outputTokens": 10000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.amazon.nova-pro-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 3.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.amazon.nova-pro-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.anthropic.claude-3-7-sonnet-20250219-v1:0", + "provider": "bedrock-converse", + "model": "us.anthropic.claude-3-7-sonnet-20250219-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.anthropic.claude-3-7-sonnet-20250219-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-3-7-sonnet-20250219-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-3-7-sonnet-20250219-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.anthropic.claude-fable-5", + "provider": "bedrock-converse", + "model": "us.anthropic.claude-fable-5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.anthropic.claude-fable-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "adaptiveThinking": true, + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-fable-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.1, + "cacheWrite": 13.75, + "input": 11, + "output": 55 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000022 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-fable-5", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.anthropic.claude-haiku-4-5-20251001-v1:0", + "provider": "bedrock-converse", + "model": "us.anthropic.claude-haiku-4-5-20251001-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.anthropic.claude-haiku-4-5-20251001-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-haiku-4-5-20251001-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 1.375, + "input": 1.1, + "output": 5.5 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000022 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-haiku-4-5-20251001-v1:0", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/about-aws/whats-new/2025/10/claude-4-5-haiku-anthropic-amazon-bedrock" + } + } + ] + }, + { + "id": "bedrock-converse/us.anthropic.claude-opus-4-1-20250805-v1:0", + "provider": "bedrock-converse", + "model": "us.anthropic.claude-opus-4-1-20250805-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.anthropic.claude-opus-4-1-20250805-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-opus-4-1-20250805-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-opus-4-1-20250805-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.anthropic.claude-opus-4-20250514-v1:0", + "provider": "bedrock-converse", + "model": "us.anthropic.claude-opus-4-20250514-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.anthropic.claude-opus-4-20250514-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-opus-4-20250514-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-opus-4-20250514-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.anthropic.claude-opus-4-5-20251101-v1:0", + "provider": "bedrock-converse", + "model": "us.anthropic.claude-opus-4-5-20251101-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.anthropic.claude-opus-4-5-20251101-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-opus-4-5-20251101-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "cacheWrite": 6.875, + "input": 5.5, + "output": 27.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000011 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-opus-4-5-20251101-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.anthropic.claude-opus-4-6-v1", + "provider": "bedrock-converse", + "model": "us.anthropic.claude-opus-4-6-v1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.anthropic.claude-opus-4-6-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-opus-4-6-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "cacheWrite": 6.875, + "input": 5.5, + "output": 27.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000011 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-opus-4-6-v1", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.anthropic.claude-opus-4-7", + "provider": "bedrock-converse", + "model": "us.anthropic.claude-opus-4-7", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.anthropic.claude-opus-4-7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-opus-4-7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "cacheWrite": 6.875, + "input": 5.5, + "output": 27.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000011 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-opus-4-7", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.anthropic.claude-opus-4-8", + "provider": "bedrock-converse", + "model": "us.anthropic.claude-opus-4-8", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.anthropic.claude-opus-4-8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "adaptiveThinking": true, + "assistantPrefill": false, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "samplingParams": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-opus-4-8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "cacheWrite": 6.875, + "input": 5.5, + "output": 27.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.000011 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-opus-4-8", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.anthropic.claude-sonnet-4-20250514-v1:0", + "provider": "bedrock-converse", + "model": "us.anthropic.claude-sonnet-4-20250514-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.anthropic.claude-sonnet-4-20250514-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-sonnet-4-20250514-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "input_cost_per_token_above_200k_tokens": 0.000006, + "output_cost_per_token_above_200k_tokens": 0.0000225, + "cache_creation_input_token_cost_above_200k_tokens": 0.0000075, + "cache_read_input_token_cost_above_200k_tokens": 6e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-sonnet-4-20250514-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.anthropic.claude-sonnet-4-5-20250929-v1:0", + "provider": "bedrock-converse", + "model": "us.anthropic.claude-sonnet-4-5-20250929-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.anthropic.claude-sonnet-4-5-20250929-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-sonnet-4-5-20250929-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.33, + "cacheWrite": 4.125, + "input": 3.3, + "output": 16.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000066, + "input_cost_per_token_above_200k_tokens": 0.0000066, + "output_cost_per_token_above_200k_tokens": 0.00002475, + "cache_creation_input_token_cost_above_200k_tokens": 0.00000825, + "cache_creation_input_token_cost_above_1hr_above_200k_tokens": 0.0000132, + "cache_read_input_token_cost_above_200k_tokens": 6.6e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-sonnet-4-5-20250929-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.anthropic.claude-sonnet-4-6", + "provider": "bedrock-converse", + "model": "us.anthropic.claude-sonnet-4-6", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.anthropic.claude-sonnet-4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "maxReasoningEffort": true, + "moderation": false, + "nativeStructuredOutput": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-sonnet-4-6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.33, + "cacheWrite": 4.125, + "input": 3.3, + "output": 16.5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0.0000066 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.anthropic.claude-sonnet-4-6", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.deepseek.r1-v1:0", + "provider": "bedrock-converse", + "model": "us.deepseek.r1-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.deepseek.r1-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.deepseek.r1-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.35, + "output": 5.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.deepseek.r1-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.deepseek.v3.2", + "provider": "bedrock-converse", + "model": "us.deepseek.v3.2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.deepseek.v3.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.deepseek.v3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.62, + "output": 1.85 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.deepseek.v3.2", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.meta.llama3-3-70b-instruct-v1:0", + "provider": "bedrock-converse", + "model": "us.meta.llama3-3-70b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.meta.llama3-3-70b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.meta.llama3-3-70b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.meta.llama3-3-70b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.meta.llama4-maverick-17b-instruct-v1:0", + "provider": "bedrock-converse", + "model": "us.meta.llama4-maverick-17b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.meta.llama4-maverick-17b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.meta.llama4-maverick-17b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.24, + "output": 0.97 + }, + "extra": { + "input_cost_per_token_batches": 1.2e-7, + "output_cost_per_token_batches": 4.85e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.meta.llama4-maverick-17b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.meta.llama4-scout-17b-instruct-v1:0", + "provider": "bedrock-converse", + "model": "us.meta.llama4-scout-17b-instruct-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.meta.llama4-scout-17b-instruct-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.meta.llama4-scout-17b-instruct-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.17, + "output": 0.66 + }, + "extra": { + "input_cost_per_token_batches": 8.5e-8, + "output_cost_per_token_batches": 3.3e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.meta.llama4-scout-17b-instruct-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.mistral.pixtral-large-2502-v1:0", + "provider": "bedrock-converse", + "model": "us.mistral.pixtral-large-2502-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.mistral.pixtral-large-2502-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.mistral.pixtral-large-2502-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.mistral.pixtral-large-2502-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.writer.palmyra-x4-v1:0", + "provider": "bedrock-converse", + "model": "us.writer.palmyra-x4-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.writer.palmyra-x4-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.writer.palmyra-x4-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.writer.palmyra-x4-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/us.writer.palmyra-x5-v1:0", + "provider": "bedrock-converse", + "model": "us.writer.palmyra-x5-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/us.writer.palmyra-x5-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "us.writer.palmyra-x5-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "us.writer.palmyra-x5-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/writer.palmyra-x4-v1:0", + "provider": "bedrock-converse", + "model": "writer.palmyra-x4-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/writer.palmyra-x4-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "writer.palmyra-x4-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "writer.palmyra-x4-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/writer.palmyra-x5-v1:0", + "provider": "bedrock-converse", + "model": "writer.palmyra-x5-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/writer.palmyra-x5-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "writer.palmyra-x5-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "writer.palmyra-x5-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-converse/zai.glm-4.7", + "provider": "bedrock-converse", + "model": "zai.glm-4.7", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/zai.glm-4.7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "zai.glm-4.7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "zai.glm-4.7", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "bedrock-converse/zai.glm-4.7-flash", + "provider": "bedrock-converse", + "model": "zai.glm-4.7-flash", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/zai.glm-4.7-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "zai.glm-4.7-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "zai.glm-4.7-flash", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "bedrock-converse/zai.glm-5", + "provider": "bedrock-converse", + "model": "zai.glm-5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_converse" + ], + "aliases": [ + "bedrock_converse/zai.glm-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "zai.glm-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "zai.glm-5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "bedrock-mantle/openai.gpt-5.4", + "provider": "bedrock-mantle", + "model": "openai.gpt-5.4", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_mantle" + ], + "aliases": [ + "bedrock_mantle/openai.gpt-5.4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 272000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_mantle", + "model": "bedrock_mantle/openai.gpt-5.4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.275, + "input": 2.75, + "output": 16.5 + } + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "supportedEndpoints": [ + "/v1/responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_mantle", + "model": "bedrock_mantle/openai.gpt-5.4", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + } + ] + }, + { + "id": "bedrock-mantle/openai.gpt-5.5", + "provider": "bedrock-mantle", + "model": "openai.gpt-5.5", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_mantle" + ], + "aliases": [ + "bedrock_mantle/openai.gpt-5.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 272000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_mantle", + "model": "bedrock_mantle/openai.gpt-5.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "input": 5.5, + "output": 33 + } + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "supportedEndpoints": [ + "/v1/responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_mantle", + "model": "bedrock_mantle/openai.gpt-5.5", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + } + ] + }, + { + "id": "bedrock-mantle/openai.gpt-oss-120b", + "provider": "bedrock-mantle", + "model": "openai.gpt-oss-120b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_mantle" + ], + "aliases": [ + "bedrock_mantle/openai.gpt-oss-120b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_mantle", + "model": "bedrock_mantle/openai.gpt-oss-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_mantle", + "model": "bedrock_mantle/openai.gpt-oss-120b", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-mantle/openai.gpt-oss-20b", + "provider": "bedrock-mantle", + "model": "openai.gpt-oss-20b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_mantle" + ], + "aliases": [ + "bedrock_mantle/openai.gpt-oss-20b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_mantle", + "model": "bedrock_mantle/openai.gpt-oss-20b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_mantle", + "model": "bedrock_mantle/openai.gpt-oss-20b", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-mantle/openai.gpt-oss-safeguard-120b", + "provider": "bedrock-mantle", + "model": "openai.gpt-oss-safeguard-120b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_mantle" + ], + "aliases": [ + "bedrock_mantle/openai.gpt-oss-safeguard-120b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_mantle", + "model": "bedrock_mantle/openai.gpt-oss-safeguard-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_mantle", + "model": "bedrock_mantle/openai.gpt-oss-safeguard-120b", + "mode": "chat" + } + ] + }, + { + "id": "bedrock-mantle/openai.gpt-oss-safeguard-20b", + "provider": "bedrock-mantle", + "model": "openai.gpt-oss-safeguard-20b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock_mantle" + ], + "aliases": [ + "bedrock_mantle/openai.gpt-oss-safeguard-20b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock_mantle", + "model": "bedrock_mantle/openai.gpt-oss-safeguard-20b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_mantle", + "model": "bedrock_mantle/openai.gpt-oss-safeguard-20b", + "mode": "chat" + } + ] + }, + { + "id": "black-forest-labs/flux-dev", + "provider": "black-forest-labs", + "model": "flux-dev", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "black_forest_labs" + ], + "aliases": [ + "black_forest_labs/flux-dev" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "black_forest_labs", + "model": "black_forest_labs/flux-dev", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.025 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "black_forest_labs", + "model": "black_forest_labs/flux-dev", + "mode": "image_generation", + "metadata": { + "source": "https://bfl.ai/pricing", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "black-forest-labs/flux-kontext-max", + "provider": "black-forest-labs", + "model": "flux-kontext-max", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "black_forest_labs" + ], + "aliases": [ + "black_forest_labs/flux-kontext-max" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "black_forest_labs", + "model": "black_forest_labs/flux-kontext-max", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.08 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits", + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "black_forest_labs", + "model": "black_forest_labs/flux-kontext-max", + "mode": "image_edit", + "metadata": { + "source": "https://bfl.ai/pricing", + "supportedEndpoints": [ + "/v1/images/edits", + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "black-forest-labs/flux-kontext-pro", + "provider": "black-forest-labs", + "model": "flux-kontext-pro", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "black_forest_labs" + ], + "aliases": [ + "black_forest_labs/flux-kontext-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "black_forest_labs", + "model": "black_forest_labs/flux-kontext-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits", + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "black_forest_labs", + "model": "black_forest_labs/flux-kontext-pro", + "mode": "image_edit", + "metadata": { + "source": "https://bfl.ai/pricing", + "supportedEndpoints": [ + "/v1/images/edits", + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "black-forest-labs/flux-pro", + "provider": "black-forest-labs", + "model": "flux-pro", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "black_forest_labs" + ], + "aliases": [ + "black_forest_labs/flux-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "black_forest_labs", + "model": "black_forest_labs/flux-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.05 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "black_forest_labs", + "model": "black_forest_labs/flux-pro", + "mode": "image_generation", + "metadata": { + "source": "https://bfl.ai/pricing", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "black-forest-labs/flux-pro-1.0-expand", + "provider": "black-forest-labs", + "model": "flux-pro-1.0-expand", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "black_forest_labs" + ], + "aliases": [ + "black_forest_labs/flux-pro-1.0-expand" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "black_forest_labs", + "model": "black_forest_labs/flux-pro-1.0-expand", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.05 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "black_forest_labs", + "model": "black_forest_labs/flux-pro-1.0-expand", + "mode": "image_edit", + "metadata": { + "source": "https://bfl.ai/pricing", + "supportedEndpoints": [ + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "black-forest-labs/flux-pro-1.0-fill", + "provider": "black-forest-labs", + "model": "flux-pro-1.0-fill", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "black_forest_labs" + ], + "aliases": [ + "black_forest_labs/flux-pro-1.0-fill" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "black_forest_labs", + "model": "black_forest_labs/flux-pro-1.0-fill", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.05 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "black_forest_labs", + "model": "black_forest_labs/flux-pro-1.0-fill", + "mode": "image_edit", + "metadata": { + "source": "https://bfl.ai/pricing", + "supportedEndpoints": [ + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "black-forest-labs/flux-pro-1.1", + "provider": "black-forest-labs", + "model": "flux-pro-1.1", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "black_forest_labs" + ], + "aliases": [ + "black_forest_labs/flux-pro-1.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "black_forest_labs", + "model": "black_forest_labs/flux-pro-1.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "black_forest_labs", + "model": "black_forest_labs/flux-pro-1.1", + "mode": "image_generation", + "metadata": { + "source": "https://bfl.ai/pricing", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "black-forest-labs/flux-pro-1.1-ultra", + "provider": "black-forest-labs", + "model": "flux-pro-1.1-ultra", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "black_forest_labs" + ], + "aliases": [ + "black_forest_labs/flux-pro-1.1-ultra" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "black_forest_labs", + "model": "black_forest_labs/flux-pro-1.1-ultra", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.06 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "black_forest_labs", + "model": "black_forest_labs/flux-pro-1.1-ultra", + "mode": "image_generation", + "metadata": { + "source": "https://bfl.ai/pricing", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "cerebras/llama3.1-70b", + "provider": "cerebras", + "model": "llama3.1-70b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "cerebras" + ], + "aliases": [ + "cerebras/llama3.1-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cerebras", + "model": "cerebras/llama3.1-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cerebras", + "model": "cerebras/llama3.1-70b", + "mode": "chat" + } + ] + }, + { + "id": "cerebras/llama3.1-8b", + "provider": "cerebras", + "model": "llama3.1-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "cerebras" + ], + "aliases": [ + "cerebras/llama3.1-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cerebras", + "model": "cerebras/llama3.1-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cerebras", + "model": "cerebras/llama3.1-8b", + "mode": "chat" + } + ] + }, + { + "id": "cerebras/zai-glm-4.6", + "provider": "cerebras", + "model": "zai-glm-4.6", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "cerebras" + ], + "aliases": [ + "cerebras/zai-glm-4.6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cerebras", + "model": "cerebras/zai-glm-4.6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.25, + "output": 2.75 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2026-01-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cerebras", + "model": "cerebras/zai-glm-4.6", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-01-20", + "source": "https://www.cerebras.ai/pricing" + } + } + ] + }, + { + "id": "cerebras/zai-glm-4.7", + "provider": "cerebras", + "model": "zai-glm-4.7", + "displayName": "Z.AI GLM-4.7", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "cerebras" + ], + "aliases": [ + "cerebras/zai-glm-4.7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cerebras", + "model": "zai-glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 2.25, + "output": 2.75 + } + }, + { + "source": "litellm", + "provider": "cerebras", + "model": "cerebras/zai-glm-4.7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.25, + "output": 2.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Z.AI GLM-4.7" + ], + "modes": [ + "chat" + ], + "statuses": [ + "beta" + ], + "releaseDate": "2026-01-07", + "lastUpdated": "2026-06-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cerebras", + "providerName": "Cerebras", + "providerDoc": "https://inference-docs.cerebras.ai/models/overview", + "model": "zai-glm-4.7", + "modelKey": "zai-glm-4.7", + "displayName": "Z.AI GLM-4.7", + "status": "beta", + "metadata": { + "lastUpdated": "2026-06-10", + "openWeights": true, + "releaseDate": "2026-01-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cerebras", + "model": "cerebras/zai-glm-4.7", + "mode": "chat", + "metadata": { + "source": "https://www.cerebras.ai/pricing" + } + } + ] + }, + { + "id": "chutes/deephermes-3-mistral-24b-preview", + "provider": "chutes", + "model": "deephermes-3-mistral-24b-preview", + "displayName": "DeepHermes 3 Mistral 24B Preview", + "family": "nousresearch", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/NousResearch/DeepHermes-3-Mistral-24B-Preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "NousResearch/DeepHermes-3-Mistral-24B-Preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01225, + "input": 0.0245, + "output": 0.0978 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepHermes 3 Mistral 24B Preview" + ], + "families": [ + "nousresearch" + ], + "releaseDate": "2025-12-29", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "NousResearch/DeepHermes-3-Mistral-24B-Preview", + "modelKey": "NousResearch/DeepHermes-3-Mistral-24B-Preview", + "displayName": "DeepHermes 3 Mistral 24B Preview", + "family": "nousresearch", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29" + } + } + ] + }, + { + "id": "chutes/dots.ocr", + "provider": "chutes", + "model": "dots.ocr", + "displayName": "dots.ocr", + "family": "rednote", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/rednote-hilab/dots.ocr" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "rednote-hilab/dots.ocr", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.01, + "output": 0.0109 + } + } + ] + }, + "metadata": { + "displayNames": [ + "dots.ocr" + ], + "families": [ + "rednote" + ], + "releaseDate": "2025-12-29", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "rednote-hilab/dots.ocr", + "modelKey": "rednote-hilab/dots.ocr", + "displayName": "dots.ocr", + "family": "rednote", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29" + } + } + ] + }, + { + "id": "chutes/gemma-3-12b-it", + "provider": "chutes", + "model": "gemma-3-12b-it", + "displayName": "gemma 3 12b it", + "family": "unsloth", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/unsloth/gemma-3-12b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "unsloth/gemma-3-12b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.03, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gemma 3 12b it" + ], + "families": [ + "unsloth" + ], + "releaseDate": "2025-12-29", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "unsloth/gemma-3-12b-it", + "modelKey": "unsloth/gemma-3-12b-it", + "displayName": "gemma 3 12b it", + "family": "unsloth", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29" + } + } + ] + }, + { + "id": "chutes/gemma-3-27b-it", + "provider": "chutes", + "model": "gemma-3-27b-it", + "displayName": "gemma 3 27b it", + "family": "unsloth", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/unsloth/gemma-3-27b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "unsloth/gemma-3-27b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0136, + "input": 0.0272, + "output": 0.1087 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gemma 3 27b it" + ], + "families": [ + "unsloth" + ], + "releaseDate": "2025-12-29", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "unsloth/gemma-3-27b-it", + "modelKey": "unsloth/gemma-3-27b-it", + "displayName": "gemma 3 27b it", + "family": "unsloth", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29" + } + } + ] + }, + { + "id": "chutes/gemma-3-4b-it", + "provider": "chutes", + "model": "gemma-3-4b-it", + "displayName": "gemma 3 4b it", + "family": "unsloth", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/unsloth/gemma-3-4b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 96000, + "outputTokens": 96000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "unsloth/gemma-3-4b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.01, + "output": 0.0272 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gemma 3 4b it" + ], + "families": [ + "unsloth" + ], + "releaseDate": "2025-12-29", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "unsloth/gemma-3-4b-it", + "modelKey": "unsloth/gemma-3-4b-it", + "displayName": "gemma 3 4b it", + "family": "unsloth", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29" + } + } + ] + }, + { + "id": "chutes/hermes-4-14b", + "provider": "chutes", + "model": "hermes-4-14b", + "displayName": "Hermes 4 14B", + "family": "nousresearch", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/NousResearch/Hermes-4-14B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 40960, + "outputTokens": 40960, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "NousResearch/Hermes-4-14B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0068, + "input": 0.0136, + "output": 0.0543 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes 4 14B" + ], + "families": [ + "nousresearch" + ], + "releaseDate": "2025-12-29", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "NousResearch/Hermes-4-14B", + "modelKey": "NousResearch/Hermes-4-14B", + "displayName": "Hermes 4 14B", + "family": "nousresearch", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "chutes/mimo-v2-flash-tee", + "provider": "chutes", + "model": "mimo-v2-flash-tee", + "displayName": "MiMo V2 Flash TEE", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/XiaomiMiMo/MiMo-V2-Flash-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "XiaomiMiMo/MiMo-V2-Flash-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.045, + "input": 0.09, + "output": 0.29 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2 Flash TEE" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12-01", + "releaseDate": "2025-12-16", + "lastUpdated": "2026-02-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "XiaomiMiMo/MiMo-V2-Flash-TEE", + "modelKey": "XiaomiMiMo/MiMo-V2-Flash-TEE", + "displayName": "MiMo V2 Flash TEE", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12-01", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2025-12-16" + } + } + ] + }, + { + "id": "clarifai/mm-poly-8b", + "provider": "clarifai", + "model": "mm-poly-8b", + "displayName": "MM Poly 8B", + "family": "mm-poly", + "sources": [ + "models.dev" + ], + "providers": [ + "clarifai" + ], + "aliases": [ + "clarifai/main/models/mm-poly-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "clarifai", + "model": "clarifai/main/models/mm-poly-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.658, + "output": 1.11 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MM Poly 8B" + ], + "families": [ + "mm-poly" + ], + "releaseDate": "2025-06", + "lastUpdated": "2026-02-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "clarifai", + "providerName": "Clarifai", + "providerApi": "https://api.clarifai.com/v2/ext/openai/v1", + "providerDoc": "https://docs.clarifai.com/compute/inference/", + "model": "clarifai/main/models/mm-poly-8b", + "modelKey": "clarifai/main/models/mm-poly-8b", + "displayName": "MM Poly 8B", + "family": "mm-poly", + "metadata": { + "lastUpdated": "2026-02-25", + "openWeights": false, + "releaseDate": "2025-06" + } + } + ] + }, + { + "id": "clarifai/trinity-mini", + "provider": "clarifai", + "model": "trinity-mini", + "displayName": "Trinity Mini", + "family": "trinity-mini", + "sources": [ + "models.dev" + ], + "providers": [ + "clarifai" + ], + "aliases": [ + "clarifai/arcee_ai/AFM/models/trinity-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "clarifai", + "model": "arcee_ai/AFM/models/trinity-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.045, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Trinity Mini" + ], + "families": [ + "trinity-mini" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-12", + "lastUpdated": "2026-02-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "clarifai", + "providerName": "Clarifai", + "providerApi": "https://api.clarifai.com/v2/ext/openai/v1", + "providerDoc": "https://docs.clarifai.com/compute/inference/", + "model": "arcee_ai/AFM/models/trinity-mini", + "modelKey": "arcee_ai/AFM/models/trinity-mini", + "displayName": "Trinity Mini", + "family": "trinity-mini", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2026-02-25", + "openWeights": true, + "releaseDate": "2025-12" + } + } + ] + }, + { + "id": "claudinio/claudinio", + "provider": "claudinio", + "model": "claudinio", + "displayName": "Claudinio", + "sources": [ + "models.dev" + ], + "providers": [ + "claudinio" + ], + "aliases": [ + "claudinio/claudinio" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "claudinio", + "model": "claudinio", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.5, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claudinio" + ], + "knowledgeCutoff": "2026-05", + "releaseDate": "2026-05-12", + "lastUpdated": "2026-06-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "claudinio", + "providerName": "Claudinio", + "providerApi": "https://api.claudin.io/v1", + "providerDoc": "https://claudin.io", + "model": "claudinio", + "modelKey": "claudinio", + "displayName": "Claudinio", + "metadata": { + "knowledgeCutoff": "2026-05", + "lastUpdated": "2026-06-02", + "openWeights": false, + "releaseDate": "2026-05-12", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "cloudferro-sherlock/bielik-11b-v2.6-instruct", + "provider": "cloudferro-sherlock", + "model": "bielik-11b-v2.6-instruct", + "displayName": "Bielik 11B v2.6 Instruct", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudferro-sherlock" + ], + "aliases": [ + "cloudferro-sherlock/speakleash/Bielik-11B-v2.6-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudferro-sherlock", + "model": "speakleash/Bielik-11B-v2.6-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.67, + "output": 0.67 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Bielik 11B v2.6 Instruct" + ], + "knowledgeCutoff": "2025-03", + "releaseDate": "2025-03-13", + "lastUpdated": "2025-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudferro-sherlock", + "providerName": "CloudFerro Sherlock", + "providerApi": "https://api-sherlock.cloudferro.com/openai/v1/", + "providerDoc": "https://docs.sherlock.cloudferro.com/", + "model": "speakleash/Bielik-11B-v2.6-Instruct", + "modelKey": "speakleash/Bielik-11B-v2.6-Instruct", + "displayName": "Bielik 11B v2.6 Instruct", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2025-03-13", + "openWeights": true, + "releaseDate": "2025-03-13" + } + } + ] + }, + { + "id": "cloudferro-sherlock/bielik-11b-v3.0-instruct", + "provider": "cloudferro-sherlock", + "model": "bielik-11b-v3.0-instruct", + "displayName": "Bielik 11B v3.0 Instruct", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudferro-sherlock" + ], + "aliases": [ + "cloudferro-sherlock/speakleash/Bielik-11B-v3.0-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudferro-sherlock", + "model": "speakleash/Bielik-11B-v3.0-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.67, + "output": 0.67 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Bielik 11B v3.0 Instruct" + ], + "knowledgeCutoff": "2025-03", + "releaseDate": "2025-03-13", + "lastUpdated": "2025-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudferro-sherlock", + "providerName": "CloudFerro Sherlock", + "providerApi": "https://api-sherlock.cloudferro.com/openai/v1/", + "providerDoc": "https://docs.sherlock.cloudferro.com/", + "model": "speakleash/Bielik-11B-v3.0-Instruct", + "modelKey": "speakleash/Bielik-11B-v3.0-Instruct", + "displayName": "Bielik 11B v3.0 Instruct", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2025-03-13", + "openWeights": true, + "releaseDate": "2025-03-13" + } + } + ] + }, + { + "id": "cloudflare-ai-gateway/aura-2-en", + "provider": "cloudflare-ai-gateway", + "model": "aura-2-en", + "displayName": "Deepgram Aura 2 (EN)", + "family": "aura", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/deepgram/aura-2-en" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/deepgram/aura-2-en", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Deepgram Aura 2 (EN)" + ], + "families": [ + "aura" + ], + "releaseDate": "2025-11-14", + "lastUpdated": "2025-11-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/deepgram/aura-2-en", + "modelKey": "workers-ai/@cf/deepgram/aura-2-en", + "displayName": "Deepgram Aura 2 (EN)", + "family": "aura", + "metadata": { + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14" + } + } + ] + }, + { + "id": "cloudflare-ai-gateway/aura-2-es", + "provider": "cloudflare-ai-gateway", + "model": "aura-2-es", + "displayName": "Deepgram Aura 2 (ES)", + "family": "aura", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/deepgram/aura-2-es" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/deepgram/aura-2-es", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Deepgram Aura 2 (ES)" + ], + "families": [ + "aura" + ], + "releaseDate": "2025-11-14", + "lastUpdated": "2025-11-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/deepgram/aura-2-es", + "modelKey": "workers-ai/@cf/deepgram/aura-2-es", + "displayName": "Deepgram Aura 2 (ES)", + "family": "aura", + "metadata": { + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14" + } + } + ] + }, + { + "id": "cloudflare-ai-gateway/bart-large-cnn", + "provider": "cloudflare-ai-gateway", + "model": "bart-large-cnn", + "displayName": "BART Large CNN", + "family": "bart", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/facebook/bart-large-cnn" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/facebook/bart-large-cnn", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "BART Large CNN" + ], + "families": [ + "bart" + ], + "releaseDate": "2025-04-09", + "lastUpdated": "2025-04-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/facebook/bart-large-cnn", + "modelKey": "workers-ai/@cf/facebook/bart-large-cnn", + "displayName": "BART Large CNN", + "family": "bart", + "metadata": { + "lastUpdated": "2025-04-09", + "openWeights": false, + "releaseDate": "2025-04-09" + } + } + ] + }, + { + "id": "cloudflare-ai-gateway/bge-base-en-v1.5", + "provider": "cloudflare-ai-gateway", + "model": "bge-base-en-v1.5", + "displayName": "BGE Base EN v1.5", + "family": "bge", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/baai/bge-base-en-v1.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/baai/bge-base-en-v1.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.067, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "BGE Base EN v1.5" + ], + "families": [ + "bge" + ], + "releaseDate": "2025-04-03", + "lastUpdated": "2025-04-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/baai/bge-base-en-v1.5", + "modelKey": "workers-ai/@cf/baai/bge-base-en-v1.5", + "displayName": "BGE Base EN v1.5", + "family": "bge", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + } + ] + }, + { + "id": "cloudflare-ai-gateway/bge-large-en-v1.5", + "provider": "cloudflare-ai-gateway", + "model": "bge-large-en-v1.5", + "displayName": "BGE Large EN v1.5", + "family": "bge", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/baai/bge-large-en-v1.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/baai/bge-large-en-v1.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "BGE Large EN v1.5" + ], + "families": [ + "bge" + ], + "releaseDate": "2025-04-03", + "lastUpdated": "2025-04-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/baai/bge-large-en-v1.5", + "modelKey": "workers-ai/@cf/baai/bge-large-en-v1.5", + "displayName": "BGE Large EN v1.5", + "family": "bge", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + } + ] + }, + { + "id": "cloudflare-ai-gateway/bge-m3", + "provider": "cloudflare-ai-gateway", + "model": "bge-m3", + "displayName": "BGE M3", + "family": "bge", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/baai/bge-m3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/baai/bge-m3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.012, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "BGE M3" + ], + "families": [ + "bge" + ], + "releaseDate": "2025-04-03", + "lastUpdated": "2025-04-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/baai/bge-m3", + "modelKey": "workers-ai/@cf/baai/bge-m3", + "displayName": "BGE M3", + "family": "bge", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + } + ] + }, + { + "id": "cloudflare-ai-gateway/bge-reranker-base", + "provider": "cloudflare-ai-gateway", + "model": "bge-reranker-base", + "displayName": "BGE Reranker Base", + "family": "bge", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/baai/bge-reranker-base" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/baai/bge-reranker-base", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0031, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "BGE Reranker Base" + ], + "families": [ + "bge" + ], + "releaseDate": "2025-04-09", + "lastUpdated": "2025-04-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/baai/bge-reranker-base", + "modelKey": "workers-ai/@cf/baai/bge-reranker-base", + "displayName": "BGE Reranker Base", + "family": "bge", + "metadata": { + "lastUpdated": "2025-04-09", + "openWeights": false, + "releaseDate": "2025-04-09" + } + } + ] + }, + { + "id": "cloudflare-ai-gateway/bge-small-en-v1.5", + "provider": "cloudflare-ai-gateway", + "model": "bge-small-en-v1.5", + "displayName": "BGE Small EN v1.5", + "family": "bge", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/baai/bge-small-en-v1.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/baai/bge-small-en-v1.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "BGE Small EN v1.5" + ], + "families": [ + "bge" + ], + "releaseDate": "2025-04-03", + "lastUpdated": "2025-04-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/baai/bge-small-en-v1.5", + "modelKey": "workers-ai/@cf/baai/bge-small-en-v1.5", + "displayName": "BGE Small EN v1.5", + "family": "bge", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + } + ] + }, + { + "id": "cloudflare-ai-gateway/distilbert-sst-2-int8", + "provider": "cloudflare-ai-gateway", + "model": "distilbert-sst-2-int8", + "displayName": "DistilBERT SST-2 INT8", + "family": "distilbert", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/huggingface/distilbert-sst-2-int8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/huggingface/distilbert-sst-2-int8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.026, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DistilBERT SST-2 INT8" + ], + "families": [ + "distilbert" + ], + "releaseDate": "2025-04-03", + "lastUpdated": "2025-04-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/huggingface/distilbert-sst-2-int8", + "modelKey": "workers-ai/@cf/huggingface/distilbert-sst-2-int8", + "displayName": "DistilBERT SST-2 INT8", + "family": "distilbert", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + } + ] + }, + { + "id": "cloudflare-ai-gateway/gemma-sea-lion-v4-27b-it", + "provider": "cloudflare-ai-gateway", + "model": "gemma-sea-lion-v4-27b-it", + "displayName": "Gemma SEA-LION v4 27B IT", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/aisingapore/gemma-sea-lion-v4-27b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/aisingapore/gemma-sea-lion-v4-27b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.35, + "output": 0.56 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma SEA-LION v4 27B IT" + ], + "families": [ + "gemma" + ], + "releaseDate": "2025-09-25", + "lastUpdated": "2025-09-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/aisingapore/gemma-sea-lion-v4-27b-it", + "modelKey": "workers-ai/@cf/aisingapore/gemma-sea-lion-v4-27b-it", + "displayName": "Gemma SEA-LION v4 27B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + } + ] + }, + { + "id": "cloudflare-ai-gateway/granite-4.0-h-micro", + "provider": "cloudflare-ai-gateway", + "model": "granite-4.0-h-micro", + "displayName": "IBM Granite 4.0 H Micro", + "family": "granite", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/ibm-granite/granite-4.0-h-micro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/ibm-granite/granite-4.0-h-micro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.017, + "output": 0.11 + } + } + ] + }, + "metadata": { + "displayNames": [ + "IBM Granite 4.0 H Micro" + ], + "families": [ + "granite" + ], + "releaseDate": "2025-10-15", + "lastUpdated": "2025-10-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/ibm-granite/granite-4.0-h-micro", + "modelKey": "workers-ai/@cf/ibm-granite/granite-4.0-h-micro", + "displayName": "IBM Granite 4.0 H Micro", + "family": "granite", + "metadata": { + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + } + ] + }, + { + "id": "cloudflare-ai-gateway/indictrans2-en-indic-1b", + "provider": "cloudflare-ai-gateway", + "model": "indictrans2-en-indic-1b", + "displayName": "IndicTrans2 EN-Indic 1B", + "family": "indictrans", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/ai4bharat/indictrans2-en-indic-1B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/ai4bharat/indictrans2-en-indic-1B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.34, + "output": 0.34 + } + } + ] + }, + "metadata": { + "displayNames": [ + "IndicTrans2 EN-Indic 1B" + ], + "families": [ + "indictrans" + ], + "releaseDate": "2025-09-25", + "lastUpdated": "2025-09-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/ai4bharat/indictrans2-en-indic-1B", + "modelKey": "workers-ai/@cf/ai4bharat/indictrans2-en-indic-1B", + "displayName": "IndicTrans2 EN-Indic 1B", + "family": "indictrans", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + } + ] + }, + { + "id": "cloudflare-ai-gateway/melotts", + "provider": "cloudflare-ai-gateway", + "model": "melotts", + "displayName": "MyShell MeloTTS", + "family": "melotts", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/myshell-ai/melotts" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/myshell-ai/melotts", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MyShell MeloTTS" + ], + "families": [ + "melotts" + ], + "releaseDate": "2025-11-14", + "lastUpdated": "2025-11-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/myshell-ai/melotts", + "modelKey": "workers-ai/@cf/myshell-ai/melotts", + "displayName": "MyShell MeloTTS", + "family": "melotts", + "metadata": { + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14" + } + } + ] + }, + { + "id": "cloudflare-ai-gateway/nemotron-3-120b-a12b", + "provider": "cloudflare-ai-gateway", + "model": "nemotron-3-120b-a12b", + "displayName": "Nemotron 3 Super 120B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/nvidia/nemotron-3-120b-a12b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/nvidia/nemotron-3-120b-a12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron 3 Super 120B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-03-11", + "lastUpdated": "2026-03-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/nvidia/nemotron-3-120b-a12b", + "modelKey": "workers-ai/@cf/nvidia/nemotron-3-120b-a12b", + "displayName": "Nemotron 3 Super 120B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-03-11", + "openWeights": true, + "releaseDate": "2026-03-11", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "cloudflare-ai-gateway/plamo-embedding-1b", + "provider": "cloudflare-ai-gateway", + "model": "plamo-embedding-1b", + "displayName": "PLaMo Embedding 1B", + "family": "plamo", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/pfnet/plamo-embedding-1b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/pfnet/plamo-embedding-1b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.019, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "PLaMo Embedding 1B" + ], + "families": [ + "plamo" + ], + "releaseDate": "2025-09-25", + "lastUpdated": "2025-09-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/pfnet/plamo-embedding-1b", + "modelKey": "workers-ai/@cf/pfnet/plamo-embedding-1b", + "displayName": "PLaMo Embedding 1B", + "family": "plamo", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + } + ] + }, + { + "id": "cloudflare-ai-gateway/smart-turn-v2", + "provider": "cloudflare-ai-gateway", + "model": "smart-turn-v2", + "displayName": "Pipecat Smart Turn v2", + "family": "smart-turn", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/pipecat-ai/smart-turn-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/pipecat-ai/smart-turn-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Pipecat Smart Turn v2" + ], + "families": [ + "smart-turn" + ], + "releaseDate": "2025-11-14", + "lastUpdated": "2025-11-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/pipecat-ai/smart-turn-v2", + "modelKey": "workers-ai/@cf/pipecat-ai/smart-turn-v2", + "displayName": "Pipecat Smart Turn v2", + "family": "smart-turn", + "metadata": { + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14" + } + } + ] + }, + { + "id": "cloudflare-workers-ai/gemma-sea-lion-v4-27b-it", + "provider": "cloudflare-workers-ai", + "model": "gemma-sea-lion-v4-27b-it", + "displayName": "Gemma Sea Lion V4 27B It", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-workers-ai" + ], + "aliases": [ + "cloudflare-workers-ai/@cf/aisingapore/gemma-sea-lion-v4-27b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/aisingapore/gemma-sea-lion-v4-27b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.351, + "output": 0.555 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma Sea Lion V4 27B It" + ], + "families": [ + "gemma" + ], + "releaseDate": "2025-09-23", + "lastUpdated": "2025-09-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/aisingapore/gemma-sea-lion-v4-27b-it", + "modelKey": "@cf/aisingapore/gemma-sea-lion-v4-27b-it", + "displayName": "Gemma Sea Lion V4 27B It", + "family": "gemma", + "metadata": { + "lastUpdated": "2025-09-23", + "openWeights": true, + "releaseDate": "2025-09-23" + } + } + ] + }, + { + "id": "cloudflare-workers-ai/granite-4.0-h-micro", + "provider": "cloudflare-workers-ai", + "model": "granite-4.0-h-micro", + "displayName": "Granite 4.0 H Micro", + "family": "granite", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-workers-ai" + ], + "aliases": [ + "cloudflare-workers-ai/@cf/ibm-granite/granite-4.0-h-micro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131000, + "outputTokens": 131000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/ibm-granite/granite-4.0-h-micro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.017, + "output": 0.112 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Granite 4.0 H Micro" + ], + "families": [ + "granite" + ], + "releaseDate": "2025-10-07", + "lastUpdated": "2025-10-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/ibm-granite/granite-4.0-h-micro", + "modelKey": "@cf/ibm-granite/granite-4.0-h-micro", + "displayName": "Granite 4.0 H Micro", + "family": "granite", + "metadata": { + "lastUpdated": "2025-10-07", + "openWeights": true, + "releaseDate": "2025-10-07" + } + } + ] + }, + { + "id": "cloudflare-workers-ai/nemotron-3-120b-a12b", + "provider": "cloudflare-workers-ai", + "model": "nemotron-3-120b-a12b", + "displayName": "Nemotron 3 Super 120B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-workers-ai" + ], + "aliases": [ + "cloudflare-workers-ai/@cf/nvidia/nemotron-3-120b-a12b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "interleaved": true, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/nvidia/nemotron-3-120b-a12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron 3 Super 120B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-03-11", + "lastUpdated": "2026-03-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/nvidia/nemotron-3-120b-a12b", + "modelKey": "@cf/nvidia/nemotron-3-120b-a12b", + "displayName": "Nemotron 3 Super 120B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-03-11", + "openWeights": true, + "releaseDate": "2026-03-11", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "cohere/c4ai-aya-expanse-32b", + "provider": "cohere", + "model": "c4ai-aya-expanse-32b", + "displayName": "Aya Expanse 32B", + "sources": [ + "models.dev" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/c4ai-aya-expanse-32b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Aya Expanse 32B" + ], + "releaseDate": "2024-10-24", + "lastUpdated": "2024-10-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cohere", + "providerName": "Cohere", + "providerDoc": "https://docs.cohere.com/docs/models", + "model": "c4ai-aya-expanse-32b", + "modelKey": "c4ai-aya-expanse-32b", + "displayName": "Aya Expanse 32B", + "metadata": { + "lastUpdated": "2024-10-24", + "openWeights": true, + "releaseDate": "2024-10-24" + } + } + ] + }, + { + "id": "cohere/c4ai-aya-expanse-8b", + "provider": "cohere", + "model": "c4ai-aya-expanse-8b", + "displayName": "Aya Expanse 8B", + "sources": [ + "models.dev" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/c4ai-aya-expanse-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Aya Expanse 8B" + ], + "releaseDate": "2024-10-24", + "lastUpdated": "2024-10-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cohere", + "providerName": "Cohere", + "providerDoc": "https://docs.cohere.com/docs/models", + "model": "c4ai-aya-expanse-8b", + "modelKey": "c4ai-aya-expanse-8b", + "displayName": "Aya Expanse 8B", + "metadata": { + "lastUpdated": "2024-10-24", + "openWeights": true, + "releaseDate": "2024-10-24" + } + } + ] + }, + { + "id": "cohere/c4ai-aya-vision-32b", + "provider": "cohere", + "model": "c4ai-aya-vision-32b", + "displayName": "Aya Vision 32B", + "sources": [ + "models.dev" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/c4ai-aya-vision-32b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Aya Vision 32B" + ], + "releaseDate": "2025-03-04", + "lastUpdated": "2025-05-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cohere", + "providerName": "Cohere", + "providerDoc": "https://docs.cohere.com/docs/models", + "model": "c4ai-aya-vision-32b", + "modelKey": "c4ai-aya-vision-32b", + "displayName": "Aya Vision 32B", + "metadata": { + "lastUpdated": "2025-05-14", + "openWeights": true, + "releaseDate": "2025-03-04" + } + } + ] + }, + { + "id": "cohere/c4ai-aya-vision-8b", + "provider": "cohere", + "model": "c4ai-aya-vision-8b", + "displayName": "Aya Vision 8B", + "sources": [ + "models.dev" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/c4ai-aya-vision-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Aya Vision 8B" + ], + "releaseDate": "2025-03-04", + "lastUpdated": "2025-05-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cohere", + "providerName": "Cohere", + "providerDoc": "https://docs.cohere.com/docs/models", + "model": "c4ai-aya-vision-8b", + "modelKey": "c4ai-aya-vision-8b", + "displayName": "Aya Vision 8B", + "metadata": { + "lastUpdated": "2025-05-14", + "openWeights": true, + "releaseDate": "2025-03-04" + } + } + ] + }, + { + "id": "cohere/cohere-command-a", + "provider": "cohere", + "model": "cohere-command-a", + "displayName": "Cohere Command A", + "family": "command-a", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/cohere/cohere-command-a" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "cohere/cohere-command-a", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cohere Command A" + ], + "families": [ + "command-a" + ], + "knowledgeCutoff": "2024-03", + "releaseDate": "2024-11-01", + "lastUpdated": "2024-11-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "cohere/cohere-command-a", + "modelKey": "cohere/cohere-command-a", + "displayName": "Cohere Command A", + "family": "command-a", + "metadata": { + "knowledgeCutoff": "2024-03", + "lastUpdated": "2024-11-01", + "openWeights": false, + "releaseDate": "2024-11-01" + } + } + ] + }, + { + "id": "cohere/cohere-command-r", + "provider": "cohere", + "model": "cohere-command-r", + "displayName": "Cohere Command R", + "family": "command-r", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/cohere/cohere-command-r" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "cohere/cohere-command-r", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cohere Command R" + ], + "families": [ + "command-r" + ], + "knowledgeCutoff": "2024-03", + "releaseDate": "2024-03-11", + "lastUpdated": "2024-08-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "cohere/cohere-command-r", + "modelKey": "cohere/cohere-command-r", + "displayName": "Cohere Command R", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-03", + "lastUpdated": "2024-08-01", + "openWeights": false, + "releaseDate": "2024-03-11" + } + } + ] + }, + { + "id": "cohere/cohere-command-r-08-2024", + "provider": "cohere", + "model": "cohere-command-r-08-2024", + "displayName": "Cohere Command R 08-2024", + "family": "command-r", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/cohere/cohere-command-r-08-2024" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "cohere/cohere-command-r-08-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cohere Command R 08-2024" + ], + "families": [ + "command-r" + ], + "knowledgeCutoff": "2024-03", + "releaseDate": "2024-08-01", + "lastUpdated": "2024-08-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "cohere/cohere-command-r-08-2024", + "modelKey": "cohere/cohere-command-r-08-2024", + "displayName": "Cohere Command R 08-2024", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-03", + "lastUpdated": "2024-08-01", + "openWeights": false, + "releaseDate": "2024-08-01" + } + } + ] + }, + { + "id": "cohere/cohere-command-r-plus", + "provider": "cohere", + "model": "cohere-command-r-plus", + "displayName": "Cohere Command R+", + "family": "command-r", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/cohere/cohere-command-r-plus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "cohere/cohere-command-r-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cohere Command R+" + ], + "families": [ + "command-r" + ], + "knowledgeCutoff": "2024-03", + "releaseDate": "2024-04-04", + "lastUpdated": "2024-08-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "cohere/cohere-command-r-plus", + "modelKey": "cohere/cohere-command-r-plus", + "displayName": "Cohere Command R+", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-03", + "lastUpdated": "2024-08-01", + "openWeights": false, + "releaseDate": "2024-04-04" + } + } + ] + }, + { + "id": "cohere/cohere-command-r-plus-08-2024", + "provider": "cohere", + "model": "cohere-command-r-plus-08-2024", + "displayName": "Cohere Command R+ 08-2024", + "family": "command-r", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/cohere/cohere-command-r-plus-08-2024" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "cohere/cohere-command-r-plus-08-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cohere Command R+ 08-2024" + ], + "families": [ + "command-r" + ], + "knowledgeCutoff": "2024-03", + "releaseDate": "2024-08-01", + "lastUpdated": "2024-08-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "cohere/cohere-command-r-plus-08-2024", + "modelKey": "cohere/cohere-command-r-plus-08-2024", + "displayName": "Cohere Command R+ 08-2024", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-03", + "lastUpdated": "2024-08-01", + "openWeights": false, + "releaseDate": "2024-08-01" + } + } + ] + }, + { + "id": "cohere/command", + "provider": "cohere", + "model": "command", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/command" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cohere", + "model": "command", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere", + "model": "command", + "mode": "completion" + } + ] + }, + { + "id": "cohere/command-a", + "provider": "cohere", + "model": "command-a", + "displayName": "Cohere: Command A", + "family": "command-a", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "kilo/cohere/command-a", + "openrouter/cohere/command-a", + "vercel/cohere/command-a", + "vercel_ai_gateway/cohere/command-a" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 8000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "cohere/command-a", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "cohere/command-a", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "cohere/command-a", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/cohere/command-a", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "cohere/command-a", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cohere: Command A", + "Command A" + ], + "families": [ + "command", + "command-a" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-08-31", + "releaseDate": "2025-03-13", + "lastUpdated": "2025-03-13", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "cohere/command-a", + "modelKey": "cohere/command-a", + "displayName": "Cohere: Command A", + "metadata": { + "lastUpdated": "2025-03-13", + "openWeights": true, + "releaseDate": "2025-03-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "cohere/command-a", + "modelKey": "cohere/command-a", + "displayName": "Command A", + "family": "command-a", + "metadata": { + "knowledgeCutoff": "2024-08-31", + "lastUpdated": "2025-03-13", + "openWeights": true, + "releaseDate": "2025-03-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "cohere/command-a", + "modelKey": "cohere/command-a", + "displayName": "Command A", + "family": "command", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-03-13", + "openWeights": false, + "releaseDate": "2025-03-13" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/cohere/command-a", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "cohere/command-a", + "displayName": "Cohere: Command A", + "metadata": { + "canonicalSlug": "cohere/command-a-03-2025", + "createdAt": "2025-03-13T19:32:22.000Z", + "huggingFaceId": "CohereForAI/c4ai-command-a-03-2025", + "knowledgeCutoff": "2024-08-31", + "links": { + "details": "/api/v1/models/cohere/command-a-03-2025/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 256000, + "max_completion_tokens": 8192, + "is_moderated": true + } + } + } + ] + }, + { + "id": "cohere/command-a-03-2025", + "provider": "cohere", + "model": "command-a-03-2025", + "displayName": "Command A", + "family": "command-a", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "cohere", + "cohere_chat", + "merge-gateway" + ], + "aliases": [ + "cohere/command-a-03-2025", + "cohere_chat/command-a-03-2025", + "merge-gateway/cohere/command-a-03-2025" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 8000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cohere", + "model": "command-a-03-2025", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "cohere/command-a-03-2025", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "cohere_chat", + "model": "command-a-03-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Command A" + ], + "families": [ + "command-a" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-06-01", + "releaseDate": "2025-03-13", + "lastUpdated": "2025-03-13", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cohere", + "providerName": "Cohere", + "providerDoc": "https://docs.cohere.com/docs/models", + "model": "command-a-03-2025", + "modelKey": "command-a-03-2025", + "displayName": "Command A", + "family": "command-a", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2025-03-13", + "openWeights": true, + "releaseDate": "2025-03-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "cohere/command-a-03-2025", + "modelKey": "cohere/command-a-03-2025", + "displayName": "Command A", + "family": "command-a", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2025-03-13", + "openWeights": true, + "releaseDate": "2025-03-13" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere_chat", + "model": "command-a-03-2025", + "mode": "chat" + } + ] + }, + { + "id": "cohere/command-a-plus-05-2026", + "provider": "cohere", + "model": "command-a-plus-05-2026", + "displayName": "Command A Plus", + "family": "command-a", + "sources": [ + "models.dev" + ], + "providers": [ + "cohere", + "nano-gpt" + ], + "aliases": [ + "cohere/command-a-plus-05-2026", + "nano-gpt/command-a-plus-05-2026" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cohere", + "model": "command-a-plus-05-2026", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "command-a-plus-05-2026", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cohere Command A+ (05/2026)", + "Command A Plus" + ], + "families": [ + "command-a" + ], + "knowledgeCutoff": "2025-04-01", + "releaseDate": "2026-05-20", + "lastUpdated": "2026-06-09", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cohere", + "providerName": "Cohere", + "providerDoc": "https://docs.cohere.com/docs/models", + "model": "command-a-plus-05-2026", + "modelKey": "command-a-plus-05-2026", + "displayName": "Command A Plus", + "family": "command-a", + "metadata": { + "knowledgeCutoff": "2025-04-01", + "lastUpdated": "2026-06-09", + "openWeights": true, + "releaseDate": "2026-05-20", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "command-a-plus-05-2026", + "modelKey": "command-a-plus-05-2026", + "displayName": "Cohere Command A+ (05/2026)", + "metadata": { + "lastUpdated": "2026-05-22", + "openWeights": false, + "releaseDate": "2026-05-22", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "cohere/command-a-reasoning-08-2025", + "provider": "cohere", + "model": "command-a-reasoning-08-2025", + "displayName": "Command A Reasoning", + "family": "command-a", + "sources": [ + "models.dev" + ], + "providers": [ + "cohere", + "nano-gpt" + ], + "aliases": [ + "cohere/command-a-reasoning-08-2025", + "nano-gpt/command-a-reasoning-08-2025" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cohere", + "model": "command-a-reasoning-08-2025", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "command-a-reasoning-08-2025", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cohere Command A (08/2025)", + "Command A Reasoning" + ], + "families": [ + "command-a" + ], + "knowledgeCutoff": "2024-06-01", + "releaseDate": "2025-08-21", + "lastUpdated": "2025-08-21", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cohere", + "providerName": "Cohere", + "providerDoc": "https://docs.cohere.com/docs/models", + "model": "command-a-reasoning-08-2025", + "modelKey": "command-a-reasoning-08-2025", + "displayName": "Command A Reasoning", + "family": "command-a", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2025-08-21", + "openWeights": true, + "releaseDate": "2025-08-21", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 1 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "command-a-reasoning-08-2025", + "modelKey": "command-a-reasoning-08-2025", + "displayName": "Cohere Command A (08/2025)", + "metadata": { + "lastUpdated": "2025-08-22", + "openWeights": false, + "releaseDate": "2025-08-22" + } + } + ] + }, + { + "id": "cohere/command-a-translate-08-2025", + "provider": "cohere", + "model": "command-a-translate-08-2025", + "displayName": "Command A Translate", + "family": "command-a", + "sources": [ + "models.dev" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/command-a-translate-08-2025" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cohere", + "model": "command-a-translate-08-2025", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Command A Translate" + ], + "families": [ + "command-a" + ], + "knowledgeCutoff": "2024-06-01", + "releaseDate": "2025-08-28", + "lastUpdated": "2025-08-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cohere", + "providerName": "Cohere", + "providerDoc": "https://docs.cohere.com/docs/models", + "model": "command-a-translate-08-2025", + "modelKey": "command-a-translate-08-2025", + "displayName": "Command A Translate", + "family": "command-a", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2025-08-28", + "openWeights": true, + "releaseDate": "2025-08-28" + } + } + ] + }, + { + "id": "cohere/command-a-vision-07-2025", + "provider": "cohere", + "model": "command-a-vision-07-2025", + "displayName": "Command A Vision", + "family": "command-a", + "sources": [ + "models.dev" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/command-a-vision-07-2025" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cohere", + "model": "command-a-vision-07-2025", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Command A Vision" + ], + "families": [ + "command-a" + ], + "knowledgeCutoff": "2024-06-01", + "releaseDate": "2025-07-31", + "lastUpdated": "2025-07-31", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cohere", + "providerName": "Cohere", + "providerDoc": "https://docs.cohere.com/docs/models", + "model": "command-a-vision-07-2025", + "modelKey": "command-a-vision-07-2025", + "displayName": "Command A Vision", + "family": "command-a", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2025-07-31", + "openWeights": true, + "releaseDate": "2025-07-31" + } + } + ] + }, + { + "id": "cohere/command-light", + "provider": "cohere", + "model": "command-light", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "cohere_chat" + ], + "aliases": [ + "cohere_chat/command-light" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cohere_chat", + "model": "command-light", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere_chat", + "model": "command-light", + "mode": "chat" + } + ] + }, + { + "id": "cohere/command-nightly", + "provider": "cohere", + "model": "command-nightly", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/command-nightly" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cohere", + "model": "command-nightly", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere", + "model": "command-nightly", + "mode": "completion" + } + ] + }, + { + "id": "cohere/command-r", + "provider": "cohere", + "model": "command-r", + "displayName": "Cohere: Command R", + "family": "command-r", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "cohere_chat", + "nano-gpt", + "vercel_ai_gateway" + ], + "aliases": [ + "cohere_chat/command-r", + "nano-gpt/cohere/command-r", + "vercel_ai_gateway/cohere/command-r" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "cohere/command-r", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.476, + "output": 1.428 + } + }, + { + "source": "litellm", + "provider": "cohere_chat", + "model": "command-r", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/cohere/command-r", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cohere: Command R" + ], + "families": [ + "command-r" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-03-11", + "lastUpdated": "2024-03-11", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "cohere/command-r", + "modelKey": "cohere/command-r", + "displayName": "Cohere: Command R", + "family": "command-r", + "metadata": { + "lastUpdated": "2024-03-11", + "openWeights": false, + "releaseDate": "2024-03-11" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere_chat", + "model": "command-r", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/cohere/command-r", + "mode": "chat" + } + ] + }, + { + "id": "cohere/command-r-08-2024", + "provider": "cohere", + "model": "command-r-08-2024", + "displayName": "Command R", + "family": "command-r", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "cohere", + "cohere_chat", + "kilo", + "merge-gateway", + "openrouter" + ], + "aliases": [ + "cohere/command-r-08-2024", + "cohere_chat/command-r-08-2024", + "kilo/cohere/command-r-08-2024", + "merge-gateway/cohere/command-r-08-2024", + "openrouter/cohere/command-r-08-2024" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cohere", + "model": "command-r-08-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "cohere/command-r-08-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "cohere/command-r-08-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "cohere/command-r-08-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "cohere_chat", + "model": "command-r-08-2024", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "cohere/command-r-08-2024", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cohere: Command R (08-2024)", + "Command R" + ], + "families": [ + "command-r" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-06-01", + "releaseDate": "2024-08-30", + "lastUpdated": "2024-08-30", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cohere", + "providerName": "Cohere", + "providerDoc": "https://docs.cohere.com/docs/models", + "model": "command-r-08-2024", + "modelKey": "command-r-08-2024", + "displayName": "Command R", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2024-08-30", + "openWeights": true, + "releaseDate": "2024-08-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "cohere/command-r-08-2024", + "modelKey": "cohere/command-r-08-2024", + "displayName": "Cohere: Command R (08-2024)", + "metadata": { + "lastUpdated": "2024-08-30", + "openWeights": true, + "releaseDate": "2024-08-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "cohere/command-r-08-2024", + "modelKey": "cohere/command-r-08-2024", + "displayName": "Command R", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2024-08-30", + "openWeights": true, + "releaseDate": "2024-08-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "cohere/command-r-08-2024", + "modelKey": "cohere/command-r-08-2024", + "displayName": "Command R", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2024-08-30", + "openWeights": true, + "releaseDate": "2024-08-30" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere_chat", + "model": "command-r-08-2024", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "cohere/command-r-08-2024", + "displayName": "Cohere: Command R (08-2024)", + "metadata": { + "canonicalSlug": "cohere/command-r-08-2024", + "createdAt": "2024-08-30T00:00:00.000Z", + "knowledgeCutoff": "2024-03-31", + "links": { + "details": "/api/v1/models/cohere/command-r-08-2024/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Cohere", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 4000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "cohere/command-r-plus", + "provider": "cohere", + "model": "command-r-plus", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "cohere_chat", + "vercel_ai_gateway" + ], + "aliases": [ + "azure/command-r-plus", + "cohere_chat/command-r-plus", + "vercel_ai_gateway/cohere/command-r-plus" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "toolChoice": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/command-r-plus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "cohere_chat", + "model": "command-r-plus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/cohere/command-r-plus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/command-r-plus", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere_chat", + "model": "command-r-plus", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/cohere/command-r-plus", + "mode": "chat" + } + ] + }, + { + "id": "cohere/command-r-plus-08-2024", + "provider": "cohere", + "model": "command-r-plus-08-2024", + "displayName": "Command R+", + "family": "command-r", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "anyapi", + "cohere", + "cohere_chat", + "kilo", + "merge-gateway", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "anyapi/cohere/command-r-plus-08-2024", + "cohere/command-r-plus-08-2024", + "cohere_chat/command-r-plus-08-2024", + "kilo/cohere/command-r-plus-08-2024", + "merge-gateway/cohere/command-r-plus-08-2024", + "nano-gpt/cohere/command-r-plus-08-2024", + "openrouter/cohere/command-r-plus-08-2024" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cohere", + "model": "command-r-plus-08-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "cohere/command-r-plus-08-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "cohere/command-r-plus-08-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "cohere/command-r-plus-08-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.856, + "output": 14.246 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "cohere/command-r-plus-08-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "cohere_chat", + "model": "command-r-plus-08-2024", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "cohere/command-r-plus-08-2024", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cohere: Command R+", + "Cohere: Command R+ (08-2024)", + "Command R+" + ], + "families": [ + "command-r" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-06-01", + "releaseDate": "2024-08-30", + "lastUpdated": "2024-08-30", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "cohere/command-r-plus-08-2024", + "modelKey": "cohere/command-r-plus-08-2024", + "displayName": "Command R+", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2024-08-30", + "openWeights": true, + "releaseDate": "2024-08-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cohere", + "providerName": "Cohere", + "providerDoc": "https://docs.cohere.com/docs/models", + "model": "command-r-plus-08-2024", + "modelKey": "command-r-plus-08-2024", + "displayName": "Command R+", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2024-08-30", + "openWeights": true, + "releaseDate": "2024-08-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "cohere/command-r-plus-08-2024", + "modelKey": "cohere/command-r-plus-08-2024", + "displayName": "Cohere: Command R+ (08-2024)", + "metadata": { + "lastUpdated": "2024-08-30", + "openWeights": true, + "releaseDate": "2024-08-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "cohere/command-r-plus-08-2024", + "modelKey": "cohere/command-r-plus-08-2024", + "displayName": "Command R+", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2024-08-30", + "openWeights": true, + "releaseDate": "2024-08-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "cohere/command-r-plus-08-2024", + "modelKey": "cohere/command-r-plus-08-2024", + "displayName": "Cohere: Command R+", + "family": "command-r", + "metadata": { + "lastUpdated": "2024-08-30", + "openWeights": false, + "releaseDate": "2024-08-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "cohere/command-r-plus-08-2024", + "modelKey": "cohere/command-r-plus-08-2024", + "displayName": "Command R+", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2024-08-30", + "openWeights": true, + "releaseDate": "2024-08-30" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere_chat", + "model": "command-r-plus-08-2024", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "cohere/command-r-plus-08-2024", + "displayName": "Cohere: Command R+ (08-2024)", + "metadata": { + "canonicalSlug": "cohere/command-r-plus-08-2024", + "createdAt": "2024-08-30T00:00:00.000Z", + "knowledgeCutoff": "2024-03-31", + "links": { + "details": "/api/v1/models/cohere/command-r-plus-08-2024/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Cohere", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 4000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "cohere/command-r7b-12-2024", + "provider": "cohere", + "model": "command-r7b-12-2024", + "displayName": "Command R7B", + "family": "command-r", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "cohere", + "cohere_chat", + "kilo", + "merge-gateway", + "openrouter" + ], + "aliases": [ + "cohere/command-r7b-12-2024", + "cohere_chat/command-r7b-12-2024", + "kilo/cohere/command-r7b-12-2024", + "merge-gateway/cohere/command-r7b-12-2024", + "openrouter/cohere/command-r7b-12-2024" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cohere", + "model": "command-r7b-12-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0375, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "cohere/command-r7b-12-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0375, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "cohere/command-r7b-12-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0375, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "cohere/command-r7b-12-2024", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0375, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "cohere_chat", + "model": "command-r7b-12-2024", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.0375 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "cohere/command-r7b-12-2024", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.0375, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cohere: Command R7B (12-2024)", + "Command R7B" + ], + "families": [ + "command-r" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-06-01", + "releaseDate": "2024-12-02", + "lastUpdated": "2024-12-02", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cohere", + "providerName": "Cohere", + "providerDoc": "https://docs.cohere.com/docs/models", + "model": "command-r7b-12-2024", + "modelKey": "command-r7b-12-2024", + "displayName": "Command R7B", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2024-12-02", + "openWeights": true, + "releaseDate": "2024-12-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "cohere/command-r7b-12-2024", + "modelKey": "cohere/command-r7b-12-2024", + "displayName": "Cohere: Command R7B (12-2024)", + "metadata": { + "lastUpdated": "2024-12-02", + "openWeights": true, + "releaseDate": "2024-12-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "cohere/command-r7b-12-2024", + "modelKey": "cohere/command-r7b-12-2024", + "displayName": "Command R7B", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2024-12-02", + "openWeights": true, + "releaseDate": "2024-12-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "cohere/command-r7b-12-2024", + "modelKey": "cohere/command-r7b-12-2024", + "displayName": "Command R7B", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2024-12-02", + "openWeights": true, + "releaseDate": "2024-12-02" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere_chat", + "model": "command-r7b-12-2024", + "mode": "chat", + "metadata": { + "source": "https://docs.cohere.com/v2/docs/command-r7b" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "cohere/command-r7b-12-2024", + "displayName": "Cohere: Command R7B (12-2024)", + "metadata": { + "canonicalSlug": "cohere/command-r7b-12-2024", + "createdAt": "2024-12-14T06:35:52.000Z", + "knowledgeCutoff": "2024-08-31", + "links": { + "details": "/api/v1/models/cohere/command-r7b-12-2024/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Cohere", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 4000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "cohere/command-r7b-arabic-02-2025", + "provider": "cohere", + "model": "command-r7b-arabic-02-2025", + "displayName": "Command R7B Arabic", + "family": "command-r", + "sources": [ + "models.dev" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/command-r7b-arabic-02-2025" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cohere", + "model": "command-r7b-arabic-02-2025", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0375, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Command R7B Arabic" + ], + "families": [ + "command-r" + ], + "knowledgeCutoff": "2024-06-01", + "releaseDate": "2025-02-27", + "lastUpdated": "2025-02-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cohere", + "providerName": "Cohere", + "providerDoc": "https://docs.cohere.com/docs/models", + "model": "command-r7b-arabic-02-2025", + "modelKey": "command-r7b-arabic-02-2025", + "displayName": "Command R7B Arabic", + "family": "command-r", + "metadata": { + "knowledgeCutoff": "2024-06-01", + "lastUpdated": "2025-02-27", + "openWeights": true, + "releaseDate": "2025-02-27" + } + } + ] + }, + { + "id": "cohere/embed-english-light-v2.0", + "provider": "cohere", + "model": "embed-english-light-v2.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/embed-english-light-v2.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1024, + "inputTokens": 1024, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cohere", + "model": "embed-english-light-v2.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere", + "model": "embed-english-light-v2.0", + "mode": "embedding" + } + ] + }, + { + "id": "cohere/embed-english-light-v3.0", + "provider": "cohere", + "model": "embed-english-light-v3.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/embed-english-light-v3.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1024, + "inputTokens": 1024, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cohere", + "model": "embed-english-light-v3.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere", + "model": "embed-english-light-v3.0", + "mode": "embedding" + } + ] + }, + { + "id": "cohere/embed-english-v2.0", + "provider": "cohere", + "model": "embed-english-v2.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/embed-english-v2.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cohere", + "model": "embed-english-v2.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere", + "model": "embed-english-v2.0", + "mode": "embedding" + } + ] + }, + { + "id": "cohere/embed-english-v3.0", + "provider": "cohere", + "model": "embed-english-v3.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/embed-english-v3.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1024, + "inputTokens": 1024, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cohere", + "model": "embed-english-v3.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + }, + "perImage": { + "input": 0.0001 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere", + "model": "embed-english-v3.0", + "mode": "embedding", + "metadata": { + "metadata": { + "notes": "'supports_image_input' is a deprecated field. Use 'supports_embedding_image_input' instead." + } + } + } + ] + }, + { + "id": "cohere/embed-multilingual-light-v3.0", + "provider": "cohere", + "model": "embed-multilingual-light-v3.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/embed-multilingual-light-v3.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1024, + "inputTokens": 1024, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cohere", + "model": "embed-multilingual-light-v3.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 100, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere", + "model": "embed-multilingual-light-v3.0", + "mode": "embedding" + } + ] + }, + { + "id": "cohere/embed-multilingual-v2.0", + "provider": "cohere", + "model": "embed-multilingual-v2.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/embed-multilingual-v2.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 768, + "inputTokens": 768, + "maxTokens": 768, + "outputTokens": 768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cohere", + "model": "embed-multilingual-v2.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere", + "model": "embed-multilingual-v2.0", + "mode": "embedding" + } + ] + }, + { + "id": "cohere/embed-multilingual-v3.0", + "provider": "cohere", + "model": "embed-multilingual-v3.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/embed-multilingual-v3.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1024, + "inputTokens": 1024, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cohere", + "model": "embed-multilingual-v3.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere", + "model": "embed-multilingual-v3.0", + "mode": "embedding" + } + ] + }, + { + "id": "cohere/embed-v4.0", + "provider": "cohere", + "model": "embed-v4.0", + "displayName": "Embed v4.0", + "family": "cohere-embed", + "mode": "embedding", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "cohere", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "cohere/embed-v4.0", + "vercel/cohere/embed-v4.0", + "vercel_ai_gateway/cohere/embed-v4.0" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "outputVectorSize": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "embedding", + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cohere", + "model": "cohere/embed-v4.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/cohere/embed-v4.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Embed v4.0" + ], + "families": [ + "cohere-embed" + ], + "modes": [ + "chat", + "embedding" + ], + "releaseDate": "2025-04-15", + "lastUpdated": "2025-04-15", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "cohere/embed-v4.0", + "modelKey": "cohere/embed-v4.0", + "displayName": "Embed v4.0", + "family": "cohere-embed", + "metadata": { + "lastUpdated": "2025-04-15", + "openWeights": false, + "releaseDate": "2025-04-15" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere", + "model": "cohere/embed-v4.0", + "mode": "embedding" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/cohere/embed-v4.0", + "mode": "chat" + } + ] + }, + { + "id": "cohere/north-mini-code-1-0", + "provider": "cohere", + "model": "north-mini-code-1-0", + "displayName": "North Mini Code", + "family": "north", + "sources": [ + "models.dev" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/north-mini-code-1-0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cohere", + "model": "north-mini-code-1-0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "North Mini Code" + ], + "families": [ + "north" + ], + "knowledgeCutoff": "2025-09-23", + "releaseDate": "2026-06-09", + "lastUpdated": "2026-06-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cohere", + "providerName": "Cohere", + "providerDoc": "https://docs.cohere.com/docs/models", + "model": "north-mini-code-1-0", + "modelKey": "north-mini-code-1-0", + "displayName": "North Mini Code", + "family": "north", + "metadata": { + "knowledgeCutoff": "2025-09-23", + "lastUpdated": "2026-06-09", + "openWeights": true, + "releaseDate": "2026-06-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "cohere/north-mini-code:free", + "provider": "cohere", + "model": "north-mini-code:free", + "displayName": "North Mini Code (free)", + "family": "north", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/cohere/north-mini-code:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "cohere/north-mini-code:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "cohere/north-mini-code:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cohere: North Mini Code (free)", + "North Mini Code (free)" + ], + "families": [ + "north" + ], + "releaseDate": "2026-06-17", + "lastUpdated": "2026-06-17", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "cohere/north-mini-code:free", + "modelKey": "cohere/north-mini-code:free", + "displayName": "North Mini Code (free)", + "family": "north", + "metadata": { + "lastUpdated": "2026-06-17", + "openWeights": true, + "releaseDate": "2026-06-17" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "cohere/north-mini-code:free", + "displayName": "Cohere: North Mini Code (free)", + "metadata": { + "canonicalSlug": "cohere/north-mini-code-20260617", + "createdAt": "2026-06-17T19:15:48.000Z", + "huggingFaceId": "CohereLabs/North-Mini-Code-1.0", + "links": { + "details": "/api/v1/models/cohere/north-mini-code-20260617/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Cohere", + "topProvider": { + "context_length": 256000, + "max_completion_tokens": 64000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "cohere/rerank-english-v2.0", + "provider": "cohere", + "model": "rerank-english-v2.0", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/rerank-english-v2.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxQueryTokens": 2048, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cohere", + "model": "rerank-english-v2.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perQuery": { + "input": 0.002 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere", + "model": "rerank-english-v2.0", + "mode": "rerank" + } + ] + }, + { + "id": "cohere/rerank-english-v3.0", + "provider": "cohere", + "model": "rerank-english-v3.0", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/rerank-english-v3.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxQueryTokens": 2048, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cohere", + "model": "rerank-english-v3.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perQuery": { + "input": 0.002 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere", + "model": "rerank-english-v3.0", + "mode": "rerank" + } + ] + }, + { + "id": "cohere/rerank-multilingual-v2.0", + "provider": "cohere", + "model": "rerank-multilingual-v2.0", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/rerank-multilingual-v2.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxQueryTokens": 2048, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cohere", + "model": "rerank-multilingual-v2.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perQuery": { + "input": 0.002 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere", + "model": "rerank-multilingual-v2.0", + "mode": "rerank" + } + ] + }, + { + "id": "cohere/rerank-multilingual-v3.0", + "provider": "cohere", + "model": "rerank-multilingual-v3.0", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "cohere" + ], + "aliases": [ + "cohere/rerank-multilingual-v3.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxQueryTokens": 2048, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cohere", + "model": "rerank-multilingual-v3.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perQuery": { + "input": 0.002 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere", + "model": "rerank-multilingual-v3.0", + "mode": "rerank" + } + ] + }, + { + "id": "cohere/rerank-v3.5", + "provider": "cohere", + "model": "rerank-v3.5", + "displayName": "Cohere Rerank 3.5", + "family": "o", + "mode": "rerank", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "cohere", + "vercel" + ], + "aliases": [ + "cohere/rerank-v3.5", + "vercel/cohere/rerank-v3.5" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxQueryTokens": 2048, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score", + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cohere", + "model": "rerank-v3.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perQuery": { + "input": 0.002 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cohere Rerank 3.5" + ], + "families": [ + "o" + ], + "modes": [ + "rerank" + ], + "releaseDate": "2024-12-02", + "lastUpdated": "2024-12-02", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "cohere/rerank-v3.5", + "modelKey": "cohere/rerank-v3.5", + "displayName": "Cohere Rerank 3.5", + "family": "o", + "metadata": { + "lastUpdated": "2024-12-02", + "openWeights": false, + "releaseDate": "2024-12-02" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cohere", + "model": "rerank-v3.5", + "mode": "rerank" + } + ] + }, + { + "id": "cohere/rerank-v4-fast", + "provider": "cohere", + "model": "rerank-v4-fast", + "displayName": "Cohere Rerank 4 Fast", + "family": "o", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/cohere/rerank-v4-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Cohere Rerank 4 Fast" + ], + "families": [ + "o" + ], + "releaseDate": "2025-12-11", + "lastUpdated": "2025-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "cohere/rerank-v4-fast", + "modelKey": "cohere/rerank-v4-fast", + "displayName": "Cohere Rerank 4 Fast", + "family": "o", + "metadata": { + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + } + ] + }, + { + "id": "cohere/rerank-v4-pro", + "provider": "cohere", + "model": "rerank-v4-pro", + "displayName": "Cohere Rerank 4 Pro", + "family": "o", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/cohere/rerank-v4-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Cohere Rerank 4 Pro" + ], + "families": [ + "o" + ], + "releaseDate": "2025-12-11", + "lastUpdated": "2025-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "cohere/rerank-v4-pro", + "modelKey": "cohere/rerank-v4-pro", + "displayName": "Cohere Rerank 4 Pro", + "family": "o", + "metadata": { + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + } + ] + }, + { + "id": "cortecs/hermes-4-70b", + "provider": "cortecs", + "model": "hermes-4-70b", + "displayName": "Hermes 4 70B", + "sources": [ + "models.dev" + ], + "providers": [ + "cortecs" + ], + "aliases": [ + "cortecs/hermes-4-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "hermes-4-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.116, + "output": 0.358 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes 4 70B" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2025-08-26", + "lastUpdated": "2025-08-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "hermes-4-70b", + "modelKey": "hermes-4-70b", + "displayName": "Hermes 4 70B", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2025-08-26", + "openWeights": true, + "releaseDate": "2025-08-26" + } + } + ] + }, + { + "id": "cortecs/intellect-3", + "provider": "cortecs", + "model": "intellect-3", + "displayName": "INTELLECT 3", + "sources": [ + "models.dev" + ], + "providers": [ + "cortecs" + ], + "aliases": [ + "cortecs/intellect-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "intellect-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.219, + "output": 1.202 + } + } + ] + }, + "metadata": { + "displayNames": [ + "INTELLECT 3" + ], + "knowledgeCutoff": "2025-11", + "releaseDate": "2025-11-26", + "lastUpdated": "2025-11-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "intellect-3", + "modelKey": "intellect-3", + "displayName": "INTELLECT 3", + "metadata": { + "knowledgeCutoff": "2025-11", + "lastUpdated": "2025-11-26", + "openWeights": true, + "releaseDate": "2025-11-26" + } + } + ] + }, + { + "id": "cortecs/nemotron-3-super-120b-a12b", + "provider": "cortecs", + "model": "nemotron-3-super-120b-a12b", + "displayName": "Nemotron 3 Super 120B A12B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "cortecs" + ], + "aliases": [ + "cortecs/nemotron-3-super-120b-a12b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "nemotron-3-super-120b-a12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.266, + "output": 0.799 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron 3 Super 120B A12B" + ], + "families": [ + "nemotron" + ], + "knowledgeCutoff": "2025-12", + "releaseDate": "2026-03-11", + "lastUpdated": "2026-03-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "nemotron-3-super-120b-a12b", + "modelKey": "nemotron-3-super-120b-a12b", + "displayName": "Nemotron 3 Super 120B A12B", + "family": "nemotron", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2026-03-11", + "openWeights": true, + "releaseDate": "2026-03-11" + } + } + ] + }, + { + "id": "crof/gemma-4-31b-it", + "provider": "crof", + "model": "gemma-4-31b-it", + "displayName": "Gemma 4 31B IT", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "crof" + ], + "aliases": [ + "crof/gemma-4-31b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "crof", + "model": "gemma-4-31b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B IT" + ], + "families": [ + "gemma" + ], + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "gemma-4-31b-it", + "modelKey": "gemma-4-31b-it", + "displayName": "Gemma 4 31B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "crof/greg-1-mini", + "provider": "crof", + "model": "greg-1-mini", + "displayName": "Greg 1 Mini", + "sources": [ + "models.dev" + ], + "providers": [ + "crof" + ], + "aliases": [ + "crof/greg-1-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 229376, + "outputTokens": 229376, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "crof", + "model": "greg-1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.07, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Greg 1 Mini" + ], + "releaseDate": "2026-01-27", + "lastUpdated": "2026-01-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "greg-1-mini", + "modelKey": "greg-1-mini", + "displayName": "Greg 1 Mini", + "metadata": { + "lastUpdated": "2026-01-27", + "openWeights": false, + "releaseDate": "2026-01-27" + } + } + ] + }, + { + "id": "crof/greg-2-super", + "provider": "crof", + "model": "greg-2-super", + "displayName": "Greg 2 Super", + "sources": [ + "models.dev" + ], + "providers": [ + "crof" + ], + "aliases": [ + "crof/greg-2-super" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 229376, + "outputTokens": 229376, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "crof", + "model": "greg-2-super", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 1.5, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Greg 2 Super" + ], + "releaseDate": "2026-06-14", + "lastUpdated": "2026-06-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "greg-2-super", + "modelKey": "greg-2-super", + "displayName": "Greg 2 Super", + "metadata": { + "lastUpdated": "2026-06-14", + "openWeights": false, + "releaseDate": "2026-06-14" + } + } + ] + }, + { + "id": "crof/greg-2-ultra", + "provider": "crof", + "model": "greg-2-ultra", + "displayName": "Greg 2 Ultra", + "sources": [ + "models.dev" + ], + "providers": [ + "crof" + ], + "aliases": [ + "crof/greg-2-ultra" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 229376, + "outputTokens": 229376, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "crof", + "model": "greg-2-ultra", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 3, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Greg 2 Ultra" + ], + "releaseDate": "2026-06-14", + "lastUpdated": "2026-06-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "greg-2-ultra", + "modelKey": "greg-2-ultra", + "displayName": "Greg 2 Ultra", + "metadata": { + "lastUpdated": "2026-06-14", + "openWeights": false, + "releaseDate": "2026-06-14" + } + } + ] + }, + { + "id": "crof/greg-rp", + "provider": "crof", + "model": "greg-rp", + "displayName": "Greg (Roleplay)", + "sources": [ + "models.dev" + ], + "providers": [ + "crof" + ], + "aliases": [ + "crof/greg-rp" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 229376, + "outputTokens": 229376, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "crof", + "model": "greg-rp", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Greg (Roleplay)" + ], + "releaseDate": "2026-01-27", + "lastUpdated": "2026-01-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "greg-rp", + "modelKey": "greg-rp", + "displayName": "Greg (Roleplay)", + "metadata": { + "lastUpdated": "2026-01-27", + "openWeights": false, + "releaseDate": "2026-01-27" + } + } + ] + }, + { + "id": "crof/mimo-v2.5-pro", + "provider": "crof", + "model": "mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "crof" + ], + "aliases": [ + "crof/mimo-v2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "crof", + "model": "mimo-v2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003, + "input": 0.4, + "output": 0.8 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.4, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "mimo-v2.5-pro", + "modelKey": "mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "databricks/databricks-bge-large-en", + "provider": "databricks", + "model": "databricks-bge-large-en", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-bge-large-en" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "outputVectorSize": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-bge-large-en", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.10003, + "output": 0 + }, + "extra": { + "input_dbu_cost_per_token": 0.000001429, + "output_dbu_cost_per_token": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-bge-large-en", + "mode": "embedding", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070, based on databricks Llama 3.1 70B conversion. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-claude-3-7-sonnet", + "provider": "databricks", + "model": "databricks-claude-3-7-sonnet", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-claude-3-7-sonnet" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-claude-3-7-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.99999, + "output": 15.00002 + }, + "extra": { + "input_dbu_cost_per_token": 0.000042857, + "output_dbu_cost_per_token": 0.000214286 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-claude-3-7-sonnet", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/proprietary-foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-claude-haiku-4-5", + "provider": "databricks", + "model": "databricks-claude-haiku-4-5", + "displayName": "Claude Haiku 4.5 (latest)", + "family": "claude-haiku", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-claude-haiku-4-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-claude-haiku-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + }, + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-claude-haiku-4-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.00002, + "output": 5.00003 + }, + "extra": { + "input_dbu_cost_per_token": 0.000014286, + "output_dbu_cost_per_token": 0.000071429 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Haiku 4.5 (latest)" + ], + "families": [ + "claude-haiku" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-02-28", + "releaseDate": "2025-10-15", + "lastUpdated": "2025-10-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-claude-haiku-4-5", + "modelKey": "databricks-claude-haiku-4-5", + "displayName": "Claude Haiku 4.5 (latest)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-claude-haiku-4-5", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/proprietary-foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-claude-opus-4", + "provider": "databricks", + "model": "databricks-claude-opus-4", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-claude-opus-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-claude-opus-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 15.00002, + "output": 75.00003 + }, + "extra": { + "input_dbu_cost_per_token": 0.000214286, + "output_dbu_cost_per_token": 0.001071429 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-claude-opus-4", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/proprietary-foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-claude-opus-4-1", + "provider": "databricks", + "model": "databricks-claude-opus-4-1", + "displayName": "Claude Opus 4.1 (latest)", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-claude-opus-4-1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-claude-opus-4-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + }, + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-claude-opus-4-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 15.00002, + "output": 75.00003 + }, + "extra": { + "input_dbu_cost_per_token": 0.000214286, + "output_dbu_cost_per_token": 0.001071429 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.1 (latest)" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-claude-opus-4-1", + "modelKey": "databricks-claude-opus-4-1", + "displayName": "Claude Opus 4.1 (latest)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-claude-opus-4-1", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/proprietary-foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-claude-opus-4-5", + "provider": "databricks", + "model": "databricks-claude-opus-4-5", + "displayName": "Claude Opus 4.5 (latest)", + "family": "claude-opus", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-claude-opus-4-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-claude-opus-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + }, + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-claude-opus-4-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5.00003, + "output": 25.00001 + }, + "extra": { + "input_dbu_cost_per_token": 0.000071429, + "output_dbu_cost_per_token": 0.000357143 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.5 (latest)" + ], + "families": [ + "claude-opus" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-11-24", + "lastUpdated": "2025-11-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-claude-opus-4-5", + "modelKey": "databricks-claude-opus-4-5", + "displayName": "Claude Opus 4.5 (latest)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-24", + "openWeights": false, + "releaseDate": "2025-11-24" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-claude-opus-4-5", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/proprietary-foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-claude-opus-4-6", + "provider": "databricks", + "model": "databricks-claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-claude-opus-4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-claude-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.6" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-05-31", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-claude-opus-4-6", + "modelKey": "databricks-claude-opus-4-6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05" + } + } + ] + }, + { + "id": "databricks/databricks-claude-opus-4-7", + "provider": "databricks", + "model": "databricks-claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-claude-opus-4-7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-claude-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.7" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-claude-opus-4-7", + "modelKey": "databricks-claude-opus-4-7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + } + ] + }, + { + "id": "databricks/databricks-claude-sonnet-4", + "provider": "databricks", + "model": "databricks-claude-sonnet-4", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-claude-sonnet-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-claude-sonnet-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-claude-sonnet-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.99999, + "output": 15.00002 + }, + "extra": { + "input_dbu_cost_per_token": 0.000042857, + "output_dbu_cost_per_token": 0.000214286 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.5" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-07-31", + "releaseDate": "2025-09-29", + "lastUpdated": "2025-09-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-claude-sonnet-4", + "modelKey": "databricks-claude-sonnet-4", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-claude-sonnet-4", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/proprietary-foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-claude-sonnet-4-1", + "provider": "databricks", + "model": "databricks-claude-sonnet-4-1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-claude-sonnet-4-1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-claude-sonnet-4-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.99999, + "output": 15.00002 + }, + "extra": { + "input_dbu_cost_per_token": 0.000042857, + "output_dbu_cost_per_token": 0.000214286 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-claude-sonnet-4-1", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/proprietary-foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-claude-sonnet-4-5", + "provider": "databricks", + "model": "databricks-claude-sonnet-4-5", + "displayName": "Claude Sonnet 4.5 (latest)", + "family": "claude-sonnet", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-claude-sonnet-4-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-claude-sonnet-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-claude-sonnet-4-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.99999, + "output": 15.00002 + }, + "extra": { + "input_dbu_cost_per_token": 0.000042857, + "output_dbu_cost_per_token": 0.000214286 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.5 (latest)" + ], + "families": [ + "claude-sonnet" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-07-31", + "releaseDate": "2025-09-29", + "lastUpdated": "2025-09-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-claude-sonnet-4-5", + "modelKey": "databricks-claude-sonnet-4-5", + "displayName": "Claude Sonnet 4.5 (latest)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-claude-sonnet-4-5", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/proprietary-foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-claude-sonnet-4-6", + "provider": "databricks", + "model": "databricks-claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-claude-sonnet-4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-claude-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.6" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-17", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-claude-sonnet-4-6", + "modelKey": "databricks-claude-sonnet-4-6", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17" + } + } + ] + }, + { + "id": "databricks/databricks-gemini-2-5-flash", + "provider": "databricks", + "model": "databricks-gemini-2-5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gemini-2-5-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxTokens": 65535, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-gemini-2-5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-gemini-2-5-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.30002, + "output": 2.49998 + }, + "extra": { + "input_dbu_cost_per_token": 0.000004285999999999999, + "output_dbu_cost_per_token": 0.000035714 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Flash" + ], + "families": [ + "gemini-flash" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-06-17", + "lastUpdated": "2025-06-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-gemini-2-5-flash", + "modelKey": "databricks-gemini-2-5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-gemini-2-5-flash", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/proprietary-foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-gemini-2-5-pro", + "provider": "databricks", + "model": "databricks-gemini-2-5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gemini-2-5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-gemini-2-5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 15, + "cache_read": 0.25 + }, + "tiers": [ + { + "input": 2.5, + "output": 15, + "cache_read": 0.25, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-gemini-2-5-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.24999, + "output": 9.99999 + }, + "extra": { + "input_dbu_cost_per_token": 0.000017857, + "output_dbu_cost_per_token": 0.000142857 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Pro" + ], + "families": [ + "gemini-pro" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-06-17", + "lastUpdated": "2025-06-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-gemini-2-5-pro", + "modelKey": "databricks-gemini-2-5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-gemini-2-5-pro", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/proprietary-foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-gemini-3-1-flash-lite", + "provider": "databricks", + "model": "databricks-gemini-3-1-flash-lite", + "displayName": "Gemini 3.1 Flash Lite Preview", + "family": "gemini-flash-lite", + "sources": [ + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gemini-3-1-flash-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-gemini-3-1-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3.1 Flash Lite Preview" + ], + "families": [ + "gemini-flash-lite" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-03-03", + "lastUpdated": "2026-03-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-gemini-3-1-flash-lite", + "modelKey": "databricks-gemini-3-1-flash-lite", + "displayName": "Gemini 3.1 Flash Lite Preview", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + } + ] + }, + { + "id": "databricks/databricks-gemini-3-1-pro", + "provider": "databricks", + "model": "databricks-gemini-3-1-pro", + "displayName": "Gemini 3.1 Pro Preview Custom Tools", + "family": "gemini-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gemini-3-1-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-gemini-3-1-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3.1 Pro Preview Custom Tools" + ], + "families": [ + "gemini-pro" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-02-19", + "lastUpdated": "2026-02-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-gemini-3-1-pro", + "modelKey": "databricks-gemini-3-1-pro", + "displayName": "Gemini 3.1 Pro Preview Custom Tools", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19" + } + } + ] + }, + { + "id": "databricks/databricks-gemini-3-flash", + "provider": "databricks", + "model": "databricks-gemini-3-flash", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "sources": [ + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gemini-3-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-gemini-3-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "inputAudio": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3 Flash Preview" + ], + "families": [ + "gemini-flash" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-12-17", + "lastUpdated": "2025-12-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-gemini-3-flash", + "modelKey": "databricks-gemini-3-flash", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17" + } + } + ] + }, + { + "id": "databricks/databricks-gemini-3-pro", + "provider": "databricks", + "model": "databricks-gemini-3-pro", + "displayName": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gemini-3-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-gemini-3-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3 Pro Preview" + ], + "families": [ + "gemini-pro" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-11-18", + "lastUpdated": "2025-11-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-gemini-3-pro", + "modelKey": "databricks-gemini-3-pro", + "displayName": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18" + } + } + ] + }, + { + "id": "databricks/databricks-gemma-3-12b", + "provider": "databricks", + "model": "databricks-gemma-3-12b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gemma-3-12b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-gemma-3-12b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15001, + "output": 0.50001 + }, + "extra": { + "input_dbu_cost_per_token": 0.0000021429999999999996, + "output_dbu_cost_per_token": 0.000007143 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-gemma-3-12b", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-gpt-5", + "provider": "databricks", + "model": "databricks-gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gpt-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-gpt-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.24999, + "output": 9.99999 + }, + "extra": { + "input_dbu_cost_per_token": 0.000017857, + "output_dbu_cost_per_token": 0.000142857 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2025-08-07", + "lastUpdated": "2025-08-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-gpt-5", + "modelKey": "databricks-gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-gpt-5", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/proprietary-foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-gpt-5-1", + "provider": "databricks", + "model": "databricks-gpt-5-1", + "displayName": "GPT-5.1", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gpt-5-1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-gpt-5-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-gpt-5-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.24999, + "output": 9.99999 + }, + "extra": { + "input_dbu_cost_per_token": 0.000017857, + "output_dbu_cost_per_token": 0.000142857 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.1" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2025-11-13", + "lastUpdated": "2025-11-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-gpt-5-1", + "modelKey": "databricks-gpt-5-1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-gpt-5-1", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/proprietary-foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-gpt-5-2", + "provider": "databricks", + "model": "databricks-gpt-5-2", + "displayName": "GPT-5.2", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gpt-5-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-gpt-5-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.2" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2025-12-11", + "lastUpdated": "2025-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-gpt-5-2", + "modelKey": "databricks-gpt-5-2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + } + ] + }, + { + "id": "databricks/databricks-gpt-5-4", + "provider": "databricks", + "model": "databricks-gpt-5-4", + "displayName": "GPT-5.4", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gpt-5-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1050000, + "inputTokens": 922000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-gpt-5-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 5, + "output": 22.5, + "cache_read": 0.5 + }, + "tiers": [ + { + "input": 5, + "output": 22.5, + "cache_read": 0.5, + "tier": { + "size": 272000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.4" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-05", + "lastUpdated": "2026-03-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-gpt-5-4", + "modelKey": "databricks-gpt-5-4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + } + ] + }, + { + "id": "databricks/databricks-gpt-5-4-mini", + "provider": "databricks", + "model": "databricks-gpt-5-4-mini", + "displayName": "GPT-5.4 mini", + "family": "gpt-mini", + "sources": [ + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gpt-5-4-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-gpt-5-4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.4 mini" + ], + "families": [ + "gpt-mini" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-17", + "lastUpdated": "2026-03-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-gpt-5-4-mini", + "modelKey": "databricks-gpt-5-4-mini", + "displayName": "GPT-5.4 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + } + ] + }, + { + "id": "databricks/databricks-gpt-5-4-nano", + "provider": "databricks", + "model": "databricks-gpt-5-4-nano", + "displayName": "GPT-5.4 nano", + "family": "gpt-nano", + "sources": [ + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gpt-5-4-nano" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-gpt-5-4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.4 nano" + ], + "families": [ + "gpt-nano" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-17", + "lastUpdated": "2026-03-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-gpt-5-4-nano", + "modelKey": "databricks-gpt-5-4-nano", + "displayName": "GPT-5.4 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + } + ] + }, + { + "id": "databricks/databricks-gpt-5-5", + "provider": "databricks", + "model": "databricks-gpt-5-5", + "displayName": "GPT-5.5", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gpt-5-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1050000, + "inputTokens": 922000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-gpt-5-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 45, + "cache_read": 1 + }, + "tiers": [ + { + "input": 10, + "output": 45, + "cache_read": 1, + "tier": { + "size": 272000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.5" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-12-01", + "releaseDate": "2026-04-23", + "lastUpdated": "2026-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-gpt-5-5", + "modelKey": "databricks-gpt-5-5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + } + ] + }, + { + "id": "databricks/databricks-gpt-5-mini", + "provider": "databricks", + "model": "databricks-gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gpt-5-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-gpt-5-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.24997, + "output": 1.99997 + }, + "extra": { + "input_dbu_cost_per_token": 0.000003571, + "output_dbu_cost_per_token": 0.000028571 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5 Mini" + ], + "families": [ + "gpt-mini" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-05-30", + "releaseDate": "2025-08-07", + "lastUpdated": "2025-08-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-gpt-5-mini", + "modelKey": "databricks-gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-gpt-5-mini", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/proprietary-foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-gpt-5-nano", + "provider": "databricks", + "model": "databricks-gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gpt-5-nano" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-gpt-5-nano", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04998, + "output": 0.39998 + }, + "extra": { + "input_dbu_cost_per_token": 7.14e-7, + "output_dbu_cost_per_token": 0.000005714000000000001 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5 Nano" + ], + "families": [ + "gpt-nano" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-05-30", + "releaseDate": "2025-08-07", + "lastUpdated": "2025-08-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-gpt-5-nano", + "modelKey": "databricks-gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-gpt-5-nano", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/proprietary-foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-gpt-oss-120b", + "provider": "databricks", + "model": "databricks-gpt-oss-120b", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gpt-oss-120b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.072, + "output": 0.28 + } + }, + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-gpt-oss-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15001, + "output": 0.59997 + }, + "extra": { + "input_dbu_cost_per_token": 0.0000021429999999999996, + "output_dbu_cost_per_token": 0.000008571 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT OSS 120B" + ], + "families": [ + "gpt-oss" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-gpt-oss-120b", + "modelKey": "databricks-gpt-oss-120b", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-gpt-oss-120b", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-gpt-oss-20b", + "provider": "databricks", + "model": "databricks-gpt-oss-20b", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gpt-oss-20b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "databricks", + "model": "databricks-gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-gpt-oss-20b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0.30002 + }, + "extra": { + "input_dbu_cost_per_token": 0.000001, + "output_dbu_cost_per_token": 0.000004285999999999999 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT OSS 20B" + ], + "families": [ + "gpt-oss" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "databricks", + "providerName": "Databricks", + "providerApi": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "providerDoc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "model": "databricks-gpt-oss-20b", + "modelKey": "databricks-gpt-oss-20b", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-gpt-oss-20b", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-gte-large-en", + "provider": "databricks", + "model": "databricks-gte-large-en", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-gte-large-en" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "outputVectorSize": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-gte-large-en", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12999, + "output": 0 + }, + "extra": { + "input_dbu_cost_per_token": 0.000001857, + "output_dbu_cost_per_token": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-gte-large-en", + "mode": "embedding", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070, based on databricks Llama 3.1 70B conversion. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-llama-2-70b-chat", + "provider": "databricks", + "model": "databricks-llama-2-70b-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-llama-2-70b-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-llama-2-70b-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.50001, + "output": 1.50003 + }, + "extra": { + "input_dbu_cost_per_token": 0.000007143, + "output_dbu_cost_per_token": 0.000021429 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-llama-2-70b-chat", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070, based on databricks Llama 3.1 70B conversion. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-llama-4-maverick", + "provider": "databricks", + "model": "databricks-llama-4-maverick", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-llama-4-maverick" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-llama-4-maverick", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.50001, + "output": 1.50003 + }, + "extra": { + "input_dbu_cost_per_token": 0.000007143, + "output_dbu_cost_per_token": 0.000021429 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-llama-4-maverick", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Databricks documentation now provides both DBU costs (_dbu_cost_per_token) and dollar costs(_cost_per_token)." + }, + "source": "https://www.databricks.com/product/pricing/foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-meta-llama-3-1-405b-instruct", + "provider": "databricks", + "model": "databricks-meta-llama-3-1-405b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-meta-llama-3-1-405b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-meta-llama-3-1-405b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5.00003, + "output": 15.00002 + }, + "extra": { + "input_dbu_cost_per_token": 0.000071429, + "output_dbu_cost_per_token": 0.000214286 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-meta-llama-3-1-405b-instruct", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070, based on databricks Llama 3.1 70B conversion. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-meta-llama-3-1-8b-instruct", + "provider": "databricks", + "model": "databricks-meta-llama-3-1-8b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-meta-llama-3-1-8b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-meta-llama-3-1-8b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15001, + "output": 0.45003 + }, + "extra": { + "input_dbu_cost_per_token": 0.0000021429999999999996, + "output_dbu_cost_per_token": 0.000006429000000000001 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-meta-llama-3-1-8b-instruct", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-meta-llama-3-3-70b-instruct", + "provider": "databricks", + "model": "databricks-meta-llama-3-3-70b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-meta-llama-3-3-70b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-meta-llama-3-3-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.50001, + "output": 1.50003 + }, + "extra": { + "input_dbu_cost_per_token": 0.000007143, + "output_dbu_cost_per_token": 0.000021429 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-meta-llama-3-3-70b-instruct", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070, based on databricks Llama 3.1 70B conversion. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-meta-llama-3-70b-instruct", + "provider": "databricks", + "model": "databricks-meta-llama-3-70b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-meta-llama-3-70b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-meta-llama-3-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.00002, + "output": 2.99999 + }, + "extra": { + "input_dbu_cost_per_token": 0.000014286, + "output_dbu_cost_per_token": 0.000042857 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-meta-llama-3-70b-instruct", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070, based on databricks Llama 3.1 70B conversion. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-mixtral-8x7b-instruct", + "provider": "databricks", + "model": "databricks-mixtral-8x7b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-mixtral-8x7b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-mixtral-8x7b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.50001, + "output": 1.00002 + }, + "extra": { + "input_dbu_cost_per_token": 0.000007143, + "output_dbu_cost_per_token": 0.000014286 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-mixtral-8x7b-instruct", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070, based on databricks Llama 3.1 70B conversion. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-mpt-30b-instruct", + "provider": "databricks", + "model": "databricks-mpt-30b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-mpt-30b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-mpt-30b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.00002, + "output": 1.00002 + }, + "extra": { + "input_dbu_cost_per_token": 0.000014286, + "output_dbu_cost_per_token": 0.000014286 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-mpt-30b-instruct", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070, based on databricks Llama 3.1 70B conversion. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/foundation-model-serving" + } + } + ] + }, + { + "id": "databricks/databricks-mpt-7b-instruct", + "provider": "databricks", + "model": "databricks-mpt-7b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "databricks" + ], + "aliases": [ + "databricks/databricks-mpt-7b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "databricks", + "model": "databricks/databricks-mpt-7b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.50001, + "output": 0 + }, + "extra": { + "input_dbu_cost_per_token": 0.000007143, + "output_dbu_cost_per_token": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "databricks", + "model": "databricks/databricks-mpt-7b-instruct", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Input/output cost per token is dbu cost * $0.070, based on databricks Llama 3.1 70B conversion. Number provided for reference, '*_dbu_cost_per_token' used in actual calculation." + }, + "source": "https://www.databricks.com/product/pricing/foundation-model-serving" + } + } + ] + }, + { + "id": "dataforseo/search", + "provider": "dataforseo", + "model": "search", + "mode": "search", + "sources": [ + "litellm" + ], + "providers": [ + "dataforseo" + ], + "aliases": [ + "dataforseo/search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "dataforseo", + "model": "dataforseo/search", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perQuery": { + "input": 0.003 + } + } + ] + }, + "metadata": { + "modes": [ + "search" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "dataforseo", + "model": "dataforseo/search", + "mode": "search" + } + ] + }, + { + "id": "deepgram/base", + "provider": "deepgram", + "model": "base", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/base" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/base", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00020833 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/base", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0125/60 seconds = $0.00020833 per second", + "original_pricing_per_minute": 0.0125 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "deepgram/base-conversationalai", + "provider": "deepgram", + "model": "base-conversationalai", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/base-conversationalai" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/base-conversationalai", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00020833 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/base-conversationalai", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0125/60 seconds = $0.00020833 per second", + "original_pricing_per_minute": 0.0125 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "deepgram/base-finance", + "provider": "deepgram", + "model": "base-finance", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/base-finance" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/base-finance", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00020833 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/base-finance", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0125/60 seconds = $0.00020833 per second", + "original_pricing_per_minute": 0.0125 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "deepgram/base-general", + "provider": "deepgram", + "model": "base-general", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/base-general" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/base-general", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00020833 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/base-general", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0125/60 seconds = $0.00020833 per second", + "original_pricing_per_minute": 0.0125 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "deepgram/base-meeting", + "provider": "deepgram", + "model": "base-meeting", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/base-meeting" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/base-meeting", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00020833 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/base-meeting", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0125/60 seconds = $0.00020833 per second", + "original_pricing_per_minute": 0.0125 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "deepgram/base-phonecall", + "provider": "deepgram", + "model": "base-phonecall", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/base-phonecall" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/base-phonecall", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00020833 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/base-phonecall", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0125/60 seconds = $0.00020833 per second", + "original_pricing_per_minute": 0.0125 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "deepgram/base-video", + "provider": "deepgram", + "model": "base-video", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/base-video" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/base-video", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00020833 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/base-video", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0125/60 seconds = $0.00020833 per second", + "original_pricing_per_minute": 0.0125 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "deepgram/base-voicemail", + "provider": "deepgram", + "model": "base-voicemail", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/base-voicemail" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/base-voicemail", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00020833 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/base-voicemail", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0125/60 seconds = $0.00020833 per second", + "original_pricing_per_minute": 0.0125 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "deepgram/enhanced", + "provider": "deepgram", + "model": "enhanced", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/enhanced" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/enhanced", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00024167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/enhanced", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0145/60 seconds = $0.00024167 per second", + "original_pricing_per_minute": 0.0145 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "deepgram/enhanced-finance", + "provider": "deepgram", + "model": "enhanced-finance", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/enhanced-finance" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/enhanced-finance", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00024167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/enhanced-finance", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0145/60 seconds = $0.00024167 per second", + "original_pricing_per_minute": 0.0145 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "deepgram/enhanced-general", + "provider": "deepgram", + "model": "enhanced-general", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/enhanced-general" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/enhanced-general", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00024167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/enhanced-general", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0145/60 seconds = $0.00024167 per second", + "original_pricing_per_minute": 0.0145 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "deepgram/enhanced-meeting", + "provider": "deepgram", + "model": "enhanced-meeting", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/enhanced-meeting" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/enhanced-meeting", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00024167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/enhanced-meeting", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0145/60 seconds = $0.00024167 per second", + "original_pricing_per_minute": 0.0145 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "deepgram/enhanced-phonecall", + "provider": "deepgram", + "model": "enhanced-phonecall", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/enhanced-phonecall" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/enhanced-phonecall", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00024167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/enhanced-phonecall", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0145/60 seconds = $0.00024167 per second", + "original_pricing_per_minute": 0.0145 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "deepgram/nova", + "provider": "deepgram", + "model": "nova", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/nova" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/nova", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00007167 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/nova", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.0043/60 seconds = $0.00007167 per second", + "original_pricing_per_minute": 0.0043 + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "deepgram/whisper", + "provider": "deepgram", + "model": "whisper", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/whisper" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/whisper", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.0001 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/whisper", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "notes": "Deepgram's hosted OpenAI Whisper models - pricing may differ from native Deepgram models" + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "deepinfra/hermes-3-llama-3.1-405b", + "provider": "deepinfra", + "model": "hermes-3-llama-3.1-405b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepinfra" + ], + "aliases": [ + "deepinfra/NousResearch/Hermes-3-Llama-3.1-405B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/NousResearch/Hermes-3-Llama-3.1-405B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/NousResearch/Hermes-3-Llama-3.1-405B", + "mode": "chat" + } + ] + }, + { + "id": "deepinfra/hermes-3-llama-3.1-70b", + "provider": "deepinfra", + "model": "hermes-3-llama-3.1-70b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepinfra" + ], + "aliases": [ + "deepinfra/NousResearch/Hermes-3-Llama-3.1-70B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/NousResearch/Hermes-3-Llama-3.1-70B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/NousResearch/Hermes-3-Llama-3.1-70B", + "mode": "chat" + } + ] + }, + { + "id": "deepinfra/l3-8b-lunaris-v1-turbo", + "provider": "deepinfra", + "model": "l3-8b-lunaris-v1-turbo", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepinfra" + ], + "aliases": [ + "deepinfra/Sao10K/L3-8B-Lunaris-v1-Turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Sao10K/L3-8B-Lunaris-v1-Turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.05 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Sao10K/L3-8B-Lunaris-v1-Turbo", + "mode": "chat" + } + ] + }, + { + "id": "deepinfra/l3.1-70b-euryale-v2.2", + "provider": "deepinfra", + "model": "l3.1-70b-euryale-v2.2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepinfra" + ], + "aliases": [ + "deepinfra/Sao10K/L3.1-70B-Euryale-v2.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Sao10K/L3.1-70B-Euryale-v2.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.65, + "output": 0.75 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Sao10K/L3.1-70B-Euryale-v2.2", + "mode": "chat" + } + ] + }, + { + "id": "deepinfra/l3.3-70b-euryale-v2.3", + "provider": "deepinfra", + "model": "l3.3-70b-euryale-v2.3", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepinfra" + ], + "aliases": [ + "deepinfra/Sao10K/L3.3-70B-Euryale-v2.3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Sao10K/L3.3-70B-Euryale-v2.3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.65, + "output": 0.75 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Sao10K/L3.3-70B-Euryale-v2.3", + "mode": "chat" + } + ] + }, + { + "id": "deepinfra/mimo-v2.5", + "provider": "deepinfra", + "model": "mimo-v2.5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "deepinfra" + ], + "aliases": [ + "deepinfra/XiaomiMiMo/MiMo-V2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "deepinfra", + "model": "XiaomiMiMo/MiMo-V2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.4, + "output": 2 + }, + "tiered": { + "contextOver200K": { + "input": 0.8, + "output": 4, + "cache_read": 0.16 + }, + "tiers": [ + { + "input": 0.8, + "output": 4, + "cache_read": 0.16, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "XiaomiMiMo/MiMo-V2.5", + "modelKey": "XiaomiMiMo/MiMo-V2.5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "deepinfra/mimo-v2.5-pro", + "provider": "deepinfra", + "model": "mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "deepinfra" + ], + "aliases": [ + "deepinfra/XiaomiMiMo/MiMo-V2.5-Pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 16384, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "deepinfra", + "model": "XiaomiMiMo/MiMo-V2.5-Pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.4, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "XiaomiMiMo/MiMo-V2.5-Pro", + "modelKey": "XiaomiMiMo/MiMo-V2.5-Pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "deepinfra/mythomax-l2-13b", + "provider": "deepinfra", + "model": "mythomax-l2-13b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepinfra" + ], + "aliases": [ + "deepinfra/Gryphe/MythoMax-L2-13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/Gryphe/MythoMax-L2-13b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.09 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/Gryphe/MythoMax-L2-13b", + "mode": "chat" + } + ] + }, + { + "id": "deepinfra/nvidia-nemotron-nano-9b-v2", + "provider": "deepinfra", + "model": "nvidia-nemotron-nano-9b-v2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepinfra" + ], + "aliases": [ + "deepinfra/nvidia/NVIDIA-Nemotron-Nano-9B-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/nvidia/NVIDIA-Nemotron-Nano-9B-v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.16 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/nvidia/NVIDIA-Nemotron-Nano-9B-v2", + "mode": "chat" + } + ] + }, + { + "id": "deepinfra/olmocr-7b-0725-fp8", + "provider": "deepinfra", + "model": "olmocr-7b-0725-fp8", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepinfra" + ], + "aliases": [ + "deepinfra/allenai/olmOCR-7B-0725-FP8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/allenai/olmOCR-7B-0725-FP8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.27, + "output": 1.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/allenai/olmOCR-7B-0725-FP8", + "mode": "chat" + } + ] + }, + { + "id": "deepinfra/phi-4", + "provider": "deepinfra", + "model": "phi-4", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepinfra" + ], + "aliases": [ + "deepinfra/microsoft/phi-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/microsoft/phi-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0.14 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/microsoft/phi-4", + "mode": "chat" + } + ] + }, + { + "id": "deepinfra/wizardlm-2-8x22b", + "provider": "deepinfra", + "model": "wizardlm-2-8x22b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepinfra" + ], + "aliases": [ + "deepinfra/microsoft/WizardLM-2-8x22B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/microsoft/WizardLM-2-8x22B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.48, + "output": 0.48 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/microsoft/WizardLM-2-8x22B", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-3.2", + "provider": "deepseek", + "model": "deepseek-3.2", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/deepseek-3.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "deepseek-3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.2" + ], + "families": [ + "deepseek" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-12-02", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "deepseek-3.2", + "modelKey": "deepseek-3.2", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2025-12-02", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "deepseek/deepseek-4-flash", + "provider": "deepseek", + "model": "deepseek-4-flash", + "displayName": "Deepseek V4 Flash", + "family": "deepseek", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/deepseek-4-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Deepseek V4 Flash" + ], + "families": [ + "deepseek" + ], + "releaseDate": "2026-05-27", + "lastUpdated": "2026-05-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "deepseek-4-flash", + "modelKey": "deepseek-4-flash", + "displayName": "Deepseek V4 Flash", + "family": "deepseek", + "metadata": { + "lastUpdated": "2026-05-29", + "openWeights": false, + "releaseDate": "2026-05-27" + } + } + ] + }, + { + "id": "deepseek/deepseek-chat", + "provider": "deepseek", + "model": "deepseek-chat", + "displayName": "DeepSeek Chat", + "family": "deepseek", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "anyapi", + "deepseek", + "kilo", + "nano-gpt", + "openrouter", + "orcarouter", + "zenmux" + ], + "aliases": [ + "302ai/deepseek-chat", + "anyapi/deepseek/deepseek-chat", + "deepseek/deepseek-chat", + "kilo/deepseek/deepseek-chat", + "nano-gpt/deepseek-chat", + "openrouter/deepseek/deepseek-chat", + "orcarouter/deepseek/deepseek-chat", + "zenmux/deepseek/deepseek-chat" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 1000000, + "inputTokens": 131072, + "maxTokens": 8192, + "outputTokens": 384000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "assistantPrefill": true, + "supports1MContext": true, + "structuredOutput": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "deepseek-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 0.43 + } + }, + { + "source": "models.dev", + "provider": "deepseek", + "model": "deepseek-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "deepseek/deepseek-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.32, + "output": 0.89 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 0.7 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "deepseek/deepseek-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2002, + "output": 0.8001 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "deepseek/deepseek-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "deepseek/deepseek-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.28, + "output": 0.42 + } + }, + { + "source": "litellm", + "provider": "deepseek", + "model": "deepseek-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.28, + "output": 0.42 + } + }, + { + "source": "litellm", + "provider": "deepseek", + "model": "deepseek/deepseek-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.028, + "cacheWrite": 0, + "input": 0.28, + "output": 0.42 + }, + "extra": { + "input_cost_per_token_cache_hit": 2.8e-8 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/deepseek/deepseek-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "deepseek/deepseek-chat", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2002, + "output": 0.8001 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek Chat", + "DeepSeek V3/Deepseek Chat", + "DeepSeek-V3.2 (Non-thinking Mode)", + "DeepSeek: DeepSeek V3", + "Deepseek-Chat" + ], + "families": [ + "deepseek" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2024-11-29", + "lastUpdated": "2024-11-29", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "deepseek-chat", + "modelKey": "deepseek-chat", + "displayName": "Deepseek-Chat", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2024-11-29", + "openWeights": false, + "releaseDate": "2024-11-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "deepseek/deepseek-chat", + "modelKey": "deepseek/deepseek-chat", + "displayName": "DeepSeek Chat", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2026-02-28", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepseek", + "providerName": "DeepSeek", + "providerApi": "https://api.deepseek.com", + "providerDoc": "https://api-docs.deepseek.com/quick_start/pricing", + "model": "deepseek-chat", + "modelKey": "deepseek-chat", + "displayName": "DeepSeek Chat", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2026-02-28", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "deepseek/deepseek-chat", + "modelKey": "deepseek/deepseek-chat", + "displayName": "DeepSeek: DeepSeek V3", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2024-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek-chat", + "modelKey": "deepseek-chat", + "displayName": "DeepSeek V3/Deepseek Chat", + "metadata": { + "lastUpdated": "2025-02-27", + "openWeights": false, + "releaseDate": "2025-02-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "deepseek/deepseek-chat", + "modelKey": "deepseek/deepseek-chat", + "displayName": "DeepSeek Chat", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2026-02-28", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "deepseek/deepseek-chat", + "modelKey": "deepseek/deepseek-chat", + "displayName": "DeepSeek Chat", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2026-02-28", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "deepseek/deepseek-chat", + "modelKey": "deepseek/deepseek-chat", + "displayName": "DeepSeek-V3.2 (Non-thinking Mode)", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-12-01", + "openWeights": false, + "releaseDate": "2025-12-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepseek", + "model": "deepseek-chat", + "mode": "chat", + "metadata": { + "source": "https://api-docs.deepseek.com/quick_start/pricing", + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepseek", + "model": "deepseek/deepseek-chat", + "mode": "chat", + "metadata": { + "source": "https://api-docs.deepseek.com/quick_start/pricing", + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/deepseek/deepseek-chat", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "deepseek/deepseek-chat", + "displayName": "DeepSeek: DeepSeek V3", + "metadata": { + "canonicalSlug": "deepseek/deepseek-chat-v3", + "createdAt": "2024-12-26T19:28:40.000Z", + "huggingFaceId": "deepseek-ai/DeepSeek-V3", + "knowledgeCutoff": "2024-07-31", + "links": { + "details": "/api/v1/models/deepseek/deepseek-chat-v3/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "DeepSeek", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 16000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "deepseek/deepseek-chat-cheaper", + "provider": "deepseek", + "model": "deepseek-chat-cheaper", + "displayName": "DeepSeek V3/Chat Cheaper", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/deepseek-chat-cheaper" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek-chat-cheaper", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 0.7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3/Chat Cheaper" + ], + "releaseDate": "2025-04-15", + "lastUpdated": "2025-04-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek-chat-cheaper", + "modelKey": "deepseek-chat-cheaper", + "displayName": "DeepSeek V3/Chat Cheaper", + "metadata": { + "lastUpdated": "2025-04-15", + "openWeights": false, + "releaseDate": "2025-04-15" + } + } + ] + }, + { + "id": "deepseek/deepseek-chat-v3-0324", + "provider": "deepseek", + "model": "deepseek-chat-v3-0324", + "displayName": "DeepSeek V3 0324", + "family": "deepseek", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/deepseek/deepseek-chat-v3-0324", + "openrouter/deepseek/deepseek-chat-v3-0324" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 163840, + "inputTokens": 65536, + "maxTokens": 8192, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "deepseek/deepseek-chat-v3-0324", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.095, + "input": 0.2, + "output": 0.77 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "deepseek/deepseek-chat-v3-0324", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.135, + "input": 0.2, + "output": 0.77 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/deepseek/deepseek-chat-v3-0324", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "deepseek/deepseek-chat-v3-0324", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.135, + "input": 0.2, + "output": 0.77 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3 0324", + "DeepSeek: DeepSeek V3 0324" + ], + "families": [ + "deepseek" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-07-31", + "releaseDate": "2025-03-24", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "deepseek/deepseek-chat-v3-0324", + "modelKey": "deepseek/deepseek-chat-v3-0324", + "displayName": "DeepSeek: DeepSeek V3 0324", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-03-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "deepseek/deepseek-chat-v3-0324", + "modelKey": "deepseek/deepseek-chat-v3-0324", + "displayName": "DeepSeek V3 0324", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07-31", + "lastUpdated": "2025-03-24", + "openWeights": true, + "releaseDate": "2025-03-24" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/deepseek/deepseek-chat-v3-0324", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "deepseek/deepseek-chat-v3-0324", + "displayName": "DeepSeek: DeepSeek V3 0324", + "metadata": { + "canonicalSlug": "deepseek/deepseek-chat-v3-0324", + "createdAt": "2025-03-24T13:59:15.000Z", + "huggingFaceId": "deepseek-ai/DeepSeek-V3-0324", + "knowledgeCutoff": "2024-07-31", + "links": { + "details": "/api/v1/models/deepseek/deepseek-chat-v3-0324/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "DeepSeek", + "topProvider": { + "context_length": 163840, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "deepseek/deepseek-chat-v3.1", + "provider": "deepseek", + "model": "deepseek-chat-v3.1", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/deepseek/deepseek-chat-v3.1", + "openrouter/deepseek/deepseek-chat-v3.1" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "deepseek/deepseek-chat-v3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.75 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "deepseek/deepseek-chat-v3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 0.21, + "output": 0.79 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/deepseek/deepseek-chat-v3.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + }, + "extra": { + "input_cost_per_token_cache_hit": 2e-8 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "deepseek/deepseek-chat-v3.1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.13, + "input": 0.21, + "output": 0.79 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.1", + "DeepSeek: DeepSeek V3.1" + ], + "families": [ + "deepseek" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-08-21", + "lastUpdated": "2025-08-21", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "deepseek/deepseek-chat-v3.1", + "modelKey": "deepseek/deepseek-chat-v3.1", + "displayName": "DeepSeek: DeepSeek V3.1", + "metadata": { + "lastUpdated": "2025-08-21", + "openWeights": true, + "releaseDate": "2025-08-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "deepseek/deepseek-chat-v3.1", + "modelKey": "deepseek/deepseek-chat-v3.1", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-21", + "openWeights": true, + "releaseDate": "2025-08-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/deepseek/deepseek-chat-v3.1", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "deepseek/deepseek-chat-v3.1", + "displayName": "DeepSeek: DeepSeek V3.1", + "metadata": { + "canonicalSlug": "deepseek/deepseek-chat-v3.1", + "createdAt": "2025-08-21T12:33:48.000Z", + "huggingFaceId": "deepseek-ai/DeepSeek-V3.1", + "instructType": "deepseek-v3.1", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/deepseek/deepseek-chat-v3.1/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "DeepSeek", + "topProvider": { + "context_length": 163840, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "deepseek/deepseek-coder", + "provider": "deepseek", + "model": "deepseek-coder", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepseek" + ], + "aliases": [ + "deepseek/deepseek-coder" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepseek", + "model": "deepseek/deepseek-coder", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.14, + "output": 0.28 + }, + "extra": { + "input_cost_per_token_cache_hit": 1.4e-8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepseek", + "model": "deepseek/deepseek-coder", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-coder-1b-base", + "provider": "deepseek", + "model": "deepseek-coder-1b-base", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/deepseek-coder-1b-base" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-coder-1b-base", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-coder-1b-base", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-coder-33b-instruct", + "provider": "deepseek", + "model": "deepseek-coder-33b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/deepseek-coder-33b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-coder-33b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-coder-33b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-coder-6.7b", + "provider": "deepseek", + "model": "deepseek-coder-6.7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "llamagate" + ], + "aliases": [ + "llamagate/deepseek-coder-6.7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "llamagate", + "model": "llamagate/deepseek-coder-6.7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.12 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "llamagate", + "model": "llamagate/deepseek-coder-6.7b", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-coder-7b-base", + "provider": "deepseek", + "model": "deepseek-coder-7b-base", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/deepseek-coder-7b-base" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-coder-7b-base", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-coder-7b-base", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-coder-7b-base-v1p5", + "provider": "deepseek", + "model": "deepseek-coder-7b-base-v1p5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/deepseek-coder-7b-base-v1p5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-coder-7b-base-v1p5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-coder-7b-base-v1p5", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-coder-7b-instruct-v1p5", + "provider": "deepseek", + "model": "deepseek-coder-7b-instruct-v1p5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/deepseek-coder-7b-instruct-v1p5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-coder-7b-instruct-v1p5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-coder-7b-instruct-v1p5", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-coder-v2-base", + "provider": "deepseek", + "model": "deepseek-coder-v2-base", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/deepseek-coder-v2-base" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/deepseek-coder-v2-base", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/deepseek-coder-v2-base", + "mode": "completion" + } + ] + }, + { + "id": "deepseek/deepseek-coder-v2-instruct", + "provider": "deepseek", + "model": "deepseek-coder-v2-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai", + "ollama" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/deepseek-coder-v2-instruct", + "ollama/deepseek-coder-v2-instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-coder-v2-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.2, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/deepseek-coder-v2-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-coder-v2-instruct", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/deepseek-coder-v2-instruct", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-coder-v2-lite-base", + "provider": "deepseek", + "model": "deepseek-coder-v2-lite-base", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai", + "ollama" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/deepseek-coder-v2-lite-base", + "ollama/deepseek-coder-v2-lite-base" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "functionCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-coder-v2-lite-base", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/deepseek-coder-v2-lite-base", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat", + "completion" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-coder-v2-lite-base", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/deepseek-coder-v2-lite-base", + "mode": "completion" + } + ] + }, + { + "id": "deepseek/deepseek-coder-v2-lite-instruct", + "provider": "deepseek", + "model": "deepseek-coder-v2-lite-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai", + "ollama" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/deepseek-coder-v2-lite-instruct", + "ollama/deepseek-coder-v2-lite-instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "functionCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-coder-v2-lite-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/deepseek-coder-v2-lite-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-coder-v2-lite-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/deepseek-coder-v2-lite-instruct", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-latest", + "provider": "deepseek", + "model": "deepseek-latest", + "displayName": "DeepSeek Latest", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/deepseek/deepseek-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "outputTokens": 384000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek/deepseek-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 1.1, + "output": 2.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek Latest" + ], + "releaseDate": "2026-05-03", + "lastUpdated": "2026-05-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek/deepseek-latest", + "modelKey": "deepseek/deepseek-latest", + "displayName": "DeepSeek Latest", + "metadata": { + "lastUpdated": "2026-05-03", + "openWeights": false, + "releaseDate": "2026-05-03" + } + } + ] + }, + { + "id": "deepseek/deepseek-llama3.3-70b", + "provider": "deepseek", + "model": "deepseek-llama3.3-70b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lambda_ai" + ], + "aliases": [ + "lambda_ai/deepseek-llama3.3-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/deepseek-llama3.3-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/deepseek-llama3.3-70b", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-math-v2", + "provider": "deepseek", + "model": "deepseek-math-v2", + "displayName": "DeepSeek Math V2", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt", + "qiniu-ai" + ], + "aliases": [ + "nano-gpt/deepseek-math-v2", + "qiniu-ai/deepseek/deepseek-math-v2" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 160000, + "inputTokens": 128000, + "outputTokens": 160000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "temperature": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek-math-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek Math V2", + "Deepseek/Deepseek-Math-V2" + ], + "releaseDate": "2025-12-03", + "lastUpdated": "2025-12-03", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek-math-v2", + "modelKey": "deepseek-math-v2", + "displayName": "DeepSeek Math V2", + "metadata": { + "lastUpdated": "2025-12-03", + "openWeights": false, + "releaseDate": "2025-12-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "deepseek/deepseek-math-v2", + "modelKey": "deepseek/deepseek-math-v2", + "displayName": "Deepseek/Deepseek-Math-V2", + "metadata": { + "lastUpdated": "2025-12-04", + "openWeights": false, + "releaseDate": "2025-12-04" + } + } + ] + }, + { + "id": "deepseek/deepseek-ocr", + "provider": "deepseek", + "model": "deepseek-ocr", + "displayName": "DeepSeek OCR", + "family": "deepseek", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "clarifai", + "novita", + "novita-ai", + "siliconflow-cn" + ], + "aliases": [ + "clarifai/deepseek-ai/deepseek-ocr/models/DeepSeek-OCR", + "novita-ai/deepseek/deepseek-ocr", + "novita/deepseek/deepseek-ocr", + "siliconflow-cn/deepseek-ai/DeepSeek-OCR" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "clarifai", + "model": "deepseek-ai/deepseek-ocr/models/DeepSeek-OCR", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.7 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "deepseek/deepseek-ocr", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.03, + "output": 0.03 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "deepseek-ai/DeepSeek-OCR", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/deepseek/deepseek-ocr", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.03, + "output": 0.03 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek OCR", + "DeepSeek-OCR", + "deepseek-ai/DeepSeek-OCR" + ], + "families": [ + "deepseek" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-10-20", + "lastUpdated": "2026-02-25", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "clarifai", + "providerName": "Clarifai", + "providerApi": "https://api.clarifai.com/v2/ext/openai/v1", + "providerDoc": "https://docs.clarifai.com/compute/inference/", + "model": "deepseek-ai/deepseek-ocr/models/DeepSeek-OCR", + "modelKey": "deepseek-ai/deepseek-ocr/models/DeepSeek-OCR", + "displayName": "DeepSeek OCR", + "family": "deepseek", + "metadata": { + "lastUpdated": "2026-02-25", + "openWeights": true, + "releaseDate": "2025-10-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "deepseek/deepseek-ocr", + "modelKey": "deepseek/deepseek-ocr", + "displayName": "DeepSeek-OCR", + "metadata": { + "lastUpdated": "2025-10-24", + "openWeights": true, + "releaseDate": "2025-10-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/DeepSeek-OCR", + "modelKey": "deepseek-ai/DeepSeek-OCR", + "displayName": "deepseek-ai/DeepSeek-OCR", + "metadata": { + "lastUpdated": "2025-10-20", + "openWeights": true, + "releaseDate": "2025-10-20" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/deepseek/deepseek-ocr", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-ocr-2", + "provider": "deepseek", + "model": "deepseek-ocr-2", + "displayName": "deepseek/deepseek-ocr-2", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/deepseek/deepseek-ocr-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "deepseek/deepseek-ocr-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.03, + "output": 0.03 + } + } + ] + }, + "metadata": { + "displayNames": [ + "deepseek/deepseek-ocr-2" + ], + "releaseDate": "2026-01-27", + "lastUpdated": "2026-01-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "deepseek/deepseek-ocr-2", + "modelKey": "deepseek/deepseek-ocr-2", + "displayName": "deepseek/deepseek-ocr-2", + "metadata": { + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27" + } + } + ] + }, + { + "id": "deepseek/deepseek-ocr-maas", + "provider": "deepseek", + "model": "deepseek-ocr-maas", + "mode": "ocr", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai" + ], + "aliases": [ + "vertex_ai/deepseek-ai/deepseek-ocr-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai", + "model": "vertex_ai/deepseek-ai/deepseek-ocr-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + }, + "perPage": { + "ocr": 0.0003 + } + } + ] + }, + "metadata": { + "modes": [ + "ocr" + ], + "supportedRegions": [ + "us-central1" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai", + "model": "vertex_ai/deepseek-ai/deepseek-ocr-maas", + "mode": "ocr", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/pricing", + "supportedRegions": [ + "us-central1" + ] + } + } + ] + }, + { + "id": "deepseek/deepseek-prover-v2", + "provider": "deepseek", + "model": "deepseek-prover-v2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/deepseek-prover-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-prover-v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.2, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-prover-v2", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-prover-v2-671b", + "provider": "deepseek", + "model": "deepseek-prover-v2-671b", + "displayName": "DeepSeek Prover v2 671B", + "family": "deepseek", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "nano-gpt", + "novita", + "novita-ai" + ], + "aliases": [ + "nano-gpt/deepseek/deepseek-prover-v2-671b", + "novita-ai/deepseek/deepseek-prover-v2-671b", + "novita/deepseek/deepseek-prover-v2-671b" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 160000, + "inputTokens": 160000, + "maxTokens": 160000, + "outputTokens": 160000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "temperature": true, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek/deepseek-prover-v2-671b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "deepseek/deepseek-prover-v2-671b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/deepseek/deepseek-prover-v2-671b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.7, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek Prover v2 671B", + "Deepseek Prover V2 671B" + ], + "families": [ + "deepseek" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-04-30", + "lastUpdated": "2025-04-30", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek/deepseek-prover-v2-671b", + "modelKey": "deepseek/deepseek-prover-v2-671b", + "displayName": "DeepSeek Prover v2 671B", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-04-30", + "openWeights": false, + "releaseDate": "2025-04-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "deepseek/deepseek-prover-v2-671b", + "modelKey": "deepseek/deepseek-prover-v2-671b", + "displayName": "Deepseek Prover V2 671B", + "metadata": { + "lastUpdated": "2025-04-30", + "openWeights": true, + "releaseDate": "2025-04-30" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/deepseek/deepseek-prover-v2-671b", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-r1", + "provider": "deepseek", + "model": "deepseek-r1", + "displayName": "DeepSeek-R1", + "family": "deepseek-thinking", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "alibaba-cn", + "anyapi", + "azure", + "azure-cognitive-services", + "azure_ai", + "deepinfra", + "deepseek", + "drun", + "fireworks_ai", + "github-models", + "hyperbolic", + "iflowcn", + "kilo", + "nano-gpt", + "nebius", + "openrouter", + "qiniu-ai", + "replicate", + "sambanova", + "siliconflow", + "siliconflow-cn", + "snowflake", + "snowflake-cortex", + "synthetic", + "together_ai", + "togetherai", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "abacus/deepseek-ai/DeepSeek-R1", + "alibaba-cn/deepseek-r1", + "anyapi/deepseek/deepseek-r1", + "azure-cognitive-services/deepseek-r1", + "azure/deepseek-r1", + "azure_ai/deepseek-r1", + "deepinfra/deepseek-ai/DeepSeek-R1", + "deepseek/deepseek-r1", + "drun/public/deepseek-r1", + "fireworks_ai/accounts/fireworks/models/deepseek-r1", + "github-models/deepseek/deepseek-r1", + "hyperbolic/deepseek-ai/DeepSeek-R1", + "iflowcn/deepseek-r1", + "kilo/deepseek/deepseek-r1", + "nano-gpt/deepseek-r1", + "nebius/deepseek-ai/DeepSeek-R1", + "openrouter/deepseek/deepseek-r1", + "qiniu-ai/deepseek-r1", + "replicate/deepseek-ai/deepseek-r1", + "sambanova/DeepSeek-R1", + "siliconflow-cn/Pro/deepseek-ai/DeepSeek-R1", + "siliconflow-cn/deepseek-ai/DeepSeek-R1", + "siliconflow/deepseek-ai/DeepSeek-R1", + "snowflake-cortex/deepseek-r1", + "snowflake/deepseek-r1", + "synthetic/hf:deepseek-ai/DeepSeek-R1", + "together_ai/deepseek-ai/DeepSeek-R1", + "togetherai/deepseek-ai/DeepSeek-R1", + "vercel/deepseek/deepseek-r1", + "vercel_ai_gateway/deepseek/deepseek-r1" + ], + "mergedProviderModelRecords": 30, + "limits": { + "contextTokens": 1000000, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 384000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": true, + "attachments": true, + "openWeights": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "deepseek-ai/DeepSeek-R1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 7 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "deepseek-r1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.574, + "output": 2.294 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "deepseek-r1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.35, + "output": 5.4 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "deepseek-r1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.35, + "output": 5.4 + } + }, + { + "source": "models.dev", + "provider": "drun", + "model": "public/deepseek-r1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "deepseek/deepseek-r1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "iflowcn", + "model": "deepseek-r1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "deepseek/deepseek-r1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek-r1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.7 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "deepseek/deepseek-r1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "deepseek-ai/DeepSeek-R1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 2.18 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Pro/deepseek-ai/DeepSeek-R1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 2.18 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "deepseek-ai/DeepSeek-R1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 2.18 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:deepseek-ai/DeepSeek-R1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.19 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "deepseek-ai/DeepSeek-R1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 7 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "deepseek/deepseek-r1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.35, + "output": 5.4 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/deepseek-r1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.35, + "output": 5.4 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-R1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.7, + "output": 2.4 + } + }, + { + "source": "litellm", + "provider": "deepseek", + "model": "deepseek/deepseek-r1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.55, + "output": 2.19 + }, + "extra": { + "input_cost_per_token_cache_hit": 1.4e-7 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 8 + } + }, + { + "source": "litellm", + "provider": "hyperbolic", + "model": "hyperbolic/deepseek-ai/DeepSeek-R1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/deepseek-ai/DeepSeek-R1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 2.4 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/deepseek/deepseek-r1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.55, + "output": 2.19 + }, + "extra": { + "input_cost_per_token_cache_hit": 1.4e-7 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/deepseek-ai/deepseek-r1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3.75, + "output": 10, + "reasoningOutput": 10 + } + }, + { + "source": "litellm", + "provider": "sambanova", + "model": "sambanova/DeepSeek-R1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5, + "output": 7 + } + }, + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/deepseek-r1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.35, + "output": 5.4 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/deepseek-ai/DeepSeek-R1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 7 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/deepseek/deepseek-r1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.55, + "output": 2.19 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "deepseek/deepseek-r1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.7, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek R1", + "DeepSeek Reasoner", + "DeepSeek-R1", + "DeepSeek: R1", + "Pro/deepseek-ai/DeepSeek-R1", + "deepseek-ai/DeepSeek-R1" + ], + "families": [ + "deepseek-thinking" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-09", + "releaseDate": "2025-01-20", + "lastUpdated": "2025-01-20", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 30 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "deepseek-ai/DeepSeek-R1", + "modelKey": "deepseek-ai/DeepSeek-R1", + "displayName": "DeepSeek R1", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-01-20", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "deepseek-r1", + "modelKey": "deepseek-r1", + "displayName": "DeepSeek R1", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "deepseek/deepseek-r1", + "modelKey": "deepseek/deepseek-r1", + "displayName": "DeepSeek Reasoner", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2026-02-28", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "deepseek-r1", + "modelKey": "deepseek-r1", + "displayName": "DeepSeek-R1", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-01-20", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "deepseek-r1", + "modelKey": "deepseek-r1", + "displayName": "DeepSeek-R1", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-01-20", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "drun", + "providerName": "D.Run (China)", + "providerApi": "https://chat.d.run/v1", + "providerDoc": "https://www.d.run", + "model": "public/deepseek-r1", + "modelKey": "public/deepseek-r1", + "displayName": "DeepSeek R1", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-20", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "deepseek/deepseek-r1", + "modelKey": "deepseek/deepseek-r1", + "displayName": "DeepSeek-R1", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2025-01-20", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "iflowcn", + "providerName": "iFlow", + "providerApi": "https://apis.iflow.cn/v1", + "providerDoc": "https://platform.iflow.cn/en/docs", + "model": "deepseek-r1", + "modelKey": "deepseek-r1", + "displayName": "DeepSeek-R1", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-20", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "deepseek/deepseek-r1", + "modelKey": "deepseek/deepseek-r1", + "displayName": "DeepSeek: R1", + "metadata": { + "lastUpdated": "2025-01-20", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek-r1", + "modelKey": "deepseek-r1", + "displayName": "DeepSeek R1", + "metadata": { + "lastUpdated": "2025-01-20", + "openWeights": false, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "deepseek/deepseek-r1", + "modelKey": "deepseek/deepseek-r1", + "displayName": "DeepSeek-R1", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-05-29", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "deepseek-r1", + "modelKey": "deepseek-r1", + "displayName": "DeepSeek-R1", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/DeepSeek-R1", + "modelKey": "deepseek-ai/DeepSeek-R1", + "displayName": "deepseek-ai/DeepSeek-R1", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Pro/deepseek-ai/DeepSeek-R1", + "modelKey": "Pro/deepseek-ai/DeepSeek-R1", + "displayName": "Pro/deepseek-ai/DeepSeek-R1", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/DeepSeek-R1", + "modelKey": "deepseek-ai/DeepSeek-R1", + "displayName": "deepseek-ai/DeepSeek-R1", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "deepseek-r1", + "modelKey": "deepseek-r1", + "displayName": "DeepSeek-R1", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-05-29", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:deepseek-ai/DeepSeek-R1", + "modelKey": "hf:deepseek-ai/DeepSeek-R1", + "displayName": "DeepSeek R1", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-20", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "deepseek-ai/DeepSeek-R1", + "modelKey": "deepseek-ai/DeepSeek-R1", + "displayName": "DeepSeek-R1", + "family": "deepseek-thinking", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-03-24", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "deepseek/deepseek-r1", + "modelKey": "deepseek/deepseek-r1", + "displayName": "DeepSeek-R1", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-05-29", + "openWeights": false, + "releaseDate": "2025-01-20" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/deepseek-r1", + "mode": "chat", + "metadata": { + "source": "https://techcommunity.microsoft.com/blog/machinelearningblog/deepseek-r1-improved-performance-higher-limits-and-transparent-pricing/4386367" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-R1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepseek", + "model": "deepseek/deepseek-r1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "hyperbolic", + "model": "hyperbolic/deepseek-ai/DeepSeek-R1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/deepseek-ai/DeepSeek-R1", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/deepseek/deepseek-r1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/deepseek-ai/deepseek-r1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sambanova", + "model": "sambanova/DeepSeek-R1", + "mode": "chat", + "metadata": { + "source": "https://cloud.sambanova.ai/plans/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/deepseek-r1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/deepseek-ai/DeepSeek-R1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/deepseek/deepseek-r1", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "deepseek/deepseek-r1", + "displayName": "DeepSeek: R1", + "metadata": { + "canonicalSlug": "deepseek/deepseek-r1", + "createdAt": "2025-01-20T13:51:35.000Z", + "huggingFaceId": "deepseek-ai/DeepSeek-R1", + "instructType": "deepseek-r1", + "knowledgeCutoff": "2024-07-31", + "links": { + "details": "/api/v1/models/deepseek/deepseek-r1/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "DeepSeek", + "topProvider": { + "context_length": 64000, + "max_completion_tokens": 16000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "deepseek/deepseek-r1-0528", + "provider": "deepseek", + "model": "deepseek-r1-0528", + "displayName": "DeepSeek-R1-0528", + "family": "deepseek", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba-cn", + "azure", + "azure-cognitive-services", + "cortecs", + "crusoe", + "deepinfra", + "fireworks_ai", + "github-models", + "huggingface", + "hyperbolic", + "io-net", + "jiekou", + "kilo", + "lambda_ai", + "llmgateway", + "meganova", + "nano-gpt", + "nebius", + "novita", + "novita-ai", + "openrouter", + "qiniu-ai", + "submodel", + "synthetic", + "wandb" + ], + "aliases": [ + "alibaba-cn/deepseek-r1-0528", + "alibaba-cn/siliconflow/deepseek-r1-0528", + "azure-cognitive-services/deepseek-r1-0528", + "azure/deepseek-r1-0528", + "cortecs/deepseek-r1-0528", + "crusoe/deepseek-ai/DeepSeek-R1-0528", + "deepinfra/deepseek-ai/DeepSeek-R1-0528", + "fireworks_ai/accounts/fireworks/models/deepseek-r1-0528", + "github-models/deepseek/deepseek-r1-0528", + "huggingface/deepseek-ai/DeepSeek-R1-0528", + "hyperbolic/deepseek-ai/DeepSeek-R1-0528", + "io-net/deepseek-ai/DeepSeek-R1-0528", + "jiekou/deepseek/deepseek-r1-0528", + "kilo/deepseek/deepseek-r1-0528", + "lambda_ai/deepseek-r1-0528", + "llmgateway/deepseek-r1-0528", + "meganova/deepseek-ai/DeepSeek-R1-0528", + "nano-gpt/deepseek-ai/DeepSeek-R1-0528", + "nebius/deepseek-ai/DeepSeek-R1-0528", + "novita-ai/deepseek/deepseek-r1-0528", + "novita/deepseek/deepseek-r1-0528", + "openrouter/deepseek/deepseek-r1-0528", + "qiniu-ai/deepseek-r1-0528", + "submodel/deepseek-ai/DeepSeek-R1-0528", + "synthetic/hf:deepseek-ai/DeepSeek-R1-0528", + "wandb/deepseek-ai/DeepSeek-R1-0528" + ], + "mergedProviderModelRecords": 26, + "limits": { + "contextTokens": 164000, + "inputTokens": 164000, + "maxTokens": 164000, + "outputTokens": 164000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false, + "structuredOutput": true, + "assistantPrefill": true, + "promptCaching": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "deepseek-r1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.574, + "output": 2.294 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "siliconflow/deepseek-r1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 2.18 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "deepseek-r1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.35, + "output": 5.4 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "deepseek-r1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.35, + "output": 5.4 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "deepseek-r1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.585, + "output": 2.307 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "deepseek-ai/DeepSeek-R1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.35, + "input": 0.5, + "output": 2.15 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "deepseek/deepseek-r1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "deepseek-ai/DeepSeek-R1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "io-net", + "model": "deepseek-ai/DeepSeek-R1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 4, + "input": 2, + "output": 8.75 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "deepseek/deepseek-r1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "deepseek/deepseek-r1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.45, + "output": 2.15 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "deepseek-r1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.19 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "deepseek-ai/DeepSeek-R1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 2.15 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek-ai/DeepSeek-R1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.7 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "deepseek/deepseek-r1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.35, + "input": 0.7, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "deepseek/deepseek-r1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.35, + "input": 0.5, + "output": 2.15 + } + }, + { + "source": "models.dev", + "provider": "submodel", + "model": "deepseek-ai/DeepSeek-R1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 2.15 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:deepseek-ai/DeepSeek-R1-0528", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 8 + } + }, + { + "source": "litellm", + "provider": "crusoe", + "model": "crusoe/deepseek-ai/DeepSeek-R1-0528", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 7 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-R1-0528", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.4, + "input": 0.5, + "output": 2.15 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-0528", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 8 + } + }, + { + "source": "litellm", + "provider": "hyperbolic", + "model": "hyperbolic/deepseek-ai/DeepSeek-R1-0528", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 0.25 + } + }, + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/deepseek-r1-0528", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/deepseek-ai/DeepSeek-R1-0528", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 2.4 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/deepseek/deepseek-r1-0528", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.35, + "input": 0.7, + "output": 2.5 + }, + "extra": { + "input_cost_per_token_cache_hit": 3.5e-7 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/deepseek/deepseek-r1-0528", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 2.15 + }, + "extra": { + "input_cost_per_token_cache_hit": 1.4e-7 + } + }, + { + "source": "litellm", + "provider": "wandb", + "model": "wandb/deepseek-ai/DeepSeek-R1-0528", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 135000, + "output": 540000 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "deepseek/deepseek-r1-0528", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.35, + "input": 0.5, + "output": 2.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek R1", + "DeepSeek R1 (0528)", + "DeepSeek R1 0528", + "DeepSeek-R1-0528", + "DeepSeek: R1 0528", + "R1 0528", + "siliconflow/deepseek-r1-0528" + ], + "families": [ + "deepseek", + "deepseek-thinking" + ], + "modes": [ + "chat" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2025-05-28", + "lastUpdated": "2025-05-28", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 26 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "deepseek-r1-0528", + "modelKey": "deepseek-r1-0528", + "displayName": "DeepSeek R1 0528", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-05-28", + "openWeights": false, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "siliconflow/deepseek-r1-0528", + "modelKey": "siliconflow/deepseek-r1-0528", + "displayName": "siliconflow/deepseek-r1-0528", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "deepseek-r1-0528", + "modelKey": "deepseek-r1-0528", + "displayName": "DeepSeek-R1-0528", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-05-28", + "openWeights": true, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "deepseek-r1-0528", + "modelKey": "deepseek-r1-0528", + "displayName": "DeepSeek-R1-0528", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-05-28", + "openWeights": true, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "deepseek-r1-0528", + "modelKey": "deepseek-r1-0528", + "displayName": "DeepSeek R1 0528", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-05-28", + "openWeights": true, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "deepseek-ai/DeepSeek-R1-0528", + "modelKey": "deepseek-ai/DeepSeek-R1-0528", + "displayName": "DeepSeek-R1-0528", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-05-28", + "openWeights": false, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "deepseek/deepseek-r1-0528", + "modelKey": "deepseek/deepseek-r1-0528", + "displayName": "DeepSeek-R1-0528", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2025-05-28", + "openWeights": true, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "deepseek-ai/DeepSeek-R1-0528", + "modelKey": "deepseek-ai/DeepSeek-R1-0528", + "displayName": "DeepSeek-R1-0528", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-05-28", + "openWeights": true, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "io-net", + "providerName": "IO.NET", + "providerApi": "https://api.intelligence.io.solutions/api/v1", + "providerDoc": "https://io.net/docs/guides/intelligence/io-intelligence", + "model": "deepseek-ai/DeepSeek-R1-0528", + "modelKey": "deepseek-ai/DeepSeek-R1-0528", + "displayName": "DeepSeek R1", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-05-28", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "deepseek/deepseek-r1-0528", + "modelKey": "deepseek/deepseek-r1-0528", + "displayName": "DeepSeek R1 0528", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "deepseek/deepseek-r1-0528", + "modelKey": "deepseek/deepseek-r1-0528", + "displayName": "DeepSeek: R1 0528", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "deepseek-r1-0528", + "modelKey": "deepseek-r1-0528", + "displayName": "DeepSeek R1 (0528)", + "family": "deepseek", + "status": "beta", + "metadata": { + "lastUpdated": "2025-05-28", + "openWeights": true, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "deepseek-ai/DeepSeek-R1-0528", + "modelKey": "deepseek-ai/DeepSeek-R1-0528", + "displayName": "DeepSeek R1 0528", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-05-28", + "openWeights": true, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek-ai/DeepSeek-R1-0528", + "modelKey": "deepseek-ai/DeepSeek-R1-0528", + "displayName": "DeepSeek R1 0528", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-05-28", + "openWeights": false, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "deepseek/deepseek-r1-0528", + "modelKey": "deepseek/deepseek-r1-0528", + "displayName": "DeepSeek R1 0528", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-05-28", + "openWeights": true, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "deepseek/deepseek-r1-0528", + "modelKey": "deepseek/deepseek-r1-0528", + "displayName": "R1 0528", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-28", + "openWeights": true, + "releaseDate": "2025-05-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "deepseek-r1-0528", + "modelKey": "deepseek-r1-0528", + "displayName": "DeepSeek-R1-0528", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "submodel", + "providerName": "submodel", + "providerApi": "https://llm.submodel.ai/v1", + "providerDoc": "https://submodel.gitbook.io", + "model": "deepseek-ai/DeepSeek-R1-0528", + "modelKey": "deepseek-ai/DeepSeek-R1-0528", + "displayName": "DeepSeek R1 0528", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-08-23", + "openWeights": false, + "releaseDate": "2025-08-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:deepseek-ai/DeepSeek-R1-0528", + "modelKey": "hf:deepseek-ai/DeepSeek-R1-0528", + "displayName": "DeepSeek R1 (0528)", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-08-01", + "openWeights": false, + "releaseDate": "2025-08-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "crusoe", + "model": "crusoe/deepseek-ai/DeepSeek-R1-0528", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-R1-0528", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-0528", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "hyperbolic", + "model": "hyperbolic/deepseek-ai/DeepSeek-R1-0528", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/deepseek-r1-0528", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/deepseek-ai/DeepSeek-R1-0528", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/deepseek/deepseek-r1-0528", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/deepseek/deepseek-r1-0528", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "wandb", + "model": "wandb/deepseek-ai/DeepSeek-R1-0528", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "deepseek/deepseek-r1-0528", + "displayName": "DeepSeek: R1 0528", + "metadata": { + "canonicalSlug": "deepseek/deepseek-r1-0528", + "createdAt": "2025-05-28T17:59:30.000Z", + "huggingFaceId": "deepseek-ai/DeepSeek-R1-0528", + "instructType": "deepseek-r1", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/deepseek/deepseek-r1-0528/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "DeepSeek", + "topProvider": { + "context_length": 163840, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "deepseek/deepseek-r1-0528-distill-qwen3-8b", + "provider": "deepseek", + "model": "deepseek-r1-0528-distill-qwen3-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/deepseek-r1-0528-distill-qwen3-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-0528-distill-qwen3-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-0528-distill-qwen3-8b", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-r1-0528-maas", + "provider": "deepseek", + "model": "deepseek-r1-0528-maas", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-deepseek_models" + ], + "aliases": [ + "vertex_ai-deepseek_models/vertex_ai/deepseek-ai/deepseek-r1-0528-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65336, + "inputTokens": 65336, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-deepseek_models", + "model": "vertex_ai/deepseek-ai/deepseek-r1-0528-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.35, + "output": 5.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedRegions": [ + "us-central1" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-deepseek_models", + "model": "vertex_ai/deepseek-ai/deepseek-r1-0528-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#partner-models", + "supportedRegions": [ + "us-central1" + ] + } + } + ] + }, + { + "id": "deepseek/deepseek-r1-0528-qwen3-8b", + "provider": "deepseek", + "model": "deepseek-r1-0528-qwen3-8b", + "displayName": "DeepSeek R1 0528 Qwen3 8B", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "novita", + "novita-ai" + ], + "aliases": [ + "novita-ai/deepseek/deepseek-r1-0528-qwen3-8b", + "novita/deepseek/deepseek-r1-0528-qwen3-8b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "deepseek/deepseek-r1-0528-qwen3-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.06, + "output": 0.09 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/deepseek/deepseek-r1-0528-qwen3-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.09 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek R1 0528 Qwen3 8B" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-05-29", + "lastUpdated": "2025-05-29", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "deepseek/deepseek-r1-0528-qwen3-8b", + "modelKey": "deepseek/deepseek-r1-0528-qwen3-8b", + "displayName": "DeepSeek R1 0528 Qwen3 8B", + "metadata": { + "lastUpdated": "2025-05-29", + "openWeights": true, + "releaseDate": "2025-05-29" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/deepseek/deepseek-r1-0528-qwen3-8b", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-r1-0528-tee", + "provider": "deepseek", + "model": "deepseek-r1-0528-tee", + "displayName": "DeepSeek R1 0528 TEE", + "family": "deepseek-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/deepseek-ai/DeepSeek-R1-0528-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "deepseek-ai/DeepSeek-R1-0528-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.225, + "input": 0.45, + "output": 2.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek R1 0528 TEE" + ], + "families": [ + "deepseek-thinking" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2025-01-20", + "lastUpdated": "2025-05-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "deepseek-ai/DeepSeek-R1-0528-TEE", + "modelKey": "deepseek-ai/DeepSeek-R1-0528-TEE", + "displayName": "DeepSeek R1 0528 TEE", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-05-29", + "openWeights": true, + "releaseDate": "2025-01-20" + } + } + ] + }, + { + "id": "deepseek/deepseek-r1-0528-tput", + "provider": "deepseek", + "model": "deepseek-r1-0528-tput", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "together_ai" + ], + "aliases": [ + "together_ai/deepseek-ai/DeepSeek-R1-0528-tput" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/deepseek-ai/DeepSeek-R1-0528-tput", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.55, + "output": 2.19 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/deepseek-ai/DeepSeek-R1-0528-tput", + "mode": "chat", + "metadata": { + "source": "https://www.together.ai/models/deepseek-r1-0528-throughput" + } + } + ] + }, + { + "id": "deepseek/deepseek-r1-0528-turbo", + "provider": "deepseek", + "model": "deepseek-r1-0528-turbo", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepinfra" + ], + "aliases": [ + "deepinfra/deepseek-ai/DeepSeek-R1-0528-Turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-R1-0528-Turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-R1-0528-Turbo", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-r1-671b", + "provider": "deepseek", + "model": "deepseek-r1-671b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lambda_ai" + ], + "aliases": [ + "lambda_ai/deepseek-r1-671b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/deepseek-r1-671b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 0.8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/deepseek-r1-671b", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-r1-7b-qwen", + "provider": "deepseek", + "model": "deepseek-r1-7b-qwen", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "llamagate" + ], + "aliases": [ + "llamagate/deepseek-r1-7b-qwen" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "llamagate", + "model": "llamagate/deepseek-r1-7b-qwen", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "llamagate", + "model": "llamagate/deepseek-r1-7b-qwen", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-r1-8b", + "provider": "deepseek", + "model": "deepseek-r1-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "llamagate" + ], + "aliases": [ + "llamagate/deepseek-r1-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "llamagate", + "model": "llamagate/deepseek-r1-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "llamagate", + "model": "llamagate/deepseek-r1-8b", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-r1-basic", + "provider": "deepseek", + "model": "deepseek-r1-basic", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/deepseek-r1-basic" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 20480, + "outputTokens": 20480, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-basic", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.55, + "output": 2.19 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-basic", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "deepseek/deepseek-r1-distill-llama-70b", + "provider": "deepseek", + "model": "deepseek-r1-distill-llama-70b", + "displayName": "DeepSeek R1 Distill Llama 70B", + "family": "deepseek-thinking", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba-cn", + "chutes", + "deepinfra", + "digitalocean", + "fastrouter", + "fireworks_ai", + "gradient_ai", + "helicone", + "kilo", + "nebius", + "novita", + "novita-ai", + "nscale", + "openrouter", + "ovhcloud", + "sambanova", + "vercel_ai_gateway" + ], + "aliases": [ + "alibaba-cn/deepseek-r1-distill-llama-70b", + "chutes/deepseek-ai/DeepSeek-R1-Distill-Llama-70B", + "deepinfra/deepseek-ai/DeepSeek-R1-Distill-Llama-70B", + "digitalocean/deepseek-r1-distill-llama-70b", + "fastrouter/deepseek-ai/deepseek-r1-distill-llama-70b", + "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-llama-70b", + "gradient_ai/deepseek-r1-distill-llama-70b", + "helicone/deepseek-r1-distill-llama-70b", + "kilo/deepseek/deepseek-r1-distill-llama-70b", + "nebius/deepseek-ai/DeepSeek-R1-Distill-Llama-70B", + "novita-ai/deepseek/deepseek-r1-distill-llama-70b", + "novita/deepseek/deepseek-r1-distill-llama-70b", + "nscale/deepseek-ai/DeepSeek-R1-Distill-Llama-70B", + "openrouter/deepseek/deepseek-r1-distill-llama-70b", + "ovhcloud/DeepSeek-R1-Distill-Llama-70B", + "sambanova/DeepSeek-R1-Distill-Llama-70B", + "vercel_ai_gateway/deepseek/deepseek-r1-distill-llama-70b" + ], + "mergedProviderModelRecords": 17, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "functionCalling": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "deepseek-r1-distill-llama-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.287, + "output": 0.861 + } + }, + { + "source": "models.dev", + "provider": "chutes", + "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-70B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0136, + "input": 0.0272, + "output": 0.1087 + } + }, + { + "source": "models.dev", + "provider": "digitalocean", + "model": "deepseek-r1-distill-llama-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.99, + "output": 0.99 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "deepseek-ai/deepseek-r1-distill-llama-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.03, + "output": 0.14 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "deepseek-r1-distill-llama-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.03, + "output": 0.13 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "deepseek/deepseek-r1-distill-llama-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.7, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "deepseek/deepseek-r1-distill-llama-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "deepseek/deepseek-r1-distill-llama-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 0.8 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-R1-Distill-Llama-70B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-llama-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "gradient_ai", + "model": "gradient_ai/deepseek-r1-distill-llama-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.99, + "output": 0.99 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/deepseek-ai/DeepSeek-R1-Distill-Llama-70B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 0.75 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/deepseek/deepseek-r1-distill-llama-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 0.8 + } + }, + { + "source": "litellm", + "provider": "nscale", + "model": "nscale/deepseek-ai/DeepSeek-R1-Distill-Llama-70B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.375, + "output": 0.375 + } + }, + { + "source": "litellm", + "provider": "ovhcloud", + "model": "ovhcloud/DeepSeek-R1-Distill-Llama-70B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.67, + "output": 0.67 + } + }, + { + "source": "litellm", + "provider": "sambanova", + "model": "sambanova/DeepSeek-R1-Distill-Llama-70B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.7, + "output": 1.4 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/deepseek/deepseek-r1-distill-llama-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.75, + "output": 0.99 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "deepseek/deepseek-r1-distill-llama-70b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 0.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek R1 Distill LLama 70B", + "DeepSeek R1 Distill Llama 70B", + "DeepSeek: R1 Distill Llama 70B", + "R1 Distill Llama 70B" + ], + "families": [ + "deepseek-thinking" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "seed", + "stop", + "temperature", + "top_k", + "top_p" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 17 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "deepseek-r1-distill-llama-70b", + "modelKey": "deepseek-r1-distill-llama-70b", + "displayName": "DeepSeek R1 Distill Llama 70B", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-70B", + "modelKey": "deepseek-ai/DeepSeek-R1-Distill-Llama-70B", + "displayName": "DeepSeek R1 Distill Llama 70B", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "deepseek-r1-distill-llama-70b", + "modelKey": "deepseek-r1-distill-llama-70b", + "displayName": "DeepSeek R1 Distill Llama 70B", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-01-30", + "openWeights": true, + "releaseDate": "2025-01-30", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "deepseek-ai/deepseek-r1-distill-llama-70b", + "modelKey": "deepseek-ai/deepseek-r1-distill-llama-70b", + "displayName": "DeepSeek R1 Distill Llama 70B", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-01-23", + "openWeights": true, + "releaseDate": "2025-01-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "deepseek-r1-distill-llama-70b", + "modelKey": "deepseek-r1-distill-llama-70b", + "displayName": "DeepSeek R1 Distill Llama 70B", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-20", + "openWeights": false, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "deepseek/deepseek-r1-distill-llama-70b", + "modelKey": "deepseek/deepseek-r1-distill-llama-70b", + "displayName": "DeepSeek: R1 Distill Llama 70B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-01-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "deepseek/deepseek-r1-distill-llama-70b", + "modelKey": "deepseek/deepseek-r1-distill-llama-70b", + "displayName": "DeepSeek R1 Distill LLama 70B", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-01-27", + "openWeights": true, + "releaseDate": "2025-01-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "deepseek/deepseek-r1-distill-llama-70b", + "modelKey": "deepseek/deepseek-r1-distill-llama-70b", + "displayName": "R1 Distill Llama 70B", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07-31", + "lastUpdated": "2025-01-23", + "openWeights": true, + "releaseDate": "2025-01-23" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-R1-Distill-Llama-70B", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-llama-70b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gradient_ai", + "model": "gradient_ai/deepseek-r1-distill-llama-70b", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/deepseek-ai/DeepSeek-R1-Distill-Llama-70B", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/deepseek/deepseek-r1-distill-llama-70b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nscale", + "model": "nscale/deepseek-ai/DeepSeek-R1-Distill-Llama-70B", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Pricing listed as $0.75/1M tokens total. Assumed 50/50 split for input/output." + }, + "source": "https://docs.nscale.com/docs/inference/serverless-models/current#chat-models" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ovhcloud", + "model": "ovhcloud/DeepSeek-R1-Distill-Llama-70B", + "mode": "chat", + "metadata": { + "source": "https://endpoints.ai.cloud.ovh.net/models/deepseek-r1-distill-llama-70b" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sambanova", + "model": "sambanova/DeepSeek-R1-Distill-Llama-70B", + "mode": "chat", + "metadata": { + "source": "https://cloud.sambanova.ai/plans/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/deepseek/deepseek-r1-distill-llama-70b", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "deepseek/deepseek-r1-distill-llama-70b", + "displayName": "DeepSeek: R1 Distill Llama 70B", + "metadata": { + "canonicalSlug": "deepseek/deepseek-r1-distill-llama-70b", + "createdAt": "2025-01-23T20:12:49.000Z", + "huggingFaceId": "deepseek-ai/DeepSeek-R1-Distill-Llama-70B", + "instructType": "deepseek-r1", + "knowledgeCutoff": "2024-07-31", + "links": { + "details": "/api/v1/models/deepseek/deepseek-r1-distill-llama-70b/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "seed", + "stop", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 8192, + "max_completion_tokens": 8192, + "is_moderated": false + } + } + } + ] + }, + { + "id": "deepseek/deepseek-r1-distill-llama-70b-abliterated", + "provider": "deepseek", + "model": "deepseek-r1-distill-llama-70b-abliterated", + "displayName": "DeepSeek R1 Llama 70B Abliterated", + "family": "deepseek", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/huihui-ai/DeepSeek-R1-Distill-Llama-70B-abliterated" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "huihui-ai/DeepSeek-R1-Distill-Llama-70B-abliterated", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 0.7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek R1 Llama 70B Abliterated" + ], + "families": [ + "deepseek" + ], + "releaseDate": "2025-01-20", + "lastUpdated": "2025-01-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "huihui-ai/DeepSeek-R1-Distill-Llama-70B-abliterated", + "modelKey": "huihui-ai/DeepSeek-R1-Distill-Llama-70B-abliterated", + "displayName": "DeepSeek R1 Llama 70B Abliterated", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-01-20", + "openWeights": false, + "releaseDate": "2025-01-20" + } + } + ] + }, + { + "id": "deepseek/deepseek-r1-distill-llama-8b", + "provider": "deepseek", + "model": "deepseek-r1-distill-llama-8b", + "displayName": "DeepSeek R1 Distill Llama 8B", + "family": "deepseek-thinking", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "alibaba-cn", + "fireworks_ai", + "nscale" + ], + "aliases": [ + "alibaba-cn/deepseek-r1-distill-llama-8b", + "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-llama-8b", + "nscale/deepseek-ai/DeepSeek-R1-Distill-Llama-8B" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "deepseek-r1-distill-llama-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-llama-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "nscale", + "model": "nscale/deepseek-ai/DeepSeek-R1-Distill-Llama-8B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.025, + "output": 0.025 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek R1 Distill Llama 8B" + ], + "families": [ + "deepseek-thinking" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "deepseek-r1-distill-llama-8b", + "modelKey": "deepseek-r1-distill-llama-8b", + "displayName": "DeepSeek R1 Distill Llama 8B", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-llama-8b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nscale", + "model": "nscale/deepseek-ai/DeepSeek-R1-Distill-Llama-8B", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Pricing listed as $0.05/1M tokens total. Assumed 50/50 split for input/output." + }, + "source": "https://docs.nscale.com/docs/inference/serverless-models/current#chat-models" + } + } + ] + }, + { + "id": "deepseek/deepseek-r1-distill-qwen-1-5b", + "provider": "deepseek", + "model": "deepseek-r1-distill-qwen-1-5b", + "displayName": "DeepSeek R1 Distill Qwen 1.5B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/deepseek-r1-distill-qwen-1-5b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "deepseek-r1-distill-qwen-1-5b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek R1 Distill Qwen 1.5B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "deepseek-r1-distill-qwen-1-5b", + "modelKey": "deepseek-r1-distill-qwen-1-5b", + "displayName": "DeepSeek R1 Distill Qwen 1.5B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + } + ] + }, + { + "id": "deepseek/deepseek-r1-distill-qwen-1.5b", + "provider": "deepseek", + "model": "deepseek-r1-distill-qwen-1.5b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "nscale" + ], + "aliases": [ + "nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "nscale", + "model": "nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.09, + "output": 0.09 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nscale", + "model": "nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Pricing listed as $0.18/1M tokens total. Assumed 50/50 split for input/output." + }, + "source": "https://docs.nscale.com/docs/inference/serverless-models/current#chat-models" + } + } + ] + }, + { + "id": "deepseek/deepseek-r1-distill-qwen-14b", + "provider": "deepseek", + "model": "deepseek-r1-distill-qwen-14b", + "displayName": "DeepSeek R1 Distill Qwen 14B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "alibaba-cn", + "fireworks_ai", + "novita", + "novita-ai", + "nscale", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "alibaba-cn/deepseek-r1-distill-qwen-14b", + "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-qwen-14b", + "novita-ai/deepseek/deepseek-r1-distill-qwen-14b", + "novita/deepseek/deepseek-r1-distill-qwen-14b", + "nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "siliconflow-cn/deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "siliconflow/deepseek-ai/DeepSeek-R1-Distill-Qwen-14B" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "responseSchema": true, + "systemMessages": true, + "toolChoice": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "deepseek-r1-distill-qwen-14b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.144, + "output": 0.431 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "deepseek/deepseek-r1-distill-qwen-14b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-qwen-14b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/deepseek/deepseek-r1-distill-qwen-14b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "nscale", + "model": "nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0.07 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek R1 Distill Qwen 14B", + "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B" + ], + "families": [ + "deepseek-thinking", + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "deepseek-r1-distill-qwen-14b", + "modelKey": "deepseek-r1-distill-qwen-14b", + "displayName": "DeepSeek R1 Distill Qwen 14B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "deepseek/deepseek-r1-distill-qwen-14b", + "modelKey": "deepseek/deepseek-r1-distill-qwen-14b", + "displayName": "DeepSeek R1 Distill Qwen 14B", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-01-20", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "modelKey": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "displayName": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "modelKey": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "displayName": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-01-20" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-qwen-14b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/deepseek/deepseek-r1-distill-qwen-14b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nscale", + "model": "nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Pricing listed as $0.14/1M tokens total. Assumed 50/50 split for input/output." + }, + "source": "https://docs.nscale.com/docs/inference/serverless-models/current#chat-models" + } + } + ] + }, + { + "id": "deepseek/deepseek-r1-distill-qwen-1p5b", + "provider": "deepseek", + "model": "deepseek-r1-distill-qwen-1p5b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-qwen-1p5b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-qwen-1p5b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-qwen-1p5b", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-r1-distill-qwen-32b", + "provider": "deepseek", + "model": "deepseek-r1-distill-qwen-32b", + "displayName": "DeepSeek R1 Distill Qwen 32B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "alibaba-cn", + "cloudflare-ai-gateway", + "cloudflare-workers-ai", + "deepinfra", + "fireworks_ai", + "kilo", + "novita", + "novita-ai", + "nscale", + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "alibaba-cn/deepseek-r1-distill-qwen-32b", + "cloudflare-ai-gateway/workers-ai/@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", + "cloudflare-workers-ai/@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", + "deepinfra/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-qwen-32b", + "kilo/deepseek/deepseek-r1-distill-qwen-32b", + "novita-ai/deepseek/deepseek-r1-distill-qwen-32b", + "novita/deepseek/deepseek-r1-distill-qwen-32b", + "nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "siliconflow-cn/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "siliconflow/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B" + ], + "mergedProviderModelRecords": 11, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "responseSchema": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "deepseek-r1-distill-qwen-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.287, + "output": 0.861 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 4.88 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.497, + "output": 4.881 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "deepseek/deepseek-r1-distill-qwen-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 0.29 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "deepseek/deepseek-r1-distill-qwen-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.18 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.18 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.27, + "output": 0.27 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-qwen-32b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/deepseek/deepseek-r1-distill-qwen-32b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "nscale", + "model": "nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek R1 Distill Qwen 32B", + "DeepSeek: R1 Distill Qwen 32B", + "Deepseek R1 Distill Qwen 32B", + "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B" + ], + "families": [ + "deepseek-thinking", + "qwen" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 11 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "deepseek-r1-distill-qwen-32b", + "modelKey": "deepseek-r1-distill-qwen-32b", + "displayName": "DeepSeek R1 Distill Qwen 32B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", + "modelKey": "workers-ai/@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", + "displayName": "DeepSeek R1 Distill Qwen 32B", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", + "modelKey": "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", + "displayName": "Deepseek R1 Distill Qwen 32B", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-05-29", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "deepseek/deepseek-r1-distill-qwen-32b", + "modelKey": "deepseek/deepseek-r1-distill-qwen-32b", + "displayName": "DeepSeek: R1 Distill Qwen 32B", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": true, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "deepseek/deepseek-r1-distill-qwen-32b", + "modelKey": "deepseek/deepseek-r1-distill-qwen-32b", + "displayName": "DeepSeek R1 Distill Qwen 32B", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-01-20", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "modelKey": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "displayName": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "modelKey": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "displayName": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-01-20" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-qwen-32b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/deepseek/deepseek-r1-distill-qwen-32b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nscale", + "model": "nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Pricing listed as $0.30/1M tokens total. Assumed 50/50 split for input/output." + }, + "source": "https://docs.nscale.com/docs/inference/serverless-models/current#chat-models" + } + } + ] + }, + { + "id": "deepseek/deepseek-r1-distill-qwen-32b-abliterated", + "provider": "deepseek", + "model": "deepseek-r1-distill-qwen-32b-abliterated", + "displayName": "DeepSeek R1 Qwen Abliterated", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/huihui-ai/DeepSeek-R1-Distill-Qwen-32B-abliterated" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "huihui-ai/DeepSeek-R1-Distill-Qwen-32B-abliterated", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.4, + "output": 1.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek R1 Qwen Abliterated" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-01-20", + "lastUpdated": "2025-01-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "huihui-ai/DeepSeek-R1-Distill-Qwen-32B-abliterated", + "modelKey": "huihui-ai/DeepSeek-R1-Distill-Qwen-32B-abliterated", + "displayName": "DeepSeek R1 Qwen Abliterated", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-01-20", + "openWeights": false, + "releaseDate": "2025-01-20" + } + } + ] + }, + { + "id": "deepseek/deepseek-r1-distill-qwen-7b", + "provider": "deepseek", + "model": "deepseek-r1-distill-qwen-7b", + "displayName": "DeepSeek R1 Distill Qwen 7B", + "family": "qwen", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "alibaba-cn", + "fireworks_ai", + "nscale" + ], + "aliases": [ + "alibaba-cn/deepseek-r1-distill-qwen-7b", + "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-qwen-7b", + "nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "deepseek-r1-distill-qwen-7b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.072, + "output": 0.144 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-qwen-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "nscale", + "model": "nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek R1 Distill Qwen 7B" + ], + "families": [ + "qwen" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "deepseek-r1-distill-qwen-7b", + "modelKey": "deepseek-r1-distill-qwen-7b", + "displayName": "DeepSeek R1 Distill Qwen 7B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-r1-distill-qwen-7b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nscale", + "model": "nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Pricing listed as $0.40/1M tokens total. Assumed 50/50 split for input/output." + }, + "source": "https://docs.nscale.com/docs/inference/serverless-models/current#chat-models" + } + } + ] + }, + { + "id": "deepseek/deepseek-r1-sambanova", + "provider": "deepseek", + "model": "deepseek-r1-sambanova", + "displayName": "DeepSeek R1 Fast", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/deepseek-r1-sambanova" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek-r1-sambanova", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4.998, + "output": 6.987 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek R1 Fast" + ], + "releaseDate": "2025-02-20", + "lastUpdated": "2025-02-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek-r1-sambanova", + "modelKey": "deepseek-r1-sambanova", + "displayName": "DeepSeek R1 Fast", + "metadata": { + "lastUpdated": "2025-02-20", + "openWeights": false, + "releaseDate": "2025-02-20" + } + } + ] + }, + { + "id": "deepseek/deepseek-r1-turbo", + "provider": "deepseek", + "model": "deepseek-r1-turbo", + "displayName": "DeepSeek R1 (Turbo)", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "deepinfra", + "novita", + "novita-ai" + ], + "aliases": [ + "deepinfra/deepseek-ai/DeepSeek-R1-Turbo", + "novita-ai/deepseek/deepseek-r1-turbo", + "novita/deepseek/deepseek-r1-turbo" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 64000, + "inputTokens": 64000, + "maxTokens": 40960, + "outputTokens": 40960, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "deepseek/deepseek-r1-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-R1-Turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/deepseek/deepseek-r1-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.7, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek R1 (Turbo)" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-03-05", + "lastUpdated": "2025-03-05", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "deepseek/deepseek-r1-turbo", + "modelKey": "deepseek/deepseek-r1-turbo", + "displayName": "DeepSeek R1 (Turbo)", + "metadata": { + "lastUpdated": "2025-03-05", + "openWeights": true, + "releaseDate": "2025-03-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-R1-Turbo", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/deepseek/deepseek-r1-turbo", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-reasoner", + "provider": "deepseek", + "model": "deepseek-reasoner", + "displayName": "DeepSeek Reasoner", + "family": "deepseek-thinking", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "deepseek", + "helicone", + "nano-gpt", + "orcarouter" + ], + "aliases": [ + "302ai/deepseek-reasoner", + "deepseek/deepseek-reasoner", + "helicone/deepseek-reasoner", + "nano-gpt/deepseek-reasoner", + "orcarouter/deepseek/deepseek-reasoner" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 1000000, + "inputTokens": 131072, + "maxTokens": 65536, + "outputTokens": 384000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": false, + "transcription": false, + "assistantPrefill": true, + "supports1MContext": true, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "deepseek-reasoner", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 0.43 + } + }, + { + "source": "models.dev", + "provider": "deepseek", + "model": "deepseek-reasoner", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "deepseek-reasoner", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.07, + "input": 0.56, + "output": 1.68 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek-reasoner", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.7 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "deepseek/deepseek-reasoner", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.435, + "output": 0.87 + } + }, + { + "source": "litellm", + "provider": "deepseek", + "model": "deepseek-reasoner", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.28, + "output": 0.42 + } + }, + { + "source": "litellm", + "provider": "deepseek", + "model": "deepseek/deepseek-reasoner", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.28, + "output": 0.42 + }, + "extra": { + "input_cost_per_token_cache_hit": 2.8e-8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek Reasoner", + "Deepseek-Reasoner" + ], + "families": [ + "deepseek-thinking" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2025-01-20", + "lastUpdated": "2025-01-20", + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "deepseek-reasoner", + "modelKey": "deepseek-reasoner", + "displayName": "Deepseek-Reasoner", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-01-20", + "openWeights": false, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepseek", + "providerName": "DeepSeek", + "providerApi": "https://api.deepseek.com", + "providerDoc": "https://api-docs.deepseek.com/quick_start/pricing", + "model": "deepseek-reasoner", + "modelKey": "deepseek-reasoner", + "displayName": "DeepSeek Reasoner", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2026-02-28", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "deepseek-reasoner", + "modelKey": "deepseek-reasoner", + "displayName": "DeepSeek Reasoner", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-20", + "openWeights": false, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek-reasoner", + "modelKey": "deepseek-reasoner", + "displayName": "DeepSeek Reasoner", + "metadata": { + "lastUpdated": "2025-01-20", + "openWeights": false, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "deepseek/deepseek-reasoner", + "modelKey": "deepseek/deepseek-reasoner", + "displayName": "DeepSeek Reasoner", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2026-02-28", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepseek", + "model": "deepseek-reasoner", + "mode": "chat", + "metadata": { + "source": "https://api-docs.deepseek.com/quick_start/pricing", + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepseek", + "model": "deepseek/deepseek-reasoner", + "mode": "chat", + "metadata": { + "source": "https://api-docs.deepseek.com/quick_start/pricing", + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + } + ] + }, + { + "id": "deepseek/deepseek-reasoner-cheaper", + "provider": "deepseek", + "model": "deepseek-reasoner-cheaper", + "displayName": "Deepseek R1 Cheaper", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/deepseek-reasoner-cheaper" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek-reasoner-cheaper", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Deepseek R1 Cheaper" + ], + "releaseDate": "2025-01-20", + "lastUpdated": "2025-01-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek-reasoner-cheaper", + "modelKey": "deepseek-reasoner-cheaper", + "displayName": "Deepseek R1 Cheaper", + "metadata": { + "lastUpdated": "2025-01-20", + "openWeights": false, + "releaseDate": "2025-01-20" + } + } + ] + }, + { + "id": "deepseek/deepseek-tng-r1t2-chimera", + "provider": "deepseek", + "model": "deepseek-tng-r1t2-chimera", + "displayName": "DeepSeek TNG R1T2 Chimera", + "family": "deepseek-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "helicone" + ], + "aliases": [ + "helicone/deepseek-tng-r1t2-chimera" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 130000, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "deepseek-tng-r1t2-chimera", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek TNG R1T2 Chimera" + ], + "families": [ + "deepseek-thinking" + ], + "knowledgeCutoff": "2025-07", + "releaseDate": "2025-07-02", + "lastUpdated": "2025-07-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "deepseek-tng-r1t2-chimera", + "modelKey": "deepseek-tng-r1t2-chimera", + "displayName": "DeepSeek TNG R1T2 Chimera", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2025-07-02", + "openWeights": false, + "releaseDate": "2025-07-02" + } + } + ] + }, + { + "id": "deepseek/deepseek-tng-r1t2-chimera-tee", + "provider": "deepseek", + "model": "deepseek-tng-r1t2-chimera-tee", + "displayName": "DeepSeek TNG R1T2 Chimera TEE", + "family": "deepseek", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/tngtech/DeepSeek-TNG-R1T2-Chimera-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "tngtech/DeepSeek-TNG-R1T2-Chimera-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.3, + "output": 1.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek TNG R1T2 Chimera TEE" + ], + "families": [ + "deepseek" + ], + "releaseDate": "2026-04-25", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "tngtech/DeepSeek-TNG-R1T2-Chimera-TEE", + "modelKey": "tngtech/DeepSeek-TNG-R1T2-Chimera-TEE", + "displayName": "DeepSeek TNG R1T2 Chimera TEE", + "family": "deepseek", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2026-04-25" + } + } + ] + }, + { + "id": "deepseek/deepseek-v2-lite-chat", + "provider": "deepseek", + "model": "deepseek-v2-lite-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/deepseek-v2-lite-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-v2-lite-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-v2-lite-chat", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-v2p5", + "provider": "deepseek", + "model": "deepseek-v2p5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/deepseek-v2p5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-v2p5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.2, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-v2p5", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-v3", + "provider": "deepseek", + "model": "deepseek-v3", + "displayName": "DeepSeek V3", + "family": "deepseek", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "alibaba-cn", + "azure_ai", + "deepinfra", + "deepseek", + "digitalocean", + "drun", + "fireworks_ai", + "helicone", + "hyperbolic", + "iflowcn", + "nebius", + "qiniu-ai", + "replicate", + "siliconflow", + "siliconflow-cn", + "synthetic", + "together_ai", + "togetherai", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "alibaba-cn/deepseek-v3", + "azure_ai/deepseek-v3", + "deepinfra/deepseek-ai/DeepSeek-V3", + "deepseek/deepseek-v3", + "digitalocean/deepseek-v3", + "drun/public/deepseek-v3", + "fireworks_ai/accounts/fireworks/models/deepseek-v3", + "helicone/deepseek-v3", + "hyperbolic/deepseek-ai/DeepSeek-V3", + "iflowcn/deepseek-v3", + "nebius/deepseek-ai/DeepSeek-V3", + "qiniu-ai/deepseek-v3", + "replicate/deepseek-ai/deepseek-v3", + "siliconflow-cn/Pro/deepseek-ai/DeepSeek-V3", + "siliconflow-cn/deepseek-ai/DeepSeek-V3", + "siliconflow/deepseek-ai/DeepSeek-V3", + "synthetic/hf:deepseek-ai/DeepSeek-V3", + "together_ai/deepseek-ai/DeepSeek-V3", + "togetherai/deepseek-ai/DeepSeek-V3", + "vercel/deepseek/deepseek-v3", + "vercel_ai_gateway/deepseek/deepseek-v3" + ], + "mergedProviderModelRecords": 21, + "limits": { + "contextTokens": 164000, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 164000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "structuredOutput": true, + "responseSchema": true, + "parallelFunctionCalling": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "deepseek-v3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.287, + "output": 1.147 + } + }, + { + "source": "models.dev", + "provider": "drun", + "model": "public/deepseek-v3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.28, + "output": 1.1 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "deepseek-v3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.07, + "input": 0.56, + "output": 1.68 + } + }, + { + "source": "models.dev", + "provider": "iflowcn", + "model": "deepseek-v3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "deepseek-ai/DeepSeek-V3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Pro/deepseek-ai/DeepSeek-V3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "deepseek-ai/DeepSeek-V3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:deepseek-ai/DeepSeek-V3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "deepseek-ai/DeepSeek-V3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "deepseek/deepseek-v3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.135, + "input": 0.27, + "output": 1.12 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/deepseek-v3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.14, + "output": 4.56 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-V3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.38, + "output": 0.89 + } + }, + { + "source": "litellm", + "provider": "deepseek", + "model": "deepseek/deepseek-v3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.07, + "cacheWrite": 0, + "input": 0.27, + "output": 1.1 + }, + "extra": { + "input_cost_per_token_cache_hit": 7e-8 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-v3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "hyperbolic", + "model": "hyperbolic/deepseek-ai/DeepSeek-V3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/deepseek-ai/DeepSeek-V3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/deepseek-ai/deepseek-v3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.45, + "output": 1.45 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/deepseek-ai/DeepSeek-V3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.25, + "output": 1.25 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/deepseek/deepseek-v3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3", + "DeepSeek V3 0324", + "DeepSeek-V3", + "Pro/deepseek-ai/DeepSeek-V3", + "deepseek-ai/DeepSeek-V3" + ], + "families": [ + "deepseek" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2024-12-01", + "lastUpdated": "2024-12-01", + "providerModelRecordCount": 21 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "deepseek-v3", + "modelKey": "deepseek-v3", + "displayName": "DeepSeek V3", + "family": "deepseek", + "metadata": { + "lastUpdated": "2024-12-01", + "openWeights": false, + "releaseDate": "2024-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "deepseek-v3", + "modelKey": "deepseek-v3", + "displayName": "DeepSeek V3", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-03-24", + "openWeights": true, + "releaseDate": "2024-12-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "drun", + "providerName": "D.Run (China)", + "providerApi": "https://chat.d.run/v1", + "providerDoc": "https://www.d.run", + "model": "public/deepseek-v3", + "modelKey": "public/deepseek-v3", + "displayName": "DeepSeek V3", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2024-12-26", + "openWeights": true, + "releaseDate": "2024-12-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "deepseek-v3", + "modelKey": "deepseek-v3", + "displayName": "DeepSeek V3", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2024-12-26", + "openWeights": false, + "releaseDate": "2024-12-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "iflowcn", + "providerName": "iFlow", + "providerApi": "https://apis.iflow.cn/v1", + "providerDoc": "https://platform.iflow.cn/en/docs", + "model": "deepseek-v3", + "modelKey": "deepseek-v3", + "displayName": "DeepSeek-V3", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-12-26", + "openWeights": true, + "releaseDate": "2024-12-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "deepseek-v3", + "modelKey": "deepseek-v3", + "displayName": "DeepSeek-V3", + "metadata": { + "lastUpdated": "2025-08-13", + "openWeights": false, + "releaseDate": "2025-08-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/DeepSeek-V3", + "modelKey": "deepseek-ai/DeepSeek-V3", + "displayName": "deepseek-ai/DeepSeek-V3", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-12-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Pro/deepseek-ai/DeepSeek-V3", + "modelKey": "Pro/deepseek-ai/DeepSeek-V3", + "displayName": "Pro/deepseek-ai/DeepSeek-V3", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-12-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/DeepSeek-V3", + "modelKey": "deepseek-ai/DeepSeek-V3", + "displayName": "deepseek-ai/DeepSeek-V3", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-12-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:deepseek-ai/DeepSeek-V3", + "modelKey": "hf:deepseek-ai/DeepSeek-V3", + "displayName": "DeepSeek V3", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-05-29", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "deepseek-ai/DeepSeek-V3", + "modelKey": "deepseek-ai/DeepSeek-V3", + "displayName": "DeepSeek-V3", + "family": "deepseek", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-05-29", + "openWeights": true, + "releaseDate": "2024-12-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "deepseek/deepseek-v3", + "modelKey": "deepseek/deepseek-v3", + "displayName": "DeepSeek V3 0324", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2024-12-26", + "openWeights": false, + "releaseDate": "2024-12-26" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/deepseek-v3", + "mode": "chat", + "metadata": { + "source": "https://techcommunity.microsoft.com/blog/machinelearningblog/announcing-deepseek-v3-on-azure-ai-foundry-and-github/4390438" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-V3", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepseek", + "model": "deepseek/deepseek-v3", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-v3", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "hyperbolic", + "model": "hyperbolic/deepseek-ai/DeepSeek-V3", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/deepseek-ai/DeepSeek-V3", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/deepseek-ai/deepseek-v3", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/deepseek-ai/DeepSeek-V3", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/deepseek/deepseek-v3", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-v3-0324", + "provider": "deepseek", + "model": "deepseek-v3-0324", + "displayName": "siliconflow/deepseek-v3-0324", + "family": "deepseek", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "alibaba-cn", + "azure", + "azure-cognitive-services", + "azure_ai", + "baseten", + "cortecs", + "crusoe", + "deepinfra", + "fireworks_ai", + "github-models", + "gmi", + "hyperbolic", + "jiekou", + "lambda_ai", + "meganova", + "nano-gpt", + "nebius", + "novita", + "novita-ai", + "qiniu-ai", + "sambanova", + "submodel", + "synthetic", + "wandb" + ], + "aliases": [ + "alibaba-cn/siliconflow/deepseek-v3-0324", + "azure-cognitive-services/deepseek-v3-0324", + "azure/deepseek-v3-0324", + "azure_ai/deepseek-v3-0324", + "baseten/deepseek-ai/DeepSeek-V3-0324", + "cortecs/deepseek-v3-0324", + "crusoe/deepseek-ai/DeepSeek-V3-0324", + "deepinfra/deepseek-ai/DeepSeek-V3-0324", + "fireworks_ai/accounts/fireworks/models/deepseek-v3-0324", + "github-models/deepseek/deepseek-v3-0324", + "gmi/deepseek-ai/DeepSeek-V3-0324", + "hyperbolic/deepseek-ai/DeepSeek-V3-0324", + "jiekou/deepseek/deepseek-v3-0324", + "lambda_ai/deepseek-v3-0324", + "meganova/deepseek-ai/DeepSeek-V3-0324", + "nano-gpt/deepseek-v3-0324", + "nebius/deepseek-ai/DeepSeek-V3-0324", + "novita-ai/deepseek/deepseek-v3-0324", + "novita/deepseek/deepseek-v3-0324", + "qiniu-ai/deepseek-v3-0324", + "sambanova/DeepSeek-V3-0324", + "submodel/deepseek-ai/DeepSeek-V3-0324", + "synthetic/hf:deepseek-ai/DeepSeek-V3-0324", + "wandb/deepseek-ai/DeepSeek-V3-0324" + ], + "mergedProviderModelRecords": 24, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": true, + "systemMessages": true, + "responseSchema": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "siliconflow/deepseek-v3-0324", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "deepseek-v3-0324", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.14, + "output": 4.56 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "deepseek-v3-0324", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.14, + "output": 4.56 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "deepseek-v3-0324", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.551, + "output": 1.654 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "deepseek/deepseek-v3-0324", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "deepseek/deepseek-v3-0324", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.28, + "output": 1.14 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "deepseek-ai/DeepSeek-V3-0324", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 0.88 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek-v3-0324", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 0.7 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "deepseek/deepseek-v3-0324", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.135, + "input": 0.27, + "output": 1.12 + } + }, + { + "source": "models.dev", + "provider": "submodel", + "model": "deepseek-ai/DeepSeek-V3-0324", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:deepseek-ai/DeepSeek-V3-0324", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.2, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/deepseek-v3-0324", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.14, + "output": 4.56 + } + }, + { + "source": "litellm", + "provider": "baseten", + "model": "baseten/deepseek-ai/DeepSeek-V3-0324", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.77, + "output": 0.77 + } + }, + { + "source": "litellm", + "provider": "crusoe", + "model": "crusoe/deepseek-ai/DeepSeek-V3-0324", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-V3-0324", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 0.88 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-v3-0324", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "gmi", + "model": "gmi/deepseek-ai/DeepSeek-V3-0324", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.28, + "output": 0.88 + } + }, + { + "source": "litellm", + "provider": "hyperbolic", + "model": "hyperbolic/deepseek-ai/DeepSeek-V3-0324", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/deepseek-v3-0324", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/deepseek-ai/DeepSeek-V3-0324", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/deepseek/deepseek-v3-0324", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.135, + "input": 0.27, + "output": 1.12 + }, + "extra": { + "input_cost_per_token_cache_hit": 1.35e-7 + } + }, + { + "source": "litellm", + "provider": "sambanova", + "model": "sambanova/DeepSeek-V3-0324", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 4.5 + } + }, + { + "source": "litellm", + "provider": "wandb", + "model": "wandb/deepseek-ai/DeepSeek-V3-0324", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 114000, + "output": 275000 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek Chat 0324", + "DeepSeek V3 (0324)", + "DeepSeek V3 0324", + "DeepSeek-V3-0324", + "siliconflow/deepseek-v3-0324" + ], + "families": [ + "deepseek" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2024-12-26", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 24 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "siliconflow/deepseek-v3-0324", + "modelKey": "siliconflow/deepseek-v3-0324", + "displayName": "siliconflow/deepseek-v3-0324", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-12-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "deepseek-v3-0324", + "modelKey": "deepseek-v3-0324", + "displayName": "DeepSeek-V3-0324", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-03-24", + "openWeights": true, + "releaseDate": "2025-03-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "deepseek-v3-0324", + "modelKey": "deepseek-v3-0324", + "displayName": "DeepSeek-V3-0324", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-03-24", + "openWeights": true, + "releaseDate": "2025-03-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "deepseek-v3-0324", + "modelKey": "deepseek-v3-0324", + "displayName": "DeepSeek V3 0324", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-03-24", + "openWeights": true, + "releaseDate": "2025-03-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "deepseek/deepseek-v3-0324", + "modelKey": "deepseek/deepseek-v3-0324", + "displayName": "DeepSeek-V3-0324", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2025-03-24", + "openWeights": true, + "releaseDate": "2025-03-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "deepseek/deepseek-v3-0324", + "modelKey": "deepseek/deepseek-v3-0324", + "displayName": "DeepSeek V3 0324", + "family": "deepseek", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "deepseek-ai/DeepSeek-V3-0324", + "modelKey": "deepseek-ai/DeepSeek-V3-0324", + "displayName": "DeepSeek V3 0324", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-03-24", + "openWeights": true, + "releaseDate": "2025-03-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek-v3-0324", + "modelKey": "deepseek-v3-0324", + "displayName": "DeepSeek Chat 0324", + "metadata": { + "lastUpdated": "2025-03-24", + "openWeights": false, + "releaseDate": "2025-03-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "deepseek/deepseek-v3-0324", + "modelKey": "deepseek/deepseek-v3-0324", + "displayName": "DeepSeek V3 0324", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-03-25", + "openWeights": true, + "releaseDate": "2025-03-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "deepseek-v3-0324", + "modelKey": "deepseek-v3-0324", + "displayName": "DeepSeek-V3-0324", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "submodel", + "providerName": "submodel", + "providerApi": "https://llm.submodel.ai/v1", + "providerDoc": "https://submodel.gitbook.io", + "model": "deepseek-ai/DeepSeek-V3-0324", + "modelKey": "deepseek-ai/DeepSeek-V3-0324", + "displayName": "DeepSeek V3 0324", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-08-23", + "openWeights": false, + "releaseDate": "2025-08-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:deepseek-ai/DeepSeek-V3-0324", + "modelKey": "hf:deepseek-ai/DeepSeek-V3-0324", + "displayName": "DeepSeek V3 (0324)", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-08-01", + "openWeights": false, + "releaseDate": "2025-08-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/deepseek-v3-0324", + "mode": "chat", + "metadata": { + "source": "https://techcommunity.microsoft.com/blog/machinelearningblog/announcing-deepseek-v3-on-azure-ai-foundry-and-github/4390438" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "baseten", + "model": "baseten/deepseek-ai/DeepSeek-V3-0324", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "crusoe", + "model": "crusoe/deepseek-ai/DeepSeek-V3-0324", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-V3-0324", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-v3-0324", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/models/fireworks/deepseek-v3-0324" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gmi", + "model": "gmi/deepseek-ai/DeepSeek-V3-0324", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "hyperbolic", + "model": "hyperbolic/deepseek-ai/DeepSeek-V3-0324", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/deepseek-v3-0324", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/deepseek-ai/DeepSeek-V3-0324", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/deepseek/deepseek-v3-0324", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sambanova", + "model": "sambanova/DeepSeek-V3-0324", + "mode": "chat", + "metadata": { + "source": "https://cloud.sambanova.ai/plans/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "wandb", + "model": "wandb/deepseek-ai/DeepSeek-V3-0324", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-v3-0324-tee", + "provider": "deepseek", + "model": "deepseek-v3-0324-tee", + "displayName": "DeepSeek V3 0324 TEE", + "family": "deepseek", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/deepseek-ai/DeepSeek-V3-0324-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "deepseek-ai/DeepSeek-V3-0324-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 0.25, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3 0324 TEE" + ], + "families": [ + "deepseek" + ], + "releaseDate": "2025-12-29", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "deepseek-ai/DeepSeek-V3-0324-TEE", + "modelKey": "deepseek-ai/DeepSeek-V3-0324-TEE", + "displayName": "DeepSeek V3 0324 TEE", + "family": "deepseek", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29" + } + } + ] + }, + { + "id": "deepseek/deepseek-v3-1", + "provider": "deepseek", + "model": "deepseek-v3-1", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-cn", + "togetherai" + ], + "aliases": [ + "alibaba-cn/deepseek-v3-1", + "togetherai/deepseek-ai/DeepSeek-V3-1" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "deepseek-v3-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.574, + "output": 1.721 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "deepseek-ai/DeepSeek-V3-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 1.7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.1" + ], + "families": [ + "deepseek" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-08", + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "deepseek-v3-1", + "modelKey": "deepseek-v3-1", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "deepseek-ai/DeepSeek-V3-1", + "modelKey": "deepseek-ai/DeepSeek-V3-1", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-08", + "lastUpdated": "2025-08-21", + "openWeights": true, + "releaseDate": "2025-08-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "deepseek/deepseek-v3-2-251201", + "provider": "deepseek", + "model": "deepseek-v3-2-251201", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "volcengine" + ], + "aliases": [ + "volcengine/deepseek-v3-2-251201" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 98304, + "inputTokens": 98304, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "volcengine", + "model": "deepseek-v3-2-251201", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "volcengine", + "model": "deepseek-v3-2-251201", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-v3-2-exp", + "provider": "deepseek", + "model": "deepseek-v3-2-exp", + "displayName": "DeepSeek V3.2 Exp", + "family": "deepseek", + "sources": [ + "models.dev" + ], + "providers": [ + "alibaba-cn" + ], + "aliases": [ + "alibaba-cn/deepseek-v3-2-exp" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "deepseek-v3-2-exp", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.287, + "output": 0.431 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.2 Exp" + ], + "families": [ + "deepseek" + ], + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "deepseek-v3-2-exp", + "modelKey": "deepseek-v3-2-exp", + "displayName": "DeepSeek V3.2 Exp", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + } + ] + }, + { + "id": "deepseek/deepseek-v3-turbo", + "provider": "deepseek", + "model": "deepseek-v3-turbo", + "displayName": "DeepSeek V3 (Turbo)", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "novita", + "novita-ai" + ], + "aliases": [ + "novita-ai/deepseek/deepseek-v3-turbo", + "novita/deepseek/deepseek-v3-turbo" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 64000, + "inputTokens": 64000, + "maxTokens": 16000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "deepseek/deepseek-v3-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.3 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/deepseek/deepseek-v3-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 1.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3 (Turbo)" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-03-05", + "lastUpdated": "2025-03-05", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "deepseek/deepseek-v3-turbo", + "modelKey": "deepseek/deepseek-v3-turbo", + "displayName": "DeepSeek V3 (Turbo)", + "metadata": { + "lastUpdated": "2025-03-05", + "openWeights": true, + "releaseDate": "2025-03-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/deepseek/deepseek-v3-turbo", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-v3.1", + "provider": "deepseek", + "model": "deepseek-v3.1", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "abacus", + "azure", + "azure-cognitive-services", + "baseten", + "deepinfra", + "jiekou", + "llmgateway", + "meganova", + "nano-gpt", + "novita", + "novita-ai", + "qiniu-ai", + "replicate", + "sambanova", + "siliconflow", + "submodel", + "synthetic", + "together_ai", + "vercel", + "wandb" + ], + "aliases": [ + "abacus/deepseek/deepseek-v3.1", + "azure-cognitive-services/deepseek-v3.1", + "azure/deepseek-v3.1", + "baseten/deepseek-ai/DeepSeek-V3.1", + "deepinfra/deepseek-ai/DeepSeek-V3.1", + "jiekou/deepseek/deepseek-v3.1", + "llmgateway/deepseek-v3.1", + "meganova/deepseek-ai/DeepSeek-V3.1", + "nano-gpt/TEE/deepseek-v3.1", + "nano-gpt/deepseek-ai/DeepSeek-V3.1", + "novita-ai/deepseek/deepseek-v3.1", + "novita/deepseek/deepseek-v3.1", + "qiniu-ai/deepseek-v3.1", + "replicate/deepseek-ai/deepseek-v3.1", + "sambanova/DeepSeek-V3.1", + "siliconflow/deepseek-ai/DeepSeek-V3.1", + "submodel/deepseek-ai/DeepSeek-V3.1", + "synthetic/hf:deepseek-ai/DeepSeek-V3.1", + "together_ai/deepseek-ai/DeepSeek-V3.1", + "vercel/deepseek/deepseek-v3.1", + "wandb/deepseek-ai/DeepSeek-V3.1" + ], + "mergedProviderModelRecords": 21, + "limits": { + "contextTokens": 164000, + "inputTokens": 164000, + "maxTokens": 163840, + "outputTokens": 164000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false, + "structuredOutput": true, + "functionCalling": true, + "toolChoice": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "deepseek/deepseek-v3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 1.66 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "deepseek-v3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.56, + "output": 1.68 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "deepseek-v3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.56, + "output": 1.68 + } + }, + { + "source": "models.dev", + "provider": "baseten", + "model": "deepseek-ai/DeepSeek-V3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "deepseek/deepseek-v3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "deepseek-v3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.07, + "input": 0.56, + "output": 1.68 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "deepseek-ai/DeepSeek-V3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek-ai/DeepSeek-V3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.7 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/deepseek-v3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "deepseek/deepseek-v3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.135, + "input": 0.27, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "deepseek-ai/DeepSeek-V3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "submodel", + "model": "deepseek-ai/DeepSeek-V3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:deepseek-ai/DeepSeek-V3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.56, + "output": 1.68 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "deepseek/deepseek-v3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.28, + "input": 0.56, + "output": 1.68 + } + }, + { + "source": "models.dev", + "provider": "wandb", + "model": "deepseek-ai/DeepSeek-V3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 1.65 + } + }, + { + "source": "litellm", + "provider": "baseten", + "model": "baseten/deepseek-ai/DeepSeek-V3.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-V3.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.216, + "input": 0.27, + "output": 1 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/deepseek/deepseek-v3.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.135, + "input": 0.27, + "output": 1 + }, + "extra": { + "input_cost_per_token_cache_hit": 1.35e-7 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/deepseek-ai/deepseek-v3.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.672, + "output": 2.016 + } + }, + { + "source": "litellm", + "provider": "sambanova", + "model": "sambanova/DeepSeek-V3.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 4.5 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/deepseek-ai/DeepSeek-V3.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 1.7 + } + }, + { + "source": "litellm", + "provider": "wandb", + "model": "wandb/deepseek-ai/DeepSeek-V3.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 55000, + "output": 165000 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.1", + "DeepSeek V3.1 TEE", + "DeepSeek-V3.1", + "deepseek-ai/DeepSeek-V3.1" + ], + "families": [ + "deepseek" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2025-01-20", + "lastUpdated": "2025-01-20", + "providerModelRecordCount": 21 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "deepseek/deepseek-v3.1", + "modelKey": "deepseek/deepseek-v3.1", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-01-20", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "deepseek-v3.1", + "modelKey": "deepseek-v3.1", + "displayName": "DeepSeek-V3.1", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-08-21", + "openWeights": true, + "releaseDate": "2025-08-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "deepseek-v3.1", + "modelKey": "deepseek-v3.1", + "displayName": "DeepSeek-V3.1", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-08-21", + "openWeights": true, + "releaseDate": "2025-08-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "baseten", + "providerName": "Baseten", + "providerApi": "https://inference.baseten.co/v1", + "providerDoc": "https://docs.baseten.co/inference/model-apis/overview", + "model": "deepseek-ai/DeepSeek-V3.1", + "modelKey": "deepseek-ai/DeepSeek-V3.1", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "status": "deprecated", + "metadata": { + "lastUpdated": "2025-08-25", + "openWeights": true, + "releaseDate": "2025-08-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "deepseek/deepseek-v3.1", + "modelKey": "deepseek/deepseek-v3.1", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024, + "max": 32767 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "deepseek-v3.1", + "modelKey": "deepseek-v3.1", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-08-21", + "openWeights": true, + "releaseDate": "2025-08-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "deepseek-ai/DeepSeek-V3.1", + "modelKey": "deepseek-ai/DeepSeek-V3.1", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-08-25", + "openWeights": true, + "releaseDate": "2025-08-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek-ai/DeepSeek-V3.1", + "modelKey": "deepseek-ai/DeepSeek-V3.1", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-07-26", + "openWeights": false, + "releaseDate": "2025-07-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/deepseek-v3.1", + "modelKey": "TEE/deepseek-v3.1", + "displayName": "DeepSeek V3.1 TEE", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-08-21", + "openWeights": false, + "releaseDate": "2025-08-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "deepseek/deepseek-v3.1", + "modelKey": "deepseek/deepseek-v3.1", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-08-21", + "openWeights": true, + "releaseDate": "2025-08-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "deepseek-v3.1", + "modelKey": "deepseek-v3.1", + "displayName": "DeepSeek-V3.1", + "metadata": { + "lastUpdated": "2025-08-19", + "openWeights": false, + "releaseDate": "2025-08-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/DeepSeek-V3.1", + "modelKey": "deepseek-ai/DeepSeek-V3.1", + "displayName": "deepseek-ai/DeepSeek-V3.1", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-08-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "submodel", + "providerName": "submodel", + "providerApi": "https://llm.submodel.ai/v1", + "providerDoc": "https://submodel.gitbook.io", + "model": "deepseek-ai/DeepSeek-V3.1", + "modelKey": "deepseek-ai/DeepSeek-V3.1", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-08-23", + "openWeights": false, + "releaseDate": "2025-08-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:deepseek-ai/DeepSeek-V3.1", + "modelKey": "hf:deepseek-ai/DeepSeek-V3.1", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-08-21", + "openWeights": false, + "releaseDate": "2025-08-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "deepseek/deepseek-v3.1", + "modelKey": "deepseek/deepseek-v3.1", + "displayName": "DeepSeek-V3.1", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-08-21", + "openWeights": false, + "releaseDate": "2025-08-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "deepseek-ai/DeepSeek-V3.1", + "modelKey": "deepseek-ai/DeepSeek-V3.1", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "metadata": { + "lastUpdated": "2026-03-12", + "openWeights": true, + "releaseDate": "2025-08-21" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "baseten", + "model": "baseten/deepseek-ai/DeepSeek-V3.1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-V3.1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/deepseek/deepseek-v3.1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/deepseek-ai/deepseek-v3.1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sambanova", + "model": "sambanova/DeepSeek-V3.1", + "mode": "chat", + "metadata": { + "source": "https://cloud.sambanova.ai/plans/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/deepseek-ai/DeepSeek-V3.1", + "mode": "chat", + "metadata": { + "source": "https://www.together.ai/models/deepseek-v3-1" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "wandb", + "model": "wandb/deepseek-ai/DeepSeek-V3.1", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-v3.1-maas", + "provider": "deepseek", + "model": "deepseek-v3.1-maas", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "vertex_ai-deepseek_models" + ], + "aliases": [ + "google-vertex/deepseek-ai/deepseek-v3.1-maas", + "vertex_ai-deepseek_models/vertex_ai/deepseek-ai/deepseek-v3.1-maas" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex", + "model": "deepseek-ai/deepseek-v3.1-maas", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 1.7 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-deepseek_models", + "model": "vertex_ai/deepseek-ai/deepseek-v3.1-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.35, + "output": 5.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.1" + ], + "families": [ + "deepseek" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-08-28", + "lastUpdated": "2025-08-28", + "supportedRegions": [ + "us-central1" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "deepseek-ai/deepseek-v3.1-maas", + "modelKey": "deepseek-ai/deepseek-v3.1-maas", + "displayName": "DeepSeek V3.1", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-08-28", + "openWeights": true, + "releaseDate": "2025-08-28" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-deepseek_models", + "model": "vertex_ai/deepseek-ai/deepseek-v3.1-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#partner-models", + "supportedRegions": [ + "us-central1" + ] + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.1-nex-n1", + "provider": "deepseek", + "model": "deepseek-v3.1-nex-n1", + "displayName": "Nex AGI: DeepSeek V3.1 Nex N1", + "family": "deepseek", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo", + "nano-gpt" + ], + "aliases": [ + "kilo/nex-agi/deepseek-v3.1-nex-n1", + "nano-gpt/nex-agi/deepseek-v3.1-nex-n1" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "inputTokens": 128000, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "nex-agi/deepseek-v3.1-nex-n1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "nex-agi/deepseek-v3.1-nex-n1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27999999999999997, + "output": 0.42000000000000004 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.1 Nex N1", + "Nex AGI: DeepSeek V3.1 Nex N1" + ], + "families": [ + "deepseek" + ], + "releaseDate": "2025-01-01", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "nex-agi/deepseek-v3.1-nex-n1", + "modelKey": "nex-agi/deepseek-v3.1-nex-n1", + "displayName": "Nex AGI: DeepSeek V3.1 Nex N1", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "nex-agi/deepseek-v3.1-nex-n1", + "modelKey": "nex-agi/deepseek-v3.1-nex-n1", + "displayName": "DeepSeek V3.1 Nex N1", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-12-10", + "openWeights": false, + "releaseDate": "2025-12-10" + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.1-tee", + "provider": "deepseek", + "model": "deepseek-v3.1-tee", + "displayName": "DeepSeek V3.1 TEE", + "family": "deepseek", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/deepseek-ai/DeepSeek-V3.1-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "deepseek-ai/DeepSeek-V3.1-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.135, + "input": 0.27, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.1 TEE" + ], + "families": [ + "deepseek" + ], + "releaseDate": "2025-12-29", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "deepseek-ai/DeepSeek-V3.1-TEE", + "modelKey": "deepseek-ai/DeepSeek-V3.1-TEE", + "displayName": "DeepSeek V3.1 TEE", + "family": "deepseek", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.1-terminus", + "provider": "deepseek", + "model": "deepseek-v3.1-terminus", + "displayName": "DeepSeek V3.1 Terminus", + "family": "deepseek", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "alibaba-cn", + "deepinfra", + "helicone", + "kilo", + "nano-gpt", + "novita", + "novita-ai", + "openrouter", + "qiniu-ai", + "siliconflow", + "siliconflow-cn", + "synthetic", + "vercel" + ], + "aliases": [ + "abacus/deepseek-ai/DeepSeek-V3.1-Terminus", + "alibaba-cn/siliconflow/deepseek-v3.1-terminus", + "deepinfra/deepseek-ai/DeepSeek-V3.1-Terminus", + "helicone/deepseek-v3.1-terminus", + "kilo/deepseek/deepseek-v3.1-terminus", + "nano-gpt/deepseek-ai/DeepSeek-V3.1-Terminus", + "novita-ai/deepseek/deepseek-v3.1-terminus", + "novita/deepseek/deepseek-v3.1-terminus", + "openrouter/deepseek/deepseek-v3.1-terminus", + "qiniu-ai/deepseek/deepseek-v3.1-terminus", + "siliconflow-cn/Pro/deepseek-ai/DeepSeek-V3.1-Terminus", + "siliconflow-cn/deepseek-ai/DeepSeek-V3.1-Terminus", + "siliconflow/deepseek-ai/DeepSeek-V3.1-Terminus", + "synthetic/hf:deepseek-ai/DeepSeek-V3.1-Terminus", + "vercel/deepseek/deepseek-v3.1-terminus" + ], + "mergedProviderModelRecords": 15, + "limits": { + "contextTokens": 164000, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 164000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "deepseek-ai/DeepSeek-V3.1-Terminus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "siliconflow/deepseek-v3.1-terminus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "deepseek-v3.1-terminus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.21600000000000003, + "input": 0.27, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "deepseek/deepseek-v3.1-terminus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 0.21, + "output": 0.79 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek-ai/DeepSeek-V3.1-Terminus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 0.7 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "deepseek/deepseek-v3.1-terminus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.135, + "input": 0.27, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "deepseek/deepseek-v3.1-terminus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 0.27, + "output": 0.95 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "deepseek-ai/DeepSeek-V3.1-Terminus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "deepseek-ai/DeepSeek-V3.1-Terminus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:deepseek-ai/DeepSeek-V3.1-Terminus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.2, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "deepseek/deepseek-v3.1-terminus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.135, + "input": 0.27, + "output": 1 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-V3.1-Terminus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.216, + "input": 0.27, + "output": 1 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/deepseek/deepseek-v3.1-terminus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.135, + "input": 0.27, + "output": 1 + }, + "extra": { + "input_cost_per_token_cache_hit": 1.35e-7 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "deepseek/deepseek-v3.1-terminus", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.13, + "input": 0.27, + "output": 0.95 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.1 Terminus", + "DeepSeek/DeepSeek-V3.1-Terminus", + "DeepSeek: DeepSeek V3.1 Terminus", + "Deepseek V3.1 Terminus", + "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", + "deepseek-ai/DeepSeek-V3.1-Terminus", + "siliconflow/deepseek-v3.1-terminus" + ], + "families": [ + "deepseek" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-09", + "releaseDate": "2025-06-01", + "lastUpdated": "2025-06-01", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 15 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "deepseek-ai/DeepSeek-V3.1-Terminus", + "modelKey": "deepseek-ai/DeepSeek-V3.1-Terminus", + "displayName": "DeepSeek V3.1 Terminus", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-06-01", + "openWeights": true, + "releaseDate": "2025-06-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "siliconflow/deepseek-v3.1-terminus", + "modelKey": "siliconflow/deepseek-v3.1-terminus", + "displayName": "siliconflow/deepseek-v3.1-terminus", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "deepseek-v3.1-terminus", + "modelKey": "deepseek-v3.1-terminus", + "displayName": "DeepSeek V3.1 Terminus", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2025-09-22", + "openWeights": false, + "releaseDate": "2025-09-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "deepseek/deepseek-v3.1-terminus", + "modelKey": "deepseek/deepseek-v3.1-terminus", + "displayName": "DeepSeek: DeepSeek V3.1 Terminus", + "metadata": { + "lastUpdated": "2025-09-22", + "openWeights": true, + "releaseDate": "2025-09-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek-ai/DeepSeek-V3.1-Terminus", + "modelKey": "deepseek-ai/DeepSeek-V3.1-Terminus", + "displayName": "DeepSeek V3.1 Terminus", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-08-02", + "openWeights": false, + "releaseDate": "2025-08-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "deepseek/deepseek-v3.1-terminus", + "modelKey": "deepseek/deepseek-v3.1-terminus", + "displayName": "Deepseek V3.1 Terminus", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-09-22", + "openWeights": true, + "releaseDate": "2025-09-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "deepseek/deepseek-v3.1-terminus", + "modelKey": "deepseek/deepseek-v3.1-terminus", + "displayName": "DeepSeek V3.1 Terminus", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-09-22", + "openWeights": true, + "releaseDate": "2025-09-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "deepseek/deepseek-v3.1-terminus", + "modelKey": "deepseek/deepseek-v3.1-terminus", + "displayName": "DeepSeek/DeepSeek-V3.1-Terminus", + "metadata": { + "lastUpdated": "2025-09-22", + "openWeights": false, + "releaseDate": "2025-09-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/DeepSeek-V3.1-Terminus", + "modelKey": "deepseek-ai/DeepSeek-V3.1-Terminus", + "displayName": "deepseek-ai/DeepSeek-V3.1-Terminus", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", + "modelKey": "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", + "displayName": "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/DeepSeek-V3.1-Terminus", + "modelKey": "deepseek-ai/DeepSeek-V3.1-Terminus", + "displayName": "deepseek-ai/DeepSeek-V3.1-Terminus", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:deepseek-ai/DeepSeek-V3.1-Terminus", + "modelKey": "hf:deepseek-ai/DeepSeek-V3.1-Terminus", + "displayName": "DeepSeek V3.1 Terminus", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "deepseek/deepseek-v3.1-terminus", + "modelKey": "deepseek/deepseek-v3.1-terminus", + "displayName": "DeepSeek V3.1 Terminus", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2025-09-22", + "openWeights": true, + "releaseDate": "2025-09-22" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/deepseek-ai/DeepSeek-V3.1-Terminus", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/deepseek/deepseek-v3.1-terminus", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "deepseek/deepseek-v3.1-terminus", + "displayName": "DeepSeek: DeepSeek V3.1 Terminus", + "metadata": { + "canonicalSlug": "deepseek/deepseek-v3.1-terminus", + "createdAt": "2025-09-22T13:37:55.000Z", + "huggingFaceId": "deepseek-ai/DeepSeek-V3.1-Terminus", + "instructType": "deepseek-v3.1", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/deepseek/deepseek-v3.1-terminus/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "DeepSeek", + "topProvider": { + "context_length": 163840, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.1-terminus-thinking", + "provider": "deepseek", + "model": "deepseek-v3.1-terminus-thinking", + "displayName": "DeepSeek/DeepSeek-V3.1-Terminus-Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/deepseek/deepseek-v3.1-terminus-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "DeepSeek/DeepSeek-V3.1-Terminus-Thinking" + ], + "releaseDate": "2025-09-22", + "lastUpdated": "2025-09-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "deepseek/deepseek-v3.1-terminus-thinking", + "modelKey": "deepseek/deepseek-v3.1-terminus-thinking", + "displayName": "DeepSeek/DeepSeek-V3.1-Terminus-Thinking", + "metadata": { + "lastUpdated": "2025-09-22", + "openWeights": false, + "releaseDate": "2025-09-22" + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.1-terminus:thinking", + "provider": "deepseek", + "model": "deepseek-v3.1-terminus:thinking", + "displayName": "DeepSeek V3.1 Terminus (Thinking)", + "family": "deepseek-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/deepseek-ai/DeepSeek-V3.1-Terminus:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek-ai/DeepSeek-V3.1-Terminus:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 0.7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.1 Terminus (Thinking)" + ], + "families": [ + "deepseek-thinking" + ], + "releaseDate": "2025-09-22", + "lastUpdated": "2025-09-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek-ai/DeepSeek-V3.1-Terminus:thinking", + "modelKey": "deepseek-ai/DeepSeek-V3.1-Terminus:thinking", + "displayName": "DeepSeek V3.1 Terminus (Thinking)", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-09-22", + "openWeights": false, + "releaseDate": "2025-09-22" + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.1:671b", + "provider": "deepseek", + "model": "deepseek-v3.1:671b", + "displayName": "deepseek-v3.1:671b", + "family": "deepseek", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/deepseek-v3.1:671b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "deepseek-v3.1:671b" + ], + "families": [ + "deepseek" + ], + "releaseDate": "2025-08-21", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "deepseek-v3.1:671b", + "modelKey": "deepseek-v3.1:671b", + "displayName": "deepseek-v3.1:671b", + "family": "deepseek", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-08-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.1:671b-cloud", + "provider": "deepseek", + "model": "deepseek-v3.1:671b-cloud", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/deepseek-v3.1:671b-cloud" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/deepseek-v3.1:671b-cloud", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/deepseek-v3.1:671b-cloud", + "mode": "chat" + } + ] + }, + { + "id": "deepseek/deepseek-v3.1:thinking", + "provider": "deepseek", + "model": "deepseek-v3.1:thinking", + "displayName": "DeepSeek V3.1 Thinking", + "family": "deepseek-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/deepseek-ai/DeepSeek-V3.1:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek-ai/DeepSeek-V3.1:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.1 Thinking" + ], + "families": [ + "deepseek-thinking" + ], + "releaseDate": "2025-08-21", + "lastUpdated": "2025-08-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek-ai/DeepSeek-V3.1:thinking", + "modelKey": "deepseek-ai/DeepSeek-V3.1:thinking", + "displayName": "DeepSeek V3.1 Thinking", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-08-21", + "openWeights": false, + "releaseDate": "2025-08-21" + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.2", + "provider": "deepseek", + "model": "deepseek-v3.2", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "abacus", + "alibaba-cn", + "alibaba-token-plan", + "alibaba-token-plan-cn", + "azure", + "azure-cognitive-services", + "azure_ai", + "cortecs", + "crof", + "deepinfra", + "deepseek", + "gmi", + "helicone", + "huggingface", + "iflowcn", + "kilo", + "llmgateway", + "meganova", + "nano-gpt", + "nebius", + "novita", + "novita-ai", + "ollama-cloud", + "openrouter", + "poe", + "routing-run", + "siliconflow", + "siliconflow-cn", + "synthetic", + "venice", + "vercel", + "vivgrid", + "zenmux" + ], + "aliases": [ + "302ai/deepseek-v3.2", + "abacus/deepseek-ai/DeepSeek-V3.2", + "alibaba-cn/siliconflow/deepseek-v3.2", + "alibaba-token-plan-cn/deepseek-v3.2", + "alibaba-token-plan/deepseek-v3.2", + "azure-cognitive-services/deepseek-v3.2", + "azure/deepseek-v3.2", + "azure_ai/deepseek-v3.2", + "cortecs/deepseek-v3.2", + "crof/deepseek-v3.2", + "deepinfra/deepseek-ai/DeepSeek-V3.2", + "deepseek/deepseek-v3.2", + "gmi/deepseek-ai/DeepSeek-V3.2", + "helicone/deepseek-v3.2", + "huggingface/deepseek-ai/DeepSeek-V3.2", + "iflowcn/deepseek-v3.2", + "kilo/deepseek/deepseek-v3.2", + "llmgateway/deepseek-v3.2", + "meganova/deepseek-ai/DeepSeek-V3.2", + "nano-gpt/TEE/deepseek-v3.2", + "nano-gpt/deepseek/deepseek-v3.2", + "nebius/deepseek-ai/DeepSeek-V3.2", + "novita-ai/deepseek/deepseek-v3.2", + "novita/deepseek/deepseek-v3.2", + "ollama-cloud/deepseek-v3.2", + "openrouter/deepseek/deepseek-v3.2", + "poe/novita/deepseek-v3.2", + "routing-run/route/deepseek-v3.2", + "siliconflow-cn/Pro/deepseek-ai/DeepSeek-V3.2", + "siliconflow-cn/deepseek-ai/DeepSeek-V3.2", + "siliconflow/deepseek-ai/DeepSeek-V3.2", + "synthetic/hf:deepseek-ai/DeepSeek-V3.2", + "venice/deepseek-v3.2", + "vercel/deepseek/deepseek-v3.2", + "vivgrid/deepseek-v3.2", + "zenmux/deepseek/deepseek-v3.2" + ], + "mergedProviderModelRecords": 36, + "limits": { + "contextTokens": 164000, + "inputTokens": 164000, + "maxTokens": 163840, + "outputTokens": 164000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": true, + "supports1MContext": false, + "attachments": true, + "openWeights": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 0.43 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "deepseek-ai/DeepSeek-V3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "siliconflow/deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.42 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.58, + "output": 1.68 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.58, + "output": 1.68 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.266, + "output": 0.444 + } + }, + { + "source": "models.dev", + "provider": "crof", + "model": "deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.18, + "output": 0.35 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "deepseek-ai/DeepSeek-V3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 0.26, + "output": 0.38 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.41 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "deepseek-ai/DeepSeek-V3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.28, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "iflowcn", + "model": "deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "deepseek/deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 0.26, + "output": 0.38 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.056, + "input": 0.28, + "output": 0.42 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "deepseek-ai/DeepSeek-V3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.26, + "output": 0.38 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek/deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27999999999999997, + "output": 0.42000000000000004 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "nebius", + "model": "deepseek-ai/DeepSeek-V3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 0.45, + "reasoningOutput": 0.45 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "deepseek/deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1345, + "input": 0.269, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "deepseek/deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2288, + "output": 0.3432 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "novita/deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 0.27, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4928, + "output": 0.7392 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "deepseek-ai/DeepSeek-V3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.42 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Pro/deepseek-ai/DeepSeek-V3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.42 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "deepseek-ai/DeepSeek-V3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.42 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:deepseek-ai/DeepSeek-V3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.27, + "cacheWrite": 0, + "input": 0.27, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.33, + "output": 0.48 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "deepseek/deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.28, + "output": 0.42 + } + }, + { + "source": "models.dev", + "provider": "vivgrid", + "model": "deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.28, + "output": 0.42 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "deepseek/deepseek-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.28, + "output": 0.43 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/deepseek-v3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.58, + "output": 1.68 + } + }, + { + "source": "litellm", + "provider": "deepseek", + "model": "deepseek/deepseek-v3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.28, + "output": 0.4 + }, + "extra": { + "input_cost_per_token_cache_hit": 2.8e-8 + } + }, + { + "source": "litellm", + "provider": "gmi", + "model": "gmi/deepseek-ai/DeepSeek-V3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.28, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/deepseek/deepseek-v3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1345, + "input": 0.269, + "output": 0.4 + }, + "extra": { + "input_cost_per_token_cache_hit": 1.345e-7 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/deepseek/deepseek-v3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.28, + "output": 0.4 + }, + "extra": { + "input_cost_per_token_cache_hit": 2.8e-8 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "deepseek/deepseek-v3.2", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2288, + "output": 0.3432 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.2", + "DeepSeek V3.2 TEE", + "DeepSeek-V3.2", + "DeepSeek-V3.2-Exp", + "DeepSeek: DeepSeek V3.2", + "Deepseek V3.2", + "Pro/deepseek-ai/DeepSeek-V3.2", + "deepseek-ai/DeepSeek-V3.2", + "deepseek-v3.2", + "siliconflow/deepseek-v3.2" + ], + "families": [ + "deepseek" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-12-01", + "lastUpdated": "2025-12-01", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 36 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "deepseek-v3.2", + "modelKey": "deepseek-v3.2", + "displayName": "deepseek-v3.2", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-12-01", + "openWeights": false, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "deepseek-ai/DeepSeek-V3.2", + "modelKey": "deepseek-ai/DeepSeek-V3.2", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-06-15", + "openWeights": true, + "releaseDate": "2025-06-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "siliconflow/deepseek-v3.2", + "modelKey": "siliconflow/deepseek-v3.2", + "displayName": "siliconflow/deepseek-v3.2", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-12-03", + "openWeights": false, + "releaseDate": "2025-12-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "deepseek-v3.2", + "modelKey": "deepseek-v3.2", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-05", + "openWeights": true, + "releaseDate": "2025-12-03", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "deepseek-v3.2", + "modelKey": "deepseek-v3.2", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-05", + "openWeights": true, + "releaseDate": "2025-12-03", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "deepseek-v3.2", + "modelKey": "deepseek-v3.2", + "displayName": "DeepSeek-V3.2", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "deepseek-v3.2", + "modelKey": "deepseek-v3.2", + "displayName": "DeepSeek-V3.2", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "deepseek-v3.2", + "modelKey": "deepseek-v3.2", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "deepseek-v3.2", + "modelKey": "deepseek-v3.2", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-07-22", + "openWeights": false, + "releaseDate": "2025-07-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "deepseek-ai/DeepSeek-V3.2", + "modelKey": "deepseek-ai/DeepSeek-V3.2", + "displayName": "DeepSeek-V3.2", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-12-02", + "openWeights": false, + "releaseDate": "2025-12-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "deepseek-v3.2", + "modelKey": "deepseek-v3.2", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2025-09-22", + "openWeights": false, + "releaseDate": "2025-09-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "deepseek-ai/DeepSeek-V3.2", + "modelKey": "deepseek-ai/DeepSeek-V3.2", + "displayName": "DeepSeek-V3.2", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "iflowcn", + "providerName": "iFlow", + "providerApi": "https://apis.iflow.cn/v1", + "providerDoc": "https://platform.iflow.cn/en/docs", + "model": "deepseek-v3.2", + "modelKey": "deepseek-v3.2", + "displayName": "DeepSeek-V3.2-Exp", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-01", + "openWeights": true, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "deepseek/deepseek-v3.2", + "modelKey": "deepseek/deepseek-v3.2", + "displayName": "DeepSeek: DeepSeek V3.2", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "deepseek-v3.2", + "modelKey": "deepseek-v3.2", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-09-29", + "openWeights": true, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "deepseek-ai/DeepSeek-V3.2", + "modelKey": "deepseek-ai/DeepSeek-V3.2", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-12-03", + "openWeights": true, + "releaseDate": "2025-12-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek/deepseek-v3.2", + "modelKey": "deepseek/deepseek-v3.2", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-12-01", + "openWeights": false, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/deepseek-v3.2", + "modelKey": "TEE/deepseek-v3.2", + "displayName": "DeepSeek V3.2 TEE", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-12-01", + "openWeights": false, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "deepseek-ai/DeepSeek-V3.2", + "modelKey": "deepseek-ai/DeepSeek-V3.2", + "displayName": "DeepSeek-V3.2", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-11", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2026-01-20", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "deepseek/deepseek-v3.2", + "modelKey": "deepseek/deepseek-v3.2", + "displayName": "Deepseek V3.2", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "deepseek-v3.2", + "modelKey": "deepseek-v3.2", + "displayName": "deepseek-v3.2", + "family": "deepseek", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-06-15", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "deepseek/deepseek-v3.2", + "modelKey": "deepseek/deepseek-v3.2", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "novita/deepseek-v3.2", + "modelKey": "novita/deepseek-v3.2", + "displayName": "DeepSeek-V3.2", + "metadata": { + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/deepseek-v3.2", + "modelKey": "route/deepseek-v3.2", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/DeepSeek-V3.2", + "modelKey": "deepseek-ai/DeepSeek-V3.2", + "displayName": "deepseek-ai/DeepSeek-V3.2", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-12-03", + "openWeights": false, + "releaseDate": "2025-12-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Pro/deepseek-ai/DeepSeek-V3.2", + "modelKey": "Pro/deepseek-ai/DeepSeek-V3.2", + "displayName": "Pro/deepseek-ai/DeepSeek-V3.2", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-12-03", + "openWeights": false, + "releaseDate": "2025-12-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/DeepSeek-V3.2", + "modelKey": "deepseek-ai/DeepSeek-V3.2", + "displayName": "deepseek-ai/DeepSeek-V3.2", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-12-03", + "openWeights": false, + "releaseDate": "2025-12-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:deepseek-ai/DeepSeek-V3.2", + "modelKey": "hf:deepseek-ai/DeepSeek-V3.2", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "deepseek-v3.2", + "modelKey": "deepseek-v3.2", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2025-12-04", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "deepseek/deepseek-v3.2", + "modelKey": "deepseek/deepseek-v3.2", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-12-01", + "openWeights": false, + "releaseDate": "2025-12-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vivgrid", + "providerName": "Vivgrid", + "providerApi": "https://api.vivgrid.com/v1", + "providerDoc": "https://docs.vivgrid.com/models", + "model": "deepseek-v3.2", + "modelKey": "deepseek-v3.2", + "displayName": "DeepSeek-V3.2", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "deepseek/deepseek-v3.2", + "modelKey": "deepseek/deepseek-v3.2", + "displayName": "DeepSeek V3.2", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-12-05", + "openWeights": false, + "releaseDate": "2025-12-05", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/deepseek-v3.2", + "mode": "chat", + "metadata": { + "source": "https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/introducing-deepseek-v3-2-and-deepseek-v3-2-speciale-in-microsoft-foundry/4477549" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepseek", + "model": "deepseek/deepseek-v3.2", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gmi", + "model": "gmi/deepseek-ai/DeepSeek-V3.2", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/deepseek/deepseek-v3.2", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/deepseek/deepseek-v3.2", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "deepseek/deepseek-v3.2", + "displayName": "DeepSeek: DeepSeek V3.2", + "metadata": { + "canonicalSlug": "deepseek/deepseek-v3.2-20251201", + "createdAt": "2025-12-01T13:10:42.000Z", + "huggingFaceId": "deepseek-ai/DeepSeek-V3.2", + "links": { + "details": "/api/v1/models/deepseek/deepseek-v3.2-20251201/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "DeepSeek", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 64000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.2-251201", + "provider": "deepseek", + "model": "deepseek-v3.2-251201", + "displayName": "Deepseek/DeepSeek-V3.2", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/deepseek/deepseek-v3.2-251201" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Deepseek/DeepSeek-V3.2" + ], + "releaseDate": "2025-12-01", + "lastUpdated": "2025-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "deepseek/deepseek-v3.2-251201", + "modelKey": "deepseek/deepseek-v3.2-251201", + "displayName": "Deepseek/DeepSeek-V3.2", + "metadata": { + "lastUpdated": "2025-12-01", + "openWeights": false, + "releaseDate": "2025-12-01" + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.2-exp", + "provider": "deepseek", + "model": "deepseek-v3.2-exp", + "displayName": "DeepSeek V3.2 Exp", + "family": "deepseek", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "meganova", + "nano-gpt", + "novita", + "novita-ai", + "openrouter", + "qiniu-ai", + "siliconflow", + "zenmux" + ], + "aliases": [ + "kilo/deepseek/deepseek-v3.2-exp", + "meganova/deepseek-ai/DeepSeek-V3.2-Exp", + "nano-gpt/deepseek-ai/deepseek-v3.2-exp", + "novita-ai/deepseek/deepseek-v3.2-exp", + "novita/deepseek/deepseek-v3.2-exp", + "openrouter/deepseek/deepseek-v3.2-exp", + "qiniu-ai/deepseek/deepseek-v3.2-exp", + "siliconflow/deepseek-ai/DeepSeek-V3.2-Exp", + "zenmux/deepseek/deepseek-v3.2-exp" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 164000, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 164000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "deepseek/deepseek-v3.2-exp", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.41 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "deepseek-ai/DeepSeek-V3.2-Exp", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek-ai/deepseek-v3.2-exp", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27999999999999997, + "output": 0.42000000000000004 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "deepseek/deepseek-v3.2-exp", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.41 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "deepseek/deepseek-v3.2-exp", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.41 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "deepseek-ai/DeepSeek-V3.2-Exp", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.41 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "deepseek/deepseek-v3.2-exp", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.22, + "output": 0.33 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/deepseek/deepseek-v3.2-exp", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.27, + "output": 0.41 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/deepseek/deepseek-v3.2-exp", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.4 + }, + "extra": { + "input_cost_per_token_cache_hit": 2e-8 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "deepseek/deepseek-v3.2-exp", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.27, + "output": 0.41 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.2 Exp", + "DeepSeek-V3.2-Exp", + "DeepSeek/DeepSeek-V3.2-Exp", + "DeepSeek: DeepSeek V3.2 Exp", + "Deepseek V3.2 Exp", + "deepseek-ai/DeepSeek-V3.2-Exp" + ], + "families": [ + "deepseek" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-07-31", + "releaseDate": "2025-01-01", + "lastUpdated": "2025-09-29", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "deepseek/deepseek-v3.2-exp", + "modelKey": "deepseek/deepseek-v3.2-exp", + "displayName": "DeepSeek: DeepSeek V3.2 Exp", + "metadata": { + "lastUpdated": "2025-09-29", + "openWeights": true, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "deepseek-ai/DeepSeek-V3.2-Exp", + "modelKey": "deepseek-ai/DeepSeek-V3.2-Exp", + "displayName": "DeepSeek V3.2 Exp", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-10-10", + "openWeights": true, + "releaseDate": "2025-10-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek-ai/deepseek-v3.2-exp", + "modelKey": "deepseek-ai/deepseek-v3.2-exp", + "displayName": "DeepSeek V3.2 Exp", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "deepseek/deepseek-v3.2-exp", + "modelKey": "deepseek/deepseek-v3.2-exp", + "displayName": "Deepseek V3.2 Exp", + "metadata": { + "lastUpdated": "2025-09-29", + "openWeights": true, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "deepseek/deepseek-v3.2-exp", + "modelKey": "deepseek/deepseek-v3.2-exp", + "displayName": "DeepSeek V3.2 Exp", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": true, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "deepseek/deepseek-v3.2-exp", + "modelKey": "deepseek/deepseek-v3.2-exp", + "displayName": "DeepSeek/DeepSeek-V3.2-Exp", + "metadata": { + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/DeepSeek-V3.2-Exp", + "modelKey": "deepseek-ai/DeepSeek-V3.2-Exp", + "displayName": "deepseek-ai/DeepSeek-V3.2-Exp", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "deepseek/deepseek-v3.2-exp", + "modelKey": "deepseek/deepseek-v3.2-exp", + "displayName": "DeepSeek-V3.2-Exp", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/deepseek/deepseek-v3.2-exp", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/deepseek/deepseek-v3.2-exp", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "deepseek/deepseek-v3.2-exp", + "displayName": "DeepSeek: DeepSeek V3.2 Exp", + "metadata": { + "canonicalSlug": "deepseek/deepseek-v3.2-exp", + "createdAt": "2025-09-29T12:54:41.000Z", + "huggingFaceId": "deepseek-ai/DeepSeek-V3.2-Exp", + "instructType": "deepseek-v3.1", + "knowledgeCutoff": "2025-07-31", + "links": { + "details": "/api/v1/models/deepseek/deepseek-v3.2-exp/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "DeepSeek", + "topProvider": { + "context_length": 163840, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.2-exp-thinking", + "provider": "deepseek", + "model": "deepseek-v3.2-exp-thinking", + "displayName": "DeepSeek V3.2 Exp Thinking", + "family": "deepseek-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt", + "qiniu-ai" + ], + "aliases": [ + "nano-gpt/deepseek-ai/deepseek-v3.2-exp-thinking", + "qiniu-ai/deepseek/deepseek-v3.2-exp-thinking" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "temperature": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek-ai/deepseek-v3.2-exp-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27999999999999997, + "output": 0.42000000000000004 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.2 Exp Thinking", + "DeepSeek/DeepSeek-V3.2-Exp-Thinking" + ], + "families": [ + "deepseek-thinking" + ], + "releaseDate": "2025-09-29", + "lastUpdated": "2025-09-29", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek-ai/deepseek-v3.2-exp-thinking", + "modelKey": "deepseek-ai/deepseek-v3.2-exp-thinking", + "displayName": "DeepSeek V3.2 Exp Thinking", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "deepseek/deepseek-v3.2-exp-thinking", + "modelKey": "deepseek/deepseek-v3.2-exp-thinking", + "displayName": "DeepSeek/DeepSeek-V3.2-Exp-Thinking", + "metadata": { + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.2-fast", + "provider": "deepseek", + "model": "deepseek-v3.2-fast", + "displayName": "DeepSeek-V3.2-fast", + "sources": [ + "models.dev" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/deepseek-ai/DeepSeek-V3.2-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 7000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nebius", + "model": "deepseek-ai/DeepSeek-V3.2-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "cacheWrite": 0.5, + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek-V3.2-fast" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-01-27", + "lastUpdated": "2026-05-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "deepseek-ai/DeepSeek-V3.2-fast", + "modelKey": "deepseek-ai/DeepSeek-V3.2-fast", + "displayName": "DeepSeek-V3.2-fast", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-07", + "openWeights": true, + "releaseDate": "2025-01-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.2-maas", + "provider": "deepseek", + "model": "deepseek-v3.2-maas", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "vertex_ai-deepseek_models" + ], + "aliases": [ + "google-vertex/deepseek-ai/deepseek-v3.2-maas", + "vertex_ai-deepseek_models/vertex_ai/deepseek-ai/deepseek-v3.2-maas" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 32768, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex", + "model": "deepseek-ai/deepseek-v3.2-maas", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.056, + "input": 0.56, + "output": 1.68 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-deepseek_models", + "model": "vertex_ai/deepseek-ai/deepseek-v3.2-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.56, + "output": 1.68 + }, + "extra": { + "input_cost_per_token_batches": 2.8e-7, + "output_cost_per_token_batches": 8.4e-7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.2" + ], + "families": [ + "deepseek" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-12-17", + "lastUpdated": "2026-04-04", + "supportedRegions": [ + "global" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "deepseek-ai/deepseek-v3.2-maas", + "modelKey": "deepseek-ai/deepseek-v3.2-maas", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "metadata": { + "lastUpdated": "2026-04-04", + "openWeights": true, + "releaseDate": "2025-12-17" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-deepseek_models", + "model": "vertex_ai/deepseek-ai/deepseek-v3.2-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#partner-models", + "supportedRegions": [ + "global" + ] + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.2-nvfp4", + "provider": "deepseek", + "model": "deepseek-v3.2-nvfp4", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "sources": [ + "models.dev" + ], + "providers": [ + "vultr" + ], + "aliases": [ + "vultr/nvidia/DeepSeek-V3.2-NVFP4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vultr", + "model": "nvidia/DeepSeek-V3.2-NVFP4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 1.65 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.2" + ], + "families": [ + "deepseek" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2025-12-01", + "lastUpdated": "2025-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vultr", + "providerName": "Vultr", + "providerApi": "https://api.vultrinference.com/v1", + "providerDoc": "https://api.vultrinference.com/", + "model": "nvidia/DeepSeek-V3.2-NVFP4", + "modelKey": "nvidia/DeepSeek-V3.2-NVFP4", + "displayName": "DeepSeek V3.2", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01" + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.2-speciale", + "provider": "deepseek", + "model": "deepseek-v3.2-speciale", + "displayName": "DeepSeek-V3.2-Speciale", + "family": "deepseek", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "azure_ai", + "kilo", + "nano-gpt" + ], + "aliases": [ + "azure-cognitive-services/deepseek-v3.2-speciale", + "azure/deepseek-v3.2-speciale", + "azure_ai/deepseek-v3.2-speciale", + "kilo/deepseek/deepseek-v3.2-speciale", + "nano-gpt/deepseek/deepseek-v3.2-speciale" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "deepseek-v3.2-speciale", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.58, + "output": 1.68 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "deepseek-v3.2-speciale", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.58, + "output": 1.68 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "deepseek/deepseek-v3.2-speciale", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.135, + "input": 0.4, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek/deepseek-v3.2-speciale", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27999999999999997, + "output": 0.42000000000000004 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/deepseek-v3.2-speciale", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.58, + "output": 1.68 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.2 Speciale", + "DeepSeek-V3.2-Speciale", + "DeepSeek: DeepSeek V3.2 Speciale" + ], + "families": [ + "deepseek" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2025-12-01", + "lastUpdated": "2025-12-01", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "deepseek-v3.2-speciale", + "modelKey": "deepseek-v3.2-speciale", + "displayName": "DeepSeek-V3.2-Speciale", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "deepseek-v3.2-speciale", + "modelKey": "deepseek-v3.2-speciale", + "displayName": "DeepSeek-V3.2-Speciale", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "deepseek/deepseek-v3.2-speciale", + "modelKey": "deepseek/deepseek-v3.2-speciale", + "displayName": "DeepSeek: DeepSeek V3.2 Speciale", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek/deepseek-v3.2-speciale", + "modelKey": "deepseek/deepseek-v3.2-speciale", + "displayName": "DeepSeek V3.2 Speciale", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-12-02", + "openWeights": false, + "releaseDate": "2025-12-02" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/deepseek-v3.2-speciale", + "mode": "chat", + "metadata": { + "source": "https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/introducing-deepseek-v3-2-and-deepseek-v3-2-speciale-in-microsoft-foundry/4477549" + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.2-tee", + "provider": "deepseek", + "model": "deepseek-v3.2-tee", + "displayName": "DeepSeek V3.2 TEE", + "family": "deepseek", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/deepseek-ai/DeepSeek-V3.2-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "deepseek-ai/DeepSeek-V3.2-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.14, + "input": 0.28, + "output": 0.42 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.2 TEE" + ], + "families": [ + "deepseek" + ], + "releaseDate": "2025-12-29", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "deepseek-ai/DeepSeek-V3.2-TEE", + "modelKey": "deepseek-ai/DeepSeek-V3.2-TEE", + "displayName": "DeepSeek V3.2 TEE", + "family": "deepseek", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.2-thinking", + "provider": "deepseek", + "model": "deepseek-v3.2-thinking", + "displayName": "DeepSeek-V3.2-Thinking", + "family": "deepseek-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai", + "vercel" + ], + "aliases": [ + "302ai/deepseek-v3.2-thinking", + "vercel/deepseek/deepseek-v3.2-thinking" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "interleaved": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "deepseek-v3.2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 0.43 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "deepseek/deepseek-v3.2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.62, + "output": 1.85 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.2 Thinking", + "DeepSeek-V3.2-Thinking" + ], + "families": [ + "deepseek-thinking" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-12-01", + "lastUpdated": "2025-12-01", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "deepseek-v3.2-thinking", + "modelKey": "deepseek-v3.2-thinking", + "displayName": "DeepSeek-V3.2-Thinking", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-12-01", + "openWeights": false, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "deepseek/deepseek-v3.2-thinking", + "modelKey": "deepseek/deepseek-v3.2-thinking", + "displayName": "DeepSeek V3.2 Thinking", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-12-01", + "openWeights": false, + "releaseDate": "2025-12-01" + } + } + ] + }, + { + "id": "deepseek/deepseek-v3.2:thinking", + "provider": "deepseek", + "model": "deepseek-v3.2:thinking", + "displayName": "DeepSeek V3.2 Thinking", + "family": "deepseek", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/deepseek/deepseek-v3.2:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163000, + "inputTokens": 163000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek/deepseek-v3.2:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27999999999999997, + "output": 0.42000000000000004 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V3.2 Thinking" + ], + "families": [ + "deepseek" + ], + "releaseDate": "2025-12-01", + "lastUpdated": "2025-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek/deepseek-v3.2:thinking", + "modelKey": "deepseek/deepseek-v3.2:thinking", + "displayName": "DeepSeek V3.2 Thinking", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-12-01", + "openWeights": false, + "releaseDate": "2025-12-01" + } + } + ] + }, + { + "id": "deepseek/deepseek-v3p1", + "provider": "deepseek", + "model": "deepseek-v3p1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/deepseek-v3p1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-v3p1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.56, + "output": 1.68 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-v3p1", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "deepseek/deepseek-v3p1-terminus", + "provider": "deepseek", + "model": "deepseek-v3p1-terminus", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/deepseek-v3p1-terminus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-v3p1-terminus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.56, + "output": 1.68 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-v3p1-terminus", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "deepseek/deepseek-v3p2", + "provider": "deepseek", + "model": "deepseek-v3p2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/deepseek-v3p2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-v3p2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.56, + "output": 1.68 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/deepseek-v3p2", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/models/fireworks/deepseek-v3p2" + } + } + ] + }, + { + "id": "deepseek/deepseek-v4-flash", + "provider": "deepseek", + "model": "deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba-cn", + "alibaba-token-plan", + "alibaba-token-plan-cn", + "anyapi", + "auriko", + "azure", + "cortecs", + "crof", + "deepinfra", + "deepseek", + "fireworks-ai", + "gmicloud", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "novita-ai", + "nvidia", + "ollama-cloud", + "opencode", + "opencode-go", + "openrouter", + "orcarouter", + "routing-run", + "siliconflow", + "venice", + "vercel", + "wafer.ai", + "zenmux" + ], + "aliases": [ + "alibaba-cn/deepseek-v4-flash", + "alibaba-token-plan-cn/deepseek-v4-flash", + "alibaba-token-plan/deepseek-v4-flash", + "anyapi/deepseek/deepseek-v4-flash", + "auriko/deepseek-v4-flash", + "azure/deepseek-v4-flash", + "cortecs/deepseek-v4-flash", + "crof/deepseek-v4-flash", + "deepinfra/deepseek-ai/DeepSeek-V4-Flash", + "deepseek/deepseek-v4-flash", + "fireworks-ai/accounts/fireworks/models/deepseek-v4-flash", + "gmicloud/deepseek-ai/DeepSeek-V4-Flash", + "kilo/deepseek/deepseek-v4-flash", + "llmgateway/deepseek-v4-flash", + "merge-gateway/deepseek/deepseek-v4-flash", + "nano-gpt/deepseek/deepseek-v4-flash", + "novita-ai/deepseek/deepseek-v4-flash", + "nvidia/deepseek-ai/deepseek-v4-flash", + "ollama-cloud/deepseek-v4-flash", + "opencode-go/deepseek-v4-flash", + "opencode/deepseek-v4-flash", + "openrouter/deepseek/deepseek-v4-flash", + "orcarouter/deepseek/deepseek-v4-flash", + "routing-run/route/deepseek-v4-flash", + "siliconflow/deepseek-ai/deepseek-v4-flash", + "venice/deepseek-v4-flash", + "vercel/deepseek/deepseek-v4-flash", + "wafer.ai/deepseek-v4-flash", + "zenmux/deepseek/deepseek-v4-flash" + ], + "mergedProviderModelRecords": 29, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "outputTokens": 1048576, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "auriko", + "model": "deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.19, + "output": 0.51 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.133, + "output": 0.266 + } + }, + { + "source": "models.dev", + "provider": "crof", + "model": "deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003, + "input": 0.12, + "output": 0.21 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "deepseek-ai/DeepSeek-V4-Flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.1, + "output": 0.2 + } + }, + { + "source": "models.dev", + "provider": "deepseek", + "model": "deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "fireworks-ai", + "model": "accounts/fireworks/models/deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "gmicloud", + "model": "deepseek-ai/DeepSeek-V4-Flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.022, + "input": 0.112, + "output": 0.224 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "deepseek/deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "deepseek/deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek/deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "deepseek/deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "deepseek-ai/deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "opencode-go", + "model": "deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "deepseek/deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.09, + "output": 0.18 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "deepseek/deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.19, + "output": 0.37 + } + }, + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.4928, + "output": 0.7392 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "deepseek-ai/deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.17, + "output": 0.35 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "deepseek/deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "wafer.ai", + "model": "deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "deepseek/deepseek-v4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "deepseek/deepseek-v4-flash", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.09, + "output": 0.18 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V4 Flash", + "DeepSeek-V4-Flash", + "DeepSeek: DeepSeek V4 Flash", + "deepseek-v4-flash" + ], + "families": [ + "deepseek", + "deepseek-flash" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2026-04-24", + "lastUpdated": "2026-04-24", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 29 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "deepseek-v4-flash", + "modelKey": "deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "deepseek-v4-flash", + "modelKey": "deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "deepseek-v4-flash", + "modelKey": "deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "deepseek/deepseek-v4-flash", + "modelKey": "deepseek/deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "auriko", + "providerName": "Auriko", + "providerApi": "https://api.auriko.ai/v1", + "providerDoc": "https://docs.auriko.ai", + "model": "deepseek-v4-flash", + "modelKey": "deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "deepseek-v4-flash", + "modelKey": "deepseek-v4-flash", + "displayName": "DeepSeek-V4-Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "deepseek-v4-flash", + "modelKey": "deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "deepseek-v4-flash", + "modelKey": "deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "deepseek-ai/DeepSeek-V4-Flash", + "modelKey": "deepseek-ai/DeepSeek-V4-Flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepseek", + "providerName": "DeepSeek", + "providerApi": "https://api.deepseek.com", + "providerDoc": "https://api-docs.deepseek.com/quick_start/pricing", + "model": "deepseek-v4-flash", + "modelKey": "deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fireworks-ai", + "providerName": "Fireworks AI", + "providerApi": "https://api.fireworks.ai/inference/v1/", + "providerDoc": "https://fireworks.ai/docs/", + "model": "accounts/fireworks/models/deepseek-v4-flash", + "modelKey": "accounts/fireworks/models/deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-06-16", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gmicloud", + "providerName": "GMI Cloud", + "providerApi": "https://api.gmi-serving.com/v1", + "providerDoc": "https://docs.gmicloud.ai/inference-engine/api-reference/llm-api-reference", + "model": "deepseek-ai/DeepSeek-V4-Flash", + "modelKey": "deepseek-ai/DeepSeek-V4-Flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "deepseek/deepseek-v4-flash", + "modelKey": "deepseek/deepseek-v4-flash", + "displayName": "DeepSeek: DeepSeek V4 Flash", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "deepseek-v4-flash", + "modelKey": "deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "deepseek/deepseek-v4-flash", + "modelKey": "deepseek/deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek/deepseek-v4-flash", + "modelKey": "deepseek/deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "metadata": { + "lastUpdated": "2026-04-24", + "openWeights": false, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "deepseek/deepseek-v4-flash", + "modelKey": "deepseek/deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "deepseek-ai/deepseek-v4-flash", + "modelKey": "deepseek-ai/deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "deepseek-v4-flash", + "modelKey": "deepseek-v4-flash", + "displayName": "deepseek-v4-flash", + "family": "deepseek-flash", + "metadata": { + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "deepseek-v4-flash", + "modelKey": "deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "deepseek-v4-flash", + "modelKey": "deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "deepseek/deepseek-v4-flash", + "modelKey": "deepseek/deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "deepseek/deepseek-v4-flash", + "modelKey": "deepseek/deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/deepseek-v4-flash", + "modelKey": "route/deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/deepseek-v4-flash", + "modelKey": "deepseek-ai/deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "deepseek-v4-flash", + "modelKey": "deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "deepseek/deepseek-v4-flash", + "modelKey": "deepseek/deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wafer.ai", + "providerName": "Wafer", + "providerApi": "https://pass.wafer.ai/v1", + "providerDoc": "https://docs.wafer.ai/wafer-pass", + "model": "deepseek-v4-flash", + "modelKey": "deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-05-30", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "deepseek/deepseek-v4-flash", + "modelKey": "deepseek/deepseek-v4-flash", + "displayName": "DeepSeek V4 Flash", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "deepseek/deepseek-v4-flash", + "displayName": "DeepSeek: DeepSeek V4 Flash", + "metadata": { + "canonicalSlug": "deepseek/deepseek-v4-flash-20260423", + "createdAt": "2026-04-24T03:17:46.000Z", + "huggingFaceId": "deepseek-ai/DeepSeek-V4-Flash", + "links": { + "details": "/api/v1/models/deepseek/deepseek-v4-flash-20260423/endpoints" + }, + "reasoning": { + "mandatory": false, + "supported_efforts": [ + "xhigh", + "high" + ], + "default_effort": "high" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "DeepSeek", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "deepseek/deepseek-v4-flash-6bit", + "provider": "deepseek", + "model": "deepseek-v4-flash-6bit", + "displayName": "DeepSeek V4 Flash 6bit", + "family": "deepseek-flash", + "sources": [ + "models.dev" + ], + "providers": [ + "routing-run" + ], + "aliases": [ + "routing-run/route/deepseek-v4-flash-6bit" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/deepseek-v4-flash-6bit", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.4928, + "output": 0.7392 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V4 Flash 6bit" + ], + "families": [ + "deepseek-flash" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2026-04-24", + "lastUpdated": "2026-04-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/deepseek-v4-flash-6bit", + "modelKey": "route/deepseek-v4-flash-6bit", + "displayName": "DeepSeek V4 Flash 6bit", + "family": "deepseek-flash", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + } + ] + }, + { + "id": "deepseek/deepseek-v4-flash-el", + "provider": "deepseek", + "model": "deepseek-v4-flash-el", + "displayName": "DeepSeek-V4-Flash-EL", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/empiriolabs/deepseek-v4-flash-el" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 384000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "empiriolabs/deepseek-v4-flash-el", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek-V4-Flash-EL" + ], + "releaseDate": "2026-04-24", + "lastUpdated": "2026-05-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "empiriolabs/deepseek-v4-flash-el", + "modelKey": "empiriolabs/deepseek-v4-flash-el", + "displayName": "DeepSeek-V4-Flash-EL", + "metadata": { + "lastUpdated": "2026-05-02", + "openWeights": true, + "releaseDate": "2026-04-24" + } + } + ] + }, + { + "id": "deepseek/deepseek-v4-flash-free", + "provider": "deepseek", + "model": "deepseek-v4-flash-free", + "displayName": "DeepSeek V4 Flash Free", + "family": "deepseek-flash-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/deepseek-v4-flash-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "deepseek-v4-flash-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V4 Flash Free" + ], + "families": [ + "deepseek-flash-free" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2026-04-24", + "lastUpdated": "2026-04-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "deepseek-v4-flash-free", + "modelKey": "deepseek-v4-flash-free", + "displayName": "DeepSeek V4 Flash Free", + "family": "deepseek-flash-free", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "deepseek/deepseek-v4-flash:thinking", + "provider": "deepseek", + "model": "deepseek-v4-flash:thinking", + "displayName": "DeepSeek V4 Flash (Thinking)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/deepseek/deepseek-v4-flash:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "outputTokens": 384000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek/deepseek-v4-flash:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.14, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V4 Flash (Thinking)" + ], + "releaseDate": "2026-04-24", + "lastUpdated": "2026-04-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek/deepseek-v4-flash:thinking", + "modelKey": "deepseek/deepseek-v4-flash:thinking", + "displayName": "DeepSeek V4 Flash (Thinking)", + "metadata": { + "lastUpdated": "2026-04-24", + "openWeights": false, + "releaseDate": "2026-04-24" + } + } + ] + }, + { + "id": "deepseek/deepseek-v4-pro", + "provider": "deepseek", + "model": "deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba-cn", + "alibaba-token-plan", + "alibaba-token-plan-cn", + "anyapi", + "auriko", + "azure", + "baseten", + "cortecs", + "crof", + "deepinfra", + "deepseek", + "digitalocean", + "fastrouter", + "fireworks-ai", + "frogbot", + "gmicloud", + "huggingface", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nebius", + "novita-ai", + "nvidia", + "ollama-cloud", + "opencode", + "opencode-go", + "openrouter", + "orcarouter", + "routing-run", + "siliconflow", + "siliconflow-cn", + "togetherai", + "venice", + "vercel", + "vivgrid", + "wafer.ai", + "zenmux" + ], + "aliases": [ + "alibaba-cn/deepseek-v4-pro", + "alibaba-token-plan-cn/deepseek-v4-pro", + "alibaba-token-plan/deepseek-v4-pro", + "anyapi/deepseek/deepseek-v4-pro", + "auriko/deepseek-v4-pro", + "azure/deepseek-v4-pro", + "baseten/deepseek-ai/DeepSeek-V4-Pro", + "cortecs/deepseek-v4-pro", + "crof/deepseek-v4-pro", + "deepinfra/deepseek-ai/DeepSeek-V4-Pro", + "deepseek/deepseek-v4-pro", + "digitalocean/deepseek-v4-pro", + "fastrouter/deepseek/deepseek-v4-pro", + "fireworks-ai/accounts/fireworks/models/deepseek-v4-pro", + "frogbot/deepseek-v4-pro", + "gmicloud/deepseek-ai/DeepSeek-V4-Pro", + "huggingface/deepseek-ai/DeepSeek-V4-Pro", + "kilo/deepseek/deepseek-v4-pro", + "llmgateway/deepseek-v4-pro", + "merge-gateway/deepseek/deepseek-v4-pro", + "nano-gpt/TEE/deepseek-v4-pro", + "nano-gpt/deepseek/deepseek-v4-pro", + "nebius/deepseek-ai/DeepSeek-V4-Pro", + "novita-ai/deepseek/deepseek-v4-pro", + "nvidia/deepseek-ai/deepseek-v4-pro", + "ollama-cloud/deepseek-v4-pro", + "opencode-go/deepseek-v4-pro", + "opencode/deepseek-v4-pro", + "openrouter/deepseek/deepseek-v4-pro", + "orcarouter/deepseek/deepseek-v4-pro", + "routing-run/route/deepseek-v4-pro", + "siliconflow-cn/deepseek-ai/DeepSeek-V4-Pro", + "siliconflow/deepseek-ai/deepseek-v4-pro", + "togetherai/deepseek-ai/DeepSeek-V4-Pro", + "venice/deepseek-v4-pro", + "vercel/deepseek/deepseek-v4-pro", + "vivgrid/deepseek-v4-pro", + "wafer.ai/deepseek-v4-pro", + "zenmux/deepseek/deepseek-v4-pro" + ], + "mergedProviderModelRecords": 39, + "limits": { + "contextTokens": 1049000, + "inputTokens": 1048576, + "outputTokens": 1048576, + "supports1MContext": true + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 0.435, + "output": 0.87 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "auriko", + "model": "deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 0.435, + "output": 0.87 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.74, + "output": 3.48 + } + }, + { + "source": "models.dev", + "provider": "baseten", + "model": "deepseek-ai/DeepSeek-V4-Pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.145, + "input": 1.74, + "output": 3.48 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 1.553, + "output": 3.106 + } + }, + { + "source": "models.dev", + "provider": "crof", + "model": "deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003, + "input": 0.35, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "deepseek-ai/DeepSeek-V4-Pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 1.3, + "output": 2.6 + } + }, + { + "source": "models.dev", + "provider": "deepseek", + "model": "deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 0.435, + "output": 0.87 + } + }, + { + "source": "models.dev", + "provider": "digitalocean", + "model": "deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.74, + "output": 3.48 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "deepseek/deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.74, + "output": 3.48 + } + }, + { + "source": "models.dev", + "provider": "fireworks-ai", + "model": "accounts/fireworks/models/deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.145, + "input": 1.74, + "output": 3.48 + } + }, + { + "source": "models.dev", + "provider": "frogbot", + "model": "deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.14, + "input": 1.74, + "output": 3.48 + } + }, + { + "source": "models.dev", + "provider": "gmicloud", + "model": "deepseek-ai/DeepSeek-V4-Pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.116, + "input": 1.392, + "output": 2.784 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "deepseek-ai/DeepSeek-V4-Pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 0.435, + "output": 0.87 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "deepseek/deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 0.435, + "output": 0.87 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 0.435, + "output": 0.87 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "deepseek/deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 0.435, + "output": 0.87 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek/deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 1.1, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "output": 5.25 + } + }, + { + "source": "models.dev", + "provider": "nebius", + "model": "deepseek-ai/DeepSeek-V4-Pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.75, + "output": 3.5 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "deepseek/deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 1.69, + "output": 3.38 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "deepseek-ai/deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 0.435, + "output": 0.87 + } + }, + { + "source": "models.dev", + "provider": "opencode-go", + "model": "deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0145, + "input": 1.74, + "output": 3.48 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.145, + "input": 1.74, + "output": 3.84 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "deepseek/deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 0.435, + "output": 0.87 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "deepseek/deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 0.56, + "output": 1.12 + } + }, + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 0.4928, + "output": 0.7392 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "deepseek-ai/DeepSeek-V4-Pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.145, + "input": 1.74, + "output": 3.48 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "deepseek-ai/deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.145, + "input": 1.74, + "output": 3.48 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "deepseek-ai/DeepSeek-V4-Pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.74, + "output": 3.48 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.33, + "input": 1.73, + "output": 3.796 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "deepseek/deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0036, + "input": 0.435, + "output": 0.87 + } + }, + { + "source": "models.dev", + "provider": "vivgrid", + "model": "deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 0.435, + "output": 0.87 + } + }, + { + "source": "models.dev", + "provider": "wafer.ai", + "model": "deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "cacheWrite": 0, + "input": 1.74, + "output": 3.48 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "deepseek/deepseek-v4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 0.435, + "output": 0.87 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "deepseek/deepseek-v4-pro", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 0.435, + "output": 0.87 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V4 Pro", + "DeepSeek V4 Pro TEE", + "DeepSeek v4 Pro", + "DeepSeek-V4-Pro", + "DeepSeek: DeepSeek V4 Pro", + "Deepseek V4 Pro", + "deepseek-ai/DeepSeek-V4-Pro", + "deepseek-v4-pro" + ], + "families": [ + "deepseek", + "deepseek-thinking" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2026-04-24", + "lastUpdated": "2026-04-24", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 39 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "deepseek-v4-pro", + "modelKey": "deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "deepseek-v4-pro", + "modelKey": "deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "deepseek-v4-pro", + "modelKey": "deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "deepseek/deepseek-v4-pro", + "modelKey": "deepseek/deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "auriko", + "providerName": "Auriko", + "providerApi": "https://api.auriko.ai/v1", + "providerDoc": "https://docs.auriko.ai", + "model": "deepseek-v4-pro", + "modelKey": "deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "deepseek-v4-pro", + "modelKey": "deepseek-v4-pro", + "displayName": "DeepSeek-V4-Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "baseten", + "providerName": "Baseten", + "providerApi": "https://inference.baseten.co/v1", + "providerDoc": "https://docs.baseten.co/inference/model-apis/overview", + "model": "deepseek-ai/DeepSeek-V4-Pro", + "modelKey": "deepseek-ai/DeepSeek-V4-Pro", + "displayName": "Deepseek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "deepseek-v4-pro", + "modelKey": "deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "deepseek-v4-pro", + "modelKey": "deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "deepseek-ai/DeepSeek-V4-Pro", + "modelKey": "deepseek-ai/DeepSeek-V4-Pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepseek", + "providerName": "DeepSeek", + "providerApi": "https://api.deepseek.com", + "providerDoc": "https://api-docs.deepseek.com/quick_start/pricing", + "model": "deepseek-v4-pro", + "modelKey": "deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "deepseek-v4-pro", + "modelKey": "deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "deepseek/deepseek-v4-pro", + "modelKey": "deepseek/deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fireworks-ai", + "providerName": "Fireworks AI", + "providerApi": "https://api.fireworks.ai/inference/v1/", + "providerDoc": "https://fireworks.ai/docs/", + "model": "accounts/fireworks/models/deepseek-v4-pro", + "modelKey": "accounts/fireworks/models/deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "deepseek-v4-pro", + "modelKey": "deepseek-v4-pro", + "displayName": "DeepSeek v4 Pro", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2026-01", + "lastUpdated": "2026-04-24", + "openWeights": false, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gmicloud", + "providerName": "GMI Cloud", + "providerApi": "https://api.gmi-serving.com/v1", + "providerDoc": "https://docs.gmicloud.ai/inference-engine/api-reference/llm-api-reference", + "model": "deepseek-ai/DeepSeek-V4-Pro", + "modelKey": "deepseek-ai/DeepSeek-V4-Pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "deepseek-ai/DeepSeek-V4-Pro", + "modelKey": "deepseek-ai/DeepSeek-V4-Pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "deepseek/deepseek-v4-pro", + "modelKey": "deepseek/deepseek-v4-pro", + "displayName": "DeepSeek: DeepSeek V4 Pro", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "deepseek-v4-pro", + "modelKey": "deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "deepseek/deepseek-v4-pro", + "modelKey": "deepseek/deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek/deepseek-v4-pro", + "modelKey": "deepseek/deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "metadata": { + "lastUpdated": "2026-04-24", + "openWeights": false, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/deepseek-v4-pro", + "modelKey": "TEE/deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro TEE", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": false, + "releaseDate": "2026-04-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "deepseek-ai/DeepSeek-V4-Pro", + "modelKey": "deepseek-ai/DeepSeek-V4-Pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "deepseek/deepseek-v4-pro", + "modelKey": "deepseek/deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "deepseek-ai/deepseek-v4-pro", + "modelKey": "deepseek-ai/deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "deepseek-v4-pro", + "modelKey": "deepseek-v4-pro", + "displayName": "deepseek-v4-pro", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "deepseek-v4-pro", + "modelKey": "deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "deepseek-v4-pro", + "modelKey": "deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "deepseek/deepseek-v4-pro", + "modelKey": "deepseek/deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "deepseek/deepseek-v4-pro", + "modelKey": "deepseek/deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/deepseek-v4-pro", + "modelKey": "route/deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/DeepSeek-V4-Pro", + "modelKey": "deepseek-ai/DeepSeek-V4-Pro", + "displayName": "deepseek-ai/DeepSeek-V4-Pro", + "family": "deepseek-thinking", + "metadata": { + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/deepseek-v4-pro", + "modelKey": "deepseek-ai/deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "deepseek-ai/DeepSeek-V4-Pro", + "modelKey": "deepseek-ai/DeepSeek-V4-Pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek", + "metadata": { + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "deepseek-v4-pro", + "modelKey": "deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "deepseek/deepseek-v4-pro", + "modelKey": "deepseek/deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vivgrid", + "providerName": "Vivgrid", + "providerApi": "https://api.vivgrid.com/v1", + "providerDoc": "https://docs.vivgrid.com/models", + "model": "deepseek-v4-pro", + "modelKey": "deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wafer.ai", + "providerName": "Wafer", + "providerApi": "https://pass.wafer.ai/v1", + "providerDoc": "https://docs.wafer.ai/wafer-pass", + "model": "deepseek-v4-pro", + "modelKey": "deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-05-30", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "deepseek/deepseek-v4-pro", + "modelKey": "deepseek/deepseek-v4-pro", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "deepseek/deepseek-v4-pro", + "displayName": "DeepSeek: DeepSeek V4 Pro", + "metadata": { + "canonicalSlug": "deepseek/deepseek-v4-pro-20260423", + "createdAt": "2026-04-24T03:17:59.000Z", + "huggingFaceId": "deepseek-ai/DeepSeek-V4-Pro", + "links": { + "details": "/api/v1/models/deepseek/deepseek-v4-pro-20260423/endpoints" + }, + "reasoning": { + "mandatory": false, + "supported_efforts": [ + "xhigh", + "high" + ], + "default_effort": "high" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "DeepSeek", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 384000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "deepseek/deepseek-v4-pro-6bit", + "provider": "deepseek", + "model": "deepseek-v4-pro-6bit", + "displayName": "DeepSeek V4 Pro 6bit", + "family": "deepseek-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "routing-run" + ], + "aliases": [ + "routing-run/route/deepseek-v4-pro-6bit" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/deepseek-v4-pro-6bit", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 0.4928, + "output": 0.7392 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V4 Pro 6bit" + ], + "families": [ + "deepseek-thinking" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2026-04-24", + "lastUpdated": "2026-04-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/deepseek-v4-pro-6bit", + "modelKey": "route/deepseek-v4-pro-6bit", + "displayName": "DeepSeek V4 Pro 6bit", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + } + ] + }, + { + "id": "deepseek/deepseek-v4-pro-cheaper", + "provider": "deepseek", + "model": "deepseek-v4-pro-cheaper", + "displayName": "DeepSeek V4 Pro Cheaper", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/deepseek/deepseek-v4-pro-cheaper" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "outputTokens": 384000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek/deepseek-v4-pro-cheaper", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 0.435, + "output": 0.87 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V4 Pro Cheaper" + ], + "releaseDate": "2026-04-25", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek/deepseek-v4-pro-cheaper", + "modelKey": "deepseek/deepseek-v4-pro-cheaper", + "displayName": "DeepSeek V4 Pro Cheaper", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": false, + "releaseDate": "2026-04-25" + } + } + ] + }, + { + "id": "deepseek/deepseek-v4-pro-cheaper:thinking", + "provider": "deepseek", + "model": "deepseek-v4-pro-cheaper:thinking", + "displayName": "DeepSeek V4 Pro Cheaper (Thinking)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/deepseek/deepseek-v4-pro-cheaper:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "outputTokens": 384000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek/deepseek-v4-pro-cheaper:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.003625, + "input": 0.435, + "output": 0.87 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V4 Pro Cheaper (Thinking)" + ], + "releaseDate": "2026-04-25", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek/deepseek-v4-pro-cheaper:thinking", + "modelKey": "deepseek/deepseek-v4-pro-cheaper:thinking", + "displayName": "DeepSeek V4 Pro Cheaper (Thinking)", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": false, + "releaseDate": "2026-04-25" + } + } + ] + }, + { + "id": "deepseek/deepseek-v4-pro-el", + "provider": "deepseek", + "model": "deepseek-v4-pro-el", + "displayName": "DeepSeek-V4-Pro-EL", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/empiriolabs/deepseek-v4-pro-el" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 384000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "empiriolabs/deepseek-v4-pro-el", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.67, + "output": 3.33 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek-V4-Pro-EL" + ], + "releaseDate": "2026-04-24", + "lastUpdated": "2026-05-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "empiriolabs/deepseek-v4-pro-el", + "modelKey": "empiriolabs/deepseek-v4-pro-el", + "displayName": "DeepSeek-V4-Pro-EL", + "metadata": { + "lastUpdated": "2026-05-02", + "openWeights": true, + "releaseDate": "2026-04-24" + } + } + ] + }, + { + "id": "deepseek/deepseek-v4-pro-lightning", + "provider": "deepseek", + "model": "deepseek-v4-pro-lightning", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "crof" + ], + "aliases": [ + "crof/deepseek-v4-pro-lightning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "crof", + "model": "deepseek-v4-pro-lightning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.8, + "output": 1.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V4 Pro" + ], + "families": [ + "deepseek-thinking" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2026-04-24", + "lastUpdated": "2026-04-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "deepseek-v4-pro-lightning", + "modelKey": "deepseek-v4-pro-lightning", + "displayName": "DeepSeek V4 Pro", + "family": "deepseek-thinking", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "deepseek/deepseek-v4-pro:thinking", + "provider": "deepseek", + "model": "deepseek-v4-pro:thinking", + "displayName": "DeepSeek V4 Pro (Thinking)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TEE/deepseek-v4-pro:thinking", + "nano-gpt/deepseek/deepseek-v4-pro:thinking" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "outputTokens": 384000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepseek/deepseek-v4-pro:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 1.1, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/deepseek-v4-pro:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "output": 5.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepSeek V4 Pro (Thinking)", + "DeepSeek V4 Pro Thinking TEE" + ], + "releaseDate": "2026-04-24", + "lastUpdated": "2026-04-24", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepseek/deepseek-v4-pro:thinking", + "modelKey": "deepseek/deepseek-v4-pro:thinking", + "displayName": "DeepSeek V4 Pro (Thinking)", + "metadata": { + "lastUpdated": "2026-04-24", + "openWeights": false, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/deepseek-v4-pro:thinking", + "modelKey": "TEE/deepseek-v4-pro:thinking", + "displayName": "DeepSeek V4 Pro Thinking TEE", + "metadata": { + "lastUpdated": "2026-04-29", + "openWeights": false, + "releaseDate": "2026-04-29" + } + } + ] + }, + { + "id": "deepseek/deepseek-vl2", + "provider": "deepseek", + "model": "deepseek-vl2", + "displayName": "deepseek-ai/deepseek-vl2", + "family": "deepseek", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow", + "siliconflow-cn" + ], + "aliases": [ + "siliconflow-cn/deepseek-ai/deepseek-vl2", + "siliconflow/deepseek-ai/deepseek-vl2" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "deepseek-ai/deepseek-vl2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "deepseek-ai/deepseek-vl2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "deepseek-ai/deepseek-vl2" + ], + "families": [ + "deepseek" + ], + "releaseDate": "2024-12-13", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/deepseek-vl2", + "modelKey": "deepseek-ai/deepseek-vl2", + "displayName": "deepseek-ai/deepseek-vl2", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-12-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "deepseek-ai/deepseek-vl2", + "modelKey": "deepseek-ai/deepseek-vl2", + "displayName": "deepseek-ai/deepseek-vl2", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2024-12-13" + } + } + ] + }, + { + "id": "digitalocean/alibaba-qwen3-32b", + "provider": "digitalocean", + "model": "alibaba-qwen3-32b", + "displayName": "Qwen3-32B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/alibaba-qwen3-32b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131000, + "outputTokens": 40960, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "alibaba-qwen3-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 0.55 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3-32B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-04-30", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "alibaba-qwen3-32b", + "modelKey": "alibaba-qwen3-32b", + "displayName": "Qwen3-32B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": true, + "releaseDate": "2025-04-30", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/all-mini-lm-l6-v2", + "provider": "digitalocean", + "model": "all-mini-lm-l6-v2", + "displayName": "All-MiniLM-L6-v2", + "family": "text-embedding", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/all-mini-lm-l6-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256, + "outputTokens": 384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "all-mini-lm-l6-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.009, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "All-MiniLM-L6-v2" + ], + "families": [ + "text-embedding" + ], + "releaseDate": "2021-08-30", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "all-mini-lm-l6-v2", + "modelKey": "all-mini-lm-l6-v2", + "displayName": "All-MiniLM-L6-v2", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": true, + "releaseDate": "2021-08-30" + } + } + ] + }, + { + "id": "digitalocean/anthropic-claude-3-opus", + "provider": "digitalocean", + "model": "anthropic-claude-3-opus", + "displayName": "Claude 3 Opus", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/anthropic-claude-3-opus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "anthropic-claude-3-opus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 3 Opus" + ], + "families": [ + "claude-opus" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2023-08", + "releaseDate": "2024-02-29", + "lastUpdated": "2024-02-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "anthropic-claude-3-opus", + "modelKey": "anthropic-claude-3-opus", + "displayName": "Claude 3 Opus", + "family": "claude-opus", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2023-08", + "lastUpdated": "2024-02-29", + "openWeights": false, + "releaseDate": "2024-02-29" + } + } + ] + }, + { + "id": "digitalocean/anthropic-claude-3.5-haiku", + "provider": "digitalocean", + "model": "anthropic-claude-3.5-haiku", + "displayName": "Claude 3.5 Haiku", + "family": "claude-haiku", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/anthropic-claude-3.5-haiku" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "anthropic-claude-3.5-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 1, + "input": 0.8, + "output": 4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 3.5 Haiku" + ], + "families": [ + "claude-haiku" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2024-11-05", + "lastUpdated": "2024-11-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "anthropic-claude-3.5-haiku", + "modelKey": "anthropic-claude-3.5-haiku", + "displayName": "Claude 3.5 Haiku", + "family": "claude-haiku", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2024-11-05", + "openWeights": false, + "releaseDate": "2024-11-05" + } + } + ] + }, + { + "id": "digitalocean/anthropic-claude-3.5-sonnet", + "provider": "digitalocean", + "model": "anthropic-claude-3.5-sonnet", + "displayName": "Claude 3.5 Sonnet", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/anthropic-claude-3.5-sonnet" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "anthropic-claude-3.5-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 3.5 Sonnet" + ], + "families": [ + "claude-sonnet" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-06-20", + "lastUpdated": "2024-10-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "anthropic-claude-3.5-sonnet", + "modelKey": "anthropic-claude-3.5-sonnet", + "displayName": "Claude 3.5 Sonnet", + "family": "claude-sonnet", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-06-20" + } + } + ] + }, + { + "id": "digitalocean/anthropic-claude-3.7-sonnet", + "provider": "digitalocean", + "model": "anthropic-claude-3.7-sonnet", + "displayName": "Claude 3.7 Sonnet", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/anthropic-claude-3.7-sonnet" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "anthropic-claude-3.7-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude 3.7 Sonnet" + ], + "families": [ + "claude-sonnet" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-11", + "releaseDate": "2025-02-24", + "lastUpdated": "2025-02-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "anthropic-claude-3.7-sonnet", + "modelKey": "anthropic-claude-3.7-sonnet", + "displayName": "Claude 3.7 Sonnet", + "family": "claude-sonnet", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2025-02-24", + "openWeights": false, + "releaseDate": "2025-02-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/anthropic-claude-4.1-opus", + "provider": "digitalocean", + "model": "anthropic-claude-4.1-opus", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/anthropic-claude-4.1-opus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "anthropic-claude-4.1-opus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.1" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "anthropic-claude-4.1-opus", + "modelKey": "anthropic-claude-4.1-opus", + "displayName": "Claude Opus 4.1", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/anthropic-claude-4.5-haiku", + "provider": "digitalocean", + "model": "anthropic-claude-4.5-haiku", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/anthropic-claude-4.5-haiku" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "anthropic-claude-4.5-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Haiku 4.5" + ], + "families": [ + "claude-haiku" + ], + "knowledgeCutoff": "2025-02-28", + "releaseDate": "2025-10-15", + "lastUpdated": "2025-10-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "anthropic-claude-4.5-haiku", + "modelKey": "anthropic-claude-4.5-haiku", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/anthropic-claude-4.5-sonnet", + "provider": "digitalocean", + "model": "anthropic-claude-4.5-sonnet", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/anthropic-claude-4.5-sonnet" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "anthropic-claude-4.5-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 6, + "output": 22.5, + "cache_read": 0.3, + "cache_write": 3.75 + }, + "tiers": [ + { + "input": 6, + "output": 22.5, + "cache_read": 0.3, + "cache_write": 3.75, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.5" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-07-31", + "releaseDate": "2025-09-29", + "lastUpdated": "2025-09-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "anthropic-claude-4.5-sonnet", + "modelKey": "anthropic-claude-4.5-sonnet", + "displayName": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/anthropic-claude-4.6-sonnet", + "provider": "digitalocean", + "model": "anthropic-claude-4.6-sonnet", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/anthropic-claude-4.6-sonnet" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "anthropic-claude-4.6-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 6, + "output": 22.5, + "cache_read": 0.3, + "cache_write": 3.75 + }, + "tiers": [ + { + "input": 6, + "output": 22.5, + "cache_read": 0.3, + "cache_write": 3.75, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4.6" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-17", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "anthropic-claude-4.6-sonnet", + "modelKey": "anthropic-claude-4.6-sonnet", + "displayName": "Claude Sonnet 4.6", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/anthropic-claude-fable-5", + "provider": "digitalocean", + "model": "anthropic-claude-fable-5", + "displayName": "Anthropic Claude Fable 5", + "family": "claude-fable", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/anthropic-claude-fable-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "metadata": { + "displayNames": [ + "Anthropic Claude Fable 5" + ], + "families": [ + "claude-fable" + ], + "releaseDate": "2026-06-09", + "lastUpdated": "2026-06-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "anthropic-claude-fable-5", + "modelKey": "anthropic-claude-fable-5", + "displayName": "Anthropic Claude Fable 5", + "family": "claude-fable", + "metadata": { + "lastUpdated": "2026-06-12", + "openWeights": false, + "releaseDate": "2026-06-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/anthropic-claude-haiku-4.5", + "provider": "digitalocean", + "model": "anthropic-claude-haiku-4.5", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/anthropic-claude-haiku-4.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "anthropic-claude-haiku-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Haiku 4.5" + ], + "families": [ + "claude-haiku" + ], + "knowledgeCutoff": "2025-02-28", + "releaseDate": "2025-10-15", + "lastUpdated": "2025-10-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "anthropic-claude-haiku-4.5", + "modelKey": "anthropic-claude-haiku-4.5", + "displayName": "Claude Haiku 4.5", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/anthropic-claude-opus-4", + "provider": "digitalocean", + "model": "anthropic-claude-opus-4", + "displayName": "Claude Opus 4", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/anthropic-claude-opus-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "anthropic-claude-opus-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "anthropic-claude-opus-4", + "modelKey": "anthropic-claude-opus-4", + "displayName": "Claude Opus 4", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/anthropic-claude-opus-4.5", + "provider": "digitalocean", + "model": "anthropic-claude-opus-4.5", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/anthropic-claude-opus-4.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "anthropic-claude-opus-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.5" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-11-24", + "lastUpdated": "2025-11-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "anthropic-claude-opus-4.5", + "modelKey": "anthropic-claude-opus-4.5", + "displayName": "Claude Opus 4.5", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-11-24", + "openWeights": false, + "releaseDate": "2025-11-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/anthropic-claude-opus-4.6", + "provider": "digitalocean", + "model": "anthropic-claude-opus-4.6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/anthropic-claude-opus-4.6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "anthropic-claude-opus-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 37.5, + "cache_read": 0.5, + "cache_write": 6.25 + }, + "tiers": [ + { + "input": 10, + "output": 37.5, + "cache_read": 0.5, + "cache_write": 6.25, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.6" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-05-31", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "anthropic-claude-opus-4.6", + "modelKey": "anthropic-claude-opus-4.6", + "displayName": "Claude Opus 4.6", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/anthropic-claude-opus-4.7", + "provider": "digitalocean", + "model": "anthropic-claude-opus-4.7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/anthropic-claude-opus-4.7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "anthropic-claude-opus-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.7" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "anthropic-claude-opus-4.7", + "modelKey": "anthropic-claude-opus-4.7", + "displayName": "Claude Opus 4.7", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/anthropic-claude-opus-4.8", + "provider": "digitalocean", + "model": "anthropic-claude-opus-4.8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/anthropic-claude-opus-4.8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "anthropic-claude-opus-4.8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Opus 4.8" + ], + "families": [ + "claude-opus" + ], + "releaseDate": "2026-05-28", + "lastUpdated": "2026-05-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "anthropic-claude-opus-4.8", + "modelKey": "anthropic-claude-opus-4.8", + "displayName": "Claude Opus 4.8", + "family": "claude-opus", + "metadata": { + "lastUpdated": "2026-05-29", + "openWeights": false, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/anthropic-claude-sonnet-4", + "provider": "digitalocean", + "model": "anthropic-claude-sonnet-4", + "displayName": "Claude Sonnet 4", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/anthropic-claude-sonnet-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "anthropic-claude-sonnet-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 6, + "output": 22.5, + "cache_read": 0.3, + "cache_write": 3.75 + }, + "tiers": [ + { + "input": 6, + "output": 22.5, + "cache_read": 0.3, + "cache_write": 3.75, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claude Sonnet 4" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "anthropic-claude-sonnet-4", + "modelKey": "anthropic-claude-sonnet-4", + "displayName": "Claude Sonnet 4", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/arcee-trinity-large-thinking", + "provider": "digitalocean", + "model": "arcee-trinity-large-thinking", + "displayName": "Trinity Large Thinking", + "family": "trinity", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/arcee-trinity-large-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "arcee-trinity-large-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.25, + "output": 0.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Trinity Large Thinking" + ], + "families": [ + "trinity" + ], + "statuses": [ + "beta" + ], + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "arcee-trinity-large-thinking", + "modelKey": "arcee-trinity-large-thinking", + "displayName": "Trinity Large Thinking", + "family": "trinity", + "status": "beta", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/bge-m3", + "provider": "digitalocean", + "model": "bge-m3", + "displayName": "BGE M3", + "family": "bge", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/bge-m3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "bge-m3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "BGE M3" + ], + "families": [ + "bge" + ], + "releaseDate": "2024-01-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "bge-m3", + "modelKey": "bge-m3", + "displayName": "BGE M3", + "family": "bge", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2024-01-30" + } + } + ] + }, + { + "id": "digitalocean/bge-reranker-v2-m3", + "provider": "digitalocean", + "model": "bge-reranker-v2-m3", + "displayName": "BGE Reranker v2 M3", + "family": "bge", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/bge-reranker-v2-m3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 1, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "bge-reranker-v2-m3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.01, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "BGE Reranker v2 M3" + ], + "families": [ + "bge" + ], + "releaseDate": "2024-03-12", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "bge-reranker-v2-m3", + "modelKey": "bge-reranker-v2-m3", + "displayName": "BGE Reranker v2 M3", + "family": "bge", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2024-03-12" + } + } + ] + }, + { + "id": "digitalocean/e5-large-v2", + "provider": "digitalocean", + "model": "e5-large-v2", + "displayName": "E5 Large v2", + "family": "text-embedding", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/e5-large-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "e5-large-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "E5 Large v2" + ], + "families": [ + "text-embedding" + ], + "releaseDate": "2023-05-19", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "e5-large-v2", + "modelKey": "e5-large-v2", + "displayName": "E5 Large v2", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2023-05-19" + } + } + ] + }, + { + "id": "digitalocean/fast-sdxl", + "provider": "digitalocean", + "model": "fast-sdxl", + "displayName": "Fast SDXL", + "family": "stable-diffusion", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/fal-ai/fast-sdxl" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Fast SDXL" + ], + "families": [ + "stable-diffusion" + ], + "releaseDate": "2023-07-26", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "fal-ai/fast-sdxl", + "modelKey": "fal-ai/fast-sdxl", + "displayName": "Fast SDXL", + "family": "stable-diffusion", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": true, + "releaseDate": "2023-07-26" + } + } + ] + }, + { + "id": "digitalocean/gemma-4-31b-it", + "provider": "digitalocean", + "model": "gemma-4-31b-it", + "displayName": "Gemma 4 31B", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/gemma-4-31B-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "gemma-4-31B-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B" + ], + "families": [ + "gemma" + ], + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "gemma-4-31B-it", + "modelKey": "gemma-4-31B-it", + "displayName": "Gemma 4 31B", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "digitalocean/gte-large-en-v1.5", + "provider": "digitalocean", + "model": "gte-large-en-v1.5", + "displayName": "GTE Large (v1.5)", + "family": "text-embedding", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/gte-large-en-v1.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "gte-large-en-v1.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GTE Large (v1.5)" + ], + "families": [ + "text-embedding" + ], + "releaseDate": "2024-03-27", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "gte-large-en-v1.5", + "modelKey": "gte-large-en-v1.5", + "displayName": "GTE Large (v1.5)", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": true, + "releaseDate": "2024-03-27" + } + } + ] + }, + { + "id": "digitalocean/llama3-8b-instruct", + "provider": "digitalocean", + "model": "llama3-8b-instruct", + "displayName": "Llama 3.1 Instruct (8B)", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/llama3-8b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "llama3-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.198, + "output": 0.198 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 Instruct (8B)" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "llama3-8b-instruct", + "modelKey": "llama3-8b-instruct", + "displayName": "Llama 3.1 Instruct (8B)", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + } + ] + }, + { + "id": "digitalocean/llama3.3-70b-instruct", + "provider": "digitalocean", + "model": "llama3.3-70b-instruct", + "displayName": "Llama 3.3 Instruct 70B", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/llama3.3-70b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "llama3.3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.65, + "output": 0.65 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 Instruct 70B" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-12-06", + "lastUpdated": "2024-12-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "llama3.3-70b-instruct", + "modelKey": "llama3.3-70b-instruct", + "displayName": "Llama 3.3 Instruct 70B", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + } + ] + }, + { + "id": "digitalocean/multi-qa-mpnet-base-dot-v1", + "provider": "digitalocean", + "model": "multi-qa-mpnet-base-dot-v1", + "displayName": "Multi-QA-mpnet-base-dot-v1", + "family": "text-embedding", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/multi-qa-mpnet-base-dot-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "outputTokens": 768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "multi-qa-mpnet-base-dot-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.009, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Multi-QA-mpnet-base-dot-v1" + ], + "families": [ + "text-embedding" + ], + "releaseDate": "2021-08-30", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "multi-qa-mpnet-base-dot-v1", + "modelKey": "multi-qa-mpnet-base-dot-v1", + "displayName": "Multi-QA-mpnet-base-dot-v1", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": true, + "releaseDate": "2021-08-30" + } + } + ] + }, + { + "id": "digitalocean/multilingual-v2", + "provider": "digitalocean", + "model": "multilingual-v2", + "displayName": "ElevenLabs Multilingual TTS v2", + "family": "elevenlabs", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/fal-ai/elevenlabs/tts/multilingual-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "ElevenLabs Multilingual TTS v2" + ], + "families": [ + "elevenlabs" + ], + "releaseDate": "2023-08-22", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "fal-ai/elevenlabs/tts/multilingual-v2", + "modelKey": "fal-ai/elevenlabs/tts/multilingual-v2", + "displayName": "ElevenLabs Multilingual TTS v2", + "family": "elevenlabs", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2023-08-22" + } + } + ] + }, + { + "id": "digitalocean/nemotron-3-nano-30b", + "provider": "digitalocean", + "model": "nemotron-3-nano-30b", + "displayName": "Nemotron 3 Nano 30B A3B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/nemotron-3-nano-30b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Nemotron 3 Nano 30B A3B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2025-04-14", + "lastUpdated": "2025-04-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "nemotron-3-nano-30b", + "modelKey": "nemotron-3-nano-30b", + "displayName": "Nemotron 3 Nano 30B A3B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2025-04-14", + "openWeights": true, + "releaseDate": "2025-04-14", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/nemotron-3-nano-omni", + "provider": "digitalocean", + "model": "nemotron-3-nano-omni", + "displayName": "Nemotron Nano 3 Omni", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/nemotron-3-nano-omni" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "nemotron-3-nano-omni", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 0.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron Nano 3 Omni" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-04-28", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "nemotron-3-nano-omni", + "modelKey": "nemotron-3-nano-omni", + "displayName": "Nemotron Nano 3 Omni", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2026-04-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/nemotron-3-ultra-550b", + "provider": "digitalocean", + "model": "nemotron-3-ultra-550b", + "displayName": "Nemotron 3 Ultra", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/nemotron-3-ultra-550b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Nemotron 3 Ultra" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-06-04", + "lastUpdated": "2026-06-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "nemotron-3-ultra-550b", + "modelKey": "nemotron-3-ultra-550b", + "displayName": "Nemotron 3 Ultra", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-06-12", + "openWeights": false, + "releaseDate": "2026-06-04" + } + } + ] + }, + { + "id": "digitalocean/nemotron-nano-12b-v2-vl", + "provider": "digitalocean", + "model": "nemotron-nano-12b-v2-vl", + "displayName": "Nemotron Nano 12B v2 VL", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/nemotron-nano-12b-v2-vl" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "nemotron-nano-12b-v2-vl", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron Nano 12B v2 VL" + ], + "families": [ + "nemotron" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-12-01", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "nemotron-nano-12b-v2-vl", + "modelKey": "nemotron-nano-12b-v2-vl", + "displayName": "Nemotron Nano 12B v2 VL", + "family": "nemotron", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2025-12-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/nvidia-nemotron-3-super-120b", + "provider": "digitalocean", + "model": "nvidia-nemotron-3-super-120b", + "displayName": "Nemotron-3-Super-120B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/nvidia-nemotron-3-super-120b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "nvidia-nemotron-3-super-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.65 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron-3-Super-120B" + ], + "families": [ + "nemotron" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2026-02", + "releaseDate": "2026-03-11", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "nvidia-nemotron-3-super-120b", + "modelKey": "nvidia-nemotron-3-super-120b", + "displayName": "Nemotron-3-Super-120B", + "family": "nemotron", + "status": "beta", + "metadata": { + "knowledgeCutoff": "2026-02", + "lastUpdated": "2026-04-16", + "openWeights": true, + "releaseDate": "2026-03-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-4.1", + "provider": "digitalocean", + "model": "openai-gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-4.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1047576, + "outputTokens": 32768, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4.1" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-04-14", + "lastUpdated": "2025-04-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-4.1", + "modelKey": "openai-gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-4o", + "provider": "digitalocean", + "model": "openai-gpt-4o", + "displayName": "GPT-4o", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-4o" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-4o", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4o" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2023-09", + "releaseDate": "2024-05-13", + "lastUpdated": "2024-08-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-4o", + "modelKey": "openai-gpt-4o", + "displayName": "GPT-4o", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-08-06", + "openWeights": false, + "releaseDate": "2024-05-13" + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-4o-mini", + "provider": "digitalocean", + "model": "openai-gpt-4o-mini", + "displayName": "GPT-4o mini", + "family": "gpt-mini", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-4o-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4o mini" + ], + "families": [ + "gpt-mini" + ], + "knowledgeCutoff": "2023-09", + "releaseDate": "2024-07-18", + "lastUpdated": "2024-07-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-4o-mini", + "modelKey": "openai-gpt-4o-mini", + "displayName": "GPT-4o mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-5", + "provider": "digitalocean", + "model": "openai-gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2025-08-07", + "lastUpdated": "2025-08-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-5", + "modelKey": "openai-gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-5-mini", + "provider": "digitalocean", + "model": "openai-gpt-5-mini", + "displayName": "GPT-5 mini", + "family": "gpt-mini", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-5-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5 mini" + ], + "families": [ + "gpt-mini" + ], + "knowledgeCutoff": "2024-05-30", + "releaseDate": "2025-08-07", + "lastUpdated": "2025-08-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-5-mini", + "modelKey": "openai-gpt-5-mini", + "displayName": "GPT-5 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-5-nano", + "provider": "digitalocean", + "model": "openai-gpt-5-nano", + "displayName": "GPT-5 nano", + "family": "gpt-nano", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-5-nano" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5 nano" + ], + "families": [ + "gpt-nano" + ], + "knowledgeCutoff": "2024-05-30", + "releaseDate": "2025-08-07", + "lastUpdated": "2025-08-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-5-nano", + "modelKey": "openai-gpt-5-nano", + "displayName": "GPT-5 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-5.1-codex-max", + "provider": "digitalocean", + "model": "openai-gpt-5.1-codex-max", + "displayName": "GPT-5.1 Codex Max", + "family": "gpt-codex", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-5.1-codex-max" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-5.1-codex-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.1 Codex Max" + ], + "families": [ + "gpt-codex" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2025-11-13", + "lastUpdated": "2025-11-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-5.1-codex-max", + "modelKey": "openai-gpt-5.1-codex-max", + "displayName": "GPT-5.1 Codex Max", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-5.2", + "provider": "digitalocean", + "model": "openai-gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-5.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.2" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2025-12-11", + "lastUpdated": "2025-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-5.2", + "modelKey": "openai-gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-5.2-pro", + "provider": "digitalocean", + "model": "openai-gpt-5.2-pro", + "displayName": "GPT-5.2 pro", + "family": "gpt-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-5.2-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-5.2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 21, + "output": 168 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.2 pro" + ], + "families": [ + "gpt-pro" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2025-12-11", + "lastUpdated": "2025-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-5.2-pro", + "modelKey": "openai-gpt-5.2-pro", + "displayName": "GPT-5.2 pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-5.3-codex", + "provider": "digitalocean", + "model": "openai-gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt-codex", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-5.3-codex" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.3 Codex" + ], + "families": [ + "gpt-codex" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-02-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-5.3-codex", + "modelKey": "openai-gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-5.4", + "provider": "digitalocean", + "model": "openai-gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-5.4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.4" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-05", + "lastUpdated": "2026-03-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-5.4", + "modelKey": "openai-gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-5.4-mini", + "provider": "digitalocean", + "model": "openai-gpt-5.4-mini", + "displayName": "GPT-5.4 mini", + "family": "gpt-mini", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-5.4-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.4 mini" + ], + "families": [ + "gpt-mini" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-17", + "lastUpdated": "2026-03-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-5.4-mini", + "modelKey": "openai-gpt-5.4-mini", + "displayName": "GPT-5.4 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-5.4-nano", + "provider": "digitalocean", + "model": "openai-gpt-5.4-nano", + "displayName": "GPT-5.4 nano", + "family": "gpt-nano", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-5.4-nano" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.4 nano" + ], + "families": [ + "gpt-nano" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-17", + "lastUpdated": "2026-03-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-5.4-nano", + "modelKey": "openai-gpt-5.4-nano", + "displayName": "GPT-5.4 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-5.4-pro", + "provider": "digitalocean", + "model": "openai-gpt-5.4-pro", + "displayName": "GPT-5.4 pro", + "family": "gpt-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-5.4-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-5.4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 180 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.4 pro" + ], + "families": [ + "gpt-pro" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-05", + "lastUpdated": "2026-03-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-5.4-pro", + "modelKey": "openai-gpt-5.4-pro", + "displayName": "GPT-5.4 pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-5.5", + "provider": "digitalocean", + "model": "openai-gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-5.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 45, + "cache_read": 1 + }, + "tiers": [ + { + "input": 10, + "output": 45, + "cache_read": 1, + "tier": { + "size": 272000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.5" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-12-01", + "releaseDate": "2026-04-23", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-5.5", + "modelKey": "openai-gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-23", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-image-1", + "provider": "digitalocean", + "model": "openai-gpt-image-1", + "displayName": "GPT Image 1", + "family": "gpt-image", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-image-1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-image-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "output": 40 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT Image 1" + ], + "families": [ + "gpt-image" + ], + "releaseDate": "2025-04-24", + "lastUpdated": "2025-04-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-image-1", + "modelKey": "openai-gpt-image-1", + "displayName": "GPT Image 1", + "family": "gpt-image", + "metadata": { + "lastUpdated": "2025-04-24", + "openWeights": false, + "releaseDate": "2025-04-24" + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-image-1.5", + "provider": "digitalocean", + "model": "openai-gpt-image-1.5", + "displayName": "GPT Image 1.5", + "family": "gpt-image", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-image-1.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-image-1.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "input": 5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT Image 1.5" + ], + "families": [ + "gpt-image" + ], + "releaseDate": "2025-11-25", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-image-1.5", + "modelKey": "openai-gpt-image-1.5", + "displayName": "GPT Image 1.5", + "family": "gpt-image", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-11-25" + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-image-2", + "provider": "digitalocean", + "model": "openai-gpt-image-2", + "displayName": "GPT Image 2", + "family": "gpt-image", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-image-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "GPT Image 2" + ], + "families": [ + "gpt-image" + ], + "releaseDate": "2025-04-24", + "lastUpdated": "2025-04-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-image-2", + "modelKey": "openai-gpt-image-2", + "displayName": "GPT Image 2", + "family": "gpt-image", + "metadata": { + "lastUpdated": "2025-04-24", + "openWeights": false, + "releaseDate": "2025-04-24" + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-oss-120b", + "provider": "digitalocean", + "model": "openai-gpt-oss-120b", + "displayName": "gpt-oss-120b", + "family": "gpt-oss", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-oss-120b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gpt-oss-120b" + ], + "families": [ + "gpt-oss" + ], + "knowledgeCutoff": "2024-06", + "releaseDate": "2025-08-05", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-oss-120b", + "modelKey": "openai-gpt-oss-120b", + "displayName": "gpt-oss-120b", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2026-04-16", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/openai-gpt-oss-20b", + "provider": "digitalocean", + "model": "openai-gpt-oss-20b", + "displayName": "gpt-oss-20b", + "family": "gpt-oss", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-gpt-oss-20b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.45 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gpt-oss-20b" + ], + "families": [ + "gpt-oss" + ], + "knowledgeCutoff": "2024-06", + "releaseDate": "2025-08-05", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-gpt-oss-20b", + "modelKey": "openai-gpt-oss-20b", + "displayName": "gpt-oss-20b", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2026-04-16", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/openai-o1", + "provider": "digitalocean", + "model": "openai-o1", + "displayName": "o1", + "family": "o", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-o1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-o1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + } + ] + }, + "metadata": { + "displayNames": [ + "o1" + ], + "families": [ + "o" + ], + "knowledgeCutoff": "2023-09", + "releaseDate": "2024-12-05", + "lastUpdated": "2024-12-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-o1", + "modelKey": "openai-o1", + "displayName": "o1", + "family": "o", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-12-05", + "openWeights": false, + "releaseDate": "2024-12-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/openai-o3", + "provider": "digitalocean", + "model": "openai-o3", + "displayName": "o3", + "family": "o", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-o3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-o3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "o3" + ], + "families": [ + "o" + ], + "knowledgeCutoff": "2024-05", + "releaseDate": "2025-04-16", + "lastUpdated": "2025-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-o3", + "modelKey": "openai-o3", + "displayName": "o3", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/openai-o3-mini", + "provider": "digitalocean", + "model": "openai-o3-mini", + "displayName": "o3-mini", + "family": "o-mini", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/openai-o3-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "openai-o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "o3-mini" + ], + "families": [ + "o-mini" + ], + "knowledgeCutoff": "2024-05", + "releaseDate": "2024-12-20", + "lastUpdated": "2025-01-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "openai-o3-mini", + "modelKey": "openai-o3-mini", + "displayName": "o3-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-01-29", + "openWeights": false, + "releaseDate": "2024-12-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "digitalocean/schnell", + "provider": "digitalocean", + "model": "schnell", + "displayName": "FLUX.1 [schnell]", + "family": "flux", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/fal-ai/flux/schnell" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "FLUX.1 [schnell]" + ], + "families": [ + "flux" + ], + "releaseDate": "2024-08-01", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "fal-ai/flux/schnell", + "modelKey": "fal-ai/flux/schnell", + "displayName": "FLUX.1 [schnell]", + "family": "flux", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": true, + "releaseDate": "2024-08-01" + } + } + ] + }, + { + "id": "digitalocean/stable-diffusion-3.5-large", + "provider": "digitalocean", + "model": "stable-diffusion-3.5-large", + "displayName": "Stable Diffusion 3.5 Large", + "family": "stable-diffusion", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/stable-diffusion-3.5-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256, + "outputTokens": 1, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "stable-diffusion-3.5-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Stable Diffusion 3.5 Large" + ], + "families": [ + "stable-diffusion" + ], + "releaseDate": "2024-10-22", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "stable-diffusion-3.5-large", + "modelKey": "stable-diffusion-3.5-large", + "displayName": "Stable Diffusion 3.5 Large", + "family": "stable-diffusion", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2024-10-22" + } + } + ] + }, + { + "id": "digitalocean/text-to-audio", + "provider": "digitalocean", + "model": "text-to-audio", + "displayName": "Stable Audio 2.5 (Text-to-Audio)", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/fal-ai/stable-audio-25/text-to-audio" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Stable Audio 2.5 (Text-to-Audio)" + ], + "releaseDate": "2025-10-08", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "fal-ai/stable-audio-25/text-to-audio", + "modelKey": "fal-ai/stable-audio-25/text-to-audio", + "displayName": "Stable Audio 2.5 (Text-to-Audio)", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2025-10-08" + } + } + ] + }, + { + "id": "digitalocean/wan2-2-t2v-a14b", + "provider": "digitalocean", + "model": "wan2-2-t2v-a14b", + "displayName": "Wan2.2-T2V-A14B", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/wan2-2-t2v-a14b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 100, + "outputTokens": 1, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "wan2-2-t2v-a14b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Wan2.2-T2V-A14B" + ], + "releaseDate": "2025-07-28", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "wan2-2-t2v-a14b", + "modelKey": "wan2-2-t2v-a14b", + "displayName": "Wan2.2-T2V-A14B", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2025-07-28" + } + } + ] + }, + { + "id": "duckduckgo/search", + "provider": "duckduckgo", + "model": "search", + "mode": "search", + "sources": [ + "litellm" + ], + "providers": [ + "duckduckgo" + ], + "aliases": [ + "duckduckgo/search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "duckduckgo", + "model": "duckduckgo/search", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perQuery": { + "input": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "search" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "duckduckgo", + "model": "duckduckgo/search", + "mode": "search", + "metadata": { + "metadata": { + "notes": "DuckDuckGo Instant Answer API is free and does not require an API key." + } + } + } + ] + }, + { + "id": "elevenlabs/eleven-multilingual-v2", + "provider": "elevenlabs", + "model": "eleven-multilingual-v2", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "elevenlabs" + ], + "aliases": [ + "elevenlabs/eleven_multilingual_v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "elevenlabs", + "model": "elevenlabs/eleven_multilingual_v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.00018 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "elevenlabs", + "model": "elevenlabs/eleven_multilingual_v2", + "mode": "audio_speech", + "metadata": { + "metadata": { + "calculation": "$0.18/1000 characters (Scale plan pricing, 1 credit per character)", + "notes": "ElevenLabs Eleven Multilingual v2 - default TTS model with 29 languages support" + }, + "source": "https://elevenlabs.io/pricing", + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "elevenlabs/eleven-v3", + "provider": "elevenlabs", + "model": "eleven-v3", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "elevenlabs" + ], + "aliases": [ + "elevenlabs/eleven_v3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "elevenlabs", + "model": "elevenlabs/eleven_v3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.00018 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "elevenlabs", + "model": "elevenlabs/eleven_v3", + "mode": "audio_speech", + "metadata": { + "metadata": { + "calculation": "$0.18/1000 characters (Scale plan pricing, 1 credit per character)", + "notes": "ElevenLabs Eleven v3 - most expressive TTS model with 70+ languages and audio tags support" + }, + "source": "https://elevenlabs.io/pricing", + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "elevenlabs/scribe-v1", + "provider": "elevenlabs", + "model": "scribe-v1", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "elevenlabs" + ], + "aliases": [ + "elevenlabs/scribe_v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "elevenlabs", + "model": "elevenlabs/scribe_v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.0000611 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "elevenlabs", + "model": "elevenlabs/scribe_v1", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.22/hour = $0.00366/minute = $0.0000611 per second (enterprise pricing)", + "notes": "ElevenLabs Scribe v1 - state-of-the-art speech recognition model with 99 language support", + "original_pricing_per_hour": 0.22 + }, + "source": "https://elevenlabs.io/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "elevenlabs/scribe-v1-experimental", + "provider": "elevenlabs", + "model": "scribe-v1-experimental", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "elevenlabs" + ], + "aliases": [ + "elevenlabs/scribe_v1_experimental" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "elevenlabs", + "model": "elevenlabs/scribe_v1_experimental", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.0000611 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "elevenlabs", + "model": "elevenlabs/scribe_v1_experimental", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "calculation": "$0.22/hour = $0.00366/minute = $0.0000611 per second (enterprise pricing)", + "notes": "ElevenLabs Scribe v1 experimental - enhanced version of the main Scribe model", + "original_pricing_per_hour": 0.22 + }, + "source": "https://elevenlabs.io/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "evroc/kb-whisper-large", + "provider": "evroc", + "model": "kb-whisper-large", + "displayName": "KB Whisper", + "family": "whisper", + "sources": [ + "models.dev" + ], + "providers": [ + "evroc" + ], + "aliases": [ + "evroc/KBLab/kb-whisper-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 448, + "outputTokens": 448, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": true, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "evroc", + "model": "KBLab/kb-whisper-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.00236, + "output": 0.00236, + "outputAudio": 2.36 + } + } + ] + }, + "metadata": { + "displayNames": [ + "KB Whisper" + ], + "families": [ + "whisper" + ], + "releaseDate": "2024-10-01", + "lastUpdated": "2024-10-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "evroc", + "providerName": "evroc", + "providerApi": "https://models.think.evroc.com/v1", + "providerDoc": "https://docs.evroc.com/products/think/overview.html", + "model": "KBLab/kb-whisper-large", + "modelKey": "KBLab/kb-whisper-large", + "displayName": "KB Whisper", + "family": "whisper", + "metadata": { + "lastUpdated": "2024-10-01", + "openWeights": true, + "releaseDate": "2024-10-01" + } + } + ] + }, + { + "id": "evroc/multilingual-e5-large-instruct", + "provider": "evroc", + "model": "multilingual-e5-large-instruct", + "displayName": "E5 Multi-Lingual Large Embeddings 0.6B", + "family": "text-embedding", + "sources": [ + "models.dev" + ], + "providers": [ + "evroc" + ], + "aliases": [ + "evroc/intfloat/multilingual-e5-large-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "outputTokens": 512, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "evroc", + "model": "intfloat/multilingual-e5-large-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.12 + } + } + ] + }, + "metadata": { + "displayNames": [ + "E5 Multi-Lingual Large Embeddings 0.6B" + ], + "families": [ + "text-embedding" + ], + "releaseDate": "2024-06-01", + "lastUpdated": "2024-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "evroc", + "providerName": "evroc", + "providerApi": "https://models.think.evroc.com/v1", + "providerDoc": "https://docs.evroc.com/products/think/overview.html", + "model": "intfloat/multilingual-e5-large-instruct", + "modelKey": "intfloat/multilingual-e5-large-instruct", + "displayName": "E5 Multi-Lingual Large Embeddings 0.6B", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2024-06-01", + "openWeights": true, + "releaseDate": "2024-06-01" + } + } + ] + }, + { + "id": "evroc/phi-4-multimodal-instruct", + "provider": "evroc", + "model": "phi-4-multimodal-instruct", + "displayName": "Phi-4 15B", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "evroc" + ], + "aliases": [ + "evroc/microsoft/Phi-4-multimodal-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "evroc", + "model": "microsoft/Phi-4-multimodal-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.24, + "output": 0.47 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4 15B" + ], + "families": [ + "phi" + ], + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "evroc", + "providerName": "evroc", + "providerApi": "https://models.think.evroc.com/v1", + "providerDoc": "https://docs.evroc.com/products/think/overview.html", + "model": "microsoft/Phi-4-multimodal-instruct", + "modelKey": "microsoft/Phi-4-multimodal-instruct", + "displayName": "Phi-4 15B", + "family": "phi", + "metadata": { + "lastUpdated": "2025-01-01", + "openWeights": true, + "releaseDate": "2025-01-01" + } + } + ] + }, + { + "id": "exa-ai/search", + "provider": "exa-ai", + "model": "search", + "mode": "search", + "sources": [ + "litellm" + ], + "providers": [ + "exa_ai" + ], + "aliases": [ + "exa_ai/search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "exa_ai", + "model": "exa_ai/search", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "search" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "exa_ai", + "model": "exa_ai/search", + "mode": "search" + } + ] + }, + { + "id": "fal-ai/3.2", + "provider": "fal-ai", + "model": "3.2", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fal_ai" + ], + "aliases": [ + "fal_ai/bria/text-to-image/3.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fal_ai", + "model": "fal_ai/bria/text-to-image/3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.0398 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fal_ai", + "model": "fal_ai/bria/text-to-image/3.2", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "fal-ai/fast", + "provider": "fal-ai", + "model": "fast", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fal_ai" + ], + "aliases": [ + "fal_ai/fal-ai/imagen4/preview/fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/imagen4/preview/fast", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.02 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/imagen4/preview/fast", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "fal-ai/nano-banana", + "provider": "fal-ai", + "model": "nano-banana", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fal_ai" + ], + "aliases": [ + "fal_ai/fal-ai/nano-banana" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/nano-banana", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.039 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/nano-banana", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "fal-ai/preview", + "provider": "fal-ai", + "model": "preview", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fal_ai" + ], + "aliases": [ + "fal_ai/fal-ai/imagen4/preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/imagen4/preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.0398 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/imagen4/preview", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "fal-ai/schnell", + "provider": "fal-ai", + "model": "schnell", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fal_ai" + ], + "aliases": [ + "fal_ai/fal-ai/flux/schnell" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/flux/schnell", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.003 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/flux/schnell", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "fal-ai/stable-diffusion-v35-medium", + "provider": "fal-ai", + "model": "stable-diffusion-v35-medium", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fal_ai" + ], + "aliases": [ + "fal_ai/fal-ai/stable-diffusion-v35-medium" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/stable-diffusion-v35-medium", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.0398 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/stable-diffusion-v35-medium", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "fal-ai/text-to-image", + "provider": "fal-ai", + "model": "text-to-image", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fal_ai" + ], + "aliases": [ + "fal_ai/fal-ai/bytedance/dreamina/v3.1/text-to-image", + "fal_ai/fal-ai/bytedance/seedream/v3/text-to-image", + "fal_ai/fal-ai/recraft/v3/text-to-image" + ], + "mergedProviderModelRecords": 3, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/bytedance/dreamina/v3.1/text-to-image", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.03 + } + }, + { + "source": "litellm", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/bytedance/seedream/v3/text-to-image", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.03 + } + }, + { + "source": "litellm", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/recraft/v3/text-to-image", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.0398 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/bytedance/dreamina/v3.1/text-to-image", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/bytedance/seedream/v3/text-to-image", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/recraft/v3/text-to-image", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "fal-ai/ultra", + "provider": "fal-ai", + "model": "ultra", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fal_ai" + ], + "aliases": [ + "fal_ai/fal-ai/imagen4/preview/ultra" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/imagen4/preview/ultra", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.06 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/imagen4/preview/ultra", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "fal-ai/v1.1", + "provider": "fal-ai", + "model": "v1.1", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fal_ai" + ], + "aliases": [ + "fal_ai/fal-ai/flux-pro/v1.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/flux-pro/v1.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/flux-pro/v1.1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "fal-ai/v1.1-ultra", + "provider": "fal-ai", + "model": "v1.1-ultra", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fal_ai" + ], + "aliases": [ + "fal_ai/fal-ai/flux-pro/v1.1-ultra" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/flux-pro/v1.1-ultra", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.06 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/flux-pro/v1.1-ultra", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "fal-ai/v3", + "provider": "fal-ai", + "model": "v3", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fal_ai" + ], + "aliases": [ + "fal_ai/fal-ai/ideogram/v3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/ideogram/v3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.06 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/ideogram/v3", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "fastrouter/lucid-origin", + "provider": "fastrouter", + "model": "lucid-origin", + "displayName": "Lucid Origin", + "family": "lucid", + "sources": [ + "models.dev" + ], + "providers": [ + "fastrouter" + ], + "aliases": [ + "fastrouter/leonardo-ai/lucid-origin" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Lucid Origin" + ], + "families": [ + "lucid" + ], + "releaseDate": "2025-06-01", + "lastUpdated": "2025-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "leonardo-ai/lucid-origin", + "modelKey": "leonardo-ai/lucid-origin", + "displayName": "Lucid Origin", + "family": "lucid", + "metadata": { + "lastUpdated": "2025-06-01", + "openWeights": false, + "releaseDate": "2025-06-01" + } + } + ] + }, + { + "id": "fastrouter/lucid-realism", + "provider": "fastrouter", + "model": "lucid-realism", + "displayName": "Lucid Realism", + "family": "lucid", + "sources": [ + "models.dev" + ], + "providers": [ + "fastrouter" + ], + "aliases": [ + "fastrouter/leonardo-ai/lucid-realism" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Lucid Realism" + ], + "families": [ + "lucid" + ], + "releaseDate": "2025-06-01", + "lastUpdated": "2025-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "leonardo-ai/lucid-realism", + "modelKey": "leonardo-ai/lucid-realism", + "displayName": "Lucid Realism", + "family": "lucid", + "metadata": { + "lastUpdated": "2025-06-01", + "openWeights": false, + "releaseDate": "2025-06-01" + } + } + ] + }, + { + "id": "fastrouter/sarvam-105b", + "provider": "fastrouter", + "model": "sarvam-105b", + "displayName": "Sarvam 105B", + "family": "sarvam", + "sources": [ + "models.dev" + ], + "providers": [ + "fastrouter" + ], + "aliases": [ + "fastrouter/sarvam/sarvam-105b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fastrouter", + "model": "sarvam/sarvam-105b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.16 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Sarvam 105B" + ], + "families": [ + "sarvam" + ], + "releaseDate": "2025-09-01", + "lastUpdated": "2025-09-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "sarvam/sarvam-105b", + "modelKey": "sarvam/sarvam-105b", + "displayName": "Sarvam 105B", + "family": "sarvam", + "metadata": { + "lastUpdated": "2025-09-01", + "openWeights": true, + "releaseDate": "2025-09-01" + } + } + ] + }, + { + "id": "fastrouter/sarvam-30b", + "provider": "fastrouter", + "model": "sarvam-30b", + "displayName": "Sarvam 30B", + "family": "sarvam", + "sources": [ + "models.dev" + ], + "providers": [ + "fastrouter" + ], + "aliases": [ + "fastrouter/sarvam/sarvam-30b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fastrouter", + "model": "sarvam/sarvam-30b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Sarvam 30B" + ], + "families": [ + "sarvam" + ], + "releaseDate": "2026-02-18", + "lastUpdated": "2026-02-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "sarvam/sarvam-30b", + "modelKey": "sarvam/sarvam-30b", + "displayName": "Sarvam 30B", + "family": "sarvam", + "metadata": { + "lastUpdated": "2026-02-18", + "openWeights": true, + "releaseDate": "2026-02-18" + } + } + ] + }, + { + "id": "fastrouter/seedance-2", + "provider": "fastrouter", + "model": "seedance-2", + "displayName": "Seedance 2", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "fastrouter" + ], + "aliases": [ + "fastrouter/bytedance/seedance-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Seedance 2" + ], + "families": [ + "seed" + ], + "releaseDate": "2026-04-01", + "lastUpdated": "2026-04-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "bytedance/seedance-2", + "modelKey": "bytedance/seedance-2", + "displayName": "Seedance 2", + "family": "seed", + "metadata": { + "lastUpdated": "2026-04-01", + "openWeights": false, + "releaseDate": "2026-04-01" + } + } + ] + }, + { + "id": "featherless-ai/qwerky-72b", + "provider": "featherless-ai", + "model": "qwerky-72b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "featherless_ai" + ], + "aliases": [ + "featherless_ai/featherless-ai/Qwerky-72B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "featherless_ai", + "model": "featherless_ai/featherless-ai/Qwerky-72B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "featherless_ai", + "model": "featherless_ai/featherless-ai/Qwerky-72B", + "mode": "chat" + } + ] + }, + { + "id": "featherless-ai/qwerky-qwq-32b", + "provider": "featherless-ai", + "model": "qwerky-qwq-32b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "featherless_ai" + ], + "aliases": [ + "featherless_ai/featherless-ai/Qwerky-QwQ-32B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "featherless_ai", + "model": "featherless_ai/featherless-ai/Qwerky-QwQ-32B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "featherless_ai", + "model": "featherless_ai/featherless-ai/Qwerky-QwQ-32B", + "mode": "chat" + } + ] + }, + { + "id": "firecrawl/search", + "provider": "firecrawl", + "model": "search", + "mode": "search", + "sources": [ + "litellm" + ], + "providers": [ + "firecrawl" + ], + "aliases": [ + "firecrawl/search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "firecrawl", + "model": "firecrawl/search", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "search" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "firecrawl", + "model": "firecrawl/search", + "mode": "search", + "metadata": { + "metadata": { + "notes": "Firecrawl search pricing: $83 for 100,000 credits, 2 credits per 10 results. Cost = ceiling(limit/10) * 2 * $0.00083" + } + } + } + ] + }, + { + "id": "fireworks-ai-embedding-models/fireworks-ai-embedding-150m-to-350m", + "provider": "fireworks-ai-embedding-models", + "model": "fireworks-ai-embedding-150m-to-350m", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai-embedding-models" + ], + "aliases": [ + "fireworks_ai-embedding-models/fireworks-ai-embedding-150m-to-350m" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai-embedding-models", + "model": "fireworks-ai-embedding-150m-to-350m", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.016, + "output": 0 + } + } + ] + }, + "metadata": { + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai-embedding-models", + "model": "fireworks-ai-embedding-150m-to-350m" + } + ] + }, + { + "id": "fireworks-ai-embedding-models/fireworks-ai-embedding-up-to-150m", + "provider": "fireworks-ai-embedding-models", + "model": "fireworks-ai-embedding-up-to-150m", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai-embedding-models" + ], + "aliases": [ + "fireworks_ai-embedding-models/fireworks-ai-embedding-up-to-150m" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai-embedding-models", + "model": "fireworks-ai-embedding-up-to-150m", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.008, + "output": 0 + } + } + ] + }, + "metadata": { + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai-embedding-models", + "model": "fireworks-ai-embedding-up-to-150m" + } + ] + }, + { + "id": "fireworks-ai-embedding-models/gte-base", + "provider": "fireworks-ai-embedding-models", + "model": "gte-base", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai-embedding-models" + ], + "aliases": [ + "fireworks_ai-embedding-models/fireworks_ai/thenlper/gte-base" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai-embedding-models", + "model": "fireworks_ai/thenlper/gte-base", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.008, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai-embedding-models", + "model": "fireworks_ai/thenlper/gte-base", + "mode": "embedding", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "fireworks-ai-embedding-models/gte-large", + "provider": "fireworks-ai-embedding-models", + "model": "gte-large", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai-embedding-models" + ], + "aliases": [ + "fireworks_ai-embedding-models/fireworks_ai/thenlper/gte-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai-embedding-models", + "model": "fireworks_ai/thenlper/gte-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.016, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai-embedding-models", + "model": "fireworks_ai/thenlper/gte-large", + "mode": "embedding", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "fireworks-ai-embedding-models/nomic-embed-text-v1", + "provider": "fireworks-ai-embedding-models", + "model": "nomic-embed-text-v1", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai-embedding-models" + ], + "aliases": [ + "fireworks_ai-embedding-models/fireworks_ai/nomic-ai/nomic-embed-text-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai-embedding-models", + "model": "fireworks_ai/nomic-ai/nomic-embed-text-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.008, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai-embedding-models", + "model": "fireworks_ai/nomic-ai/nomic-embed-text-v1", + "mode": "embedding", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "fireworks-ai-embedding-models/nomic-embed-text-v1.5", + "provider": "fireworks-ai-embedding-models", + "model": "nomic-embed-text-v1.5", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai-embedding-models" + ], + "aliases": [ + "fireworks_ai-embedding-models/fireworks_ai/nomic-ai/nomic-embed-text-v1.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai-embedding-models", + "model": "fireworks_ai/nomic-ai/nomic-embed-text-v1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.008, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai-embedding-models", + "model": "fireworks_ai/nomic-ai/nomic-embed-text-v1.5", + "mode": "embedding", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "fireworks-ai-embedding-models/uae-large-v1", + "provider": "fireworks-ai-embedding-models", + "model": "uae-large-v1", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai-embedding-models" + ], + "aliases": [ + "fireworks_ai-embedding-models/fireworks_ai/WhereIsAI/UAE-Large-V1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai-embedding-models", + "model": "fireworks_ai/WhereIsAI/UAE-Large-V1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.016, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai-embedding-models", + "model": "fireworks_ai/WhereIsAI/UAE-Large-V1", + "mode": "embedding", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "fireworks-ai/chronos-hermes-13b-v2", + "provider": "fireworks-ai", + "model": "chronos-hermes-13b-v2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/chronos-hermes-13b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/chronos-hermes-13b-v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/chronos-hermes-13b-v2", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/code-llama-13b", + "provider": "fireworks-ai", + "model": "code-llama-13b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/code-llama-13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-13b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-13b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/code-llama-13b-instruct", + "provider": "fireworks-ai", + "model": "code-llama-13b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/code-llama-13b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-13b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-13b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/code-llama-13b-python", + "provider": "fireworks-ai", + "model": "code-llama-13b-python", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/code-llama-13b-python" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-13b-python", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-13b-python", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/code-llama-34b", + "provider": "fireworks-ai", + "model": "code-llama-34b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/code-llama-34b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-34b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-34b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/code-llama-34b-instruct", + "provider": "fireworks-ai", + "model": "code-llama-34b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/code-llama-34b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-34b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-34b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/code-llama-34b-python", + "provider": "fireworks-ai", + "model": "code-llama-34b-python", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/code-llama-34b-python" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-34b-python", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-34b-python", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/code-llama-70b", + "provider": "fireworks-ai", + "model": "code-llama-70b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/code-llama-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-70b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/code-llama-70b-instruct", + "provider": "fireworks-ai", + "model": "code-llama-70b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/code-llama-70b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-70b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/code-llama-70b-python", + "provider": "fireworks-ai", + "model": "code-llama-70b-python", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/code-llama-70b-python" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-70b-python", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-70b-python", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/code-llama-7b", + "provider": "fireworks-ai", + "model": "code-llama-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/code-llama-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-7b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/code-llama-7b-instruct", + "provider": "fireworks-ai", + "model": "code-llama-7b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/code-llama-7b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-7b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-7b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/code-llama-7b-python", + "provider": "fireworks-ai", + "model": "code-llama-7b-python", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/code-llama-7b-python" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-7b-python", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-llama-7b-python", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/code-qwen-1p5-7b", + "provider": "fireworks-ai", + "model": "code-qwen-1p5-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/code-qwen-1p5-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-qwen-1p5-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/code-qwen-1p5-7b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/codegemma-2b", + "provider": "fireworks-ai", + "model": "codegemma-2b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/codegemma-2b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/codegemma-2b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/codegemma-2b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/codegemma-7b", + "provider": "fireworks-ai", + "model": "codegemma-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/codegemma-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/codegemma-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/codegemma-7b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/cogito-671b-v2-p1", + "provider": "fireworks-ai", + "model": "cogito-671b-v2-p1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/cogito-671b-v2-p1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/cogito-671b-v2-p1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.2, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/cogito-671b-v2-p1", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/cogito-v1-preview-llama-3b", + "provider": "fireworks-ai", + "model": "cogito-v1-preview-llama-3b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/cogito-v1-preview-llama-3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/cogito-v1-preview-llama-3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/cogito-v1-preview-llama-3b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/cogito-v1-preview-llama-70b", + "provider": "fireworks-ai", + "model": "cogito-v1-preview-llama-70b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/cogito-v1-preview-llama-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/cogito-v1-preview-llama-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/cogito-v1-preview-llama-70b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/cogito-v1-preview-llama-8b", + "provider": "fireworks-ai", + "model": "cogito-v1-preview-llama-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/cogito-v1-preview-llama-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/cogito-v1-preview-llama-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/cogito-v1-preview-llama-8b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/cogito-v1-preview-qwen-14b", + "provider": "fireworks-ai", + "model": "cogito-v1-preview-qwen-14b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/cogito-v1-preview-qwen-14b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/cogito-v1-preview-qwen-14b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/cogito-v1-preview-qwen-14b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/cogito-v1-preview-qwen-32b", + "provider": "fireworks-ai", + "model": "cogito-v1-preview-qwen-32b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/cogito-v1-preview-qwen-32b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/cogito-v1-preview-qwen-32b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/cogito-v1-preview-qwen-32b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/dbrx-instruct", + "provider": "fireworks-ai", + "model": "dbrx-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/dbrx-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/dbrx-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.2, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/dbrx-instruct", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/dobby-mini-unhinged-plus-llama-3-1-8b", + "provider": "fireworks-ai", + "model": "dobby-mini-unhinged-plus-llama-3-1-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/dobby-mini-unhinged-plus-llama-3-1-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/dobby-mini-unhinged-plus-llama-3-1-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/dobby-mini-unhinged-plus-llama-3-1-8b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/dobby-unhinged-llama-3-3-70b-new", + "provider": "fireworks-ai", + "model": "dobby-unhinged-llama-3-3-70b-new", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/dobby-unhinged-llama-3-3-70b-new" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/dobby-unhinged-llama-3-3-70b-new", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/dobby-unhinged-llama-3-3-70b-new", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/dolphin-2-9-2-qwen2-72b", + "provider": "fireworks-ai", + "model": "dolphin-2-9-2-qwen2-72b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/dolphin-2-9-2-qwen2-72b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/dolphin-2-9-2-qwen2-72b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/dolphin-2-9-2-qwen2-72b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/dolphin-2p6-mixtral-8x7b", + "provider": "fireworks-ai", + "model": "dolphin-2p6-mixtral-8x7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/dolphin-2p6-mixtral-8x7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/dolphin-2p6-mixtral-8x7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/dolphin-2p6-mixtral-8x7b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/ernie-4p5-21b-a3b-pt", + "provider": "fireworks-ai", + "model": "ernie-4p5-21b-a3b-pt", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/ernie-4p5-21b-a3b-pt" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/ernie-4p5-21b-a3b-pt", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/ernie-4p5-21b-a3b-pt", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/ernie-4p5-300b-a47b-pt", + "provider": "fireworks-ai", + "model": "ernie-4p5-300b-a47b-pt", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/ernie-4p5-300b-a47b-pt" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/ernie-4p5-300b-a47b-pt", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/ernie-4p5-300b-a47b-pt", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/fare-20b", + "provider": "fireworks-ai", + "model": "fare-20b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/fare-20b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/fare-20b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/fare-20b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/firefunction-v1", + "provider": "fireworks-ai", + "model": "firefunction-v1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/firefunction-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/firefunction-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/firefunction-v1", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/firefunction-v2", + "provider": "fireworks-ai", + "model": "firefunction-v2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/firefunction-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/firefunction-v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/firefunction-v2", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "fireworks-ai/firellava-13b", + "provider": "fireworks-ai", + "model": "firellava-13b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/firellava-13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/firellava-13b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/firellava-13b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/firesearch-ocr-v6", + "provider": "fireworks-ai", + "model": "firesearch-ocr-v6", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/firesearch-ocr-v6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/firesearch-ocr-v6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/firesearch-ocr-v6", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/fireworks-ai-4.1b-to-16b", + "provider": "fireworks-ai", + "model": "fireworks-ai-4.1b-to-16b", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/fireworks-ai-4.1b-to-16b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks-ai-4.1b-to-16b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks-ai-4.1b-to-16b" + } + ] + }, + { + "id": "fireworks-ai/fireworks-ai-56b-to-176b", + "provider": "fireworks-ai", + "model": "fireworks-ai-56b-to-176b", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/fireworks-ai-56b-to-176b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks-ai-56b-to-176b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.2, + "output": 1.2 + } + } + ] + }, + "metadata": { + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks-ai-56b-to-176b" + } + ] + }, + { + "id": "fireworks-ai/fireworks-ai-above-16b", + "provider": "fireworks-ai", + "model": "fireworks-ai-above-16b", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/fireworks-ai-above-16b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks-ai-above-16b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks-ai-above-16b" + } + ] + }, + { + "id": "fireworks-ai/fireworks-ai-default", + "provider": "fireworks-ai", + "model": "fireworks-ai-default", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/fireworks-ai-default" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks-ai-default", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks-ai-default" + } + ] + }, + { + "id": "fireworks-ai/fireworks-ai-moe-up-to-56b", + "provider": "fireworks-ai", + "model": "fireworks-ai-moe-up-to-56b", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/fireworks-ai-moe-up-to-56b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks-ai-moe-up-to-56b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + } + ] + }, + "metadata": { + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks-ai-moe-up-to-56b" + } + ] + }, + { + "id": "fireworks-ai/fireworks-ai-up-to-4b", + "provider": "fireworks-ai", + "model": "fireworks-ai-up-to-4b", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/fireworks-ai-up-to-4b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks-ai-up-to-4b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks-ai-up-to-4b" + } + ] + }, + { + "id": "fireworks-ai/fireworks-asr-large", + "provider": "fireworks-ai", + "model": "fireworks-asr-large", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/fireworks-asr-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/fireworks-asr-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/fireworks-asr-large", + "mode": "audio_transcription" + } + ] + }, + { + "id": "fireworks-ai/fireworks-asr-v2", + "provider": "fireworks-ai", + "model": "fireworks-asr-v2", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/fireworks-asr-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/fireworks-asr-v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/fireworks-asr-v2", + "mode": "audio_transcription" + } + ] + }, + { + "id": "fireworks-ai/flux-1-dev", + "provider": "fireworks-ai", + "model": "flux-1-dev", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/flux-1-dev" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/flux-1-dev", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/flux-1-dev", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/flux-1-dev-controlnet-union", + "provider": "fireworks-ai", + "model": "flux-1-dev-controlnet-union", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/flux-1-dev-controlnet-union" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/flux-1-dev-controlnet-union", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.001, + "output": 0.001 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/flux-1-dev-controlnet-union", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/flux-1-dev-fp8", + "provider": "fireworks-ai", + "model": "flux-1-dev-fp8", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/flux-1-dev-fp8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/flux-1-dev-fp8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.0005, + "output": 0.0005 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/flux-1-dev-fp8", + "mode": "image_generation" + } + ] + }, + { + "id": "fireworks-ai/flux-1-schnell", + "provider": "fireworks-ai", + "model": "flux-1-schnell", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/flux-1-schnell" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/flux-1-schnell", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/flux-1-schnell", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/flux-1-schnell-fp8", + "provider": "fireworks-ai", + "model": "flux-1-schnell-fp8", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/flux-1-schnell-fp8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/flux-1-schnell-fp8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.00035, + "output": 0.00035 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/flux-1-schnell-fp8", + "mode": "image_generation" + } + ] + }, + { + "id": "fireworks-ai/flux-kontext-max", + "provider": "fireworks-ai", + "model": "flux-kontext-max", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/flux-kontext-max" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/flux-kontext-max", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.08 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/flux-kontext-max", + "mode": "image_generation" + } + ] + }, + { + "id": "fireworks-ai/flux-kontext-pro", + "provider": "fireworks-ai", + "model": "flux-kontext-pro", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/flux-kontext-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/flux-kontext-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/flux-kontext-pro", + "mode": "image_generation" + } + ] + }, + { + "id": "fireworks-ai/gemma-2b-it", + "provider": "fireworks-ai", + "model": "gemma-2b-it", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/gemma-2b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gemma-2b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gemma-2b-it", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/gemma-3-27b-it", + "provider": "fireworks-ai", + "model": "gemma-3-27b-it", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/gemma-3-27b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gemma-3-27b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gemma-3-27b-it", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/gemma-7b", + "provider": "fireworks-ai", + "model": "gemma-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/gemma-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gemma-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gemma-7b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/gemma-7b-it", + "provider": "fireworks-ai", + "model": "gemma-7b-it", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/gemma-7b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gemma-7b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gemma-7b-it", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/gemma2-9b-it", + "provider": "fireworks-ai", + "model": "gemma2-9b-it", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/gemma2-9b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gemma2-9b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gemma2-9b-it", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/hermes-2-pro-mistral-7b", + "provider": "fireworks-ai", + "model": "hermes-2-pro-mistral-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/hermes-2-pro-mistral-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/hermes-2-pro-mistral-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/hermes-2-pro-mistral-7b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/internvl3-38b", + "provider": "fireworks-ai", + "model": "internvl3-38b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/internvl3-38b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/internvl3-38b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/internvl3-38b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/internvl3-78b", + "provider": "fireworks-ai", + "model": "internvl3-78b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/internvl3-78b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/internvl3-78b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/internvl3-78b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/internvl3-8b", + "provider": "fireworks-ai", + "model": "internvl3-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/internvl3-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/internvl3-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/internvl3-8b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/japanese-stable-diffusion-xl", + "provider": "fireworks-ai", + "model": "japanese-stable-diffusion-xl", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/japanese-stable-diffusion-xl" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/japanese-stable-diffusion-xl", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.00013, + "output": 0.00013 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/japanese-stable-diffusion-xl", + "mode": "image_generation" + } + ] + }, + { + "id": "fireworks-ai/kat-coder", + "provider": "fireworks-ai", + "model": "kat-coder", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/kat-coder" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/kat-coder", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/kat-coder", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/kat-dev-32b", + "provider": "fireworks-ai", + "model": "kat-dev-32b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/kat-dev-32b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/kat-dev-32b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/kat-dev-32b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/kat-dev-72b-exp", + "provider": "fireworks-ai", + "model": "kat-dev-72b-exp", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/kat-dev-72b-exp" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/kat-dev-72b-exp", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/kat-dev-72b-exp", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/llama4-maverick-instruct-basic", + "provider": "fireworks-ai", + "model": "llama4-maverick-instruct-basic", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama4-maverick-instruct-basic" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama4-maverick-instruct-basic", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.22, + "output": 0.88 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama4-maverick-instruct-basic", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "fireworks-ai/llama4-scout-instruct-basic", + "provider": "fireworks-ai", + "model": "llama4-scout-instruct-basic", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama4-scout-instruct-basic" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama4-scout-instruct-basic", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama4-scout-instruct-basic", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "fireworks-ai/llamaguard-7b", + "provider": "fireworks-ai", + "model": "llamaguard-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llamaguard-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llamaguard-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llamaguard-7b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/llava-yi-34b", + "provider": "fireworks-ai", + "model": "llava-yi-34b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llava-yi-34b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llava-yi-34b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llava-yi-34b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/models", + "provider": "fireworks-ai", + "model": "models", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 40960, + "inputTokens": 40960, + "maxTokens": 40960, + "outputTokens": 40960, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/", + "mode": "embedding" + } + ] + }, + { + "id": "fireworks-ai/mythomax-l2-13b", + "provider": "fireworks-ai", + "model": "mythomax-l2-13b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/mythomax-l2-13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mythomax-l2-13b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mythomax-l2-13b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/nemotron-nano-v2-12b-vl", + "provider": "fireworks-ai", + "model": "nemotron-nano-v2-12b-vl", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/nemotron-nano-v2-12b-vl" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nemotron-nano-v2-12b-vl", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nemotron-nano-v2-12b-vl", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/nous-capybara-7b-v1p9", + "provider": "fireworks-ai", + "model": "nous-capybara-7b-v1p9", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/nous-capybara-7b-v1p9" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nous-capybara-7b-v1p9", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nous-capybara-7b-v1p9", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/nous-hermes-2-mixtral-8x7b-dpo", + "provider": "fireworks-ai", + "model": "nous-hermes-2-mixtral-8x7b-dpo", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/nous-hermes-2-mixtral-8x7b-dpo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nous-hermes-2-mixtral-8x7b-dpo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nous-hermes-2-mixtral-8x7b-dpo", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/nous-hermes-2-yi-34b", + "provider": "fireworks-ai", + "model": "nous-hermes-2-yi-34b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/nous-hermes-2-yi-34b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nous-hermes-2-yi-34b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nous-hermes-2-yi-34b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/nous-hermes-llama2-13b", + "provider": "fireworks-ai", + "model": "nous-hermes-llama2-13b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/nous-hermes-llama2-13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nous-hermes-llama2-13b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nous-hermes-llama2-13b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/nous-hermes-llama2-70b", + "provider": "fireworks-ai", + "model": "nous-hermes-llama2-70b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/nous-hermes-llama2-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nous-hermes-llama2-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nous-hermes-llama2-70b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/nous-hermes-llama2-7b", + "provider": "fireworks-ai", + "model": "nous-hermes-llama2-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/nous-hermes-llama2-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nous-hermes-llama2-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nous-hermes-llama2-7b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/nvidia-nemotron-nano-12b-v2", + "provider": "fireworks-ai", + "model": "nvidia-nemotron-nano-12b-v2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/nvidia-nemotron-nano-12b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nvidia-nemotron-nano-12b-v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nvidia-nemotron-nano-12b-v2", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/nvidia-nemotron-nano-9b-v2", + "provider": "fireworks-ai", + "model": "nvidia-nemotron-nano-9b-v2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/nvidia-nemotron-nano-9b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nvidia-nemotron-nano-9b-v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/nvidia-nemotron-nano-9b-v2", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/openchat-3p5-0106-7b", + "provider": "fireworks-ai", + "model": "openchat-3p5-0106-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/openchat-3p5-0106-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/openchat-3p5-0106-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/openchat-3p5-0106-7b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/openhermes-2-mistral-7b", + "provider": "fireworks-ai", + "model": "openhermes-2-mistral-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/openhermes-2-mistral-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/openhermes-2-mistral-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/openhermes-2-mistral-7b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/openhermes-2p5-mistral-7b", + "provider": "fireworks-ai", + "model": "openhermes-2p5-mistral-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/openhermes-2p5-mistral-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/openhermes-2p5-mistral-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/openhermes-2p5-mistral-7b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/openorca-7b", + "provider": "fireworks-ai", + "model": "openorca-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/openorca-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/openorca-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/openorca-7b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/phi-2-3b", + "provider": "fireworks-ai", + "model": "phi-2-3b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/phi-2-3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2048, + "inputTokens": 2048, + "maxTokens": 2048, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/phi-2-3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/phi-2-3b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/phi-3-mini-128k-instruct", + "provider": "fireworks-ai", + "model": "phi-3-mini-128k-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/phi-3-mini-128k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/phi-3-mini-128k-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/phi-3-mini-128k-instruct", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/phi-3-vision-128k-instruct", + "provider": "fireworks-ai", + "model": "phi-3-vision-128k-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/phi-3-vision-128k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32064, + "inputTokens": 32064, + "maxTokens": 32064, + "outputTokens": 32064, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/phi-3-vision-128k-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/phi-3-vision-128k-instruct", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/phind-code-llama-34b-python-v1", + "provider": "fireworks-ai", + "model": "phind-code-llama-34b-python-v1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/phind-code-llama-34b-python-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/phind-code-llama-34b-python-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/phind-code-llama-34b-python-v1", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/phind-code-llama-34b-v1", + "provider": "fireworks-ai", + "model": "phind-code-llama-34b-v1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/phind-code-llama-34b-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/phind-code-llama-34b-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/phind-code-llama-34b-v1", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/phind-code-llama-34b-v2", + "provider": "fireworks-ai", + "model": "phind-code-llama-34b-v2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/phind-code-llama-34b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/phind-code-llama-34b-v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/phind-code-llama-34b-v2", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/playground-v2-1024px-aesthetic", + "provider": "fireworks-ai", + "model": "playground-v2-1024px-aesthetic", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/playground-v2-1024px-aesthetic" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/playground-v2-1024px-aesthetic", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.00013, + "output": 0.00013 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/playground-v2-1024px-aesthetic", + "mode": "image_generation" + } + ] + }, + { + "id": "fireworks-ai/playground-v2-5-1024px-aesthetic", + "provider": "fireworks-ai", + "model": "playground-v2-5-1024px-aesthetic", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/playground-v2-5-1024px-aesthetic" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/playground-v2-5-1024px-aesthetic", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.00013, + "output": 0.00013 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/playground-v2-5-1024px-aesthetic", + "mode": "image_generation" + } + ] + }, + { + "id": "fireworks-ai/pythia-12b", + "provider": "fireworks-ai", + "model": "pythia-12b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/pythia-12b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2048, + "inputTokens": 2048, + "maxTokens": 2048, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/pythia-12b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/pythia-12b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/rolm-ocr", + "provider": "fireworks-ai", + "model": "rolm-ocr", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/rolm-ocr" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/rolm-ocr", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/rolm-ocr", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/snorkel-mistral-7b-pairrm-dpo", + "provider": "fireworks-ai", + "model": "snorkel-mistral-7b-pairrm-dpo", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/snorkel-mistral-7b-pairrm-dpo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/snorkel-mistral-7b-pairrm-dpo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/snorkel-mistral-7b-pairrm-dpo", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/ssd-1b", + "provider": "fireworks-ai", + "model": "ssd-1b", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/SSD-1B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/SSD-1B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.00013, + "output": 0.00013 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/SSD-1B", + "mode": "image_generation" + } + ] + }, + { + "id": "fireworks-ai/stable-diffusion-xl-1024-v1-0", + "provider": "fireworks-ai", + "model": "stable-diffusion-xl-1024-v1-0", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/stable-diffusion-xl-1024-v1-0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/stable-diffusion-xl-1024-v1-0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.00013, + "output": 0.00013 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/stable-diffusion-xl-1024-v1-0", + "mode": "image_generation" + } + ] + }, + { + "id": "fireworks-ai/stablecode-3b", + "provider": "fireworks-ai", + "model": "stablecode-3b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/stablecode-3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/stablecode-3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/stablecode-3b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/starcoder-16b", + "provider": "fireworks-ai", + "model": "starcoder-16b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/starcoder-16b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/starcoder-16b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/starcoder-16b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/starcoder-7b", + "provider": "fireworks-ai", + "model": "starcoder-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/starcoder-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/starcoder-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/starcoder-7b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/starcoder2-15b", + "provider": "fireworks-ai", + "model": "starcoder2-15b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/starcoder2-15b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/starcoder2-15b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/starcoder2-15b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/starcoder2-3b", + "provider": "fireworks-ai", + "model": "starcoder2-3b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/starcoder2-3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/starcoder2-3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/starcoder2-3b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/starcoder2-7b", + "provider": "fireworks-ai", + "model": "starcoder2-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/starcoder2-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/starcoder2-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/starcoder2-7b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/toppy-m-7b", + "provider": "fireworks-ai", + "model": "toppy-m-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/toppy-m-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/toppy-m-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/toppy-m-7b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/yi-34b", + "provider": "fireworks-ai", + "model": "yi-34b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/yi-34b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/yi-34b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/yi-34b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/yi-34b-200k-capybara", + "provider": "fireworks-ai", + "model": "yi-34b-200k-capybara", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/yi-34b-200k-capybara" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 200000, + "outputTokens": 200000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/yi-34b-200k-capybara", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/yi-34b-200k-capybara", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/yi-34b-chat", + "provider": "fireworks-ai", + "model": "yi-34b-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/yi-34b-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/yi-34b-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/yi-34b-chat", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/yi-6b", + "provider": "fireworks-ai", + "model": "yi-6b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/yi-6b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/yi-6b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/yi-6b", + "mode": "chat" + } + ] + }, + { + "id": "fireworks-ai/yi-large", + "provider": "fireworks-ai", + "model": "yi-large", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/yi-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/yi-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/yi-large", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "fireworks-ai/zephyr-7b-beta", + "provider": "fireworks-ai", + "model": "zephyr-7b-beta", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/zephyr-7b-beta" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/zephyr-7b-beta", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/zephyr-7b-beta", + "mode": "chat" + } + ] + }, + { + "id": "frogbot/zai-glm-5-1", + "provider": "frogbot", + "model": "zai-glm-5-1", + "displayName": "Z.AI GLM-5.1", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "frogbot" + ], + "aliases": [ + "frogbot/zai-glm-5-1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 198000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "frogbot", + "model": "zai-glm-5-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "input": 1.4, + "output": 4.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Z.AI GLM-5.1" + ], + "families": [ + "glm" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-01-20", + "lastUpdated": "2025-02-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "zai-glm-5-1", + "modelKey": "zai-glm-5-1", + "displayName": "Z.AI GLM-5.1", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-02-22", + "openWeights": true, + "releaseDate": "2025-01-20" + } + } + ] + }, + { + "id": "gigachat/embeddings", + "provider": "gigachat", + "model": "embeddings", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "gigachat" + ], + "aliases": [ + "gigachat/Embeddings" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "outputVectorSize": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gigachat", + "model": "gigachat/Embeddings", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gigachat", + "model": "gigachat/Embeddings", + "mode": "embedding" + } + ] + }, + { + "id": "gigachat/embeddings-2", + "provider": "gigachat", + "model": "embeddings-2", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "gigachat" + ], + "aliases": [ + "gigachat/Embeddings-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "outputVectorSize": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gigachat", + "model": "gigachat/Embeddings-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gigachat", + "model": "gigachat/Embeddings-2", + "mode": "embedding" + } + ] + }, + { + "id": "gigachat/embeddingsgigar", + "provider": "gigachat", + "model": "embeddingsgigar", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "gigachat" + ], + "aliases": [ + "gigachat/EmbeddingsGigaR" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "outputVectorSize": 2560, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gigachat", + "model": "gigachat/EmbeddingsGigaR", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gigachat", + "model": "gigachat/EmbeddingsGigaR", + "mode": "embedding" + } + ] + }, + { + "id": "gigachat/gigachat-2-lite", + "provider": "gigachat", + "model": "gigachat-2-lite", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gigachat" + ], + "aliases": [ + "gigachat/GigaChat-2-Lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gigachat", + "model": "gigachat/GigaChat-2-Lite", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gigachat", + "model": "gigachat/GigaChat-2-Lite", + "mode": "chat" + } + ] + }, + { + "id": "gigachat/gigachat-2-max", + "provider": "gigachat", + "model": "gigachat-2-max", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gigachat" + ], + "aliases": [ + "gigachat/GigaChat-2-Max" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gigachat", + "model": "gigachat/GigaChat-2-Max", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gigachat", + "model": "gigachat/GigaChat-2-Max", + "mode": "chat" + } + ] + }, + { + "id": "gigachat/gigachat-2-pro", + "provider": "gigachat", + "model": "gigachat-2-pro", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gigachat" + ], + "aliases": [ + "gigachat/GigaChat-2-Pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gigachat", + "model": "gigachat/GigaChat-2-Pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gigachat", + "model": "gigachat/GigaChat-2-Pro", + "mode": "chat" + } + ] + }, + { + "id": "github-models/ai21-jamba-1.5-large", + "provider": "github-models", + "model": "ai21-jamba-1.5-large", + "displayName": "AI21 Jamba 1.5 Large", + "family": "jamba", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/ai21-labs/ai21-jamba-1.5-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "ai21-labs/ai21-jamba-1.5-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "AI21 Jamba 1.5 Large" + ], + "families": [ + "jamba" + ], + "knowledgeCutoff": "2024-03", + "releaseDate": "2024-08-29", + "lastUpdated": "2024-08-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "ai21-labs/ai21-jamba-1.5-large", + "modelKey": "ai21-labs/ai21-jamba-1.5-large", + "displayName": "AI21 Jamba 1.5 Large", + "family": "jamba", + "metadata": { + "knowledgeCutoff": "2024-03", + "lastUpdated": "2024-08-29", + "openWeights": false, + "releaseDate": "2024-08-29" + } + } + ] + }, + { + "id": "github-models/ai21-jamba-1.5-mini", + "provider": "github-models", + "model": "ai21-jamba-1.5-mini", + "displayName": "AI21 Jamba 1.5 Mini", + "family": "jamba", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/ai21-labs/ai21-jamba-1.5-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "ai21-labs/ai21-jamba-1.5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "AI21 Jamba 1.5 Mini" + ], + "families": [ + "jamba" + ], + "knowledgeCutoff": "2024-03", + "releaseDate": "2024-08-29", + "lastUpdated": "2024-08-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "ai21-labs/ai21-jamba-1.5-mini", + "modelKey": "ai21-labs/ai21-jamba-1.5-mini", + "displayName": "AI21 Jamba 1.5 Mini", + "family": "jamba", + "metadata": { + "knowledgeCutoff": "2024-03", + "lastUpdated": "2024-08-29", + "openWeights": false, + "releaseDate": "2024-08-29" + } + } + ] + }, + { + "id": "github-models/jais-30b-chat", + "provider": "github-models", + "model": "jais-30b-chat", + "displayName": "JAIS 30b Chat", + "family": "jais", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/core42/jais-30b-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "core42/jais-30b-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "JAIS 30b Chat" + ], + "families": [ + "jais" + ], + "knowledgeCutoff": "2023-03", + "releaseDate": "2023-08-30", + "lastUpdated": "2023-08-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "core42/jais-30b-chat", + "modelKey": "core42/jais-30b-chat", + "displayName": "JAIS 30b Chat", + "family": "jais", + "metadata": { + "knowledgeCutoff": "2023-03", + "lastUpdated": "2023-08-30", + "openWeights": true, + "releaseDate": "2023-08-30" + } + } + ] + }, + { + "id": "github-models/mai-ds-r1", + "provider": "github-models", + "model": "mai-ds-r1", + "displayName": "MAI-DS-R1", + "family": "mai", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/microsoft/mai-ds-r1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "microsoft/mai-ds-r1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MAI-DS-R1" + ], + "families": [ + "mai" + ], + "knowledgeCutoff": "2024-06", + "releaseDate": "2025-01-20", + "lastUpdated": "2025-01-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "microsoft/mai-ds-r1", + "modelKey": "microsoft/mai-ds-r1", + "displayName": "MAI-DS-R1", + "family": "mai", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2025-01-20", + "openWeights": false, + "releaseDate": "2025-01-20" + } + } + ] + }, + { + "id": "github-models/phi-3-medium-128k-instruct", + "provider": "github-models", + "model": "phi-3-medium-128k-instruct", + "displayName": "Phi-3-medium instruct (128k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/microsoft/phi-3-medium-128k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "microsoft/phi-3-medium-128k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-medium instruct (128k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "microsoft/phi-3-medium-128k-instruct", + "modelKey": "microsoft/phi-3-medium-128k-instruct", + "displayName": "Phi-3-medium instruct (128k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "github-models/phi-3-medium-4k-instruct", + "provider": "github-models", + "model": "phi-3-medium-4k-instruct", + "displayName": "Phi-3-medium instruct (4k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/microsoft/phi-3-medium-4k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "microsoft/phi-3-medium-4k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-medium instruct (4k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "microsoft/phi-3-medium-4k-instruct", + "modelKey": "microsoft/phi-3-medium-4k-instruct", + "displayName": "Phi-3-medium instruct (4k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "github-models/phi-3-mini-128k-instruct", + "provider": "github-models", + "model": "phi-3-mini-128k-instruct", + "displayName": "Phi-3-mini instruct (128k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/microsoft/phi-3-mini-128k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "microsoft/phi-3-mini-128k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-mini instruct (128k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "microsoft/phi-3-mini-128k-instruct", + "modelKey": "microsoft/phi-3-mini-128k-instruct", + "displayName": "Phi-3-mini instruct (128k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "github-models/phi-3-mini-4k-instruct", + "provider": "github-models", + "model": "phi-3-mini-4k-instruct", + "displayName": "Phi-3-mini instruct (4k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/microsoft/phi-3-mini-4k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "microsoft/phi-3-mini-4k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-mini instruct (4k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "microsoft/phi-3-mini-4k-instruct", + "modelKey": "microsoft/phi-3-mini-4k-instruct", + "displayName": "Phi-3-mini instruct (4k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "github-models/phi-3-small-128k-instruct", + "provider": "github-models", + "model": "phi-3-small-128k-instruct", + "displayName": "Phi-3-small instruct (128k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/microsoft/phi-3-small-128k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "microsoft/phi-3-small-128k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-small instruct (128k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "microsoft/phi-3-small-128k-instruct", + "modelKey": "microsoft/phi-3-small-128k-instruct", + "displayName": "Phi-3-small instruct (128k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "github-models/phi-3-small-8k-instruct", + "provider": "github-models", + "model": "phi-3-small-8k-instruct", + "displayName": "Phi-3-small instruct (8k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/microsoft/phi-3-small-8k-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "microsoft/phi-3-small-8k-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3-small instruct (8k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-04-23", + "lastUpdated": "2024-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "microsoft/phi-3-small-8k-instruct", + "modelKey": "microsoft/phi-3-small-8k-instruct", + "displayName": "Phi-3-small instruct (8k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-04-23", + "openWeights": true, + "releaseDate": "2024-04-23" + } + } + ] + }, + { + "id": "github-models/phi-3.5-mini-instruct", + "provider": "github-models", + "model": "phi-3.5-mini-instruct", + "displayName": "Phi-3.5-mini instruct (128k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/microsoft/phi-3.5-mini-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "microsoft/phi-3.5-mini-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3.5-mini instruct (128k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-08-20", + "lastUpdated": "2024-08-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "microsoft/phi-3.5-mini-instruct", + "modelKey": "microsoft/phi-3.5-mini-instruct", + "displayName": "Phi-3.5-mini instruct (128k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-08-20", + "openWeights": true, + "releaseDate": "2024-08-20" + } + } + ] + }, + { + "id": "github-models/phi-3.5-moe-instruct", + "provider": "github-models", + "model": "phi-3.5-moe-instruct", + "displayName": "Phi-3.5-MoE instruct (128k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/microsoft/phi-3.5-moe-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "microsoft/phi-3.5-moe-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3.5-MoE instruct (128k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-08-20", + "lastUpdated": "2024-08-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "microsoft/phi-3.5-moe-instruct", + "modelKey": "microsoft/phi-3.5-moe-instruct", + "displayName": "Phi-3.5-MoE instruct (128k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-08-20", + "openWeights": true, + "releaseDate": "2024-08-20" + } + } + ] + }, + { + "id": "github-models/phi-3.5-vision-instruct", + "provider": "github-models", + "model": "phi-3.5-vision-instruct", + "displayName": "Phi-3.5-vision instruct (128k)", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/microsoft/phi-3.5-vision-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "microsoft/phi-3.5-vision-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-3.5-vision instruct (128k)" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-08-20", + "lastUpdated": "2024-08-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "microsoft/phi-3.5-vision-instruct", + "modelKey": "microsoft/phi-3.5-vision-instruct", + "displayName": "Phi-3.5-vision instruct (128k)", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-08-20", + "openWeights": true, + "releaseDate": "2024-08-20" + } + } + ] + }, + { + "id": "github-models/phi-4", + "provider": "github-models", + "model": "phi-4", + "displayName": "Phi-4", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/microsoft/phi-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "microsoft/phi-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "microsoft/phi-4", + "modelKey": "microsoft/phi-4", + "displayName": "Phi-4", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "github-models/phi-4-mini-instruct", + "provider": "github-models", + "model": "phi-4-mini-instruct", + "displayName": "Phi-4-mini-instruct", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/microsoft/phi-4-mini-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "microsoft/phi-4-mini-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4-mini-instruct" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "microsoft/phi-4-mini-instruct", + "modelKey": "microsoft/phi-4-mini-instruct", + "displayName": "Phi-4-mini-instruct", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "github-models/phi-4-mini-reasoning", + "provider": "github-models", + "model": "phi-4-mini-reasoning", + "displayName": "Phi-4-mini-reasoning", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/microsoft/phi-4-mini-reasoning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "microsoft/phi-4-mini-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4-mini-reasoning" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "microsoft/phi-4-mini-reasoning", + "modelKey": "microsoft/phi-4-mini-reasoning", + "displayName": "Phi-4-mini-reasoning", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "github-models/phi-4-multimodal-instruct", + "provider": "github-models", + "model": "phi-4-multimodal-instruct", + "displayName": "Phi-4-multimodal-instruct", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/microsoft/phi-4-multimodal-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "microsoft/phi-4-multimodal-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4-multimodal-instruct" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "microsoft/phi-4-multimodal-instruct", + "modelKey": "microsoft/phi-4-multimodal-instruct", + "displayName": "Phi-4-multimodal-instruct", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "github-models/phi-4-reasoning", + "provider": "github-models", + "model": "phi-4-reasoning", + "displayName": "Phi-4-Reasoning", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "github-models" + ], + "aliases": [ + "github-models/microsoft/phi-4-reasoning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "microsoft/phi-4-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4-Reasoning" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "microsoft/phi-4-reasoning", + "modelKey": "microsoft/phi-4-reasoning", + "displayName": "Phi-4-Reasoning", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "gitlab/duo-chat-gpt-5-1", + "provider": "gitlab", + "model": "duo-chat-gpt-5-1", + "displayName": "Agentic Chat (GPT-5.1)", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "gitlab" + ], + "aliases": [ + "gitlab/duo-chat-gpt-5-1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gitlab", + "model": "duo-chat-gpt-5-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agentic Chat (GPT-5.1)" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2026-01-22", + "lastUpdated": "2026-01-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gitlab", + "providerName": "GitLab Duo", + "providerDoc": "https://docs.gitlab.com/user/duo_agent_platform/", + "model": "duo-chat-gpt-5-1", + "modelKey": "duo-chat-gpt-5-1", + "displayName": "Agentic Chat (GPT-5.1)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2026-01-22", + "openWeights": false, + "releaseDate": "2026-01-22" + } + } + ] + }, + { + "id": "gitlab/duo-chat-gpt-5-2", + "provider": "gitlab", + "model": "duo-chat-gpt-5-2", + "displayName": "Agentic Chat (GPT-5.2)", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "gitlab" + ], + "aliases": [ + "gitlab/duo-chat-gpt-5-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gitlab", + "model": "duo-chat-gpt-5-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agentic Chat (GPT-5.2)" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-01-23", + "lastUpdated": "2026-01-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gitlab", + "providerName": "GitLab Duo", + "providerDoc": "https://docs.gitlab.com/user/duo_agent_platform/", + "model": "duo-chat-gpt-5-2", + "modelKey": "duo-chat-gpt-5-2", + "displayName": "Agentic Chat (GPT-5.2)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-01-23", + "openWeights": false, + "releaseDate": "2026-01-23" + } + } + ] + }, + { + "id": "gitlab/duo-chat-gpt-5-2-codex", + "provider": "gitlab", + "model": "duo-chat-gpt-5-2-codex", + "displayName": "Agentic Chat (GPT-5.2 Codex)", + "family": "gpt-codex", + "sources": [ + "models.dev" + ], + "providers": [ + "gitlab" + ], + "aliases": [ + "gitlab/duo-chat-gpt-5-2-codex" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gitlab", + "model": "duo-chat-gpt-5-2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agentic Chat (GPT-5.2 Codex)" + ], + "families": [ + "gpt-codex" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-01-22", + "lastUpdated": "2026-01-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gitlab", + "providerName": "GitLab Duo", + "providerDoc": "https://docs.gitlab.com/user/duo_agent_platform/", + "model": "duo-chat-gpt-5-2-codex", + "modelKey": "duo-chat-gpt-5-2-codex", + "displayName": "Agentic Chat (GPT-5.2 Codex)", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-01-22", + "openWeights": false, + "releaseDate": "2026-01-22" + } + } + ] + }, + { + "id": "gitlab/duo-chat-gpt-5-3-codex", + "provider": "gitlab", + "model": "duo-chat-gpt-5-3-codex", + "displayName": "Agentic Chat (GPT-5.3 Codex)", + "family": "gpt-codex", + "sources": [ + "models.dev" + ], + "providers": [ + "gitlab" + ], + "aliases": [ + "gitlab/duo-chat-gpt-5-3-codex" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gitlab", + "model": "duo-chat-gpt-5-3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agentic Chat (GPT-5.3 Codex)" + ], + "families": [ + "gpt-codex" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-02-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gitlab", + "providerName": "GitLab Duo", + "providerDoc": "https://docs.gitlab.com/user/duo_agent_platform/", + "model": "duo-chat-gpt-5-3-codex", + "modelKey": "duo-chat-gpt-5-3-codex", + "displayName": "Agentic Chat (GPT-5.3 Codex)", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + } + ] + }, + { + "id": "gitlab/duo-chat-gpt-5-4", + "provider": "gitlab", + "model": "duo-chat-gpt-5-4", + "displayName": "Agentic Chat (GPT-5.4)", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "gitlab" + ], + "aliases": [ + "gitlab/duo-chat-gpt-5-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1050000, + "inputTokens": 922000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gitlab", + "model": "duo-chat-gpt-5-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agentic Chat (GPT-5.4)" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-05", + "lastUpdated": "2026-03-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gitlab", + "providerName": "GitLab Duo", + "providerDoc": "https://docs.gitlab.com/user/duo_agent_platform/", + "model": "duo-chat-gpt-5-4", + "modelKey": "duo-chat-gpt-5-4", + "displayName": "Agentic Chat (GPT-5.4)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + } + ] + }, + { + "id": "gitlab/duo-chat-gpt-5-4-mini", + "provider": "gitlab", + "model": "duo-chat-gpt-5-4-mini", + "displayName": "Agentic Chat (GPT-5.4 Mini)", + "family": "gpt-mini", + "sources": [ + "models.dev" + ], + "providers": [ + "gitlab" + ], + "aliases": [ + "gitlab/duo-chat-gpt-5-4-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gitlab", + "model": "duo-chat-gpt-5-4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agentic Chat (GPT-5.4 Mini)" + ], + "families": [ + "gpt-mini" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-17", + "lastUpdated": "2026-03-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gitlab", + "providerName": "GitLab Duo", + "providerDoc": "https://docs.gitlab.com/user/duo_agent_platform/", + "model": "duo-chat-gpt-5-4-mini", + "modelKey": "duo-chat-gpt-5-4-mini", + "displayName": "Agentic Chat (GPT-5.4 Mini)", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + } + ] + }, + { + "id": "gitlab/duo-chat-gpt-5-4-nano", + "provider": "gitlab", + "model": "duo-chat-gpt-5-4-nano", + "displayName": "Agentic Chat (GPT-5.4 Nano)", + "family": "gpt-nano", + "sources": [ + "models.dev" + ], + "providers": [ + "gitlab" + ], + "aliases": [ + "gitlab/duo-chat-gpt-5-4-nano" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gitlab", + "model": "duo-chat-gpt-5-4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agentic Chat (GPT-5.4 Nano)" + ], + "families": [ + "gpt-nano" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-17", + "lastUpdated": "2026-03-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gitlab", + "providerName": "GitLab Duo", + "providerDoc": "https://docs.gitlab.com/user/duo_agent_platform/", + "model": "duo-chat-gpt-5-4-nano", + "modelKey": "duo-chat-gpt-5-4-nano", + "displayName": "Agentic Chat (GPT-5.4 Nano)", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + } + ] + }, + { + "id": "gitlab/duo-chat-gpt-5-5", + "provider": "gitlab", + "model": "duo-chat-gpt-5-5", + "displayName": "Agentic Chat (GPT-5.5)", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "gitlab" + ], + "aliases": [ + "gitlab/duo-chat-gpt-5-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1050000, + "inputTokens": 922000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gitlab", + "model": "duo-chat-gpt-5-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agentic Chat (GPT-5.5)" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-04-23", + "lastUpdated": "2026-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gitlab", + "providerName": "GitLab Duo", + "providerDoc": "https://docs.gitlab.com/user/duo_agent_platform/", + "model": "duo-chat-gpt-5-5", + "modelKey": "duo-chat-gpt-5-5", + "displayName": "Agentic Chat (GPT-5.5)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + } + ] + }, + { + "id": "gitlab/duo-chat-gpt-5-codex", + "provider": "gitlab", + "model": "duo-chat-gpt-5-codex", + "displayName": "Agentic Chat (GPT-5 Codex)", + "family": "gpt-codex", + "sources": [ + "models.dev" + ], + "providers": [ + "gitlab" + ], + "aliases": [ + "gitlab/duo-chat-gpt-5-codex" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gitlab", + "model": "duo-chat-gpt-5-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agentic Chat (GPT-5 Codex)" + ], + "families": [ + "gpt-codex" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2026-01-22", + "lastUpdated": "2026-01-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gitlab", + "providerName": "GitLab Duo", + "providerDoc": "https://docs.gitlab.com/user/duo_agent_platform/", + "model": "duo-chat-gpt-5-codex", + "modelKey": "duo-chat-gpt-5-codex", + "displayName": "Agentic Chat (GPT-5 Codex)", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2026-01-22", + "openWeights": false, + "releaseDate": "2026-01-22" + } + } + ] + }, + { + "id": "gitlab/duo-chat-gpt-5-mini", + "provider": "gitlab", + "model": "duo-chat-gpt-5-mini", + "displayName": "Agentic Chat (GPT-5 Mini)", + "family": "gpt-mini", + "sources": [ + "models.dev" + ], + "providers": [ + "gitlab" + ], + "aliases": [ + "gitlab/duo-chat-gpt-5-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gitlab", + "model": "duo-chat-gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agentic Chat (GPT-5 Mini)" + ], + "families": [ + "gpt-mini" + ], + "knowledgeCutoff": "2024-05-30", + "releaseDate": "2026-01-22", + "lastUpdated": "2026-01-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gitlab", + "providerName": "GitLab Duo", + "providerDoc": "https://docs.gitlab.com/user/duo_agent_platform/", + "model": "duo-chat-gpt-5-mini", + "modelKey": "duo-chat-gpt-5-mini", + "displayName": "Agentic Chat (GPT-5 Mini)", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2026-01-22", + "openWeights": false, + "releaseDate": "2026-01-22" + } + } + ] + }, + { + "id": "gitlab/duo-chat-haiku-4-5", + "provider": "gitlab", + "model": "duo-chat-haiku-4-5", + "displayName": "Agentic Chat (Claude Haiku 4.5)", + "family": "claude-haiku", + "sources": [ + "models.dev" + ], + "providers": [ + "gitlab" + ], + "aliases": [ + "gitlab/duo-chat-haiku-4-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gitlab", + "model": "duo-chat-haiku-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agentic Chat (Claude Haiku 4.5)" + ], + "families": [ + "claude-haiku" + ], + "knowledgeCutoff": "2025-02-28", + "releaseDate": "2026-01-08", + "lastUpdated": "2026-01-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gitlab", + "providerName": "GitLab Duo", + "providerDoc": "https://docs.gitlab.com/user/duo_agent_platform/", + "model": "duo-chat-haiku-4-5", + "modelKey": "duo-chat-haiku-4-5", + "displayName": "Agentic Chat (Claude Haiku 4.5)", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2026-01-08", + "openWeights": false, + "releaseDate": "2026-01-08" + } + } + ] + }, + { + "id": "gitlab/duo-chat-opus-4-5", + "provider": "gitlab", + "model": "duo-chat-opus-4-5", + "displayName": "Agentic Chat (Claude Opus 4.5)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "gitlab" + ], + "aliases": [ + "gitlab/duo-chat-opus-4-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gitlab", + "model": "duo-chat-opus-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agentic Chat (Claude Opus 4.5)" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2026-01-08", + "lastUpdated": "2026-01-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gitlab", + "providerName": "GitLab Duo", + "providerDoc": "https://docs.gitlab.com/user/duo_agent_platform/", + "model": "duo-chat-opus-4-5", + "modelKey": "duo-chat-opus-4-5", + "displayName": "Agentic Chat (Claude Opus 4.5)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2026-01-08", + "openWeights": false, + "releaseDate": "2026-01-08" + } + } + ] + }, + { + "id": "gitlab/duo-chat-opus-4-6", + "provider": "gitlab", + "model": "duo-chat-opus-4-6", + "displayName": "Agentic Chat (Claude Opus 4.6)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "gitlab" + ], + "aliases": [ + "gitlab/duo-chat-opus-4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gitlab", + "model": "duo-chat-opus-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agentic Chat (Claude Opus 4.6)" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-05-31", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-02-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gitlab", + "providerName": "GitLab Duo", + "providerDoc": "https://docs.gitlab.com/user/duo_agent_platform/", + "model": "duo-chat-opus-4-6", + "modelKey": "duo-chat-opus-4-6", + "displayName": "Agentic Chat (Claude Opus 4.6)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + } + ] + }, + { + "id": "gitlab/duo-chat-opus-4-7", + "provider": "gitlab", + "model": "duo-chat-opus-4-7", + "displayName": "Agentic Chat (Claude Opus 4.7)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "gitlab" + ], + "aliases": [ + "gitlab/duo-chat-opus-4-7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gitlab", + "model": "duo-chat-opus-4-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agentic Chat (Claude Opus 4.7)" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gitlab", + "providerName": "GitLab Duo", + "providerDoc": "https://docs.gitlab.com/user/duo_agent_platform/", + "model": "duo-chat-opus-4-7", + "modelKey": "duo-chat-opus-4-7", + "displayName": "Agentic Chat (Claude Opus 4.7)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + } + ] + }, + { + "id": "gitlab/duo-chat-opus-4-8", + "provider": "gitlab", + "model": "duo-chat-opus-4-8", + "displayName": "Agentic Chat (Claude Opus 4.8)", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "gitlab" + ], + "aliases": [ + "gitlab/duo-chat-opus-4-8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gitlab", + "model": "duo-chat-opus-4-8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agentic Chat (Claude Opus 4.8)" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-05-28", + "lastUpdated": "2026-05-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gitlab", + "providerName": "GitLab Duo", + "providerDoc": "https://docs.gitlab.com/user/duo_agent_platform/", + "model": "duo-chat-opus-4-8", + "modelKey": "duo-chat-opus-4-8", + "displayName": "Agentic Chat (Claude Opus 4.8)", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28" + } + } + ] + }, + { + "id": "gitlab/duo-chat-sonnet-4-5", + "provider": "gitlab", + "model": "duo-chat-sonnet-4-5", + "displayName": "Agentic Chat (Claude Sonnet 4.5)", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "gitlab" + ], + "aliases": [ + "gitlab/duo-chat-sonnet-4-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gitlab", + "model": "duo-chat-sonnet-4-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agentic Chat (Claude Sonnet 4.5)" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-07-31", + "releaseDate": "2026-01-08", + "lastUpdated": "2026-01-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gitlab", + "providerName": "GitLab Duo", + "providerDoc": "https://docs.gitlab.com/user/duo_agent_platform/", + "model": "duo-chat-sonnet-4-5", + "modelKey": "duo-chat-sonnet-4-5", + "displayName": "Agentic Chat (Claude Sonnet 4.5)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2026-01-08", + "openWeights": false, + "releaseDate": "2026-01-08" + } + } + ] + }, + { + "id": "gitlab/duo-chat-sonnet-4-6", + "provider": "gitlab", + "model": "duo-chat-sonnet-4-6", + "displayName": "Agentic Chat (Claude Sonnet 4.6)", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "gitlab" + ], + "aliases": [ + "gitlab/duo-chat-sonnet-4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gitlab", + "model": "duo-chat-sonnet-4-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agentic Chat (Claude Sonnet 4.6)" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-17", + "lastUpdated": "2026-02-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gitlab", + "providerName": "GitLab Duo", + "providerDoc": "https://docs.gitlab.com/user/duo_agent_platform/", + "model": "duo-chat-sonnet-4-6", + "modelKey": "duo-chat-sonnet-4-6", + "displayName": "Agentic Chat (Claude Sonnet 4.6)", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-17", + "openWeights": false, + "releaseDate": "2026-02-17" + } + } + ] + }, + { + "id": "google-pse/search", + "provider": "google-pse", + "model": "search", + "mode": "search", + "sources": [ + "litellm" + ], + "providers": [ + "google_pse" + ], + "aliases": [ + "google_pse/search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "google_pse", + "model": "google_pse/search", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perQuery": { + "input": 0.005 + } + } + ] + }, + "metadata": { + "modes": [ + "search" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "google_pse", + "model": "google_pse/search", + "mode": "search" + } + ] + }, + { + "id": "google/deep-research-pro-preview-12-2025", + "provider": "google", + "model": "deep-research-pro-preview-12-2025", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "gemini" + ], + "aliases": [ + "gemini/deep-research-pro-preview-12-2025" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": true, + "imageInput": true, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/deep-research-pro-preview-12-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 12, + "outputImage": 120 + }, + "perImage": { + "input": 0.0011, + "output": 0.134 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "input_cost_per_token_batches": 0.000001, + "output_cost_per_token_batches": 0.000006 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/deep-research-pro-preview-12-2025", + "mode": "image_generation", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + } + ] + }, + { + "id": "google/flan-t5-xl-3b", + "provider": "google", + "model": "flan-t5-xl-3b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/google/flan-t5-xl-3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/google/flan-t5-xl-3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/google/flan-t5-xl-3b", + "mode": "chat" + } + ] + }, + { + "id": "google/gemini-1.5-flash", + "provider": "google", + "model": "gemini-1.5-flash", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "gemini" + ], + "aliases": [ + "gemini/gemini-1.5-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "outputVectorSize": 3072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "multimodal": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-1.5-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.075, + "output": 0 + }, + "extra": { + "input_cost_per_token_above_128k_tokens": 1.5e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "deprecationDate": "2025-09-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-1.5-flash", + "mode": "embedding", + "metadata": { + "deprecationDate": "2025-09-29", + "source": "https://ai.google.dev/gemini-api/docs/embeddings#multimodal" + } + } + ] + }, + { + "id": "google/gemini-2-5-flash", + "provider": "google", + "model": "gemini-2-5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "sources": [ + "models.dev" + ], + "providers": [ + "neon" + ], + "aliases": [ + "neon/gemini-2-5-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "neon", + "model": "gemini-2-5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Flash" + ], + "families": [ + "gemini-flash" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-06-17", + "lastUpdated": "2025-06-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "gemini-2-5-flash", + "modelKey": "gemini-2-5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 0, + "max": 24576 + } + ] + } + } + ] + }, + { + "id": "google/gemini-2-5-pro", + "provider": "google", + "model": "gemini-2-5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "neon" + ], + "aliases": [ + "neon/gemini-2-5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "neon", + "model": "gemini-2-5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 15, + "cache_read": 0.25 + }, + "tiers": [ + { + "input": 2.5, + "output": 15, + "cache_read": 0.25, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Pro" + ], + "families": [ + "gemini-pro" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-06-17", + "lastUpdated": "2025-06-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "gemini-2-5-pro", + "modelKey": "gemini-2-5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 128, + "max": 32768 + } + ] + } + } + ] + }, + { + "id": "google/gemini-2.0-flash", + "provider": "google", + "model": "gemini-2.0-flash", + "displayName": "Gemini 2.0 Flash", + "family": "gemini-flash", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "gemini", + "google", + "llmgateway", + "poe", + "qiniu-ai", + "vercel_ai_gateway", + "vertex_ai-language-models" + ], + "aliases": [ + "gemini/gemini-2.0-flash", + "google/gemini-2.0-flash", + "llmgateway/gemini-2.0-flash", + "poe/google/gemini-2.0-flash", + "qiniu-ai/gemini-2.0-flash", + "vercel_ai_gateway/google/gemini-2.0-flash", + "vertex_ai-language-models/gemini-2.0-flash" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 8192, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "urlContext": true, + "vision": true, + "webSearch": true, + "parallelFunctionCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google", + "model": "gemini-2.0-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gemini-2.0-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "google/gemini-2.0-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.42 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.0-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "inputAudio": 0.7, + "output": 0.4 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/google/gemini-2.0-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-2.0-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "inputAudio": 0.7, + "output": 0.4 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.0 Flash", + "Gemini-2.0-Flash" + ], + "families": [ + "gemini-flash" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-06", + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "deprecationDate": "2026-06-01", + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-2.0-flash", + "modelKey": "gemini-2.0-flash", + "displayName": "Gemini 2.0 Flash", + "family": "gemini-flash", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2024-12-11", + "openWeights": false, + "releaseDate": "2024-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gemini-2.0-flash", + "modelKey": "gemini-2.0-flash", + "displayName": "Gemini 2.0 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2024-12-11", + "openWeights": false, + "releaseDate": "2024-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/gemini-2.0-flash", + "modelKey": "google/gemini-2.0-flash", + "displayName": "Gemini-2.0-Flash", + "family": "gemini-flash", + "metadata": { + "lastUpdated": "2024-12-11", + "openWeights": false, + "releaseDate": "2024-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "gemini-2.0-flash", + "modelKey": "gemini-2.0-flash", + "displayName": "Gemini 2.0 Flash", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.0-flash", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-06-01", + "source": "https://ai.google.dev/pricing#2_0flash" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/google/gemini-2.0-flash", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-06-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-2.0-flash", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-06-01", + "source": "https://ai.google.dev/pricing#2_0flash" + } + } + ] + }, + { + "id": "google/gemini-2.0-flash-001", + "provider": "google", + "model": "gemini-2.0-flash-001", + "displayName": "Google: Gemini 2.0 Flash", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "deepinfra", + "gemini", + "kilo", + "nano-gpt", + "openrouter", + "vertex_ai-language-models" + ], + "aliases": [ + "deepinfra/google/gemini-2.0-flash-001", + "gemini/gemini-2.0-flash-001", + "kilo/google/gemini-2.0-flash-001", + "nano-gpt/gemini-2.0-flash-001", + "openrouter/google/gemini-2.0-flash-001", + "vertex_ai-language-models/gemini-2.0-flash-001" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 1000000, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 1000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "structuredOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "promptCaching": true, + "responseSchema": true, + "systemMessages": true, + "vision": true, + "webSearch": true, + "parallelFunctionCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemini-2.0-flash-001", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 0.083333, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.0-flash-001", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1003, + "output": 0.408 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/google/gemini-2.0-flash-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.0-flash-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "inputAudio": 0.7, + "output": 0.4 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/google/gemini-2.0-flash-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "inputAudio": 0.7, + "output": 0.4 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-2.0-flash-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.0375, + "input": 0.15, + "inputAudio": 1, + "output": 0.6 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.0 Flash", + "Google: Gemini 2.0 Flash" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-12-11", + "lastUpdated": "2026-03-15", + "deprecationDate": "2026-06-01", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemini-2.0-flash-001", + "modelKey": "google/gemini-2.0-flash-001", + "displayName": "Google: Gemini 2.0 Flash", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.0-flash-001", + "modelKey": "gemini-2.0-flash-001", + "displayName": "Gemini 2.0 Flash", + "metadata": { + "lastUpdated": "2024-12-11", + "openWeights": false, + "releaseDate": "2024-12-11" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/google/gemini-2.0-flash-001", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-06-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.0-flash-001", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-06-01", + "source": "https://ai.google.dev/pricing#2_0flash" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/google/gemini-2.0-flash-001", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-06-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-2.0-flash-001", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-06-01", + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + } + ] + }, + { + "id": "google/gemini-2.0-flash-exp-image-generation", + "provider": "google", + "model": "gemini-2.0-flash-exp-image-generation", + "displayName": "Gemini Text + Image", + "mode": "image_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "gemini", + "nano-gpt" + ], + "aliases": [ + "gemini/gemini-2.0-flash-exp-image-generation", + "nano-gpt/gemini-2.0-flash-exp-image-generation" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxImagesPerPrompt": 3000, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": true, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.0-flash-exp-image-generation", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini-2.0-flash-exp-image-generation", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perImage": { + "output": 0.039 + }, + "extra": { + "max_images_per_prompt": 3000 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.0-flash-exp-image-generation", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perImage": { + "output": 0.039 + }, + "extra": { + "max_images_per_prompt": 3000 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini Text + Image" + ], + "modes": [ + "image_generation" + ], + "releaseDate": "2025-02-19", + "lastUpdated": "2025-02-19", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.0-flash-exp-image-generation", + "modelKey": "gemini-2.0-flash-exp-image-generation", + "displayName": "Gemini Text + Image", + "metadata": { + "lastUpdated": "2025-02-19", + "openWeights": false, + "releaseDate": "2025-02-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini-2.0-flash-exp-image-generation", + "mode": "image_generation", + "metadata": { + "source": "https://ai.google.dev/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.0-flash-exp-image-generation", + "mode": "image_generation", + "metadata": { + "source": "https://ai.google.dev/pricing" + } + } + ] + }, + { + "id": "google/gemini-2.0-flash-lite", + "provider": "google", + "model": "gemini-2.0-flash-lite", + "displayName": "Gemini 2.0 Flash-Lite", + "family": "gemini-flash-lite", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "gemini", + "google", + "llmgateway", + "poe", + "qiniu-ai", + "vercel_ai_gateway", + "vertex_ai-language-models" + ], + "aliases": [ + "302ai/gemini-2.0-flash-lite", + "gemini/gemini-2.0-flash-lite", + "google/gemini-2.0-flash-lite", + "llmgateway/gemini-2.0-flash-lite", + "poe/google/gemini-2.0-flash-lite", + "qiniu-ai/gemini-2.0-flash-lite", + "vercel_ai_gateway/google/gemini-2.0-flash-lite", + "vertex_ai-language-models/gemini-2.0-flash-lite" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 2000000, + "inputTokens": 1048576, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 50, + "maxTokens": 8192, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "parallelFunctionCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gemini-2.0-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "google", + "model": "gemini-2.0-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gemini-2.0-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "google/gemini-2.0-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.052, + "output": 0.21 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.0-flash-lite", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.01875, + "input": 0.075, + "inputAudio": 0.075, + "output": 0.3 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/google/gemini-2.0-flash-lite", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-2.0-flash-lite", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.01875, + "input": 0.075, + "inputAudio": 0.075, + "output": 0.3 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.0 Flash Lite", + "Gemini 2.0 Flash-Lite", + "Gemini-2.0-Flash-Lite", + "gemini-2.0-flash-lite" + ], + "families": [ + "gemini-flash-lite" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-11", + "releaseDate": "2025-06-16", + "lastUpdated": "2025-06-16", + "deprecationDate": "2026-06-01", + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gemini-2.0-flash-lite", + "modelKey": "gemini-2.0-flash-lite", + "displayName": "gemini-2.0-flash-lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2025-06-16", + "openWeights": false, + "releaseDate": "2025-06-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-2.0-flash-lite", + "modelKey": "gemini-2.0-flash-lite", + "displayName": "Gemini 2.0 Flash-Lite", + "family": "gemini-flash-lite", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2024-12-11", + "openWeights": false, + "releaseDate": "2024-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gemini-2.0-flash-lite", + "modelKey": "gemini-2.0-flash-lite", + "displayName": "Gemini 2.0 Flash-Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2024-12-11", + "openWeights": false, + "releaseDate": "2024-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/gemini-2.0-flash-lite", + "modelKey": "google/gemini-2.0-flash-lite", + "displayName": "Gemini-2.0-Flash-Lite", + "family": "gemini-flash-lite", + "metadata": { + "lastUpdated": "2025-02-05", + "openWeights": false, + "releaseDate": "2025-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "gemini-2.0-flash-lite", + "modelKey": "gemini-2.0-flash-lite", + "displayName": "Gemini 2.0 Flash Lite", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.0-flash-lite", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-06-01", + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-2.0-flash-lite" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/google/gemini-2.0-flash-lite", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-06-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-2.0-flash-lite", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-06-01", + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#gemini-2.0-flash" + } + } + ] + }, + { + "id": "google/gemini-2.0-flash-lite-001", + "provider": "google", + "model": "gemini-2.0-flash-lite-001", + "displayName": "Google: Gemini 2.0 Flash Lite", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "gemini", + "kilo", + "vertex_ai-language-models" + ], + "aliases": [ + "gemini/gemini-2.0-flash-lite-001", + "kilo/google/gemini-2.0-flash-lite-001", + "vertex_ai-language-models/gemini-2.0-flash-lite-001" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 50, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "parallelFunctionCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemini-2.0-flash-lite-001", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.0-flash-lite-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.01875, + "input": 0.075, + "inputAudio": 0.075, + "output": 0.3 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-2.0-flash-lite-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.01875, + "input": 0.075, + "inputAudio": 0.075, + "output": 0.3 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Google: Gemini 2.0 Flash Lite" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-12-11", + "lastUpdated": "2026-03-15", + "deprecationDate": "2026-06-01", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemini-2.0-flash-lite-001", + "modelKey": "google/gemini-2.0-flash-lite-001", + "displayName": "Google: Gemini 2.0 Flash Lite", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-12-11" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.0-flash-lite-001", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-06-01", + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-2.0-flash-lite" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-2.0-flash-lite-001", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-06-01", + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#gemini-2.0-flash" + } + } + ] + }, + { + "id": "google/gemini-2.0-flash-thinking-exp-01-21", + "provider": "google", + "model": "gemini-2.0-flash-thinking-exp-01-21", + "displayName": "Gemini 2.0 Flash Thinking 0121", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/gemini-2.0-flash-thinking-exp-01-21" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.0-flash-thinking-exp-01-21", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 1.003 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.0 Flash Thinking 0121" + ], + "releaseDate": "2025-01-21", + "lastUpdated": "2025-01-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.0-flash-thinking-exp-01-21", + "modelKey": "gemini-2.0-flash-thinking-exp-01-21", + "displayName": "Gemini 2.0 Flash Thinking 0121", + "metadata": { + "lastUpdated": "2025-01-21", + "openWeights": false, + "releaseDate": "2025-01-21" + } + } + ] + }, + { + "id": "google/gemini-2.0-flash-thinking-exp-1219", + "provider": "google", + "model": "gemini-2.0-flash-thinking-exp-1219", + "displayName": "Gemini 2.0 Flash Thinking 1219", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/gemini-2.0-flash-thinking-exp-1219" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32767, + "inputTokens": 32767, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.0-flash-thinking-exp-1219", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1003, + "output": 0.408 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.0 Flash Thinking 1219" + ], + "releaseDate": "2024-12-19", + "lastUpdated": "2024-12-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.0-flash-thinking-exp-1219", + "modelKey": "gemini-2.0-flash-thinking-exp-1219", + "displayName": "Gemini 2.0 Flash Thinking 1219", + "metadata": { + "lastUpdated": "2024-12-19", + "openWeights": false, + "releaseDate": "2024-12-19" + } + } + ] + }, + { + "id": "google/gemini-2.0-pro-exp-02-05", + "provider": "google", + "model": "gemini-2.0-pro-exp-02-05", + "displayName": "Gemini 2.0 Pro 0205", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/gemini-2.0-pro-exp-02-05" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2097152, + "inputTokens": 2097152, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.0-pro-exp-02-05", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.989, + "output": 7.956 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.0 Pro 0205" + ], + "releaseDate": "2025-02-05", + "lastUpdated": "2025-02-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.0-pro-exp-02-05", + "modelKey": "gemini-2.0-pro-exp-02-05", + "displayName": "Gemini 2.0 Pro 0205", + "metadata": { + "lastUpdated": "2025-02-05", + "openWeights": false, + "releaseDate": "2025-02-05" + } + } + ] + }, + { + "id": "google/gemini-2.0-pro-reasoner", + "provider": "google", + "model": "gemini-2.0-pro-reasoner", + "displayName": "Gemini 2.0 Pro Reasoner", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/gemini-2.0-pro-reasoner" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.0-pro-reasoner", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.292, + "output": 4.998 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.0 Pro Reasoner" + ], + "releaseDate": "2025-02-05", + "lastUpdated": "2025-02-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.0-pro-reasoner", + "modelKey": "gemini-2.0-pro-reasoner", + "displayName": "Gemini 2.0 Pro Reasoner", + "metadata": { + "lastUpdated": "2025-02-05", + "openWeights": false, + "releaseDate": "2025-02-05" + } + } + ] + }, + { + "id": "google/gemini-2.5-computer-use-preview-10-2025", + "provider": "google", + "model": "gemini-2.5-computer-use-preview-10-2025", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gemini", + "vertex_ai-language-models" + ], + "aliases": [ + "gemini/gemini-2.5-computer-use-preview-10-2025", + "vertex_ai-language-models/gemini-2.5-computer-use-preview-10-2025" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxImagesPerPrompt": 3000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "computerUse": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.5-computer-use-preview-10-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.25, + "output": 10 + }, + "extra": { + "input_cost_per_token_above_200k_tokens": 0.0000025, + "max_images_per_prompt": 3000, + "output_cost_per_token_above_200k_tokens": 0.000015 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-computer-use-preview-10-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.25, + "output": 10 + }, + "extra": { + "input_cost_per_token_above_200k_tokens": 0.0000025, + "max_images_per_prompt": 3000, + "output_cost_per_token_above_200k_tokens": 0.000015 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.5-computer-use-preview-10-2025", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/computer-use", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-computer-use-preview-10-2025", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/computer-use" + } + } + ] + }, + { + "id": "google/gemini-2.5-flash", + "provider": "google", + "model": "gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "abacus", + "aihubmix", + "anyapi", + "auriko", + "deepinfra", + "fastrouter", + "frogbot", + "gemini", + "google", + "google-vertex", + "helicone", + "jiekou", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "openrouter", + "orcarouter", + "perplexity-agent", + "poe", + "qihang-ai", + "qiniu-ai", + "replicate", + "requesty", + "sap-ai-core", + "vercel", + "vercel_ai_gateway", + "vertex_ai-language-models", + "zenmux" + ], + "aliases": [ + "302ai/gemini-2.5-flash", + "abacus/gemini-2.5-flash", + "aihubmix/gemini-2.5-flash", + "anyapi/google/gemini-2.5-flash", + "auriko/gemini-2.5-flash", + "deepinfra/google/gemini-2.5-flash", + "fastrouter/google/gemini-2.5-flash", + "frogbot/gemini-2.5-flash", + "gemini/gemini-2.5-flash", + "google-vertex/gemini-2.5-flash", + "google/gemini-2.5-flash", + "helicone/gemini-2.5-flash", + "jiekou/gemini-2.5-flash", + "kilo/google/gemini-2.5-flash", + "llmgateway/gemini-2.5-flash", + "merge-gateway/google/gemini-2.5-flash", + "nano-gpt/gemini-2.5-flash", + "nearai/google/gemini-2.5-flash", + "openrouter/google/gemini-2.5-flash", + "orcarouter/google/gemini-2.5-flash", + "perplexity-agent/google/gemini-2.5-flash", + "poe/google/gemini-2.5-flash", + "qihang-ai/gemini-2.5-flash", + "qiniu-ai/gemini-2.5-flash", + "replicate/google/gemini-2.5-flash", + "requesty/google/gemini-2.5-flash", + "sap-ai-core/gemini-2.5-flash", + "vercel/google/gemini-2.5-flash", + "vercel_ai_gateway/google/gemini-2.5-flash", + "vertex_ai-language-models/gemini-2.5-flash", + "zenmux/google/gemini-2.5-flash" + ], + "mergedProviderModelRecords": 31, + "limits": { + "contextTokens": 1065535, + "inputTokens": 1048756, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 1000000, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 1000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": true, + "webSearch": true, + "promptCaching": true, + "serviceTier": true, + "urlContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "aihubmix", + "model": "gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "auriko", + "model": "gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "google/gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0375, + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "frogbot", + "model": "gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "cacheWrite": 0.383, + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "google", + "model": "gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "cacheWrite": 0.3, + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 2.25 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.083333, + "input": 0.3, + "output": 2.5, + "reasoningOutput": 2.5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "google/gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "google/gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.083333, + "input": 0.3, + "output": 2.5, + "reasoningOutput": 2.5 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "google/gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "google/gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "google/gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.021, + "input": 0.21, + "output": 1.8 + } + }, + { + "source": "models.dev", + "provider": "qihang-ai", + "model": "gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.71 + }, + "tiered": { + "contextOver200K": { + "input": 0.09, + "output": 0.71 + }, + "tiers": [ + { + "input": 0.09, + "output": 0.71, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "google/gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "cacheWrite": 0.55, + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "google/gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "google/gemini-2.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.07, + "cacheWrite": 1, + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/google/gemini-2.5-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "inputAudio": 1, + "output": 2.5, + "reasoningOutput": 2.5 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/google/gemini-2.5-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "inputAudio": 0.7, + "output": 2.5 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/google/gemini-2.5-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/google/gemini-2.5-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "inputAudio": 1, + "output": 2.5, + "reasoningOutput": 2.5 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemini-2.5-flash", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.0833333333333, + "input": 0.3, + "internalReasoning": 2.5, + "output": 2.5 + }, + "other": { + "audio": 0.000001, + "image": 3e-7, + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Flash", + "Gemini-2.5-Flash", + "Google Gemini 2.5 Flash", + "Google: Gemini 2.5 Flash", + "gemini-2.5-flash" + ], + "families": [ + "gemini-flash" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-06-17", + "lastUpdated": "2025-06-17", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 31 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gemini-2.5-flash", + "modelKey": "gemini-2.5-flash", + "displayName": "gemini-2.5-flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gemini-2.5-flash", + "modelKey": "gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-05", + "openWeights": false, + "releaseDate": "2025-03-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "gemini-2.5-flash", + "modelKey": "gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-05", + "openWeights": false, + "releaseDate": "2025-03-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "google/gemini-2.5-flash", + "modelKey": "google/gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "auriko", + "providerName": "Auriko", + "providerApi": "https://api.auriko.ai/v1", + "providerDoc": "https://docs.auriko.ai", + "model": "gemini-2.5-flash", + "modelKey": "gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "google/gemini-2.5-flash", + "modelKey": "google/gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 0, + "max": 24576 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "gemini-2.5-flash", + "modelKey": "gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-07-17", + "openWeights": false, + "releaseDate": "2025-07-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "gemini-2.5-flash", + "modelKey": "gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 0, + "max": 24576 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-2.5-flash", + "modelKey": "gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 0, + "max": 24576 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gemini-2.5-flash", + "modelKey": "gemini-2.5-flash", + "displayName": "Google Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 0, + "max": 24576 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gemini-2.5-flash", + "modelKey": "gemini-2.5-flash", + "displayName": "gemini-2.5-flash", + "family": "gemini-flash", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemini-2.5-flash", + "modelKey": "google/gemini-2.5-flash", + "displayName": "Google: Gemini 2.5 Flash", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-07-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gemini-2.5-flash", + "modelKey": "gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "google/gemini-2.5-flash", + "modelKey": "google/gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.5-flash", + "modelKey": "gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "metadata": { + "lastUpdated": "2025-06-05", + "openWeights": false, + "releaseDate": "2025-06-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "google/gemini-2.5-flash", + "modelKey": "google/gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemini-2.5-flash", + "modelKey": "google/gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 0, + "max": 24576 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "google/gemini-2.5-flash", + "modelKey": "google/gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "google/gemini-2.5-flash", + "modelKey": "google/gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-05", + "openWeights": false, + "releaseDate": "2025-03-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/gemini-2.5-flash", + "modelKey": "google/gemini-2.5-flash", + "displayName": "Gemini-2.5-Flash", + "family": "gemini-flash", + "metadata": { + "lastUpdated": "2025-04-26", + "openWeights": false, + "releaseDate": "2025-04-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qihang-ai", + "providerName": "QiHang", + "providerApi": "https://api.qhaigc.net/v1", + "providerDoc": "https://www.qhaigc.net/docs", + "model": "gemini-2.5-flash", + "modelKey": "gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "gemini-2.5-flash", + "modelKey": "gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "google/gemini-2.5-flash", + "modelKey": "google/gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "gemini-2.5-flash", + "modelKey": "gemini-2.5-flash", + "displayName": "gemini-2.5-flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-05", + "openWeights": false, + "releaseDate": "2025-04-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/gemini-2.5-flash", + "modelKey": "google/gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 0, + "max": 24576 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "google/gemini-2.5-flash", + "modelKey": "google/gemini-2.5-flash", + "displayName": "Gemini 2.5 Flash", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/google/gemini-2.5-flash", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash-preview", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/google/gemini-2.5-flash", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/google/gemini-2.5-flash", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/google/gemini-2.5-flash", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-flash", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash-preview", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemini-2.5-flash", + "displayName": "Google: Gemini 2.5 Flash", + "metadata": { + "canonicalSlug": "google/gemini-2.5-flash", + "createdAt": "2025-06-17T15:01:28.000Z", + "knowledgeCutoff": "2025-01-31", + "links": { + "details": "/api/v1/models/google/gemini-2.5-flash/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 65535, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-image", + "provider": "google", + "model": "gemini-2.5-flash-image", + "displayName": "Nano Banana", + "family": "gemini-flash", + "mode": "image_generation", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "gemini", + "google", + "kilo", + "openrouter", + "qiniu-ai", + "vercel", + "vertex_ai-language-models" + ], + "aliases": [ + "302ai/gemini-2.5-flash-image", + "gemini/gemini-2.5-flash-image", + "google/gemini-2.5-flash-image", + "kilo/google/gemini-2.5-flash-image", + "openrouter/google/gemini-2.5-flash-image", + "qiniu-ai/gemini-2.5-flash-image", + "vercel/google/gemini-2.5-flash-image", + "vertex_ai-language-models/gemini-2.5-flash-image", + "vertex_ai-language-models/vertex_ai/gemini-2.5-flash-image" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 32768, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": true, + "moderation": false, + "promptCaching": true, + "rerank": false, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "transcription": false, + "urlContext": true, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gemini-2.5-flash-image", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "google", + "model": "gemini-2.5-flash-image", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemini-2.5-flash-image", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemini-2.5-flash-image", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.083333, + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "google/gemini-2.5-flash-image", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-image", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "inputAudio": 1, + "output": 2.5, + "outputImage": 30, + "reasoningOutput": 2.5 + }, + "perImage": { + "output": 0.039 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-flash-image", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "inputAudio": 1, + "output": 2.5, + "outputImage": 30, + "reasoningOutput": 2.5 + }, + "perImage": { + "output": 0.039 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "vertex_ai/gemini-2.5-flash-image", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "inputAudio": 1, + "output": 2.5, + "outputImage": 30, + "reasoningOutput": 2.5 + }, + "perImage": { + "output": 0.039 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemini-2.5-flash-image", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.0833333333333, + "input": 0.3, + "internalReasoning": 2.5, + "output": 2.5 + }, + "other": { + "audio": 0.000001, + "image": 3e-7, + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Flash Image", + "Google: Nano Banana (Gemini 2.5 Flash Image)", + "Nano Banana", + "Nano Banana (Gemini 2.5 Flash Image)", + "gemini-2.5-flash-image" + ], + "families": [ + "gemini-flash" + ], + "modes": [ + "image_generation" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-10-08", + "lastUpdated": "2025-10-08", + "supportedParameters": [ + "max_tokens", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gemini-2.5-flash-image", + "modelKey": "gemini-2.5-flash-image", + "displayName": "gemini-2.5-flash-image", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-10-08", + "openWeights": false, + "releaseDate": "2025-10-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-2.5-flash-image", + "modelKey": "gemini-2.5-flash-image", + "displayName": "Nano Banana", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-08-26", + "openWeights": false, + "releaseDate": "2025-08-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemini-2.5-flash-image", + "modelKey": "google/gemini-2.5-flash-image", + "displayName": "Google: Nano Banana (Gemini 2.5 Flash Image)", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-10-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemini-2.5-flash-image", + "modelKey": "google/gemini-2.5-flash-image", + "displayName": "Nano Banana", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-08-26", + "openWeights": false, + "releaseDate": "2025-08-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "gemini-2.5-flash-image", + "modelKey": "gemini-2.5-flash-image", + "displayName": "Gemini 2.5 Flash Image", + "metadata": { + "lastUpdated": "2025-10-22", + "openWeights": false, + "releaseDate": "2025-10-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/gemini-2.5-flash-image", + "modelKey": "google/gemini-2.5-flash-image", + "displayName": "Nano Banana (Gemini 2.5 Flash Image)", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-08-26", + "openWeights": false, + "releaseDate": "2025-03-20" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-image", + "mode": "image_generation", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-2.5-flash-image", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-flash-image", + "mode": "image_generation", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-2.5-flash-image", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "vertex_ai/gemini-2.5-flash-image", + "mode": "image_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/image-generation#edit-an-image", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemini-2.5-flash-image", + "displayName": "Google: Nano Banana (Gemini 2.5 Flash Image)", + "metadata": { + "canonicalSlug": "google/gemini-2.5-flash-image", + "createdAt": "2025-10-07T20:53:51.000Z", + "knowledgeCutoff": "2025-01-31", + "links": { + "details": "/api/v1/models/google/gemini-2.5-flash-image/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": 8192, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-lite", + "provider": "google", + "model": "gemini-2.5-flash-lite", + "displayName": "Gemini 2.5 Flash-Lite", + "family": "gemini-flash-lite", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "anyapi", + "gemini", + "google", + "google-vertex", + "helicone", + "jiekou", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "openrouter", + "orcarouter", + "poe", + "qiniu-ai", + "sap-ai-core", + "vercel", + "vertex_ai-language-models", + "zenmux" + ], + "aliases": [ + "anyapi/google/gemini-2.5-flash-lite", + "gemini/gemini-2.5-flash-lite", + "google-vertex/gemini-2.5-flash-lite", + "google/gemini-2.5-flash-lite", + "helicone/gemini-2.5-flash-lite", + "jiekou/gemini-2.5-flash-lite", + "kilo/google/gemini-2.5-flash-lite", + "llmgateway/gemini-2.5-flash-lite", + "merge-gateway/google/gemini-2.5-flash-lite", + "nano-gpt/gemini-2.5-flash-lite", + "nearai/google/gemini-2.5-flash-lite", + "openrouter/google/gemini-2.5-flash-lite", + "orcarouter/google/gemini-2.5-flash-lite", + "poe/google/gemini-2.5-flash-lite", + "qiniu-ai/gemini-2.5-flash-lite", + "sap-ai-core/gemini-2.5-flash-lite", + "vercel/google/gemini-2.5-flash-lite", + "vertex_ai-language-models/gemini-2.5-flash-lite", + "zenmux/google/gemini-2.5-flash-lite" + ], + "mergedProviderModelRecords": 19, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 65535, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "transcription": false, + "urlContext": true, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex", + "model": "gemini-2.5-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "inputAudio": 0.3, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "google", + "model": "gemini-2.5-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "inputAudio": 0.3, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gemini-2.5-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.024999999999999998, + "cacheWrite": 0.09999999999999999, + "input": 0.09999999999999999, + "output": 0.39999999999999997 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "gemini-2.5-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.36 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemini-2.5-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0.083333, + "input": 0.1, + "output": 0.4, + "reasoningOutput": 0.4 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gemini-2.5-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "inputAudio": 0.3, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "google/gemini-2.5-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "inputAudio": 0.3, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.5-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "google/gemini-2.5-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "inputAudio": 0.3, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemini-2.5-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0.083333, + "input": 0.1, + "output": 0.4, + "reasoningOutput": 0.4 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "google/gemini-2.5-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "inputAudio": 0.3, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "google/gemini-2.5-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "gemini-2.5-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "inputAudio": 0.3, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "google/gemini-2.5-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "google/gemini-2.5-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 1, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-lite", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "inputAudio": 0.3, + "output": 0.4, + "reasoningOutput": 0.4 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-flash-lite", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "inputAudio": 0.3, + "output": 0.4, + "reasoningOutput": 0.4 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemini-2.5-flash-lite", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0.0833333333333, + "input": 0.1, + "internalReasoning": 0.4, + "output": 0.4 + }, + "other": { + "audio": 3e-7, + "image": 1e-7, + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Flash Lite", + "Gemini 2.5 Flash-Lite", + "Gemini-2.5-Flash-Lite", + "Google Gemini 2.5 Flash Lite", + "Google: Gemini 2.5 Flash Lite", + "gemini-2.5-flash-lite" + ], + "families": [ + "gemini-flash-lite" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-06-17", + "lastUpdated": "2025-06-17", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 19 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "google/gemini-2.5-flash-lite", + "modelKey": "google/gemini-2.5-flash-lite", + "displayName": "Gemini 2.5 Flash-Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "gemini-2.5-flash-lite", + "modelKey": "gemini-2.5-flash-lite", + "displayName": "Gemini 2.5 Flash-Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 512, + "max": 24576 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-2.5-flash-lite", + "modelKey": "gemini-2.5-flash-lite", + "displayName": "Gemini 2.5 Flash-Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 512, + "max": 24576 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gemini-2.5-flash-lite", + "modelKey": "gemini-2.5-flash-lite", + "displayName": "Google Gemini 2.5 Flash Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2025-07-22", + "openWeights": false, + "releaseDate": "2025-07-22", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 512, + "max": 24576 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gemini-2.5-flash-lite", + "modelKey": "gemini-2.5-flash-lite", + "displayName": "gemini-2.5-flash-lite", + "family": "gemini-flash-lite", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemini-2.5-flash-lite", + "modelKey": "google/gemini-2.5-flash-lite", + "displayName": "Google: Gemini 2.5 Flash Lite", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gemini-2.5-flash-lite", + "modelKey": "gemini-2.5-flash-lite", + "displayName": "Gemini 2.5 Flash-Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "google/gemini-2.5-flash-lite", + "modelKey": "google/gemini-2.5-flash-lite", + "displayName": "Gemini 2.5 Flash-Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.5-flash-lite", + "modelKey": "gemini-2.5-flash-lite", + "displayName": "Gemini 2.5 Flash Lite", + "metadata": { + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "google/gemini-2.5-flash-lite", + "modelKey": "google/gemini-2.5-flash-lite", + "displayName": "Gemini 2.5 Flash-Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemini-2.5-flash-lite", + "modelKey": "google/gemini-2.5-flash-lite", + "displayName": "Gemini 2.5 Flash-Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 512, + "max": 24576 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "google/gemini-2.5-flash-lite", + "modelKey": "google/gemini-2.5-flash-lite", + "displayName": "Gemini 2.5 Flash-Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/gemini-2.5-flash-lite", + "modelKey": "google/gemini-2.5-flash-lite", + "displayName": "Gemini-2.5-Flash-Lite", + "family": "gemini-flash-lite", + "metadata": { + "lastUpdated": "2025-06-19", + "openWeights": false, + "releaseDate": "2025-06-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "gemini-2.5-flash-lite", + "modelKey": "gemini-2.5-flash-lite", + "displayName": "Gemini 2.5 Flash Lite", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "gemini-2.5-flash-lite", + "modelKey": "gemini-2.5-flash-lite", + "displayName": "gemini-2.5-flash-lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/gemini-2.5-flash-lite", + "modelKey": "google/gemini-2.5-flash-lite", + "displayName": "Gemini 2.5 Flash Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "google/gemini-2.5-flash-lite", + "modelKey": "google/gemini-2.5-flash-lite", + "displayName": "Gemini 2.5 Flash Lite", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-07-22", + "openWeights": false, + "releaseDate": "2025-07-22" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-lite", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash-lite", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-flash-lite", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash-preview", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemini-2.5-flash-lite", + "displayName": "Google: Gemini 2.5 Flash Lite", + "metadata": { + "canonicalSlug": "google/gemini-2.5-flash-lite", + "createdAt": "2025-07-22T16:04:36.000Z", + "knowledgeCutoff": "2025-01-31", + "links": { + "details": "/api/v1/models/google/gemini-2.5-flash-lite/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 65535, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-lite-preview-06-17", + "provider": "google", + "model": "gemini-2.5-flash-lite-preview-06-17", + "displayName": "gemini-2.5-flash-lite-preview-06-17", + "family": "gemini-flash-lite", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "gemini", + "jiekou", + "nano-gpt", + "vertex_ai-language-models" + ], + "aliases": [ + "gemini/gemini-2.5-flash-lite-preview-06-17", + "jiekou/gemini-2.5-flash-lite-preview-06-17", + "nano-gpt/gemini-2.5-flash-lite-preview-06-17", + "vertex_ai-language-models/gemini-2.5-flash-lite-preview-06-17" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 65535, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "urlContext": true, + "vision": true, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "jiekou", + "model": "gemini-2.5-flash-lite-preview-06-17", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.36 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.5-flash-lite-preview-06-17", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-lite-preview-06-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "inputAudio": 0.5, + "output": 0.4, + "reasoningOutput": 0.4 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-flash-lite-preview-06-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "inputAudio": 0.5, + "output": 0.4, + "reasoningOutput": 0.4 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Flash Lite Preview", + "gemini-2.5-flash-lite-preview-06-17" + ], + "families": [ + "gemini-flash-lite" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-01", + "lastUpdated": "2026-01", + "deprecationDate": "2025-11-18", + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gemini-2.5-flash-lite-preview-06-17", + "modelKey": "gemini-2.5-flash-lite-preview-06-17", + "displayName": "gemini-2.5-flash-lite-preview-06-17", + "family": "gemini-flash-lite", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.5-flash-lite-preview-06-17", + "modelKey": "gemini-2.5-flash-lite-preview-06-17", + "displayName": "Gemini 2.5 Flash Lite Preview", + "metadata": { + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-lite-preview-06-17", + "mode": "chat", + "metadata": { + "deprecationDate": "2025-11-18", + "source": "https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash-lite", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-flash-lite-preview-06-17", + "mode": "chat", + "metadata": { + "deprecationDate": "2025-11-18", + "source": "https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash-preview", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-lite-preview-09-2025", + "provider": "google", + "model": "gemini-2.5-flash-lite-preview-09-2025", + "displayName": "gemini-2.5-flash-lite-preview-09-2025", + "family": "gemini-flash-lite", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "gemini", + "jiekou", + "kilo", + "nano-gpt", + "openrouter", + "vertex_ai-language-models" + ], + "aliases": [ + "302ai/gemini-2.5-flash-lite-preview-09-2025", + "gemini/gemini-2.5-flash-lite-preview-09-2025", + "jiekou/gemini-2.5-flash-lite-preview-09-2025", + "kilo/google/gemini-2.5-flash-lite-preview-09-2025", + "nano-gpt/gemini-2.5-flash-lite-preview-09-2025", + "openrouter/google/gemini-2.5-flash-lite-preview-09-2025", + "vertex_ai-language-models/gemini-2.5-flash-lite-preview-09-2025" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 65535, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "urlContext": true, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gemini-2.5-flash-lite-preview-09-2025", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "gemini-2.5-flash-lite-preview-09-2025", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.36 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemini-2.5-flash-lite-preview-09-2025", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0.083333, + "input": 0.1, + "output": 0.4, + "reasoningOutput": 0.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.5-flash-lite-preview-09-2025", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemini-2.5-flash-lite-preview-09-2025", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0.083333, + "input": 0.1, + "output": 0.4, + "reasoningOutput": 0.4 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-lite-preview-09-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "inputAudio": 0.3, + "output": 0.4, + "reasoningOutput": 0.4 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-flash-lite-preview-09-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "inputAudio": 0.3, + "output": 0.4, + "reasoningOutput": 0.4 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemini-2.5-flash-lite-preview-09-2025", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0.0833333333333, + "input": 0.1, + "internalReasoning": 0.4, + "output": 0.4 + }, + "other": { + "audio": 3e-7, + "image": 1e-7, + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Flash Lite Preview (09/2025)", + "Gemini 2.5 Flash Lite Preview 09-2025", + "Google: Gemini 2.5 Flash Lite Preview 09-2025", + "gemini-2.5-flash-lite-preview-09-2025" + ], + "families": [ + "gemini-flash-lite" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-09-26", + "lastUpdated": "2025-09-26", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gemini-2.5-flash-lite-preview-09-2025", + "modelKey": "gemini-2.5-flash-lite-preview-09-2025", + "displayName": "gemini-2.5-flash-lite-preview-09-2025", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-09-26", + "openWeights": false, + "releaseDate": "2025-09-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gemini-2.5-flash-lite-preview-09-2025", + "modelKey": "gemini-2.5-flash-lite-preview-09-2025", + "displayName": "gemini-2.5-flash-lite-preview-09-2025", + "family": "gemini-flash-lite", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemini-2.5-flash-lite-preview-09-2025", + "modelKey": "google/gemini-2.5-flash-lite-preview-09-2025", + "displayName": "Google: Gemini 2.5 Flash Lite Preview 09-2025", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.5-flash-lite-preview-09-2025", + "modelKey": "gemini-2.5-flash-lite-preview-09-2025", + "displayName": "Gemini 2.5 Flash Lite Preview (09/2025)", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemini-2.5-flash-lite-preview-09-2025", + "modelKey": "google/gemini-2.5-flash-lite-preview-09-2025", + "displayName": "Gemini 2.5 Flash Lite Preview 09-2025", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01-31", + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 512, + "max": 24576 + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-lite-preview-09-2025", + "mode": "chat", + "metadata": { + "source": "https://developers.googleblog.com/en/continuing-to-bring-you-our-latest-models-with-an-improved-gemini-2-5-flash-and-flash-lite-release/", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-flash-lite-preview-09-2025", + "mode": "chat", + "metadata": { + "source": "https://developers.googleblog.com/en/continuing-to-bring-you-our-latest-models-with-an-improved-gemini-2-5-flash-and-flash-lite-release/", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemini-2.5-flash-lite-preview-09-2025", + "displayName": "Google: Gemini 2.5 Flash Lite Preview 09-2025", + "metadata": { + "canonicalSlug": "google/gemini-2.5-flash-lite-preview-09-2025", + "createdAt": "2025-09-25T17:01:26.000Z", + "knowledgeCutoff": "2025-01-31", + "links": { + "details": "/api/v1/models/google/gemini-2.5-flash-lite-preview-09-2025/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 65535, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-lite-preview-09-2025-thinking", + "provider": "google", + "model": "gemini-2.5-flash-lite-preview-09-2025-thinking", + "displayName": "Gemini 2.5 Flash Lite Preview (09/2025) – Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/gemini-2.5-flash-lite-preview-09-2025-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.5-flash-lite-preview-09-2025-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Flash Lite Preview (09/2025) – Thinking" + ], + "releaseDate": "2025-09-25", + "lastUpdated": "2025-09-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.5-flash-lite-preview-09-2025-thinking", + "modelKey": "gemini-2.5-flash-lite-preview-09-2025-thinking", + "displayName": "Gemini 2.5 Flash Lite Preview (09/2025) – Thinking", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-native-audio-latest", + "provider": "google", + "model": "gemini-2.5-flash-native-audio-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gemini" + ], + "aliases": [ + "gemini/gemini-2.5-flash-native-audio-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini-2.5-flash-native-audio-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-native-audio-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/realtime" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini-2.5-flash-native-audio-latest", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/pricing", + "supportedEndpoints": [ + "/v1/realtime" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-native-audio-latest", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/pricing", + "supportedEndpoints": [ + "/v1/realtime" + ] + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-native-audio-preview-09-2025", + "provider": "google", + "model": "gemini-2.5-flash-native-audio-preview-09-2025", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gemini" + ], + "aliases": [ + "gemini/gemini-2.5-flash-native-audio-preview-09-2025" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini-2.5-flash-native-audio-preview-09-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-native-audio-preview-09-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/realtime" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini-2.5-flash-native-audio-preview-09-2025", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/pricing", + "supportedEndpoints": [ + "/v1/realtime" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-native-audio-preview-09-2025", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/pricing", + "supportedEndpoints": [ + "/v1/realtime" + ] + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-native-audio-preview-12-2025", + "provider": "google", + "model": "gemini-2.5-flash-native-audio-preview-12-2025", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gemini" + ], + "aliases": [ + "gemini/gemini-2.5-flash-native-audio-preview-12-2025" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini-2.5-flash-native-audio-preview-12-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-native-audio-preview-12-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/realtime" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini-2.5-flash-native-audio-preview-12-2025", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/pricing", + "supportedEndpoints": [ + "/v1/realtime" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-native-audio-preview-12-2025", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/pricing", + "supportedEndpoints": [ + "/v1/realtime" + ] + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-nothink", + "provider": "google", + "model": "gemini-2.5-flash-nothink", + "displayName": "gemini-2.5-flash-nothink", + "family": "gemini-flash", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai" + ], + "aliases": [ + "302ai/gemini-2.5-flash-nothink" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gemini-2.5-flash-nothink", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gemini-2.5-flash-nothink" + ], + "families": [ + "gemini-flash" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-06-24", + "lastUpdated": "2025-06-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gemini-2.5-flash-nothink", + "modelKey": "gemini-2.5-flash-nothink", + "displayName": "gemini-2.5-flash-nothink", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-24", + "openWeights": false, + "releaseDate": "2025-06-24" + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-nothinking", + "provider": "google", + "model": "gemini-2.5-flash-nothinking", + "displayName": "Gemini 2.5 Flash (No Thinking)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/gemini-2.5-flash-nothinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.5-flash-nothinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Flash (No Thinking)" + ], + "releaseDate": "2025-06-05", + "lastUpdated": "2025-06-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.5-flash-nothinking", + "modelKey": "gemini-2.5-flash-nothinking", + "displayName": "Gemini 2.5 Flash (No Thinking)", + "metadata": { + "lastUpdated": "2025-06-05", + "openWeights": false, + "releaseDate": "2025-06-05" + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-preview-04-17", + "provider": "google", + "model": "gemini-2.5-flash-preview-04-17", + "displayName": "Gemini 2.5 Flash Preview", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/gemini-2.5-flash-preview-04-17" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.5-flash-preview-04-17", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Flash Preview" + ], + "releaseDate": "2025-04-17", + "lastUpdated": "2025-04-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.5-flash-preview-04-17", + "modelKey": "gemini-2.5-flash-preview-04-17", + "displayName": "Gemini 2.5 Flash Preview", + "metadata": { + "lastUpdated": "2025-04-17", + "openWeights": false, + "releaseDate": "2025-04-17" + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-preview-04-17:thinking", + "provider": "google", + "model": "gemini-2.5-flash-preview-04-17:thinking", + "displayName": "Gemini 2.5 Flash Preview Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/gemini-2.5-flash-preview-04-17:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.5-flash-preview-04-17:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 3.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Flash Preview Thinking" + ], + "releaseDate": "2025-04-17", + "lastUpdated": "2025-04-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.5-flash-preview-04-17:thinking", + "modelKey": "gemini-2.5-flash-preview-04-17:thinking", + "displayName": "Gemini 2.5 Flash Preview Thinking", + "metadata": { + "lastUpdated": "2025-04-17", + "openWeights": false, + "releaseDate": "2025-04-17" + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-preview-05-20", + "provider": "google", + "model": "gemini-2.5-flash-preview-05-20", + "displayName": "gemini-2.5-flash-preview-05-20", + "family": "gemini-flash", + "sources": [ + "models.dev" + ], + "providers": [ + "jiekou", + "nano-gpt" + ], + "aliases": [ + "jiekou/gemini-2.5-flash-preview-05-20", + "nano-gpt/gemini-2.5-flash-preview-05-20" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048000, + "outputTokens": 200000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "jiekou", + "model": "gemini-2.5-flash-preview-05-20", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.135, + "output": 3.15 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.5-flash-preview-05-20", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Flash 0520", + "gemini-2.5-flash-preview-05-20" + ], + "families": [ + "gemini-flash" + ], + "releaseDate": "2026-01", + "lastUpdated": "2026-01", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gemini-2.5-flash-preview-05-20", + "modelKey": "gemini-2.5-flash-preview-05-20", + "displayName": "gemini-2.5-flash-preview-05-20", + "family": "gemini-flash", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.5-flash-preview-05-20", + "modelKey": "gemini-2.5-flash-preview-05-20", + "displayName": "Gemini 2.5 Flash 0520", + "metadata": { + "lastUpdated": "2025-05-20", + "openWeights": false, + "releaseDate": "2025-05-20" + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-preview-05-20:thinking", + "provider": "google", + "model": "gemini-2.5-flash-preview-05-20:thinking", + "displayName": "Gemini 2.5 Flash 0520 Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/gemini-2.5-flash-preview-05-20:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048000, + "inputTokens": 1048000, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.5-flash-preview-05-20:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 3.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Flash 0520 Thinking" + ], + "releaseDate": "2025-05-20", + "lastUpdated": "2025-05-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.5-flash-preview-05-20:thinking", + "modelKey": "gemini-2.5-flash-preview-05-20:thinking", + "displayName": "Gemini 2.5 Flash 0520 Thinking", + "metadata": { + "lastUpdated": "2025-05-20", + "openWeights": false, + "releaseDate": "2025-05-20" + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-preview-09-2025", + "provider": "google", + "model": "gemini-2.5-flash-preview-09-2025", + "displayName": "gemini-2.5-flash-preview-09-2025", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "gemini", + "nano-gpt", + "vertex_ai-language-models" + ], + "aliases": [ + "302ai/gemini-2.5-flash-preview-09-2025", + "gemini/gemini-2.5-flash-preview-09-2025", + "nano-gpt/gemini-2.5-flash-preview-09-2025", + "vertex_ai-language-models/gemini-2.5-flash-preview-09-2025" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 65535, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "urlContext": true, + "vision": true, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gemini-2.5-flash-preview-09-2025", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.5-flash-preview-09-2025", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-preview-09-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3, + "inputAudio": 1, + "output": 2.5, + "reasoningOutput": 2.5 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-flash-preview-09-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3, + "inputAudio": 1, + "output": 2.5, + "reasoningOutput": 2.5 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Flash Preview (09/2025)", + "gemini-2.5-flash-preview-09-2025" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-09-26", + "lastUpdated": "2025-09-26", + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gemini-2.5-flash-preview-09-2025", + "modelKey": "gemini-2.5-flash-preview-09-2025", + "displayName": "gemini-2.5-flash-preview-09-2025", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-09-26", + "openWeights": false, + "releaseDate": "2025-09-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.5-flash-preview-09-2025", + "modelKey": "gemini-2.5-flash-preview-09-2025", + "displayName": "Gemini 2.5 Flash Preview (09/2025)", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-preview-09-2025", + "mode": "chat", + "metadata": { + "source": "https://developers.googleblog.com/en/continuing-to-bring-you-our-latest-models-with-an-improved-gemini-2-5-flash-and-flash-lite-release/", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-flash-preview-09-2025", + "mode": "chat", + "metadata": { + "source": "https://developers.googleblog.com/en/continuing-to-bring-you-our-latest-models-with-an-improved-gemini-2-5-flash-and-flash-lite-release/", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-preview-09-2025-thinking", + "provider": "google", + "model": "gemini-2.5-flash-preview-09-2025-thinking", + "displayName": "Gemini 2.5 Flash Preview (09/2025) – Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/gemini-2.5-flash-preview-09-2025-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.5-flash-preview-09-2025-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Flash Preview (09/2025) – Thinking" + ], + "releaseDate": "2025-09-25", + "lastUpdated": "2025-09-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.5-flash-preview-09-2025-thinking", + "modelKey": "gemini-2.5-flash-preview-09-2025-thinking", + "displayName": "Gemini 2.5 Flash Preview (09/2025) – Thinking", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-preview-tts", + "provider": "google", + "model": "gemini-2.5-flash-preview-tts", + "displayName": "Gemini 2.5 Flash Preview TTS", + "family": "gemini-flash", + "mode": "audio_speech", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "gemini", + "google" + ], + "aliases": [ + "gemini/gemini-2.5-flash-preview-tts", + "google/gemini-2.5-flash-preview-tts" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 8192, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google", + "model": "gemini-2.5-flash-preview-tts", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini-2.5-flash-preview-tts", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-preview-tts", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Flash Preview TTS" + ], + "families": [ + "gemini-flash" + ], + "modes": [ + "audio_speech" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-05-01", + "lastUpdated": "2025-05-01", + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-2.5-flash-preview-tts", + "modelKey": "gemini-2.5-flash-preview-tts", + "displayName": "Gemini 2.5 Flash Preview TTS", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-05-01", + "openWeights": false, + "releaseDate": "2025-05-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini-2.5-flash-preview-tts", + "mode": "audio_speech", + "metadata": { + "source": "https://ai.google.dev/pricing", + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.5-flash-preview-tts", + "mode": "audio_speech", + "metadata": { + "source": "https://ai.google.dev/pricing", + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-tts", + "provider": "google", + "model": "gemini-2.5-flash-tts", + "displayName": "Gemini 2.5 Flash TTS", + "family": "gemini-flash", + "sources": [ + "models.dev" + ], + "providers": [ + "google-vertex" + ], + "aliases": [ + "google-vertex/gemini-2.5-flash-tts" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex", + "model": "gemini-2.5-flash-tts", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Flash TTS" + ], + "families": [ + "gemini-flash" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-09-30", + "lastUpdated": "2025-12-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "gemini-2.5-flash-tts", + "modelKey": "gemini-2.5-flash-tts", + "displayName": "Gemini 2.5 Flash TTS", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-10", + "openWeights": false, + "releaseDate": "2025-09-30" + } + } + ] + }, + { + "id": "google/gemini-2.5-pro", + "provider": "google", + "model": "gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "abacus", + "aihubmix", + "anyapi", + "auriko", + "cortecs", + "deepinfra", + "fastrouter", + "frogbot", + "gemini", + "github-copilot", + "github_copilot", + "google", + "google-vertex", + "helicone", + "jiekou", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "openrouter", + "orcarouter", + "perplexity-agent", + "poe", + "qiniu-ai", + "requesty", + "sap-ai-core", + "vercel", + "vercel_ai_gateway", + "vertex_ai-language-models", + "zenmux" + ], + "aliases": [ + "302ai/gemini-2.5-pro", + "abacus/gemini-2.5-pro", + "aihubmix/gemini-2.5-pro", + "anyapi/google/gemini-2.5-pro", + "auriko/gemini-2.5-pro", + "cortecs/gemini-2.5-pro", + "deepinfra/google/gemini-2.5-pro", + "fastrouter/google/gemini-2.5-pro", + "frogbot/gemini-2.5-pro", + "gemini/gemini-2.5-pro", + "github-copilot/gemini-2.5-pro", + "github_copilot/gemini-2.5-pro", + "google-vertex/gemini-2.5-pro", + "google/gemini-2.5-pro", + "helicone/gemini-2.5-pro", + "jiekou/gemini-2.5-pro", + "kilo/google/gemini-2.5-pro", + "llmgateway/gemini-2.5-pro", + "merge-gateway/google/gemini-2.5-pro", + "nano-gpt/gemini-2.5-pro", + "nearai/google/gemini-2.5-pro", + "openrouter/google/gemini-2.5-pro", + "orcarouter/google/gemini-2.5-pro", + "perplexity-agent/google/gemini-2.5-pro", + "poe/google/gemini-2.5-pro", + "qiniu-ai/gemini-2.5-pro", + "requesty/google/gemini-2.5-pro", + "sap-ai-core/gemini-2.5-pro", + "vercel/google/gemini-2.5-pro", + "vercel_ai_gateway/google/gemini-2.5-pro", + "vertex_ai-language-models/gemini-2.5-pro", + "zenmux/google/gemini-2.5-pro" + ], + "mergedProviderModelRecords": 32, + "limits": { + "contextTokens": 1065535, + "inputTokens": 1048756, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 1000000, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 1000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": true, + "webSearch": true, + "promptCaching": true, + "serviceTier": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "aihubmix", + "model": "gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 15, + "cache_read": 0.25 + }, + "tiers": [ + { + "input": 2.5, + "output": 15, + "cache_read": 0.25, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "auriko", + "model": "gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 15, + "cache_read": 0.25 + }, + "tiers": [ + { + "input": 2.5, + "output": 15, + "cache_read": 0.25, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.654, + "output": 11.024 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "google/gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.31, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "frogbot", + "model": "gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.31, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "github-copilot", + "model": "gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 15, + "cache_read": 0.25 + }, + "tiers": [ + { + "input": 2.5, + "output": 15, + "cache_read": 0.25, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 15, + "cache_read": 0.25 + }, + "tiers": [ + { + "input": 2.5, + "output": 15, + "cache_read": 0.25, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "google", + "model": "gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 15, + "cache_read": 0.25 + }, + "tiers": [ + { + "input": 2.5, + "output": 15, + "cache_read": 0.25, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3125, + "cacheWrite": 1.25, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.125, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "cacheWrite": 0.375, + "input": 1.25, + "output": 10, + "reasoningOutput": 10 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 15, + "cache_read": 0.25 + }, + "tiers": [ + { + "input": 2.5, + "output": 15, + "cache_read": 0.25, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "google/gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 15, + "cache_read": 0.25 + }, + "tiers": [ + { + "input": 2.5, + "output": 15, + "cache_read": 0.25, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "google/gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 15, + "cache_read": 0.25 + }, + "tiers": [ + { + "input": 2.5, + "output": 15, + "cache_read": 0.25, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "cacheWrite": 0.375, + "input": 1.25, + "output": 10, + "reasoningOutput": 10 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "google/gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 2.5, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 15, + "cache_read": 0.25 + }, + "tiers": [ + { + "input": 2.5, + "output": 15, + "cache_read": 0.25, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "google/gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 15, + "cache_read": 0.25 + }, + "tiers": [ + { + "input": 2.5, + "output": 15, + "cache_read": 0.25, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "google/gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.087, + "input": 0.87, + "output": 7 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "google/gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.31, + "cacheWrite": 2.375, + "input": 1.25, + "output": 10 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 15, + "cache_read": 0.25 + }, + "tiers": [ + { + "input": 2.5, + "output": 15, + "cache_read": 0.25, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "google/gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 15, + "cache_read": 0.25 + }, + "tiers": [ + { + "input": 2.5, + "output": 15, + "cache_read": 0.25, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "google/gemini-2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.31, + "cacheWrite": 4.5, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/google/gemini-2.5-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.5-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 2.5e-7, + "input_cost_per_token_above_200k_tokens": 0.0000025, + "input_cost_per_token_priority": 0.00000125, + "input_cost_per_token_above_200k_tokens_priority": 0.0000025, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_200k_tokens": 0.000015, + "output_cost_per_token_priority": 0.00001, + "output_cost_per_token_above_200k_tokens_priority": 0.000015 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gemini-2.5-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/google/gemini-2.5-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.25, + "inputAudio": 0.7, + "output": 10 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/google/gemini-2.5-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 2.5e-7, + "cache_creation_input_token_cost_above_200k_tokens": 2.5e-7, + "input_cost_per_token_above_200k_tokens": 0.0000025, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_200k_tokens": 0.000015 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemini-2.5-pro", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "cacheWrite": 0.375, + "input": 1.25, + "internalReasoning": 10, + "output": 10 + }, + "other": { + "audio": 0.00000125, + "image": 0.00000125, + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Pro", + "Gemini-2.5-Pro", + "Google Gemini 2.5 Pro", + "Google: Gemini 2.5 Pro", + "gemini-2.5-pro" + ], + "families": [ + "gemini-pro" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-06-17", + "lastUpdated": "2025-06-17", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 32 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gemini-2.5-pro", + "modelKey": "gemini-2.5-pro", + "displayName": "gemini-2.5-pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gemini-2.5-pro", + "modelKey": "gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-03-25", + "openWeights": false, + "releaseDate": "2025-03-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "gemini-2.5-pro", + "modelKey": "gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-05", + "openWeights": false, + "releaseDate": "2025-03-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "google/gemini-2.5-pro", + "modelKey": "google/gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "auriko", + "providerName": "Auriko", + "providerApi": "https://api.auriko.ai/v1", + "providerDoc": "https://docs.auriko.ai", + "model": "gemini-2.5-pro", + "modelKey": "gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "gemini-2.5-pro", + "modelKey": "gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-03-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "google/gemini-2.5-pro", + "modelKey": "google/gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 128, + "max": 32768 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "gemini-2.5-pro", + "modelKey": "gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-05", + "openWeights": false, + "releaseDate": "2025-03-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "gemini-2.5-pro", + "modelKey": "gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 128, + "max": 32768 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "gemini-2.5-pro", + "modelKey": "gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 128, + "max": 32768 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-2.5-pro", + "modelKey": "gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 128, + "max": 32768 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gemini-2.5-pro", + "modelKey": "gemini-2.5-pro", + "displayName": "Google Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 128, + "max": 32768 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gemini-2.5-pro", + "modelKey": "gemini-2.5-pro", + "displayName": "gemini-2.5-pro", + "family": "gemini-pro", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemini-2.5-pro", + "modelKey": "google/gemini-2.5-pro", + "displayName": "Google: Gemini 2.5 Pro", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-03-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gemini-2.5-pro", + "modelKey": "gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "google/gemini-2.5-pro", + "modelKey": "google/gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.5-pro", + "modelKey": "gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "metadata": { + "lastUpdated": "2025-06-05", + "openWeights": false, + "releaseDate": "2025-06-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "google/gemini-2.5-pro", + "modelKey": "google/gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemini-2.5-pro", + "modelKey": "google/gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 128, + "max": 32768 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "google/gemini-2.5-pro", + "modelKey": "google/gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "google/gemini-2.5-pro", + "modelKey": "google/gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-05", + "openWeights": false, + "releaseDate": "2025-03-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/gemini-2.5-pro", + "modelKey": "google/gemini-2.5-pro", + "displayName": "Gemini-2.5-Pro", + "family": "gemini-pro", + "metadata": { + "lastUpdated": "2025-02-05", + "openWeights": false, + "releaseDate": "2025-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "gemini-2.5-pro", + "modelKey": "gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "google/gemini-2.5-pro", + "modelKey": "google/gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "gemini-2.5-pro", + "modelKey": "gemini-2.5-pro", + "displayName": "gemini-2.5-pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-05", + "openWeights": false, + "releaseDate": "2025-03-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/gemini-2.5-pro", + "modelKey": "google/gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 128, + "max": 32768 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "google/gemini-2.5-pro", + "modelKey": "google/gemini-2.5-pro", + "displayName": "Gemini 2.5 Pro", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/google/gemini-2.5-pro", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.5-pro", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gemini-2.5-pro", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/google/gemini-2.5-pro", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/google/gemini-2.5-pro", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-pro", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemini-2.5-pro", + "displayName": "Google: Gemini 2.5 Pro", + "metadata": { + "canonicalSlug": "google/gemini-2.5-pro", + "createdAt": "2025-06-17T14:12:24.000Z", + "knowledgeCutoff": "2025-01-31", + "links": { + "details": "/api/v1/models/google/gemini-2.5-pro/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-2.5-pro-exp-03-25", + "provider": "google", + "model": "gemini-2.5-pro-exp-03-25", + "displayName": "Gemini 2.5 Pro Experimental 0325", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/gemini-2.5-pro-exp-03-25" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.5-pro-exp-03-25", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Pro Experimental 0325" + ], + "releaseDate": "2025-03-25", + "lastUpdated": "2025-03-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.5-pro-exp-03-25", + "modelKey": "gemini-2.5-pro-exp-03-25", + "displayName": "Gemini 2.5 Pro Experimental 0325", + "metadata": { + "lastUpdated": "2025-03-25", + "openWeights": false, + "releaseDate": "2025-03-25" + } + } + ] + }, + { + "id": "google/gemini-2.5-pro-preview", + "provider": "google", + "model": "gemini-2.5-pro-preview", + "displayName": "Google: Gemini 2.5 Pro Preview 06-05", + "family": "gemini", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/google/gemini-2.5-pro-preview", + "openrouter/google/gemini-2.5-pro-preview" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1048576, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemini-2.5-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "cacheWrite": 0.375, + "input": 1.25, + "output": 10, + "reasoningOutput": 10 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemini-2.5-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "cacheWrite": 0.375, + "input": 1.25, + "output": 10, + "reasoningOutput": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemini-2.5-pro-preview", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "cacheWrite": 0.375, + "input": 1.25, + "internalReasoning": 10, + "output": 10 + }, + "other": { + "audio": 0.00000125, + "image": 0.00000125, + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Pro Preview 06-05", + "Google: Gemini 2.5 Pro Preview 06-05" + ], + "families": [ + "gemini" + ], + "knowledgeCutoff": "2025-01-31", + "releaseDate": "2025-06-05", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemini-2.5-pro-preview", + "modelKey": "google/gemini-2.5-pro-preview", + "displayName": "Google: Gemini 2.5 Pro Preview 06-05", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-06-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemini-2.5-pro-preview", + "modelKey": "google/gemini-2.5-pro-preview", + "displayName": "Gemini 2.5 Pro Preview 06-05", + "family": "gemini", + "metadata": { + "knowledgeCutoff": "2025-01-31", + "lastUpdated": "2025-06-05", + "openWeights": false, + "releaseDate": "2025-06-05", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 128, + "max": 32768 + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemini-2.5-pro-preview", + "displayName": "Google: Gemini 2.5 Pro Preview 06-05", + "metadata": { + "canonicalSlug": "google/gemini-2.5-pro-preview-06-05", + "createdAt": "2025-06-05T15:27:37.000Z", + "knowledgeCutoff": "2025-01-31", + "links": { + "details": "/api/v1/models/google/gemini-2.5-pro-preview-06-05/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-2.5-pro-preview-03-25", + "provider": "google", + "model": "gemini-2.5-pro-preview-03-25", + "displayName": "Gemini 2.5 Pro Preview 0325", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/gemini-2.5-pro-preview-03-25" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.5-pro-preview-03-25", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Pro Preview 0325" + ], + "releaseDate": "2025-03-25", + "lastUpdated": "2025-03-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.5-pro-preview-03-25", + "modelKey": "gemini-2.5-pro-preview-03-25", + "displayName": "Gemini 2.5 Pro Preview 0325", + "metadata": { + "lastUpdated": "2025-03-25", + "openWeights": false, + "releaseDate": "2025-03-25" + } + } + ] + }, + { + "id": "google/gemini-2.5-pro-preview-05-06", + "provider": "google", + "model": "gemini-2.5-pro-preview-05-06", + "displayName": "Google: Gemini 2.5 Pro Preview 05-06", + "family": "gemini-pro", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "kilo/google/gemini-2.5-pro-preview-05-06", + "nano-gpt/gemini-2.5-pro-preview-05-06", + "openrouter/google/gemini-2.5-pro-preview-05-06" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemini-2.5-pro-preview-05-06", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "cacheWrite": 0.375, + "input": 1.25, + "output": 10, + "reasoningOutput": 10 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.5-pro-preview-05-06", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemini-2.5-pro-preview-05-06", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "cacheWrite": 0.375, + "input": 1.25, + "output": 10, + "reasoningOutput": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemini-2.5-pro-preview-05-06", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "cacheWrite": 0.375, + "input": 1.25, + "internalReasoning": 10, + "output": 10 + }, + "other": { + "audio": 0.00000125, + "image": 0.00000125, + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Pro Preview 05-06", + "Gemini 2.5 Pro Preview 0506", + "Google: Gemini 2.5 Pro Preview 05-06" + ], + "families": [ + "gemini-pro" + ], + "knowledgeCutoff": "2025-01-31", + "releaseDate": "2025-05-06", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemini-2.5-pro-preview-05-06", + "modelKey": "google/gemini-2.5-pro-preview-05-06", + "displayName": "Google: Gemini 2.5 Pro Preview 05-06", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-05-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.5-pro-preview-05-06", + "modelKey": "gemini-2.5-pro-preview-05-06", + "displayName": "Gemini 2.5 Pro Preview 0506", + "metadata": { + "lastUpdated": "2025-05-06", + "openWeights": false, + "releaseDate": "2025-05-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemini-2.5-pro-preview-05-06", + "modelKey": "google/gemini-2.5-pro-preview-05-06", + "displayName": "Gemini 2.5 Pro Preview 05-06", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01-31", + "lastUpdated": "2025-05-07", + "openWeights": false, + "releaseDate": "2025-05-07", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 128, + "max": 32768 + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemini-2.5-pro-preview-05-06", + "displayName": "Google: Gemini 2.5 Pro Preview 05-06", + "metadata": { + "canonicalSlug": "google/gemini-2.5-pro-preview-03-25", + "createdAt": "2025-05-07T00:41:53.000Z", + "knowledgeCutoff": "2025-01-31", + "links": { + "details": "/api/v1/models/google/gemini-2.5-pro-preview-03-25/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 65535, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-2.5-pro-preview-06-05", + "provider": "google", + "model": "gemini-2.5-pro-preview-06-05", + "displayName": "gemini-2.5-pro-preview-06-05", + "family": "gemini-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "jiekou", + "nano-gpt" + ], + "aliases": [ + "jiekou/gemini-2.5-pro-preview-06-05", + "nano-gpt/gemini-2.5-pro-preview-06-05" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "outputTokens": 200000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "jiekou", + "model": "gemini-2.5-pro-preview-06-05", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.125, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-2.5-pro-preview-06-05", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Pro Preview 0605", + "gemini-2.5-pro-preview-06-05" + ], + "families": [ + "gemini-pro" + ], + "releaseDate": "2026-01", + "lastUpdated": "2026-01", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gemini-2.5-pro-preview-06-05", + "modelKey": "gemini-2.5-pro-preview-06-05", + "displayName": "gemini-2.5-pro-preview-06-05", + "family": "gemini-pro", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-2.5-pro-preview-06-05", + "modelKey": "gemini-2.5-pro-preview-06-05", + "displayName": "Gemini 2.5 Pro Preview 0605", + "metadata": { + "lastUpdated": "2025-06-05", + "openWeights": false, + "releaseDate": "2025-06-05" + } + } + ] + }, + { + "id": "google/gemini-2.5-pro-preview-tts", + "provider": "google", + "model": "gemini-2.5-pro-preview-tts", + "displayName": "Gemini 2.5 Pro Preview TTS", + "family": "gemini-flash", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "gemini", + "google", + "vertex_ai-language-models" + ], + "aliases": [ + "gemini/gemini-2.5-pro-preview-tts", + "google/gemini-2.5-pro-preview-tts", + "vertex_ai-language-models/gemini-2.5-pro-preview-tts" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 65535, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65535, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "parallelFunctionCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google", + "model": "gemini-2.5-pro-preview-tts", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 20 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-2.5-pro-preview-tts", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "inputAudio": 0.7, + "output": 10 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 2.5e-7, + "input_cost_per_token_above_200k_tokens": 0.0000025, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_200k_tokens": 0.000015 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-pro-preview-tts", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "inputAudio": 0.7, + "output": 10 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 2.5e-7, + "input_cost_per_token_above_200k_tokens": 0.0000025, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_200k_tokens": 0.000015 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Pro Preview TTS" + ], + "families": [ + "gemini-flash" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-05-01", + "lastUpdated": "2025-05-01", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-2.5-pro-preview-tts", + "modelKey": "gemini-2.5-pro-preview-tts", + "displayName": "Gemini 2.5 Pro Preview TTS", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-05-01", + "openWeights": false, + "releaseDate": "2025-05-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-2.5-pro-preview-tts", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-2.5-pro-preview" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-2.5-pro-preview-tts", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-2.5-pro-preview" + } + } + ] + }, + { + "id": "google/gemini-2.5-pro-tts", + "provider": "google", + "model": "gemini-2.5-pro-tts", + "displayName": "Gemini 2.5 Pro TTS", + "family": "gemini-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "google-vertex" + ], + "aliases": [ + "google-vertex/gemini-2.5-pro-tts" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex", + "model": "gemini-2.5-pro-tts", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 20 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.5 Pro TTS" + ], + "families": [ + "gemini-pro" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-09-30", + "lastUpdated": "2025-12-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "gemini-2.5-pro-tts", + "modelKey": "gemini-2.5-pro-tts", + "displayName": "Gemini 2.5 Pro TTS", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-10", + "openWeights": false, + "releaseDate": "2025-09-30" + } + } + ] + }, + { + "id": "google/gemini-25-flash-image", + "provider": "google", + "model": "gemini-25-flash-image", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "fal_ai" + ], + "aliases": [ + "fal_ai/fal-ai/gemini-25-flash-image" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/gemini-25-flash-image", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.039 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fal_ai", + "model": "fal_ai/fal-ai/gemini-25-flash-image", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "google/gemini-3-1-flash-lite", + "provider": "google", + "model": "gemini-3-1-flash-lite", + "displayName": "Gemini 3.1 Flash Lite Preview", + "family": "gemini-flash-lite", + "sources": [ + "models.dev" + ], + "providers": [ + "neon" + ], + "aliases": [ + "neon/gemini-3-1-flash-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "neon", + "model": "gemini-3-1-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3.1 Flash Lite Preview" + ], + "families": [ + "gemini-flash-lite" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-03-03", + "lastUpdated": "2026-03-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "gemini-3-1-flash-lite", + "modelKey": "gemini-3-1-flash-lite", + "displayName": "Gemini 3.1 Flash Lite Preview", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "google/gemini-3-1-pro", + "provider": "google", + "model": "gemini-3-1-pro", + "displayName": "Gemini 3.1 Pro Preview Custom Tools", + "family": "gemini-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "neon" + ], + "aliases": [ + "neon/gemini-3-1-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "neon", + "model": "gemini-3-1-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3.1 Pro Preview Custom Tools" + ], + "families": [ + "gemini-pro" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-02-19", + "lastUpdated": "2026-02-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "gemini-3-1-pro", + "modelKey": "gemini-3-1-pro", + "displayName": "Gemini 3.1 Pro Preview Custom Tools", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "google/gemini-3-1-pro-preview", + "provider": "google", + "model": "gemini-3-1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "frogbot", + "venice" + ], + "aliases": [ + "frogbot/gemini-3-1-pro-preview", + "venice/gemini-3-1-pro-preview" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "frogbot", + "model": "gemini-3-1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "gemini-3-1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 0.5, + "input": 2.5, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 5, + "output": 22.5, + "cache_read": 0.5, + "cache_write": 0.5 + }, + "tiers": [ + { + "input": 5, + "output": 22.5, + "cache_read": 0.5, + "cache_write": 0.5, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3.1 Pro Preview" + ], + "families": [ + "gemini", + "gemini-pro" + ], + "knowledgeCutoff": "2026-01", + "releaseDate": "2026-02-18", + "lastUpdated": "2026-02-18", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "gemini-3-1-pro-preview", + "modelKey": "gemini-3-1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2026-01", + "lastUpdated": "2026-02-18", + "openWeights": false, + "releaseDate": "2026-02-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "gemini-3-1-pro-preview", + "modelKey": "gemini-3-1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-02-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "google/gemini-3-5-flash", + "provider": "google", + "model": "gemini-3-5-flash", + "displayName": "Gemini 3.5 Flash", + "family": "gemini", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/gemini-3-5-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "gemini-3-5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.155, + "cacheWrite": 0.086, + "input": 1.55, + "output": 9.45 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3.5 Flash" + ], + "families": [ + "gemini" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-05-22", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "gemini-3-5-flash", + "modelKey": "gemini-3-5-flash", + "displayName": "Gemini 3.5 Flash", + "family": "gemini", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-05-22", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "google/gemini-3-flash", + "provider": "google", + "model": "gemini-3-flash", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "sources": [ + "models.dev" + ], + "providers": [ + "neon", + "opencode", + "poe", + "vercel" + ], + "aliases": [ + "neon/gemini-3-flash", + "opencode/gemini-3-flash", + "poe/google/gemini-3-flash", + "vercel/google/gemini-3-flash" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 1048576, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "neon", + "model": "gemini-3-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "inputAudio": 1, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gemini-3-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "google/gemini-3-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.4, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "google/gemini-3-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3 Flash", + "Gemini 3 Flash Preview", + "Gemini-3-Flash" + ], + "families": [ + "gemini-flash" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-12-17", + "lastUpdated": "2025-12-17", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "gemini-3-flash", + "modelKey": "gemini-3-flash", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gemini-3-flash", + "modelKey": "gemini-3-flash", + "displayName": "Gemini 3 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/gemini-3-flash", + "modelKey": "google/gemini-3-flash", + "displayName": "Gemini-3-Flash", + "metadata": { + "lastUpdated": "2025-10-07", + "openWeights": false, + "releaseDate": "2025-10-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/gemini-3-flash", + "modelKey": "google/gemini-3-flash", + "displayName": "Gemini 3 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17" + } + } + ] + }, + { + "id": "google/gemini-3-flash-preview", + "provider": "google", + "model": "gemini-3-flash-preview", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "abacus", + "aihubmix", + "anyapi", + "frogbot", + "gemini", + "github-copilot", + "gmi", + "google", + "google-vertex", + "jiekou", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "ollama-cloud", + "openrouter", + "orcarouter", + "perplexity-agent", + "qihang-ai", + "requesty", + "venice", + "vertex_ai", + "vertex_ai-language-models", + "zenmux" + ], + "aliases": [ + "302ai/gemini-3-flash-preview", + "abacus/gemini-3-flash-preview", + "aihubmix/gemini-3-flash-preview", + "anyapi/google/gemini-3-flash-preview", + "frogbot/gemini-3-flash-preview", + "gemini/gemini-3-flash-preview", + "github-copilot/gemini-3-flash-preview", + "gmi/google/gemini-3-flash-preview", + "google-vertex/gemini-3-flash-preview", + "google/gemini-3-flash-preview", + "jiekou/gemini-3-flash-preview", + "kilo/google/gemini-3-flash-preview", + "llmgateway/gemini-3-flash-preview", + "merge-gateway/google/gemini-3-flash-preview", + "nano-gpt/google/gemini-3-flash-preview", + "ollama-cloud/gemini-3-flash-preview", + "openrouter/google/gemini-3-flash-preview", + "orcarouter/google/gemini-3-flash-preview", + "perplexity-agent/google/gemini-3-flash-preview", + "qihang-ai/gemini-3-flash-preview", + "requesty/google/gemini-3-flash-preview", + "venice/gemini-3-flash-preview", + "vertex_ai-language-models/gemini-3-flash-preview", + "vertex_ai/gemini-3-flash-preview", + "zenmux/google/gemini-3-flash-preview" + ], + "mergedProviderModelRecords": 25, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 65536, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "urlContext": true, + "vision": true, + "webSearch": true, + "nativeStreaming": true, + "serviceTier": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "aihubmix", + "model": "gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 0.5, + "output": 3, + "cache_read": 0.05 + }, + "tiers": [ + { + "input": 0.5, + "output": 3, + "cache_read": 0.05, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "frogbot", + "model": "gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "github-copilot", + "model": "gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "inputAudio": 1, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "inputAudio": 1, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "google", + "model": "gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "inputAudio": 1, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.083333, + "input": 0.5, + "output": 3, + "reasoningOutput": 3 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "inputAudio": 1, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "google/gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "inputAudio": 1, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "google/gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.083333, + "input": 0.5, + "output": 3, + "reasoningOutput": 3 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "google/gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "inputAudio": 1, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "google/gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 0.5, + "output": 3, + "cache_read": 0.05 + }, + "tiers": [ + { + "input": 0.5, + "output": 3, + "cache_read": 0.05, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "qihang-ai", + "model": "gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.43 + }, + "tiered": { + "contextOver200K": { + "input": 0.07, + "output": 0.43 + }, + "tiers": [ + { + "input": 0.07, + "output": 0.43, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "google/gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 1, + "input": 0.5, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.07, + "input": 0.7, + "output": 3.75 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "google/gemini-3-flash-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 1, + "input": 0.5, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-3-flash-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "inputAudio": 1, + "output": 3, + "reasoningOutput": 3 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "input_cost_per_token_priority": 9e-7, + "input_cost_per_audio_token_priority": 0.0000018, + "output_cost_per_token_priority": 0.0000054, + "cache_read_input_token_cost_priority": 9e-8 + } + }, + { + "source": "litellm", + "provider": "gmi", + "model": "gmi/google/gemini-3-flash-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/google/gemini-3-flash-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "inputAudio": 1, + "output": 3, + "reasoningOutput": 3 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-3-flash-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "inputAudio": 1, + "output": 3, + "reasoningOutput": 3 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "input_cost_per_token_priority": 9e-7, + "input_cost_per_audio_token_priority": 0.0000018, + "output_cost_per_token_priority": 0.0000054, + "cache_read_input_token_cost_priority": 9e-8 + } + }, + { + "source": "litellm", + "provider": "vertex_ai", + "model": "vertex_ai/gemini-3-flash-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "inputAudio": 1, + "output": 3 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "input_cost_per_token_priority": 9e-7, + "input_cost_per_audio_token_priority": 0.0000018, + "output_cost_per_token_priority": 0.0000054, + "cache_read_input_token_cost_priority": 9e-8 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemini-3-flash-preview", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.0833333333333, + "input": 0.5, + "internalReasoning": 3, + "output": 3 + }, + "other": { + "audio": 0.000001, + "image": 5e-7, + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3 Flash", + "Gemini 3 Flash (Preview)", + "Gemini 3 Flash Preview", + "Google: Gemini 3 Flash Preview", + "gemini-3-flash-preview" + ], + "families": [ + "gemini", + "gemini-flash" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2025-12-18", + "lastUpdated": "2025-12-18", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 25 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gemini-3-flash-preview", + "modelKey": "gemini-3-flash-preview", + "displayName": "gemini-3-flash-preview", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-12-18", + "openWeights": false, + "releaseDate": "2025-12-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gemini-3-flash-preview", + "modelKey": "gemini-3-flash-preview", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "gemini-3-flash-preview", + "modelKey": "gemini-3-flash-preview", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "google/gemini-3-flash-preview", + "modelKey": "google/gemini-3-flash-preview", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "gemini-3-flash-preview", + "modelKey": "gemini-3-flash-preview", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "gemini-3-flash-preview", + "modelKey": "gemini-3-flash-preview", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 256, + "max": 32000 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "gemini-3-flash-preview", + "modelKey": "gemini-3-flash-preview", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-3-flash-preview", + "modelKey": "gemini-3-flash-preview", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gemini-3-flash-preview", + "modelKey": "gemini-3-flash-preview", + "displayName": "gemini-3-flash-preview", + "family": "gemini-flash", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemini-3-flash-preview", + "modelKey": "google/gemini-3-flash-preview", + "displayName": "Google: Gemini 3 Flash Preview", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-12-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gemini-3-flash-preview", + "modelKey": "gemini-3-flash-preview", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "google/gemini-3-flash-preview", + "modelKey": "google/gemini-3-flash-preview", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "google/gemini-3-flash-preview", + "modelKey": "google/gemini-3-flash-preview", + "displayName": "Gemini 3 Flash (Preview)", + "family": "gemini-flash", + "metadata": { + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "gemini-3-flash-preview", + "modelKey": "gemini-3-flash-preview", + "displayName": "gemini-3-flash-preview", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-08", + "openWeights": true, + "releaseDate": "2025-12-17", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemini-3-flash-preview", + "modelKey": "google/gemini-3-flash-preview", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "google/gemini-3-flash-preview", + "modelKey": "google/gemini-3-flash-preview", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "google/gemini-3-flash-preview", + "modelKey": "google/gemini-3-flash-preview", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qihang-ai", + "providerName": "QiHang", + "providerApi": "https://api.qhaigc.net/v1", + "providerDoc": "https://www.qhaigc.net/docs", + "model": "gemini-3-flash-preview", + "modelKey": "gemini-3-flash-preview", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "google/gemini-3-flash-preview", + "modelKey": "google/gemini-3-flash-preview", + "displayName": "Gemini 3 Flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "gemini-3-flash-preview", + "modelKey": "gemini-3-flash-preview", + "displayName": "Gemini 3 Flash Preview", + "family": "gemini", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2025-12-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "google/gemini-3-flash-preview", + "modelKey": "google/gemini-3-flash-preview", + "displayName": "Gemini 3 Flash Preview", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-3-flash-preview", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/pricing/gemini-3", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gmi", + "model": "gmi/google/gemini-3-flash-preview", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/google/gemini-3-flash-preview", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/pricing/gemini-3", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-3-flash-preview", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/pricing/gemini-3", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai", + "model": "vertex_ai/gemini-3-flash-preview", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemini-3-flash-preview", + "displayName": "Google: Gemini 3 Flash Preview", + "metadata": { + "canonicalSlug": "google/gemini-3-flash-preview-20251217", + "createdAt": "2025-12-17T15:57:58.000Z", + "links": { + "details": "/api/v1/models/google/gemini-3-flash-preview-20251217/endpoints" + }, + "reasoning": { + "mandatory": false, + "supported_efforts": [ + "high", + "medium", + "low", + "minimal" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 65535, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-3-flash-preview-thinking", + "provider": "google", + "model": "gemini-3-flash-preview-thinking", + "displayName": "Gemini 3 Flash Thinking", + "family": "gemini-flash", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/google/gemini-3-flash-preview-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "google/gemini-3-flash-preview-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3 Flash Thinking" + ], + "families": [ + "gemini-flash" + ], + "releaseDate": "2025-12-17", + "lastUpdated": "2025-12-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "google/gemini-3-flash-preview-thinking", + "modelKey": "google/gemini-3-flash-preview-thinking", + "displayName": "Gemini 3 Flash Thinking", + "family": "gemini-flash", + "metadata": { + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17" + } + } + ] + }, + { + "id": "google/gemini-3-pro", + "provider": "google", + "model": "gemini-3-pro", + "displayName": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "nearai", + "neon", + "opencode", + "poe", + "replicate" + ], + "aliases": [ + "nearai/google/gemini-3-pro", + "neon/gemini-3-pro", + "opencode/gemini-3-pro", + "poe/google/gemini-3-pro", + "replicate/google/gemini-3-pro" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 1048576, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nearai", + "model": "google/gemini-3-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 1.25, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "neon", + "model": "gemini-3-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gemini-3-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "google/gemini-3-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 1.6, + "output": 9.6 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/google/gemini-3-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 12 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3 Pro", + "Gemini 3 Pro Preview", + "Gemini-3-Pro" + ], + "families": [ + "gemini-pro" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-11-18", + "lastUpdated": "2025-11-18", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "google/gemini-3-pro", + "modelKey": "google/gemini-3-pro", + "displayName": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "gemini-3-pro", + "modelKey": "gemini-3-pro", + "displayName": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gemini-3-pro", + "modelKey": "gemini-3-pro", + "displayName": "Gemini 3 Pro", + "family": "gemini-pro", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/gemini-3-pro", + "modelKey": "google/gemini-3-pro", + "displayName": "Gemini-3-Pro", + "family": "gemini-pro", + "status": "deprecated", + "metadata": { + "lastUpdated": "2025-10-22", + "openWeights": false, + "releaseDate": "2025-10-22" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/google/gemini-3-pro", + "mode": "chat" + } + ] + }, + { + "id": "google/gemini-3-pro-image", + "provider": "google", + "model": "gemini-3-pro-image", + "displayName": "Nano Banana Pro (Gemini 3 Pro Image)", + "family": "gemini", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter", + "vercel" + ], + "aliases": [ + "openrouter/google/gemini-3-pro-image", + "vercel/google/gemini-3-pro-image" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 65536, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemini-3-pro-image", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0.375, + "input": 2, + "output": 12, + "reasoningOutput": 12 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "google/gemini-3-pro-image", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemini-3-pro-image", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0.375, + "input": 2, + "internalReasoning": 12, + "output": 12 + }, + "other": { + "audio": 0.000002, + "image": 0.000002, + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Google: Nano Banana Pro (Gemini 3 Pro Image)", + "Nano Banana Pro (Gemini 3 Pro Image)" + ], + "families": [ + "gemini", + "gemini-pro" + ], + "knowledgeCutoff": "2025-03", + "releaseDate": "2026-06-18", + "lastUpdated": "2026-06-18", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemini-3-pro-image", + "modelKey": "google/gemini-3-pro-image", + "displayName": "Nano Banana Pro (Gemini 3 Pro Image)", + "family": "gemini", + "metadata": { + "lastUpdated": "2026-06-18", + "openWeights": false, + "releaseDate": "2026-06-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/gemini-3-pro-image", + "modelKey": "google/gemini-3-pro-image", + "displayName": "Nano Banana Pro (Gemini 3 Pro Image)", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2025-09", + "openWeights": false, + "releaseDate": "2025-09-01" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemini-3-pro-image", + "displayName": "Google: Nano Banana Pro (Gemini 3 Pro Image)", + "metadata": { + "canonicalSlug": "google/gemini-3-pro-image-20260528", + "createdAt": "2026-06-18T03:40:54.000Z", + "links": { + "details": "/api/v1/models/google/gemini-3-pro-image-20260528/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 65536, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-3-pro-image-preview", + "provider": "google", + "model": "gemini-3-pro-image-preview", + "displayName": "Nano Banana Pro", + "family": "gemini-pro", + "mode": "image_generation", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "fastrouter", + "gemini", + "google", + "kilo", + "nano-gpt", + "openrouter", + "vertex_ai-language-models" + ], + "aliases": [ + "302ai/gemini-3-pro-image-preview", + "fastrouter/google/gemini-3-pro-image-preview", + "gemini/gemini-3-pro-image-preview", + "google/gemini-3-pro-image-preview", + "kilo/google/gemini-3-pro-image-preview", + "nano-gpt/gemini-3-pro-image-preview", + "openrouter/google/gemini-3-pro-image-preview", + "vertex_ai-language-models/gemini-3-pro-image-preview", + "vertex_ai-language-models/vertex_ai/gemini-3-pro-image-preview" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "maxTokens": 32768, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": true, + "embedding": false, + "functionCalling": false, + "imageGeneration": true, + "moderation": false, + "promptCaching": true, + "rerank": false, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gemini-3-pro-image-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 120 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "google/gemini-3-pro-image-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 12 + } + }, + { + "source": "models.dev", + "provider": "google", + "model": "gemini-3-pro-image-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 120 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemini-3-pro-image-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 12, + "reasoningOutput": 12 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-3-pro-image-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 12 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemini-3-pro-image-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0.375, + "input": 2, + "output": 12, + "reasoningOutput": 12 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-3-pro-image-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 12, + "outputImage": 120 + }, + "perImage": { + "input": 0.0011, + "output": 0.134 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "input_cost_per_token_batches": 0.000001, + "output_cost_per_token_batches": 0.000006 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-3-pro-image-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 12, + "outputImage": 120 + }, + "perImage": { + "input": 0.0011, + "output": 0.134 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "input_cost_per_token_batches": 0.000001, + "output_cost_per_token_batches": 0.000006 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "vertex_ai/gemini-3-pro-image-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 12, + "outputImage": 120 + }, + "perImage": { + "input": 0.0011, + "output": 0.134 + }, + "extra": { + "input_cost_per_token_batches": 0.000001, + "output_cost_per_token_batches": 0.000006 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemini-3-pro-image-preview", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0.375, + "input": 2, + "internalReasoning": 12, + "output": 12 + }, + "other": { + "audio": 0.000002, + "image": 0.000002, + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3 Pro Image", + "Google: Nano Banana Pro (Gemini 3 Pro Image Preview)", + "Nano Banana Pro", + "gemini-3-pro-image-preview" + ], + "families": [ + "gemini-pro" + ], + "modes": [ + "image_generation" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2025-11-20", + "lastUpdated": "2025-11-20", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gemini-3-pro-image-preview", + "modelKey": "gemini-3-pro-image-preview", + "displayName": "gemini-3-pro-image-preview", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-11-20", + "openWeights": false, + "releaseDate": "2025-11-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "google/gemini-3-pro-image-preview", + "modelKey": "google/gemini-3-pro-image-preview", + "displayName": "Nano Banana Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-11-20", + "openWeights": false, + "releaseDate": "2025-11-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-3-pro-image-preview", + "modelKey": "gemini-3-pro-image-preview", + "displayName": "Nano Banana Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-11-20", + "openWeights": false, + "releaseDate": "2025-11-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemini-3-pro-image-preview", + "modelKey": "google/gemini-3-pro-image-preview", + "displayName": "Google: Nano Banana Pro (Gemini 3 Pro Image Preview)", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-11-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-3-pro-image-preview", + "modelKey": "gemini-3-pro-image-preview", + "displayName": "Gemini 3 Pro Image", + "metadata": { + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemini-3-pro-image-preview", + "modelKey": "google/gemini-3-pro-image-preview", + "displayName": "Nano Banana Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-11-20", + "openWeights": false, + "releaseDate": "2025-11-20" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-3-pro-image-preview", + "mode": "image_generation", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-3-pro-image-preview", + "mode": "image_generation", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "vertex_ai/gemini-3-pro-image-preview", + "mode": "image_generation", + "metadata": { + "source": "https://docs.cloud.google.com/vertex-ai/generative-ai/docs/models/gemini/3-pro-image" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemini-3-pro-image-preview", + "displayName": "Google: Nano Banana Pro (Gemini 3 Pro Image Preview)", + "metadata": { + "canonicalSlug": "google/gemini-3-pro-image-preview-20251120", + "createdAt": "2025-11-20T15:49:57.000Z", + "links": { + "details": "/api/v1/models/google/gemini-3-pro-image-preview-20251120/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 65536, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-3-pro-preview", + "provider": "google", + "model": "gemini-3-pro-preview", + "displayName": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "anyapi", + "gemini", + "github_copilot", + "gmi", + "google", + "helicone", + "jiekou", + "merge-gateway", + "openrouter", + "orcarouter", + "qihang-ai", + "requesty", + "vercel", + "vertex_ai", + "vertex_ai-language-models" + ], + "aliases": [ + "302ai/gemini-3-pro-preview", + "anyapi/google/gemini-3-pro-preview", + "gemini/gemini-3-pro-preview", + "github_copilot/gemini-3-pro-preview", + "gmi/google/gemini-3-pro-preview", + "google/gemini-3-pro-preview", + "helicone/gemini-3-pro-preview", + "jiekou/gemini-3-pro-preview", + "merge-gateway/google/gemini-3-pro-preview", + "openrouter/google/gemini-3-pro-preview", + "orcarouter/google/gemini-3-pro-preview", + "qihang-ai/gemini-3-pro-preview", + "requesty/google/gemini-3-pro-preview", + "vercel/google/gemini-3-pro-preview", + "vertex_ai-language-models/gemini-3-pro-preview", + "vertex_ai/gemini-3-pro-preview" + ], + "mergedProviderModelRecords": 16, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 65536, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "parallelFunctionCalling": true, + "nativeStreaming": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gemini-3-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 12 + } + }, + { + "source": "models.dev", + "provider": "google", + "model": "gemini-3-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gemini-3-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.19999999999999998, + "input": 2, + "output": 12 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "gemini-3-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.8, + "output": 10.8 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "google/gemini-3-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "google/gemini-3-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 4, + "output": 18 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "qihang-ai", + "model": "gemini-3-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.57, + "output": 3.43 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "google/gemini-3-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 4.5, + "input": 2, + "output": 12 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "google/gemini-3-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-3-pro-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 4e-7, + "input_cost_per_token_above_200k_tokens": 0.000004, + "input_cost_per_token_batches": 0.000001, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_200k_tokens": 0.000018, + "output_cost_per_token_batches": 0.000006, + "input_cost_per_token_priority": 0.0000036, + "input_cost_per_token_above_200k_tokens_priority": 0.0000072, + "output_cost_per_token_priority": 0.0000216, + "output_cost_per_token_above_200k_tokens_priority": 0.0000324, + "cache_read_input_token_cost_priority": 3.6e-7, + "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gemini-3-pro-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "gmi", + "model": "gmi/google/gemini-3-pro-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 12 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/google/gemini-3-pro-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 4e-7, + "cache_creation_input_token_cost_above_200k_tokens": 2.5e-7, + "input_cost_per_token_above_200k_tokens": 0.000004, + "input_cost_per_token_batches": 0.000001, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_200k_tokens": 0.000018, + "output_cost_per_token_batches": 0.000006 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-3-pro-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 4e-7, + "cache_creation_input_token_cost_above_200k_tokens": 2.5e-7, + "input_cost_per_token_above_200k_tokens": 0.000004, + "input_cost_per_token_batches": 0.000001, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_200k_tokens": 0.000018, + "output_cost_per_token_batches": 0.000006, + "input_cost_per_token_priority": 0.0000036, + "input_cost_per_token_above_200k_tokens_priority": 0.0000072, + "output_cost_per_token_priority": 0.0000216, + "output_cost_per_token_above_200k_tokens_priority": 0.0000324, + "cache_read_input_token_cost_priority": 3.6e-7, + "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7 + } + }, + { + "source": "litellm", + "provider": "vertex_ai", + "model": "vertex_ai/gemini-3-pro-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 4e-7, + "cache_creation_input_token_cost_above_200k_tokens": 2.5e-7, + "input_cost_per_token_above_200k_tokens": 0.000004, + "input_cost_per_token_batches": 0.000001, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_200k_tokens": 0.000018, + "output_cost_per_token_batches": 0.000006, + "input_cost_per_token_priority": 0.0000036, + "input_cost_per_token_above_200k_tokens_priority": 0.0000072, + "output_cost_per_token_priority": 0.0000216, + "output_cost_per_token_above_200k_tokens_priority": 0.0000324, + "cache_read_input_token_cost_priority": 3.6e-7, + "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3 Pro", + "Gemini 3 Pro Preview", + "Google Gemini 3 Pro Preview", + "gemini-3-pro-preview" + ], + "families": [ + "gemini-pro" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2025-11-19", + "lastUpdated": "2025-11-19", + "deprecationDate": "2026-03-09", + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 16 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gemini-3-pro-preview", + "modelKey": "gemini-3-pro-preview", + "displayName": "gemini-3-pro-preview", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-11-19", + "openWeights": false, + "releaseDate": "2025-11-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "google/gemini-3-pro-preview", + "modelKey": "google/gemini-3-pro-preview", + "displayName": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-3-pro-preview", + "modelKey": "gemini-3-pro-preview", + "displayName": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gemini-3-pro-preview", + "modelKey": "gemini-3-pro-preview", + "displayName": "Google Gemini 3 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-11", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gemini-3-pro-preview", + "modelKey": "gemini-3-pro-preview", + "displayName": "gemini-3-pro-preview", + "family": "gemini-pro", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "google/gemini-3-pro-preview", + "modelKey": "google/gemini-3-pro-preview", + "displayName": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "google/gemini-3-pro-preview", + "modelKey": "google/gemini-3-pro-preview", + "displayName": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qihang-ai", + "providerName": "QiHang", + "providerApi": "https://api.qhaigc.net/v1", + "providerDoc": "https://www.qhaigc.net/docs", + "model": "gemini-3-pro-preview", + "modelKey": "gemini-3-pro-preview", + "displayName": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-11", + "lastUpdated": "2025-11-19", + "openWeights": false, + "releaseDate": "2025-11-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "google/gemini-3-pro-preview", + "modelKey": "google/gemini-3-pro-preview", + "displayName": "Gemini 3 Pro", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/gemini-3-pro-preview", + "modelKey": "google/gemini-3-pro-preview", + "displayName": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-3-pro-preview", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-03-09", + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gemini-3-pro-preview", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gmi", + "model": "gmi/google/gemini-3-pro-preview", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/google/gemini-3-pro-preview", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-3-pro-preview", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-03-26", + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai", + "model": "vertex_ai/gemini-3-pro-preview", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + } + ] + }, + { + "id": "google/gemini-3.0-flash-preview", + "provider": "google", + "model": "gemini-3.0-flash-preview", + "displayName": "Gemini 3.0 Flash Preview", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/gemini-3.0-flash-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "metadata": { + "displayNames": [ + "Gemini 3.0 Flash Preview" + ], + "releaseDate": "2025-12-18", + "lastUpdated": "2025-12-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "gemini-3.0-flash-preview", + "modelKey": "gemini-3.0-flash-preview", + "displayName": "Gemini 3.0 Flash Preview", + "metadata": { + "lastUpdated": "2025-12-18", + "openWeights": false, + "releaseDate": "2025-12-18" + } + } + ] + }, + { + "id": "google/gemini-3.0-pro-image-preview", + "provider": "google", + "model": "gemini-3.0-pro-image-preview", + "displayName": "Gemini 3.0 Pro Image Preview", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/gemini-3.0-pro-image-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Gemini 3.0 Pro Image Preview" + ], + "releaseDate": "2025-11-20", + "lastUpdated": "2025-11-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "gemini-3.0-pro-image-preview", + "modelKey": "gemini-3.0-pro-image-preview", + "displayName": "Gemini 3.0 Pro Image Preview", + "metadata": { + "lastUpdated": "2025-11-20", + "openWeights": false, + "releaseDate": "2025-11-20" + } + } + ] + }, + { + "id": "google/gemini-3.0-pro-preview", + "provider": "google", + "model": "gemini-3.0-pro-preview", + "displayName": "Gemini 3.0 Pro Preview", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/gemini-3.0-pro-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "metadata": { + "displayNames": [ + "Gemini 3.0 Pro Preview" + ], + "releaseDate": "2025-11-19", + "lastUpdated": "2025-11-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "gemini-3.0-pro-preview", + "modelKey": "gemini-3.0-pro-preview", + "displayName": "Gemini 3.0 Pro Preview", + "metadata": { + "lastUpdated": "2025-11-19", + "openWeights": false, + "releaseDate": "2025-11-19" + } + } + ] + }, + { + "id": "google/gemini-3.1-flash-image", + "provider": "google", + "model": "gemini-3.1-flash-image", + "displayName": "Nano Banana 2 (Gemini 3.1 Flash Image)", + "family": "gemini", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter", + "vercel" + ], + "aliases": [ + "openrouter/google/gemini-3.1-flash-image", + "vercel/google/gemini-3.1-flash-image" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemini-3.1-flash-image", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "google/gemini-3.1-flash-image", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "output": 3 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemini-3.1-flash-image", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 3 + }, + "other": { + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3.1 Flash Image (Nano Banana 2)", + "Google: Nano Banana 2 (Gemini 3.1 Flash Image)", + "Nano Banana 2 (Gemini 3.1 Flash Image)" + ], + "families": [ + "gemini" + ], + "releaseDate": "2026-06-18", + "lastUpdated": "2026-06-18", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "top_p" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemini-3.1-flash-image", + "modelKey": "google/gemini-3.1-flash-image", + "displayName": "Nano Banana 2 (Gemini 3.1 Flash Image)", + "family": "gemini", + "metadata": { + "lastUpdated": "2026-06-18", + "openWeights": false, + "releaseDate": "2026-06-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/gemini-3.1-flash-image", + "modelKey": "google/gemini-3.1-flash-image", + "displayName": "Gemini 3.1 Flash Image (Nano Banana 2)", + "family": "gemini", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-28" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemini-3.1-flash-image", + "displayName": "Google: Nano Banana 2 (Gemini 3.1 Flash Image)", + "metadata": { + "canonicalSlug": "google/gemini-3.1-flash-image-20260528", + "createdAt": "2026-06-18T03:41:05.000Z", + "links": { + "details": "/api/v1/models/google/gemini-3.1-flash-image-20260528/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true, + "supported_efforts": [ + "high", + "minimal" + ], + "default_effort": "minimal" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 65536, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-3.1-flash-image-preview", + "provider": "google", + "model": "gemini-3.1-flash-image-preview", + "displayName": "Nano Banana 2", + "family": "gemini-flash", + "mode": "image_generation", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "fastrouter", + "gemini", + "google", + "kilo", + "openrouter", + "vercel", + "vertex_ai-language-models" + ], + "aliases": [ + "302ai/gemini-3.1-flash-image-preview", + "fastrouter/google/gemini-3.1-flash-image-preview", + "gemini/gemini-3.1-flash-image-preview", + "google/gemini-3.1-flash-image-preview", + "kilo/google/gemini-3.1-flash-image-preview", + "openrouter/google/gemini-3.1-flash-image-preview", + "vercel/google/gemini-3.1-flash-image-preview", + "vertex_ai-language-models/gemini-3.1-flash-image-preview", + "vertex_ai-language-models/vertex_ai/gemini-3.1-flash-image-preview" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 131072, + "inputTokens": 65536, + "maxTokens": 32768, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": true, + "embedding": false, + "functionCalling": false, + "imageGeneration": true, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gemini-3.1-flash-image-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 60 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "google/gemini-3.1-flash-image-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "google", + "model": "gemini-3.1-flash-image-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 60 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemini-3.1-flash-image-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemini-3.1-flash-image-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "google/gemini-3.1-flash-image-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-3.1-flash-image-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 1.5, + "outputImage": 60 + }, + "perImage": { + "output": 0.045 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "input_cost_per_token_batches": 1.25e-7, + "output_cost_per_image_token_batches": 0.00003, + "output_cost_per_token_batches": 7.5e-7 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-3.1-flash-image-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 3, + "outputImage": 60 + }, + "perImage": { + "input": 0.00056, + "output": 0.0672 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "vertex_ai/gemini-3.1-flash-image-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 3, + "outputImage": 60 + }, + "perImage": { + "input": 0.00056, + "output": 0.0672 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemini-3.1-flash-image-preview", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 3 + }, + "other": { + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3.1 Flash Image Preview (Nano Banana 2)", + "Google: Nano Banana 2 (Gemini 3.1 Flash Image Preview)", + "Nano Banana 2", + "gemini-3.1-flash-image-preview" + ], + "families": [ + "gemini", + "gemini-flash" + ], + "modes": [ + "image_generation" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-02-27", + "lastUpdated": "2026-02-27", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gemini-3.1-flash-image-preview", + "modelKey": "gemini-3.1-flash-image-preview", + "displayName": "gemini-3.1-flash-image-preview", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-27", + "openWeights": false, + "releaseDate": "2026-02-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "google/gemini-3.1-flash-image-preview", + "modelKey": "google/gemini-3.1-flash-image-preview", + "displayName": "Nano Banana 2", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-26", + "openWeights": false, + "releaseDate": "2026-02-26", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-3.1-flash-image-preview", + "modelKey": "gemini-3.1-flash-image-preview", + "displayName": "Nano Banana 2", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-26", + "openWeights": false, + "releaseDate": "2026-02-26", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemini-3.1-flash-image-preview", + "modelKey": "google/gemini-3.1-flash-image-preview", + "displayName": "Google: Nano Banana 2 (Gemini 3.1 Flash Image Preview)", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-02-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemini-3.1-flash-image-preview", + "modelKey": "google/gemini-3.1-flash-image-preview", + "displayName": "Nano Banana 2", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-26", + "openWeights": false, + "releaseDate": "2026-02-26", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/gemini-3.1-flash-image-preview", + "modelKey": "google/gemini-3.1-flash-image-preview", + "displayName": "Gemini 3.1 Flash Image Preview (Nano Banana 2)", + "family": "gemini", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-26", + "openWeights": false, + "releaseDate": "2026-02-26" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-3.1-flash-image-preview", + "mode": "image_generation", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-3.1-flash-image-preview", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-3.1-flash-image-preview", + "mode": "image_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#gemini-models", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "vertex_ai/gemini-3.1-flash-image-preview", + "mode": "image_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#gemini-models" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemini-3.1-flash-image-preview", + "displayName": "Google: Nano Banana 2 (Gemini 3.1 Flash Image Preview)", + "metadata": { + "canonicalSlug": "google/gemini-3.1-flash-image-preview-20260226", + "createdAt": "2026-02-26T15:25:58.000Z", + "links": { + "details": "/api/v1/models/google/gemini-3.1-flash-image-preview-20260226/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true, + "supported_efforts": [ + "high", + "minimal" + ], + "default_effort": "minimal" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 65536, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-3.1-flash-lite", + "provider": "google", + "model": "gemini-3.1-flash-lite", + "displayName": "Gemini 3.1 Flash Lite", + "family": "gemini-flash-lite", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "aihubmix", + "gemini", + "google", + "google-vertex", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "openrouter", + "poe", + "vercel", + "vertex_ai-language-models", + "zenmux" + ], + "aliases": [ + "aihubmix/gemini-3.1-flash-lite", + "gemini/gemini-3.1-flash-lite", + "google-vertex/gemini-3.1-flash-lite", + "google/gemini-3.1-flash-lite", + "kilo/google/gemini-3.1-flash-lite", + "llmgateway/gemini-3.1-flash-lite", + "merge-gateway/google/gemini-3.1-flash-lite", + "nano-gpt/google/gemini-3.1-flash-lite", + "nearai/google/gemini-3.1-flash-lite", + "openrouter/google/gemini-3.1-flash-lite", + "poe/google/gemini-3.1-flash-lite", + "vercel/google/gemini-3.1-flash-lite", + "vertex_ai-language-models/gemini-3.1-flash-lite", + "vertex_ai-language-models/vertex_ai/gemini-3.1-flash-lite", + "zenmux/google/gemini-3.1-flash-lite" + ], + "mergedProviderModelRecords": 15, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 65536, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "codeExecution": true, + "embedding": false, + "fileSearch": true, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "urlContext": true, + "vision": true, + "webSearch": true, + "nativeStreaming": true, + "serviceTier": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "gemini-3.1-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 1, + "input": 0.25, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "gemini-3.1-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "google", + "model": "gemini-3.1-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemini-3.1-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 0.08333, + "input": 0.25, + "output": 1.5, + "reasoningOutput": 1.5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gemini-3.1-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "google/gemini-3.1-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "google/gemini-3.1-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "google/gemini-3.1-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemini-3.1-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 0.083333, + "input": 0.25, + "output": 1.5, + "reasoningOutput": 1.5 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "google/gemini-3.1-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "google/gemini-3.1-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.25, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "google/gemini-3.1-flash-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-3.1-flash-lite", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5, + "reasoningOutput": 1.5 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "cache_read_input_token_cost_batches": 1.25e-8, + "cache_read_input_token_cost_flex": 1.25e-8, + "cache_read_input_token_cost_per_audio_token": 5e-8, + "cache_read_input_token_cost_priority": 4.5e-8, + "input_cost_per_token_batches": 1.25e-7, + "input_cost_per_token_flex": 1.25e-7, + "input_cost_per_token_priority": 4.5e-7, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_batches": 7.5e-7, + "output_cost_per_token_flex": 7.5e-7, + "output_cost_per_token_priority": 0.0000027 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/google/gemini-3.1-flash-lite", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5, + "reasoningOutput": 1.5 + }, + "extra": { + "cache_read_input_token_cost_per_audio_token": 5e-8, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-3.1-flash-lite", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5, + "reasoningOutput": 1.5 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "cache_read_input_token_cost_batches": 1.25e-8, + "cache_read_input_token_cost_flex": 1.25e-8, + "cache_read_input_token_cost_per_audio_token": 5e-8, + "cache_read_input_token_cost_priority": 4.5e-8, + "input_cost_per_token_batches": 1.25e-7, + "input_cost_per_token_flex": 1.25e-7, + "input_cost_per_token_priority": 4.5e-7, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_batches": 7.5e-7, + "output_cost_per_token_flex": 7.5e-7, + "output_cost_per_token_priority": 0.0000027 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "vertex_ai/gemini-3.1-flash-lite", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5, + "reasoningOutput": 1.5 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "cache_read_input_token_cost_batches": 1.25e-8, + "cache_read_input_token_cost_flex": 1.25e-8, + "cache_read_input_token_cost_per_audio_token": 5e-8, + "cache_read_input_token_cost_priority": 4.5e-8, + "input_cost_per_token_batches": 1.25e-7, + "input_cost_per_token_flex": 1.25e-7, + "input_cost_per_token_priority": 4.5e-7, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_batches": 7.5e-7, + "output_cost_per_token_flex": 7.5e-7, + "output_cost_per_token_priority": 0.0000027 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemini-3.1-flash-lite", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 0.0833333333333, + "input": 0.25, + "internalReasoning": 1.5, + "output": 1.5 + }, + "other": { + "audio": 5e-7, + "image": 2.5e-7, + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3.1 Flash Lite", + "Gemini-3.1-Flash-Lite", + "Google: Gemini 3.1 Flash Lite" + ], + "families": [ + "gemini", + "gemini-flash-lite" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-05-07", + "lastUpdated": "2026-05-07", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 15 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "gemini-3.1-flash-lite", + "modelKey": "gemini-3.1-flash-lite", + "displayName": "Gemini 3.1 Flash Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-07", + "openWeights": false, + "releaseDate": "2026-05-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "gemini-3.1-flash-lite", + "modelKey": "gemini-3.1-flash-lite", + "displayName": "Gemini 3.1 Flash Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-07", + "openWeights": false, + "releaseDate": "2026-05-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-3.1-flash-lite", + "modelKey": "gemini-3.1-flash-lite", + "displayName": "Gemini 3.1 Flash Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-07", + "openWeights": false, + "releaseDate": "2026-05-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemini-3.1-flash-lite", + "modelKey": "google/gemini-3.1-flash-lite", + "displayName": "Google: Gemini 3.1 Flash Lite", + "metadata": { + "lastUpdated": "2026-05-16", + "openWeights": false, + "releaseDate": "2026-05-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gemini-3.1-flash-lite", + "modelKey": "gemini-3.1-flash-lite", + "displayName": "Gemini 3.1 Flash Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-07", + "openWeights": false, + "releaseDate": "2026-05-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "google/gemini-3.1-flash-lite", + "modelKey": "google/gemini-3.1-flash-lite", + "displayName": "Gemini 3.1 Flash Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-07", + "openWeights": false, + "releaseDate": "2026-05-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "google/gemini-3.1-flash-lite", + "modelKey": "google/gemini-3.1-flash-lite", + "displayName": "Gemini 3.1 Flash Lite", + "metadata": { + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "google/gemini-3.1-flash-lite", + "modelKey": "google/gemini-3.1-flash-lite", + "displayName": "Gemini 3.1 Flash Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-07", + "openWeights": false, + "releaseDate": "2026-05-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemini-3.1-flash-lite", + "modelKey": "google/gemini-3.1-flash-lite", + "displayName": "Gemini 3.1 Flash Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-07", + "openWeights": false, + "releaseDate": "2026-05-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/gemini-3.1-flash-lite", + "modelKey": "google/gemini-3.1-flash-lite", + "displayName": "Gemini-3.1-Flash-Lite", + "metadata": { + "lastUpdated": "2026-02-18", + "openWeights": false, + "releaseDate": "2026-02-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/gemini-3.1-flash-lite", + "modelKey": "google/gemini-3.1-flash-lite", + "displayName": "Gemini 3.1 Flash Lite", + "family": "gemini", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-07", + "openWeights": false, + "releaseDate": "2026-05-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "google/gemini-3.1-flash-lite", + "modelKey": "google/gemini-3.1-flash-lite", + "displayName": "Gemini 3.1 Flash Lite", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-07", + "openWeights": false, + "releaseDate": "2026-05-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-3.1-flash-lite", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-3.1-flash-lite", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/google/gemini-3.1-flash-lite", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-3.1-flash-lite", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-3.1-flash-lite", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-3.1-flash-lite", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "vertex_ai/gemini-3.1-flash-lite", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#gemini-models", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemini-3.1-flash-lite", + "displayName": "Google: Gemini 3.1 Flash Lite", + "metadata": { + "canonicalSlug": "google/gemini-3.1-flash-lite-20260507", + "createdAt": "2026-05-07T15:47:08.000Z", + "links": { + "details": "/api/v1/models/google/gemini-3.1-flash-lite-20260507/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true, + "supported_efforts": [ + "high", + "medium", + "low", + "minimal" + ], + "default_effort": "minimal" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-3.1-flash-lite-preview", + "provider": "google", + "model": "gemini-3.1-flash-lite-preview", + "displayName": "Gemini 3.1 Flash Lite Preview", + "family": "gemini-flash-lite", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "gemini", + "google", + "google-vertex", + "kilo", + "llmgateway", + "merge-gateway", + "openrouter", + "orcarouter", + "vercel", + "vertex_ai-language-models", + "vivgrid", + "zenmux" + ], + "aliases": [ + "abacus/gemini-3.1-flash-lite-preview", + "gemini/gemini-3.1-flash-lite-preview", + "google-vertex/gemini-3.1-flash-lite-preview", + "google/gemini-3.1-flash-lite-preview", + "kilo/google/gemini-3.1-flash-lite-preview", + "llmgateway/gemini-3.1-flash-lite-preview", + "merge-gateway/google/gemini-3.1-flash-lite-preview", + "openrouter/google/gemini-3.1-flash-lite-preview", + "orcarouter/google/gemini-3.1-flash-lite-preview", + "vercel/google/gemini-3.1-flash-lite-preview", + "vertex_ai-language-models/gemini-3.1-flash-lite-preview", + "vertex_ai-language-models/vertex_ai/gemini-3.1-flash-lite-preview", + "vivgrid/gemini-3.1-flash-lite-preview", + "zenmux/google/gemini-3.1-flash-lite-preview" + ], + "mergedProviderModelRecords": 14, + "limits": { + "contextTokens": 1050000, + "inputTokens": 1048576, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 65536, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "codeExecution": true, + "embedding": false, + "fileSearch": true, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "urlContext": true, + "vision": true, + "webSearch": true, + "nativeStreaming": true, + "serviceTier": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "gemini-3.1-flash-lite-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 1, + "input": 0.25, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "gemini-3.1-flash-lite-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "google", + "model": "gemini-3.1-flash-lite-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemini-3.1-flash-lite-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1.5, + "reasoningOutput": 1.5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gemini-3.1-flash-lite-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "google/gemini-3.1-flash-lite-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemini-3.1-flash-lite-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 0.083333, + "input": 0.25, + "output": 1.5, + "reasoningOutput": 1.5 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "google/gemini-3.1-flash-lite-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "google/gemini-3.1-flash-lite-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.25, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "vivgrid", + "model": "gemini-3.1-flash-lite-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 1, + "input": 0.25, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "google/gemini-3.1-flash-lite-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-3.1-flash-lite-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5, + "reasoningOutput": 1.5 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "cache_read_input_token_cost_per_audio_token": 5e-8, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/google/gemini-3.1-flash-lite-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5, + "reasoningOutput": 1.5 + }, + "extra": { + "cache_read_input_token_cost_per_audio_token": 5e-8, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-3.1-flash-lite-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5, + "reasoningOutput": 1.5 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "cache_read_input_token_cost_per_audio_token": 5e-8, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "vertex_ai/gemini-3.1-flash-lite-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "inputAudio": 0.5, + "output": 1.5, + "reasoningOutput": 1.5 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "cache_read_input_token_cost_per_audio_token": 5e-8, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemini-3.1-flash-lite-preview", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 0.0833333333333, + "input": 0.25, + "internalReasoning": 1.5, + "output": 1.5 + }, + "other": { + "audio": 5e-7, + "image": 2.5e-7, + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3.1 Flash Lite Preview", + "Google: Gemini 3.1 Flash Lite Preview" + ], + "families": [ + "gemini", + "gemini-flash", + "gemini-flash-lite" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-03-01", + "lastUpdated": "2026-03-01", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 14 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gemini-3.1-flash-lite-preview", + "modelKey": "gemini-3.1-flash-lite-preview", + "displayName": "Gemini 3.1 Flash Lite Preview", + "family": "gemini-flash", + "metadata": { + "lastUpdated": "2026-03-01", + "openWeights": false, + "releaseDate": "2026-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "gemini-3.1-flash-lite-preview", + "modelKey": "gemini-3.1-flash-lite-preview", + "displayName": "Gemini 3.1 Flash Lite Preview", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-3.1-flash-lite-preview", + "modelKey": "gemini-3.1-flash-lite-preview", + "displayName": "Gemini 3.1 Flash Lite Preview", + "family": "gemini-flash-lite", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemini-3.1-flash-lite-preview", + "modelKey": "google/gemini-3.1-flash-lite-preview", + "displayName": "Google: Gemini 3.1 Flash Lite Preview", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-03-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gemini-3.1-flash-lite-preview", + "modelKey": "gemini-3.1-flash-lite-preview", + "displayName": "Gemini 3.1 Flash Lite Preview", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "google/gemini-3.1-flash-lite-preview", + "modelKey": "google/gemini-3.1-flash-lite-preview", + "displayName": "Gemini 3.1 Flash Lite Preview", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemini-3.1-flash-lite-preview", + "modelKey": "google/gemini-3.1-flash-lite-preview", + "displayName": "Gemini 3.1 Flash Lite Preview", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "google/gemini-3.1-flash-lite-preview", + "modelKey": "google/gemini-3.1-flash-lite-preview", + "displayName": "Gemini 3.1 Flash Lite Preview", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/gemini-3.1-flash-lite-preview", + "modelKey": "google/gemini-3.1-flash-lite-preview", + "displayName": "Gemini 3.1 Flash Lite Preview", + "family": "gemini", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vivgrid", + "providerName": "Vivgrid", + "providerApi": "https://api.vivgrid.com/v1", + "providerDoc": "https://docs.vivgrid.com/models", + "model": "gemini-3.1-flash-lite-preview", + "modelKey": "gemini-3.1-flash-lite-preview", + "displayName": "Gemini 3.1 Flash Lite Preview", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "google/gemini-3.1-flash-lite-preview", + "modelKey": "google/gemini-3.1-flash-lite-preview", + "displayName": "Gemini 3.1 Flash Lite Preview", + "metadata": { + "lastUpdated": "2025-03-20", + "openWeights": false, + "releaseDate": "2025-03-20" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-3.1-flash-lite-preview", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/models", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/google/gemini-3.1-flash-lite-preview", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/pricing/gemini-3", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-3.1-flash-lite-preview", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/models", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "vertex_ai/gemini-3.1-flash-lite-preview", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#gemini-models", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemini-3.1-flash-lite-preview", + "displayName": "Google: Gemini 3.1 Flash Lite Preview", + "metadata": { + "canonicalSlug": "google/gemini-3.1-flash-lite-preview-20260303", + "createdAt": "2026-03-03T04:37:53.000Z", + "links": { + "details": "/api/v1/models/google/gemini-3.1-flash-lite-preview-20260303/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true, + "supported_efforts": [ + "high", + "medium", + "low", + "minimal" + ], + "default_effort": "minimal" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-3.1-flash-live-preview", + "provider": "google", + "model": "gemini-3.1-flash-live-preview", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gemini" + ], + "aliases": [ + "gemini/gemini-3.1-flash-live-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": true, + "vision": true, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini-3.1-flash-live-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.75, + "inputAudio": 3, + "inputImage": 1, + "output": 4.5, + "outputAudio": 12 + }, + "perVideoSecond": { + "input": 0.000033333333333333335 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-3.1-flash-live-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.75, + "inputAudio": 3, + "inputImage": 1, + "output": 4.5, + "outputAudio": 12 + }, + "perVideoSecond": { + "input": 0.000033333333333333335 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/realtime" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini-3.1-flash-live-preview", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing", + "supportedEndpoints": [ + "/v1/realtime" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-3.1-flash-live-preview", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing", + "supportedEndpoints": [ + "/v1/realtime" + ] + } + } + ] + }, + { + "id": "google/gemini-3.1-pro", + "provider": "google", + "model": "gemini-3.1-pro", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode", + "poe", + "snowflake-cortex" + ], + "aliases": [ + "opencode/gemini-3.1-pro", + "poe/google/gemini-3.1-pro", + "snowflake-cortex/gemini-3.1-pro" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1048576, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "gemini-3.1-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "google/gemini-3.1-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3.1 Pro Preview", + "Gemini-3.1-Pro" + ], + "families": [ + "gemini-pro" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-02-19", + "lastUpdated": "2026-02-19", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gemini-3.1-pro", + "modelKey": "gemini-3.1-pro", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/gemini-3.1-pro", + "modelKey": "google/gemini-3.1-pro", + "displayName": "Gemini-3.1-Pro", + "metadata": { + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "gemini-3.1-pro", + "modelKey": "gemini-3.1-pro", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19" + } + } + ] + }, + { + "id": "google/gemini-3.1-pro-preview", + "provider": "google", + "model": "gemini-3.1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "aihubmix", + "auriko", + "fastrouter", + "gemini", + "github-copilot", + "google", + "google-vertex", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "openrouter", + "orcarouter", + "perplexity-agent", + "vercel", + "vertex_ai", + "vertex_ai-language-models", + "vivgrid", + "zenmux" + ], + "aliases": [ + "abacus/gemini-3.1-pro-preview", + "aihubmix/gemini-3.1-pro-preview", + "auriko/gemini-3.1-pro-preview", + "fastrouter/google/gemini-3.1-pro-preview", + "gemini/gemini-3.1-pro-preview", + "github-copilot/gemini-3.1-pro-preview", + "google-vertex/gemini-3.1-pro-preview", + "google/gemini-3.1-pro-preview", + "kilo/google/gemini-3.1-pro-preview", + "llmgateway/gemini-3.1-pro-preview", + "merge-gateway/google/gemini-3.1-pro-preview", + "nano-gpt/google/gemini-3.1-pro-preview", + "openrouter/google/gemini-3.1-pro-preview", + "orcarouter/google/gemini-3.1-pro-preview", + "perplexity-agent/google/gemini-3.1-pro-preview", + "vercel/google/gemini-3.1-pro-preview", + "vertex_ai-language-models/gemini-3.1-pro-preview", + "vertex_ai/gemini-3.1-pro-preview", + "vivgrid/gemini-3.1-pro-preview", + "zenmux/google/gemini-3.1-pro-preview" + ], + "mergedProviderModelRecords": 20, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 65536, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": false, + "webSearch": true, + "nativeStreaming": true, + "serviceTier": true, + "urlContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "gemini-3.1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 12 + } + }, + { + "source": "models.dev", + "provider": "aihubmix", + "model": "gemini-3.1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "auriko", + "model": "gemini-3.1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "google/gemini-3.1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 12 + } + }, + { + "source": "models.dev", + "provider": "github-copilot", + "model": "gemini-3.1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "gemini-3.1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "google", + "model": "gemini-3.1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemini-3.1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 12, + "reasoningOutput": 12 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gemini-3.1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "google/gemini-3.1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "google/gemini-3.1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemini-3.1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0.375, + "input": 2, + "output": 12, + "reasoningOutput": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "google/gemini-3.1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 4, + "output": 18 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "google/gemini-3.1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "google/gemini-3.1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + } + }, + { + "source": "models.dev", + "provider": "vivgrid", + "model": "gemini-3.1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "google/gemini-3.1-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 4.5, + "input": 2, + "output": 12 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-3.1-pro-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 4e-7, + "input_cost_per_token_above_200k_tokens": 0.000004, + "input_cost_per_token_batches": 0.000001, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_200k_tokens": 0.000018, + "output_cost_per_token_batches": 0.000006, + "input_cost_per_token_priority": 0.0000036, + "input_cost_per_token_above_200k_tokens_priority": 0.0000072, + "output_cost_per_token_priority": 0.0000216, + "output_cost_per_token_above_200k_tokens_priority": 0.0000324, + "cache_read_input_token_cost_priority": 3.6e-7, + "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/google/gemini-3.1-pro-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 4e-7, + "cache_creation_input_token_cost_above_200k_tokens": 2.5e-7, + "input_cost_per_token_above_200k_tokens": 0.000004, + "output_cost_per_token_above_200k_tokens": 0.000018 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-3.1-pro-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "perImage": { + "output": 0.00012 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 4e-7, + "cache_creation_input_token_cost_above_200k_tokens": 2.5e-7, + "input_cost_per_token_above_200k_tokens": 0.000004, + "input_cost_per_token_batches": 0.000001, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_200k_tokens": 0.000018, + "output_cost_per_token_batches": 0.000006, + "input_cost_per_token_priority": 0.0000036, + "input_cost_per_token_above_200k_tokens_priority": 0.0000072, + "output_cost_per_token_priority": 0.0000216, + "output_cost_per_token_above_200k_tokens_priority": 0.0000324, + "cache_read_input_token_cost_priority": 3.6e-7, + "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7 + } + }, + { + "source": "litellm", + "provider": "vertex_ai", + "model": "vertex_ai/gemini-3.1-pro-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "perImage": { + "output": 0.00012 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 4e-7, + "cache_creation_input_token_cost_above_200k_tokens": 2.5e-7, + "input_cost_per_token_above_200k_tokens": 0.000004, + "input_cost_per_token_batches": 0.000001, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_200k_tokens": 0.000018, + "output_cost_per_token_batches": 0.000006, + "input_cost_per_token_priority": 0.0000036, + "input_cost_per_token_above_200k_tokens_priority": 0.0000072, + "output_cost_per_token_priority": 0.0000216, + "output_cost_per_token_above_200k_tokens_priority": 0.0000324, + "cache_read_input_token_cost_priority": 3.6e-7, + "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemini-3.1-pro-preview", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0.375, + "input": 2, + "internalReasoning": 12, + "output": 12 + }, + "other": { + "audio": 0.000002, + "image": 0.000002, + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3.1 Pro (Preview)", + "Gemini 3.1 Pro Preview", + "Google: Gemini 3.1 Pro Preview" + ], + "families": [ + "gemini", + "gemini-pro" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-02-19", + "lastUpdated": "2026-02-19", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 20 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gemini-3.1-pro-preview", + "modelKey": "gemini-3.1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "gemini-3.1-pro-preview", + "modelKey": "gemini-3.1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "auriko", + "providerName": "Auriko", + "providerApi": "https://api.auriko.ai/v1", + "providerDoc": "https://docs.auriko.ai", + "model": "gemini-3.1-pro-preview", + "modelKey": "gemini-3.1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "google/gemini-3.1-pro-preview", + "modelKey": "google/gemini-3.1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "gemini-3.1-pro-preview", + "modelKey": "gemini-3.1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 256, + "max": 32000 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "gemini-3.1-pro-preview", + "modelKey": "gemini-3.1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-3.1-pro-preview", + "modelKey": "gemini-3.1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemini-3.1-pro-preview", + "modelKey": "google/gemini-3.1-pro-preview", + "displayName": "Google: Gemini 3.1 Pro Preview", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-02-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gemini-3.1-pro-preview", + "modelKey": "gemini-3.1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "google/gemini-3.1-pro-preview", + "modelKey": "google/gemini-3.1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "google/gemini-3.1-pro-preview", + "modelKey": "google/gemini-3.1-pro-preview", + "displayName": "Gemini 3.1 Pro (Preview)", + "metadata": { + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemini-3.1-pro-preview", + "modelKey": "google/gemini-3.1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "google/gemini-3.1-pro-preview", + "modelKey": "google/gemini-3.1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "google/gemini-3.1-pro-preview", + "modelKey": "google/gemini-3.1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/gemini-3.1-pro-preview", + "modelKey": "google/gemini-3.1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2025-11-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vivgrid", + "providerName": "Vivgrid", + "providerApi": "https://api.vivgrid.com/v1", + "providerDoc": "https://docs.vivgrid.com/models", + "model": "gemini-3.1-pro-preview", + "modelKey": "gemini-3.1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "google/gemini-3.1-pro-preview", + "modelKey": "google/gemini-3.1-pro-preview", + "displayName": "Gemini 3.1 Pro Preview", + "metadata": { + "knowledgeCutoff": "2026-02-19", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-3.1-pro-preview", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/models#gemini-3.1-pro-preview", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/google/gemini-3.1-pro-preview", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/google/gemini-3.1-pro-preview" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-3.1-pro-preview", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#gemini-models", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai", + "model": "vertex_ai/gemini-3.1-pro-preview", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#gemini-models", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemini-3.1-pro-preview", + "displayName": "Google: Gemini 3.1 Pro Preview", + "metadata": { + "canonicalSlug": "google/gemini-3.1-pro-preview-20260219", + "createdAt": "2026-02-19T14:00:27.000Z", + "links": { + "details": "/api/v1/models/google/gemini-3.1-pro-preview-20260219/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "high", + "medium", + "low" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-3.1-pro-preview-customtools", + "provider": "google", + "model": "gemini-3.1-pro-preview-customtools", + "displayName": "Gemini 3.1 Pro Preview Custom Tools", + "family": "gemini-pro", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "aihubmix", + "gemini", + "google", + "google-vertex", + "kilo", + "merge-gateway", + "nano-gpt", + "openrouter", + "orcarouter", + "vertex_ai", + "vertex_ai-language-models" + ], + "aliases": [ + "aihubmix/gemini-3.1-pro-preview-customtools", + "gemini/gemini-3.1-pro-preview-customtools", + "google-vertex/gemini-3.1-pro-preview-customtools", + "google/gemini-3.1-pro-preview-customtools", + "kilo/google/gemini-3.1-pro-preview-customtools", + "merge-gateway/google/gemini-3.1-pro-preview-customtools", + "nano-gpt/google/gemini-3.1-pro-preview-customtools", + "openrouter/google/gemini-3.1-pro-preview-customtools", + "orcarouter/google/gemini-3.1-pro-preview-customtools", + "vertex_ai-language-models/gemini-3.1-pro-preview-customtools", + "vertex_ai/gemini-3.1-pro-preview-customtools" + ], + "mergedProviderModelRecords": 11, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 65536, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStreaming": true, + "promptCaching": true, + "rerank": false, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "transcription": false, + "urlContext": true, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "gemini-3.1-pro-preview-customtools", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "gemini-3.1-pro-preview-customtools", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "google", + "model": "gemini-3.1-pro-preview-customtools", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemini-3.1-pro-preview-customtools", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 12, + "reasoningOutput": 12 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "google/gemini-3.1-pro-preview-customtools", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "google/gemini-3.1-pro-preview-customtools", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemini-3.1-pro-preview-customtools", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0.375, + "input": 2, + "output": 12, + "reasoningOutput": 12 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "google/gemini-3.1-pro-preview-customtools", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 4, + "output": 18 + }, + "tiered": { + "contextOver200K": { + "input": 4, + "output": 18, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 4, + "output": 18, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-3.1-pro-preview-customtools", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 4e-7, + "input_cost_per_token_above_200k_tokens": 0.000004, + "input_cost_per_token_batches": 0.000001, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_200k_tokens": 0.000018, + "output_cost_per_token_batches": 0.000006, + "input_cost_per_token_priority": 0.0000036, + "input_cost_per_token_above_200k_tokens_priority": 0.0000072, + "output_cost_per_token_priority": 0.0000216, + "output_cost_per_token_above_200k_tokens_priority": 0.0000324, + "cache_read_input_token_cost_priority": 3.6e-7, + "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-3.1-pro-preview-customtools", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "perImage": { + "output": 0.00012 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 4e-7, + "cache_creation_input_token_cost_above_200k_tokens": 2.5e-7, + "input_cost_per_token_above_200k_tokens": 0.000004, + "input_cost_per_token_batches": 0.000001, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_200k_tokens": 0.000018, + "output_cost_per_token_batches": 0.000006 + } + }, + { + "source": "litellm", + "provider": "vertex_ai", + "model": "vertex_ai/gemini-3.1-pro-preview-customtools", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + }, + "perImage": { + "output": 0.00012 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 4e-7, + "cache_creation_input_token_cost_above_200k_tokens": 2.5e-7, + "input_cost_per_token_above_200k_tokens": 0.000004, + "input_cost_per_token_batches": 0.000001, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_200k_tokens": 0.000018, + "output_cost_per_token_batches": 0.000006, + "input_cost_per_token_priority": 0.0000036, + "input_cost_per_token_above_200k_tokens_priority": 0.0000072, + "output_cost_per_token_priority": 0.0000216, + "output_cost_per_token_above_200k_tokens_priority": 0.0000324, + "cache_read_input_token_cost_priority": 3.6e-7, + "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-7 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemini-3.1-pro-preview-customtools", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0.375, + "input": 2, + "internalReasoning": 12, + "output": 12 + }, + "other": { + "audio": 0.000002, + "image": 0.000002, + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3.1 Pro (Preview Custom Tools)", + "Gemini 3.1 Pro Preview Custom Tools", + "Google: Gemini 3.1 Pro Preview Custom Tools" + ], + "families": [ + "gemini-pro" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-02-19", + "lastUpdated": "2026-02-19", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 11 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "gemini-3.1-pro-preview-customtools", + "modelKey": "gemini-3.1-pro-preview-customtools", + "displayName": "Gemini 3.1 Pro Preview Custom Tools", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "gemini-3.1-pro-preview-customtools", + "modelKey": "gemini-3.1-pro-preview-customtools", + "displayName": "Gemini 3.1 Pro Preview Custom Tools", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-3.1-pro-preview-customtools", + "modelKey": "gemini-3.1-pro-preview-customtools", + "displayName": "Gemini 3.1 Pro Preview Custom Tools", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemini-3.1-pro-preview-customtools", + "modelKey": "google/gemini-3.1-pro-preview-customtools", + "displayName": "Google: Gemini 3.1 Pro Preview Custom Tools", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-02-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "google/gemini-3.1-pro-preview-customtools", + "modelKey": "google/gemini-3.1-pro-preview-customtools", + "displayName": "Gemini 3.1 Pro Preview Custom Tools", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "google/gemini-3.1-pro-preview-customtools", + "modelKey": "google/gemini-3.1-pro-preview-customtools", + "displayName": "Gemini 3.1 Pro (Preview Custom Tools)", + "metadata": { + "lastUpdated": "2026-02-27", + "openWeights": false, + "releaseDate": "2026-02-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemini-3.1-pro-preview-customtools", + "modelKey": "google/gemini-3.1-pro-preview-customtools", + "displayName": "Gemini 3.1 Pro Preview Custom Tools", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "google/gemini-3.1-pro-preview-customtools", + "modelKey": "google/gemini-3.1-pro-preview-customtools", + "displayName": "Gemini 3.1 Pro Preview Custom Tools", + "family": "gemini-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-02-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-3.1-pro-preview-customtools", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/models#gemini-3.1-pro-preview", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-3.1-pro-preview-customtools", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#gemini-models", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai", + "model": "vertex_ai/gemini-3.1-pro-preview-customtools", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#gemini-models", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemini-3.1-pro-preview-customtools", + "displayName": "Google: Gemini 3.1 Pro Preview Custom Tools", + "metadata": { + "canonicalSlug": "google/gemini-3.1-pro-preview-customtools-20260219", + "createdAt": "2026-02-25T18:58:43.000Z", + "links": { + "details": "/api/v1/models/google/gemini-3.1-pro-preview-customtools-20260219/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "high", + "medium", + "low" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-3.1-pro-preview-high", + "provider": "google", + "model": "gemini-3.1-pro-preview-high", + "displayName": "Gemini 3.1 Pro (Preview High)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/google/gemini-3.1-pro-preview-high" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "google/gemini-3.1-pro-preview-high", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3.1 Pro (Preview High)" + ], + "releaseDate": "2026-02-21", + "lastUpdated": "2026-02-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "google/gemini-3.1-pro-preview-high", + "modelKey": "google/gemini-3.1-pro-preview-high", + "displayName": "Gemini 3.1 Pro (Preview High)", + "metadata": { + "lastUpdated": "2026-02-21", + "openWeights": false, + "releaseDate": "2026-02-21" + } + } + ] + }, + { + "id": "google/gemini-3.1-pro-preview-low", + "provider": "google", + "model": "gemini-3.1-pro-preview-low", + "displayName": "Gemini 3.1 Pro (Preview Low)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/google/gemini-3.1-pro-preview-low" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "google/gemini-3.1-pro-preview-low", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3.1 Pro (Preview Low)" + ], + "releaseDate": "2026-02-21", + "lastUpdated": "2026-02-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "google/gemini-3.1-pro-preview-low", + "modelKey": "google/gemini-3.1-pro-preview-low", + "displayName": "Gemini 3.1 Pro (Preview Low)", + "metadata": { + "lastUpdated": "2026-02-21", + "openWeights": false, + "releaseDate": "2026-02-21" + } + } + ] + }, + { + "id": "google/gemini-3.5-flash", + "provider": "google", + "model": "gemini-3.5-flash", + "displayName": "Gemini 3.5 Flash", + "family": "gemini-flash", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "fastrouter", + "gemini", + "github-copilot", + "google", + "google-vertex", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "opencode", + "openrouter", + "poe", + "vercel", + "vertex_ai", + "vertex_ai-language-models", + "zenmux" + ], + "aliases": [ + "fastrouter/google/gemini-3.5-flash", + "gemini/gemini-3.5-flash", + "github-copilot/gemini-3.5-flash", + "google-vertex/gemini-3.5-flash", + "google/gemini-3.5-flash", + "kilo/google/gemini-3.5-flash", + "llmgateway/gemini-3.5-flash", + "merge-gateway/google/gemini-3.5-flash", + "nano-gpt/google/gemini-3.5-flash", + "nearai/google/gemini-3.5-flash", + "opencode/gemini-3.5-flash", + "openrouter/google/gemini-3.5-flash", + "poe/google/gemini-3.5-flash", + "vercel/google/gemini-3.5-flash", + "vertex_ai-language-models/gemini-3.5-flash", + "vertex_ai/gemini-3.5-flash", + "zenmux/google/gemini-3.5-flash" + ], + "mergedProviderModelRecords": 17, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 65535, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStreaming": true, + "promptCaching": true, + "rerank": false, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "transcription": false, + "urlContext": true, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fastrouter", + "model": "google/gemini-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "github-copilot", + "model": "gemini-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "inputAudio": 1.5, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "google-vertex", + "model": "gemini-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "inputAudio": 1.5, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "google", + "model": "gemini-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "inputAudio": 1.5, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemini-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "cacheWrite": 0.08333, + "input": 1.5, + "output": 9, + "reasoningOutput": 9 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gemini-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "inputAudio": 1.5, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "google/gemini-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "inputAudio": 1.5, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "google/gemini-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "google/gemini-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "inputAudio": 1.5, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gemini-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "inputAudio": 1.5, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemini-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "cacheWrite": 0.083333, + "input": 1.5, + "output": 9, + "reasoningOutput": 9 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "google/gemini-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1515, + "input": 1.5152, + "output": 9.0909 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "google/gemini-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "google/gemini-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "output": 9 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-3.5-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "inputAudio": 1, + "output": 9, + "reasoningOutput": 9 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "input_cost_per_token_priority": 0.0000027, + "input_cost_per_audio_token_priority": 0.0000018, + "output_cost_per_token_priority": 0.0000162, + "cache_read_input_token_cost_priority": 2.7e-7 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-3.5-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "inputAudio": 1, + "output": 9, + "reasoningOutput": 9 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "input_cost_per_token_priority": 0.0000027, + "input_cost_per_audio_token_priority": 0.0000018, + "output_cost_per_token_priority": 0.0000162, + "cache_read_input_token_cost_priority": 2.7e-7 + } + }, + { + "source": "litellm", + "provider": "vertex_ai", + "model": "vertex_ai/gemini-3.5-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "inputAudio": 1, + "output": 9, + "reasoningOutput": 9 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "input_cost_per_token_priority": 0.0000027, + "input_cost_per_audio_token_priority": 0.0000018, + "output_cost_per_token_priority": 0.0000162, + "cache_read_input_token_cost_priority": 2.7e-7 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemini-3.5-flash", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "cacheWrite": 0.0833333333333, + "input": 1.5, + "internalReasoning": 9, + "output": 9 + }, + "other": { + "audio": 0.000003, + "image": 0.0000015, + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3.5 Flash", + "Gemini-3.5-Flash", + "Google: Gemini 3.5 Flash" + ], + "families": [ + "gemini", + "gemini-flash" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-05-19", + "lastUpdated": "2026-05-19", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 17 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "google/gemini-3.5-flash", + "modelKey": "google/gemini-3.5-flash", + "displayName": "Gemini 3.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "gemini-3.5-flash", + "modelKey": "gemini-3.5-flash", + "displayName": "Gemini 3.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + }, + { + "type": "budget_tokens", + "min": 256, + "max": 24000 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "gemini-3.5-flash", + "modelKey": "gemini-3.5-flash", + "displayName": "Gemini 3.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-3.5-flash", + "modelKey": "gemini-3.5-flash", + "displayName": "Gemini 3.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemini-3.5-flash", + "modelKey": "google/gemini-3.5-flash", + "displayName": "Google: Gemini 3.5 Flash", + "metadata": { + "lastUpdated": "2026-05-27", + "openWeights": false, + "releaseDate": "2026-05-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gemini-3.5-flash", + "modelKey": "gemini-3.5-flash", + "displayName": "Gemini 3.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "google/gemini-3.5-flash", + "modelKey": "google/gemini-3.5-flash", + "displayName": "Gemini 3.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "google/gemini-3.5-flash", + "modelKey": "google/gemini-3.5-flash", + "displayName": "Gemini 3.5 Flash", + "metadata": { + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "google/gemini-3.5-flash", + "modelKey": "google/gemini-3.5-flash", + "displayName": "Gemini 3.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gemini-3.5-flash", + "modelKey": "gemini-3.5-flash", + "displayName": "Gemini 3.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemini-3.5-flash", + "modelKey": "google/gemini-3.5-flash", + "displayName": "Gemini 3.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/gemini-3.5-flash", + "modelKey": "google/gemini-3.5-flash", + "displayName": "Gemini-3.5-Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/gemini-3.5-flash", + "modelKey": "google/gemini-3.5-flash", + "displayName": "Gemini 3.5 Flash", + "family": "gemini", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "google/gemini-3.5-flash", + "modelKey": "google/gemini-3.5-flash", + "displayName": "Gemini 3.5 Flash", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-3.5-flash", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/pricing/gemini-3", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-3.5-flash", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/pricing/gemini-3", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai", + "model": "vertex_ai/gemini-3.5-flash", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemini-3.5-flash", + "displayName": "Google: Gemini 3.5 Flash", + "metadata": { + "canonicalSlug": "google/gemini-3.5-flash-20260519", + "createdAt": "2026-05-19T12:30:00.000Z", + "knowledgeCutoff": "2025-01-01", + "links": { + "details": "/api/v1/models/google/gemini-3.5-flash-20260519/endpoints" + }, + "reasoning": { + "mandatory": true, + "default_enabled": true, + "supported_efforts": [ + "high", + "medium", + "low", + "minimal" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-3.5-flash-thinking", + "provider": "google", + "model": "gemini-3.5-flash-thinking", + "displayName": "Gemini 3.5 Flash Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/google/gemini-3.5-flash-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "google/gemini-3.5-flash-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "output": 9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 3.5 Flash Thinking" + ], + "releaseDate": "2026-05-19", + "lastUpdated": "2026-05-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "google/gemini-3.5-flash-thinking", + "modelKey": "google/gemini-3.5-flash-thinking", + "displayName": "Gemini 3.5 Flash Thinking", + "metadata": { + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-19" + } + } + ] + }, + { + "id": "google/gemini-deep-research", + "provider": "google", + "model": "gemini-deep-research", + "displayName": "gemini-deep-research", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/google/gemini-deep-research" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 0, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "google/gemini-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.6, + "output": 9.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gemini-deep-research" + ], + "statuses": [ + "deprecated" + ], + "releaseDate": "2025-12-11", + "lastUpdated": "2025-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/gemini-deep-research", + "modelKey": "google/gemini-deep-research", + "displayName": "gemini-deep-research", + "status": "deprecated", + "metadata": { + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + } + ] + }, + { + "id": "google/gemini-embedding-001", + "provider": "google", + "model": "gemini-embedding-001", + "displayName": "Gemini Embedding 001", + "family": "gemini", + "mode": "embedding", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "gemini", + "google", + "google-vertex", + "vercel", + "vercel_ai_gateway", + "vertex_ai-embedding-models" + ], + "aliases": [ + "gemini/gemini-embedding-001", + "google-vertex/gemini-embedding-001", + "google/gemini-embedding-001", + "vercel/google/gemini-embedding-001", + "vercel_ai_gateway/google/gemini-embedding-001", + "vertex_ai-embedding-models/gemini-embedding-001" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 8192, + "inputTokens": 2048, + "maxTokens": 2048, + "outputTokens": 2048, + "outputVectorSize": 3072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding", + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex", + "model": "gemini-embedding-001", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "google", + "model": "gemini-embedding-001", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-embedding-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/google/gemini-embedding-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-embedding-models", + "model": "gemini-embedding-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini Embedding 001" + ], + "families": [ + "gemini", + "gemini-embedding" + ], + "modes": [ + "embedding" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2025-05-20", + "lastUpdated": "2025-05-20", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "gemini-embedding-001", + "modelKey": "gemini-embedding-001", + "displayName": "Gemini Embedding 001", + "family": "gemini", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-05-20", + "openWeights": false, + "releaseDate": "2025-05-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-embedding-001", + "modelKey": "gemini-embedding-001", + "displayName": "Gemini Embedding 001", + "family": "gemini", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-05-20", + "openWeights": false, + "releaseDate": "2025-05-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/gemini-embedding-001", + "modelKey": "google/gemini-embedding-001", + "displayName": "Gemini Embedding 001", + "family": "gemini-embedding", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-05-20", + "openWeights": false, + "releaseDate": "2025-05-20" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-embedding-001", + "mode": "embedding", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/embeddings#model-versions" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/google/gemini-embedding-001", + "mode": "embedding" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-embedding-models", + "model": "gemini-embedding-001", + "mode": "embedding", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models" + } + } + ] + }, + { + "id": "google/gemini-embedding-2", + "provider": "google", + "model": "gemini-embedding-2", + "displayName": "Gemini Embedding 2", + "family": "gemini-embedding", + "mode": "embedding", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "gemini", + "vercel", + "vertex_ai", + "vertex_ai-embedding-models" + ], + "aliases": [ + "gemini/gemini-embedding-2", + "vercel/google/gemini-embedding-2", + "vertex_ai-embedding-models/gemini-embedding-2", + "vertex_ai/gemini-embedding-2" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "outputVectorSize": 3072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "embedding", + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "multimodal": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": true, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-embedding-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0 + }, + "perImage": { + "input": 0.00012 + }, + "perAudioSecond": { + "input": 0.00016 + }, + "perVideoSecond": { + "input": 0.00079 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-embedding-models", + "model": "gemini-embedding-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0 + }, + "perImage": { + "input": 0.00012 + }, + "perAudioSecond": { + "input": 0.00016 + }, + "perVideoSecond": { + "input": 0.00079 + } + }, + { + "source": "litellm", + "provider": "vertex_ai", + "model": "vertex_ai/gemini-embedding-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0 + }, + "perImage": { + "input": 0.00012 + }, + "perAudioSecond": { + "input": 0.00016 + }, + "perVideoSecond": { + "input": 0.00079 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini Embedding 2" + ], + "families": [ + "gemini-embedding" + ], + "modes": [ + "embedding" + ], + "releaseDate": "2026-03-10", + "lastUpdated": "2026-03-23", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/gemini-embedding-2", + "modelKey": "google/gemini-embedding-2", + "displayName": "Gemini Embedding 2", + "family": "gemini-embedding", + "metadata": { + "lastUpdated": "2026-03-23", + "openWeights": false, + "releaseDate": "2026-03-10" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-embedding-2", + "mode": "embedding", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-embedding-models", + "model": "gemini-embedding-2", + "mode": "embedding", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai", + "model": "vertex_ai/gemini-embedding-2", + "mode": "embedding", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + } + ] + }, + { + "id": "google/gemini-embedding-2-preview", + "provider": "google", + "model": "gemini-embedding-2-preview", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "gemini", + "vertex_ai", + "vertex_ai-embedding-models" + ], + "aliases": [ + "gemini/gemini-embedding-2-preview", + "vertex_ai-embedding-models/gemini-embedding-2-preview", + "vertex_ai/gemini-embedding-2-preview" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "outputVectorSize": 3072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "multimodal": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-embedding-2-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0 + }, + "perImage": { + "input": 0.00012 + }, + "perAudioSecond": { + "input": 0.00016 + }, + "perVideoSecond": { + "input": 0.00079 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-embedding-models", + "model": "gemini-embedding-2-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0 + }, + "perImage": { + "input": 0.00012 + }, + "perAudioSecond": { + "input": 0.00016 + }, + "perVideoSecond": { + "input": 0.00079 + } + }, + { + "source": "litellm", + "provider": "vertex_ai", + "model": "vertex_ai/gemini-embedding-2-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0 + }, + "perImage": { + "input": 0.00012 + }, + "perAudioSecond": { + "input": 0.00016 + }, + "perVideoSecond": { + "input": 0.00079 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-embedding-2-preview", + "mode": "embedding", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-embedding-models", + "model": "gemini-embedding-2-preview", + "mode": "embedding", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai", + "model": "vertex_ai/gemini-embedding-2-preview", + "mode": "embedding", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + } + ] + }, + { + "id": "google/gemini-exp-1114", + "provider": "google", + "model": "gemini-exp-1114", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gemini" + ], + "aliases": [ + "gemini/gemini-exp-1114" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 8192, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-exp-1114", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "extra": { + "input_cost_per_token_above_128k_tokens": 0, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_128k_tokens": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-exp-1114", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Rate limits not documented for gemini-exp-1114. Assuming same as gemini-1.5-pro.", + "supports_tool_choice": true + }, + "source": "https://ai.google.dev/pricing" + } + } + ] + }, + { + "id": "google/gemini-exp-1206", + "provider": "google", + "model": "gemini-exp-1206", + "displayName": "Gemini 2.0 Pro 1206", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "gemini", + "nano-gpt" + ], + "aliases": [ + "gemini/gemini-exp-1206", + "nano-gpt/gemini-exp-1206" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 2097152, + "inputTokens": 2097152, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 65535, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65535, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "urlContext": true, + "vision": true, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemini-exp-1206", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.258, + "output": 4.998 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini-exp-1206", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "inputAudio": 1, + "output": 2.5, + "reasoningOutput": 2.5 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-exp-1206", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "extra": { + "input_cost_per_token_above_128k_tokens": 0, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_128k_tokens": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 2.0 Pro 1206" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-12-06", + "lastUpdated": "2024-12-06", + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemini-exp-1206", + "modelKey": "gemini-exp-1206", + "displayName": "Gemini 2.0 Pro 1206", + "metadata": { + "lastUpdated": "2024-12-06", + "openWeights": false, + "releaseDate": "2024-12-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini-exp-1206", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash-preview", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-exp-1206", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Rate limits not documented for gemini-exp-1206. Assuming same as gemini-1.5-pro.", + "supports_tool_choice": true + }, + "source": "https://ai.google.dev/pricing" + } + } + ] + }, + { + "id": "google/gemini-flash-1.5", + "provider": "google", + "model": "gemini-flash-1.5", + "displayName": "Gemini 1.5 Flash", + "family": "gemini-flash", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/google/gemini-flash-1.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "google/gemini-flash-1.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0748, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini 1.5 Flash" + ], + "families": [ + "gemini-flash" + ], + "releaseDate": "2024-05-14", + "lastUpdated": "2024-05-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "google/gemini-flash-1.5", + "modelKey": "google/gemini-flash-1.5", + "displayName": "Gemini 1.5 Flash", + "family": "gemini-flash", + "metadata": { + "lastUpdated": "2024-05-14", + "openWeights": false, + "releaseDate": "2024-05-14" + } + } + ] + }, + { + "id": "google/gemini-flash-experimental", + "provider": "google", + "model": "gemini-flash-experimental", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-language-models" + ], + "aliases": [ + "vertex_ai-language-models/gemini-flash-experimental" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 8192, + "outputTokens": 8192, + "outputVectorSize": 3072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-flash-experimental", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perCharacter": { + "input": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-flash-experimental", + "mode": "embedding", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + } + ] + }, + { + "id": "google/gemini-flash-latest", + "provider": "google", + "model": "gemini-flash-latest", + "displayName": "Gemini Flash Latest", + "family": "gemini-flash", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "gemini", + "google", + "google-vertex", + "kilo", + "merge-gateway", + "nano-gpt", + "openrouter", + "orcarouter" + ], + "aliases": [ + "gemini/gemini-flash-latest", + "google-vertex/gemini-flash-latest", + "google/gemini-flash-latest", + "kilo/~google/gemini-flash-latest", + "merge-gateway/google/gemini-flash-latest", + "nano-gpt/google/gemini-flash-latest", + "openrouter/~google/gemini-flash-latest", + "orcarouter/google/gemini-flash-latest" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 65535, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "urlContext": true, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex", + "model": "gemini-flash-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "cacheWrite": 0.383, + "input": 0.3, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "google", + "model": "gemini-flash-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "~google/gemini-flash-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.08333333333333334, + "input": 0.5, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "google/gemini-flash-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3, + "inputAudio": 1, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "google/gemini-flash-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "~google/gemini-flash-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "cacheWrite": 0.083333, + "input": 1.5, + "output": 9, + "reasoningOutput": 9 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "google/gemini-flash-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.5, + "inputAudio": 1, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini-flash-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "inputAudio": 1, + "output": 2.5, + "reasoningOutput": 2.5 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-flash-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3, + "inputAudio": 1, + "output": 2.5, + "reasoningOutput": 2.5 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "~google/gemini-flash-latest", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "cacheWrite": 0.0833333333333, + "input": 1.5, + "internalReasoning": 9, + "output": 9 + }, + "other": { + "audio": 0.000003, + "image": 0.0000015, + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini Flash Latest", + "Google Gemini Flash Latest", + "Google: Gemini Flash Latest" + ], + "families": [ + "gemini-flash" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-09-25", + "lastUpdated": "2025-09-25", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "gemini-flash-latest", + "modelKey": "gemini-flash-latest", + "displayName": "Gemini Flash Latest", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-flash-latest", + "modelKey": "gemini-flash-latest", + "displayName": "Gemini Flash Latest", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 0, + "max": 24576 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "~google/gemini-flash-latest", + "modelKey": "~google/gemini-flash-latest", + "displayName": "Google: Gemini Flash Latest", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "google/gemini-flash-latest", + "modelKey": "google/gemini-flash-latest", + "displayName": "Gemini Flash Latest", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "google/gemini-flash-latest", + "modelKey": "google/gemini-flash-latest", + "displayName": "Gemini Flash Latest", + "metadata": { + "lastUpdated": "2026-03-29", + "openWeights": false, + "releaseDate": "2026-03-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "~google/gemini-flash-latest", + "modelKey": "~google/gemini-flash-latest", + "displayName": "Google Gemini Flash Latest", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-04-27", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "google/gemini-flash-latest", + "modelKey": "google/gemini-flash-latest", + "displayName": "Gemini Flash Latest", + "family": "gemini-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini-flash-latest", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash-preview", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-flash-latest", + "mode": "chat", + "metadata": { + "source": "https://developers.googleblog.com/en/continuing-to-bring-you-our-latest-models-with-an-improved-gemini-2-5-flash-and-flash-lite-release/", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "~google/gemini-flash-latest", + "displayName": "Google Gemini Flash Latest", + "metadata": { + "canonicalSlug": "~google/gemini-flash-latest", + "createdAt": "2026-04-27T19:33:18.000Z", + "knowledgeCutoff": "2025-01-01", + "links": { + "details": "/api/v1/models/~google/gemini-flash-latest/endpoints" + }, + "reasoning": { + "mandatory": true, + "default_enabled": true, + "supported_efforts": [ + "high", + "medium", + "low", + "minimal" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Router", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-flash-lite-latest", + "provider": "google", + "model": "gemini-flash-lite-latest", + "displayName": "Gemini Flash-Lite Latest", + "family": "gemini-flash-lite", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "gemini", + "google", + "google-vertex", + "merge-gateway", + "nano-gpt", + "orcarouter" + ], + "aliases": [ + "gemini/gemini-flash-lite-latest", + "google-vertex/gemini-flash-lite-latest", + "google/gemini-flash-lite-latest", + "merge-gateway/google/gemini-flash-lite-latest", + "nano-gpt/google/gemini-flash-lite-latest", + "orcarouter/google/gemini-flash-lite-latest" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 65535, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "urlContext": true, + "vision": true, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex", + "model": "gemini-flash-lite-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "google", + "model": "gemini-flash-lite-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "google/gemini-flash-lite-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "google/gemini-flash-lite-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "google/gemini-flash-lite-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini-flash-lite-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "inputAudio": 0.3, + "output": 0.4, + "reasoningOutput": 0.4 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-flash-lite-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "inputAudio": 0.3, + "output": 0.4, + "reasoningOutput": 0.4 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini Flash Lite Latest", + "Gemini Flash-Lite Latest" + ], + "families": [ + "gemini-flash-lite" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-09-25", + "lastUpdated": "2025-09-25", + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "gemini-flash-lite-latest", + "modelKey": "gemini-flash-lite-latest", + "displayName": "Gemini Flash-Lite Latest", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemini-flash-lite-latest", + "modelKey": "gemini-flash-lite-latest", + "displayName": "Gemini Flash-Lite Latest", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 512, + "max": 24576 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "google/gemini-flash-lite-latest", + "modelKey": "google/gemini-flash-lite-latest", + "displayName": "Gemini Flash-Lite Latest", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "google/gemini-flash-lite-latest", + "modelKey": "google/gemini-flash-lite-latest", + "displayName": "Gemini Flash Lite Latest", + "metadata": { + "lastUpdated": "2026-03-29", + "openWeights": false, + "releaseDate": "2026-03-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "google/gemini-flash-lite-latest", + "modelKey": "google/gemini-flash-lite-latest", + "displayName": "Gemini Flash-Lite Latest", + "family": "gemini-flash-lite", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini-flash-lite-latest", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash-lite", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-flash-lite-latest", + "mode": "chat", + "metadata": { + "source": "https://developers.googleblog.com/en/continuing-to-bring-you-our-latest-models-with-an-improved-gemini-2-5-flash-and-flash-lite-release/", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + } + ] + }, + { + "id": "google/gemini-gemma-2-27b-it", + "provider": "google", + "model": "gemini-gemma-2-27b-it", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gemini" + ], + "aliases": [ + "gemini/gemini-gemma-2-27b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-gemma-2-27b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.35, + "output": 1.05 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-gemma-2-27b-it", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models" + } + } + ] + }, + { + "id": "google/gemini-gemma-2-9b-it", + "provider": "google", + "model": "gemini-gemma-2-9b-it", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gemini" + ], + "aliases": [ + "gemini/gemini-gemma-2-9b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-gemma-2-9b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.35, + "output": 1.05 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-gemma-2-9b-it", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models" + } + } + ] + }, + { + "id": "google/gemini-live-2.5-flash-preview-native-audio-09-2025", + "provider": "google", + "model": "gemini-live-2.5-flash-preview-native-audio-09-2025", + "mode": "realtime", + "sources": [ + "litellm" + ], + "providers": [ + "gemini", + "vertex_ai-language-models" + ], + "aliases": [ + "gemini/gemini-live-2.5-flash-preview-native-audio-09-2025", + "vertex_ai-language-models/gemini-live-2.5-flash-preview-native-audio-09-2025" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 65535, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65535, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "urlContext": true, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-live-2.5-flash-preview-native-audio-09-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3, + "inputAudio": 3, + "output": 2, + "outputAudio": 12 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-live-2.5-flash-preview-native-audio-09-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3, + "inputAudio": 3, + "output": 2, + "outputAudio": 12 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10 + } + } + ] + }, + "metadata": { + "modes": [ + "realtime" + ], + "supportedEndpoints": [ + "/v1/realtime", + "/vertex_ai/live" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-live-2.5-flash-preview-native-audio-09-2025", + "mode": "realtime", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing", + "supportedEndpoints": [ + "/v1/realtime" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-live-2.5-flash-preview-native-audio-09-2025", + "mode": "realtime", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing", + "supportedEndpoints": [ + "/vertex_ai/live" + ] + } + } + ] + }, + { + "id": "google/gemini-pro-latest", + "provider": "google", + "model": "gemini-pro-latest", + "displayName": "Google: Gemini Pro Latest", + "family": "gemini", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "gemini", + "kilo", + "llmgateway", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "gemini/gemini-pro-latest", + "kilo/~google/gemini-pro-latest", + "llmgateway/gemini-pro-latest", + "nano-gpt/google/gemini-pro-latest", + "openrouter/~google/gemini-pro-latest" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "maxAudioLengthHours": 8.4, + "maxAudioPerPrompt": 1, + "maxImagesPerPrompt": 3000, + "maxPdfSizeMB": 30, + "maxTokens": 65535, + "maxVideoLength": 1, + "maxVideosPerPrompt": 10, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "~google/gemini-pro-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0.375, + "input": 2, + "output": 12 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gemini-pro-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "google/gemini-pro-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "~google/gemini-pro-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0.375, + "input": 2, + "output": 12, + "reasoningOutput": 12 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini-pro-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 2.5e-7, + "input_cost_per_token_above_200k_tokens": 0.0000025, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_200k_tokens": 0.000015 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-pro-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 2.5e-7, + "input_cost_per_token_above_200k_tokens": 0.0000025, + "max_audio_per_prompt": 1, + "max_images_per_prompt": 3000, + "max_videos_per_prompt": 10, + "output_cost_per_token_above_200k_tokens": 0.000015 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "~google/gemini-pro-latest", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0.375, + "input": 2, + "internalReasoning": 12, + "output": 12 + }, + "other": { + "audio": 0.000002, + "image": 0.000002, + "webSearch": 0.014 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini Pro Latest", + "Google Gemini Pro Latest", + "Google: Gemini Pro Latest" + ], + "families": [ + "gemini", + "gemini-pro" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-04-27", + "lastUpdated": "2026-05-01", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "~google/gemini-pro-latest", + "modelKey": "~google/gemini-pro-latest", + "displayName": "Google: Gemini Pro Latest", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gemini-pro-latest", + "modelKey": "gemini-pro-latest", + "displayName": "Gemini Pro Latest", + "family": "gemini", + "metadata": { + "lastUpdated": "2026-02-27", + "openWeights": false, + "releaseDate": "2026-02-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "google/gemini-pro-latest", + "modelKey": "google/gemini-pro-latest", + "displayName": "Gemini Pro Latest", + "metadata": { + "lastUpdated": "2026-03-29", + "openWeights": false, + "releaseDate": "2026-03-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "~google/gemini-pro-latest", + "modelKey": "~google/gemini-pro-latest", + "displayName": "Google Gemini Pro Latest", + "family": "gemini-pro", + "metadata": { + "lastUpdated": "2026-04-27", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini-pro-latest", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-pro-latest", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "~google/gemini-pro-latest", + "displayName": "Google Gemini Pro Latest", + "metadata": { + "canonicalSlug": "~google/gemini-pro-latest", + "createdAt": "2026-04-27T19:34:11.000Z", + "links": { + "details": "/api/v1/models/~google/gemini-pro-latest/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "high", + "medium", + "low" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Router", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemini-robotics-er-1.5-preview", + "provider": "google", + "model": "gemini-robotics-er-1.5-preview", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gemini", + "vertex_ai-language-models" + ], + "aliases": [ + "gemini/gemini-robotics-er-1.5-preview", + "vertex_ai-language-models/gemini-robotics-er-1.5-preview" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxTokens": 65535, + "outputTokens": 65535, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "urlContext": true, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemini-robotics-er-1.5-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0, + "input": 0.3, + "inputAudio": 1, + "output": 2.5, + "reasoningOutput": 2.5 + }, + "searchContextPerQuery": { + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "gemini-robotics-er-1.5-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0, + "input": 0.3, + "inputAudio": 1, + "output": 2.5, + "reasoningOutput": 2.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemini-robotics-er-1.5-preview", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/models#gemini-robotics-er-1-5-preview", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "gemini-robotics-er-1.5-preview", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/models#gemini-robotics-er-1-5-preview", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions" + ] + } + } + ] + }, + { + "id": "google/gemma-2-27b-it", + "provider": "google", + "model": "gemma-2-27b-it", + "displayName": "Google: Gemma 2 27B", + "family": "gemma", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/google/gemma-2-27b-it", + "openrouter/google/gemma-2-27b-it" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 8192, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemma-2-27b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.65, + "output": 0.65 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemma-2-27b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.65, + "output": 0.65 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemma-2-27b-it", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.65, + "output": 0.65 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 2 27B", + "Google: Gemma 2 27B" + ], + "families": [ + "gemma" + ], + "knowledgeCutoff": "2024-06-30", + "releaseDate": "2024-06-24", + "lastUpdated": "2024-06-24", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_p" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemma-2-27b-it", + "modelKey": "google/gemma-2-27b-it", + "displayName": "Google: Gemma 2 27B", + "metadata": { + "lastUpdated": "2024-06-24", + "openWeights": true, + "releaseDate": "2024-06-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemma-2-27b-it", + "modelKey": "google/gemma-2-27b-it", + "displayName": "Gemma 2 27B", + "family": "gemma", + "metadata": { + "knowledgeCutoff": "2024-06-30", + "lastUpdated": "2024-07-13", + "openWeights": true, + "releaseDate": "2024-07-13" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemma-2-27b-it", + "displayName": "Google: Gemma 2 27B", + "metadata": { + "canonicalSlug": "google/gemma-2-27b-it", + "createdAt": "2024-07-13T00:00:00.000Z", + "huggingFaceId": "google/gemma-2-27b-it", + "instructType": "gemma", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/google/gemma-2-27b-it/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 8192, + "max_completion_tokens": 2048, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemma-2-2b-it", + "provider": "google", + "model": "gemma-2-2b-it", + "displayName": "Gemma 2 2b It", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/google/gemma-2-2b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "google/gemma-2-2b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 2 2b It" + ], + "releaseDate": "2024-07-16", + "lastUpdated": "2024-07-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "google/gemma-2-2b-it", + "modelKey": "google/gemma-2-2b-it", + "displayName": "Gemma 2 2b It", + "metadata": { + "lastUpdated": "2024-07-16", + "openWeights": true, + "releaseDate": "2024-07-16" + } + } + ] + }, + { + "id": "google/gemma-2-9b", + "provider": "google", + "model": "gemma-2-9b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vercel_ai_gateway" + ], + "aliases": [ + "vercel_ai_gateway/google/gemma-2-9b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/google/gemma-2-9b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/google/gemma-2-9b", + "mode": "chat" + } + ] + }, + { + "id": "google/gemma-3", + "provider": "google", + "model": "gemma-3", + "displayName": "Google Gemma 3", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "inference" + ], + "aliases": [ + "inference/google/gemma-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 125000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "inference", + "model": "google/gemma-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Google Gemma 3" + ], + "families": [ + "gemma" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "inference", + "providerName": "Inference", + "providerApi": "https://inference.net/v1", + "providerDoc": "https://inference.net/models", + "model": "google/gemma-3", + "modelKey": "google/gemma-3", + "displayName": "Google Gemma 3", + "family": "gemma", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-01", + "openWeights": true, + "releaseDate": "2025-01-01" + } + } + ] + }, + { + "id": "google/gemma-3-12b-it", + "provider": "google", + "model": "gemma-3-12b-it", + "displayName": "Gemma 3 12B IT", + "family": "gemma", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "cloudflare-ai-gateway", + "crusoe", + "deepinfra", + "kilo", + "novita", + "novita-ai", + "openrouter" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/google/gemma-3-12b-it", + "crusoe/google/gemma-3-12b-it", + "deepinfra/google/gemma-3-12b-it", + "kilo/google/gemma-3-12b-it", + "novita-ai/google/gemma-3-12b-it", + "novita/google/gemma-3-12b-it", + "openrouter/google/gemma-3-12b-it" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/google/gemma-3-12b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.35, + "output": 0.56 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemma-3-12b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.04, + "output": 0.13 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "google/gemma-3-12b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.1 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemma-3-12b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "crusoe", + "model": "crusoe/google/gemma-3-12b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/google/gemma-3-12b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/google/gemma-3-12b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.1 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemma-3-12b-it", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 3 12B", + "Gemma 3 12B IT", + "Google: Gemma 3 12B" + ], + "families": [ + "gemma" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-08-31", + "releaseDate": "2025-04-11", + "lastUpdated": "2025-04-11", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/google/gemma-3-12b-it", + "modelKey": "workers-ai/@cf/google/gemma-3-12b-it", + "displayName": "Gemma 3 12B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2025-04-11", + "openWeights": false, + "releaseDate": "2025-04-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemma-3-12b-it", + "modelKey": "google/gemma-3-12b-it", + "displayName": "Google: Gemma 3 12B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-03-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "google/gemma-3-12b-it", + "modelKey": "google/gemma-3-12b-it", + "displayName": "Gemma 3 12B", + "family": "gemma", + "metadata": { + "lastUpdated": "2025-03-13", + "openWeights": true, + "releaseDate": "2025-03-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemma-3-12b-it", + "modelKey": "google/gemma-3-12b-it", + "displayName": "Gemma 3 12B", + "family": "gemma", + "metadata": { + "knowledgeCutoff": "2024-08-31", + "lastUpdated": "2025-03-13", + "openWeights": true, + "releaseDate": "2025-03-13" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "crusoe", + "model": "crusoe/google/gemma-3-12b-it", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/google/gemma-3-12b-it", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/google/gemma-3-12b-it", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemma-3-12b-it", + "displayName": "Google: Gemma 3 12B", + "metadata": { + "canonicalSlug": "google/gemma-3-12b-it", + "createdAt": "2025-03-13T21:50:25.000Z", + "huggingFaceId": "google/gemma-3-12b-it", + "instructType": "gemma", + "knowledgeCutoff": "2024-08-31", + "links": { + "details": "/api/v1/models/google/gemma-3-12b-it/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemma-3-27b-it", + "provider": "google", + "model": "gemma-3-27b-it", + "displayName": "Gemma-3-27b-it", + "family": "gemma", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "deepinfra", + "gemini", + "kilo", + "nebius", + "novita", + "novita-ai", + "openrouter", + "stackit" + ], + "aliases": [ + "deepinfra/google/gemma-3-27b-it", + "gemini/gemma-3-27b-it", + "kilo/google/gemma-3-27b-it", + "nebius/google/gemma-3-27b-it", + "novita-ai/google/gemma-3-27b-it", + "novita/google/gemma-3-27b-it", + "openrouter/google/gemma-3-27b-it", + "stackit/google/gemma-3-27b-it" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true, + "supports1MContext": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemma-3-27b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.03, + "output": 0.11 + } + }, + { + "source": "models.dev", + "provider": "nebius", + "model": "google/gemma-3-27b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0.125, + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "google/gemma-3-27b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.119, + "output": 0.2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemma-3-27b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "output": 0.16 + } + }, + { + "source": "models.dev", + "provider": "stackit", + "model": "google/gemma-3-27b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49, + "output": 0.71 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/google/gemma-3-27b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.09, + "output": 0.16 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/gemma-3-27b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perImage": { + "input": 0 + }, + "perAudioSecond": { + "input": 0, + "inputAbove128KTokens": 0 + }, + "perVideoSecond": { + "input": 0, + "inputAbove128KTokens": 0 + }, + "perCharacter": { + "input": 0, + "inputAbove128KTokens": 0, + "output": 0, + "outputAbove128KTokens": 0 + }, + "extra": { + "input_cost_per_image_above_128k_tokens": 0, + "input_cost_per_token_above_128k_tokens": 0, + "output_cost_per_token_above_128k_tokens": 0 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/google/gemma-3-27b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/google/gemma-3-27b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.119, + "output": 0.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemma-3-27b-it", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.16 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 3 27B", + "Gemma-3-27b-it", + "Google: Gemma 3 27B" + ], + "families": [ + "gemma" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-10", + "releaseDate": "2025-03-12", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemma-3-27b-it", + "modelKey": "google/gemma-3-27b-it", + "displayName": "Google: Gemma 3 27B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-03-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "google/gemma-3-27b-it", + "modelKey": "google/gemma-3-27b-it", + "displayName": "Gemma-3-27b-it", + "metadata": { + "knowledgeCutoff": "2025-10", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2026-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "google/gemma-3-27b-it", + "modelKey": "google/gemma-3-27b-it", + "displayName": "Gemma 3 27B", + "family": "gemma", + "metadata": { + "lastUpdated": "2025-03-25", + "openWeights": true, + "releaseDate": "2025-03-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemma-3-27b-it", + "modelKey": "google/gemma-3-27b-it", + "displayName": "Gemma 3 27B", + "family": "gemma", + "metadata": { + "knowledgeCutoff": "2024-08-31", + "lastUpdated": "2025-03-12", + "openWeights": true, + "releaseDate": "2025-03-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "stackit", + "providerName": "STACKIT", + "providerApi": "https://api.openai-compat.model-serving.eu01.onstackit.cloud/v1", + "providerDoc": "https://docs.stackit.cloud/products/data-and-ai/ai-model-serving/basics/available-shared-models", + "model": "google/gemma-3-27b-it", + "modelKey": "google/gemma-3-27b-it", + "displayName": "Gemma 3 27B", + "family": "gemma", + "metadata": { + "lastUpdated": "2025-05-17", + "openWeights": true, + "releaseDate": "2025-05-17" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/google/gemma-3-27b-it", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/gemma-3-27b-it", + "mode": "chat", + "metadata": { + "source": "https://aistudio.google.com" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/google/gemma-3-27b-it", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/google/gemma-3-27b-it", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemma-3-27b-it", + "displayName": "Google: Gemma 3 27B", + "metadata": { + "canonicalSlug": "google/gemma-3-27b-it", + "createdAt": "2025-03-12T05:12:39.000Z", + "huggingFaceId": "google/gemma-3-27b-it", + "instructType": "gemma", + "knowledgeCutoff": "2024-08-31", + "links": { + "details": "/api/v1/models/google/gemma-3-27b-it/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemma-3-4b-it", + "provider": "google", + "model": "gemma-3-4b-it", + "displayName": "Google: Gemma 3 4B", + "family": "gemma", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "deepinfra", + "kilo", + "openrouter" + ], + "aliases": [ + "deepinfra/google/gemma-3-4b-it", + "kilo/google/gemma-3-4b-it", + "openrouter/google/gemma-3-4b-it" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemma-3-4b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.08 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemma-3-4b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/google/gemma-3-4b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.08 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemma-3-4b-it", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 3 4B", + "Google: Gemma 3 4B" + ], + "families": [ + "gemma" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-08-31", + "releaseDate": "2025-03-13", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemma-3-4b-it", + "modelKey": "google/gemma-3-4b-it", + "displayName": "Google: Gemma 3 4B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-03-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemma-3-4b-it", + "modelKey": "google/gemma-3-4b-it", + "displayName": "Gemma 3 4B", + "family": "gemma", + "metadata": { + "knowledgeCutoff": "2024-08-31", + "lastUpdated": "2025-03-13", + "openWeights": true, + "releaseDate": "2025-03-13" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/google/gemma-3-4b-it", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemma-3-4b-it", + "displayName": "Google: Gemma 3 4B", + "metadata": { + "canonicalSlug": "google/gemma-3-4b-it", + "createdAt": "2025-03-13T22:38:30.000Z", + "huggingFaceId": "google/gemma-3-4b-it", + "instructType": "gemma", + "knowledgeCutoff": "2024-08-31", + "links": { + "details": "/api/v1/models/google/gemma-3-4b-it/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Gemini", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemma-3n-e2b-it", + "provider": "google", + "model": "gemma-3n-e2b-it", + "displayName": "Gemma 3n E2b It", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/google/gemma-3n-e2b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "google/gemma-3n-e2b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 3n E2b It" + ], + "knowledgeCutoff": "2024-06", + "releaseDate": "2025-06-12", + "lastUpdated": "2025-06-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "google/gemma-3n-e2b-it", + "modelKey": "google/gemma-3n-e2b-it", + "displayName": "Gemma 3n E2b It", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2025-06-12", + "openWeights": true, + "releaseDate": "2025-06-12" + } + } + ] + }, + { + "id": "google/gemma-3n-e4b-it", + "provider": "google", + "model": "gemma-3n-e4b-it", + "displayName": "Google: Gemma 3n 4B", + "family": "gemma", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nvidia", + "openrouter", + "togetherai" + ], + "aliases": [ + "kilo/google/gemma-3n-e4b-it", + "nvidia/google/gemma-3n-e4b-it", + "openrouter/google/gemma-3n-e4b-it", + "togetherai/google/gemma-3n-E4B-it" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemma-3n-e4b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.04 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "google/gemma-3n-e4b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemma-3n-e4b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.06, + "output": 0.12 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "google/gemma-3n-E4B-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.06, + "output": 0.12 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemma-3n-e4b-it", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.12 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 3N E4B Instruct", + "Gemma 3n 4B", + "Gemma 3n E4b It", + "Google: Gemma 3n 4B" + ], + "families": [ + "gemma" + ], + "knowledgeCutoff": "2024-06", + "releaseDate": "2025-05-20", + "lastUpdated": "2025-05-20", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemma-3n-e4b-it", + "modelKey": "google/gemma-3n-e4b-it", + "displayName": "Google: Gemma 3n 4B", + "metadata": { + "lastUpdated": "2025-05-20", + "openWeights": true, + "releaseDate": "2025-05-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "google/gemma-3n-e4b-it", + "modelKey": "google/gemma-3n-e4b-it", + "displayName": "Gemma 3n E4b It", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2025-06-03", + "openWeights": true, + "releaseDate": "2025-06-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemma-3n-e4b-it", + "modelKey": "google/gemma-3n-e4b-it", + "displayName": "Gemma 3n 4B", + "family": "gemma", + "metadata": { + "knowledgeCutoff": "2024-08-31", + "lastUpdated": "2025-05-20", + "openWeights": true, + "releaseDate": "2025-05-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "google/gemma-3n-E4B-it", + "modelKey": "google/gemma-3n-E4B-it", + "displayName": "Gemma 3N E4B Instruct", + "family": "gemma", + "metadata": { + "lastUpdated": "2025-05-20", + "openWeights": true, + "releaseDate": "2025-05-20" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemma-3n-e4b-it", + "displayName": "Google: Gemma 3n 4B", + "metadata": { + "canonicalSlug": "google/gemma-3n-e4b-it", + "createdAt": "2025-05-20T21:33:44.000Z", + "huggingFaceId": "google/gemma-3n-E4B-it", + "knowledgeCutoff": "2024-08-31", + "links": { + "details": "/api/v1/models/google/gemma-3n-e4b-it/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemma-4-26b-a4b-it", + "provider": "google", + "model": "gemma-4-26b-a4b-it", + "displayName": "Gemma 4 26B A4B IT", + "family": "gemma", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "cloudflare-workers-ai", + "deepinfra", + "google", + "kilo", + "merge-gateway", + "nano-gpt", + "novita-ai", + "openrouter", + "orcarouter", + "siliconflow", + "vercel" + ], + "aliases": [ + "cloudflare-workers-ai/@cf/google/gemma-4-26b-a4b-it", + "deepinfra/google/gemma-4-26B-A4B-it", + "google/gemma-4-26b-a4b-it", + "kilo/google/gemma-4-26b-a4b-it", + "merge-gateway/google/gemma-4-26b-a4b-it", + "nano-gpt/google/gemma-4-26b-a4b-it", + "novita-ai/google/gemma-4-26b-a4b-it", + "openrouter/google/gemma-4-26b-a4b-it", + "orcarouter/google/gemma-4-26b-a4b-it", + "siliconflow/google/gemma-4-26B-A4B-it", + "vercel/google/gemma-4-26b-a4b-it" + ], + "mergedProviderModelRecords": 11, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "interleaved": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/google/gemma-4-26b-a4b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "google/gemma-4-26B-A4B-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.34 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemma-4-26b-a4b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "google/gemma-4-26b-a4b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "google/gemma-4-26b-a4b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemma-4-26b-a4b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.06, + "output": 0.33 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "google/gemma-4-26b-a4b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.06, + "output": 0.33 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "google/gemma-4-26B-A4B-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "google/gemma-4-26b-a4b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemma-4-26b-a4b-it", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.33 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 26B A4B", + "Gemma 4 26B A4B IT", + "Google: Gemma 4 26B A4B" + ], + "families": [ + "gemma" + ], + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 11 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/google/gemma-4-26b-a4b-it", + "modelKey": "@cf/google/gemma-4-26b-a4b-it", + "displayName": "Gemma 4 26B A4B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "google/gemma-4-26B-A4B-it", + "modelKey": "google/gemma-4-26B-A4B-it", + "displayName": "Gemma 4 26B A4B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemma-4-26b-a4b-it", + "modelKey": "gemma-4-26b-a4b-it", + "displayName": "Gemma 4 26B A4B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemma-4-26b-a4b-it", + "modelKey": "google/gemma-4-26b-a4b-it", + "displayName": "Google: Gemma 4 26B A4B", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": true, + "releaseDate": "2026-04-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "google/gemma-4-26b-a4b-it", + "modelKey": "google/gemma-4-26b-a4b-it", + "displayName": "Gemma 4 26B A4B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "google/gemma-4-26b-a4b-it", + "modelKey": "google/gemma-4-26b-a4b-it", + "displayName": "Gemma 4 26B A4B", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "google/gemma-4-26b-a4b-it", + "modelKey": "google/gemma-4-26b-a4b-it", + "displayName": "Gemma 4 26B A4B", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemma-4-26b-a4b-it", + "modelKey": "google/gemma-4-26b-a4b-it", + "displayName": "Gemma 4 26B A4B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "google/gemma-4-26b-a4b-it", + "modelKey": "google/gemma-4-26b-a4b-it", + "displayName": "Gemma 4 26B A4B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "google/gemma-4-26B-A4B-it", + "modelKey": "google/gemma-4-26B-A4B-it", + "displayName": "Gemma 4 26B A4B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/gemma-4-26b-a4b-it", + "modelKey": "google/gemma-4-26b-a4b-it", + "displayName": "Gemma 4 26B A4B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemma-4-26b-a4b-it", + "displayName": "Google: Gemma 4 26B A4B", + "metadata": { + "canonicalSlug": "google/gemma-4-26b-a4b-it-20260403", + "createdAt": "2026-04-03T14:53:09.000Z", + "huggingFaceId": "google/gemma-4-26B-A4B-it", + "links": { + "details": "/api/v1/models/google/gemma-4-26b-a4b-it-20260403/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Gemma", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemma-4-26b-a4b-it-maas", + "provider": "google", + "model": "gemma-4-26b-a4b-it-maas", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-openai_models" + ], + "aliases": [ + "vertex_ai-openai_models/vertex_ai/google/gemma-4-26b-a4b-it-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-openai_models", + "model": "vertex_ai/google/gemma-4-26b-a4b-it-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedRegions": [ + "global" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-openai_models", + "model": "vertex_ai/google/gemma-4-26b-a4b-it-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/maas/google/gemma-4-26b-a4b-it", + "supportedRegions": [ + "global" + ] + } + } + ] + }, + { + "id": "google/gemma-4-26b-a4b-it:free", + "provider": "google", + "model": "gemma-4-26b-a4b-it:free", + "displayName": "Gemma 4 26B A4B (free)", + "family": "gemma", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/google/gemma-4-26b-a4b-it:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemma-4-26b-a4b-it:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemma-4-26b-a4b-it:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 26B A4B (free)", + "Google: Gemma 4 26B A4B (free)" + ], + "families": [ + "gemma" + ], + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemma-4-26b-a4b-it:free", + "modelKey": "google/gemma-4-26b-a4b-it:free", + "displayName": "Gemma 4 26B A4B (free)", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemma-4-26b-a4b-it:free", + "displayName": "Google: Gemma 4 26B A4B (free)", + "metadata": { + "canonicalSlug": "google/gemma-4-26b-a4b-it-20260403", + "createdAt": "2026-04-03T14:53:09.000Z", + "huggingFaceId": "google/gemma-4-26B-A4B-it", + "links": { + "details": "/api/v1/models/google/gemma-4-26b-a4b-it-20260403/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Gemma", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemma-4-26b-a4b-it:thinking", + "provider": "google", + "model": "gemma-4-26b-a4b-it:thinking", + "displayName": "Gemma 4 26B A4B Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/google/gemma-4-26b-a4b-it:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "google/gemma-4-26b-a4b-it:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 26B A4B Thinking" + ], + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "google/gemma-4-26b-a4b-it:thinking", + "modelKey": "google/gemma-4-26b-a4b-it:thinking", + "displayName": "Gemma 4 26B A4B Thinking", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + } + ] + }, + { + "id": "google/gemma-4-31b", + "provider": "google", + "model": "gemma-4-31b", + "displayName": "Gemma-4-31B", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/google/gemma-4-31b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "google/gemma-4-31b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma-4-31B" + ], + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/gemma-4-31b", + "modelKey": "google/gemma-4-31b", + "displayName": "Gemma-4-31B", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + } + ] + }, + { + "id": "google/gemma-4-31b-it", + "provider": "google", + "model": "gemma-4-31b-it", + "displayName": "Gemma 4 31B IT", + "family": "gemma", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "berget", + "deepinfra", + "fastrouter", + "google", + "kilo", + "lilac", + "merge-gateway", + "nano-gpt", + "nearai", + "novita-ai", + "nvidia", + "openrouter", + "orcarouter", + "siliconflow", + "togetherai", + "vercel" + ], + "aliases": [ + "berget/google/gemma-4-31B-it", + "deepinfra/google/gemma-4-31B-it", + "fastrouter/google/gemma-4-31b-it", + "google/gemma-4-31b-it", + "kilo/google/gemma-4-31b-it", + "lilac/google/gemma-4-31b-it", + "merge-gateway/google/gemma-4-31b-it", + "nano-gpt/google/gemma-4-31b-it", + "nearai/google/gemma-4-31B-it", + "novita-ai/google/gemma-4-31b-it", + "nvidia/google/gemma-4-31b-it", + "openrouter/google/gemma-4-31b-it", + "orcarouter/google/gemma-4-31b-it", + "siliconflow/google/gemma-4-31B-it", + "togetherai/google/gemma-4-31B-it", + "vercel/google/gemma-4-31b-it" + ], + "mergedProviderModelRecords": 16, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "berget", + "model": "google/gemma-4-31B-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.275, + "output": 0.55 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "google/gemma-4-31B-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.38 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "google/gemma-4-31b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.38 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "google/gemma-4-31b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "lilac", + "model": "google/gemma-4-31b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.11, + "output": 0.35 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "google/gemma-4-31b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.35 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "google/gemma-4-31B-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.026, + "input": 0.13, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "google/gemma-4-31b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "google/gemma-4-31b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemma-4-31b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.09, + "input": 0.12, + "output": 0.35 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "google/gemma-4-31b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.38 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "google/gemma-4-31B-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "google/gemma-4-31B-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.39, + "output": 0.97 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "google/gemma-4-31b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemma-4-31b-it", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.09, + "input": 0.12, + "output": 0.35 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B", + "Gemma 4 31B IT", + "Gemma 4 31B Instruct", + "Gemma-4-31B-IT", + "Google: Gemma 4 31B" + ], + "families": [ + "gemma" + ], + "knowledgeCutoff": "2025-12", + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 16 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "berget", + "providerName": "Berget.AI", + "providerApi": "https://api.berget.ai/v1", + "providerDoc": "https://api.berget.ai", + "model": "google/gemma-4-31B-it", + "modelKey": "google/gemma-4-31B-it", + "displayName": "Gemma 4 31B Instruct", + "family": "gemma", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "google/gemma-4-31B-it", + "modelKey": "google/gemma-4-31B-it", + "displayName": "Gemma 4 31B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "google/gemma-4-31b-it", + "modelKey": "google/gemma-4-31b-it", + "displayName": "Gemma 4 31B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google", + "providerName": "Google", + "providerDoc": "https://ai.google.dev/gemini-api/docs/models", + "model": "gemma-4-31b-it", + "modelKey": "gemma-4-31b-it", + "displayName": "Gemma 4 31B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/gemma-4-31b-it", + "modelKey": "google/gemma-4-31b-it", + "displayName": "Google: Gemma 4 31B", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "lilac", + "providerName": "Lilac", + "providerApi": "https://api.getlilac.com/v1", + "providerDoc": "https://docs.getlilac.com/inference/models", + "model": "google/gemma-4-31b-it", + "modelKey": "google/gemma-4-31b-it", + "displayName": "Gemma 4 31B IT", + "family": "gemma", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "google/gemma-4-31b-it", + "modelKey": "google/gemma-4-31b-it", + "displayName": "Gemma 4 31B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "google/gemma-4-31b-it", + "modelKey": "google/gemma-4-31b-it", + "displayName": "Gemma 4 31B", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "google/gemma-4-31B-it", + "modelKey": "google/gemma-4-31B-it", + "displayName": "Gemma 4 31B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "google/gemma-4-31b-it", + "modelKey": "google/gemma-4-31b-it", + "displayName": "Gemma 4 31B", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "google/gemma-4-31b-it", + "modelKey": "google/gemma-4-31b-it", + "displayName": "Gemma-4-31B-IT", + "family": "gemma", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemma-4-31b-it", + "modelKey": "google/gemma-4-31b-it", + "displayName": "Gemma 4 31B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "google/gemma-4-31b-it", + "modelKey": "google/gemma-4-31b-it", + "displayName": "Gemma 4 31B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "google/gemma-4-31B-it", + "modelKey": "google/gemma-4-31B-it", + "displayName": "Gemma 4 31B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "google/gemma-4-31B-it", + "modelKey": "google/gemma-4-31B-it", + "displayName": "Gemma 4 31B Instruct", + "family": "gemma", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/gemma-4-31b-it", + "modelKey": "google/gemma-4-31b-it", + "displayName": "Gemma 4 31B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemma-4-31b-it", + "displayName": "Google: Gemma 4 31B", + "metadata": { + "canonicalSlug": "google/gemma-4-31b-it-20260402", + "createdAt": "2026-04-02T16:48:06.000Z", + "huggingFaceId": "google/gemma-4-31B-it", + "links": { + "details": "/api/v1/models/google/gemma-4-31b-it-20260402/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Gemma", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 262144, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/gemma-4-31b-it:free", + "provider": "google", + "model": "gemma-4-31b-it:free", + "displayName": "Gemma 4 31B (free)", + "family": "gemma", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/google/gemma-4-31b-it:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/gemma-4-31b-it:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/gemma-4-31b-it:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B (free)", + "Google: Gemma 4 31B (free)" + ], + "families": [ + "gemma" + ], + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "min_p", + "reasoning", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_a", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/gemma-4-31b-it:free", + "modelKey": "google/gemma-4-31b-it:free", + "displayName": "Gemma 4 31B (free)", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/gemma-4-31b-it:free", + "displayName": "Google: Gemma 4 31B (free)", + "metadata": { + "canonicalSlug": "google/gemma-4-31b-it-20260402", + "createdAt": "2026-04-02T16:48:06.000Z", + "huggingFaceId": "google/gemma-4-31B-it", + "links": { + "details": "/api/v1/models/google/gemma-4-31b-it-20260402/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "min_p", + "reasoning", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_a", + "top_k", + "top_p" + ], + "tokenizer": "Gemma", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 8192, + "is_moderated": true + } + } + } + ] + }, + { + "id": "google/gemma-4-31b-it:thinking", + "provider": "google", + "model": "gemma-4-31b-it:thinking", + "displayName": "Gemma 4 31B Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/google/gemma-4-31b-it:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "google/gemma-4-31b-it:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.35 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B Thinking" + ], + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "google/gemma-4-31b-it:thinking", + "modelKey": "google/gemma-4-31b-it:thinking", + "displayName": "Gemma 4 31B Thinking", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + } + ] + }, + { + "id": "google/gemma-4-31b-turbo-tee", + "provider": "google", + "model": "gemma-4-31b-turbo-tee", + "displayName": "gemma 4 31B turbo TEE", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/google/gemma-4-31B-turbo-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "google/gemma-4-31B-turbo-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.065, + "input": 0.13, + "output": 0.38 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gemma 4 31B turbo TEE" + ], + "families": [ + "gemma" + ], + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "google/gemma-4-31B-turbo-TEE", + "modelKey": "google/gemma-4-31B-turbo-TEE", + "displayName": "gemma 4 31B turbo TEE", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "google/gemma-7b-it", + "provider": "google", + "model": "gemma-7b-it", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "anyscale" + ], + "aliases": [ + "anyscale/google/gemma-7b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "anyscale", + "model": "anyscale/google/gemma-7b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anyscale", + "model": "anyscale/google/gemma-7b-it", + "mode": "chat", + "metadata": { + "source": "https://docs.anyscale.com/preview/endpoints/text-generation/supported-models/google-gemma-7b-it" + } + } + ] + }, + { + "id": "google/google-paligemma", + "provider": "google", + "model": "google-paligemma", + "displayName": "paligemma", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/google/google-paligemma" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "google/google-paligemma", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "paligemma" + ], + "releaseDate": "2024-05-14", + "lastUpdated": "2024-08-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "google/google-paligemma", + "modelKey": "google/google-paligemma", + "displayName": "paligemma", + "metadata": { + "lastUpdated": "2024-08-26", + "openWeights": true, + "releaseDate": "2024-05-14" + } + } + ] + }, + { + "id": "google/imagen-3", + "provider": "google", + "model": "imagen-3", + "displayName": "Imagen-3", + "family": "imagen", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/google/imagen-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 480, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Imagen-3" + ], + "families": [ + "imagen" + ], + "releaseDate": "2024-10-15", + "lastUpdated": "2024-10-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/imagen-3", + "modelKey": "google/imagen-3", + "displayName": "Imagen-3", + "family": "imagen", + "metadata": { + "lastUpdated": "2024-10-15", + "openWeights": false, + "releaseDate": "2024-10-15" + } + } + ] + }, + { + "id": "google/imagen-3-fast", + "provider": "google", + "model": "imagen-3-fast", + "displayName": "Imagen-3-Fast", + "family": "imagen", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/google/imagen-3-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 480, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Imagen-3-Fast" + ], + "families": [ + "imagen" + ], + "releaseDate": "2024-10-17", + "lastUpdated": "2024-10-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/imagen-3-fast", + "modelKey": "google/imagen-3-fast", + "displayName": "Imagen-3-Fast", + "family": "imagen", + "metadata": { + "lastUpdated": "2024-10-17", + "openWeights": false, + "releaseDate": "2024-10-17" + } + } + ] + }, + { + "id": "google/imagen-3.0-capability-001", + "provider": "google", + "model": "imagen-3.0-capability-001", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-image-models" + ], + "aliases": [ + "vertex_ai-image-models/vertex_ai/imagen-3.0-capability-001" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-image-models", + "model": "vertex_ai/imagen-3.0-capability-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-image-models", + "model": "vertex_ai/imagen-3.0-capability-001", + "mode": "image_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/image/edit-insert-objects" + } + } + ] + }, + { + "id": "google/imagen-3.0-fast-generate-001", + "provider": "google", + "model": "imagen-3.0-fast-generate-001", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "gemini", + "vertex_ai-image-models" + ], + "aliases": [ + "gemini/imagen-3.0-fast-generate-001", + "vertex_ai-image-models/vertex_ai/imagen-3.0-fast-generate-001" + ], + "mergedProviderModelRecords": 2, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/imagen-3.0-fast-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.02 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-image-models", + "model": "vertex_ai/imagen-3.0-fast-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.02 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/imagen-3.0-fast-generate-001", + "mode": "image_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-image-models", + "model": "vertex_ai/imagen-3.0-fast-generate-001", + "mode": "image_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + } + ] + }, + { + "id": "google/imagen-3.0-generate-001", + "provider": "google", + "model": "imagen-3.0-generate-001", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "gemini", + "vertex_ai-image-models" + ], + "aliases": [ + "gemini/imagen-3.0-generate-001", + "vertex_ai-image-models/vertex_ai/imagen-3.0-generate-001" + ], + "mergedProviderModelRecords": 2, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/imagen-3.0-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-image-models", + "model": "vertex_ai/imagen-3.0-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/imagen-3.0-generate-001", + "mode": "image_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-image-models", + "model": "vertex_ai/imagen-3.0-generate-001", + "mode": "image_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + } + ] + }, + { + "id": "google/imagen-3.0-generate-002", + "provider": "google", + "model": "imagen-3.0-generate-002", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "gemini", + "vertex_ai-image-models" + ], + "aliases": [ + "gemini/imagen-3.0-generate-002", + "vertex_ai-image-models/vertex_ai/imagen-3.0-generate-002" + ], + "mergedProviderModelRecords": 2, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/imagen-3.0-generate-002", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-image-models", + "model": "vertex_ai/imagen-3.0-generate-002", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "deprecationDate": "2025-11-10", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/imagen-3.0-generate-002", + "mode": "image_generation", + "metadata": { + "deprecationDate": "2025-11-10", + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-image-models", + "model": "vertex_ai/imagen-3.0-generate-002", + "mode": "image_generation", + "metadata": { + "deprecationDate": "2025-11-10", + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + } + ] + }, + { + "id": "google/imagen-4", + "provider": "google", + "model": "imagen-4", + "displayName": "Imagen-4", + "family": "imagen", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/google/imagen-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 480, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Imagen-4" + ], + "families": [ + "imagen" + ], + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/imagen-4", + "modelKey": "google/imagen-4", + "displayName": "Imagen-4", + "family": "imagen", + "metadata": { + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + } + ] + }, + { + "id": "google/imagen-4-fast", + "provider": "google", + "model": "imagen-4-fast", + "displayName": "Imagen-4-Fast", + "family": "imagen", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/google/imagen-4-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 480, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Imagen-4-Fast" + ], + "families": [ + "imagen" + ], + "releaseDate": "2025-06-25", + "lastUpdated": "2025-06-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/imagen-4-fast", + "modelKey": "google/imagen-4-fast", + "displayName": "Imagen-4-Fast", + "family": "imagen", + "metadata": { + "lastUpdated": "2025-06-25", + "openWeights": false, + "releaseDate": "2025-06-25" + } + } + ] + }, + { + "id": "google/imagen-4-ultra", + "provider": "google", + "model": "imagen-4-ultra", + "displayName": "Imagen-4-Ultra", + "family": "imagen", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/google/imagen-4-ultra" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 480, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Imagen-4-Ultra" + ], + "families": [ + "imagen" + ], + "releaseDate": "2025-05-24", + "lastUpdated": "2025-05-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/imagen-4-ultra", + "modelKey": "google/imagen-4-ultra", + "displayName": "Imagen-4-Ultra", + "family": "imagen", + "metadata": { + "lastUpdated": "2025-05-24", + "openWeights": false, + "releaseDate": "2025-05-24" + } + } + ] + }, + { + "id": "google/imagen-4.0-fast", + "provider": "google", + "model": "imagen-4.0-fast", + "displayName": "Imagen 4 Fast", + "family": "imagen", + "sources": [ + "models.dev" + ], + "providers": [ + "fastrouter" + ], + "aliases": [ + "fastrouter/google/imagen-4.0-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 480, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Imagen 4 Fast" + ], + "families": [ + "imagen" + ], + "releaseDate": "2025-05-20", + "lastUpdated": "2025-05-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "google/imagen-4.0-fast", + "modelKey": "google/imagen-4.0-fast", + "displayName": "Imagen 4 Fast", + "family": "imagen", + "metadata": { + "lastUpdated": "2025-05-20", + "openWeights": false, + "releaseDate": "2025-05-20" + } + } + ] + }, + { + "id": "google/imagen-4.0-fast-generate-001", + "provider": "google", + "model": "imagen-4.0-fast-generate-001", + "displayName": "Imagen 4 Fast", + "family": "imagen", + "mode": "image_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "gemini", + "vercel", + "vertex_ai-image-models" + ], + "aliases": [ + "gemini/imagen-4.0-fast-generate-001", + "vercel/google/imagen-4.0-fast-generate-001", + "vertex_ai-image-models/vertex_ai/imagen-4.0-fast-generate-001" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 480, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/imagen-4.0-fast-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.02 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-image-models", + "model": "vertex_ai/imagen-4.0-fast-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.02 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Imagen 4 Fast" + ], + "families": [ + "imagen" + ], + "modes": [ + "image_generation" + ], + "releaseDate": "2025-06-01", + "lastUpdated": "2025-06", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/imagen-4.0-fast-generate-001", + "modelKey": "google/imagen-4.0-fast-generate-001", + "displayName": "Imagen 4 Fast", + "family": "imagen", + "metadata": { + "lastUpdated": "2025-06", + "openWeights": false, + "releaseDate": "2025-06-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/imagen-4.0-fast-generate-001", + "mode": "image_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-image-models", + "model": "vertex_ai/imagen-4.0-fast-generate-001", + "mode": "image_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + } + ] + }, + { + "id": "google/imagen-4.0-generate-001", + "provider": "google", + "model": "imagen-4.0-generate-001", + "displayName": "Imagen 4", + "family": "imagen", + "mode": "image_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "gemini", + "vercel", + "vertex_ai-image-models" + ], + "aliases": [ + "gemini/imagen-4.0-generate-001", + "vercel/google/imagen-4.0-generate-001", + "vertex_ai-image-models/vertex_ai/imagen-4.0-generate-001" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 480, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": false, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/imagen-4.0-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-image-models", + "model": "vertex_ai/imagen-4.0-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Imagen 4" + ], + "families": [ + "imagen" + ], + "modes": [ + "image_generation" + ], + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/imagen-4.0-generate-001", + "modelKey": "google/imagen-4.0-generate-001", + "displayName": "Imagen 4", + "family": "imagen", + "metadata": { + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/imagen-4.0-generate-001", + "mode": "image_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-image-models", + "model": "vertex_ai/imagen-4.0-generate-001", + "mode": "image_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + } + ] + }, + { + "id": "google/imagen-4.0-ultra", + "provider": "google", + "model": "imagen-4.0-ultra", + "displayName": "Imagen 4 Ultra", + "family": "imagen", + "sources": [ + "models.dev" + ], + "providers": [ + "fastrouter" + ], + "aliases": [ + "fastrouter/google/imagen-4.0-ultra" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 480, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Imagen 4 Ultra" + ], + "families": [ + "imagen" + ], + "releaseDate": "2025-05-20", + "lastUpdated": "2025-05-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "google/imagen-4.0-ultra", + "modelKey": "google/imagen-4.0-ultra", + "displayName": "Imagen 4 Ultra", + "family": "imagen", + "metadata": { + "lastUpdated": "2025-05-20", + "openWeights": false, + "releaseDate": "2025-05-20" + } + } + ] + }, + { + "id": "google/imagen-4.0-ultra-generate-001", + "provider": "google", + "model": "imagen-4.0-ultra-generate-001", + "displayName": "Imagen 4 Ultra", + "family": "imagen", + "mode": "image_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "aiml", + "gemini", + "vercel", + "vertex_ai-image-models" + ], + "aliases": [ + "aiml/google/imagen-4.0-ultra-generate-001", + "gemini/imagen-4.0-ultra-generate-001", + "vercel/google/imagen-4.0-ultra-generate-001", + "vertex_ai-image-models/vertex_ai/imagen-4.0-ultra-generate-001" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 480, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": false, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "aiml", + "model": "aiml/google/imagen-4.0-ultra-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.078 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/imagen-4.0-ultra-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.06 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-image-models", + "model": "vertex_ai/imagen-4.0-ultra-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.06 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Imagen 4 Ultra" + ], + "families": [ + "imagen" + ], + "modes": [ + "image_generation" + ], + "releaseDate": "2025-05-24", + "lastUpdated": "2025-05-24", + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/imagen-4.0-ultra-generate-001", + "modelKey": "google/imagen-4.0-ultra-generate-001", + "displayName": "Imagen 4 Ultra", + "family": "imagen", + "metadata": { + "lastUpdated": "2025-05-24", + "openWeights": false, + "releaseDate": "2025-05-24" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "aiml", + "model": "aiml/google/imagen-4.0-ultra-generate-001", + "mode": "image_generation", + "metadata": { + "metadata": { + "notes": "Imagen 4.0 Ultra Generate API - Photorealistic image generation with precise text rendering" + }, + "source": "https://docs.aimlapi.com/api-references/image-models/google/imagen-4-ultra-generate", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/imagen-4.0-ultra-generate-001", + "mode": "image_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-image-models", + "model": "vertex_ai/imagen-4.0-ultra-generate-001", + "mode": "image_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + } + ] + }, + { + "id": "google/learnlm-1.5-pro-experimental", + "provider": "google", + "model": "learnlm-1.5-pro-experimental", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gemini" + ], + "aliases": [ + "gemini/learnlm-1.5-pro-experimental" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32767, + "inputTokens": 32767, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": true, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/learnlm-1.5-pro-experimental", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perImage": { + "input": 0 + }, + "perAudioSecond": { + "input": 0, + "inputAbove128KTokens": 0 + }, + "perVideoSecond": { + "input": 0, + "inputAbove128KTokens": 0 + }, + "perCharacter": { + "input": 0, + "inputAbove128KTokens": 0, + "output": 0, + "outputAbove128KTokens": 0 + }, + "extra": { + "input_cost_per_image_above_128k_tokens": 0, + "input_cost_per_token_above_128k_tokens": 0, + "output_cost_per_token_above_128k_tokens": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/learnlm-1.5-pro-experimental", + "mode": "chat", + "metadata": { + "source": "https://aistudio.google.com" + } + } + ] + }, + { + "id": "google/lyria", + "provider": "google", + "model": "lyria", + "displayName": "Lyria", + "family": "lyria", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/google/lyria" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Lyria" + ], + "families": [ + "lyria" + ], + "releaseDate": "2025-06-04", + "lastUpdated": "2025-06-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/lyria", + "modelKey": "google/lyria", + "displayName": "Lyria", + "family": "lyria", + "metadata": { + "lastUpdated": "2025-06-04", + "openWeights": false, + "releaseDate": "2025-06-04" + } + } + ] + }, + { + "id": "google/lyria-3-clip-preview", + "provider": "google", + "model": "lyria-3-clip-preview", + "displayName": "Google: Lyria 3 Clip Preview", + "family": "lyria", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "gemini", + "kilo", + "openrouter" + ], + "aliases": [ + "gemini/lyria-3-clip-preview", + "kilo/google/lyria-3-clip-preview", + "openrouter/google/lyria-3-clip-preview" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1048576, + "inputTokens": 131072, + "maxTokens": 8192, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": true, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "moderation": false, + "promptCaching": false, + "rerank": false, + "speech": false, + "systemMessages": false, + "transcription": false, + "vision": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "google/lyria-3-clip-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/lyria-3-clip-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/lyria-3-clip-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perImage": { + "output": 0.04 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/lyria-3-clip-preview", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Google: Lyria 3 Clip Preview", + "Lyria 3 Clip Preview" + ], + "families": [ + "lyria" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-03-30", + "lastUpdated": "2026-04-11", + "supportedParameters": [ + "max_tokens", + "response_format", + "seed", + "temperature", + "top_p" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/lyria-3-clip-preview", + "modelKey": "google/lyria-3-clip-preview", + "displayName": "Google: Lyria 3 Clip Preview", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": false, + "releaseDate": "2026-03-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/lyria-3-clip-preview", + "modelKey": "google/lyria-3-clip-preview", + "displayName": "Lyria 3 Clip Preview", + "family": "lyria", + "metadata": { + "lastUpdated": "2026-03-30", + "openWeights": false, + "releaseDate": "2026-03-30" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/lyria-3-clip-preview", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/lyria-3-clip-preview", + "displayName": "Google: Lyria 3 Clip Preview", + "metadata": { + "canonicalSlug": "google/lyria-3-clip-preview-20260330", + "createdAt": "2026-03-30T21:47:35.000Z", + "links": { + "details": "/api/v1/models/google/lyria-3-clip-preview-20260330/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "response_format", + "seed", + "temperature", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/lyria-3-pro-preview", + "provider": "google", + "model": "lyria-3-pro-preview", + "displayName": "Google: Lyria 3 Pro Preview", + "family": "lyria", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "gemini", + "kilo", + "openrouter" + ], + "aliases": [ + "gemini/lyria-3-pro-preview", + "kilo/google/lyria-3-pro-preview", + "openrouter/google/lyria-3-pro-preview" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1048576, + "inputTokens": 131072, + "maxTokens": 8192, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": true, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "moderation": false, + "promptCaching": false, + "rerank": false, + "speech": false, + "systemMessages": false, + "transcription": false, + "vision": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "google/lyria-3-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "google/lyria-3-pro-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/lyria-3-pro-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "google/lyria-3-pro-preview", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Google: Lyria 3 Pro Preview", + "Lyria 3 Pro Preview" + ], + "families": [ + "lyria" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-03-30", + "lastUpdated": "2026-04-11", + "supportedParameters": [ + "max_tokens", + "response_format", + "seed", + "temperature", + "top_p" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "google/lyria-3-pro-preview", + "modelKey": "google/lyria-3-pro-preview", + "displayName": "Google: Lyria 3 Pro Preview", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": false, + "releaseDate": "2026-03-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "google/lyria-3-pro-preview", + "modelKey": "google/lyria-3-pro-preview", + "displayName": "Lyria 3 Pro Preview", + "family": "lyria", + "metadata": { + "lastUpdated": "2026-03-30", + "openWeights": false, + "releaseDate": "2026-03-30" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/lyria-3-pro-preview", + "mode": "chat", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "google/lyria-3-pro-preview", + "displayName": "Google: Lyria 3 Pro Preview", + "metadata": { + "canonicalSlug": "google/lyria-3-pro-preview-20260330", + "createdAt": "2026-03-30T21:48:06.000Z", + "links": { + "details": "/api/v1/models/google/lyria-3-pro-preview-20260330/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "response_format", + "seed", + "temperature", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "google/nano-banana", + "provider": "google", + "model": "nano-banana", + "displayName": "Nano-Banana", + "family": "nano-banana", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/google/nano-banana" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "google/nano-banana", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.021, + "input": 0.21, + "output": 1.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nano-Banana" + ], + "families": [ + "nano-banana" + ], + "releaseDate": "2025-08-21", + "lastUpdated": "2025-08-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/nano-banana", + "modelKey": "google/nano-banana", + "displayName": "Nano-Banana", + "family": "nano-banana", + "metadata": { + "lastUpdated": "2025-08-21", + "openWeights": false, + "releaseDate": "2025-08-21" + } + } + ] + }, + { + "id": "google/nano-banana-pro", + "provider": "google", + "model": "nano-banana-pro", + "displayName": "Nano-Banana-Pro", + "family": "nano-banana", + "mode": "image_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "aiml", + "poe" + ], + "aliases": [ + "aiml/google/nano-banana-pro", + "poe/google/nano-banana-pro" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 65536, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": true, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "google/nano-banana-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 12 + } + }, + { + "source": "litellm", + "provider": "aiml", + "model": "aiml/google/nano-banana-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.195 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nano-Banana-Pro" + ], + "families": [ + "nano-banana" + ], + "modes": [ + "image_generation" + ], + "releaseDate": "2025-11-19", + "lastUpdated": "2025-11-19", + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/nano-banana-pro", + "modelKey": "google/nano-banana-pro", + "displayName": "Nano-Banana-Pro", + "family": "nano-banana", + "metadata": { + "lastUpdated": "2025-11-19", + "openWeights": false, + "releaseDate": "2025-11-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "aiml", + "model": "aiml/google/nano-banana-pro", + "mode": "image_generation", + "metadata": { + "metadata": { + "notes": "Gemini 3 Pro Image (Nano Banana Pro) - Advanced text-to-image generation with reasoning and 4K resolution support" + }, + "source": "https://docs.aimlapi.com/api-references/image-models/google/gemini-3-pro-image-preview", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "google/text-embedding-005", + "provider": "google", + "model": "text-embedding-005", + "displayName": "Text Embedding 005", + "family": "text-embedding", + "mode": "embedding", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "vercel/google/text-embedding-005", + "vercel_ai_gateway/google/text-embedding-005" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 8192, + "inputTokens": 0, + "maxTokens": 0, + "outputTokens": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding", + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/google/text-embedding-005", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.025, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Text Embedding 005" + ], + "families": [ + "text-embedding" + ], + "modes": [ + "embedding" + ], + "releaseDate": "2024-08-01", + "lastUpdated": "2024-08", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/text-embedding-005", + "modelKey": "google/text-embedding-005", + "displayName": "Text Embedding 005", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2024-08", + "openWeights": false, + "releaseDate": "2024-08-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/google/text-embedding-005", + "mode": "embedding" + } + ] + }, + { + "id": "google/text-multilingual-embedding-002", + "provider": "google", + "model": "text-multilingual-embedding-002", + "displayName": "Text Multilingual Embedding 002", + "family": "text-embedding", + "mode": "embedding", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "vercel/google/text-multilingual-embedding-002", + "vercel_ai_gateway/google/text-multilingual-embedding-002" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 8192, + "inputTokens": 0, + "maxTokens": 0, + "outputTokens": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding", + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/google/text-multilingual-embedding-002", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.025, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Text Multilingual Embedding 002" + ], + "families": [ + "text-embedding" + ], + "modes": [ + "embedding" + ], + "releaseDate": "2024-03-01", + "lastUpdated": "2024-03", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/text-multilingual-embedding-002", + "modelKey": "google/text-multilingual-embedding-002", + "displayName": "Text Multilingual Embedding 002", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2024-03", + "openWeights": false, + "releaseDate": "2024-03-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/google/text-multilingual-embedding-002", + "mode": "embedding" + } + ] + }, + { + "id": "google/veo-2", + "provider": "google", + "model": "veo-2", + "displayName": "Veo-2", + "family": "veo", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/google/veo-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 480, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Veo-2" + ], + "families": [ + "veo" + ], + "releaseDate": "2024-12-02", + "lastUpdated": "2024-12-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/veo-2", + "modelKey": "google/veo-2", + "displayName": "Veo-2", + "family": "veo", + "metadata": { + "lastUpdated": "2024-12-02", + "openWeights": false, + "releaseDate": "2024-12-02" + } + } + ] + }, + { + "id": "google/veo-2.0-generate-001", + "provider": "google", + "model": "veo-2.0-generate-001", + "mode": "video_generation", + "sources": [ + "litellm" + ], + "providers": [ + "gemini", + "vertex_ai-video-models" + ], + "aliases": [ + "gemini/veo-2.0-generate-001", + "vertex_ai-video-models/vertex_ai/veo-2.0-generate-001" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1024, + "inputTokens": 1024, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/veo-2.0-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.35 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-video-models", + "model": "vertex_ai/veo-2.0-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.35 + } + } + ] + }, + "metadata": { + "modes": [ + "video_generation" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/veo-2.0-generate-001", + "mode": "video_generation", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/video" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-video-models", + "model": "vertex_ai/veo-2.0-generate-001", + "mode": "video_generation", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/video" + } + } + ] + }, + { + "id": "google/veo-3", + "provider": "google", + "model": "veo-3", + "displayName": "Veo-3", + "family": "veo", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/google/veo-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 480, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Veo-3" + ], + "families": [ + "veo" + ], + "releaseDate": "2025-05-21", + "lastUpdated": "2025-05-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/veo-3", + "modelKey": "google/veo-3", + "displayName": "Veo-3", + "family": "veo", + "metadata": { + "lastUpdated": "2025-05-21", + "openWeights": false, + "releaseDate": "2025-05-21" + } + } + ] + }, + { + "id": "google/veo-3-fast", + "provider": "google", + "model": "veo-3-fast", + "displayName": "Veo-3-Fast", + "family": "veo", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/google/veo-3-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 480, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Veo-3-Fast" + ], + "families": [ + "veo" + ], + "releaseDate": "2025-10-13", + "lastUpdated": "2025-10-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/veo-3-fast", + "modelKey": "google/veo-3-fast", + "displayName": "Veo-3-Fast", + "family": "veo", + "metadata": { + "lastUpdated": "2025-10-13", + "openWeights": false, + "releaseDate": "2025-10-13" + } + } + ] + }, + { + "id": "google/veo-3.0-fast-generate-001", + "provider": "google", + "model": "veo-3.0-fast-generate-001", + "displayName": "Veo 3.0 Fast Generate", + "family": "veo", + "mode": "video_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vertex_ai-video-models" + ], + "aliases": [ + "vercel/google/veo-3.0-fast-generate-001", + "vertex_ai-video-models/vertex_ai/veo-3.0-fast-generate-001" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1024, + "inputTokens": 1024, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text", + "video" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-video-models", + "model": "vertex_ai/veo-3.0-fast-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Veo 3.0 Fast Generate" + ], + "families": [ + "veo" + ], + "modes": [ + "video_generation" + ], + "releaseDate": "2026-06-08", + "lastUpdated": "2026-06-08", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/veo-3.0-fast-generate-001", + "modelKey": "google/veo-3.0-fast-generate-001", + "displayName": "Veo 3.0 Fast Generate", + "family": "veo", + "metadata": { + "lastUpdated": "2026-06-08", + "openWeights": false, + "releaseDate": "2026-06-08" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-video-models", + "model": "vertex_ai/veo-3.0-fast-generate-001", + "mode": "video_generation", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/video" + } + } + ] + }, + { + "id": "google/veo-3.0-generate-001", + "provider": "google", + "model": "veo-3.0-generate-001", + "displayName": "Veo 3.0", + "family": "veo", + "mode": "video_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vertex_ai-video-models" + ], + "aliases": [ + "vercel/google/veo-3.0-generate-001", + "vertex_ai-video-models/vertex_ai/veo-3.0-generate-001" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1024, + "inputTokens": 1024, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text", + "video" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-video-models", + "model": "vertex_ai/veo-3.0-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Veo 3.0" + ], + "families": [ + "veo" + ], + "modes": [ + "video_generation" + ], + "releaseDate": "2026-06-08", + "lastUpdated": "2026-06-08", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/veo-3.0-generate-001", + "modelKey": "google/veo-3.0-generate-001", + "displayName": "Veo 3.0", + "family": "veo", + "metadata": { + "lastUpdated": "2026-06-08", + "openWeights": false, + "releaseDate": "2026-06-08" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-video-models", + "model": "vertex_ai/veo-3.0-generate-001", + "mode": "video_generation", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/video" + } + } + ] + }, + { + "id": "google/veo-3.1", + "provider": "google", + "model": "veo-3.1", + "displayName": "Veo-3.1", + "family": "veo", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/google/veo-3.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 480, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Veo-3.1" + ], + "families": [ + "veo" + ], + "releaseDate": "2025-10-15", + "lastUpdated": "2025-10-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/veo-3.1", + "modelKey": "google/veo-3.1", + "displayName": "Veo-3.1", + "family": "veo", + "metadata": { + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + } + ] + }, + { + "id": "google/veo-3.1-fast", + "provider": "google", + "model": "veo-3.1-fast", + "displayName": "Veo-3.1-Fast", + "family": "veo", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/google/veo-3.1-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 480, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Veo-3.1-Fast" + ], + "families": [ + "veo" + ], + "releaseDate": "2025-10-15", + "lastUpdated": "2025-10-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "google/veo-3.1-fast", + "modelKey": "google/veo-3.1-fast", + "displayName": "Veo-3.1-Fast", + "family": "veo", + "metadata": { + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + } + ] + }, + { + "id": "google/veo-3.1-fast-generate-001", + "provider": "google", + "model": "veo-3.1-fast-generate-001", + "displayName": "Veo 3.1 Fast Generate", + "family": "veo", + "mode": "video_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "gemini", + "vercel", + "vertex_ai-video-models" + ], + "aliases": [ + "gemini/veo-3.1-fast-generate-001", + "vercel/google/veo-3.1-fast-generate-001", + "vertex_ai-video-models/vertex_ai/veo-3.1-fast-generate-001" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1024, + "inputTokens": 1024, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text", + "video" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/veo-3.1-fast-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-video-models", + "model": "vertex_ai/veo-3.1-fast-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Veo 3.1 Fast Generate" + ], + "families": [ + "veo" + ], + "modes": [ + "video_generation" + ], + "releaseDate": "2026-06-08", + "lastUpdated": "2026-06-08", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/veo-3.1-fast-generate-001", + "modelKey": "google/veo-3.1-fast-generate-001", + "displayName": "Veo 3.1 Fast Generate", + "family": "veo", + "metadata": { + "lastUpdated": "2026-06-08", + "openWeights": false, + "releaseDate": "2026-06-08" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/veo-3.1-fast-generate-001", + "mode": "video_generation", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/video" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-video-models", + "model": "vertex_ai/veo-3.1-fast-generate-001", + "mode": "video_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/veo" + } + } + ] + }, + { + "id": "google/veo-3.1-fast-generate-preview", + "provider": "google", + "model": "veo-3.1-fast-generate-preview", + "mode": "video_generation", + "sources": [ + "litellm" + ], + "providers": [ + "gemini", + "vertex_ai-video-models" + ], + "aliases": [ + "gemini/veo-3.1-fast-generate-preview", + "vertex_ai-video-models/vertex_ai/veo-3.1-fast-generate-preview" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1024, + "inputTokens": 1024, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/veo-3.1-fast-generate-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-video-models", + "model": "vertex_ai/veo-3.1-fast-generate-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.15 + } + } + ] + }, + "metadata": { + "modes": [ + "video_generation" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/veo-3.1-fast-generate-preview", + "mode": "video_generation", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/video" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-video-models", + "model": "vertex_ai/veo-3.1-fast-generate-preview", + "mode": "video_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/veo" + } + } + ] + }, + { + "id": "google/veo-3.1-generate-001", + "provider": "google", + "model": "veo-3.1-generate-001", + "displayName": "Veo 3.1", + "family": "veo", + "mode": "video_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "gemini", + "vercel", + "vertex_ai-video-models" + ], + "aliases": [ + "gemini/veo-3.1-generate-001", + "vercel/google/veo-3.1-generate-001", + "vertex_ai-video-models/vertex_ai/veo-3.1-generate-001" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1024, + "inputTokens": 1024, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text", + "video" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/veo-3.1-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-video-models", + "model": "vertex_ai/veo-3.1-generate-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Veo 3.1" + ], + "families": [ + "veo" + ], + "modes": [ + "video_generation" + ], + "releaseDate": "2026-06-08", + "lastUpdated": "2026-06-08", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "google/veo-3.1-generate-001", + "modelKey": "google/veo-3.1-generate-001", + "displayName": "Veo 3.1", + "family": "veo", + "metadata": { + "lastUpdated": "2026-06-08", + "openWeights": false, + "releaseDate": "2026-06-08" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/veo-3.1-generate-001", + "mode": "video_generation", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/video" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-video-models", + "model": "vertex_ai/veo-3.1-generate-001", + "mode": "video_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/veo" + } + } + ] + }, + { + "id": "google/veo-3.1-generate-preview", + "provider": "google", + "model": "veo-3.1-generate-preview", + "mode": "video_generation", + "sources": [ + "litellm" + ], + "providers": [ + "gemini", + "vertex_ai-video-models" + ], + "aliases": [ + "gemini/veo-3.1-generate-preview", + "vertex_ai-video-models/vertex_ai/veo-3.1-generate-preview" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1024, + "inputTokens": 1024, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/veo-3.1-generate-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-video-models", + "model": "vertex_ai/veo-3.1-generate-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.4 + } + } + ] + }, + "metadata": { + "modes": [ + "video_generation" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/veo-3.1-generate-preview", + "mode": "video_generation", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/video" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-video-models", + "model": "vertex_ai/veo-3.1-generate-preview", + "mode": "video_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/veo" + } + } + ] + }, + { + "id": "google/veo-3.1-lite-generate-preview", + "provider": "google", + "model": "veo-3.1-lite-generate-preview", + "mode": "video_generation", + "sources": [ + "litellm" + ], + "providers": [ + "gemini" + ], + "aliases": [ + "gemini/veo-3.1-lite-generate-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1024, + "inputTokens": 1024, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gemini", + "model": "gemini/veo-3.1-lite-generate-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.05 + }, + "perVideoSecond": { + "output1080p": 0.08 + } + } + ] + }, + "metadata": { + "modes": [ + "video_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gemini", + "model": "gemini/veo-3.1-lite-generate-preview", + "mode": "video_generation", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/video" + } + } + ] + }, + { + "id": "google/veo3.1", + "provider": "google", + "model": "veo3.1", + "displayName": "Veo 3.1", + "family": "veo", + "sources": [ + "models.dev" + ], + "providers": [ + "fastrouter" + ], + "aliases": [ + "fastrouter/google/veo3.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Veo 3.1" + ], + "families": [ + "veo" + ], + "releaseDate": "2026-05-01", + "lastUpdated": "2026-05-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "google/veo3.1", + "modelKey": "google/veo3.1", + "displayName": "Veo 3.1", + "family": "veo", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-05-01" + } + } + ] + }, + { + "id": "google/veo3.1-fast", + "provider": "google", + "model": "veo3.1-fast", + "displayName": "Veo 3.1 Fast", + "family": "veo", + "sources": [ + "models.dev" + ], + "providers": [ + "fastrouter" + ], + "aliases": [ + "fastrouter/google/veo3.1-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Veo 3.1 Fast" + ], + "families": [ + "veo" + ], + "releaseDate": "2026-05-01", + "lastUpdated": "2026-05-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "google/veo3.1-fast", + "modelKey": "google/veo3.1-fast", + "displayName": "Veo 3.1 Fast", + "family": "veo", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-05-01" + } + } + ] + }, + { + "id": "google/veo3.1-lite", + "provider": "google", + "model": "veo3.1-lite", + "displayName": "Veo 3.1 Lite", + "family": "veo", + "sources": [ + "models.dev" + ], + "providers": [ + "fastrouter" + ], + "aliases": [ + "fastrouter/google/veo3.1-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Veo 3.1 Lite" + ], + "families": [ + "veo" + ], + "releaseDate": "2026-05-01", + "lastUpdated": "2026-05-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "google/veo3.1-lite", + "modelKey": "google/veo3.1-lite", + "displayName": "Veo 3.1 Lite", + "family": "veo", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-05-01" + } + } + ] + }, + { + "id": "gradient-ai/alibaba-qwen3-32b", + "provider": "gradient-ai", + "model": "alibaba-qwen3-32b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gradient_ai" + ], + "aliases": [ + "gradient_ai/alibaba-qwen3-32b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 40960, + "outputTokens": 40960, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gradient_ai", + "model": "gradient_ai/alibaba-qwen3-32b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gradient_ai", + "model": "gradient_ai/alibaba-qwen3-32b", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + } + ] + }, + { + "id": "gradient-ai/anthropic-claude-3-opus", + "provider": "gradient-ai", + "model": "anthropic-claude-3-opus", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gradient_ai" + ], + "aliases": [ + "gradient_ai/anthropic-claude-3-opus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gradient_ai", + "model": "gradient_ai/anthropic-claude-3-opus", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gradient_ai", + "model": "gradient_ai/anthropic-claude-3-opus", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + } + ] + }, + { + "id": "gradient-ai/anthropic-claude-3.5-haiku", + "provider": "gradient-ai", + "model": "anthropic-claude-3.5-haiku", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gradient_ai" + ], + "aliases": [ + "gradient_ai/anthropic-claude-3.5-haiku" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gradient_ai", + "model": "gradient_ai/anthropic-claude-3.5-haiku", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gradient_ai", + "model": "gradient_ai/anthropic-claude-3.5-haiku", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + } + ] + }, + { + "id": "gradient-ai/anthropic-claude-3.5-sonnet", + "provider": "gradient-ai", + "model": "anthropic-claude-3.5-sonnet", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gradient_ai" + ], + "aliases": [ + "gradient_ai/anthropic-claude-3.5-sonnet" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gradient_ai", + "model": "gradient_ai/anthropic-claude-3.5-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gradient_ai", + "model": "gradient_ai/anthropic-claude-3.5-sonnet", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + } + ] + }, + { + "id": "gradient-ai/anthropic-claude-3.7-sonnet", + "provider": "gradient-ai", + "model": "anthropic-claude-3.7-sonnet", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gradient_ai" + ], + "aliases": [ + "gradient_ai/anthropic-claude-3.7-sonnet" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gradient_ai", + "model": "gradient_ai/anthropic-claude-3.7-sonnet", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gradient_ai", + "model": "gradient_ai/anthropic-claude-3.7-sonnet", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + } + ] + }, + { + "id": "gradient-ai/llama3-8b-instruct", + "provider": "gradient-ai", + "model": "llama3-8b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gradient_ai" + ], + "aliases": [ + "gradient_ai/llama3-8b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 512, + "outputTokens": 512, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gradient_ai", + "model": "gradient_ai/llama3-8b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gradient_ai", + "model": "gradient_ai/llama3-8b-instruct", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + } + ] + }, + { + "id": "gradient-ai/llama3.3-70b-instruct", + "provider": "gradient-ai", + "model": "llama3.3-70b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gradient_ai" + ], + "aliases": [ + "gradient_ai/llama3.3-70b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 2048, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gradient_ai", + "model": "gradient_ai/llama3.3-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.65, + "output": 0.65 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gradient_ai", + "model": "gradient_ai/llama3.3-70b-instruct", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + } + ] + }, + { + "id": "gradient-ai/openai-gpt-4o", + "provider": "gradient-ai", + "model": "openai-gpt-4o", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gradient_ai" + ], + "aliases": [ + "gradient_ai/openai-gpt-4o" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gradient_ai", + "model": "gradient_ai/openai-gpt-4o", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gradient_ai", + "model": "gradient_ai/openai-gpt-4o", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + } + ] + }, + { + "id": "gradient-ai/openai-gpt-4o-mini", + "provider": "gradient-ai", + "model": "openai-gpt-4o-mini", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gradient_ai" + ], + "aliases": [ + "gradient_ai/openai-gpt-4o-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gradient_ai", + "model": "gradient_ai/openai-gpt-4o-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gradient_ai", + "model": "gradient_ai/openai-gpt-4o-mini", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + } + ] + }, + { + "id": "gradient-ai/openai-o3", + "provider": "gradient-ai", + "model": "openai-o3", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gradient_ai" + ], + "aliases": [ + "gradient_ai/openai-o3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gradient_ai", + "model": "gradient_ai/openai-o3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gradient_ai", + "model": "gradient_ai/openai-o3", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + } + ] + }, + { + "id": "gradient-ai/openai-o3-mini", + "provider": "gradient-ai", + "model": "openai-o3-mini", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "gradient_ai" + ], + "aliases": [ + "gradient_ai/openai-o3-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "gradient_ai", + "model": "gradient_ai/openai-o3-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.1, + "output": 4.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gradient_ai", + "model": "gradient_ai/openai-o3-mini", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + } + ] + }, + { + "id": "groq/compound", + "provider": "groq", + "model": "compound", + "displayName": "Compound", + "family": "groq", + "sources": [ + "models.dev" + ], + "providers": [ + "groq" + ], + "aliases": [ + "groq/compound" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Compound" + ], + "families": [ + "groq" + ], + "releaseDate": "2025-09-04", + "lastUpdated": "2025-09-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "groq", + "providerName": "Groq", + "providerDoc": "https://console.groq.com/docs/models", + "model": "groq/compound", + "modelKey": "groq/compound", + "displayName": "Compound", + "family": "groq", + "metadata": { + "lastUpdated": "2025-09-04", + "openWeights": false, + "releaseDate": "2025-09-04" + } + } + ] + }, + { + "id": "groq/compound-mini", + "provider": "groq", + "model": "compound-mini", + "displayName": "Compound Mini", + "family": "groq", + "sources": [ + "models.dev" + ], + "providers": [ + "groq" + ], + "aliases": [ + "groq/compound-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Compound Mini" + ], + "families": [ + "groq" + ], + "releaseDate": "2025-09-04", + "lastUpdated": "2025-09-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "groq", + "providerName": "Groq", + "providerDoc": "https://console.groq.com/docs/models", + "model": "groq/compound-mini", + "modelKey": "groq/compound-mini", + "displayName": "Compound Mini", + "family": "groq", + "metadata": { + "lastUpdated": "2025-09-04", + "openWeights": false, + "releaseDate": "2025-09-04" + } + } + ] + }, + { + "id": "groq/gemma-7b-it", + "provider": "groq", + "model": "gemma-7b-it", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "groq" + ], + "aliases": [ + "groq/gemma-7b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "groq", + "model": "groq/gemma-7b-it", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.08 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "groq", + "model": "groq/gemma-7b-it", + "mode": "chat" + } + ] + }, + { + "id": "groq/orpheus-arabic-saudi", + "provider": "groq", + "model": "orpheus-arabic-saudi", + "displayName": "Canopy Labs Orpheus Arabic Saudi", + "family": "canopylabs", + "sources": [ + "models.dev" + ], + "providers": [ + "groq" + ], + "aliases": [ + "groq/canopylabs/orpheus-arabic-saudi" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4000, + "outputTokens": 50000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Canopy Labs Orpheus Arabic Saudi" + ], + "families": [ + "canopylabs" + ], + "statuses": [ + "beta" + ], + "releaseDate": "2025-12-16", + "lastUpdated": "2025-12-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "groq", + "providerName": "Groq", + "providerDoc": "https://console.groq.com/docs/models", + "model": "canopylabs/orpheus-arabic-saudi", + "modelKey": "canopylabs/orpheus-arabic-saudi", + "displayName": "Canopy Labs Orpheus Arabic Saudi", + "family": "canopylabs", + "status": "beta", + "metadata": { + "lastUpdated": "2025-12-16", + "openWeights": false, + "releaseDate": "2025-12-16" + } + } + ] + }, + { + "id": "groq/orpheus-v1-english", + "provider": "groq", + "model": "orpheus-v1-english", + "displayName": "Canopy Labs Orpheus V1 English", + "family": "canopylabs", + "sources": [ + "models.dev" + ], + "providers": [ + "groq" + ], + "aliases": [ + "groq/canopylabs/orpheus-v1-english" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4000, + "outputTokens": 50000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Canopy Labs Orpheus V1 English" + ], + "families": [ + "canopylabs" + ], + "statuses": [ + "beta" + ], + "releaseDate": "2025-12-19", + "lastUpdated": "2025-12-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "groq", + "providerName": "Groq", + "providerDoc": "https://console.groq.com/docs/models", + "model": "canopylabs/orpheus-v1-english", + "modelKey": "canopylabs/orpheus-v1-english", + "displayName": "Canopy Labs Orpheus V1 English", + "family": "canopylabs", + "status": "beta", + "metadata": { + "lastUpdated": "2025-12-19", + "openWeights": false, + "releaseDate": "2025-12-19" + } + } + ] + }, + { + "id": "groq/playai-tts", + "provider": "groq", + "model": "playai-tts", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "groq" + ], + "aliases": [ + "groq/playai-tts" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 10000, + "inputTokens": 10000, + "maxTokens": 10000, + "outputTokens": 10000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "groq", + "model": "groq/playai-tts", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.00005 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "groq", + "model": "groq/playai-tts", + "mode": "audio_speech" + } + ] + }, + { + "id": "helicone/ernie-4.5-21b-a3b-thinking", + "provider": "helicone", + "model": "ernie-4.5-21b-a3b-thinking", + "displayName": "Baidu Ernie 4.5 21B A3B Thinking", + "family": "ernie", + "sources": [ + "models.dev" + ], + "providers": [ + "helicone" + ], + "aliases": [ + "helicone/ernie-4.5-21b-a3b-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "ernie-4.5-21b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Baidu Ernie 4.5 21B A3B Thinking" + ], + "families": [ + "ernie" + ], + "knowledgeCutoff": "2025-03", + "releaseDate": "2025-03-16", + "lastUpdated": "2025-03-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "ernie-4.5-21b-a3b-thinking", + "modelKey": "ernie-4.5-21b-a3b-thinking", + "displayName": "Baidu Ernie 4.5 21B A3B Thinking", + "family": "ernie", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2025-03-16", + "openWeights": false, + "releaseDate": "2025-03-16" + } + } + ] + }, + { + "id": "helicone/gemma-3-12b-it", + "provider": "helicone", + "model": "gemma-3-12b-it", + "displayName": "Google Gemma 3 12B", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "helicone" + ], + "aliases": [ + "helicone/gemma-3-12b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "gemma-3-12b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.049999999999999996, + "output": 0.09999999999999999 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Google Gemma 3 12B" + ], + "families": [ + "gemma" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2024-12-01", + "lastUpdated": "2024-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gemma-3-12b-it", + "modelKey": "gemma-3-12b-it", + "displayName": "Google Gemma 3 12B", + "family": "gemma", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2024-12-01", + "openWeights": false, + "releaseDate": "2024-12-01" + } + } + ] + }, + { + "id": "helicone/gemma2-9b-it", + "provider": "helicone", + "model": "gemma2-9b-it", + "displayName": "Google Gemma 2", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "helicone" + ], + "aliases": [ + "helicone/gemma2-9b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "gemma2-9b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.01, + "output": 0.03 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Google Gemma 2" + ], + "families": [ + "gemma" + ], + "knowledgeCutoff": "2024-06", + "releaseDate": "2024-06-25", + "lastUpdated": "2024-06-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gemma2-9b-it", + "modelKey": "gemma2-9b-it", + "displayName": "Google Gemma 2", + "family": "gemma", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2024-06-25", + "openWeights": false, + "releaseDate": "2024-06-25" + } + } + ] + }, + { + "id": "helicone/hermes-2-pro-llama-3-8b", + "provider": "helicone", + "model": "hermes-2-pro-llama-3-8b", + "displayName": "Hermes 2 Pro Llama 3 8B", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "helicone" + ], + "aliases": [ + "helicone/hermes-2-pro-llama-3-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "hermes-2-pro-llama-3-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes 2 Pro Llama 3 8B" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2024-05", + "releaseDate": "2024-05-27", + "lastUpdated": "2024-05-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "hermes-2-pro-llama-3-8b", + "modelKey": "hermes-2-pro-llama-3-8b", + "displayName": "Hermes 2 Pro Llama 3 8B", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2024-05-27", + "openWeights": false, + "releaseDate": "2024-05-27" + } + } + ] + }, + { + "id": "helicone/o1", + "provider": "helicone", + "model": "o1", + "displayName": "OpenAI: o1", + "family": "o", + "sources": [ + "models.dev" + ], + "providers": [ + "helicone" + ], + "aliases": [ + "helicone/o1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "o1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI: o1" + ], + "families": [ + "o" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "o1", + "modelKey": "o1", + "displayName": "OpenAI: o1", + "family": "o", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + } + ] + }, + { + "id": "helicone/o3", + "provider": "helicone", + "model": "o3", + "displayName": "OpenAI o3", + "family": "o", + "sources": [ + "models.dev" + ], + "providers": [ + "helicone" + ], + "aliases": [ + "helicone/o3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "o3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI o3" + ], + "families": [ + "o" + ], + "knowledgeCutoff": "2024-06", + "releaseDate": "2024-06-01", + "lastUpdated": "2024-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "o3", + "modelKey": "o3", + "displayName": "OpenAI o3", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2024-06-01", + "openWeights": false, + "releaseDate": "2024-06-01" + } + } + ] + }, + { + "id": "helicone/sonar", + "provider": "helicone", + "model": "sonar", + "displayName": "Perplexity Sonar", + "family": "sonar", + "sources": [ + "models.dev" + ], + "providers": [ + "helicone" + ], + "aliases": [ + "helicone/sonar" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 127000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "sonar", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Perplexity Sonar" + ], + "families": [ + "sonar" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-01-27", + "lastUpdated": "2025-01-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "sonar", + "modelKey": "sonar", + "displayName": "Perplexity Sonar", + "family": "sonar", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-27", + "openWeights": false, + "releaseDate": "2025-01-27" + } + } + ] + }, + { + "id": "huggingface/mimo-v2-flash", + "provider": "huggingface", + "model": "mimo-v2-flash", + "displayName": "MiMo-V2-Flash", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "huggingface" + ], + "aliases": [ + "huggingface/XiaomiMiMo/MiMo-V2-Flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "huggingface", + "model": "XiaomiMiMo/MiMo-V2-Flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-Flash" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-12-16", + "lastUpdated": "2025-12-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "XiaomiMiMo/MiMo-V2-Flash", + "modelKey": "XiaomiMiMo/MiMo-V2-Flash", + "displayName": "MiMo-V2-Flash", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-12-16", + "openWeights": true, + "releaseDate": "2025-12-16" + } + } + ] + }, + { + "id": "hyperbolic/hermes-3-llama-3.1-70b", + "provider": "hyperbolic", + "model": "hermes-3-llama-3.1-70b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "hyperbolic" + ], + "aliases": [ + "hyperbolic/NousResearch/Hermes-3-Llama-3.1-70B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "hyperbolic", + "model": "hyperbolic/NousResearch/Hermes-3-Llama-3.1-70B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "hyperbolic", + "model": "hyperbolic/NousResearch/Hermes-3-Llama-3.1-70B", + "mode": "chat" + } + ] + }, + { + "id": "inception/mercury-2", + "provider": "inception", + "model": "mercury-2", + "displayName": "Mercury 2", + "family": "mercury", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "inception" + ], + "aliases": [ + "inception/mercury-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 50000, + "outputTokens": 50000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "inception", + "model": "mercury-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 0.75 + } + }, + { + "source": "litellm", + "provider": "inception", + "model": "inception/mercury-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 0.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mercury 2" + ], + "families": [ + "mercury" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01-01", + "releaseDate": "2026-02-24", + "lastUpdated": "2026-02-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "inception", + "providerName": "Inception", + "providerApi": "https://api.inceptionlabs.ai/v1/", + "providerDoc": "https://platform.inceptionlabs.ai/docs", + "model": "mercury-2", + "modelKey": "mercury-2", + "displayName": "Mercury 2", + "family": "mercury", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-02-24", + "openWeights": false, + "releaseDate": "2026-02-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "inception", + "model": "inception/mercury-2", + "mode": "chat" + } + ] + }, + { + "id": "inception/mercury-edit-2", + "provider": "inception", + "model": "mercury-edit-2", + "displayName": "Mercury Edit 2", + "sources": [ + "models.dev" + ], + "providers": [ + "inception" + ], + "aliases": [ + "inception/mercury-edit-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "inception", + "model": "mercury-edit-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 0.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mercury Edit 2" + ], + "releaseDate": "2026-03-30", + "lastUpdated": "2026-03-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "inception", + "providerName": "Inception", + "providerApi": "https://api.inceptionlabs.ai/v1/", + "providerDoc": "https://platform.inceptionlabs.ai/docs", + "model": "mercury-edit-2", + "modelKey": "mercury-edit-2", + "displayName": "Mercury Edit 2", + "metadata": { + "lastUpdated": "2026-03-30", + "openWeights": false, + "releaseDate": "2026-03-30" + } + } + ] + }, + { + "id": "inference/osmosis-structure-0.6b", + "provider": "inference", + "model": "osmosis-structure-0.6b", + "displayName": "Osmosis Structure 0.6B", + "family": "osmosis", + "sources": [ + "models.dev" + ], + "providers": [ + "inference" + ], + "aliases": [ + "inference/osmosis/osmosis-structure-0.6b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4000, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "inference", + "model": "osmosis/osmosis-structure-0.6b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Osmosis Structure 0.6B" + ], + "families": [ + "osmosis" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "inference", + "providerName": "Inference", + "providerApi": "https://inference.net/v1", + "providerDoc": "https://inference.net/models", + "model": "osmosis/osmosis-structure-0.6b", + "modelKey": "osmosis/osmosis-structure-0.6b", + "displayName": "Osmosis Structure 0.6B", + "family": "osmosis", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-01", + "openWeights": true, + "releaseDate": "2025-01-01" + } + } + ] + }, + { + "id": "jiekou/ernie-4.5-300b-a47b-paddle", + "provider": "jiekou", + "model": "ernie-4.5-300b-a47b-paddle", + "displayName": "ERNIE 4.5 300B A47B", + "family": "ernie", + "sources": [ + "models.dev" + ], + "providers": [ + "jiekou" + ], + "aliases": [ + "jiekou/baidu/ernie-4.5-300b-a47b-paddle" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 123000, + "outputTokens": 12000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "jiekou", + "model": "baidu/ernie-4.5-300b-a47b-paddle", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.28, + "output": 1.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ERNIE 4.5 300B A47B" + ], + "families": [ + "ernie" + ], + "releaseDate": "2026-01", + "lastUpdated": "2026-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "baidu/ernie-4.5-300b-a47b-paddle", + "modelKey": "baidu/ernie-4.5-300b-a47b-paddle", + "displayName": "ERNIE 4.5 300B A47B", + "family": "ernie", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + } + ] + }, + { + "id": "jiekou/ernie-4.5-vl-424b-a47b", + "provider": "jiekou", + "model": "ernie-4.5-vl-424b-a47b", + "displayName": "ERNIE 4.5 VL 424B A47B", + "family": "ernie", + "sources": [ + "models.dev" + ], + "providers": [ + "jiekou" + ], + "aliases": [ + "jiekou/baidu/ernie-4.5-vl-424b-a47b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 123000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "jiekou", + "model": "baidu/ernie-4.5-vl-424b-a47b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.42, + "output": 1.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ERNIE 4.5 VL 424B A47B" + ], + "families": [ + "ernie" + ], + "releaseDate": "2026-01", + "lastUpdated": "2026-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "baidu/ernie-4.5-vl-424b-a47b", + "modelKey": "baidu/ernie-4.5-vl-424b-a47b", + "displayName": "ERNIE 4.5 VL 424B A47B", + "family": "ernie", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + } + ] + }, + { + "id": "jiekou/mimo-v2-flash", + "provider": "jiekou", + "model": "mimo-v2-flash", + "displayName": "XiaomiMiMo/MiMo-V2-Flash", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "jiekou" + ], + "aliases": [ + "jiekou/xiaomimimo/mimo-v2-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "jiekou", + "model": "xiaomimimo/mimo-v2-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "XiaomiMiMo/MiMo-V2-Flash" + ], + "families": [ + "mimo" + ], + "releaseDate": "2026-01", + "lastUpdated": "2026-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "xiaomimimo/mimo-v2-flash", + "modelKey": "xiaomimimo/mimo-v2-flash", + "displayName": "XiaomiMiMo/MiMo-V2-Flash", + "family": "mimo", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + } + ] + }, + { + "id": "jiekou/o3", + "provider": "jiekou", + "model": "o3", + "displayName": "o3", + "sources": [ + "models.dev" + ], + "providers": [ + "jiekou" + ], + "aliases": [ + "jiekou/o3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "jiekou", + "model": "o3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 40 + } + } + ] + }, + "metadata": { + "displayNames": [ + "o3" + ], + "releaseDate": "2026-01", + "lastUpdated": "2026-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "o3", + "modelKey": "o3", + "displayName": "o3", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + } + ] + }, + { + "id": "jina-ai/jina-reranker-v2-base-multilingual", + "provider": "jina-ai", + "model": "jina-reranker-v2-base-multilingual", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "jina_ai" + ], + "aliases": [ + "jina_ai/jina-reranker-v2-base-multilingual" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1024, + "inputTokens": 1024, + "maxDocumentChunksPerQuery": 2048, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "jina_ai", + "model": "jina-reranker-v2-base-multilingual", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.018, + "output": 0.018 + }, + "extra": { + "max_document_chunks_per_query": 2048 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "jina_ai", + "model": "jina-reranker-v2-base-multilingual", + "mode": "rerank" + } + ] + }, + { + "id": "kilo/aion-1.0", + "provider": "kilo", + "model": "aion-1.0", + "displayName": "AionLabs: Aion-1.0", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/aion-labs/aion-1.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "aion-labs/aion-1.0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4, + "output": 8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "AionLabs: Aion-1.0" + ], + "releaseDate": "2025-02-05", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "aion-labs/aion-1.0", + "modelKey": "aion-labs/aion-1.0", + "displayName": "AionLabs: Aion-1.0", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-02-05" + } + } + ] + }, + { + "id": "kilo/aion-1.0-mini", + "provider": "kilo", + "model": "aion-1.0-mini", + "displayName": "AionLabs: Aion-1.0-Mini", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/aion-labs/aion-1.0-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "aion-labs/aion-1.0-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 1.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "AionLabs: Aion-1.0-Mini" + ], + "releaseDate": "2025-02-05", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "aion-labs/aion-1.0-mini", + "modelKey": "aion-labs/aion-1.0-mini", + "displayName": "AionLabs: Aion-1.0-Mini", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-02-05" + } + } + ] + }, + { + "id": "kilo/aion-2.0", + "provider": "kilo", + "model": "aion-2.0", + "displayName": "AionLabs: Aion-2.0", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/aion-labs/aion-2.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "aion-labs/aion-2.0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 1.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "AionLabs: Aion-2.0" + ], + "releaseDate": "2026-02-24", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "aion-labs/aion-2.0", + "modelKey": "aion-labs/aion-2.0", + "displayName": "AionLabs: Aion-2.0", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-02-24" + } + } + ] + }, + { + "id": "kilo/aion-rp-llama-3.1-8b", + "provider": "kilo", + "model": "aion-rp-llama-3.1-8b", + "displayName": "AionLabs: Aion-RP 1.0 (8B)", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/aion-labs/aion-rp-llama-3.1-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "aion-labs/aion-rp-llama-3.1-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 1.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "AionLabs: Aion-RP 1.0 (8B)" + ], + "releaseDate": "2025-02-05", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "aion-labs/aion-rp-llama-3.1-8b", + "modelKey": "aion-labs/aion-rp-llama-3.1-8b", + "displayName": "AionLabs: Aion-RP 1.0 (8B)", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-02-05" + } + } + ] + }, + { + "id": "kilo/auto", + "provider": "kilo", + "model": "auto", + "displayName": "Auto Router", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/openrouter/auto" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2000000, + "outputTokens": 32768, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openrouter/auto", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Auto Router" + ], + "releaseDate": "2026-03-15", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openrouter/auto", + "modelKey": "openrouter/auto", + "displayName": "Auto Router", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-03-15" + } + } + ] + }, + { + "id": "kilo/balanced", + "provider": "kilo", + "model": "balanced", + "displayName": "Kilo Auto Balanced", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/kilo-auto/balanced" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "kilo-auto/balanced", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kilo Auto Balanced" + ], + "releaseDate": "2026-03-15", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "kilo-auto/balanced", + "modelKey": "kilo-auto/balanced", + "displayName": "Kilo Auto Balanced", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-03-15" + } + } + ] + }, + { + "id": "kilo/bodybuilder", + "provider": "kilo", + "model": "bodybuilder", + "displayName": "Body Builder (beta)", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/openrouter/bodybuilder" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openrouter/bodybuilder", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Body Builder (beta)" + ], + "statuses": [ + "beta" + ], + "releaseDate": "2026-03-15", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openrouter/bodybuilder", + "modelKey": "openrouter/bodybuilder", + "displayName": "Body Builder (beta)", + "status": "beta", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-03-15" + } + } + ] + }, + { + "id": "kilo/cobuddy:free", + "provider": "kilo", + "model": "cobuddy:free", + "displayName": "Baidu: CoBuddy (free)", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/baidu/cobuddy:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "baidu/cobuddy:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Baidu: CoBuddy (free)" + ], + "releaseDate": "2026-05-06", + "lastUpdated": "2026-05-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "baidu/cobuddy:free", + "modelKey": "baidu/cobuddy:free", + "displayName": "Baidu: CoBuddy (free)", + "metadata": { + "lastUpdated": "2026-05-07", + "openWeights": false, + "releaseDate": "2026-05-06" + } + } + ] + }, + { + "id": "kilo/coder-large", + "provider": "kilo", + "model": "coder-large", + "displayName": "Arcee AI: Coder Large", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/arcee-ai/coder-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "arcee-ai/coder-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 0.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Arcee AI: Coder Large" + ], + "releaseDate": "2025-05-06", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "arcee-ai/coder-large", + "modelKey": "arcee-ai/coder-large", + "displayName": "Arcee AI: Coder Large", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-05-06" + } + } + ] + }, + { + "id": "kilo/cogito-v2.1-671b", + "provider": "kilo", + "model": "cogito-v2.1-671b", + "displayName": "Deep Cogito: Cogito v2.1 671B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/deepcogito/cogito-v2.1-671b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "deepcogito/cogito-v2.1-671b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 1.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Deep Cogito: Cogito v2.1 671B" + ], + "releaseDate": "2025-11-14", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "deepcogito/cogito-v2.1-671b", + "modelKey": "deepcogito/cogito-v2.1-671b", + "displayName": "Deep Cogito: Cogito v2.1 671B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-11-14" + } + } + ] + }, + { + "id": "kilo/cydonia-24b-v4.1", + "provider": "kilo", + "model": "cydonia-24b-v4.1", + "displayName": "TheDrummer: Cydonia 24B V4.1", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/thedrummer/cydonia-24b-v4.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "thedrummer/cydonia-24b-v4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "TheDrummer: Cydonia 24B V4.1" + ], + "releaseDate": "2025-09-27", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "thedrummer/cydonia-24b-v4.1", + "modelKey": "thedrummer/cydonia-24b-v4.1", + "displayName": "TheDrummer: Cydonia 24B V4.1", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-09-27" + } + } + ] + }, + { + "id": "kilo/ernie-4.5-21b-a3b", + "provider": "kilo", + "model": "ernie-4.5-21b-a3b", + "displayName": "Baidu: ERNIE 4.5 21B A3B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/baidu/ernie-4.5-21b-a3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 120000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "baidu/ernie-4.5-21b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Baidu: ERNIE 4.5 21B A3B" + ], + "releaseDate": "2025-06-30", + "lastUpdated": "2025-06-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "baidu/ernie-4.5-21b-a3b", + "modelKey": "baidu/ernie-4.5-21b-a3b", + "displayName": "Baidu: ERNIE 4.5 21B A3B", + "metadata": { + "lastUpdated": "2025-06-30", + "openWeights": true, + "releaseDate": "2025-06-30" + } + } + ] + }, + { + "id": "kilo/ernie-4.5-21b-a3b-thinking", + "provider": "kilo", + "model": "ernie-4.5-21b-a3b-thinking", + "displayName": "Baidu: ERNIE 4.5 21B A3B Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/baidu/ernie-4.5-21b-a3b-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "baidu/ernie-4.5-21b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Baidu: ERNIE 4.5 21B A3B Thinking" + ], + "releaseDate": "2025-09-19", + "lastUpdated": "2025-09-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "baidu/ernie-4.5-21b-a3b-thinking", + "modelKey": "baidu/ernie-4.5-21b-a3b-thinking", + "displayName": "Baidu: ERNIE 4.5 21B A3B Thinking", + "metadata": { + "lastUpdated": "2025-09-19", + "openWeights": true, + "releaseDate": "2025-09-19" + } + } + ] + }, + { + "id": "kilo/ernie-4.5-300b-a47b", + "provider": "kilo", + "model": "ernie-4.5-300b-a47b", + "displayName": "Baidu: ERNIE 4.5 300B A47B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/baidu/ernie-4.5-300b-a47b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 123000, + "outputTokens": 12000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "baidu/ernie-4.5-300b-a47b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.28, + "output": 1.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Baidu: ERNIE 4.5 300B A47B" + ], + "releaseDate": "2025-06-30", + "lastUpdated": "2026-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "baidu/ernie-4.5-300b-a47b", + "modelKey": "baidu/ernie-4.5-300b-a47b", + "displayName": "Baidu: ERNIE 4.5 300B A47B", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2025-06-30" + } + } + ] + }, + { + "id": "kilo/ernie-4.5-vl-28b-a3b", + "provider": "kilo", + "model": "ernie-4.5-vl-28b-a3b", + "displayName": "Baidu: ERNIE 4.5 VL 28B A3B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/baidu/ernie-4.5-vl-28b-a3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 30000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "baidu/ernie-4.5-vl-28b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.56 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Baidu: ERNIE 4.5 VL 28B A3B" + ], + "releaseDate": "2025-06-30", + "lastUpdated": "2025-06-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "baidu/ernie-4.5-vl-28b-a3b", + "modelKey": "baidu/ernie-4.5-vl-28b-a3b", + "displayName": "Baidu: ERNIE 4.5 VL 28B A3B", + "metadata": { + "lastUpdated": "2025-06-30", + "openWeights": true, + "releaseDate": "2025-06-30" + } + } + ] + }, + { + "id": "kilo/ernie-4.5-vl-424b-a47b", + "provider": "kilo", + "model": "ernie-4.5-vl-424b-a47b", + "displayName": "Baidu: ERNIE 4.5 VL 424B A47B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/baidu/ernie-4.5-vl-424b-a47b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 123000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "baidu/ernie-4.5-vl-424b-a47b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.42, + "output": 1.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Baidu: ERNIE 4.5 VL 424B A47B" + ], + "releaseDate": "2025-06-30", + "lastUpdated": "2026-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "baidu/ernie-4.5-vl-424b-a47b", + "modelKey": "baidu/ernie-4.5-vl-424b-a47b", + "displayName": "Baidu: ERNIE 4.5 VL 424B A47B", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2025-06-30" + } + } + ] + }, + { + "id": "kilo/free", + "provider": "kilo", + "model": "free", + "displayName": "Kilo Auto Free", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/kilo-auto/free", + "kilo/openrouter/free" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 204800, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "kilo-auto/free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openrouter/free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Free Models Router", + "Kilo Auto Free" + ], + "releaseDate": "2026-03-15", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "kilo-auto/free", + "modelKey": "kilo-auto/free", + "displayName": "Kilo Auto Free", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-03-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openrouter/free", + "modelKey": "openrouter/free", + "displayName": "Free Models Router", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-02-01" + } + } + ] + }, + { + "id": "kilo/frontier", + "provider": "kilo", + "model": "frontier", + "displayName": "Kilo Auto Frontier", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/kilo-auto/frontier" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "kilo-auto/frontier", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kilo Auto Frontier" + ], + "releaseDate": "2026-03-15", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "kilo-auto/frontier", + "modelKey": "kilo-auto/frontier", + "displayName": "Kilo Auto Frontier", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-03-15" + } + } + ] + }, + { + "id": "kilo/granite-4.0-h-micro", + "provider": "kilo", + "model": "granite-4.0-h-micro", + "displayName": "IBM: Granite 4.0 Micro", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/ibm-granite/granite-4.0-h-micro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "ibm-granite/granite-4.0-h-micro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.017, + "output": 0.11 + } + } + ] + }, + "metadata": { + "displayNames": [ + "IBM: Granite 4.0 Micro" + ], + "releaseDate": "2025-10-20", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "ibm-granite/granite-4.0-h-micro", + "modelKey": "ibm-granite/granite-4.0-h-micro", + "displayName": "IBM: Granite 4.0 Micro", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-10-20" + } + } + ] + }, + { + "id": "kilo/granite-4.1-8b", + "provider": "kilo", + "model": "granite-4.1-8b", + "displayName": "IBM: Granite 4.1 8B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/ibm-granite/granite-4.1-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "ibm-granite/granite-4.1-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.05, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "IBM: Granite 4.1 8B" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-05-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "ibm-granite/granite-4.1-8b", + "modelKey": "ibm-granite/granite-4.1-8b", + "displayName": "IBM: Granite 4.1 8B", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-30" + } + } + ] + }, + { + "id": "kilo/hermes-2-pro-llama-3-8b", + "provider": "kilo", + "model": "hermes-2-pro-llama-3-8b", + "displayName": "NousResearch: Hermes 2 Pro - Llama-3 8B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/nousresearch/hermes-2-pro-llama-3-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "nousresearch/hermes-2-pro-llama-3-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NousResearch: Hermes 2 Pro - Llama-3 8B" + ], + "releaseDate": "2024-05-27", + "lastUpdated": "2024-06-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "nousresearch/hermes-2-pro-llama-3-8b", + "modelKey": "nousresearch/hermes-2-pro-llama-3-8b", + "displayName": "NousResearch: Hermes 2 Pro - Llama-3 8B", + "metadata": { + "lastUpdated": "2024-06-27", + "openWeights": true, + "releaseDate": "2024-05-27" + } + } + ] + }, + { + "id": "kilo/hermes-3-llama-3.1-405b", + "provider": "kilo", + "model": "hermes-3-llama-3.1-405b", + "displayName": "Nous: Hermes 3 405B Instruct", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/nousresearch/hermes-3-llama-3.1-405b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "nousresearch/hermes-3-llama-3.1-405b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nous: Hermes 3 405B Instruct" + ], + "releaseDate": "2024-08-16", + "lastUpdated": "2024-08-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "nousresearch/hermes-3-llama-3.1-405b", + "modelKey": "nousresearch/hermes-3-llama-3.1-405b", + "displayName": "Nous: Hermes 3 405B Instruct", + "metadata": { + "lastUpdated": "2024-08-16", + "openWeights": true, + "releaseDate": "2024-08-16" + } + } + ] + }, + { + "id": "kilo/hermes-3-llama-3.1-70b", + "provider": "kilo", + "model": "hermes-3-llama-3.1-70b", + "displayName": "Nous: Hermes 3 70B Instruct", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/nousresearch/hermes-3-llama-3.1-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "nousresearch/hermes-3-llama-3.1-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nous: Hermes 3 70B Instruct" + ], + "releaseDate": "2024-08-18", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "nousresearch/hermes-3-llama-3.1-70b", + "modelKey": "nousresearch/hermes-3-llama-3.1-70b", + "displayName": "Nous: Hermes 3 70B Instruct", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2024-08-18" + } + } + ] + }, + { + "id": "kilo/hermes-4-405b", + "provider": "kilo", + "model": "hermes-4-405b", + "displayName": "Nous: Hermes 4 405B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/nousresearch/hermes-4-405b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 26215, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "nousresearch/hermes-4-405b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nous: Hermes 4 405B" + ], + "releaseDate": "2025-08-25", + "lastUpdated": "2025-08-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "nousresearch/hermes-4-405b", + "modelKey": "nousresearch/hermes-4-405b", + "displayName": "Nous: Hermes 4 405B", + "metadata": { + "lastUpdated": "2025-08-25", + "openWeights": true, + "releaseDate": "2025-08-25", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "kilo/hermes-4-70b", + "provider": "kilo", + "model": "hermes-4-70b", + "displayName": "Nous: Hermes 4 70B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/nousresearch/hermes-4-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "nousresearch/hermes-4-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.055, + "input": 0.13, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nous: Hermes 4 70B" + ], + "releaseDate": "2025-08-25", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "nousresearch/hermes-4-70b", + "modelKey": "nousresearch/hermes-4-70b", + "displayName": "Nous: Hermes 4 70B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-08-25", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "kilo/hunyuan-a13b-instruct", + "provider": "kilo", + "model": "hunyuan-a13b-instruct", + "displayName": "Tencent: Hunyuan A13B Instruct", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/tencent/hunyuan-a13b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "tencent/hunyuan-a13b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.57 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Tencent: Hunyuan A13B Instruct" + ], + "releaseDate": "2025-06-30", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "tencent/hunyuan-a13b-instruct", + "modelKey": "tencent/hunyuan-a13b-instruct", + "displayName": "Tencent: Hunyuan A13B Instruct", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-06-30" + } + } + ] + }, + { + "id": "kilo/hy3-preview", + "provider": "kilo", + "model": "hy3-preview", + "displayName": "Tencent: Hy3 Preview", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/tencent/hy3-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "tencent/hy3-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.029, + "input": 0.066, + "output": 0.26 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Tencent: Hy3 Preview" + ], + "releaseDate": "2026-04-22", + "lastUpdated": "2026-05-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "tencent/hy3-preview", + "modelKey": "tencent/hy3-preview", + "displayName": "Tencent: Hy3 Preview", + "metadata": { + "lastUpdated": "2026-05-16", + "openWeights": false, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "kilo/inflection-3-pi", + "provider": "kilo", + "model": "inflection-3-pi", + "displayName": "Inflection: Inflection 3 Pi", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/inflection/inflection-3-pi" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "inflection/inflection-3-pi", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Inflection: Inflection 3 Pi" + ], + "releaseDate": "2024-10-11", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "inflection/inflection-3-pi", + "modelKey": "inflection/inflection-3-pi", + "displayName": "Inflection: Inflection 3 Pi", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-10-11" + } + } + ] + }, + { + "id": "kilo/inflection-3-productivity", + "provider": "kilo", + "model": "inflection-3-productivity", + "displayName": "Inflection: Inflection 3 Productivity", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/inflection/inflection-3-productivity" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "inflection/inflection-3-productivity", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Inflection: Inflection 3 Productivity" + ], + "releaseDate": "2024-10-11", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "inflection/inflection-3-productivity", + "modelKey": "inflection/inflection-3-productivity", + "displayName": "Inflection: Inflection 3 Productivity", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-10-11" + } + } + ] + }, + { + "id": "kilo/intellect-3", + "provider": "kilo", + "model": "intellect-3", + "displayName": "Prime Intellect: INTELLECT-3", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/prime-intellect/intellect-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "prime-intellect/intellect-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Prime Intellect: INTELLECT-3" + ], + "releaseDate": "2025-11-26", + "lastUpdated": "2026-02-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "prime-intellect/intellect-3", + "modelKey": "prime-intellect/intellect-3", + "displayName": "Prime Intellect: INTELLECT-3", + "metadata": { + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2025-11-26" + } + } + ] + }, + { + "id": "kilo/kat-coder-pro-v2", + "provider": "kilo", + "model": "kat-coder-pro-v2", + "displayName": "Kwaipilot: KAT-Coder-Pro V2", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/kwaipilot/kat-coder-pro-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 80000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "kwaipilot/kat-coder-pro-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kwaipilot: KAT-Coder-Pro V2" + ], + "releaseDate": "2026-03-27", + "lastUpdated": "2026-04-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "kwaipilot/kat-coder-pro-v2", + "modelKey": "kwaipilot/kat-coder-pro-v2", + "displayName": "Kwaipilot: KAT-Coder-Pro V2", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": true, + "releaseDate": "2026-03-27" + } + } + ] + }, + { + "id": "kilo/l3-euryale-70b", + "provider": "kilo", + "model": "l3-euryale-70b", + "displayName": "Sao10k: Llama 3 Euryale 70B v2.1", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/sao10k/l3-euryale-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "sao10k/l3-euryale-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.48, + "output": 1.48 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Sao10k: Llama 3 Euryale 70B v2.1" + ], + "releaseDate": "2024-06-18", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "sao10k/l3-euryale-70b", + "modelKey": "sao10k/l3-euryale-70b", + "displayName": "Sao10k: Llama 3 Euryale 70B v2.1", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2024-06-18" + } + } + ] + }, + { + "id": "kilo/l3-lunaris-8b", + "provider": "kilo", + "model": "l3-lunaris-8b", + "displayName": "Sao10K: Llama 3 8B Lunaris", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/sao10k/l3-lunaris-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "sao10k/l3-lunaris-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.05 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Sao10K: Llama 3 8B Lunaris" + ], + "releaseDate": "2024-08-13", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "sao10k/l3-lunaris-8b", + "modelKey": "sao10k/l3-lunaris-8b", + "displayName": "Sao10K: Llama 3 8B Lunaris", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2024-08-13" + } + } + ] + }, + { + "id": "kilo/l3.1-70b-hanami-x1", + "provider": "kilo", + "model": "l3.1-70b-hanami-x1", + "displayName": "Sao10K: Llama 3.1 70B Hanami x1", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/sao10k/l3.1-70b-hanami-x1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "sao10k/l3.1-70b-hanami-x1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Sao10K: Llama 3.1 70B Hanami x1" + ], + "releaseDate": "2025-01-08", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "sao10k/l3.1-70b-hanami-x1", + "modelKey": "sao10k/l3.1-70b-hanami-x1", + "displayName": "Sao10K: Llama 3.1 70B Hanami x1", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-01-08" + } + } + ] + }, + { + "id": "kilo/l3.1-euryale-70b", + "provider": "kilo", + "model": "l3.1-euryale-70b", + "displayName": "Sao10K: Llama 3.1 Euryale 70B v2.2", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/sao10k/l3.1-euryale-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "sao10k/l3.1-euryale-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.85, + "output": 0.85 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Sao10K: Llama 3.1 Euryale 70B v2.2" + ], + "releaseDate": "2024-08-28", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "sao10k/l3.1-euryale-70b", + "modelKey": "sao10k/l3.1-euryale-70b", + "displayName": "Sao10K: Llama 3.1 Euryale 70B v2.2", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2024-08-28" + } + } + ] + }, + { + "id": "kilo/l3.3-euryale-70b", + "provider": "kilo", + "model": "l3.3-euryale-70b", + "displayName": "Sao10K: Llama 3.3 Euryale 70B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/sao10k/l3.3-euryale-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "sao10k/l3.3-euryale-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.65, + "output": 0.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Sao10K: Llama 3.3 Euryale 70B" + ], + "releaseDate": "2024-12-18", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "sao10k/l3.3-euryale-70b", + "modelKey": "sao10k/l3.3-euryale-70b", + "displayName": "Sao10K: Llama 3.3 Euryale 70B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2024-12-18" + } + } + ] + }, + { + "id": "kilo/laguna-m.1:free", + "provider": "kilo", + "model": "laguna-m.1:free", + "displayName": "Poolside: Laguna M.1 (free)", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/poolside/laguna-m.1:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "poolside/laguna-m.1:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Poolside: Laguna M.1 (free)" + ], + "releaseDate": "2026-04-28", + "lastUpdated": "2026-06-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "poolside/laguna-m.1:free", + "modelKey": "poolside/laguna-m.1:free", + "displayName": "Poolside: Laguna M.1 (free)", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": false, + "releaseDate": "2026-04-28" + } + } + ] + }, + { + "id": "kilo/laguna-xs.2:free", + "provider": "kilo", + "model": "laguna-xs.2:free", + "displayName": "Poolside: Laguna XS.2 (free)", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/poolside/laguna-xs.2:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "poolside/laguna-xs.2:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Poolside: Laguna XS.2 (free)" + ], + "releaseDate": "2026-04-28", + "lastUpdated": "2026-06-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "poolside/laguna-xs.2:free", + "modelKey": "poolside/laguna-xs.2:free", + "displayName": "Poolside: Laguna XS.2 (free)", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": false, + "releaseDate": "2026-04-28" + } + } + ] + }, + { + "id": "kilo/lfm-2-24b-a2b", + "provider": "kilo", + "model": "lfm-2-24b-a2b", + "displayName": "LiquidAI: LFM2-24B-A2B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/liquid/lfm-2-24b-a2b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "liquid/lfm-2-24b-a2b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.03, + "output": 0.12 + } + } + ] + }, + "metadata": { + "displayNames": [ + "LiquidAI: LFM2-24B-A2B" + ], + "releaseDate": "2026-02-26", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "liquid/lfm-2-24b-a2b", + "modelKey": "liquid/lfm-2-24b-a2b", + "displayName": "LiquidAI: LFM2-24B-A2B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2026-02-26" + } + } + ] + }, + { + "id": "kilo/ling-2.6-1t", + "provider": "kilo", + "model": "ling-2.6-1t", + "displayName": "inclusionAI: Ling-2.6-1T", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/inclusionai/ling-2.6-1t" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "inclusionai/ling-2.6-1t", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "inclusionAI: Ling-2.6-1T" + ], + "releaseDate": "2026-04-23", + "lastUpdated": "2026-05-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "inclusionai/ling-2.6-1t", + "modelKey": "inclusionai/ling-2.6-1t", + "displayName": "inclusionAI: Ling-2.6-1T", + "metadata": { + "lastUpdated": "2026-05-16", + "openWeights": false, + "releaseDate": "2026-04-23" + } + } + ] + }, + { + "id": "kilo/ling-2.6-flash", + "provider": "kilo", + "model": "ling-2.6-flash", + "displayName": "inclusionAI: Ling-2.6 Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/inclusionai/ling-2.6-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "inclusionai/ling-2.6-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.016, + "input": 0.08, + "output": 0.24 + } + } + ] + }, + "metadata": { + "displayNames": [ + "inclusionAI: Ling-2.6 Flash" + ], + "releaseDate": "2026-04-21", + "lastUpdated": "2026-05-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "inclusionai/ling-2.6-flash", + "modelKey": "inclusionai/ling-2.6-flash", + "displayName": "inclusionAI: Ling-2.6 Flash", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-21" + } + } + ] + }, + { + "id": "kilo/maestro-reasoning", + "provider": "kilo", + "model": "maestro-reasoning", + "displayName": "Arcee AI: Maestro Reasoning", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/arcee-ai/maestro-reasoning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "arcee-ai/maestro-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.9, + "output": 3.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Arcee AI: Maestro Reasoning" + ], + "releaseDate": "2025-05-06", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "arcee-ai/maestro-reasoning", + "modelKey": "arcee-ai/maestro-reasoning", + "displayName": "Arcee AI: Maestro Reasoning", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-05-06" + } + } + ] + }, + { + "id": "kilo/magnum-v4-72b", + "provider": "kilo", + "model": "magnum-v4-72b", + "displayName": "Magnum v4 72B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/anthracite-org/magnum-v4-72b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "anthracite-org/magnum-v4-72b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Magnum v4 72B" + ], + "releaseDate": "2024-10-22", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "anthracite-org/magnum-v4-72b", + "modelKey": "anthracite-org/magnum-v4-72b", + "displayName": "Magnum v4 72B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2024-10-22" + } + } + ] + }, + { + "id": "kilo/mercury-2", + "provider": "kilo", + "model": "mercury-2", + "displayName": "Inception: Mercury 2", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/inception/mercury-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 50000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "inception/mercury-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 0.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Inception: Mercury 2" + ], + "releaseDate": "2026-02-24", + "lastUpdated": "2026-02-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "inception/mercury-2", + "modelKey": "inception/mercury-2", + "displayName": "Inception: Mercury 2", + "metadata": { + "lastUpdated": "2026-02-24", + "openWeights": false, + "releaseDate": "2026-02-24", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "kilo/mimo-v2-flash", + "provider": "kilo", + "model": "mimo-v2-flash", + "displayName": "Xiaomi: MiMo-V2-Flash", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/xiaomi/mimo-v2-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "xiaomi/mimo-v2-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.045, + "input": 0.09, + "output": 0.29 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Xiaomi: MiMo-V2-Flash" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12-01", + "releaseDate": "2025-12-16", + "lastUpdated": "2026-02-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "xiaomi/mimo-v2-flash", + "modelKey": "xiaomi/mimo-v2-flash", + "displayName": "Xiaomi: MiMo-V2-Flash", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12-01", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2025-12-16" + } + } + ] + }, + { + "id": "kilo/mimo-v2-omni", + "provider": "kilo", + "model": "mimo-v2-omni", + "displayName": "Xiaomi: MiMo-V2-Omni", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/xiaomi/mimo-v2-omni" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "xiaomi/mimo-v2-omni", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Xiaomi: MiMo-V2-Omni" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "xiaomi/mimo-v2-omni", + "modelKey": "xiaomi/mimo-v2-omni", + "displayName": "Xiaomi: MiMo-V2-Omni", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "kilo/mimo-v2-pro", + "provider": "kilo", + "model": "mimo-v2-pro", + "displayName": "Xiaomi: MiMo-V2-Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/xiaomi/mimo-v2-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "xiaomi/mimo-v2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.4, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Xiaomi: MiMo-V2-Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "xiaomi/mimo-v2-pro", + "modelKey": "xiaomi/mimo-v2-pro", + "displayName": "Xiaomi: MiMo-V2-Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "kilo/mimo-v2.5", + "provider": "kilo", + "model": "mimo-v2.5", + "displayName": "Xiaomi: MiMo-V2.5", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/xiaomi/mimo-v2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "xiaomi/mimo-v2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.4, + "output": 2 + }, + "tiered": { + "contextOver200K": { + "input": 0.8, + "output": 4, + "cache_read": 0.16 + }, + "tiers": [ + { + "input": 0.8, + "output": 4, + "cache_read": 0.16, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Xiaomi: MiMo-V2.5" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "xiaomi/mimo-v2.5", + "modelKey": "xiaomi/mimo-v2.5", + "displayName": "Xiaomi: MiMo-V2.5", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "kilo/mimo-v2.5-pro", + "provider": "kilo", + "model": "mimo-v2.5-pro", + "displayName": "Xiaomi: MiMo V2.5 Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/xiaomi/mimo-v2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "xiaomi/mimo-v2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.4, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Xiaomi: MiMo V2.5 Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "xiaomi/mimo-v2.5-pro", + "modelKey": "xiaomi/mimo-v2.5-pro", + "displayName": "Xiaomi: MiMo V2.5 Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "kilo/morph-v3-fast", + "provider": "kilo", + "model": "morph-v3-fast", + "displayName": "Morph: Morph V3 Fast", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/morph/morph-v3-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 81920, + "outputTokens": 38000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "morph/morph-v3-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Morph: Morph V3 Fast" + ], + "releaseDate": "2024-08-15", + "lastUpdated": "2024-08-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "morph/morph-v3-fast", + "modelKey": "morph/morph-v3-fast", + "displayName": "Morph: Morph V3 Fast", + "metadata": { + "lastUpdated": "2024-08-15", + "openWeights": false, + "releaseDate": "2024-08-15" + } + } + ] + }, + { + "id": "kilo/morph-v3-large", + "provider": "kilo", + "model": "morph-v3-large", + "displayName": "Morph: Morph V3 Large", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/morph/morph-v3-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "morph/morph-v3-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.9, + "output": 1.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Morph: Morph V3 Large" + ], + "releaseDate": "2024-08-15", + "lastUpdated": "2024-08-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "morph/morph-v3-large", + "modelKey": "morph/morph-v3-large", + "displayName": "Morph: Morph V3 Large", + "metadata": { + "lastUpdated": "2024-08-15", + "openWeights": false, + "releaseDate": "2024-08-15" + } + } + ] + }, + { + "id": "kilo/mythomax-l2-13b", + "provider": "kilo", + "model": "mythomax-l2-13b", + "displayName": "MythoMax 13B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/gryphe/mythomax-l2-13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "gryphe/mythomax-l2-13b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.06, + "output": 0.06 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MythoMax 13B" + ], + "releaseDate": "2024-04-25", + "lastUpdated": "2024-04-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "gryphe/mythomax-l2-13b", + "modelKey": "gryphe/mythomax-l2-13b", + "displayName": "MythoMax 13B", + "metadata": { + "lastUpdated": "2024-04-25", + "openWeights": true, + "releaseDate": "2024-04-25" + } + } + ] + }, + { + "id": "kilo/nemotron-3-nano-30b-a3b", + "provider": "kilo", + "model": "nemotron-3-nano-30b-a3b", + "displayName": "NVIDIA: Nemotron 3 Nano 30B A3B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/nvidia/nemotron-3-nano-30b-a3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 52429, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "nvidia/nemotron-3-nano-30b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA: Nemotron 3 Nano 30B A3B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2024-12", + "lastUpdated": "2026-02-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "nvidia/nemotron-3-nano-30b-a3b", + "modelKey": "nvidia/nemotron-3-nano-30b-a3b", + "displayName": "NVIDIA: Nemotron 3 Nano 30B A3B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2024-12" + } + } + ] + }, + { + "id": "kilo/nemotron-3-nano-omni-30b-a3b-reasoning:free", + "provider": "kilo", + "model": "nemotron-3-nano-omni-30b-a3b-reasoning:free", + "displayName": "NVIDIA: Nemotron 3 Nano Omni (free)", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA: Nemotron 3 Nano Omni (free)" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-04-28", + "lastUpdated": "2026-05-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", + "modelKey": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", + "displayName": "NVIDIA: Nemotron 3 Nano Omni (free)", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-28" + } + } + ] + }, + { + "id": "kilo/nemotron-3-super-120b-a12b", + "provider": "kilo", + "model": "nemotron-3-super-120b-a12b", + "displayName": "NVIDIA: Nemotron 3 Super", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/nvidia/nemotron-3-super-120b-a12b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "nvidia/nemotron-3-super-120b-a12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.1, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA: Nemotron 3 Super" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-03-11", + "lastUpdated": "2026-04-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "nvidia/nemotron-3-super-120b-a12b", + "modelKey": "nvidia/nemotron-3-super-120b-a12b", + "displayName": "NVIDIA: Nemotron 3 Super", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": true, + "releaseDate": "2026-03-11" + } + } + ] + }, + { + "id": "kilo/nemotron-3-super-120b-a12b:free", + "provider": "kilo", + "model": "nemotron-3-super-120b-a12b:free", + "displayName": "NVIDIA: Nemotron 3 Super (free)", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/nvidia/nemotron-3-super-120b-a12b:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "nvidia/nemotron-3-super-120b-a12b:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA: Nemotron 3 Super (free)" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-03-12", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "nvidia/nemotron-3-super-120b-a12b:free", + "modelKey": "nvidia/nemotron-3-super-120b-a12b:free", + "displayName": "NVIDIA: Nemotron 3 Super (free)", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2026-03-12" + } + } + ] + }, + { + "id": "kilo/nemotron-nano-9b-v2", + "provider": "kilo", + "model": "nemotron-nano-9b-v2", + "displayName": "NVIDIA: Nemotron Nano 9B V2", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/nvidia/nemotron-nano-9b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 26215, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "nvidia/nemotron-nano-9b-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.16 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA: Nemotron Nano 9B V2" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2025-08-18", + "lastUpdated": "2025-08-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "nvidia/nemotron-nano-9b-v2", + "modelKey": "nvidia/nemotron-nano-9b-v2", + "displayName": "NVIDIA: Nemotron Nano 9B V2", + "family": "nemotron", + "metadata": { + "lastUpdated": "2025-08-18", + "openWeights": true, + "releaseDate": "2025-08-18" + } + } + ] + }, + { + "id": "kilo/olmo-3-32b-think", + "provider": "kilo", + "model": "olmo-3-32b-think", + "displayName": "AllenAI: Olmo 3 32B Think", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/allenai/olmo-3-32b-think" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "allenai/olmo-3-32b-think", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "AllenAI: Olmo 3 32B Think" + ], + "releaseDate": "2025-11-22", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "allenai/olmo-3-32b-think", + "modelKey": "allenai/olmo-3-32b-think", + "displayName": "AllenAI: Olmo 3 32B Think", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-11-22" + } + } + ] + }, + { + "id": "kilo/owl-alpha", + "provider": "kilo", + "model": "owl-alpha", + "displayName": "Owl Alpha", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/openrouter/owl-alpha" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048756, + "outputTokens": 262144, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openrouter/owl-alpha", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Owl Alpha" + ], + "statuses": [ + "alpha" + ], + "releaseDate": "2026-04-28", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openrouter/owl-alpha", + "modelKey": "openrouter/owl-alpha", + "displayName": "Owl Alpha", + "status": "alpha", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-28" + } + } + ] + }, + { + "id": "kilo/palmyra-x5", + "provider": "kilo", + "model": "palmyra-x5", + "displayName": "Writer: Palmyra X5", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/writer/palmyra-x5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1040000, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "writer/palmyra-x5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Writer: Palmyra X5" + ], + "releaseDate": "2025-04-28", + "lastUpdated": "2025-04-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "writer/palmyra-x5", + "modelKey": "writer/palmyra-x5", + "displayName": "Writer: Palmyra X5", + "metadata": { + "lastUpdated": "2025-04-28", + "openWeights": false, + "releaseDate": "2025-04-28" + } + } + ] + }, + { + "id": "kilo/pareto-code", + "provider": "kilo", + "model": "pareto-code", + "displayName": "Pareto Code Router", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/openrouter/pareto-code" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openrouter/pareto-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Pareto Code Router" + ], + "releaseDate": "2026-04-21", + "lastUpdated": "2026-05-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openrouter/pareto-code", + "modelKey": "openrouter/pareto-code", + "displayName": "Pareto Code Router", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-21" + } + } + ] + }, + { + "id": "kilo/perceptron-mk1", + "provider": "kilo", + "model": "perceptron-mk1", + "displayName": "Perceptron: Perceptron Mk1", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/perceptron/perceptron-mk1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "perceptron/perceptron-mk1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Perceptron: Perceptron Mk1" + ], + "releaseDate": "2026-05-12", + "lastUpdated": "2026-05-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "perceptron/perceptron-mk1", + "modelKey": "perceptron/perceptron-mk1", + "displayName": "Perceptron: Perceptron Mk1", + "metadata": { + "lastUpdated": "2026-05-16", + "openWeights": false, + "releaseDate": "2026-05-12" + } + } + ] + }, + { + "id": "kilo/phi-4", + "provider": "kilo", + "model": "phi-4", + "displayName": "Microsoft: Phi 4", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/microsoft/phi-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "microsoft/phi-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.06, + "output": 0.14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Microsoft: Phi 4" + ], + "releaseDate": "2024-12-11", + "lastUpdated": "2024-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "microsoft/phi-4", + "modelKey": "microsoft/phi-4", + "displayName": "Microsoft: Phi 4", + "metadata": { + "lastUpdated": "2024-12-11", + "openWeights": true, + "releaseDate": "2024-12-11" + } + } + ] + }, + { + "id": "kilo/phi-4-mini-instruct", + "provider": "kilo", + "model": "phi-4-mini-instruct", + "displayName": "Microsoft: Phi 4 Mini Instruct", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/microsoft/phi-4-mini-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "microsoft/phi-4-mini-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.08, + "output": 0.35 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Microsoft: Phi 4 Mini Instruct" + ], + "releaseDate": "2025-10-17", + "lastUpdated": "2026-05-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "microsoft/phi-4-mini-instruct", + "modelKey": "microsoft/phi-4-mini-instruct", + "displayName": "Microsoft: Phi 4 Mini Instruct", + "metadata": { + "lastUpdated": "2026-05-07", + "openWeights": true, + "releaseDate": "2025-10-17" + } + } + ] + }, + { + "id": "kilo/qianfan-ocr-fast", + "provider": "kilo", + "model": "qianfan-ocr-fast", + "displayName": "Baidu: Qianfan-OCR-Fast", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/baidu/qianfan-ocr-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "outputTokens": 28672, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "baidu/qianfan-ocr-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.68, + "output": 2.81 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Baidu: Qianfan-OCR-Fast" + ], + "releaseDate": "2026-04-20", + "lastUpdated": "2026-05-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "baidu/qianfan-ocr-fast", + "modelKey": "baidu/qianfan-ocr-fast", + "displayName": "Baidu: Qianfan-OCR-Fast", + "metadata": { + "lastUpdated": "2026-05-16", + "openWeights": false, + "releaseDate": "2026-04-20" + } + } + ] + }, + { + "id": "kilo/reka-edge", + "provider": "kilo", + "model": "reka-edge", + "displayName": "Reka Edge", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/rekaai/reka-edge" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "rekaai/reka-edge", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Reka Edge" + ], + "releaseDate": "2026-03-20", + "lastUpdated": "2026-04-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "rekaai/reka-edge", + "modelKey": "rekaai/reka-edge", + "displayName": "Reka Edge", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": true, + "releaseDate": "2026-03-20" + } + } + ] + }, + { + "id": "kilo/reka-flash-3", + "provider": "kilo", + "model": "reka-flash-3", + "displayName": "Reka Flash 3", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/rekaai/reka-flash-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "rekaai/reka-flash-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Reka Flash 3" + ], + "releaseDate": "2025-03-12", + "lastUpdated": "2026-04-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "rekaai/reka-flash-3", + "modelKey": "rekaai/reka-flash-3", + "displayName": "Reka Flash 3", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": true, + "releaseDate": "2025-03-12" + } + } + ] + }, + { + "id": "kilo/relace-apply-3", + "provider": "kilo", + "model": "relace-apply-3", + "displayName": "Relace: Relace Apply 3", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/relace/relace-apply-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "relace/relace-apply-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.85, + "output": 1.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Relace: Relace Apply 3" + ], + "releaseDate": "2025-09-26", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "relace/relace-apply-3", + "modelKey": "relace/relace-apply-3", + "displayName": "Relace: Relace Apply 3", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-09-26" + } + } + ] + }, + { + "id": "kilo/relace-search", + "provider": "kilo", + "model": "relace-search", + "displayName": "Relace: Relace Search", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/relace/relace-search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "relace/relace-search", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Relace: Relace Search" + ], + "releaseDate": "2025-12-09", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "relace/relace-search", + "modelKey": "relace/relace-search", + "displayName": "Relace: Relace Search", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-12-09" + } + } + ] + }, + { + "id": "kilo/remm-slerp-l2-13b", + "provider": "kilo", + "model": "remm-slerp-l2-13b", + "displayName": "ReMM SLERP 13B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/undi95/remm-slerp-l2-13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 6144, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "undi95/remm-slerp-l2-13b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 0.65 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ReMM SLERP 13B" + ], + "releaseDate": "2023-07-22", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "undi95/remm-slerp-l2-13b", + "modelKey": "undi95/remm-slerp-l2-13b", + "displayName": "ReMM SLERP 13B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2023-07-22" + } + } + ] + }, + { + "id": "kilo/ring-2.6-1t", + "provider": "kilo", + "model": "ring-2.6-1t", + "displayName": "inclusionAI: Ring-2.6-1T", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/inclusionai/ring-2.6-1t" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "inclusionai/ring-2.6-1t", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.075, + "output": 0.625 + } + } + ] + }, + "metadata": { + "displayNames": [ + "inclusionAI: Ring-2.6-1T" + ], + "releaseDate": "2026-05-08", + "lastUpdated": "2026-05-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "inclusionai/ring-2.6-1t", + "modelKey": "inclusionai/ring-2.6-1t", + "displayName": "inclusionAI: Ring-2.6-1T", + "metadata": { + "lastUpdated": "2026-05-16", + "openWeights": false, + "releaseDate": "2026-05-08" + } + } + ] + }, + { + "id": "kilo/rnj-1-instruct", + "provider": "kilo", + "model": "rnj-1-instruct", + "displayName": "EssentialAI: Rnj 1 Instruct", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/essentialai/rnj-1-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 6554, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "essentialai/rnj-1-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "EssentialAI: Rnj 1 Instruct" + ], + "releaseDate": "2025-12-05", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "essentialai/rnj-1-instruct", + "modelKey": "essentialai/rnj-1-instruct", + "displayName": "EssentialAI: Rnj 1 Instruct", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-12-05" + } + } + ] + }, + { + "id": "kilo/rocinante-12b", + "provider": "kilo", + "model": "rocinante-12b", + "displayName": "TheDrummer: Rocinante 12B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/thedrummer/rocinante-12b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "thedrummer/rocinante-12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.17, + "output": 0.43 + } + } + ] + }, + "metadata": { + "displayNames": [ + "TheDrummer: Rocinante 12B" + ], + "releaseDate": "2024-09-30", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "thedrummer/rocinante-12b", + "modelKey": "thedrummer/rocinante-12b", + "displayName": "TheDrummer: Rocinante 12B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2024-09-30" + } + } + ] + }, + { + "id": "kilo/router", + "provider": "kilo", + "model": "router", + "displayName": "Switchpoint Router", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/switchpoint/router" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "switchpoint/router", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.85, + "output": 3.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Switchpoint Router" + ], + "releaseDate": "2025-07-12", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "switchpoint/router", + "modelKey": "switchpoint/router", + "displayName": "Switchpoint Router", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-07-12" + } + } + ] + }, + { + "id": "kilo/seed-1.6", + "provider": "kilo", + "model": "seed-1.6", + "displayName": "ByteDance Seed: Seed 1.6", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/bytedance-seed/seed-1.6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "bytedance-seed/seed-1.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ByteDance Seed: Seed 1.6" + ], + "releaseDate": "2025-09", + "lastUpdated": "2025-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "bytedance-seed/seed-1.6", + "modelKey": "bytedance-seed/seed-1.6", + "displayName": "ByteDance Seed: Seed 1.6", + "metadata": { + "lastUpdated": "2025-09", + "openWeights": false, + "releaseDate": "2025-09" + } + } + ] + }, + { + "id": "kilo/seed-1.6-flash", + "provider": "kilo", + "model": "seed-1.6-flash", + "displayName": "ByteDance Seed: Seed 1.6 Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/bytedance-seed/seed-1.6-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "bytedance-seed/seed-1.6-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ByteDance Seed: Seed 1.6 Flash" + ], + "releaseDate": "2025-12-23", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "bytedance-seed/seed-1.6-flash", + "modelKey": "bytedance-seed/seed-1.6-flash", + "displayName": "ByteDance Seed: Seed 1.6 Flash", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-12-23" + } + } + ] + }, + { + "id": "kilo/seed-2.0-lite", + "provider": "kilo", + "model": "seed-2.0-lite", + "displayName": "ByteDance Seed: Seed-2.0-Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/bytedance-seed/seed-2.0-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "bytedance-seed/seed-2.0-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ByteDance Seed: Seed-2.0-Lite" + ], + "releaseDate": "2026-03-10", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "bytedance-seed/seed-2.0-lite", + "modelKey": "bytedance-seed/seed-2.0-lite", + "displayName": "ByteDance Seed: Seed-2.0-Lite", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2026-03-10" + } + } + ] + }, + { + "id": "kilo/seed-2.0-mini", + "provider": "kilo", + "model": "seed-2.0-mini", + "displayName": "ByteDance Seed: Seed-2.0-Mini", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/bytedance-seed/seed-2.0-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "bytedance-seed/seed-2.0-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ByteDance Seed: Seed-2.0-Mini" + ], + "releaseDate": "2026-02-27", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "bytedance-seed/seed-2.0-mini", + "modelKey": "bytedance-seed/seed-2.0-mini", + "displayName": "ByteDance Seed: Seed-2.0-Mini", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2026-02-27" + } + } + ] + }, + { + "id": "kilo/skyfall-36b-v2", + "provider": "kilo", + "model": "skyfall-36b-v2", + "displayName": "TheDrummer: Skyfall 36B V2", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/thedrummer/skyfall-36b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "thedrummer/skyfall-36b-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 0.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "TheDrummer: Skyfall 36B V2" + ], + "releaseDate": "2025-03-11", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "thedrummer/skyfall-36b-v2", + "modelKey": "thedrummer/skyfall-36b-v2", + "displayName": "TheDrummer: Skyfall 36B V2", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-03-11" + } + } + ] + }, + { + "id": "kilo/small", + "provider": "kilo", + "model": "small", + "displayName": "Kilo Auto Small", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/kilo-auto/small" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "kilo-auto/small", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kilo Auto Small" + ], + "releaseDate": "2026-03-15", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "kilo-auto/small", + "modelKey": "kilo-auto/small", + "displayName": "Kilo Auto Small", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-03-15" + } + } + ] + }, + { + "id": "kilo/solar-pro-3", + "provider": "kilo", + "model": "solar-pro-3", + "displayName": "Upstage: Solar Pro 3", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/upstage/solar-pro-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "upstage/solar-pro-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Upstage: Solar Pro 3" + ], + "releaseDate": "2026-01-27", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "upstage/solar-pro-3", + "modelKey": "upstage/solar-pro-3", + "displayName": "Upstage: Solar Pro 3", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-01-27" + } + } + ] + }, + { + "id": "kilo/spotlight", + "provider": "kilo", + "model": "spotlight", + "displayName": "Arcee AI: Spotlight", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/arcee-ai/spotlight" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 65537, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "arcee-ai/spotlight", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.18 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Arcee AI: Spotlight" + ], + "releaseDate": "2025-05-06", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "arcee-ai/spotlight", + "modelKey": "arcee-ai/spotlight", + "displayName": "Arcee AI: Spotlight", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-05-06" + } + } + ] + }, + { + "id": "kilo/step-3.5-flash", + "provider": "kilo", + "model": "step-3.5-flash", + "displayName": "StepFun: Step 3.5 Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/stepfun/step-3.5-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "stepfun/step-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "StepFun: Step 3.5 Flash" + ], + "releaseDate": "2026-01-29", + "lastUpdated": "2026-01-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "stepfun/step-3.5-flash", + "modelKey": "stepfun/step-3.5-flash", + "displayName": "StepFun: Step 3.5 Flash", + "metadata": { + "lastUpdated": "2026-01-29", + "openWeights": true, + "releaseDate": "2026-01-29", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "kilo/trinity-large-thinking", + "provider": "kilo", + "model": "trinity-large-thinking", + "displayName": "Arcee AI: Trinity Large Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/arcee-ai/trinity-large-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "arcee-ai/trinity-large-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.22, + "output": 0.85 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Arcee AI: Trinity Large Thinking" + ], + "releaseDate": "2026-04-01", + "lastUpdated": "2026-04-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "arcee-ai/trinity-large-thinking", + "modelKey": "arcee-ai/trinity-large-thinking", + "displayName": "Arcee AI: Trinity Large Thinking", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": true, + "releaseDate": "2026-04-01" + } + } + ] + }, + { + "id": "kilo/trinity-mini", + "provider": "kilo", + "model": "trinity-mini", + "displayName": "Arcee AI: Trinity Mini", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/arcee-ai/trinity-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "arcee-ai/trinity-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.045, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Arcee AI: Trinity Mini" + ], + "releaseDate": "2025-12", + "lastUpdated": "2026-01-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "arcee-ai/trinity-mini", + "modelKey": "arcee-ai/trinity-mini", + "displayName": "Arcee AI: Trinity Mini", + "metadata": { + "lastUpdated": "2026-01-28", + "openWeights": true, + "releaseDate": "2025-12" + } + } + ] + }, + { + "id": "kilo/ui-tars-1.5-7b", + "provider": "kilo", + "model": "ui-tars-1.5-7b", + "displayName": "ByteDance: UI-TARS 7B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/bytedance/ui-tars-1.5-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "bytedance/ui-tars-1.5-7b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ByteDance: UI-TARS 7B" + ], + "releaseDate": "2025-07-23", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "bytedance/ui-tars-1.5-7b", + "modelKey": "bytedance/ui-tars-1.5-7b", + "displayName": "ByteDance: UI-TARS 7B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-07-23" + } + } + ] + }, + { + "id": "kilo/unslopnemo-12b", + "provider": "kilo", + "model": "unslopnemo-12b", + "displayName": "TheDrummer: UnslopNemo 12B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/thedrummer/unslopnemo-12b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "thedrummer/unslopnemo-12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "TheDrummer: UnslopNemo 12B" + ], + "releaseDate": "2024-11-09", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "thedrummer/unslopnemo-12b", + "modelKey": "thedrummer/unslopnemo-12b", + "displayName": "TheDrummer: UnslopNemo 12B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2024-11-09" + } + } + ] + }, + { + "id": "kilo/virtuoso-large", + "provider": "kilo", + "model": "virtuoso-large", + "displayName": "Arcee AI: Virtuoso Large", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/arcee-ai/virtuoso-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "arcee-ai/virtuoso-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.75, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Arcee AI: Virtuoso Large" + ], + "releaseDate": "2025-05-06", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "arcee-ai/virtuoso-large", + "modelKey": "arcee-ai/virtuoso-large", + "displayName": "Arcee AI: Virtuoso Large", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-05-06" + } + } + ] + }, + { + "id": "kilo/weaver", + "provider": "kilo", + "model": "weaver", + "displayName": "Mancer: Weaver (alpha)", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/mancer/weaver" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "outputTokens": 2000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "mancer/weaver", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.75, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mancer: Weaver (alpha)" + ], + "releaseDate": "2023-08-02", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mancer/weaver", + "modelKey": "mancer/weaver", + "displayName": "Mancer: Weaver (alpha)", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2023-08-02" + } + } + ] + }, + { + "id": "kilo/wizardlm-2-8x22b", + "provider": "kilo", + "model": "wizardlm-2-8x22b", + "displayName": "WizardLM-2 8x22B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/microsoft/wizardlm-2-8x22b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65535, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "microsoft/wizardlm-2-8x22b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.62, + "output": 0.62 + } + } + ] + }, + "metadata": { + "displayNames": [ + "WizardLM-2 8x22B" + ], + "releaseDate": "2024-04-24", + "lastUpdated": "2024-04-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "microsoft/wizardlm-2-8x22b", + "modelKey": "microsoft/wizardlm-2-8x22b", + "displayName": "WizardLM-2 8x22B", + "metadata": { + "lastUpdated": "2024-04-24", + "openWeights": true, + "releaseDate": "2024-04-24" + } + } + ] + }, + { + "id": "kimi-for-coding/k2p5", + "provider": "kimi-for-coding", + "model": "k2p5", + "displayName": "Kimi K2.5", + "family": "kimi-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "kimi-for-coding" + ], + "aliases": [ + "kimi-for-coding/k2p5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kimi-for-coding", + "model": "k2p5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.5" + ], + "families": [ + "kimi-thinking" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-01", + "lastUpdated": "2026-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kimi-for-coding", + "providerName": "Kimi For Coding", + "providerApi": "https://api.kimi.com/coding/v1", + "providerDoc": "https://www.kimi.com/code/docs/en/third-party-tools/other-coding-agents.html", + "model": "k2p5", + "modelKey": "k2p5", + "displayName": "Kimi K2.5", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "kimi-for-coding/k2p6", + "provider": "kimi-for-coding", + "model": "k2p6", + "displayName": "Kimi K2.6", + "family": "kimi-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "kimi-for-coding" + ], + "aliases": [ + "kimi-for-coding/k2p6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kimi-for-coding", + "model": "k2p6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.6" + ], + "families": [ + "kimi-thinking" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-04", + "lastUpdated": "2026-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kimi-for-coding", + "providerName": "Kimi For Coding", + "providerApi": "https://api.kimi.com/coding/v1", + "providerDoc": "https://www.kimi.com/code/docs/en/third-party-tools/other-coding-agents.html", + "model": "k2p6", + "modelKey": "k2p6", + "displayName": "Kimi K2.6", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04", + "openWeights": true, + "releaseDate": "2026-04", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "kimi-for-coding/k2p7", + "provider": "kimi-for-coding", + "model": "k2p7", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "kimi-for-coding" + ], + "aliases": [ + "kimi-for-coding/k2p7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kimi-for-coding", + "model": "k2p7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.7 Code" + ], + "families": [ + "kimi-k2" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-06-12", + "lastUpdated": "2026-06-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kimi-for-coding", + "providerName": "Kimi For Coding", + "providerApi": "https://api.kimi.com/coding/v1", + "providerDoc": "https://www.kimi.com/code/docs/en/third-party-tools/other-coding-agents.html", + "model": "k2p7", + "modelKey": "k2p7", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + } + ] + }, + { + "id": "lambda-ai/hermes3-405b", + "provider": "lambda-ai", + "model": "hermes3-405b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lambda_ai" + ], + "aliases": [ + "lambda_ai/hermes3-405b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/hermes3-405b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 0.8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/hermes3-405b", + "mode": "chat" + } + ] + }, + { + "id": "lambda-ai/hermes3-70b", + "provider": "lambda-ai", + "model": "hermes3-70b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lambda_ai" + ], + "aliases": [ + "lambda_ai/hermes3-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/hermes3-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/hermes3-70b", + "mode": "chat" + } + ] + }, + { + "id": "lambda-ai/hermes3-8b", + "provider": "lambda-ai", + "model": "hermes3-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lambda_ai" + ], + "aliases": [ + "lambda_ai/hermes3-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/hermes3-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.025, + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/hermes3-8b", + "mode": "chat" + } + ] + }, + { + "id": "lambda-ai/lfm-40b", + "provider": "lambda-ai", + "model": "lfm-40b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lambda_ai" + ], + "aliases": [ + "lambda_ai/lfm-40b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/lfm-40b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/lfm-40b", + "mode": "chat" + } + ] + }, + { + "id": "lambda-ai/lfm-7b", + "provider": "lambda-ai", + "model": "lfm-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lambda_ai" + ], + "aliases": [ + "lambda_ai/lfm-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/lfm-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.025, + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/lfm-7b", + "mode": "chat" + } + ] + }, + { + "id": "lambda-ai/llama3.1-405b-instruct-fp8", + "provider": "lambda-ai", + "model": "llama3.1-405b-instruct-fp8", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lambda_ai" + ], + "aliases": [ + "lambda_ai/llama3.1-405b-instruct-fp8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/llama3.1-405b-instruct-fp8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 0.8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/llama3.1-405b-instruct-fp8", + "mode": "chat" + } + ] + }, + { + "id": "lambda-ai/llama3.1-70b-instruct-fp8", + "provider": "lambda-ai", + "model": "llama3.1-70b-instruct-fp8", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lambda_ai" + ], + "aliases": [ + "lambda_ai/llama3.1-70b-instruct-fp8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/llama3.1-70b-instruct-fp8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/llama3.1-70b-instruct-fp8", + "mode": "chat" + } + ] + }, + { + "id": "lambda-ai/llama3.1-8b-instruct", + "provider": "lambda-ai", + "model": "llama3.1-8b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lambda_ai" + ], + "aliases": [ + "lambda_ai/llama3.1-8b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/llama3.1-8b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.025, + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/llama3.1-8b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "lambda-ai/llama3.1-nemotron-70b-instruct-fp8", + "provider": "lambda-ai", + "model": "llama3.1-nemotron-70b-instruct-fp8", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lambda_ai" + ], + "aliases": [ + "lambda_ai/llama3.1-nemotron-70b-instruct-fp8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/llama3.1-nemotron-70b-instruct-fp8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/llama3.1-nemotron-70b-instruct-fp8", + "mode": "chat" + } + ] + }, + { + "id": "lambda-ai/llama3.2-11b-vision-instruct", + "provider": "lambda-ai", + "model": "llama3.2-11b-vision-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lambda_ai" + ], + "aliases": [ + "lambda_ai/llama3.2-11b-vision-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/llama3.2-11b-vision-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.015, + "output": 0.025 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/llama3.2-11b-vision-instruct", + "mode": "chat" + } + ] + }, + { + "id": "lambda-ai/llama3.2-3b-instruct", + "provider": "lambda-ai", + "model": "llama3.2-3b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lambda_ai" + ], + "aliases": [ + "lambda_ai/llama3.2-3b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/llama3.2-3b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.015, + "output": 0.025 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/llama3.2-3b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "lambda-ai/llama3.3-70b-instruct-fp8", + "provider": "lambda-ai", + "model": "llama3.3-70b-instruct-fp8", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lambda_ai" + ], + "aliases": [ + "lambda_ai/llama3.3-70b-instruct-fp8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/llama3.3-70b-instruct-fp8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/llama3.3-70b-instruct-fp8", + "mode": "chat" + } + ] + }, + { + "id": "lemonade/gemma-3-4b-it-gguf", + "provider": "lemonade", + "model": "gemma-3-4b-it-gguf", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lemonade" + ], + "aliases": [ + "lemonade/Gemma-3-4b-it-GGUF" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lemonade", + "model": "lemonade/Gemma-3-4b-it-GGUF", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lemonade", + "model": "lemonade/Gemma-3-4b-it-GGUF", + "mode": "chat" + } + ] + }, + { + "id": "linkup/search", + "provider": "linkup", + "model": "search", + "mode": "search", + "sources": [ + "litellm" + ], + "providers": [ + "linkup" + ], + "aliases": [ + "linkup/search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "linkup", + "model": "linkup/search", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perQuery": { + "input": 0.00587 + } + } + ] + }, + "metadata": { + "modes": [ + "search" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "linkup", + "model": "linkup/search", + "mode": "search" + } + ] + }, + { + "id": "linkup/search-deep", + "provider": "linkup", + "model": "search-deep", + "mode": "search", + "sources": [ + "litellm" + ], + "providers": [ + "linkup" + ], + "aliases": [ + "linkup/search-deep" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "linkup", + "model": "linkup/search-deep", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perQuery": { + "input": 0.05867 + } + } + ] + }, + "metadata": { + "modes": [ + "search" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "linkup", + "model": "linkup/search-deep", + "mode": "search" + } + ] + }, + { + "id": "llamagate/dolphin3-8b", + "provider": "llamagate", + "model": "dolphin3-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "llamagate" + ], + "aliases": [ + "llamagate/dolphin3-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "llamagate", + "model": "llamagate/dolphin3-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "llamagate", + "model": "llamagate/dolphin3-8b", + "mode": "chat" + } + ] + }, + { + "id": "llamagate/gemma3-4b", + "provider": "llamagate", + "model": "gemma3-4b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "llamagate" + ], + "aliases": [ + "llamagate/gemma3-4b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "llamagate", + "model": "llamagate/gemma3-4b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.03, + "output": 0.08 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "llamagate", + "model": "llamagate/gemma3-4b", + "mode": "chat" + } + ] + }, + { + "id": "llamagate/llava-7b", + "provider": "llamagate", + "model": "llava-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "llamagate" + ], + "aliases": [ + "llamagate/llava-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 2048, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "llamagate", + "model": "llamagate/llava-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "llamagate", + "model": "llamagate/llava-7b", + "mode": "chat" + } + ] + }, + { + "id": "llamagate/nomic-embed-text", + "provider": "llamagate", + "model": "nomic-embed-text", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "llamagate" + ], + "aliases": [ + "llamagate/nomic-embed-text" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "llamagate", + "model": "llamagate/nomic-embed-text", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "llamagate", + "model": "llamagate/nomic-embed-text", + "mode": "embedding" + } + ] + }, + { + "id": "llamagate/openthinker-7b", + "provider": "llamagate", + "model": "openthinker-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "llamagate" + ], + "aliases": [ + "llamagate/openthinker-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "llamagate", + "model": "llamagate/openthinker-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "llamagate", + "model": "llamagate/openthinker-7b", + "mode": "chat" + } + ] + }, + { + "id": "llmgateway/auto", + "provider": "llmgateway", + "model": "auto", + "displayName": "Auto Route", + "family": "auto", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/auto" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "auto", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Auto Route" + ], + "families": [ + "auto" + ], + "releaseDate": "2024-01-01", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "auto", + "modelKey": "auto", + "displayName": "Auto Route", + "family": "auto", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + } + ] + }, + { + "id": "llmgateway/custom", + "provider": "llmgateway", + "model": "custom", + "displayName": "Custom Model", + "family": "auto", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/custom" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "custom", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Custom Model" + ], + "families": [ + "auto" + ], + "releaseDate": "2024-01-01", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "custom", + "modelKey": "custom", + "displayName": "Custom Model", + "family": "auto", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + } + ] + }, + { + "id": "llmgateway/gemma-2-27b-it-together", + "provider": "llmgateway", + "model": "gemma-2-27b-it-together", + "displayName": "Gemma 2 27B IT", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/gemma-2-27b-it-together" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gemma-2-27b-it-together", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "output": 0.08 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 2 27B IT" + ], + "families": [ + "gemma" + ], + "releaseDate": "2024-06-27", + "lastUpdated": "2024-06-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gemma-2-27b-it-together", + "modelKey": "gemma-2-27b-it-together", + "displayName": "Gemma 2 27B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2024-06-27", + "openWeights": true, + "releaseDate": "2024-06-27" + } + } + ] + }, + { + "id": "llmgateway/gemma-3-1b-it", + "provider": "llmgateway", + "model": "gemma-3-1b-it", + "displayName": "Gemma 3 1B IT", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/gemma-3-1b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 16384, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gemma-3-1b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 3 1B IT" + ], + "families": [ + "gemma" + ], + "releaseDate": "2025-03-12", + "lastUpdated": "2025-03-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gemma-3-1b-it", + "modelKey": "gemma-3-1b-it", + "displayName": "Gemma 3 1B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2025-03-12", + "openWeights": true, + "releaseDate": "2025-03-12" + } + } + ] + }, + { + "id": "llmgateway/gemma-3-27b", + "provider": "llmgateway", + "model": "gemma-3-27b", + "displayName": "Gemma 3 27B", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/gemma-3-27b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gemma-3-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.27 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 3 27B" + ], + "families": [ + "gemma" + ], + "releaseDate": "2025-03-12", + "lastUpdated": "2025-03-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gemma-3-27b", + "modelKey": "gemma-3-27b", + "displayName": "Gemma 3 27B", + "family": "gemma", + "metadata": { + "lastUpdated": "2025-03-12", + "openWeights": true, + "releaseDate": "2025-03-12" + } + } + ] + }, + { + "id": "llmgateway/hermes-2-pro-llama-3-8b", + "provider": "llmgateway", + "model": "hermes-2-pro-llama-3-8b", + "displayName": "Hermes 2 Pro Llama 3 8B", + "family": "hermes", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/hermes-2-pro-llama-3-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "hermes-2-pro-llama-3-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes 2 Pro Llama 3 8B" + ], + "families": [ + "hermes" + ], + "releaseDate": "2024-05-27", + "lastUpdated": "2024-05-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "hermes-2-pro-llama-3-8b", + "modelKey": "hermes-2-pro-llama-3-8b", + "displayName": "Hermes 2 Pro Llama 3 8B", + "family": "hermes", + "metadata": { + "lastUpdated": "2024-05-27", + "openWeights": true, + "releaseDate": "2024-05-27" + } + } + ] + }, + { + "id": "llmgateway/mimo-v2-flash", + "provider": "llmgateway", + "model": "mimo-v2-flash", + "displayName": "MiMo-V2-Flash", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/mimo-v2-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "mimo-v2-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-Flash" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12-01", + "releaseDate": "2025-12-16", + "lastUpdated": "2026-02-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "mimo-v2-flash", + "modelKey": "mimo-v2-flash", + "displayName": "MiMo-V2-Flash", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12-01", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2025-12-16", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "llmgateway/mimo-v2-omni", + "provider": "llmgateway", + "model": "mimo-v2-omni", + "displayName": "MiMo-V2-Omni", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/mimo-v2-omni" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "mimo-v2-omni", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-Omni" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "mimo-v2-omni", + "modelKey": "mimo-v2-omni", + "displayName": "MiMo-V2-Omni", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "llmgateway/mimo-v2-pro", + "provider": "llmgateway", + "model": "mimo-v2-pro", + "displayName": "MiMo-V2-Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/mimo-v2-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "mimo-v2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.4, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "mimo-v2-pro", + "modelKey": "mimo-v2-pro", + "displayName": "MiMo-V2-Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "llmgateway/mimo-v2.5", + "provider": "llmgateway", + "model": "mimo-v2.5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/mimo-v2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "mimo-v2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.4, + "output": 2 + }, + "tiered": { + "contextOver200K": { + "input": 0.8, + "output": 4, + "cache_read": 0.16 + }, + "tiers": [ + { + "input": 0.8, + "output": 4, + "cache_read": 0.16, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "mimo-v2.5", + "modelKey": "mimo-v2.5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "llmgateway/mimo-v2.5-pro", + "provider": "llmgateway", + "model": "mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/mimo-v2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "mimo-v2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.4, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "mimo-v2.5-pro", + "modelKey": "mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "llmgateway/nemotron-3-ultra-550b", + "provider": "llmgateway", + "model": "nemotron-3-ultra-550b", + "displayName": "Nemotron 3 Ultra 550B A55B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/nemotron-3-ultra-550b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "nemotron-3-ultra-550b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.5, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron 3 Ultra 550B A55B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-06-04", + "lastUpdated": "2026-06-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "nemotron-3-ultra-550b", + "modelKey": "nemotron-3-ultra-550b", + "displayName": "Nemotron 3 Ultra 550B A55B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-06-04", + "openWeights": true, + "releaseDate": "2026-06-04", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "llmgateway/o1", + "provider": "llmgateway", + "model": "o1", + "displayName": "o1", + "family": "o", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/o1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "o1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + } + ] + }, + "metadata": { + "displayNames": [ + "o1" + ], + "families": [ + "o" + ], + "knowledgeCutoff": "2023-09", + "releaseDate": "2024-12-05", + "lastUpdated": "2024-12-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "o1", + "modelKey": "o1", + "displayName": "o1", + "family": "o", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-12-05", + "openWeights": false, + "releaseDate": "2024-12-05" + } + } + ] + }, + { + "id": "llmgateway/o3", + "provider": "llmgateway", + "model": "o3", + "displayName": "o3", + "family": "o", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/o3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "o3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "o3" + ], + "families": [ + "o" + ], + "knowledgeCutoff": "2024-05", + "releaseDate": "2025-04-16", + "lastUpdated": "2025-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "o3", + "modelKey": "o3", + "displayName": "o3", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16" + } + } + ] + }, + { + "id": "llmgateway/seed-1-6-250615", + "provider": "llmgateway", + "model": "seed-1-6-250615", + "displayName": "Seed 1.6 (250615)", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/seed-1-6-250615" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "seed-1-6-250615", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.25, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Seed 1.6 (250615)" + ], + "families": [ + "seed" + ], + "releaseDate": "2025-06-25", + "lastUpdated": "2025-06-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "seed-1-6-250615", + "modelKey": "seed-1-6-250615", + "displayName": "Seed 1.6 (250615)", + "family": "seed", + "metadata": { + "lastUpdated": "2025-06-25", + "openWeights": true, + "releaseDate": "2025-06-25" + } + } + ] + }, + { + "id": "llmgateway/seed-1-6-250915", + "provider": "llmgateway", + "model": "seed-1-6-250915", + "displayName": "Seed 1.6 (250915)", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/seed-1-6-250915" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "seed-1-6-250915", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.25, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Seed 1.6 (250915)" + ], + "families": [ + "seed" + ], + "releaseDate": "2025-09-15", + "lastUpdated": "2025-09-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "seed-1-6-250915", + "modelKey": "seed-1-6-250915", + "displayName": "Seed 1.6 (250915)", + "family": "seed", + "metadata": { + "lastUpdated": "2025-09-15", + "openWeights": true, + "releaseDate": "2025-09-15" + } + } + ] + }, + { + "id": "llmgateway/seed-1-6-flash-250715", + "provider": "llmgateway", + "model": "seed-1-6-flash-250715", + "displayName": "Seed 1.6 Flash (250715)", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/seed-1-6-flash-250715" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "seed-1-6-flash-250715", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.07, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Seed 1.6 Flash (250715)" + ], + "families": [ + "seed" + ], + "releaseDate": "2025-07-26", + "lastUpdated": "2025-07-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "seed-1-6-flash-250715", + "modelKey": "seed-1-6-flash-250715", + "displayName": "Seed 1.6 Flash (250715)", + "family": "seed", + "metadata": { + "lastUpdated": "2025-07-26", + "openWeights": true, + "releaseDate": "2025-07-26" + } + } + ] + }, + { + "id": "llmgateway/seed-1-8-251228", + "provider": "llmgateway", + "model": "seed-1-8-251228", + "displayName": "Seed 1.8 (251228)", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/seed-1-8-251228" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "seed-1-8-251228", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.25, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Seed 1.8 (251228)" + ], + "families": [ + "seed" + ], + "releaseDate": "2025-12-18", + "lastUpdated": "2025-12-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "seed-1-8-251228", + "modelKey": "seed-1-8-251228", + "displayName": "Seed 1.8 (251228)", + "family": "seed", + "metadata": { + "lastUpdated": "2025-12-18", + "openWeights": true, + "releaseDate": "2025-12-18" + } + } + ] + }, + { + "id": "llmgateway/sonar", + "provider": "llmgateway", + "model": "sonar", + "displayName": "Sonar", + "family": "sonar", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/sonar" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "sonar", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Sonar" + ], + "families": [ + "sonar" + ], + "knowledgeCutoff": "2025-09-01", + "releaseDate": "2024-01-01", + "lastUpdated": "2025-09-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "sonar", + "modelKey": "sonar", + "displayName": "Sonar", + "family": "sonar", + "metadata": { + "knowledgeCutoff": "2025-09-01", + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + } + ] + }, + { + "id": "llmtr/gemma-4", + "provider": "llmtr", + "model": "gemma-4", + "displayName": "Gemma 4", + "sources": [ + "models.dev" + ], + "providers": [ + "llmtr" + ], + "aliases": [ + "llmtr/gemma-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmtr", + "model": "gemma-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4" + ], + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmtr", + "providerName": "LLMTR", + "providerApi": "https://llmtr.com/v1", + "providerDoc": "https://llmtr.com/docs", + "model": "gemma-4", + "modelKey": "gemma-4", + "displayName": "Gemma 4", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "llmtr/magibu-11b-v8", + "provider": "llmtr", + "model": "magibu-11b-v8", + "displayName": "Magibu 11B v8", + "sources": [ + "models.dev" + ], + "providers": [ + "llmtr" + ], + "aliases": [ + "llmtr/magibu-11b-v8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmtr", + "model": "magibu-11b-v8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Magibu 11B v8" + ], + "releaseDate": "2026-06-05", + "lastUpdated": "2026-06-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmtr", + "providerName": "LLMTR", + "providerApi": "https://llmtr.com/v1", + "providerDoc": "https://llmtr.com/docs", + "model": "magibu-11b-v8", + "modelKey": "magibu-11b-v8", + "displayName": "Magibu 11B v8", + "metadata": { + "lastUpdated": "2026-06-05", + "openWeights": false, + "releaseDate": "2026-06-05" + } + } + ] + }, + { + "id": "llmtr/medgemma-4b", + "provider": "llmtr", + "model": "medgemma-4b", + "displayName": "MedGemma 4B", + "sources": [ + "models.dev" + ], + "providers": [ + "llmtr" + ], + "aliases": [ + "llmtr/medgemma-4b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmtr", + "model": "medgemma-4b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MedGemma 4B" + ], + "releaseDate": "2026-04-26", + "lastUpdated": "2026-04-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmtr", + "providerName": "LLMTR", + "providerApi": "https://llmtr.com/v1", + "providerDoc": "https://llmtr.com/docs", + "model": "medgemma-4b", + "modelKey": "medgemma-4b", + "displayName": "MedGemma 4B", + "metadata": { + "lastUpdated": "2026-04-26", + "openWeights": true, + "releaseDate": "2026-04-26" + } + } + ] + }, + { + "id": "llmtr/sincap", + "provider": "llmtr", + "model": "sincap", + "displayName": "Sincap", + "sources": [ + "models.dev" + ], + "providers": [ + "llmtr" + ], + "aliases": [ + "llmtr/sincap" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmtr", + "model": "sincap", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Sincap" + ], + "releaseDate": "2026-05-05", + "lastUpdated": "2026-05-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmtr", + "providerName": "LLMTR", + "providerApi": "https://llmtr.com/v1", + "providerDoc": "https://llmtr.com/docs", + "model": "sincap", + "modelKey": "sincap", + "displayName": "Sincap", + "metadata": { + "lastUpdated": "2026-05-05", + "openWeights": false, + "releaseDate": "2026-05-05" + } + } + ] + }, + { + "id": "llmtr/trendyol-7b", + "provider": "llmtr", + "model": "trendyol-7b", + "displayName": "Trendyol 7B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "llmtr" + ], + "aliases": [ + "llmtr/trendyol-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmtr", + "model": "trendyol-7b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Trendyol 7B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-06-06", + "lastUpdated": "2026-06-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmtr", + "providerName": "LLMTR", + "providerApi": "https://llmtr.com/v1", + "providerDoc": "https://llmtr.com/docs", + "model": "trendyol-7b", + "modelKey": "trendyol-7b", + "displayName": "Trendyol 7B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-06-06", + "openWeights": true, + "releaseDate": "2026-06-06" + } + } + ] + }, + { + "id": "lucidquery/lucidnova-rf1-100b", + "provider": "lucidquery", + "model": "lucidnova-rf1-100b", + "displayName": "LucidNova RF1 100B", + "family": "nova", + "sources": [ + "models.dev" + ], + "providers": [ + "lucidquery" + ], + "aliases": [ + "lucidquery/lucidnova-rf1-100b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 120000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "lucidquery", + "model": "lucidnova-rf1-100b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "LucidNova RF1 100B" + ], + "families": [ + "nova" + ], + "knowledgeCutoff": "2025-09-16", + "releaseDate": "2024-12-28", + "lastUpdated": "2025-09-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "lucidquery", + "providerName": "LucidQuery", + "providerApi": "https://api.lucidquery.com/v1", + "providerDoc": "https://lucidquery.com/docs", + "model": "lucidnova-rf1-100b", + "modelKey": "lucidnova-rf1-100b", + "displayName": "LucidNova RF1 100B", + "family": "nova", + "metadata": { + "knowledgeCutoff": "2025-09-16", + "lastUpdated": "2025-09-10", + "openWeights": false, + "releaseDate": "2024-12-28" + } + } + ] + }, + { + "id": "lucidquery/lucidquery-agi-01-frontier", + "provider": "lucidquery", + "model": "lucidquery-agi-01-frontier", + "displayName": "AGI-01 Frontier", + "family": "agi", + "sources": [ + "models.dev" + ], + "providers": [ + "lucidquery" + ], + "aliases": [ + "lucidquery/lucidquery-agi-01-frontier" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 300000, + "outputTokens": 120000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "lucidquery", + "model": "lucidquery-agi-01-frontier", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4.5, + "output": 22 + } + } + ] + }, + "metadata": { + "displayNames": [ + "AGI-01 Frontier" + ], + "families": [ + "agi" + ], + "knowledgeCutoff": "2026-06-05", + "releaseDate": "2026-06-16", + "lastUpdated": "2026-06-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "lucidquery", + "providerName": "LucidQuery", + "providerApi": "https://api.lucidquery.com/v1", + "providerDoc": "https://lucidquery.com/docs", + "model": "lucidquery-agi-01-frontier", + "modelKey": "lucidquery-agi-01-frontier", + "displayName": "AGI-01 Frontier", + "family": "agi", + "metadata": { + "knowledgeCutoff": "2026-06-05", + "lastUpdated": "2026-06-16", + "openWeights": false, + "releaseDate": "2026-06-16" + } + } + ] + }, + { + "id": "lucidquery/lucidquery-agi-01-swift", + "provider": "lucidquery", + "model": "lucidquery-agi-01-swift", + "displayName": "AGI-01 Swift", + "family": "agi", + "sources": [ + "models.dev" + ], + "providers": [ + "lucidquery" + ], + "aliases": [ + "lucidquery/lucidquery-agi-01-swift" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 300000, + "outputTokens": 120000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "lucidquery", + "model": "lucidquery-agi-01-swift", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "AGI-01 Swift" + ], + "families": [ + "agi" + ], + "knowledgeCutoff": "2026-06-05", + "releaseDate": "2026-06-16", + "lastUpdated": "2026-06-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "lucidquery", + "providerName": "LucidQuery", + "providerApi": "https://api.lucidquery.com/v1", + "providerDoc": "https://lucidquery.com/docs", + "model": "lucidquery-agi-01-swift", + "modelKey": "lucidquery-agi-01-swift", + "displayName": "AGI-01 Swift", + "family": "agi", + "metadata": { + "knowledgeCutoff": "2026-06-05", + "lastUpdated": "2026-06-16", + "openWeights": false, + "releaseDate": "2026-06-16" + } + } + ] + }, + { + "id": "lucidquery/lucidquery-nexus-coder", + "provider": "lucidquery", + "model": "lucidquery-nexus-coder", + "displayName": "LucidQuery Nexus Coder", + "family": "lucid", + "sources": [ + "models.dev" + ], + "providers": [ + "lucidquery" + ], + "aliases": [ + "lucidquery/lucidquery-nexus-coder" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 250000, + "outputTokens": 60000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "lucidquery", + "model": "lucidquery-nexus-coder", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "LucidQuery Nexus Coder" + ], + "families": [ + "lucid" + ], + "knowledgeCutoff": "2025-08-01", + "releaseDate": "2025-09-01", + "lastUpdated": "2025-09-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "lucidquery", + "providerName": "LucidQuery", + "providerApi": "https://api.lucidquery.com/v1", + "providerDoc": "https://lucidquery.com/docs", + "model": "lucidquery-nexus-coder", + "modelKey": "lucidquery-nexus-coder", + "displayName": "LucidQuery Nexus Coder", + "family": "lucid", + "metadata": { + "knowledgeCutoff": "2025-08-01", + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2025-09-01" + } + } + ] + }, + { + "id": "meganova/mimo-v2-flash", + "provider": "meganova", + "model": "mimo-v2-flash", + "displayName": "MiMo V2 Flash", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "meganova" + ], + "aliases": [ + "meganova/XiaomiMiMo/MiMo-V2-Flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "meganova", + "model": "XiaomiMiMo/MiMo-V2-Flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2 Flash" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12-01", + "releaseDate": "2025-12-17", + "lastUpdated": "2025-12-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "XiaomiMiMo/MiMo-V2-Flash", + "modelKey": "XiaomiMiMo/MiMo-V2-Flash", + "displayName": "MiMo V2 Flash", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12-01", + "lastUpdated": "2025-12-17", + "openWeights": true, + "releaseDate": "2025-12-17" + } + } + ] + }, + { + "id": "meta-llama/cerebras-llama-4-maverick-17b-128e-instruct", + "provider": "meta-llama", + "model": "cerebras-llama-4-maverick-17b-128e-instruct", + "displayName": "Cerebras-Llama-4-Maverick-17B-128E-Instruct", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "llama" + ], + "aliases": [ + "llama/cerebras-llama-4-maverick-17b-128e-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llama", + "model": "cerebras-llama-4-maverick-17b-128e-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cerebras-Llama-4-Maverick-17B-128E-Instruct" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-04-05", + "lastUpdated": "2025-04-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llama", + "providerName": "Llama", + "providerApi": "https://api.llama.com/compat/v1/", + "providerDoc": "https://llama.developer.meta.com/docs/models", + "model": "cerebras-llama-4-maverick-17b-128e-instruct", + "modelKey": "cerebras-llama-4-maverick-17b-128e-instruct", + "displayName": "Cerebras-Llama-4-Maverick-17B-128E-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + } + ] + }, + { + "id": "meta-llama/cerebras-llama-4-scout-17b-16e-instruct", + "provider": "meta-llama", + "model": "cerebras-llama-4-scout-17b-16e-instruct", + "displayName": "Cerebras-Llama-4-Scout-17B-16E-Instruct", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "llama" + ], + "aliases": [ + "llama/cerebras-llama-4-scout-17b-16e-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llama", + "model": "cerebras-llama-4-scout-17b-16e-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cerebras-Llama-4-Scout-17B-16E-Instruct" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-04-05", + "lastUpdated": "2025-04-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llama", + "providerName": "Llama", + "providerApi": "https://api.llama.com/compat/v1/", + "providerDoc": "https://llama.developer.meta.com/docs/models", + "model": "cerebras-llama-4-scout-17b-16e-instruct", + "modelKey": "cerebras-llama-4-scout-17b-16e-instruct", + "displayName": "Cerebras-Llama-4-Scout-17B-16E-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + } + ] + }, + { + "id": "meta-llama/codellama", + "provider": "meta-llama", + "model": "codellama", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/codellama" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/codellama", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/codellama", + "mode": "completion" + } + ] + }, + { + "id": "meta-llama/codellama-34b-instruct", + "provider": "meta-llama", + "model": "codellama-34b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "together_ai" + ], + "aliases": [ + "together_ai/togethercomputer/CodeLlama-34b-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/togethercomputer/CodeLlama-34b-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/togethercomputer/CodeLlama-34b-Instruct", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/codellama-34b-instruct-hf", + "provider": "meta-llama", + "model": "codellama-34b-instruct-hf", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "anyscale" + ], + "aliases": [ + "anyscale/codellama/CodeLlama-34b-Instruct-hf" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "anyscale", + "model": "anyscale/codellama/CodeLlama-34b-Instruct-hf", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anyscale", + "model": "anyscale/codellama/CodeLlama-34b-Instruct-hf", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/codellama-70b-instruct-hf", + "provider": "meta-llama", + "model": "codellama-70b-instruct-hf", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "anyscale" + ], + "aliases": [ + "anyscale/codellama/CodeLlama-70b-Instruct-hf" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "anyscale", + "model": "anyscale/codellama/CodeLlama-70b-Instruct-hf", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anyscale", + "model": "anyscale/codellama/CodeLlama-70b-Instruct-hf", + "mode": "chat", + "metadata": { + "source": "https://docs.anyscale.com/preview/endpoints/text-generation/supported-models/codellama-CodeLlama-70b-Instruct-hf" + } + } + ] + }, + { + "id": "meta-llama/codellama-7b", + "provider": "meta-llama", + "model": "codellama-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "llamagate" + ], + "aliases": [ + "llamagate/codellama-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "llamagate", + "model": "llamagate/codellama-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.12 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "llamagate", + "model": "llamagate/codellama-7b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/codellama-7b-instruct-awq", + "provider": "meta-llama", + "model": "codellama-7b-instruct-awq", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "cloudflare" + ], + "aliases": [ + "cloudflare/@hf/thebloke/codellama-7b-instruct-awq" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cloudflare", + "model": "cloudflare/@hf/thebloke/codellama-7b-instruct-awq", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.923, + "output": 1.923 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cloudflare", + "model": "cloudflare/@hf/thebloke/codellama-7b-instruct-awq", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/codellama-7b-instruct-solidity", + "provider": "meta-llama", + "model": "codellama-7b-instruct-solidity", + "displayName": "AlfredPros: CodeLLaMa 7B Instruct Solidity", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/alfredpros/codellama-7b-instruct-solidity" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "alfredpros/codellama-7b-instruct-solidity", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "AlfredPros: CodeLLaMa 7B Instruct Solidity" + ], + "releaseDate": "2025-04-14", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "alfredpros/codellama-7b-instruct-solidity", + "modelKey": "alfredpros/codellama-7b-instruct-solidity", + "displayName": "AlfredPros: CodeLLaMa 7B Instruct Solidity", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-04-14" + } + } + ] + }, + { + "id": "meta-llama/esm2-650m", + "provider": "meta-llama", + "model": "esm2-650m", + "displayName": "esm2-650m", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/meta/esm2-650m" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "meta/esm2-650m", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "esm2-650m" + ], + "releaseDate": "2024-08-29", + "lastUpdated": "2025-03-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "meta/esm2-650m", + "modelKey": "meta/esm2-650m", + "displayName": "esm2-650m", + "metadata": { + "lastUpdated": "2025-03-10", + "openWeights": true, + "releaseDate": "2024-08-29" + } + } + ] + }, + { + "id": "meta-llama/esmfold", + "provider": "meta-llama", + "model": "esmfold", + "displayName": "esmfold", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/meta/esmfold" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "meta/esmfold", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "esmfold" + ], + "releaseDate": "2024-03-15", + "lastUpdated": "2025-06-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "meta/esmfold", + "modelKey": "meta/esmfold", + "displayName": "esmfold", + "metadata": { + "lastUpdated": "2025-06-12", + "openWeights": true, + "releaseDate": "2024-03-15" + } + } + ] + }, + { + "id": "meta-llama/groq-llama-4-maverick-17b-128e-instruct", + "provider": "meta-llama", + "model": "groq-llama-4-maverick-17b-128e-instruct", + "displayName": "Groq-Llama-4-Maverick-17B-128E-Instruct", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "llama" + ], + "aliases": [ + "llama/groq-llama-4-maverick-17b-128e-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llama", + "model": "groq-llama-4-maverick-17b-128e-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Groq-Llama-4-Maverick-17B-128E-Instruct" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-04-05", + "lastUpdated": "2025-04-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llama", + "providerName": "Llama", + "providerApi": "https://api.llama.com/compat/v1/", + "providerDoc": "https://llama.developer.meta.com/docs/models", + "model": "groq-llama-4-maverick-17b-128e-instruct", + "modelKey": "groq-llama-4-maverick-17b-128e-instruct", + "displayName": "Groq-Llama-4-Maverick-17B-128E-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + } + ] + }, + { + "id": "meta-llama/llama-2-13b", + "provider": "meta-llama", + "model": "llama-2-13b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "replicate" + ], + "aliases": [ + "replicate/meta/llama-2-13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/meta/llama-2-13b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/meta/llama-2-13b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-2-13b-chat", + "provider": "meta-llama", + "model": "llama-2-13b-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "replicate" + ], + "aliases": [ + "replicate/meta/llama-2-13b-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/meta/llama-2-13b-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/meta/llama-2-13b-chat", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-2-13b-chat-hf", + "provider": "meta-llama", + "model": "llama-2-13b-chat-hf", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "anyscale" + ], + "aliases": [ + "anyscale/meta-llama/Llama-2-13b-chat-hf" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "anyscale", + "model": "anyscale/meta-llama/Llama-2-13b-chat-hf", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 0.25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anyscale", + "model": "anyscale/meta-llama/Llama-2-13b-chat-hf", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-2-70b", + "provider": "meta-llama", + "model": "llama-2-70b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "replicate" + ], + "aliases": [ + "replicate/meta/llama-2-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/meta/llama-2-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.65, + "output": 2.75 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/meta/llama-2-70b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-2-70b-chat", + "provider": "meta-llama", + "model": "llama-2-70b-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "replicate" + ], + "aliases": [ + "replicate/meta/llama-2-70b-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/meta/llama-2-70b-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.65, + "output": 2.75 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/meta/llama-2-70b-chat", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-2-70b-chat-hf", + "provider": "meta-llama", + "model": "llama-2-70b-chat-hf", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "anyscale" + ], + "aliases": [ + "anyscale/meta-llama/Llama-2-70b-chat-hf" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "anyscale", + "model": "anyscale/meta-llama/Llama-2-70b-chat-hf", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anyscale", + "model": "anyscale/meta-llama/Llama-2-70b-chat-hf", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-2-7b", + "provider": "meta-llama", + "model": "llama-2-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "replicate" + ], + "aliases": [ + "replicate/meta/llama-2-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/meta/llama-2-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/meta/llama-2-7b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-2-7b-chat", + "provider": "meta-llama", + "model": "llama-2-7b-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "replicate" + ], + "aliases": [ + "replicate/meta/llama-2-7b-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/meta/llama-2-7b-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/meta/llama-2-7b-chat", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-2-7b-chat-fp16", + "provider": "meta-llama", + "model": "llama-2-7b-chat-fp16", + "displayName": "Llama 2 7B Chat FP16", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "cloudflare", + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/meta/llama-2-7b-chat-fp16", + "cloudflare/@cf/meta/llama-2-7b-chat-fp16" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 3072, + "maxTokens": 3072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/meta/llama-2-7b-chat-fp16", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.56, + "output": 6.67 + } + }, + { + "source": "litellm", + "provider": "cloudflare", + "model": "cloudflare/@cf/meta/llama-2-7b-chat-fp16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.923, + "output": 1.923 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 2 7B Chat FP16" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-04-03", + "lastUpdated": "2025-04-03", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/meta/llama-2-7b-chat-fp16", + "modelKey": "workers-ai/@cf/meta/llama-2-7b-chat-fp16", + "displayName": "Llama 2 7B Chat FP16", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cloudflare", + "model": "cloudflare/@cf/meta/llama-2-7b-chat-fp16", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-2-7b-chat-hf", + "provider": "meta-llama", + "model": "llama-2-7b-chat-hf", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "anyscale" + ], + "aliases": [ + "anyscale/meta-llama/Llama-2-7b-chat-hf" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "anyscale", + "model": "anyscale/meta-llama/Llama-2-7b-chat-hf", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anyscale", + "model": "anyscale/meta-llama/Llama-2-7b-chat-hf", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-2-7b-chat-int8", + "provider": "meta-llama", + "model": "llama-2-7b-chat-int8", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "cloudflare" + ], + "aliases": [ + "cloudflare/@cf/meta/llama-2-7b-chat-int8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2048, + "inputTokens": 2048, + "maxTokens": 2048, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "cloudflare", + "model": "cloudflare/@cf/meta/llama-2-7b-chat-int8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.923, + "output": 1.923 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cloudflare", + "model": "cloudflare/@cf/meta/llama-2-7b-chat-int8", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3-1-nemotron-safety-guard-8b-v3", + "provider": "meta-llama", + "model": "llama-3-1-nemotron-safety-guard-8b-v3", + "displayName": "llama-3.1-nemotron-safety-guard-8b-v3", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/llama-3_1-nemotron-safety-guard-8b-v3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/llama-3_1-nemotron-safety-guard-8b-v3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "llama-3.1-nemotron-safety-guard-8b-v3" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2025-10-28", + "lastUpdated": "2025-10-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/llama-3_1-nemotron-safety-guard-8b-v3", + "modelKey": "nvidia/llama-3_1-nemotron-safety-guard-8b-v3", + "displayName": "llama-3.1-nemotron-safety-guard-8b-v3", + "family": "nemotron", + "metadata": { + "lastUpdated": "2025-10-28", + "openWeights": true, + "releaseDate": "2025-10-28" + } + } + ] + }, + { + "id": "meta-llama/llama-3-1-nemotron-ultra-253b-v1", + "provider": "meta-llama", + "model": "llama-3-1-nemotron-ultra-253b-v1", + "displayName": "Llama-3.1-Nemotron-Ultra-253B-v1", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/nvidia/Llama-3_1-Nemotron-Ultra-253B-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 120000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nebius", + "model": "nvidia/Llama-3_1-Nemotron-Ultra-253B-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.75, + "input": 0.6, + "output": 1.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama-3.1-Nemotron-Ultra-253B-v1" + ], + "families": [ + "nemotron" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-01-15", + "lastUpdated": "2026-02-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "nvidia/Llama-3_1-Nemotron-Ultra-253B-v1", + "modelKey": "nvidia/Llama-3_1-Nemotron-Ultra-253B-v1", + "displayName": "Llama-3.1-Nemotron-Ultra-253B-v1", + "family": "nemotron", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2025-01-15" + } + } + ] + }, + { + "id": "meta-llama/llama-3-2-11b-vision-instruct", + "provider": "meta-llama", + "model": "llama-3-2-11b-vision-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/meta-llama/llama-3-2-11b-vision-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/meta-llama/llama-3-2-11b-vision-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.35, + "output": 0.35 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/meta-llama/llama-3-2-11b-vision-instruct", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3-2-1b-instruct", + "provider": "meta-llama", + "model": "llama-3-2-1b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/meta-llama/llama-3-2-1b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/meta-llama/llama-3-2-1b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/meta-llama/llama-3-2-1b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3-2-3b-instruct", + "provider": "meta-llama", + "model": "llama-3-2-3b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/meta-llama/llama-3-2-3b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/meta-llama/llama-3-2-3b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/meta-llama/llama-3-2-3b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3-2-90b-vision-instruct", + "provider": "meta-llama", + "model": "llama-3-2-90b-vision-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/meta-llama/llama-3-2-90b-vision-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/meta-llama/llama-3-2-90b-vision-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/meta-llama/llama-3-2-90b-vision-instruct", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3-2-nemoretriever-300m-embed-v1", + "provider": "meta-llama", + "model": "llama-3-2-nemoretriever-300m-embed-v1", + "displayName": "llama-3_2-nemoretriever-300m-embed-v1", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/llama-3_2-nemoretriever-300m-embed-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/llama-3_2-nemoretriever-300m-embed-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "llama-3_2-nemoretriever-300m-embed-v1" + ], + "releaseDate": "2025-07-24", + "lastUpdated": "2025-07-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/llama-3_2-nemoretriever-300m-embed-v1", + "modelKey": "nvidia/llama-3_2-nemoretriever-300m-embed-v1", + "displayName": "llama-3_2-nemoretriever-300m-embed-v1", + "metadata": { + "lastUpdated": "2025-07-24", + "openWeights": true, + "releaseDate": "2025-07-24" + } + } + ] + }, + { + "id": "meta-llama/llama-3-2-nv-rerankqa-1b-v2", + "provider": "meta-llama", + "model": "llama-3-2-nv-rerankqa-1b-v2", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "nvidia_nim" + ], + "aliases": [ + "nvidia_nim/nvidia/llama-3_2-nv-rerankqa-1b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "nvidia_nim", + "model": "nvidia_nim/nvidia/llama-3_2-nv-rerankqa-1b-v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perQuery": { + "input": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nvidia_nim", + "model": "nvidia_nim/nvidia/llama-3_2-nv-rerankqa-1b-v2", + "mode": "rerank" + } + ] + }, + { + "id": "meta-llama/llama-3-3-70b-instruct", + "provider": "meta-llama", + "model": "llama-3-3-70b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/meta-llama/llama-3-3-70b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/meta-llama/llama-3-3-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.71, + "output": 0.71 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/meta-llama/llama-3-3-70b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3-3-nemotron-super-49b-v1-5", + "provider": "meta-llama", + "model": "llama-3-3-nemotron-super-49b-v1-5", + "displayName": "Nvidia Nemotron Super 49B v1.5", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/nvidia/Llama-3_3-Nemotron-Super-49B-v1_5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "nvidia/Llama-3_3-Nemotron-Super-49B-v1_5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nvidia Nemotron Super 49B v1.5" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2025-08-08", + "lastUpdated": "2025-08-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "nvidia/Llama-3_3-Nemotron-Super-49B-v1_5", + "modelKey": "nvidia/Llama-3_3-Nemotron-Super-49B-v1_5", + "displayName": "Nvidia Nemotron Super 49B v1.5", + "family": "nemotron", + "metadata": { + "lastUpdated": "2025-08-08", + "openWeights": false, + "releaseDate": "2025-08-08" + } + } + ] + }, + { + "id": "meta-llama/llama-3-70b", + "provider": "meta-llama", + "model": "llama-3-70b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "replicate", + "vercel_ai_gateway" + ], + "aliases": [ + "replicate/meta/llama-3-70b", + "vercel_ai_gateway/meta/llama-3-70b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/meta/llama-3-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.65, + "output": 2.75 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.59, + "output": 0.79 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/meta/llama-3-70b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3-70b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3-70b-instruct", + "provider": "meta-llama", + "model": "llama-3-70b-instruct", + "displayName": "Meta: Llama 3 70B Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "kilo", + "llmgateway", + "novita", + "novita-ai", + "openrouter", + "replicate" + ], + "aliases": [ + "kilo/meta-llama/llama-3-70b-instruct", + "llmgateway/llama-3-70b-instruct", + "novita-ai/meta-llama/llama-3-70b-instruct", + "novita/meta-llama/llama-3-70b-instruct", + "openrouter/meta-llama/llama-3-70b-instruct", + "replicate/meta/llama-3-70b-instruct" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "meta-llama/llama-3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.51, + "output": 0.74 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "llama-3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.51, + "output": 0.74 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "meta-llama/llama-3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.51, + "output": 0.74 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/meta-llama/llama-3-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.51, + "output": 0.74 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/meta-llama/llama-3-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.59, + "output": 0.79 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/meta/llama-3-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.65, + "output": 2.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3 70B Instruct", + "Llama3 70B Instruct", + "Meta: Llama 3 70B Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "meta-llama/llama-3-70b-instruct", + "modelKey": "meta-llama/llama-3-70b-instruct", + "displayName": "Meta: Llama 3 70B Instruct", + "metadata": { + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "llama-3-70b-instruct", + "modelKey": "llama-3-70b-instruct", + "displayName": "Llama 3 70B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2024-04-18", + "openWeights": true, + "releaseDate": "2024-04-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "meta-llama/llama-3-70b-instruct", + "modelKey": "meta-llama/llama-3-70b-instruct", + "displayName": "Llama3 70B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2024-04-25", + "openWeights": true, + "releaseDate": "2024-04-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/meta-llama/llama-3-70b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/meta-llama/llama-3-70b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/meta/llama-3-70b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3-8b", + "provider": "meta-llama", + "model": "llama-3-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "replicate", + "vercel_ai_gateway" + ], + "aliases": [ + "replicate/meta/llama-3-8b", + "vercel_ai_gateway/meta/llama-3-8b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/meta/llama-3-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.25 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.08 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/meta/llama-3-8b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3-8b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3-8b-instruct", + "provider": "meta-llama", + "model": "llama-3-8b-instruct", + "displayName": "Llama 3 8B Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "cloudflare-ai-gateway", + "kilo", + "llmgateway", + "novita", + "novita-ai", + "openrouter", + "replicate" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/meta/llama-3-8b-instruct", + "kilo/meta-llama/llama-3-8b-instruct", + "llmgateway/llama-3-8b-instruct", + "novita-ai/meta-llama/llama-3-8b-instruct", + "novita/meta-llama/llama-3-8b-instruct", + "openrouter/meta-llama/llama-3-8b-instruct", + "replicate/meta/llama-3-8b-instruct" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 128000, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/meta/llama-3-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.28, + "output": 0.83 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "meta-llama/llama-3-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.03, + "output": 0.04 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "llama-3-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.04 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "meta-llama/llama-3-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.04 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "meta-llama/llama-3-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.14 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/meta-llama/llama-3-8b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.04 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/meta/llama-3-8b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.25 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "meta-llama/llama-3-8b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.14, + "output": 0.14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3 8B Instruct", + "Meta: Llama 3 8B Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12-31", + "releaseDate": "2025-04-03", + "lastUpdated": "2025-04-03", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/meta/llama-3-8b-instruct", + "modelKey": "workers-ai/@cf/meta/llama-3-8b-instruct", + "displayName": "Llama 3 8B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "meta-llama/llama-3-8b-instruct", + "modelKey": "meta-llama/llama-3-8b-instruct", + "displayName": "Meta: Llama 3 8B Instruct", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": true, + "releaseDate": "2024-04-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "llama-3-8b-instruct", + "modelKey": "llama-3-8b-instruct", + "displayName": "Llama 3 8B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": true, + "releaseDate": "2025-04-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "meta-llama/llama-3-8b-instruct", + "modelKey": "meta-llama/llama-3-8b-instruct", + "displayName": "Llama 3 8B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2024-04-25", + "openWeights": true, + "releaseDate": "2024-04-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "meta-llama/llama-3-8b-instruct", + "modelKey": "meta-llama/llama-3-8b-instruct", + "displayName": "Llama 3 8B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12-31", + "lastUpdated": "2024-04-18", + "openWeights": true, + "releaseDate": "2024-04-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/meta-llama/llama-3-8b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/meta/llama-3-8b-instruct", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "meta-llama/llama-3-8b-instruct", + "displayName": "Meta: Llama 3 8B Instruct", + "metadata": { + "canonicalSlug": "meta-llama/llama-3-8b-instruct", + "createdAt": "2024-04-18T00:00:00.000Z", + "huggingFaceId": "meta-llama/Meta-Llama-3-8B-Instruct", + "instructType": "llama3", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/meta-llama/llama-3-8b-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 8192, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "meta-llama/llama-3-8b-instruct-awq", + "provider": "meta-llama", + "model": "llama-3-8b-instruct-awq", + "displayName": "Llama 3 8B Instruct AWQ", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/meta/llama-3-8b-instruct-awq" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/meta/llama-3-8b-instruct-awq", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.27 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3 8B Instruct AWQ" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-04-03", + "lastUpdated": "2025-04-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/meta/llama-3-8b-instruct-awq", + "modelKey": "workers-ai/@cf/meta/llama-3-8b-instruct-awq", + "displayName": "Llama 3 8B Instruct AWQ", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + } + ] + }, + { + "id": "meta-llama/llama-3.05-nemotron-tenyxchat-storybreaker-70b", + "provider": "meta-llama", + "model": "llama-3.05-nemotron-tenyxchat-storybreaker-70b", + "displayName": "Nemotron Tenyxchat Storybreaker 70b", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Envoid/Llama-3.05-Nemotron-Tenyxchat-Storybreaker-70B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Envoid/Llama-3.05-Nemotron-Tenyxchat-Storybreaker-70B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49299999999999994, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron Tenyxchat Storybreaker 70b" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2024-12-01", + "lastUpdated": "2024-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Envoid/Llama-3.05-Nemotron-Tenyxchat-Storybreaker-70B", + "modelKey": "Envoid/Llama-3.05-Nemotron-Tenyxchat-Storybreaker-70B", + "displayName": "Nemotron Tenyxchat Storybreaker 70b", + "family": "nemotron", + "metadata": { + "lastUpdated": "2024-12-01", + "openWeights": false, + "releaseDate": "2024-12-01" + } + } + ] + }, + { + "id": "meta-llama/llama-3.05-nt-storybreaker-ministral-70b", + "provider": "meta-llama", + "model": "llama-3.05-nt-storybreaker-ministral-70b", + "displayName": "Llama 3.05 Storybreaker Ministral 70b", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Envoid/Llama-3.05-NT-Storybreaker-Ministral-70B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Envoid/Llama-3.05-NT-Storybreaker-Ministral-70B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49299999999999994, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.05 Storybreaker Ministral 70b" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-12-01", + "lastUpdated": "2024-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Envoid/Llama-3.05-NT-Storybreaker-Ministral-70B", + "modelKey": "Envoid/Llama-3.05-NT-Storybreaker-Ministral-70B", + "displayName": "Llama 3.05 Storybreaker Ministral 70b", + "family": "llama", + "metadata": { + "lastUpdated": "2024-12-01", + "openWeights": false, + "releaseDate": "2024-12-01" + } + } + ] + }, + { + "id": "meta-llama/llama-3.1-405b-instruct", + "provider": "meta-llama", + "model": "llama-3.1-405b-instruct", + "displayName": "Llama 3.1 405B Instruct", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "cortecs", + "synthetic" + ], + "aliases": [ + "cortecs/llama-3.1-405b-instruct", + "synthetic/hf:meta-llama/Llama-3.1-405B-Instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "llama-3.1-405b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:meta-llama/Llama-3.1-405B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 405B Instruct", + "Llama-3.1-405B-Instruct" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "llama-3.1-405b-instruct", + "modelKey": "llama-3.1-405b-instruct", + "displayName": "Llama 3.1 405B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:meta-llama/Llama-3.1-405B-Instruct", + "modelKey": "hf:meta-llama/Llama-3.1-405B-Instruct", + "displayName": "Llama-3.1-405B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + } + ] + }, + { + "id": "meta-llama/llama-3.1-405b-instruct-maas", + "provider": "meta-llama", + "model": "llama-3.1-405b-instruct-maas", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-llama_models" + ], + "aliases": [ + "vertex_ai-llama_models/vertex_ai/meta/llama-3.1-405b-instruct-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 2048, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama-3.1-405b-instruct-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5, + "output": 16 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama-3.1-405b-instruct-maas", + "mode": "chat", + "metadata": { + "source": "https://console.cloud.google.com/vertex-ai/publishers/meta/model-garden/llama-3.2-90b-vision-instruct-maas" + } + } + ] + }, + { + "id": "meta-llama/llama-3.1-70b", + "provider": "meta-llama", + "model": "llama-3.1-70b", + "displayName": "Llama 3.1 70B Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "vercel/meta/llama-3.1-70b", + "vercel_ai_gateway/meta/llama-3.1-70b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "meta/llama-3.1-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3.1-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 70B Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "meta/llama-3.1-70b", + "modelKey": "meta/llama-3.1-70b", + "displayName": "Llama 3.1 70B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": false, + "releaseDate": "2024-07-23" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3.1-70b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3.1-70b-instruct", + "provider": "meta-llama", + "model": "llama-3.1-70b-instruct", + "displayName": "Meta: Llama 3.1 70B Instruct", + "family": "llama", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "llmgateway", + "nvidia", + "openrouter", + "synthetic", + "wandb" + ], + "aliases": [ + "kilo/meta-llama/llama-3.1-70b-instruct", + "llmgateway/llama-3.1-70b-instruct", + "nvidia/meta/llama-3.1-70b-instruct", + "openrouter/meta-llama/llama-3.1-70b-instruct", + "synthetic/hf:meta-llama/Llama-3.1-70B-Instruct", + "wandb/meta-llama/Llama-3.1-70B-Instruct" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 131072, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "meta-llama/llama-3.1-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "llama-3.1-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "meta/llama-3.1-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "meta-llama/llama-3.1-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:meta-llama/Llama-3.1-70B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "wandb", + "model": "meta-llama/Llama-3.1-70B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 0.8 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "meta-llama/llama-3.1-70b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 70B", + "Llama 3.1 70B Instruct", + "Llama 3.1 70b Instruct", + "Llama-3.1-70B-Instruct", + "Meta: Llama 3.1 70B Instruct" + ], + "families": [ + "llama" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2023-12-31", + "releaseDate": "2024-07-16", + "lastUpdated": "2024-07-23", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "meta-llama/llama-3.1-70b-instruct", + "modelKey": "meta-llama/llama-3.1-70b-instruct", + "displayName": "Meta: Llama 3.1 70B Instruct", + "metadata": { + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "llama-3.1-70b-instruct", + "modelKey": "llama-3.1-70b-instruct", + "displayName": "Llama 3.1 70B Instruct", + "family": "llama", + "status": "beta", + "metadata": { + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "meta/llama-3.1-70b-instruct", + "modelKey": "meta/llama-3.1-70b-instruct", + "displayName": "Llama 3.1 70b Instruct", + "metadata": { + "lastUpdated": "2024-07-16", + "openWeights": true, + "releaseDate": "2024-07-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "meta-llama/llama-3.1-70b-instruct", + "modelKey": "meta-llama/llama-3.1-70b-instruct", + "displayName": "Llama 3.1 70B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12-31", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:meta-llama/Llama-3.1-70B-Instruct", + "modelKey": "hf:meta-llama/Llama-3.1-70B-Instruct", + "displayName": "Llama-3.1-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "meta-llama/Llama-3.1-70B-Instruct", + "modelKey": "meta-llama/Llama-3.1-70B-Instruct", + "displayName": "Llama 3.1 70B", + "family": "llama", + "metadata": { + "lastUpdated": "2026-03-12", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "meta-llama/llama-3.1-70b-instruct", + "displayName": "Meta: Llama 3.1 70B Instruct", + "metadata": { + "canonicalSlug": "meta-llama/llama-3.1-70b-instruct", + "createdAt": "2024-07-23T00:00:00.000Z", + "huggingFaceId": "meta-llama/Meta-Llama-3.1-70B-Instruct", + "instructType": "llama3", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/meta-llama/llama-3.1-70b-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "meta-llama/llama-3.1-70b-instruct-maas", + "provider": "meta-llama", + "model": "llama-3.1-70b-instruct-maas", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-llama_models" + ], + "aliases": [ + "vertex_ai-llama_models/vertex_ai/meta/llama-3.1-70b-instruct-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 2048, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama-3.1-70b-instruct-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama-3.1-70b-instruct-maas", + "mode": "chat", + "metadata": { + "source": "https://console.cloud.google.com/vertex-ai/publishers/meta/model-garden/llama-3.2-90b-vision-instruct-maas" + } + } + ] + }, + { + "id": "meta-llama/llama-3.1-8b", + "provider": "meta-llama", + "model": "llama-3.1-8b", + "displayName": "Llama 3.1 8B Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "llamagate", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "llamagate/llama-3.1-8b", + "vercel/meta/llama-3.1-8b", + "vercel_ai_gateway/meta/llama-3.1-8b" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "meta/llama-3.1-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.22, + "output": 0.22 + } + }, + { + "source": "litellm", + "provider": "llamagate", + "model": "llamagate/llama-3.1-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.03, + "output": 0.05 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3.1-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.08 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 8B Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "meta/llama-3.1-8b", + "modelKey": "meta/llama-3.1-8b", + "displayName": "Llama 3.1 8B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": false, + "releaseDate": "2024-07-23" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "llamagate", + "model": "llamagate/llama-3.1-8b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3.1-8b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3.1-8b-cs", + "provider": "meta-llama", + "model": "llama-3.1-8b-cs", + "displayName": "Llama-3.1-8B-CS", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/cerebras/llama-3.1-8b-cs" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "cerebras/llama-3.1-8b-cs", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama-3.1-8B-CS" + ], + "releaseDate": "2025-05-13", + "lastUpdated": "2025-05-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "cerebras/llama-3.1-8b-cs", + "modelKey": "cerebras/llama-3.1-8b-cs", + "displayName": "Llama-3.1-8B-CS", + "metadata": { + "lastUpdated": "2025-05-13", + "openWeights": false, + "releaseDate": "2025-05-13" + } + } + ] + }, + { + "id": "meta-llama/llama-3.1-8b-instant", + "provider": "meta-llama", + "model": "llama-3.1-8b-instant", + "displayName": "Llama 3.1 8B", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "groq", + "helicone" + ], + "aliases": [ + "groq/llama-3.1-8b-instant", + "helicone/llama-3.1-8b-instant" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "groq", + "model": "llama-3.1-8b-instant", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.08 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "llama-3.1-8b-instant", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.049999999999999996, + "output": 0.08 + } + }, + { + "source": "litellm", + "provider": "groq", + "model": "groq/llama-3.1-8b-instant", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.08 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 8B", + "Meta Llama 3.1 8B Instant" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "groq", + "providerName": "Groq", + "providerDoc": "https://console.groq.com/docs/models", + "model": "llama-3.1-8b-instant", + "modelKey": "llama-3.1-8b-instant", + "displayName": "Llama 3.1 8B", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "llama-3.1-8b-instant", + "modelKey": "llama-3.1-8b-instant", + "displayName": "Meta Llama 3.1 8B Instant", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2024-07-01", + "openWeights": false, + "releaseDate": "2024-07-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "groq", + "model": "groq/llama-3.1-8b-instant", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3.1-8b-instruct", + "provider": "meta-llama", + "model": "llama-3.1-8b-instruct", + "displayName": "Llama-3.1-8B-Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "cloudflare-ai-gateway", + "friendli", + "helicone", + "inference", + "kilo", + "llmgateway", + "nano-gpt", + "novita", + "novita-ai", + "nscale", + "nvidia", + "openrouter", + "ovhcloud", + "regolo-ai", + "synthetic", + "wandb" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/meta/llama-3.1-8b-instruct", + "friendli/meta-llama/Llama-3.1-8B-Instruct", + "helicone/llama-3.1-8b-instruct", + "inference/meta/llama-3.1-8b-instruct", + "kilo/meta-llama/llama-3.1-8b-instruct", + "llmgateway/llama-3.1-8b-instruct", + "nano-gpt/meta-llama/llama-3.1-8b-instruct", + "novita-ai/meta-llama/llama-3.1-8b-instruct", + "novita/meta-llama/llama-3.1-8b-instruct", + "nscale/meta-llama/Llama-3.1-8B-Instruct", + "nvidia/meta/llama-3.1-8b-instruct", + "openrouter/meta-llama/llama-3.1-8b-instruct", + "ovhcloud/Llama-3.1-8B-Instruct", + "ovhcloud/llama-3.1-8b-instruct", + "regolo-ai/llama-3.1-8b-instruct", + "synthetic/hf:meta-llama/Llama-3.1-8B-Instruct", + "wandb/meta-llama/Llama-3.1-8B-Instruct" + ], + "mergedProviderModelRecords": 16, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false, + "parallelFunctionCalling": false, + "webSearch": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/meta/llama-3.1-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.28, + "output": 0.8299999999999998 + } + }, + { + "source": "models.dev", + "provider": "friendli", + "model": "meta-llama/Llama-3.1-8B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "llama-3.1-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.049999999999999996 + } + }, + { + "source": "models.dev", + "provider": "inference", + "model": "meta/llama-3.1-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.025, + "output": 0.025 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "meta-llama/llama-3.1-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.05 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "llama-3.1-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.22, + "output": 0.22 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "meta-llama/llama-3.1-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0544, + "output": 0.0544 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "meta-llama/llama-3.1-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.05 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "meta/llama-3.1-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "meta-llama/llama-3.1-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.03 + } + }, + { + "source": "models.dev", + "provider": "ovhcloud", + "model": "llama-3.1-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.11, + "output": 0.11 + } + }, + { + "source": "models.dev", + "provider": "regolo-ai", + "model": "llama-3.1-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.25 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:meta-llama/Llama-3.1-8B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "models.dev", + "provider": "wandb", + "model": "meta-llama/Llama-3.1-8B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.22, + "output": 0.22 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/meta-llama/llama-3.1-8b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0.05 + } + }, + { + "source": "litellm", + "provider": "nscale", + "model": "nscale/meta-llama/Llama-3.1-8B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.03, + "output": 0.03 + } + }, + { + "source": "litellm", + "provider": "ovhcloud", + "model": "ovhcloud/Llama-3.1-8B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "wandb", + "model": "wandb/meta-llama/Llama-3.1-8B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 22000, + "output": 22000 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "meta-llama/llama-3.1-8b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0.03 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 8B Instruct", + "Llama 3.1 8b Instruct", + "Llama-3.1-8B-Instruct", + "Meta Llama 3.1 8B Instruct", + "Meta-Llama-3.1-8B-Instruct", + "Meta: Llama 3.1 8B Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2025-04-03", + "lastUpdated": "2025-04-03", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 16 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/meta/llama-3.1-8b-instruct", + "modelKey": "workers-ai/@cf/meta/llama-3.1-8b-instruct", + "displayName": "Llama 3.1 8B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "friendli", + "providerName": "Friendli", + "providerApi": "https://api.friendli.ai/serverless/v1", + "providerDoc": "https://friendli.ai/docs/guides/serverless_endpoints/introduction", + "model": "meta-llama/Llama-3.1-8B-Instruct", + "modelKey": "meta-llama/Llama-3.1-8B-Instruct", + "displayName": "Llama 3.1 8B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2024-08-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "llama-3.1-8b-instruct", + "modelKey": "llama-3.1-8b-instruct", + "displayName": "Meta Llama 3.1 8B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2024-07-23", + "openWeights": false, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "inference", + "providerName": "Inference", + "providerApi": "https://inference.net/v1", + "providerDoc": "https://inference.net/models", + "model": "meta/llama-3.1-8b-instruct", + "modelKey": "meta/llama-3.1-8b-instruct", + "displayName": "Llama 3.1 8B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2025-01-01", + "openWeights": true, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "meta-llama/llama-3.1-8b-instruct", + "modelKey": "meta-llama/llama-3.1-8b-instruct", + "displayName": "Meta: Llama 3.1 8B Instruct", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "llama-3.1-8b-instruct", + "modelKey": "llama-3.1-8b-instruct", + "displayName": "Llama 3.1 8B Instruct", + "family": "llama", + "status": "beta", + "metadata": { + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "meta-llama/llama-3.1-8b-instruct", + "modelKey": "meta-llama/llama-3.1-8b-instruct", + "displayName": "Llama 3.1 8b Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2024-07-23", + "openWeights": false, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "meta-llama/llama-3.1-8b-instruct", + "modelKey": "meta-llama/llama-3.1-8b-instruct", + "displayName": "Llama 3.1 8B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2024-07-24", + "openWeights": true, + "releaseDate": "2024-07-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "meta/llama-3.1-8b-instruct", + "modelKey": "meta/llama-3.1-8b-instruct", + "displayName": "Llama 3.1 8B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2025-01-01", + "openWeights": true, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "meta-llama/llama-3.1-8b-instruct", + "modelKey": "meta-llama/llama-3.1-8b-instruct", + "displayName": "Llama 3.1 8B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12-31", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ovhcloud", + "providerName": "OVHcloud AI Endpoints", + "providerApi": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", + "providerDoc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", + "model": "llama-3.1-8b-instruct", + "modelKey": "llama-3.1-8b-instruct", + "displayName": "Llama-3.1-8B-Instruct", + "metadata": { + "lastUpdated": "2025-06-11", + "openWeights": true, + "releaseDate": "2025-06-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "regolo-ai", + "providerName": "Regolo AI", + "providerApi": "https://api.regolo.ai/v1", + "providerDoc": "https://docs.regolo.ai/", + "model": "llama-3.1-8b-instruct", + "modelKey": "llama-3.1-8b-instruct", + "displayName": "Llama 3.1 8B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-07", + "openWeights": false, + "releaseDate": "2025-04-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:meta-llama/Llama-3.1-8B-Instruct", + "modelKey": "hf:meta-llama/Llama-3.1-8B-Instruct", + "displayName": "Llama-3.1-8B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "meta-llama/Llama-3.1-8B-Instruct", + "modelKey": "meta-llama/Llama-3.1-8B-Instruct", + "displayName": "Meta-Llama-3.1-8B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2026-03-12", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/meta-llama/llama-3.1-8b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nscale", + "model": "nscale/meta-llama/Llama-3.1-8B-Instruct", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Pricing listed as $0.06/1M tokens total. Assumed 50/50 split for input/output." + }, + "source": "https://docs.nscale.com/docs/inference/serverless-models/current#chat-models" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ovhcloud", + "model": "ovhcloud/Llama-3.1-8B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://endpoints.ai.cloud.ovh.net/models/llama-3-1-8b-instruct" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "wandb", + "model": "wandb/meta-llama/Llama-3.1-8B-Instruct", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "meta-llama/llama-3.1-8b-instruct", + "displayName": "Meta: Llama 3.1 8B Instruct", + "metadata": { + "canonicalSlug": "meta-llama/llama-3.1-8b-instruct", + "createdAt": "2024-07-23T00:00:00.000Z", + "huggingFaceId": "meta-llama/Meta-Llama-3.1-8B-Instruct", + "instructType": "llama3", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/meta-llama/llama-3.1-8b-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "meta-llama/llama-3.1-8b-instruct-awq", + "provider": "meta-llama", + "model": "llama-3.1-8b-instruct-awq", + "displayName": "Llama 3.1 8B Instruct AWQ", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/meta/llama-3.1-8b-instruct-awq" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/meta/llama-3.1-8b-instruct-awq", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.27 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 8B Instruct AWQ" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-04-03", + "lastUpdated": "2025-04-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/meta/llama-3.1-8b-instruct-awq", + "modelKey": "workers-ai/@cf/meta/llama-3.1-8b-instruct-awq", + "displayName": "Llama 3.1 8B Instruct AWQ", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + } + ] + }, + { + "id": "meta-llama/llama-3.1-8b-instruct-fp8", + "provider": "meta-llama", + "model": "llama-3.1-8b-instruct-fp8", + "displayName": "Llama 3.1 8B Instruct FP8", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway", + "cloudflare-workers-ai" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/meta/llama-3.1-8b-instruct-fp8", + "cloudflare-workers-ai/@cf/meta/llama-3.1-8b-instruct-fp8" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/meta/llama-3.1-8b-instruct-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.29 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/meta/llama-3.1-8b-instruct-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.152, + "output": 0.287 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 8B Instruct FP8", + "Llama 3.1 8B Instruct fp8" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-04-03", + "lastUpdated": "2025-04-03", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/meta/llama-3.1-8b-instruct-fp8", + "modelKey": "workers-ai/@cf/meta/llama-3.1-8b-instruct-fp8", + "displayName": "Llama 3.1 8B Instruct FP8", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/meta/llama-3.1-8b-instruct-fp8", + "modelKey": "@cf/meta/llama-3.1-8b-instruct-fp8", + "displayName": "Llama 3.1 8B Instruct fp8", + "family": "llama", + "metadata": { + "lastUpdated": "2024-07-25", + "openWeights": true, + "releaseDate": "2024-07-25" + } + } + ] + }, + { + "id": "meta-llama/llama-3.1-8b-instruct-maas", + "provider": "meta-llama", + "model": "llama-3.1-8b-instruct-maas", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-llama_models" + ], + "aliases": [ + "vertex_ai-llama_models/vertex_ai/meta/llama-3.1-8b-instruct-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 2048, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama-3.1-8b-instruct-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama-3.1-8b-instruct-maas", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "VertexAI states that The Llama 3.1 API service for llama-3.1-70b-instruct-maas and llama-3.1-8b-instruct-maas are in public preview and at no cost." + }, + "source": "https://console.cloud.google.com/vertex-ai/publishers/meta/model-garden/llama-3.2-90b-vision-instruct-maas" + } + } + ] + }, + { + "id": "meta-llama/llama-3.1-8b-instruct-turbo", + "provider": "meta-llama", + "model": "llama-3.1-8b-instruct-turbo", + "displayName": "Meta Llama 3.1 8B Instruct Turbo", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "helicone" + ], + "aliases": [ + "helicone/llama-3.1-8b-instruct-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "llama-3.1-8b-instruct-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.03 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Meta Llama 3.1 8B Instruct Turbo" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "llama-3.1-8b-instruct-turbo", + "modelKey": "llama-3.1-8b-instruct-turbo", + "displayName": "Meta Llama 3.1 8B Instruct Turbo", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2024-07-23", + "openWeights": false, + "releaseDate": "2024-07-23" + } + } + ] + }, + { + "id": "meta-llama/llama-3.1-nemotron-70b-instruct", + "provider": "meta-llama", + "model": "llama-3.1-nemotron-70b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepinfra" + ], + "aliases": [ + "deepinfra/nvidia/Llama-3.1-Nemotron-70B-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/nvidia/Llama-3.1-Nemotron-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/nvidia/Llama-3.1-Nemotron-70B-Instruct", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3.1-nemotron-70b-instruct-hf", + "provider": "meta-llama", + "model": "llama-3.1-nemotron-70b-instruct-hf", + "displayName": "Nvidia Nemotron 70b", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/nvidia/Llama-3.1-Nemotron-70B-Instruct-HF" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.357, + "output": 0.408 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nvidia Nemotron 70b" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2025-04-15", + "lastUpdated": "2025-04-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF", + "modelKey": "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF", + "displayName": "Nvidia Nemotron 70b", + "family": "nemotron", + "metadata": { + "lastUpdated": "2025-04-15", + "openWeights": false, + "releaseDate": "2025-04-15" + } + } + ] + }, + { + "id": "meta-llama/llama-3.1-nemotron-safety-guard-8b-v3", + "provider": "meta-llama", + "model": "llama-3.1-nemotron-safety-guard-8b-v3", + "displayName": "Llama 3.1 Nemotron Safety Guard", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "vultr" + ], + "aliases": [ + "vultr/nvidia/Llama-3.1-Nemotron-Safety-Guard-8B-v3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vultr", + "model": "nvidia/Llama-3.1-Nemotron-Safety-Guard-8B-v3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.01, + "output": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 Nemotron Safety Guard" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2025-10-28", + "lastUpdated": "2025-10-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vultr", + "providerName": "Vultr", + "providerApi": "https://api.vultrinference.com/v1", + "providerDoc": "https://api.vultrinference.com/", + "model": "nvidia/Llama-3.1-Nemotron-Safety-Guard-8B-v3", + "modelKey": "nvidia/Llama-3.1-Nemotron-Safety-Guard-8B-v3", + "displayName": "Llama 3.1 Nemotron Safety Guard", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2025-10-28", + "openWeights": true, + "releaseDate": "2025-10-28" + } + } + ] + }, + { + "id": "meta-llama/llama-3.1-nemotron-ultra-253b", + "provider": "meta-llama", + "model": "llama-3.1-nemotron-ultra-253b", + "displayName": "Llama 3.1 Nemotron Ultra 253B", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/llama-3.1-nemotron-ultra-253b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "llama-3.1-nemotron-ultra-253b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 1.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 Nemotron Ultra 253B" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-04-07", + "lastUpdated": "2025-04-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "llama-3.1-nemotron-ultra-253b", + "modelKey": "llama-3.1-nemotron-ultra-253b", + "displayName": "Llama 3.1 Nemotron Ultra 253B", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-07", + "openWeights": true, + "releaseDate": "2025-04-07" + } + } + ] + }, + { + "id": "meta-llama/llama-3.1-nemotron-ultra-253b-v1", + "provider": "meta-llama", + "model": "llama-3.1-nemotron-ultra-253b-v1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/nvidia/Llama-3.1-Nemotron-Ultra-253B-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/nvidia/Llama-3.1-Nemotron-Ultra-253B-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 1.8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/nvidia/Llama-3.1-Nemotron-Ultra-253B-v1", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + } + ] + }, + { + "id": "meta-llama/llama-3.2-11b", + "provider": "meta-llama", + "model": "llama-3.2-11b", + "displayName": "Llama 3.2 11B Vision Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "vercel/meta/llama-3.2-11b", + "vercel_ai_gateway/meta/llama-3.2-11b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "meta/llama-3.2-11b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.16, + "output": 0.16 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3.2-11b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.16, + "output": 0.16 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.2 11B Vision Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-09-25", + "lastUpdated": "2024-09-25", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "meta/llama-3.2-11b", + "modelKey": "meta/llama-3.2-11b", + "displayName": "Llama 3.2 11B Vision Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-09-25", + "openWeights": false, + "releaseDate": "2024-09-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3.2-11b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3.2-11b-instruct", + "provider": "meta-llama", + "model": "llama-3.2-11b-instruct", + "displayName": "Llama 3.2 11B Instruct", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/llama-3.2-11b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "llama-3.2-11b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.33 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.2 11B Instruct" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-09-25", + "lastUpdated": "2024-09-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "llama-3.2-11b-instruct", + "modelKey": "llama-3.2-11b-instruct", + "displayName": "Llama 3.2 11B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2024-09-25", + "openWeights": true, + "releaseDate": "2024-09-25" + } + } + ] + }, + { + "id": "meta-llama/llama-3.2-11b-vision-instruct", + "provider": "meta-llama", + "model": "llama-3.2-11b-vision-instruct", + "displayName": "Llama-3.2-11B-Vision-Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "azure_ai", + "cloudflare-ai-gateway", + "cloudflare-workers-ai", + "deepinfra", + "github-models", + "inference", + "kilo", + "nvidia", + "openrouter" + ], + "aliases": [ + "azure-cognitive-services/llama-3.2-11b-vision-instruct", + "azure/llama-3.2-11b-vision-instruct", + "azure_ai/Llama-3.2-11B-Vision-Instruct", + "cloudflare-ai-gateway/workers-ai/@cf/meta/llama-3.2-11b-vision-instruct", + "cloudflare-workers-ai/@cf/meta/llama-3.2-11b-vision-instruct", + "deepinfra/meta-llama/Llama-3.2-11B-Vision-Instruct", + "github-models/meta/llama-3.2-11b-vision-instruct", + "inference/meta/llama-3.2-11b-vision-instruct", + "kilo/meta-llama/llama-3.2-11b-vision-instruct", + "nvidia/meta/llama-3.2-11b-vision-instruct", + "openrouter/meta-llama/llama-3.2-11b-vision-instruct" + ], + "mergedProviderModelRecords": 11, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "llama-3.2-11b-vision-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.37, + "output": 0.37 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "llama-3.2-11b-vision-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.37, + "output": 0.37 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/meta/llama-3.2-11b-vision-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.049, + "output": 0.68 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/meta/llama-3.2-11b-vision-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0485, + "output": 0.676 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "meta/llama-3.2-11b-vision-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "inference", + "model": "meta/llama-3.2-11b-vision-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.055, + "output": 0.055 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "meta-llama/llama-3.2-11b-vision-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.049, + "output": 0.049 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "meta/llama-3.2-11b-vision-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "meta-llama/llama-3.2-11b-vision-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.345, + "output": 0.345 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Llama-3.2-11B-Vision-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.37, + "output": 0.37 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Llama-3.2-11B-Vision-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.049, + "output": 0.049 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "meta-llama/llama-3.2-11b-vision-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.345, + "output": 0.345 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.2 11B Vision Instruct", + "Llama 3.2 11b Vision Instruct", + "Llama-3.2-11B-Vision-Instruct", + "Meta: Llama 3.2 11B Vision Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-09-25", + "lastUpdated": "2024-09-25", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 11 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "llama-3.2-11b-vision-instruct", + "modelKey": "llama-3.2-11b-vision-instruct", + "displayName": "Llama-3.2-11B-Vision-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-09-25", + "openWeights": true, + "releaseDate": "2024-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "llama-3.2-11b-vision-instruct", + "modelKey": "llama-3.2-11b-vision-instruct", + "displayName": "Llama-3.2-11B-Vision-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-09-25", + "openWeights": true, + "releaseDate": "2024-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/meta/llama-3.2-11b-vision-instruct", + "modelKey": "workers-ai/@cf/meta/llama-3.2-11b-vision-instruct", + "displayName": "Llama 3.2 11B Vision Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/meta/llama-3.2-11b-vision-instruct", + "modelKey": "@cf/meta/llama-3.2-11b-vision-instruct", + "displayName": "Llama 3.2 11B Vision Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2024-09-25", + "openWeights": true, + "releaseDate": "2024-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "meta/llama-3.2-11b-vision-instruct", + "modelKey": "meta/llama-3.2-11b-vision-instruct", + "displayName": "Llama-3.2-11B-Vision-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-09-25", + "openWeights": true, + "releaseDate": "2024-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "inference", + "providerName": "Inference", + "providerApi": "https://inference.net/v1", + "providerDoc": "https://inference.net/models", + "model": "meta/llama-3.2-11b-vision-instruct", + "modelKey": "meta/llama-3.2-11b-vision-instruct", + "displayName": "Llama 3.2 11B Vision Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2025-01-01", + "openWeights": true, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "meta-llama/llama-3.2-11b-vision-instruct", + "modelKey": "meta-llama/llama-3.2-11b-vision-instruct", + "displayName": "Meta: Llama 3.2 11B Vision Instruct", + "metadata": { + "lastUpdated": "2024-09-25", + "openWeights": true, + "releaseDate": "2024-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "meta/llama-3.2-11b-vision-instruct", + "modelKey": "meta/llama-3.2-11b-vision-instruct", + "displayName": "Llama 3.2 11b Vision Instruct", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-09-18", + "openWeights": true, + "releaseDate": "2024-09-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "meta-llama/llama-3.2-11b-vision-instruct", + "modelKey": "meta-llama/llama-3.2-11b-vision-instruct", + "displayName": "Llama 3.2 11B Vision Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12-31", + "lastUpdated": "2024-09-25", + "openWeights": true, + "releaseDate": "2024-09-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Llama-3.2-11B-Vision-Instruct", + "mode": "chat", + "metadata": { + "source": "https://azuremarketplace.microsoft.com/en/marketplace/apps/metagenai.meta-llama-3-2-11b-vision-instruct-offer?tab=Overview" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Llama-3.2-11B-Vision-Instruct", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "meta-llama/llama-3.2-11b-vision-instruct", + "displayName": "Meta: Llama 3.2 11B Vision Instruct", + "metadata": { + "canonicalSlug": "meta-llama/llama-3.2-11b-vision-instruct", + "createdAt": "2024-09-25T00:00:00.000Z", + "huggingFaceId": "meta-llama/Llama-3.2-11B-Vision-Instruct", + "instructType": "llama3", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/meta-llama/llama-3.2-11b-vision-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "meta-llama/llama-3.2-1b", + "provider": "meta-llama", + "model": "llama-3.2-1b", + "displayName": "Llama 3.2 1B Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "vercel/meta/llama-3.2-1b", + "vercel_ai_gateway/meta/llama-3.2-1b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "meta/llama-3.2-1b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3.2-1b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.2 1B Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-09-18", + "lastUpdated": "2024-09-18", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "meta/llama-3.2-1b", + "modelKey": "meta/llama-3.2-1b", + "displayName": "Llama 3.2 1B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-09-18", + "openWeights": false, + "releaseDate": "2024-09-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3.2-1b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3.2-1b-instruct", + "provider": "meta-llama", + "model": "llama-3.2-1b-instruct", + "displayName": "Llama 3.2 1B Instruct", + "family": "unsloth", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "chutes", + "cloudflare-ai-gateway", + "cloudflare-workers-ai", + "inference", + "kilo", + "nvidia", + "openrouter" + ], + "aliases": [ + "chutes/unsloth/Llama-3.2-1B-Instruct", + "cloudflare-ai-gateway/workers-ai/@cf/meta/llama-3.2-1b-instruct", + "cloudflare-workers-ai/@cf/meta/llama-3.2-1b-instruct", + "inference/meta/llama-3.2-1b-instruct", + "kilo/meta-llama/llama-3.2-1b-instruct", + "nvidia/meta/llama-3.2-1b-instruct", + "openrouter/meta-llama/llama-3.2-1b-instruct" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 131072, + "outputTokens": 60000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "unsloth/Llama-3.2-1B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.01, + "output": 0.0109 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/meta/llama-3.2-1b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.027, + "output": 0.2 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/meta/llama-3.2-1b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.027, + "output": 0.201 + } + }, + { + "source": "models.dev", + "provider": "inference", + "model": "meta/llama-3.2-1b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.01, + "output": 0.01 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "meta-llama/llama-3.2-1b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.027, + "output": 0.2 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "meta/llama-3.2-1b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "meta-llama/llama-3.2-1b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.027, + "output": 0.201 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "meta-llama/llama-3.2-1b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.027, + "output": 0.201 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.2 1B Instruct", + "Llama 3.2 1b Instruct", + "Meta: Llama 3.2 1B Instruct" + ], + "families": [ + "llama", + "unsloth" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2026-01-27", + "lastUpdated": "2026-04-25", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "seed", + "stop", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "unsloth/Llama-3.2-1B-Instruct", + "modelKey": "unsloth/Llama-3.2-1B-Instruct", + "displayName": "Llama 3.2 1B Instruct", + "family": "unsloth", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2026-01-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/meta/llama-3.2-1b-instruct", + "modelKey": "workers-ai/@cf/meta/llama-3.2-1b-instruct", + "displayName": "Llama 3.2 1B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/meta/llama-3.2-1b-instruct", + "modelKey": "@cf/meta/llama-3.2-1b-instruct", + "displayName": "Llama 3.2 1B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2024-09-25", + "openWeights": true, + "releaseDate": "2024-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "inference", + "providerName": "Inference", + "providerApi": "https://inference.net/v1", + "providerDoc": "https://inference.net/models", + "model": "meta/llama-3.2-1b-instruct", + "modelKey": "meta/llama-3.2-1b-instruct", + "displayName": "Llama 3.2 1B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2025-01-01", + "openWeights": true, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "meta-llama/llama-3.2-1b-instruct", + "modelKey": "meta-llama/llama-3.2-1b-instruct", + "displayName": "Meta: Llama 3.2 1B Instruct", + "metadata": { + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2024-09-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "meta/llama-3.2-1b-instruct", + "modelKey": "meta/llama-3.2-1b-instruct", + "displayName": "Llama 3.2 1b Instruct", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-09-18", + "openWeights": true, + "releaseDate": "2024-09-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "meta-llama/llama-3.2-1b-instruct", + "modelKey": "meta-llama/llama-3.2-1b-instruct", + "displayName": "Llama 3.2 1B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12-31", + "lastUpdated": "2024-09-25", + "openWeights": true, + "releaseDate": "2024-09-25" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "meta-llama/llama-3.2-1b-instruct", + "displayName": "Meta: Llama 3.2 1B Instruct", + "metadata": { + "canonicalSlug": "meta-llama/llama-3.2-1b-instruct", + "createdAt": "2024-09-25T00:00:00.000Z", + "huggingFaceId": "meta-llama/Llama-3.2-1B-Instruct", + "instructType": "llama3", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/meta-llama/llama-3.2-1b-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "seed", + "stop", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 60000, + "max_completion_tokens": 60000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "meta-llama/llama-3.2-3b", + "provider": "meta-llama", + "model": "llama-3.2-3b", + "displayName": "Llama 3.2 3B", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "llamagate", + "venice", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "llamagate/llama-3.2-3b", + "venice/llama-3.2-3b", + "vercel/meta/llama-3.2-3b", + "vercel_ai_gateway/meta/llama-3.2-3b" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "temperature": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "llama-3.2-3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "meta/llama-3.2-3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "llamagate", + "model": "llamagate/llama-3.2-3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.08 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3.2-3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.2 3B", + "Llama 3.2 3B Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-10-03", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "llama-3.2-3b", + "modelKey": "llama-3.2-3b", + "displayName": "Llama 3.2 3B", + "family": "llama", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2024-10-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "meta/llama-3.2-3b", + "modelKey": "meta/llama-3.2-3b", + "displayName": "Llama 3.2 3B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-09-18", + "openWeights": false, + "releaseDate": "2024-09-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "llamagate", + "model": "llamagate/llama-3.2-3b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3.2-3b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3.2-3b-instruct", + "provider": "meta-llama", + "model": "llama-3.2-3b-instruct", + "displayName": "Llama 3.2 3B Instruct", + "family": "unsloth", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "chutes", + "cloudflare-ai-gateway", + "cloudflare-workers-ai", + "deepinfra", + "hyperbolic", + "inference", + "kilo", + "llmgateway", + "nano-gpt", + "novita", + "novita-ai", + "nvidia", + "openrouter" + ], + "aliases": [ + "chutes/unsloth/Llama-3.2-3B-Instruct", + "cloudflare-ai-gateway/workers-ai/@cf/meta/llama-3.2-3b-instruct", + "cloudflare-workers-ai/@cf/meta/llama-3.2-3b-instruct", + "deepinfra/meta-llama/Llama-3.2-3B-Instruct", + "hyperbolic/meta-llama/Llama-3.2-3B-Instruct", + "inference/meta/llama-3.2-3b-instruct", + "kilo/meta-llama/llama-3.2-3b-instruct", + "llmgateway/llama-3.2-3b-instruct", + "nano-gpt/meta-llama/llama-3.2-3b-instruct", + "novita-ai/meta-llama/llama-3.2-3b-instruct", + "novita/meta-llama/llama-3.2-3b-instruct", + "nvidia/meta/llama-3.2-3b-instruct", + "openrouter/meta-llama/llama-3.2-3b-instruct" + ], + "mergedProviderModelRecords": 13, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "unsloth/Llama-3.2-3B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.01, + "output": 0.0136 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/meta/llama-3.2-3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.051, + "output": 0.34 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/meta/llama-3.2-3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0509, + "output": 0.335 + } + }, + { + "source": "models.dev", + "provider": "inference", + "model": "meta/llama-3.2-3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.02 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "meta-llama/llama-3.2-3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.051, + "output": 0.34 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "llama-3.2-3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.03, + "output": 0.05 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "meta-llama/llama-3.2-3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0306, + "output": 0.0493 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "meta-llama/llama-3.2-3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.03, + "output": 0.05 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "meta/llama-3.2-3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "meta-llama/llama-3.2-3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0509, + "output": 0.335 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Llama-3.2-3B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0.02 + } + }, + { + "source": "litellm", + "provider": "hyperbolic", + "model": "hyperbolic/meta-llama/Llama-3.2-3B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/meta-llama/llama-3.2-3b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.03, + "output": 0.05 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "meta-llama/llama-3.2-3b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.0509, + "output": 0.335 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.2 3B Instruct", + "Llama 3.2 3b Instruct", + "Meta: Llama 3.2 3B Instruct" + ], + "families": [ + "llama", + "unsloth" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2025-02-12", + "lastUpdated": "2026-04-25", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "seed", + "stop", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 13 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "unsloth/Llama-3.2-3B-Instruct", + "modelKey": "unsloth/Llama-3.2-3B-Instruct", + "displayName": "Llama 3.2 3B Instruct", + "family": "unsloth", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/meta/llama-3.2-3b-instruct", + "modelKey": "workers-ai/@cf/meta/llama-3.2-3b-instruct", + "displayName": "Llama 3.2 3B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/meta/llama-3.2-3b-instruct", + "modelKey": "@cf/meta/llama-3.2-3b-instruct", + "displayName": "Llama 3.2 3B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2024-09-25", + "openWeights": true, + "releaseDate": "2024-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "inference", + "providerName": "Inference", + "providerApi": "https://inference.net/v1", + "providerDoc": "https://inference.net/models", + "model": "meta/llama-3.2-3b-instruct", + "modelKey": "meta/llama-3.2-3b-instruct", + "displayName": "Llama 3.2 3B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2025-01-01", + "openWeights": true, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "meta-llama/llama-3.2-3b-instruct", + "modelKey": "meta-llama/llama-3.2-3b-instruct", + "displayName": "Meta: Llama 3.2 3B Instruct", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2024-09-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "llama-3.2-3b-instruct", + "modelKey": "llama-3.2-3b-instruct", + "displayName": "Llama 3.2 3B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2024-09-18", + "openWeights": true, + "releaseDate": "2024-09-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "meta-llama/llama-3.2-3b-instruct", + "modelKey": "meta-llama/llama-3.2-3b-instruct", + "displayName": "Llama 3.2 3b Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2024-09-25", + "openWeights": false, + "releaseDate": "2024-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "meta-llama/llama-3.2-3b-instruct", + "modelKey": "meta-llama/llama-3.2-3b-instruct", + "displayName": "Llama 3.2 3B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2024-09-18", + "openWeights": true, + "releaseDate": "2024-09-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "meta/llama-3.2-3b-instruct", + "modelKey": "meta/llama-3.2-3b-instruct", + "displayName": "Llama 3.2 3B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2024-09-18", + "openWeights": true, + "releaseDate": "2024-09-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "meta-llama/llama-3.2-3b-instruct", + "modelKey": "meta-llama/llama-3.2-3b-instruct", + "displayName": "Llama 3.2 3B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12-31", + "lastUpdated": "2024-09-25", + "openWeights": true, + "releaseDate": "2024-09-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Llama-3.2-3B-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "hyperbolic", + "model": "hyperbolic/meta-llama/Llama-3.2-3B-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/meta-llama/llama-3.2-3b-instruct", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "meta-llama/llama-3.2-3b-instruct", + "displayName": "Meta: Llama 3.2 3B Instruct", + "metadata": { + "canonicalSlug": "meta-llama/llama-3.2-3b-instruct", + "createdAt": "2024-09-25T00:00:00.000Z", + "huggingFaceId": "meta-llama/Llama-3.2-3B-Instruct", + "instructType": "llama3", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/meta-llama/llama-3.2-3b-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "seed", + "stop", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 80000, + "max_completion_tokens": 80000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "meta-llama/llama-3.2-3b-instruct-turbo", + "provider": "meta-llama", + "model": "llama-3.2-3b-instruct-turbo", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "together_ai" + ], + "aliases": [ + "together_ai/meta-llama/Llama-3.2-3B-Instruct-Turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/meta-llama/Llama-3.2-3B-Instruct-Turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/meta-llama/Llama-3.2-3B-Instruct-Turbo", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3.2-3b-instruct:free", + "provider": "meta-llama", + "model": "llama-3.2-3b-instruct:free", + "displayName": "Llama 3.2 3B Instruct (free)", + "family": "llama", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/meta-llama/llama-3.2-3b-instruct:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "meta-llama/llama-3.2-3b-instruct:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "meta-llama/llama-3.2-3b-instruct:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.2 3B Instruct (free)", + "Meta: Llama 3.2 3B Instruct (free)" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12-31", + "releaseDate": "2024-09-25", + "lastUpdated": "2024-09-25", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "stop", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "meta-llama/llama-3.2-3b-instruct:free", + "modelKey": "meta-llama/llama-3.2-3b-instruct:free", + "displayName": "Llama 3.2 3B Instruct (free)", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12-31", + "lastUpdated": "2024-09-25", + "openWeights": true, + "releaseDate": "2024-09-25" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "meta-llama/llama-3.2-3b-instruct:free", + "displayName": "Meta: Llama 3.2 3B Instruct (free)", + "metadata": { + "canonicalSlug": "meta-llama/llama-3.2-3b-instruct", + "createdAt": "2024-09-25T00:00:00.000Z", + "huggingFaceId": "meta-llama/Llama-3.2-3B-Instruct", + "instructType": "llama3", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/meta-llama/llama-3.2-3b-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "stop", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "meta-llama/llama-3.2-90b", + "provider": "meta-llama", + "model": "llama-3.2-90b", + "displayName": "Llama 3.2 90B Vision Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "vercel/meta/llama-3.2-90b", + "vercel_ai_gateway/meta/llama-3.2-90b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "meta/llama-3.2-90b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3.2-90b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.2 90B Vision Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-09-25", + "lastUpdated": "2024-09-25", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "meta/llama-3.2-90b", + "modelKey": "meta/llama-3.2-90b", + "displayName": "Llama 3.2 90B Vision Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-09-25", + "openWeights": false, + "releaseDate": "2024-09-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3.2-90b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3.2-90b-vision-instruct", + "provider": "meta-llama", + "model": "llama-3.2-90b-vision-instruct", + "displayName": "Llama-3.2-90B-Vision-Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "azure_ai", + "github-models", + "io-net", + "nvidia" + ], + "aliases": [ + "azure-cognitive-services/llama-3.2-90b-vision-instruct", + "azure/llama-3.2-90b-vision-instruct", + "azure_ai/Llama-3.2-90B-Vision-Instruct", + "github-models/meta/llama-3.2-90b-vision-instruct", + "io-net/meta-llama/Llama-3.2-90B-Vision-Instruct", + "nvidia/meta/llama-3.2-90b-vision-instruct" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 2048, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "llama-3.2-90b-vision-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.04, + "output": 2.04 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "llama-3.2-90b-vision-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.04, + "output": 2.04 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "meta/llama-3.2-90b-vision-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "io-net", + "model": "meta-llama/Llama-3.2-90B-Vision-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "cacheWrite": 0.7, + "input": 0.35, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "meta/llama-3.2-90b-vision-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Llama-3.2-90B-Vision-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.04, + "output": 2.04 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.2 90B Vision Instruct", + "Llama-3.2-90B-Vision-Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-09-25", + "lastUpdated": "2024-09-25", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "llama-3.2-90b-vision-instruct", + "modelKey": "llama-3.2-90b-vision-instruct", + "displayName": "Llama-3.2-90B-Vision-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-09-25", + "openWeights": true, + "releaseDate": "2024-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "llama-3.2-90b-vision-instruct", + "modelKey": "llama-3.2-90b-vision-instruct", + "displayName": "Llama-3.2-90B-Vision-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-09-25", + "openWeights": true, + "releaseDate": "2024-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "meta/llama-3.2-90b-vision-instruct", + "modelKey": "meta/llama-3.2-90b-vision-instruct", + "displayName": "Llama-3.2-90B-Vision-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-09-25", + "openWeights": true, + "releaseDate": "2024-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "io-net", + "providerName": "IO.NET", + "providerApi": "https://api.intelligence.io.solutions/api/v1", + "providerDoc": "https://io.net/docs/guides/intelligence/io-intelligence", + "model": "meta-llama/Llama-3.2-90B-Vision-Instruct", + "modelKey": "meta-llama/Llama-3.2-90B-Vision-Instruct", + "displayName": "Llama 3.2 90B Vision Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-09-25", + "openWeights": true, + "releaseDate": "2024-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "meta/llama-3.2-90b-vision-instruct", + "modelKey": "meta/llama-3.2-90b-vision-instruct", + "displayName": "Llama-3.2-90B-Vision-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-09-25", + "openWeights": true, + "releaseDate": "2024-09-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Llama-3.2-90B-Vision-Instruct", + "mode": "chat", + "metadata": { + "source": "https://azuremarketplace.microsoft.com/en/marketplace/apps/metagenai.meta-llama-3-2-90b-vision-instruct-offer?tab=Overview" + } + } + ] + }, + { + "id": "meta-llama/llama-3.2-90b-vision-instruct-maas", + "provider": "meta-llama", + "model": "llama-3.2-90b-vision-instruct-maas", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-llama_models" + ], + "aliases": [ + "vertex_ai-llama_models/vertex_ai/meta/llama-3.2-90b-vision-instruct-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 2048, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama-3.2-90b-vision-instruct-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama-3.2-90b-vision-instruct-maas", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "VertexAI states that The Llama 3.2 API service is at no cost during public preview, and will be priced as per dollar-per-1M-tokens at GA." + }, + "source": "https://console.cloud.google.com/vertex-ai/publishers/meta/model-garden/llama-3.2-90b-vision-instruct-maas" + } + } + ] + }, + { + "id": "meta-llama/llama-3.2-nv-rerankqa-1b-v2", + "provider": "meta-llama", + "model": "llama-3.2-nv-rerankqa-1b-v2", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "nvidia_nim" + ], + "aliases": [ + "nvidia_nim/ranking/nvidia/llama-3.2-nv-rerankqa-1b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "nvidia_nim", + "model": "nvidia_nim/ranking/nvidia/llama-3.2-nv-rerankqa-1b-v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perQuery": { + "input": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nvidia_nim", + "model": "nvidia_nim/ranking/nvidia/llama-3.2-nv-rerankqa-1b-v2", + "mode": "rerank" + } + ] + }, + { + "id": "meta-llama/llama-3.3-70b", + "provider": "meta-llama", + "model": "llama-3.3-70b", + "displayName": "Llama 3.3 70B", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "cerebras", + "venice", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "cerebras/llama-3.3-70b", + "venice/llama-3.3-70b", + "vercel/meta/llama-3.3-70b", + "vercel_ai_gateway/meta/llama-3.3-70b" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "temperature": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "llama-3.3-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 2.8 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "meta/llama-3.3-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "cerebras", + "model": "cerebras/llama-3.3-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.85, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3.3-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 70B", + "Llama-3.3-70B-Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2025-04-06", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "llama-3.3-70b", + "modelKey": "llama-3.3-70b", + "displayName": "Llama 3.3 70B", + "family": "llama", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2025-04-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "meta/llama-3.3-70b", + "modelKey": "meta/llama-3.3-70b", + "displayName": "Llama-3.3-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cerebras", + "model": "cerebras/llama-3.3-70b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-3.3-70b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3.3-70b-cs", + "provider": "meta-llama", + "model": "llama-3.3-70b-cs", + "displayName": "llama-3.3-70b-cs", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/cerebras/llama-3.3-70b-cs" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "llama-3.3-70b-cs" + ], + "statuses": [ + "deprecated" + ], + "releaseDate": "2025-05-13", + "lastUpdated": "2025-05-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "cerebras/llama-3.3-70b-cs", + "modelKey": "cerebras/llama-3.3-70b-cs", + "displayName": "llama-3.3-70b-cs", + "status": "deprecated", + "metadata": { + "lastUpdated": "2025-05-13", + "openWeights": false, + "releaseDate": "2025-05-13" + } + } + ] + }, + { + "id": "meta-llama/llama-3.3-70b-instruct", + "provider": "meta-llama", + "model": "llama-3.3-70b-instruct", + "displayName": "Llama-3.3-70B-Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "azure_ai", + "berget", + "cloudferro-sherlock", + "cortecs", + "crusoe", + "deepinfra", + "friendli", + "github-models", + "helicone", + "hyperbolic", + "io-net", + "kilo", + "llama", + "llmgateway", + "meganova", + "meta_llama", + "nano-gpt", + "nebius", + "novita", + "novita-ai", + "nscale", + "nvidia", + "openrouter", + "regolo-ai", + "scaleway", + "synthetic", + "wandb" + ], + "aliases": [ + "azure-cognitive-services/llama-3.3-70b-instruct", + "azure/llama-3.3-70b-instruct", + "azure_ai/Llama-3.3-70B-Instruct", + "berget/meta-llama/Llama-3.3-70B-Instruct", + "cloudferro-sherlock/meta-llama/Llama-3.3-70B-Instruct", + "cortecs/llama-3.3-70b-instruct", + "crusoe/meta-llama/Llama-3.3-70B-Instruct", + "deepinfra/meta-llama/Llama-3.3-70B-Instruct", + "friendli/meta-llama/Llama-3.3-70B-Instruct", + "github-models/meta/llama-3.3-70b-instruct", + "helicone/llama-3.3-70b-instruct", + "hyperbolic/meta-llama/Llama-3.3-70B-Instruct", + "io-net/meta-llama/Llama-3.3-70B-Instruct", + "kilo/meta-llama/llama-3.3-70b-instruct", + "llama/llama-3.3-70b-instruct", + "llmgateway/llama-3.3-70b-instruct", + "meganova/meta-llama/Llama-3.3-70B-Instruct", + "meta_llama/Llama-3.3-70B-Instruct", + "nano-gpt/meta-llama/llama-3.3-70b-instruct", + "nebius/meta-llama/Llama-3.3-70B-Instruct", + "novita-ai/meta-llama/llama-3.3-70b-instruct", + "novita/meta-llama/llama-3.3-70b-instruct", + "nscale/meta-llama/Llama-3.3-70B-Instruct", + "nvidia/meta/llama-3.3-70b-instruct", + "openrouter/meta-llama/llama-3.3-70b-instruct", + "regolo-ai/llama-3.3-70b-instruct", + "scaleway/llama-3.3-70b-instruct", + "synthetic/hf:meta-llama/Llama-3.3-70B-Instruct", + "wandb/meta-llama/Llama-3.3-70B-Instruct" + ], + "mergedProviderModelRecords": 29, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "llama-3.3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.71, + "output": 0.71 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "llama-3.3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.71, + "output": 0.71 + } + }, + { + "source": "models.dev", + "provider": "berget", + "model": "meta-llama/Llama-3.3-70B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.99, + "output": 0.99 + } + }, + { + "source": "models.dev", + "provider": "cloudferro-sherlock", + "model": "meta-llama/Llama-3.3-70B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.92, + "output": 2.92 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "llama-3.3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.089, + "output": 0.275 + } + }, + { + "source": "models.dev", + "provider": "friendli", + "model": "meta-llama/Llama-3.3-70B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "meta/llama-3.3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "llama-3.3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.39 + } + }, + { + "source": "models.dev", + "provider": "io-net", + "model": "meta-llama/Llama-3.3-70B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.065, + "cacheWrite": 0.26, + "input": 0.13, + "output": 0.38 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "meta-llama/llama-3.3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.32 + } + }, + { + "source": "models.dev", + "provider": "llama", + "model": "llama-3.3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "llama-3.3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "meta-llama/Llama-3.3-70B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "meta-llama/llama-3.3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.23 + } + }, + { + "source": "models.dev", + "provider": "nebius", + "model": "meta-llama/Llama-3.3-70B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.013, + "cacheWrite": 0.16, + "input": 0.13, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "meta-llama/llama-3.3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.135, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "meta/llama-3.3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "meta-llama/llama-3.3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.32 + } + }, + { + "source": "models.dev", + "provider": "regolo-ai", + "model": "llama-3.3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.7 + } + }, + { + "source": "models.dev", + "provider": "scaleway", + "model": "llama-3.3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:meta-llama/Llama-3.3-70B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "wandb", + "model": "meta-llama/Llama-3.3-70B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.71, + "output": 0.71 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Llama-3.3-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.71, + "output": 0.71 + } + }, + { + "source": "litellm", + "provider": "crusoe", + "model": "crusoe/meta-llama/Llama-3.3-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Llama-3.3-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.23, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "hyperbolic", + "model": "hyperbolic/meta-llama/Llama-3.3-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "meta_llama", + "model": "meta_llama/Llama-3.3-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/meta-llama/Llama-3.3-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/meta-llama/llama-3.3-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.135, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "nscale", + "model": "nscale/meta-llama/Llama-3.3-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "wandb", + "model": "wandb/meta-llama/Llama-3.3-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 71000, + "output": 71000 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "meta-llama/llama-3.3-70b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.32 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 70B Instruct", + "Llama 3.3 70b Instruct", + "Llama-3.3-70B-Instruct", + "Meta Llama 3.3 70B Instruct", + "Meta: Llama 3.3 70B Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-12-06", + "lastUpdated": "2024-12-06", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 29 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "llama-3.3-70b-instruct", + "modelKey": "llama-3.3-70b-instruct", + "displayName": "Llama-3.3-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "llama-3.3-70b-instruct", + "modelKey": "llama-3.3-70b-instruct", + "displayName": "Llama-3.3-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "berget", + "providerName": "Berget.AI", + "providerApi": "https://api.berget.ai/v1", + "providerDoc": "https://api.berget.ai", + "model": "meta-llama/Llama-3.3-70B-Instruct", + "modelKey": "meta-llama/Llama-3.3-70B-Instruct", + "displayName": "Llama 3.3 70B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2025-04-27", + "openWeights": true, + "releaseDate": "2025-04-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudferro-sherlock", + "providerName": "CloudFerro Sherlock", + "providerApi": "https://api-sherlock.cloudferro.com/openai/v1/", + "providerDoc": "https://docs.sherlock.cloudferro.com/", + "model": "meta-llama/Llama-3.3-70B-Instruct", + "modelKey": "meta-llama/Llama-3.3-70B-Instruct", + "displayName": "Llama 3.3 70B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-10-09", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "llama-3.3-70b-instruct", + "modelKey": "llama-3.3-70b-instruct", + "displayName": "Llama 3.3 70B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "friendli", + "providerName": "Friendli", + "providerApi": "https://api.friendli.ai/serverless/v1", + "providerDoc": "https://friendli.ai/docs/guides/serverless_endpoints/introduction", + "model": "meta-llama/Llama-3.3-70B-Instruct", + "modelKey": "meta-llama/Llama-3.3-70B-Instruct", + "displayName": "Llama 3.3 70B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2024-08-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "meta/llama-3.3-70b-instruct", + "modelKey": "meta/llama-3.3-70b-instruct", + "displayName": "Llama-3.3-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "llama-3.3-70b-instruct", + "modelKey": "llama-3.3-70b-instruct", + "displayName": "Meta Llama 3.3 70B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2024-12-06", + "openWeights": false, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "io-net", + "providerName": "IO.NET", + "providerApi": "https://api.intelligence.io.solutions/api/v1", + "providerDoc": "https://io.net/docs/guides/intelligence/io-intelligence", + "model": "meta-llama/Llama-3.3-70B-Instruct", + "modelKey": "meta-llama/Llama-3.3-70B-Instruct", + "displayName": "Llama 3.3 70B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "meta-llama/llama-3.3-70b-instruct", + "modelKey": "meta-llama/llama-3.3-70b-instruct", + "displayName": "Meta: Llama 3.3 70B Instruct", + "metadata": { + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2024-08-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llama", + "providerName": "Llama", + "providerApi": "https://api.llama.com/compat/v1/", + "providerDoc": "https://llama.developer.meta.com/docs/models", + "model": "llama-3.3-70b-instruct", + "modelKey": "llama-3.3-70b-instruct", + "displayName": "Llama-3.3-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "llama-3.3-70b-instruct", + "modelKey": "llama-3.3-70b-instruct", + "displayName": "Llama-3.3-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "meta-llama/Llama-3.3-70B-Instruct", + "modelKey": "meta-llama/Llama-3.3-70B-Instruct", + "displayName": "Llama 3.3 70B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "meta-llama/llama-3.3-70b-instruct", + "modelKey": "meta-llama/llama-3.3-70b-instruct", + "displayName": "Llama 3.3 70b Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2025-02-27", + "openWeights": false, + "releaseDate": "2025-02-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "meta-llama/Llama-3.3-70B-Instruct", + "modelKey": "meta-llama/Llama-3.3-70B-Instruct", + "displayName": "Llama-3.3-70B-Instruct", + "metadata": { + "knowledgeCutoff": "2025-08", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2025-12-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "meta-llama/llama-3.3-70b-instruct", + "modelKey": "meta-llama/llama-3.3-70b-instruct", + "displayName": "Llama 3.3 70B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-07", + "openWeights": true, + "releaseDate": "2024-12-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "meta/llama-3.3-70b-instruct", + "modelKey": "meta/llama-3.3-70b-instruct", + "displayName": "Llama 3.3 70b Instruct", + "metadata": { + "lastUpdated": "2024-11-26", + "openWeights": true, + "releaseDate": "2024-11-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "meta-llama/llama-3.3-70b-instruct", + "modelKey": "meta-llama/llama-3.3-70b-instruct", + "displayName": "Llama-3.3-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "regolo-ai", + "providerName": "Regolo AI", + "providerApi": "https://api.regolo.ai/v1", + "providerDoc": "https://docs.regolo.ai/", + "model": "llama-3.3-70b-instruct", + "modelKey": "llama-3.3-70b-instruct", + "displayName": "Llama 3.3 70B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-28", + "openWeights": false, + "releaseDate": "2025-04-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "scaleway", + "providerName": "Scaleway", + "providerApi": "https://api.scaleway.ai/v1", + "providerDoc": "https://www.scaleway.com/en/docs/generative-apis/", + "model": "llama-3.3-70b-instruct", + "modelKey": "llama-3.3-70b-instruct", + "displayName": "Llama-3.3-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2026-03-17", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:meta-llama/Llama-3.3-70B-Instruct", + "modelKey": "hf:meta-llama/Llama-3.3-70B-Instruct", + "displayName": "Llama-3.3-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "meta-llama/Llama-3.3-70B-Instruct", + "modelKey": "meta-llama/Llama-3.3-70B-Instruct", + "displayName": "Llama-3.3-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2026-03-12", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Llama-3.3-70B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://azuremarketplace.microsoft.com/en/marketplace/apps/metagenai.llama-3-3-70b-instruct-offer?tab=Overview" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "crusoe", + "model": "crusoe/meta-llama/Llama-3.3-70B-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Llama-3.3-70B-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "hyperbolic", + "model": "hyperbolic/meta-llama/Llama-3.3-70B-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "meta_llama", + "model": "meta_llama/Llama-3.3-70B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://llama.developer.meta.com/docs/models" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/meta-llama/Llama-3.3-70B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/meta-llama/llama-3.3-70b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nscale", + "model": "nscale/meta-llama/Llama-3.3-70B-Instruct", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Pricing listed as $0.40/1M tokens total. Assumed 50/50 split for input/output." + }, + "source": "https://docs.nscale.com/docs/inference/serverless-models/current#chat-models" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "wandb", + "model": "wandb/meta-llama/Llama-3.3-70B-Instruct", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "meta-llama/llama-3.3-70b-instruct", + "displayName": "Meta: Llama 3.3 70B Instruct", + "metadata": { + "canonicalSlug": "meta-llama/llama-3.3-70b-instruct", + "createdAt": "2024-12-06T17:28:57.000Z", + "huggingFaceId": "meta-llama/Llama-3.3-70B-Instruct", + "instructType": "llama3", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/meta-llama/llama-3.3-70b-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "meta-llama/llama-3.3-70b-instruct-abliterated", + "provider": "meta-llama", + "model": "llama-3.3-70b-instruct-abliterated", + "displayName": "Llama 3.3 70B Instruct abliterated", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/huihui-ai/Llama-3.3-70B-Instruct-abliterated" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "huihui-ai/Llama-3.3-70B-Instruct-abliterated", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 0.7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 70B Instruct abliterated" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-08-08", + "lastUpdated": "2025-08-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "huihui-ai/Llama-3.3-70B-Instruct-abliterated", + "modelKey": "huihui-ai/Llama-3.3-70B-Instruct-abliterated", + "displayName": "Llama 3.3 70B Instruct abliterated", + "family": "llama", + "metadata": { + "lastUpdated": "2025-08-08", + "openWeights": false, + "releaseDate": "2025-08-08" + } + } + ] + }, + { + "id": "meta-llama/llama-3.3-70b-instruct-fp8", + "provider": "meta-llama", + "model": "llama-3.3-70b-instruct-fp8", + "displayName": "Llama 3.3 70B", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "evroc", + "inceptron" + ], + "aliases": [ + "evroc/nvidia/Llama-3.3-70B-Instruct-FP8", + "inceptron/nvidia/llama-3.3-70b-instruct-fp8" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "temperature": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "evroc", + "model": "nvidia/Llama-3.3-70B-Instruct-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.18, + "output": 1.18 + } + }, + { + "source": "models.dev", + "provider": "inceptron", + "model": "nvidia/llama-3.3-70b-instruct-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0.12, + "output": 0.38 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 70B", + "Llama 3.3 70B Instruct" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-12-01", + "lastUpdated": "2024-12-01", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "evroc", + "providerName": "evroc", + "providerApi": "https://models.think.evroc.com/v1", + "providerDoc": "https://docs.evroc.com/products/think/overview.html", + "model": "nvidia/Llama-3.3-70B-Instruct-FP8", + "modelKey": "nvidia/Llama-3.3-70B-Instruct-FP8", + "displayName": "Llama 3.3 70B", + "family": "llama", + "metadata": { + "lastUpdated": "2024-12-01", + "openWeights": true, + "releaseDate": "2024-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "inceptron", + "providerName": "Inceptron", + "providerApi": "https://api.inceptron.io/v1", + "providerDoc": "https://docs.inceptron.io", + "model": "nvidia/llama-3.3-70b-instruct-fp8", + "modelKey": "nvidia/llama-3.3-70b-instruct-fp8", + "displayName": "Llama 3.3 70B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + } + ] + }, + { + "id": "meta-llama/llama-3.3-70b-instruct-fp8-dynamic", + "provider": "meta-llama", + "model": "llama-3.3-70b-instruct-fp8-dynamic", + "displayName": "Llama 3.3 70B", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "stackit" + ], + "aliases": [ + "stackit/cortecs/Llama-3.3-70B-Instruct-FP8-Dynamic" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "stackit", + "model": "cortecs/Llama-3.3-70B-Instruct-FP8-Dynamic", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49, + "output": 0.71 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 70B" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-12-05", + "lastUpdated": "2024-12-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "stackit", + "providerName": "STACKIT", + "providerApi": "https://api.openai-compat.model-serving.eu01.onstackit.cloud/v1", + "providerDoc": "https://docs.stackit.cloud/products/data-and-ai/ai-model-serving/basics/available-shared-models", + "model": "cortecs/Llama-3.3-70B-Instruct-FP8-Dynamic", + "modelKey": "cortecs/Llama-3.3-70B-Instruct-FP8-Dynamic", + "displayName": "Llama 3.3 70B", + "family": "llama", + "metadata": { + "lastUpdated": "2024-12-05", + "openWeights": true, + "releaseDate": "2024-12-05" + } + } + ] + }, + { + "id": "meta-llama/llama-3.3-70b-instruct-fp8-fast", + "provider": "meta-llama", + "model": "llama-3.3-70b-instruct-fp8-fast", + "displayName": "Llama 3.3 70B Instruct FP8 Fast", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway", + "cloudflare-workers-ai" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast", + "cloudflare-workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "outputTokens": 24000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 2.25 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/meta/llama-3.3-70b-instruct-fp8-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.293, + "output": 2.253 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 70B Instruct FP8 Fast", + "Llama 3.3 70B Instruct fp8 Fast" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2025-04-03", + "lastUpdated": "2025-04-03", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast", + "modelKey": "workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast", + "displayName": "Llama 3.3 70B Instruct FP8 Fast", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/meta/llama-3.3-70b-instruct-fp8-fast", + "modelKey": "@cf/meta/llama-3.3-70b-instruct-fp8-fast", + "displayName": "Llama 3.3 70B Instruct fp8 Fast", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + } + ] + }, + { + "id": "meta-llama/llama-3.3-70b-instruct-maas", + "provider": "meta-llama", + "model": "llama-3.3-70b-instruct-maas", + "displayName": "Llama 3.3 70B Instruct", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "google-vertex" + ], + "aliases": [ + "google-vertex/meta/llama-3.3-70b-instruct-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex", + "model": "meta/llama-3.3-70b-instruct-maas", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 70B Instruct" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2025-04-29", + "lastUpdated": "2025-04-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "meta/llama-3.3-70b-instruct-maas", + "modelKey": "meta/llama-3.3-70b-instruct-maas", + "displayName": "Llama 3.3 70B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2025-04-29", + "openWeights": true, + "releaseDate": "2025-04-29" + } + } + ] + }, + { + "id": "meta-llama/llama-3.3-70b-instruct-turbo", + "provider": "meta-llama", + "model": "llama-3.3-70b-instruct-turbo", + "displayName": "Llama 3.3 70B Turbo", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "deepinfra", + "together_ai", + "togetherai" + ], + "aliases": [ + "deepinfra/meta-llama/Llama-3.3-70B-Instruct-Turbo", + "together_ai/meta-llama/Llama-3.3-70B-Instruct-Turbo", + "togetherai/meta-llama/Llama-3.3-70B-Instruct-Turbo" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false, + "temperature": true, + "parallelFunctionCalling": true, + "responseSchema": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "deepinfra", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.32 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.88, + "output": 0.88 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Llama-3.3-70B-Instruct-Turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0.39 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/meta-llama/Llama-3.3-70B-Instruct-Turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.88, + "output": 0.88 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 70B", + "Llama 3.3 70B Turbo" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-12-06", + "lastUpdated": "2024-12-06", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo", + "modelKey": "meta-llama/Llama-3.3-70B-Instruct-Turbo", + "displayName": "Llama 3.3 70B Turbo", + "family": "llama", + "metadata": { + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo", + "modelKey": "meta-llama/Llama-3.3-70B-Instruct-Turbo", + "displayName": "Llama 3.3 70B", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Llama-3.3-70B-Instruct-Turbo", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/meta-llama/Llama-3.3-70B-Instruct-Turbo", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3.3-70b-instruct-turbo-free", + "provider": "meta-llama", + "model": "llama-3.3-70b-instruct-turbo-free", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "together_ai" + ], + "aliases": [ + "together_ai/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3.3-70b-instruct:free", + "provider": "meta-llama", + "model": "llama-3.3-70b-instruct:free", + "displayName": "Llama 3.3 70B Instruct (free)", + "family": "llama", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/meta-llama/llama-3.3-70b-instruct:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "meta-llama/llama-3.3-70b-instruct:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "meta-llama/llama-3.3-70b-instruct:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 70B Instruct (free)", + "Meta: Llama 3.3 70B Instruct (free)" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-12-06", + "lastUpdated": "2024-12-06", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "meta-llama/llama-3.3-70b-instruct:free", + "modelKey": "meta-llama/llama-3.3-70b-instruct:free", + "displayName": "Llama 3.3 70B Instruct (free)", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "meta-llama/llama-3.3-70b-instruct:free", + "displayName": "Meta: Llama 3.3 70B Instruct (free)", + "metadata": { + "canonicalSlug": "meta-llama/llama-3.3-70b-instruct", + "createdAt": "2024-12-06T17:28:57.000Z", + "huggingFaceId": "meta-llama/Llama-3.3-70B-Instruct", + "instructType": "llama3", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/meta-llama/llama-3.3-70b-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 65536, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "meta-llama/llama-3.3-70b-versatile", + "provider": "meta-llama", + "model": "llama-3.3-70b-versatile", + "displayName": "Llama 3.3 70B", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "abacus", + "groq", + "helicone" + ], + "aliases": [ + "abacus/llama-3.3-70b-versatile", + "groq/llama-3.3-70b-versatile", + "helicone/llama-3.3-70b-versatile" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 131072, + "inputTokens": 128000, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "llama-3.3-70b-versatile", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.59, + "output": 0.79 + } + }, + { + "source": "models.dev", + "provider": "groq", + "model": "llama-3.3-70b-versatile", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.59, + "output": 0.79 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "llama-3.3-70b-versatile", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.59, + "output": 0.7899999999999999 + } + }, + { + "source": "litellm", + "provider": "groq", + "model": "groq/llama-3.3-70b-versatile", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.59, + "output": 0.79 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 70B", + "Llama 3.3 70B Versatile", + "Meta Llama 3.3 70B Versatile" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-12-06", + "lastUpdated": "2024-12-06", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "llama-3.3-70b-versatile", + "modelKey": "llama-3.3-70b-versatile", + "displayName": "Llama 3.3 70B Versatile", + "family": "llama", + "metadata": { + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "groq", + "providerName": "Groq", + "providerDoc": "https://console.groq.com/docs/models", + "model": "llama-3.3-70b-versatile", + "modelKey": "llama-3.3-70b-versatile", + "displayName": "Llama 3.3 70B", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "llama-3.3-70b-versatile", + "modelKey": "llama-3.3-70b-versatile", + "displayName": "Meta Llama 3.3 70B Versatile", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2024-12-06", + "openWeights": false, + "releaseDate": "2024-12-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "groq", + "model": "groq/llama-3.3-70b-versatile", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-3.3-8b-instruct", + "provider": "meta-llama", + "model": "llama-3.3-8b-instruct", + "displayName": "Llama-3.3-8B-Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "llama", + "meta_llama" + ], + "aliases": [ + "llama/llama-3.3-8b-instruct", + "meta_llama/Llama-3.3-8B-Instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4028, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llama", + "model": "llama-3.3-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "meta_llama", + "model": "meta_llama/Llama-3.3-8B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "Llama-3.3-8B-Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-12-06", + "lastUpdated": "2024-12-06", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llama", + "providerName": "Llama", + "providerApi": "https://api.llama.com/compat/v1/", + "providerDoc": "https://llama.developer.meta.com/docs/models", + "model": "llama-3.3-8b-instruct", + "modelKey": "llama-3.3-8b-instruct", + "displayName": "Llama-3.3-8B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "meta_llama", + "model": "meta_llama/Llama-3.3-8B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://llama.developer.meta.com/docs/models" + } + } + ] + }, + { + "id": "meta-llama/llama-3.3-nemotron-super-49b-v1", + "provider": "meta-llama", + "model": "llama-3.3-nemotron-super-49b-v1", + "displayName": "Nvidia Nemotron Super 49B", + "family": "nemotron", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "nano-gpt", + "nebius" + ], + "aliases": [ + "nano-gpt/nvidia/Llama-3.3-Nemotron-Super-49B-v1", + "nebius/nvidia/Llama-3.3-Nemotron-Super-49B-v1" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "nvidia/Llama-3.3-Nemotron-Super-49B-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/nvidia/Llama-3.3-Nemotron-Super-49B-v1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nvidia Nemotron Super 49B" + ], + "families": [ + "nemotron" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-08-08", + "lastUpdated": "2025-08-08", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "nvidia/Llama-3.3-Nemotron-Super-49B-v1", + "modelKey": "nvidia/Llama-3.3-Nemotron-Super-49B-v1", + "displayName": "Nvidia Nemotron Super 49B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2025-08-08", + "openWeights": false, + "releaseDate": "2025-08-08" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/nvidia/Llama-3.3-Nemotron-Super-49B-v1", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + } + ] + }, + { + "id": "meta-llama/llama-3.3-nemotron-super-49b-v1.5", + "provider": "meta-llama", + "model": "llama-3.3-nemotron-super-49b-v1.5", + "displayName": "NVIDIA: Llama 3.3 Nemotron Super 49B V1.5", + "family": "nemotron", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "deepinfra", + "kilo", + "openrouter" + ], + "aliases": [ + "deepinfra/nvidia/Llama-3.3-Nemotron-Super-49B-v1.5", + "kilo/nvidia/llama-3.3-nemotron-super-49b-v1.5", + "openrouter/nvidia/llama-3.3-nemotron-super-49b-v1.5" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "nvidia/llama-3.3-nemotron-super-49b-v1.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "nvidia/llama-3.3-nemotron-super-49b-v1.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/nvidia/Llama-3.3-Nemotron-Super-49B-v1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "nvidia/llama-3.3-nemotron-super-49b-v1.5", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 Nemotron Super 49B v1.5", + "NVIDIA: Llama 3.3 Nemotron Super 49B V1.5" + ], + "families": [ + "nemotron" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-03-31", + "releaseDate": "2025-03-16", + "lastUpdated": "2025-03-16", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "nvidia/llama-3.3-nemotron-super-49b-v1.5", + "modelKey": "nvidia/llama-3.3-nemotron-super-49b-v1.5", + "displayName": "NVIDIA: Llama 3.3 Nemotron Super 49B V1.5", + "family": "nemotron", + "metadata": { + "lastUpdated": "2025-03-16", + "openWeights": false, + "releaseDate": "2025-03-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "nvidia/llama-3.3-nemotron-super-49b-v1.5", + "modelKey": "nvidia/llama-3.3-nemotron-super-49b-v1.5", + "displayName": "Llama 3.3 Nemotron Super 49B v1.5", + "family": "nemotron", + "metadata": { + "lastUpdated": "2025-07-25", + "openWeights": true, + "releaseDate": "2025-07-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/nvidia/Llama-3.3-Nemotron-Super-49B-v1.5", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "nvidia/llama-3.3-nemotron-super-49b-v1.5", + "displayName": "NVIDIA: Llama 3.3 Nemotron Super 49B V1.5", + "metadata": { + "canonicalSlug": "nvidia/llama-3.3-nemotron-super-49b-v1.5", + "createdAt": "2025-10-10T13:03:15.000Z", + "huggingFaceId": "nvidia/Llama-3_3-Nemotron-Super-49B-v1_5", + "knowledgeCutoff": "2024-03-31", + "links": { + "details": "/api/v1/models/nvidia/llama-3.3-nemotron-super-49b-v1.5/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "meta-llama/llama-4-maverick", + "provider": "meta-llama", + "model": "llama-4-maverick", + "displayName": "Llama 4 Maverick 17B Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "cortecs", + "digitalocean", + "helicone", + "kilo", + "nano-gpt", + "openrouter", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "cortecs/llama-4-maverick", + "digitalocean/llama-4-maverick", + "helicone/llama-4-maverick", + "kilo/meta-llama/llama-4-maverick", + "nano-gpt/meta-llama/llama-4-maverick", + "openrouter/meta-llama/llama-4-maverick", + "vercel/meta/llama-4-maverick", + "vercel_ai_gateway/meta/llama-4-maverick" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxTokens": 8192, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "llama-4-maverick", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.151, + "input": 0.124, + "output": 0.603 + } + }, + { + "source": "models.dev", + "provider": "digitalocean", + "model": "llama-4-maverick", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 0.87 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "llama-4-maverick", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "meta-llama/llama-4-maverick", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "meta-llama/llama-4-maverick", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18000000000000002, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "meta-llama/llama-4-maverick", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "meta/llama-4-maverick", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-4-maverick", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "meta-llama/llama-4-maverick", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 4 Maverick", + "Llama 4 Maverick 17B 128E Instruct", + "Llama 4 Maverick 17B Instruct", + "Llama-4-Maverick-17B-128E-Instruct-FP8", + "Meta Llama 4 Maverick 17B 128E", + "Meta: Llama 4 Maverick" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-08", + "releaseDate": "2025-04-05", + "lastUpdated": "2025-04-05", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "llama-4-maverick", + "modelKey": "llama-4-maverick", + "displayName": "Llama 4 Maverick 17B Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "llama-4-maverick", + "modelKey": "llama-4-maverick", + "displayName": "Llama 4 Maverick 17B 128E Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "llama-4-maverick", + "modelKey": "llama-4-maverick", + "displayName": "Meta Llama 4 Maverick 17B 128E", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "meta-llama/llama-4-maverick", + "modelKey": "meta-llama/llama-4-maverick", + "displayName": "Meta: Llama 4 Maverick", + "metadata": { + "lastUpdated": "2025-12-24", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "meta-llama/llama-4-maverick", + "modelKey": "meta-llama/llama-4-maverick", + "displayName": "Llama 4 Maverick", + "family": "llama", + "metadata": { + "lastUpdated": "2025-09-05", + "openWeights": false, + "releaseDate": "2025-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "meta-llama/llama-4-maverick", + "modelKey": "meta-llama/llama-4-maverick", + "displayName": "Llama 4 Maverick", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08-31", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "meta/llama-4-maverick", + "modelKey": "meta/llama-4-maverick", + "displayName": "Llama-4-Maverick-17B-128E-Instruct-FP8", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-4-maverick", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "meta-llama/llama-4-maverick", + "displayName": "Meta: Llama 4 Maverick", + "metadata": { + "canonicalSlug": "meta-llama/llama-4-maverick-17b-128e-instruct", + "createdAt": "2025-04-05T19:37:02.000Z", + "huggingFaceId": "meta-llama/Llama-4-Maverick-17B-128E-Instruct", + "knowledgeCutoff": "2024-08-31", + "links": { + "details": "/api/v1/models/meta-llama/llama-4-maverick-17b-128e-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Llama4", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "meta-llama/llama-4-maverick-17b", + "provider": "meta-llama", + "model": "llama-4-maverick-17b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/meta-llama/llama-4-maverick-17b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/meta-llama/llama-4-maverick-17b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.35, + "output": 1.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/meta-llama/llama-4-maverick-17b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-4-maverick-17b-128e-instruct", + "provider": "meta-llama", + "model": "llama-4-maverick-17b-128e-instruct", + "displayName": "Llama 4 Maverick 17b 128e Instruct", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "groq", + "nvidia", + "sambanova" + ], + "aliases": [ + "groq/meta-llama/llama-4-maverick-17b-128e-instruct", + "nvidia/meta/llama-4-maverick-17b-128e-instruct", + "sambanova/Llama-4-Maverick-17B-128E-Instruct" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "meta/llama-4-maverick-17b-128e-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "groq", + "model": "groq/meta-llama/llama-4-maverick-17b-128e-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "sambanova", + "model": "sambanova/Llama-4-Maverick-17B-128E-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.63, + "output": 1.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 4 Maverick 17b 128e Instruct" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-02", + "releaseDate": "2025-04-01", + "lastUpdated": "2025-04-01", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "meta/llama-4-maverick-17b-128e-instruct", + "modelKey": "meta/llama-4-maverick-17b-128e-instruct", + "displayName": "Llama 4 Maverick 17b 128e Instruct", + "metadata": { + "knowledgeCutoff": "2024-02", + "lastUpdated": "2025-04-01", + "openWeights": true, + "releaseDate": "2025-04-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "groq", + "model": "groq/meta-llama/llama-4-maverick-17b-128e-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sambanova", + "model": "sambanova/Llama-4-Maverick-17B-128E-Instruct", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "For vision models, images are converted to 6432 input tokens and are billed at that amount" + }, + "source": "https://cloud.sambanova.ai/plans/pricing" + } + } + ] + }, + { + "id": "meta-llama/llama-4-maverick-17b-128e-instruct-fp8", + "provider": "meta-llama", + "model": "llama-4-maverick-17b-128e-instruct-fp8", + "displayName": "Llama 4 Maverick 17B FP8", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "abacus", + "azure", + "azure-cognitive-services", + "azure_ai", + "deepinfra", + "github-models", + "io-net", + "lambda_ai", + "llama", + "meta_llama", + "novita", + "novita-ai", + "synthetic", + "together_ai" + ], + "aliases": [ + "abacus/meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "azure-cognitive-services/llama-4-maverick-17b-128e-instruct-fp8", + "azure/llama-4-maverick-17b-128e-instruct-fp8", + "azure_ai/Llama-4-Maverick-17B-128E-Instruct-FP8", + "deepinfra/meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "github-models/meta/llama-4-maverick-17b-128e-instruct-fp8", + "io-net/meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "lambda_ai/llama-4-maverick-17b-128e-instruct-fp8", + "llama/llama-4-maverick-17b-128e-instruct-fp8", + "meta_llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "novita-ai/meta-llama/llama-4-maverick-17b-128e-instruct-fp8", + "novita/meta-llama/llama-4-maverick-17b-128e-instruct-fp8", + "synthetic/hf:meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "together_ai/meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8" + ], + "mergedProviderModelRecords": 14, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxTokens": 1048576, + "outputTokens": 1048576, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": true, + "temperature": true, + "vision": true, + "parallelFunctionCalling": true, + "systemMessages": true, + "responseSchema": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.59 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "llama-4-maverick-17b-128e-instruct-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "llama-4-maverick-17b-128e-instruct-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "meta/llama-4-maverick-17b-128e-instruct-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "io-net", + "model": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "cacheWrite": 0.3, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "llama", + "model": "llama-4-maverick-17b-128e-instruct-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "meta-llama/llama-4-maverick-17b-128e-instruct-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.85 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.22, + "output": 0.88 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Llama-4-Maverick-17B-128E-Instruct-FP8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.41, + "output": 0.35 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/llama-4-maverick-17b-128e-instruct-fp8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "meta_llama", + "model": "meta_llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/meta-llama/llama-4-maverick-17b-128e-instruct-fp8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.27, + "output": 0.85 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.27, + "output": 0.85 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 4 Maverick 17B 128E Instruct", + "Llama 4 Maverick 17B 128E Instruct FP8", + "Llama 4 Maverick 17B FP8", + "Llama 4 Maverick Instruct", + "Llama-4-Maverick-17B-128E-Instruct-FP8" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-08", + "releaseDate": "2025-04-05", + "lastUpdated": "2025-04-05", + "providerModelRecordCount": 14 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "modelKey": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "displayName": "Llama 4 Maverick 17B 128E Instruct FP8", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "llama-4-maverick-17b-128e-instruct-fp8", + "modelKey": "llama-4-maverick-17b-128e-instruct-fp8", + "displayName": "Llama 4 Maverick 17B 128E Instruct FP8", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "llama-4-maverick-17b-128e-instruct-fp8", + "modelKey": "llama-4-maverick-17b-128e-instruct-fp8", + "displayName": "Llama 4 Maverick 17B 128E Instruct FP8", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "modelKey": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "displayName": "Llama 4 Maverick 17B FP8", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "meta/llama-4-maverick-17b-128e-instruct-fp8", + "modelKey": "meta/llama-4-maverick-17b-128e-instruct-fp8", + "displayName": "Llama 4 Maverick 17B 128E Instruct FP8", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-31", + "openWeights": true, + "releaseDate": "2025-01-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "io-net", + "providerName": "IO.NET", + "providerApi": "https://api.intelligence.io.solutions/api/v1", + "providerDoc": "https://io.net/docs/guides/intelligence/io-intelligence", + "model": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "modelKey": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "displayName": "Llama 4 Maverick 17B 128E Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-15", + "openWeights": true, + "releaseDate": "2025-01-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llama", + "providerName": "Llama", + "providerApi": "https://api.llama.com/compat/v1/", + "providerDoc": "https://llama.developer.meta.com/docs/models", + "model": "llama-4-maverick-17b-128e-instruct-fp8", + "modelKey": "llama-4-maverick-17b-128e-instruct-fp8", + "displayName": "Llama-4-Maverick-17B-128E-Instruct-FP8", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "meta-llama/llama-4-maverick-17b-128e-instruct-fp8", + "modelKey": "meta-llama/llama-4-maverick-17b-128e-instruct-fp8", + "displayName": "Llama 4 Maverick Instruct", + "metadata": { + "lastUpdated": "2025-04-06", + "openWeights": true, + "releaseDate": "2025-04-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "modelKey": "hf:meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "displayName": "Llama-4-Maverick-17B-128E-Instruct-FP8", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Llama-4-Maverick-17B-128E-Instruct-FP8", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/blog/introducing-the-llama-4-herd-in-azure-ai-foundry-and-azure-databricks/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/llama-4-maverick-17b-128e-instruct-fp8", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "meta_llama", + "model": "meta_llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "mode": "chat", + "metadata": { + "source": "https://llama.developer.meta.com/docs/models" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/meta-llama/llama-4-maverick-17b-128e-instruct-fp8", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-4-maverick-17b-128e-instruct-maas", + "provider": "meta-llama", + "model": "llama-4-maverick-17b-128e-instruct-maas", + "displayName": "Llama 4 Maverick 17B 128E Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "vertex_ai-llama_models" + ], + "aliases": [ + "google-vertex/meta/llama-4-maverick-17b-128e-instruct-maas", + "vertex_ai-llama_models/vertex_ai/meta/llama-4-maverick-17b-128e-instruct-maas" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 1000000, + "outputTokens": 1000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex", + "model": "meta/llama-4-maverick-17b-128e-instruct-maas", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.35, + "output": 1.15 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama-4-maverick-17b-128e-instruct-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.35, + "output": 1.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 4 Maverick 17B 128E Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-08", + "releaseDate": "2025-04-29", + "lastUpdated": "2025-04-29", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "meta/llama-4-maverick-17b-128e-instruct-maas", + "modelKey": "meta/llama-4-maverick-17b-128e-instruct-maas", + "displayName": "Llama 4 Maverick 17B 128E Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-29", + "openWeights": true, + "releaseDate": "2025-04-29" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama-4-maverick-17b-128e-instruct-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#partner-models" + } + } + ] + }, + { + "id": "meta-llama/llama-4-maverick-17b-16e-instruct-maas", + "provider": "meta-llama", + "model": "llama-4-maverick-17b-16e-instruct-maas", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-llama_models" + ], + "aliases": [ + "vertex_ai-llama_models/vertex_ai/meta/llama-4-maverick-17b-16e-instruct-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 1000000, + "outputTokens": 1000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama-4-maverick-17b-16e-instruct-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.35, + "output": 1.15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama-4-maverick-17b-16e-instruct-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#partner-models" + } + } + ] + }, + { + "id": "meta-llama/llama-4-maverick-17b-instruct", + "provider": "meta-llama", + "model": "llama-4-maverick-17b-instruct", + "displayName": "Llama 4 Maverick 17B Instruct", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/llama-4-maverick-17b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "llama-4-maverick-17b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.24, + "output": 0.97 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 4 Maverick 17B Instruct" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-04-05", + "lastUpdated": "2025-04-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "llama-4-maverick-17b-instruct", + "modelKey": "llama-4-maverick-17b-instruct", + "displayName": "Llama 4 Maverick 17B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + } + ] + }, + { + "id": "meta-llama/llama-4-scout", + "provider": "meta-llama", + "model": "llama-4-scout", + "displayName": "Meta Llama 4 Scout 17B 16E", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "helicone", + "kilo", + "llmgateway", + "nano-gpt", + "openrouter", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "helicone/llama-4-scout", + "kilo/meta-llama/llama-4-scout", + "llmgateway/llama-4-scout", + "nano-gpt/meta-llama/llama-4-scout", + "openrouter/meta-llama/llama-4-scout", + "vercel/meta/llama-4-scout", + "vercel_ai_gateway/meta/llama-4-scout" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 10000000, + "inputTokens": 328000, + "maxTokens": 8192, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "llama-4-scout", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "meta-llama/llama-4-scout", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "llama-4-scout", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.59 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "meta-llama/llama-4-scout", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.085, + "output": 0.46 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "meta-llama/llama-4-scout", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "meta/llama-4-scout", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-4-scout", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "meta-llama/llama-4-scout", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 4 Scout", + "Llama-4-Scout-17B-16E-Instruct-FP8", + "Meta Llama 4 Scout 17B 16E", + "Meta: Llama 4 Scout" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "llama-4-scout", + "modelKey": "llama-4-scout", + "displayName": "Meta Llama 4 Scout 17B 16E", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "meta-llama/llama-4-scout", + "modelKey": "meta-llama/llama-4-scout", + "displayName": "Meta: Llama 4 Scout", + "metadata": { + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "llama-4-scout", + "modelKey": "llama-4-scout", + "displayName": "Llama 4 Scout", + "family": "llama", + "status": "beta", + "metadata": { + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "meta-llama/llama-4-scout", + "modelKey": "meta-llama/llama-4-scout", + "displayName": "Llama 4 Scout", + "family": "llama", + "metadata": { + "lastUpdated": "2025-09-05", + "openWeights": false, + "releaseDate": "2025-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "meta-llama/llama-4-scout", + "modelKey": "meta-llama/llama-4-scout", + "displayName": "Llama 4 Scout", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08-31", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "meta/llama-4-scout", + "modelKey": "meta/llama-4-scout", + "displayName": "Llama-4-Scout-17B-16E-Instruct-FP8", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/meta/llama-4-scout", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "meta-llama/llama-4-scout", + "displayName": "Meta: Llama 4 Scout", + "metadata": { + "canonicalSlug": "meta-llama/llama-4-scout-17b-16e-instruct", + "createdAt": "2025-04-05T19:31:59.000Z", + "huggingFaceId": "meta-llama/Llama-4-Scout-17B-16E-Instruct", + "knowledgeCutoff": "2024-08-31", + "links": { + "details": "/api/v1/models/meta-llama/llama-4-scout-17b-16e-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Llama4", + "topProvider": { + "context_length": 327680, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "meta-llama/llama-4-scout-17b-128e-instruct-maas", + "provider": "meta-llama", + "model": "llama-4-scout-17b-128e-instruct-maas", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-llama_models" + ], + "aliases": [ + "vertex_ai-llama_models/vertex_ai/meta/llama-4-scout-17b-128e-instruct-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 10000000, + "inputTokens": 10000000, + "maxTokens": 10000000, + "outputTokens": 10000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama-4-scout-17b-128e-instruct-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 0.7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama-4-scout-17b-128e-instruct-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#partner-models" + } + } + ] + }, + { + "id": "meta-llama/llama-4-scout-17b-16e-instruct", + "provider": "meta-llama", + "model": "llama-4-scout-17b-16e-instruct", + "displayName": "Llama 4 Scout 17B", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "azure_ai", + "cloudflare-ai-gateway", + "cloudflare-workers-ai", + "deepinfra", + "github-models", + "groq", + "lambda_ai", + "novita", + "novita-ai", + "nscale", + "sambanova", + "synthetic", + "together_ai", + "wandb" + ], + "aliases": [ + "azure-cognitive-services/llama-4-scout-17b-16e-instruct", + "azure/llama-4-scout-17b-16e-instruct", + "azure_ai/Llama-4-Scout-17B-16E-Instruct", + "cloudflare-ai-gateway/workers-ai/@cf/meta/llama-4-scout-17b-16e-instruct", + "cloudflare-workers-ai/@cf/meta/llama-4-scout-17b-16e-instruct", + "deepinfra/meta-llama/Llama-4-Scout-17B-16E-Instruct", + "github-models/meta/llama-4-scout-17b-16e-instruct", + "groq/meta-llama/llama-4-scout-17b-16e-instruct", + "lambda_ai/llama-4-scout-17b-16e-instruct", + "novita-ai/meta-llama/llama-4-scout-17b-16e-instruct", + "novita/meta-llama/llama-4-scout-17b-16e-instruct", + "nscale/meta-llama/Llama-4-Scout-17B-16E-Instruct", + "sambanova/Llama-4-Scout-17B-16E-Instruct", + "synthetic/hf:meta-llama/Llama-4-Scout-17B-16E-Instruct", + "together_ai/meta-llama/Llama-4-Scout-17B-16E-Instruct", + "wandb/meta-llama/Llama-4-Scout-17B-16E-Instruct" + ], + "mergedProviderModelRecords": 16, + "limits": { + "contextTokens": 10000000, + "inputTokens": 10000000, + "maxTokens": 327680, + "outputTokens": 327680, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": true, + "structuredOutput": true, + "temperature": true, + "responseSchema": true, + "vision": true, + "parallelFunctionCalling": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "llama-4-scout-17b-16e-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.78 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "llama-4-scout-17b-16e-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.78 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/meta/llama-4-scout-17b-16e-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.85 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/meta/llama-4-scout-17b-16e-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.85 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "meta-llama/Llama-4-Scout-17B-16E-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "meta/llama-4-scout-17b-16e-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "groq", + "model": "meta-llama/llama-4-scout-17b-16e-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.11, + "output": 0.34 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "meta-llama/llama-4-scout-17b-16e-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.59 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:meta-llama/Llama-4-Scout-17B-16E-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "wandb", + "model": "meta-llama/Llama-4-Scout-17B-16E-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.17, + "output": 0.66 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Llama-4-Scout-17B-16E-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.78 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Llama-4-Scout-17B-16E-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "groq", + "model": "groq/meta-llama/llama-4-scout-17b-16e-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.11, + "output": 0.34 + } + }, + { + "source": "litellm", + "provider": "lambda_ai", + "model": "lambda_ai/llama-4-scout-17b-16e-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/meta-llama/llama-4-scout-17b-16e-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.18, + "output": 0.59 + } + }, + { + "source": "litellm", + "provider": "nscale", + "model": "nscale/meta-llama/Llama-4-Scout-17B-16E-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.09, + "output": 0.29 + } + }, + { + "source": "litellm", + "provider": "sambanova", + "model": "sambanova/Llama-4-Scout-17B-16E-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 0.7 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/meta-llama/Llama-4-Scout-17B-16E-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.18, + "output": 0.59 + } + }, + { + "source": "litellm", + "provider": "wandb", + "model": "wandb/meta-llama/Llama-4-Scout-17B-16E-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 17000, + "output": 66000 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 4 Scout 17B", + "Llama 4 Scout 17B 16E", + "Llama 4 Scout 17B 16E Instruct", + "Llama 4 Scout Instruct", + "Llama-4-Scout-17B-16E-Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2024-08", + "releaseDate": "2025-04-05", + "lastUpdated": "2025-04-05", + "providerModelRecordCount": 16 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "llama-4-scout-17b-16e-instruct", + "modelKey": "llama-4-scout-17b-16e-instruct", + "displayName": "Llama 4 Scout 17B 16E Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "llama-4-scout-17b-16e-instruct", + "modelKey": "llama-4-scout-17b-16e-instruct", + "displayName": "Llama 4 Scout 17B 16E Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/meta/llama-4-scout-17b-16e-instruct", + "modelKey": "workers-ai/@cf/meta/llama-4-scout-17b-16e-instruct", + "displayName": "Llama 4 Scout 17B 16E Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/meta/llama-4-scout-17b-16e-instruct", + "modelKey": "@cf/meta/llama-4-scout-17b-16e-instruct", + "displayName": "Llama 4 Scout 17B 16E Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "meta-llama/Llama-4-Scout-17B-16E-Instruct", + "modelKey": "meta-llama/Llama-4-Scout-17B-16E-Instruct", + "displayName": "Llama 4 Scout 17B", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "meta/llama-4-scout-17b-16e-instruct", + "modelKey": "meta/llama-4-scout-17b-16e-instruct", + "displayName": "Llama 4 Scout 17B 16E Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-31", + "openWeights": true, + "releaseDate": "2025-01-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "groq", + "providerName": "Groq", + "providerDoc": "https://console.groq.com/docs/models", + "model": "meta-llama/llama-4-scout-17b-16e-instruct", + "modelKey": "meta-llama/llama-4-scout-17b-16e-instruct", + "displayName": "Llama 4 Scout 17B 16E", + "family": "llama", + "status": "beta", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "meta-llama/llama-4-scout-17b-16e-instruct", + "modelKey": "meta-llama/llama-4-scout-17b-16e-instruct", + "displayName": "Llama 4 Scout Instruct", + "metadata": { + "lastUpdated": "2025-04-06", + "openWeights": true, + "releaseDate": "2025-04-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:meta-llama/Llama-4-Scout-17B-16E-Instruct", + "modelKey": "hf:meta-llama/Llama-4-Scout-17B-16E-Instruct", + "displayName": "Llama-4-Scout-17B-16E-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "meta-llama/Llama-4-Scout-17B-16E-Instruct", + "modelKey": "meta-llama/Llama-4-Scout-17B-16E-Instruct", + "displayName": "Llama 4 Scout 17B 16E Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-12", + "openWeights": true, + "releaseDate": "2025-01-31" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Llama-4-Scout-17B-16E-Instruct", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/blog/introducing-the-llama-4-herd-in-azure-ai-foundry-and-azure-databricks/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Llama-4-Scout-17B-16E-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "groq", + "model": "groq/meta-llama/llama-4-scout-17b-16e-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lambda_ai", + "model": "lambda_ai/llama-4-scout-17b-16e-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/meta-llama/llama-4-scout-17b-16e-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nscale", + "model": "nscale/meta-llama/Llama-4-Scout-17B-16E-Instruct", + "mode": "chat", + "metadata": { + "source": "https://docs.nscale.com/docs/inference/serverless-models/current#chat-models" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sambanova", + "model": "sambanova/Llama-4-Scout-17B-16E-Instruct", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "For vision models, images are converted to 6432 input tokens and are billed at that amount" + }, + "source": "https://cloud.sambanova.ai/plans/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/meta-llama/Llama-4-Scout-17B-16E-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "wandb", + "model": "wandb/meta-llama/Llama-4-Scout-17B-16E-Instruct", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-4-scout-17b-16e-instruct-fp8", + "provider": "meta-llama", + "model": "llama-4-scout-17b-16e-instruct-fp8", + "displayName": "Llama-4-Scout-17B-16E-Instruct-FP8", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "llama", + "meta_llama" + ], + "aliases": [ + "llama/llama-4-scout-17b-16e-instruct-fp8", + "meta_llama/Llama-4-Scout-17B-16E-Instruct-FP8" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 10000000, + "inputTokens": 10000000, + "maxTokens": 4028, + "outputTokens": 4096, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llama", + "model": "llama-4-scout-17b-16e-instruct-fp8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "meta_llama", + "model": "meta_llama/Llama-4-Scout-17B-16E-Instruct-FP8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "Llama-4-Scout-17B-16E-Instruct-FP8" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-08", + "releaseDate": "2025-04-05", + "lastUpdated": "2025-04-05", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llama", + "providerName": "Llama", + "providerApi": "https://api.llama.com/compat/v1/", + "providerDoc": "https://llama.developer.meta.com/docs/models", + "model": "llama-4-scout-17b-16e-instruct-fp8", + "modelKey": "llama-4-scout-17b-16e-instruct-fp8", + "displayName": "Llama-4-Scout-17B-16E-Instruct-FP8", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "meta_llama", + "model": "meta_llama/Llama-4-Scout-17B-16E-Instruct-FP8", + "mode": "chat", + "metadata": { + "source": "https://llama.developer.meta.com/docs/models" + } + } + ] + }, + { + "id": "meta-llama/llama-4-scout-17b-16e-instruct-maas", + "provider": "meta-llama", + "model": "llama-4-scout-17b-16e-instruct-maas", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-llama_models" + ], + "aliases": [ + "vertex_ai-llama_models/vertex_ai/meta/llama-4-scout-17b-16e-instruct-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 10000000, + "inputTokens": 10000000, + "maxTokens": 10000000, + "outputTokens": 10000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama-4-scout-17b-16e-instruct-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 0.7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama-4-scout-17b-16e-instruct-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#partner-models" + } + } + ] + }, + { + "id": "meta-llama/llama-4-scout-17b-instruct", + "provider": "meta-llama", + "model": "llama-4-scout-17b-instruct", + "displayName": "Llama 4 Scout 17B Instruct", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/llama-4-scout-17b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "llama-4-scout-17b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.17, + "output": 0.66 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 4 Scout 17B Instruct" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-04-05", + "lastUpdated": "2025-04-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "llama-4-scout-17b-instruct", + "modelKey": "llama-4-scout-17b-instruct", + "displayName": "Llama 4 Scout 17B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + } + ] + }, + { + "id": "meta-llama/llama-guard-2-8b", + "provider": "meta-llama", + "model": "llama-guard-2-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-guard-2-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-guard-2-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-guard-2-8b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-guard-3-11b-vision", + "provider": "meta-llama", + "model": "llama-guard-3-11b-vision", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/meta-llama/llama-guard-3-11b-vision" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/meta-llama/llama-guard-3-11b-vision", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.35, + "output": 0.35 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/meta-llama/llama-guard-3-11b-vision", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-guard-3-1b", + "provider": "meta-llama", + "model": "llama-guard-3-1b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-guard-3-1b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-guard-3-1b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-guard-3-1b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-guard-3-8b", + "provider": "meta-llama", + "model": "llama-guard-3-8b", + "displayName": "Llama Guard 3 8B", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway", + "cloudflare-workers-ai", + "deepinfra", + "fireworks_ai", + "kilo", + "nebius" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/meta/llama-guard-3-8b", + "cloudflare-workers-ai/@cf/meta/llama-guard-3-8b", + "deepinfra/meta-llama/Llama-Guard-3-8B", + "fireworks_ai/accounts/fireworks/models/llama-guard-3-8b", + "kilo/meta-llama/llama-guard-3-8b", + "nebius/meta-llama/Llama-Guard-3-8B" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/meta/llama-guard-3-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.48, + "output": 0.03 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/meta/llama-guard-3-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.484, + "output": 0.03 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "meta-llama/llama-guard-3-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.06 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Llama-Guard-3-8B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.055, + "output": 0.055 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-guard-3-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/meta-llama/Llama-Guard-3-8B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0.06 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama Guard 3 8B" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-04-03", + "lastUpdated": "2025-04-03", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/meta/llama-guard-3-8b", + "modelKey": "workers-ai/@cf/meta/llama-guard-3-8b", + "displayName": "Llama Guard 3 8B", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/meta/llama-guard-3-8b", + "modelKey": "@cf/meta/llama-guard-3-8b", + "displayName": "Llama Guard 3 8B", + "family": "llama", + "metadata": { + "lastUpdated": "2025-01-22", + "openWeights": true, + "releaseDate": "2025-01-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "meta-llama/llama-guard-3-8b", + "modelKey": "meta-llama/llama-guard-3-8b", + "displayName": "Llama Guard 3 8B", + "metadata": { + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2024-04-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Llama-Guard-3-8B", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-guard-3-8b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/meta-llama/Llama-Guard-3-8B", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + } + ] + }, + { + "id": "meta-llama/llama-guard-4", + "provider": "meta-llama", + "model": "llama-guard-4", + "displayName": "Meta Llama Guard 4 12B", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "helicone" + ], + "aliases": [ + "helicone/llama-guard-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "llama-guard-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.21, + "output": 0.21 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Meta Llama Guard 4 12B" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "llama-guard-4", + "modelKey": "llama-guard-4", + "displayName": "Meta Llama Guard 4 12B", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + } + ] + }, + { + "id": "meta-llama/llama-guard-4-12b", + "provider": "meta-llama", + "model": "llama-guard-4-12b", + "displayName": "Meta: Llama Guard 4 12B", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "deepinfra", + "groq", + "kilo", + "nvidia", + "openrouter" + ], + "aliases": [ + "deepinfra/meta-llama/Llama-Guard-4-12B", + "groq/meta-llama/llama-guard-4-12b", + "kilo/meta-llama/llama-guard-4-12b", + "nvidia/meta/llama-guard-4-12b", + "openrouter/meta-llama/llama-guard-4-12b" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 163840, + "inputTokens": 163840, + "maxTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "meta-llama/llama-guard-4-12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.18 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "meta/llama-guard-4-12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "meta-llama/llama-guard-4-12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.18 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Llama-Guard-4-12B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.18, + "output": 0.18 + } + }, + { + "source": "litellm", + "provider": "groq", + "model": "groq/meta-llama/llama-guard-4-12b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "meta-llama/llama-guard-4-12b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.18, + "output": 0.18 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama Guard 4 12B", + "Meta: Llama Guard 4 12B" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-08-31", + "releaseDate": "2025-04-05", + "lastUpdated": "2025-04-05", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "meta-llama/llama-guard-4-12b", + "modelKey": "meta-llama/llama-guard-4-12b", + "displayName": "Meta: Llama Guard 4 12B", + "metadata": { + "lastUpdated": "2025-04-05", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "meta/llama-guard-4-12b", + "modelKey": "meta/llama-guard-4-12b", + "displayName": "Llama Guard 4 12B", + "family": "llama", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2025-04-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "meta-llama/llama-guard-4-12b", + "modelKey": "meta-llama/llama-guard-4-12b", + "displayName": "Llama Guard 4 12B", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-08-31", + "lastUpdated": "2025-04-30", + "openWeights": true, + "releaseDate": "2025-04-30" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Llama-Guard-4-12B", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "groq", + "model": "groq/meta-llama/llama-guard-4-12b", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "meta-llama/llama-guard-4-12b", + "displayName": "Meta: Llama Guard 4 12B", + "metadata": { + "canonicalSlug": "meta-llama/llama-guard-4-12b", + "createdAt": "2025-04-30T01:06:33.000Z", + "huggingFaceId": "meta-llama/Llama-Guard-4-12B", + "knowledgeCutoff": "2024-08-31", + "links": { + "details": "/api/v1/models/meta-llama/llama-guard-4-12b/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 163840, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "meta-llama/llama-nemotron-embed-vl-1b-v2", + "provider": "meta-llama", + "model": "llama-nemotron-embed-vl-1b-v2", + "displayName": "llama-nemotron-embed-vl-1b-v2", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/llama-nemotron-embed-vl-1b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/llama-nemotron-embed-vl-1b-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "llama-nemotron-embed-vl-1b-v2" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-02-10", + "lastUpdated": "2026-02-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/llama-nemotron-embed-vl-1b-v2", + "modelKey": "nvidia/llama-nemotron-embed-vl-1b-v2", + "displayName": "llama-nemotron-embed-vl-1b-v2", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-02-10", + "openWeights": true, + "releaseDate": "2026-02-10" + } + } + ] + }, + { + "id": "meta-llama/llama-nemotron-rerank-vl-1b-v2", + "provider": "meta-llama", + "model": "llama-nemotron-rerank-vl-1b-v2", + "displayName": "llama-nemotron-rerank-vl-1b-v2", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/llama-nemotron-rerank-vl-1b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/llama-nemotron-rerank-vl-1b-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "llama-nemotron-rerank-vl-1b-v2" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-03-31", + "lastUpdated": "2026-03-31", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/llama-nemotron-rerank-vl-1b-v2", + "modelKey": "nvidia/llama-nemotron-rerank-vl-1b-v2", + "displayName": "llama-nemotron-rerank-vl-1b-v2", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-03-31", + "openWeights": true, + "releaseDate": "2026-03-31" + } + } + ] + }, + { + "id": "meta-llama/llama-prompt-guard-2-22m", + "provider": "meta-llama", + "model": "llama-prompt-guard-2-22m", + "displayName": "Llama Prompt Guard 2 22M", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "groq", + "helicone" + ], + "aliases": [ + "groq/meta-llama/llama-prompt-guard-2-22m", + "helicone/llama-prompt-guard-2-22m" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 512, + "outputTokens": 512, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "groq", + "model": "meta-llama/llama-prompt-guard-2-22m", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.03, + "output": 0.03 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "llama-prompt-guard-2-22m", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.01, + "output": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama Prompt Guard 2 22M", + "Meta Llama Prompt Guard 2 22M" + ], + "families": [ + "llama" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-05-29", + "lastUpdated": "2025-05-29", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "groq", + "providerName": "Groq", + "providerDoc": "https://console.groq.com/docs/models", + "model": "meta-llama/llama-prompt-guard-2-22m", + "modelKey": "meta-llama/llama-prompt-guard-2-22m", + "displayName": "Llama Prompt Guard 2 22M", + "family": "llama", + "status": "beta", + "metadata": { + "lastUpdated": "2025-05-29", + "openWeights": true, + "releaseDate": "2025-05-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "llama-prompt-guard-2-22m", + "modelKey": "llama-prompt-guard-2-22m", + "displayName": "Meta Llama Prompt Guard 2 22M", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-10-01", + "openWeights": false, + "releaseDate": "2024-10-01" + } + } + ] + }, + { + "id": "meta-llama/llama-prompt-guard-2-86m", + "provider": "meta-llama", + "model": "llama-prompt-guard-2-86m", + "displayName": "Prompt Guard 2 86M", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "groq", + "helicone" + ], + "aliases": [ + "groq/meta-llama/llama-prompt-guard-2-86m", + "helicone/llama-prompt-guard-2-86m" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 512, + "outputTokens": 512, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "groq", + "model": "meta-llama/llama-prompt-guard-2-86m", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.04 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "llama-prompt-guard-2-86m", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.01, + "output": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Meta Llama Prompt Guard 2 86M", + "Prompt Guard 2 86M" + ], + "families": [ + "llama" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-05-29", + "lastUpdated": "2025-05-29", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "groq", + "providerName": "Groq", + "providerDoc": "https://console.groq.com/docs/models", + "model": "meta-llama/llama-prompt-guard-2-86m", + "modelKey": "meta-llama/llama-prompt-guard-2-86m", + "displayName": "Prompt Guard 2 86M", + "family": "llama", + "status": "beta", + "metadata": { + "lastUpdated": "2025-05-29", + "openWeights": true, + "releaseDate": "2025-05-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "llama-prompt-guard-2-86m", + "modelKey": "llama-prompt-guard-2-86m", + "displayName": "Meta Llama Prompt Guard 2 86M", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-10-01", + "openWeights": false, + "releaseDate": "2024-10-01" + } + } + ] + }, + { + "id": "meta-llama/llama-v2-13b", + "provider": "meta-llama", + "model": "llama-v2-13b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v2-13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v2-13b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v2-13b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-v2-13b-chat", + "provider": "meta-llama", + "model": "llama-v2-13b-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v2-13b-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v2-13b-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v2-13b-chat", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-v2-70b", + "provider": "meta-llama", + "model": "llama-v2-70b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v2-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v2-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v2-70b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-v2-70b-chat", + "provider": "meta-llama", + "model": "llama-v2-70b-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v2-70b-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2048, + "inputTokens": 2048, + "maxTokens": 2048, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v2-70b-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v2-70b-chat", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-v2-7b", + "provider": "meta-llama", + "model": "llama-v2-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v2-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v2-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v2-7b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-v2-7b-chat", + "provider": "meta-llama", + "model": "llama-v2-7b-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v2-7b-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v2-7b-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v2-7b-chat", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-v3-70b-instruct", + "provider": "meta-llama", + "model": "llama-v3-70b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v3-70b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3-70b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-v3-70b-instruct-hf", + "provider": "meta-llama", + "model": "llama-v3-70b-instruct-hf", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v3-70b-instruct-hf" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3-70b-instruct-hf", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3-70b-instruct-hf", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-v3-8b", + "provider": "meta-llama", + "model": "llama-v3-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v3-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3-8b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-v3-8b-instruct-hf", + "provider": "meta-llama", + "model": "llama-v3-8b-instruct-hf", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v3-8b-instruct-hf" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3-8b-instruct-hf", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3-8b-instruct-hf", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-v3p1-405b-instruct", + "provider": "meta-llama", + "model": "llama-v3p1-405b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v3p1-405b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p1-405b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p1-405b-instruct", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "meta-llama/llama-v3p1-405b-instruct-long", + "provider": "meta-llama", + "model": "llama-v3p1-405b-instruct-long", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v3p1-405b-instruct-long" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p1-405b-instruct-long", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p1-405b-instruct-long", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-v3p1-70b-instruct", + "provider": "meta-llama", + "model": "llama-v3p1-70b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v3p1-70b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p1-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p1-70b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-v3p1-70b-instruct-1b", + "provider": "meta-llama", + "model": "llama-v3p1-70b-instruct-1b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v3p1-70b-instruct-1b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p1-70b-instruct-1b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p1-70b-instruct-1b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-v3p1-8b-instruct", + "provider": "meta-llama", + "model": "llama-v3p1-8b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v3p1-8b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p1-8b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p1-8b-instruct", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "meta-llama/llama-v3p1-nemotron-70b-instruct", + "provider": "meta-llama", + "model": "llama-v3p1-nemotron-70b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v3p1-nemotron-70b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p1-nemotron-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p1-nemotron-70b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-v3p2-11b-vision-instruct", + "provider": "meta-llama", + "model": "llama-v3p2-11b-vision-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v3p2-11b-vision-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p2-11b-vision-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p2-11b-vision-instruct", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "meta-llama/llama-v3p2-1b", + "provider": "meta-llama", + "model": "llama-v3p2-1b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v3p2-1b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p2-1b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p2-1b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-v3p2-1b-instruct", + "provider": "meta-llama", + "model": "llama-v3p2-1b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v3p2-1b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p2-1b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p2-1b-instruct", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "meta-llama/llama-v3p2-3b", + "provider": "meta-llama", + "model": "llama-v3p2-3b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v3p2-3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p2-3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p2-3b", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-v3p2-3b-instruct", + "provider": "meta-llama", + "model": "llama-v3p2-3b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v3p2-3b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p2-3b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p2-3b-instruct", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "meta-llama/llama-v3p2-90b-vision-instruct", + "provider": "meta-llama", + "model": "llama-v3p2-90b-vision-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v3p2-90b-vision-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p2-90b-vision-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p2-90b-vision-instruct", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "meta-llama/llama-v3p3-70b-instruct", + "provider": "meta-llama", + "model": "llama-v3p3-70b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/llama-v3p3-70b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p3-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/llama-v3p3-70b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/llama-xlam-2-70b-fc-r", + "provider": "meta-llama", + "model": "llama-xlam-2-70b-fc-r", + "displayName": "Llama-xLAM-2 70B fc-r", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Salesforce/Llama-xLAM-2-70b-fc-r" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Salesforce/Llama-xLAM-2-70b-fc-r", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama-xLAM-2 70B fc-r" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-04-13", + "lastUpdated": "2025-04-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Salesforce/Llama-xLAM-2-70b-fc-r", + "modelKey": "Salesforce/Llama-xLAM-2-70b-fc-r", + "displayName": "Llama-xLAM-2 70B fc-r", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-13", + "openWeights": false, + "releaseDate": "2025-04-13" + } + } + ] + }, + { + "id": "meta-llama/llama3-405b-instruct-maas", + "provider": "meta-llama", + "model": "llama3-405b-instruct-maas", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-llama_models" + ], + "aliases": [ + "vertex_ai-llama_models/vertex_ai/meta/llama3-405b-instruct-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama3-405b-instruct-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama3-405b-instruct-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#partner-models" + } + } + ] + }, + { + "id": "meta-llama/llama3-70b-instruct-maas", + "provider": "meta-llama", + "model": "llama3-70b-instruct-maas", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-llama_models" + ], + "aliases": [ + "vertex_ai-llama_models/vertex_ai/meta/llama3-70b-instruct-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama3-70b-instruct-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama3-70b-instruct-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#partner-models" + } + } + ] + }, + { + "id": "meta-llama/llama3-8b-instruct-maas", + "provider": "meta-llama", + "model": "llama3-8b-instruct-maas", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-llama_models" + ], + "aliases": [ + "vertex_ai-llama_models/vertex_ai/meta/llama3-8b-instruct-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama3-8b-instruct-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-llama_models", + "model": "vertex_ai/meta/llama3-8b-instruct-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#partner-models" + } + } + ] + }, + { + "id": "meta-llama/m2m100-1.2b", + "provider": "meta-llama", + "model": "m2m100-1.2b", + "displayName": "M2M100 1.2B", + "family": "m2m", + "sources": [ + "models.dev" + ], + "providers": [ + "cloudflare-ai-gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/meta/m2m100-1.2b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/meta/m2m100-1.2b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.34, + "output": 0.34 + } + } + ] + }, + "metadata": { + "displayNames": [ + "M2M100 1.2B" + ], + "families": [ + "m2m" + ], + "releaseDate": "2025-04-03", + "lastUpdated": "2025-04-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/meta/m2m100-1.2b", + "modelKey": "workers-ai/@cf/meta/m2m100-1.2b", + "displayName": "M2M100 1.2B", + "family": "m2m", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + } + ] + }, + { + "id": "meta-llama/meta-llama-3-1-70b-instruct", + "provider": "meta-llama", + "model": "meta-llama-3-1-70b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ovhcloud" + ], + "aliases": [ + "ovhcloud/Meta-Llama-3_1-70B-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131000, + "inputTokens": 131000, + "maxTokens": 131000, + "outputTokens": 131000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ovhcloud", + "model": "ovhcloud/Meta-Llama-3_1-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.67, + "output": 0.67 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ovhcloud", + "model": "ovhcloud/Meta-Llama-3_1-70B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://endpoints.ai.cloud.ovh.net/models/meta-llama-3-1-70b-instruct" + } + } + ] + }, + { + "id": "meta-llama/meta-llama-3-1-8b-instruct-fp8", + "provider": "meta-llama", + "model": "meta-llama-3-1-8b-instruct-fp8", + "displayName": "Llama 3.1 8B (decentralized)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Meta-Llama-3-1-8B-Instruct-FP8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Meta-Llama-3-1-8B-Instruct-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.03 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 8B (decentralized)" + ], + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Meta-Llama-3-1-8B-Instruct-FP8", + "modelKey": "Meta-Llama-3-1-8B-Instruct-FP8", + "displayName": "Llama 3.1 8B (decentralized)", + "metadata": { + "lastUpdated": "2024-07-23", + "openWeights": false, + "releaseDate": "2024-07-23" + } + } + ] + }, + { + "id": "meta-llama/meta-llama-3-1-8b-instruct-gguf", + "provider": "meta-llama", + "model": "meta-llama-3-1-8b-instruct-gguf", + "displayName": "Meta Llama 3.1 8B Instruct (GGUF)", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "atomic-chat" + ], + "aliases": [ + "atomic-chat/Meta-Llama-3_1-8B-Instruct-GGUF" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "atomic-chat", + "model": "Meta-Llama-3_1-8B-Instruct-GGUF", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Meta Llama 3.1 8B Instruct (GGUF)" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "atomic-chat", + "providerName": "Atomic Chat", + "providerApi": "http://127.0.0.1:1337/v1", + "providerDoc": "https://atomic.chat", + "model": "Meta-Llama-3_1-8B-Instruct-GGUF", + "modelKey": "Meta-Llama-3_1-8B-Instruct-GGUF", + "displayName": "Meta Llama 3.1 8B Instruct (GGUF)", + "family": "llama", + "metadata": { + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + } + ] + }, + { + "id": "meta-llama/meta-llama-3-3-70b-instruct", + "provider": "meta-llama", + "model": "meta-llama-3-3-70b-instruct", + "displayName": "Meta-Llama-3_3-70B-Instruct", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "ovhcloud" + ], + "aliases": [ + "ovhcloud/Meta-Llama-3_3-70B-Instruct", + "ovhcloud/meta-llama-3_3-70b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131000, + "maxTokens": 131000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "ovhcloud", + "model": "meta-llama-3_3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.74, + "output": 0.74 + } + }, + { + "source": "litellm", + "provider": "ovhcloud", + "model": "ovhcloud/Meta-Llama-3_3-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.67, + "output": 0.67 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Meta-Llama-3_3-70B-Instruct" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-04-01", + "lastUpdated": "2025-04-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ovhcloud", + "providerName": "OVHcloud AI Endpoints", + "providerApi": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", + "providerDoc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", + "model": "meta-llama-3_3-70b-instruct", + "modelKey": "meta-llama-3_3-70b-instruct", + "displayName": "Meta-Llama-3_3-70B-Instruct", + "metadata": { + "lastUpdated": "2025-04-01", + "openWeights": true, + "releaseDate": "2025-04-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ovhcloud", + "model": "ovhcloud/Meta-Llama-3_3-70B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://endpoints.ai.cloud.ovh.net/models/meta-llama-3-3-70b-instruct" + } + } + ] + }, + { + "id": "meta-llama/meta-llama-3-70b-instruct", + "provider": "meta-llama", + "model": "meta-llama-3-70b-instruct", + "displayName": "Meta-Llama-3-70B-Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "anyscale", + "azure", + "azure-cognitive-services", + "azure_ai", + "github-models", + "hyperbolic" + ], + "aliases": [ + "anyscale/meta-llama/Meta-Llama-3-70B-Instruct", + "azure-cognitive-services/meta-llama-3-70b-instruct", + "azure/meta-llama-3-70b-instruct", + "azure_ai/Meta-Llama-3-70B-Instruct", + "github-models/meta/meta-llama-3-70b-instruct", + "hyperbolic/meta-llama/Meta-Llama-3-70B-Instruct" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "toolChoice": true, + "functionCalling": true, + "parallelFunctionCalling": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "meta-llama-3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.68, + "output": 3.54 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "meta-llama-3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.68, + "output": 3.54 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "meta/meta-llama-3-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "anyscale", + "model": "anyscale/meta-llama/Meta-Llama-3-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 1 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Meta-Llama-3-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.1, + "output": 0.37 + } + }, + { + "source": "litellm", + "provider": "hyperbolic", + "model": "hyperbolic/meta-llama/Meta-Llama-3-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Meta-Llama-3-70B-Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-04-18", + "lastUpdated": "2024-04-18", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "meta-llama-3-70b-instruct", + "modelKey": "meta-llama-3-70b-instruct", + "displayName": "Meta-Llama-3-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-04-18", + "openWeights": true, + "releaseDate": "2024-04-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "meta-llama-3-70b-instruct", + "modelKey": "meta-llama-3-70b-instruct", + "displayName": "Meta-Llama-3-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-04-18", + "openWeights": true, + "releaseDate": "2024-04-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "meta/meta-llama-3-70b-instruct", + "modelKey": "meta/meta-llama-3-70b-instruct", + "displayName": "Meta-Llama-3-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-04-18", + "openWeights": true, + "releaseDate": "2024-04-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anyscale", + "model": "anyscale/meta-llama/Meta-Llama-3-70B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://docs.anyscale.com/preview/endpoints/text-generation/supported-models/meta-llama-Meta-Llama-3-70B-Instruct" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Meta-Llama-3-70B-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "hyperbolic", + "model": "hyperbolic/meta-llama/Meta-Llama-3-70B-Instruct", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/meta-llama-3-70b-instruct-abliterated-v3.5", + "provider": "meta-llama", + "model": "meta-llama-3-70b-instruct-abliterated-v3.5", + "displayName": "Llama 3 70B abliterated", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/failspy/Meta-Llama-3-70B-Instruct-abliterated-v3.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "failspy/Meta-Llama-3-70B-Instruct-abliterated-v3.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 0.7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3 70B abliterated" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-07-26", + "lastUpdated": "2025-07-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "failspy/Meta-Llama-3-70B-Instruct-abliterated-v3.5", + "modelKey": "failspy/Meta-Llama-3-70B-Instruct-abliterated-v3.5", + "displayName": "Llama 3 70B abliterated", + "family": "llama", + "metadata": { + "lastUpdated": "2025-07-26", + "openWeights": false, + "releaseDate": "2025-07-26" + } + } + ] + }, + { + "id": "meta-llama/meta-llama-3-8b-instruct", + "provider": "meta-llama", + "model": "meta-llama-3-8b-instruct", + "displayName": "Meta-Llama-3-8B-Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "anyscale", + "azure", + "azure-cognitive-services", + "deepinfra", + "github-models" + ], + "aliases": [ + "anyscale/meta-llama/Meta-Llama-3-8B-Instruct", + "azure-cognitive-services/meta-llama-3-8b-instruct", + "azure/meta-llama-3-8b-instruct", + "deepinfra/meta-llama/Meta-Llama-3-8B-Instruct", + "github-models/meta/meta-llama-3-8b-instruct" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "functionCalling": true, + "toolChoice": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "meta-llama-3-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.61 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "meta-llama-3-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.61 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "meta/meta-llama-3-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "anyscale", + "model": "anyscale/meta-llama/Meta-Llama-3-8B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Meta-Llama-3-8B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.03, + "output": 0.06 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Meta-Llama-3-8B-Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-04-18", + "lastUpdated": "2024-04-18", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "meta-llama-3-8b-instruct", + "modelKey": "meta-llama-3-8b-instruct", + "displayName": "Meta-Llama-3-8B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-04-18", + "openWeights": true, + "releaseDate": "2024-04-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "meta-llama-3-8b-instruct", + "modelKey": "meta-llama-3-8b-instruct", + "displayName": "Meta-Llama-3-8B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-04-18", + "openWeights": true, + "releaseDate": "2024-04-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "meta/meta-llama-3-8b-instruct", + "modelKey": "meta/meta-llama-3-8b-instruct", + "displayName": "Meta-Llama-3-8B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-04-18", + "openWeights": true, + "releaseDate": "2024-04-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anyscale", + "model": "anyscale/meta-llama/Meta-Llama-3-8B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://docs.anyscale.com/preview/endpoints/text-generation/supported-models/meta-llama-Meta-Llama-3-8B-Instruct" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Meta-Llama-3-8B-Instruct", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/meta-llama-3-8b-instruct-lite", + "provider": "meta-llama", + "model": "meta-llama-3-8b-instruct-lite", + "displayName": "Meta Llama 3 8B Instruct Lite", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "togetherai" + ], + "aliases": [ + "togetherai/meta-llama/Meta-Llama-3-8B-Instruct-Lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "togetherai", + "model": "meta-llama/Meta-Llama-3-8B-Instruct-Lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Meta Llama 3 8B Instruct Lite" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-04-18", + "lastUpdated": "2024-04-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "meta-llama/Meta-Llama-3-8B-Instruct-Lite", + "modelKey": "meta-llama/Meta-Llama-3-8B-Instruct-Lite", + "displayName": "Meta Llama 3 8B Instruct Lite", + "family": "llama", + "metadata": { + "lastUpdated": "2024-04-18", + "openWeights": true, + "releaseDate": "2024-04-18" + } + } + ] + }, + { + "id": "meta-llama/meta-llama-3.1-405b-instruct", + "provider": "meta-llama", + "model": "meta-llama-3.1-405b-instruct", + "displayName": "Meta-Llama-3.1-405B-Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "azure_ai", + "github-models", + "hyperbolic", + "nebius", + "sambanova" + ], + "aliases": [ + "azure-cognitive-services/meta-llama-3.1-405b-instruct", + "azure/meta-llama-3.1-405b-instruct", + "azure_ai/Meta-Llama-3.1-405B-Instruct", + "github-models/meta/meta-llama-3.1-405b-instruct", + "hyperbolic/meta-llama/Meta-Llama-3.1-405B-Instruct", + "nebius/meta-llama/Meta-Llama-3.1-405B-Instruct", + "sambanova/Meta-Llama-3.1-405B-Instruct" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "functionCalling": true, + "parallelFunctionCalling": true, + "systemMessages": true, + "responseSchema": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "meta-llama-3.1-405b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5.33, + "output": 16 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "meta-llama-3.1-405b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5.33, + "output": 16 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "meta/meta-llama-3.1-405b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Meta-Llama-3.1-405B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5.33, + "output": 16 + } + }, + { + "source": "litellm", + "provider": "hyperbolic", + "model": "hyperbolic/meta-llama/Meta-Llama-3.1-405B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/meta-llama/Meta-Llama-3.1-405B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "sambanova", + "model": "sambanova/Meta-Llama-3.1-405B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Meta-Llama-3.1-405B-Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "meta-llama-3.1-405b-instruct", + "modelKey": "meta-llama-3.1-405b-instruct", + "displayName": "Meta-Llama-3.1-405B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "meta-llama-3.1-405b-instruct", + "modelKey": "meta-llama-3.1-405b-instruct", + "displayName": "Meta-Llama-3.1-405B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "meta/meta-llama-3.1-405b-instruct", + "modelKey": "meta/meta-llama-3.1-405b-instruct", + "displayName": "Meta-Llama-3.1-405B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Meta-Llama-3.1-405B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://azuremarketplace.microsoft.com/en-us/marketplace/apps/metagenai.meta-llama-3-1-405b-instruct-offer?tab=PlansAndPrice" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "hyperbolic", + "model": "hyperbolic/meta-llama/Meta-Llama-3.1-405B-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/meta-llama/Meta-Llama-3.1-405B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sambanova", + "model": "sambanova/Meta-Llama-3.1-405B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://cloud.sambanova.ai/plans/pricing" + } + } + ] + }, + { + "id": "meta-llama/meta-llama-3.1-405b-instruct-turbo", + "provider": "meta-llama", + "model": "meta-llama-3.1-405b-instruct-turbo", + "displayName": "Llama 3.1 405B Instruct Turbo", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "abacus", + "together_ai" + ], + "aliases": [ + "abacus/meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", + "together_ai/meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3.5, + "output": 3.5 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3.5, + "output": 3.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 405B Instruct Turbo" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", + "modelKey": "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", + "displayName": "Llama 3.1 405B Instruct Turbo", + "family": "llama", + "metadata": { + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/meta-llama-3.1-70b-instruct", + "provider": "meta-llama", + "model": "meta-llama-3.1-70b-instruct", + "displayName": "Meta-Llama-3.1-70B-Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "azure_ai", + "deepinfra", + "friendliai", + "github-models", + "hyperbolic", + "nebius" + ], + "aliases": [ + "azure-cognitive-services/meta-llama-3.1-70b-instruct", + "azure/meta-llama-3.1-70b-instruct", + "azure_ai/Meta-Llama-3.1-70B-Instruct", + "deepinfra/meta-llama/Meta-Llama-3.1-70B-Instruct", + "friendliai/meta-llama-3.1-70b-instruct", + "github-models/meta/meta-llama-3.1-70b-instruct", + "hyperbolic/meta-llama/Meta-Llama-3.1-70B-Instruct", + "nebius/meta-llama/Meta-Llama-3.1-70B-Instruct" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "functionCalling": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "meta-llama-3.1-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.68, + "output": 3.54 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "meta-llama-3.1-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.68, + "output": 3.54 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "meta/meta-llama-3.1-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Meta-Llama-3.1-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.68, + "output": 3.54 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Meta-Llama-3.1-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "friendliai", + "model": "friendliai/meta-llama-3.1-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "hyperbolic", + "model": "hyperbolic/meta-llama/Meta-Llama-3.1-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/meta-llama/Meta-Llama-3.1-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Meta-Llama-3.1-70B-Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "meta-llama-3.1-70b-instruct", + "modelKey": "meta-llama-3.1-70b-instruct", + "displayName": "Meta-Llama-3.1-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "meta-llama-3.1-70b-instruct", + "modelKey": "meta-llama-3.1-70b-instruct", + "displayName": "Meta-Llama-3.1-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "meta/meta-llama-3.1-70b-instruct", + "modelKey": "meta/meta-llama-3.1-70b-instruct", + "displayName": "Meta-Llama-3.1-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Meta-Llama-3.1-70B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://azuremarketplace.microsoft.com/en-us/marketplace/apps/metagenai.meta-llama-3-1-70b-instruct-offer?tab=PlansAndPrice" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Meta-Llama-3.1-70B-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "friendliai", + "model": "friendliai/meta-llama-3.1-70b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "hyperbolic", + "model": "hyperbolic/meta-llama/Meta-Llama-3.1-70B-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/meta-llama/Meta-Llama-3.1-70B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + } + ] + }, + { + "id": "meta-llama/meta-llama-3.1-70b-instruct-turbo", + "provider": "meta-llama", + "model": "meta-llama-3.1-70b-instruct-turbo", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepinfra", + "together_ai" + ], + "aliases": [ + "deepinfra/meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo", + "together_ai/meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "parallelFunctionCalling": true, + "responseSchema": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.28 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.88, + "output": 0.88 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/meta-llama-3.1-8b-instruct", + "provider": "meta-llama", + "model": "meta-llama-3.1-8b-instruct", + "displayName": "Llama 3.1 8B Instruct", + "family": "llama", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "abacus", + "azure", + "azure-cognitive-services", + "azure_ai", + "deepinfra", + "friendliai", + "github-models", + "hyperbolic", + "nebius", + "sambanova" + ], + "aliases": [ + "abacus/meta-llama/Meta-Llama-3.1-8B-Instruct", + "azure-cognitive-services/meta-llama-3.1-8b-instruct", + "azure/meta-llama-3.1-8b-instruct", + "azure_ai/Meta-Llama-3.1-8B-Instruct", + "deepinfra/meta-llama/Meta-Llama-3.1-8B-Instruct", + "friendliai/meta-llama-3.1-8b-instruct", + "github-models/meta/meta-llama-3.1-8b-instruct", + "hyperbolic/meta-llama/Meta-Llama-3.1-8B-Instruct", + "nebius/meta-llama/Meta-Llama-3.1-8B-Instruct", + "sambanova/Meta-Llama-3.1-8B-Instruct" + ], + "mergedProviderModelRecords": 10, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "functionCalling": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "meta-llama/Meta-Llama-3.1-8B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.05 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "meta-llama-3.1-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.61 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "meta-llama-3.1-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.61 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "meta/meta-llama-3.1-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/Meta-Llama-3.1-8B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.61 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Meta-Llama-3.1-8B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.03, + "output": 0.05 + } + }, + { + "source": "litellm", + "provider": "friendliai", + "model": "friendliai/meta-llama-3.1-8b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "hyperbolic", + "model": "hyperbolic/meta-llama/Meta-Llama-3.1-8B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/meta-llama/Meta-Llama-3.1-8B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0.06 + } + }, + { + "source": "litellm", + "provider": "sambanova", + "model": "sambanova/Meta-Llama-3.1-8B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 8B Instruct", + "Meta-Llama-3.1-8B-Instruct" + ], + "families": [ + "llama" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 10 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "meta-llama/Meta-Llama-3.1-8B-Instruct", + "modelKey": "meta-llama/Meta-Llama-3.1-8B-Instruct", + "displayName": "Llama 3.1 8B Instruct", + "family": "llama", + "metadata": { + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "meta-llama-3.1-8b-instruct", + "modelKey": "meta-llama-3.1-8b-instruct", + "displayName": "Meta-Llama-3.1-8B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "meta-llama-3.1-8b-instruct", + "modelKey": "meta-llama-3.1-8b-instruct", + "displayName": "Meta-Llama-3.1-8B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "meta/meta-llama-3.1-8b-instruct", + "modelKey": "meta/meta-llama-3.1-8b-instruct", + "displayName": "Meta-Llama-3.1-8B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/Meta-Llama-3.1-8B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://azuremarketplace.microsoft.com/en-us/marketplace/apps/metagenai.meta-llama-3-1-8b-instruct-offer?tab=PlansAndPrice" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Meta-Llama-3.1-8B-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "friendliai", + "model": "friendliai/meta-llama-3.1-8b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "hyperbolic", + "model": "hyperbolic/meta-llama/Meta-Llama-3.1-8B-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/meta-llama/Meta-Llama-3.1-8B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sambanova", + "model": "sambanova/Meta-Llama-3.1-8B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://cloud.sambanova.ai/plans/pricing" + } + } + ] + }, + { + "id": "meta-llama/meta-llama-3.1-8b-instruct-fp8", + "provider": "meta-llama", + "model": "meta-llama-3.1-8b-instruct-fp8", + "displayName": "Llama 3.1 8B", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "stackit" + ], + "aliases": [ + "stackit/neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "stackit", + "model": "neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.16, + "output": 0.27 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 8B" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "stackit", + "providerName": "STACKIT", + "providerApi": "https://api.openai-compat.model-serving.eu01.onstackit.cloud/v1", + "providerDoc": "https://docs.stackit.cloud/products/data-and-ai/ai-model-serving/basics/available-shared-models", + "model": "neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8", + "modelKey": "neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8", + "displayName": "Llama 3.1 8B", + "family": "llama", + "metadata": { + "lastUpdated": "2024-07-23", + "openWeights": true, + "releaseDate": "2024-07-23" + } + } + ] + }, + { + "id": "meta-llama/meta-llama-3.1-8b-instruct-turbo", + "provider": "meta-llama", + "model": "meta-llama-3.1-8b-instruct-turbo", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "deepinfra", + "together_ai" + ], + "aliases": [ + "deepinfra/meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo", + "together_ai/meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "parallelFunctionCalling": true, + "responseSchema": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0.03 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.18, + "output": 0.18 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo", + "mode": "chat" + } + ] + }, + { + "id": "meta-llama/meta-llama-3.2-1b-instruct", + "provider": "meta-llama", + "model": "meta-llama-3.2-1b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "sambanova" + ], + "aliases": [ + "sambanova/Meta-Llama-3.2-1B-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "sambanova", + "model": "sambanova/Meta-Llama-3.2-1B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.08 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sambanova", + "model": "sambanova/Meta-Llama-3.2-1B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://cloud.sambanova.ai/plans/pricing" + } + } + ] + }, + { + "id": "meta-llama/meta-llama-3.2-3b-instruct", + "provider": "meta-llama", + "model": "meta-llama-3.2-3b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "sambanova" + ], + "aliases": [ + "sambanova/Meta-Llama-3.2-3B-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "sambanova", + "model": "sambanova/Meta-Llama-3.2-3B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.16 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sambanova", + "model": "sambanova/Meta-Llama-3.2-3B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://cloud.sambanova.ai/plans/pricing" + } + } + ] + }, + { + "id": "meta-llama/meta-llama-3.3-70b-instruct", + "provider": "meta-llama", + "model": "meta-llama-3.3-70b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "sambanova" + ], + "aliases": [ + "sambanova/Meta-Llama-3.3-70B-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "sambanova", + "model": "sambanova/Meta-Llama-3.3-70B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sambanova", + "model": "sambanova/Meta-Llama-3.3-70B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://cloud.sambanova.ai/plans/pricing" + } + } + ] + }, + { + "id": "meta-llama/meta-llama-guard-3-8b", + "provider": "meta-llama", + "model": "meta-llama-guard-3-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "sambanova" + ], + "aliases": [ + "sambanova/Meta-Llama-Guard-3-8B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "sambanova", + "model": "sambanova/Meta-Llama-Guard-3-8B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sambanova", + "model": "sambanova/Meta-Llama-Guard-3-8B", + "mode": "chat", + "metadata": { + "source": "https://cloud.sambanova.ai/plans/pricing" + } + } + ] + }, + { + "id": "minimax/minimax-01", + "provider": "minimax", + "model": "minimax-01", + "displayName": "MiniMax: MiniMax-01", + "family": "minimax", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "kilo/minimax/minimax-01", + "nano-gpt/minimax/minimax-01", + "openrouter/minimax/minimax-01" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1000192, + "inputTokens": 1000192, + "outputTokens": 1000192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "minimax/minimax-01", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.1 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "minimax/minimax-01", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1394, + "output": 1.1219999999999999 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "minimax/minimax-01", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.1 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "minimax/minimax-01", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 1.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax 01", + "MiniMax-01", + "MiniMax: MiniMax-01" + ], + "families": [ + "minimax" + ], + "knowledgeCutoff": "2024-03-31", + "releaseDate": "2025-01-15", + "lastUpdated": "2025-01-15", + "supportedParameters": [ + "max_tokens", + "temperature", + "top_p" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "minimax/minimax-01", + "modelKey": "minimax/minimax-01", + "displayName": "MiniMax: MiniMax-01", + "metadata": { + "lastUpdated": "2025-01-15", + "openWeights": true, + "releaseDate": "2025-01-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "minimax/minimax-01", + "modelKey": "minimax/minimax-01", + "displayName": "MiniMax 01", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-01-15", + "openWeights": false, + "releaseDate": "2025-01-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "minimax/minimax-01", + "modelKey": "minimax/minimax-01", + "displayName": "MiniMax-01", + "family": "minimax", + "metadata": { + "knowledgeCutoff": "2024-03-31", + "lastUpdated": "2025-01-15", + "openWeights": true, + "releaseDate": "2025-01-15" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "minimax/minimax-01", + "displayName": "MiniMax: MiniMax-01", + "metadata": { + "canonicalSlug": "minimax/minimax-01", + "createdAt": "2025-01-15T04:31:02.000Z", + "huggingFaceId": "MiniMaxAI/MiniMax-Text-01", + "knowledgeCutoff": "2024-03-31", + "links": { + "details": "/api/v1/models/minimax/minimax-01/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "temperature", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 1000192, + "max_completion_tokens": 1000192, + "is_moderated": false + } + } + } + ] + }, + { + "id": "minimax/minimax-latest", + "provider": "minimax", + "model": "minimax-latest", + "displayName": "MiniMax Latest", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/minimax/minimax-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512000, + "inputTokens": 512000, + "outputTokens": 80000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "minimax/minimax-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax Latest" + ], + "releaseDate": "2026-05-03", + "lastUpdated": "2026-05-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "minimax/minimax-latest", + "modelKey": "minimax/minimax-latest", + "displayName": "MiniMax Latest", + "metadata": { + "lastUpdated": "2026-05-03", + "openWeights": false, + "releaseDate": "2026-05-03" + } + } + ] + }, + { + "id": "minimax/minimax-m1", + "provider": "minimax", + "model": "minimax-m1", + "displayName": "MiniMax-M1", + "family": "minimax", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "kilo", + "nano-gpt", + "openrouter", + "qiniu-ai" + ], + "aliases": [ + "302ai/MiniMax-M1", + "kilo/minimax/minimax-m1", + "nano-gpt/MiniMax-M1", + "openrouter/minimax/minimax-m1", + "qiniu-ai/MiniMax-M1" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "MiniMax-M1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.132, + "output": 1.254 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "minimax/minimax-m1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "MiniMax-M1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1394, + "output": 1.3328 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "minimax/minimax-m1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "minimax/minimax-m1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 2.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M1", + "MiniMax-M1", + "MiniMax: MiniMax M1" + ], + "families": [ + "minimax" + ], + "knowledgeCutoff": "2024-06-30", + "releaseDate": "2025-06-16", + "lastUpdated": "2025-06-16", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "MiniMax-M1", + "modelKey": "MiniMax-M1", + "displayName": "MiniMax-M1", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-06-16", + "openWeights": false, + "releaseDate": "2025-06-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "minimax/minimax-m1", + "modelKey": "minimax/minimax-m1", + "displayName": "MiniMax: MiniMax M1", + "metadata": { + "lastUpdated": "2025-06-17", + "openWeights": true, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "MiniMax-M1", + "modelKey": "MiniMax-M1", + "displayName": "MiniMax M1", + "metadata": { + "lastUpdated": "2025-06-16", + "openWeights": false, + "releaseDate": "2025-06-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "minimax/minimax-m1", + "modelKey": "minimax/minimax-m1", + "displayName": "MiniMax M1", + "family": "minimax", + "metadata": { + "knowledgeCutoff": "2024-06-30", + "lastUpdated": "2025-06-17", + "openWeights": false, + "releaseDate": "2025-06-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "MiniMax-M1", + "modelKey": "MiniMax-M1", + "displayName": "MiniMax M1", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "minimax/minimax-m1", + "displayName": "MiniMax: MiniMax M1", + "metadata": { + "canonicalSlug": "minimax/minimax-m1", + "createdAt": "2025-06-17T22:46:54.000Z", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/minimax/minimax-m1/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 40000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "minimax/minimax-m1-80k", + "provider": "minimax", + "model": "minimax-m1-80k", + "displayName": "MiniMax M1", + "family": "minimax", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "fireworks_ai", + "jiekou", + "nano-gpt", + "novita", + "novita-ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/minimax-m1-80k", + "jiekou/minimaxai/minimax-m1-80k", + "nano-gpt/MiniMaxAI/MiniMax-M1-80k", + "novita-ai/minimaxai/minimax-m1-80k", + "novita/minimaxai/minimax-m1-80k" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 40000, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "functionCalling": true, + "parallelFunctionCalling": true, + "systemMessages": true, + "toolChoice": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "jiekou", + "model": "minimaxai/minimax-m1-80k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "MiniMaxAI/MiniMax-M1-80k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6052, + "output": 2.4225000000000003 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "minimaxai/minimax-m1-80k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.2 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/minimax-m1-80k", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/minimaxai/minimax-m1-80k", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.55, + "output": 2.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M1", + "MiniMax M1 80K" + ], + "families": [ + "minimax" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-01", + "lastUpdated": "2026-01", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "minimaxai/minimax-m1-80k", + "modelKey": "minimaxai/minimax-m1-80k", + "displayName": "MiniMax M1", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "MiniMaxAI/MiniMax-M1-80k", + "modelKey": "MiniMaxAI/MiniMax-M1-80k", + "displayName": "MiniMax M1 80K", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-06-16", + "openWeights": false, + "releaseDate": "2025-06-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "minimaxai/minimax-m1-80k", + "modelKey": "minimaxai/minimax-m1-80k", + "displayName": "MiniMax M1", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-06-17", + "openWeights": true, + "releaseDate": "2025-06-17" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/minimax-m1-80k", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/minimaxai/minimax-m1-80k", + "mode": "chat" + } + ] + }, + { + "id": "minimax/minimax-m2", + "provider": "minimax", + "model": "minimax-m2", + "displayName": "MiniMax-M2", + "family": "minimax", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "cortecs", + "fireworks_ai", + "kilo", + "llmgateway", + "merge-gateway", + "minimax", + "minimax-cn", + "minimax-cn-coding-plan", + "minimax-coding-plan", + "nano-gpt", + "novita", + "novita-ai", + "ollama-cloud", + "openrouter", + "qiniu-ai", + "synthetic", + "vercel", + "zenmux" + ], + "aliases": [ + "302ai/MiniMax-M2", + "cortecs/minimax-m2", + "fireworks_ai/accounts/fireworks/models/minimax-m2", + "kilo/minimax/minimax-m2", + "llmgateway/minimax-m2", + "merge-gateway/minimax/minimax-m2", + "minimax-cn-coding-plan/MiniMax-M2", + "minimax-cn/MiniMax-M2", + "minimax-coding-plan/MiniMax-M2", + "minimax/MiniMax-M2", + "nano-gpt/MiniMax-M2", + "novita-ai/minimax/minimax-m2", + "novita/minimax/minimax-m2", + "ollama-cloud/minimax-m2", + "openrouter/minimax/minimax-m2", + "qiniu-ai/minimax/minimax-m2", + "synthetic/hf:MiniMaxAI/MiniMax-M2", + "vercel/minimax/minimax-m2", + "zenmux/minimax/minimax-m2" + ], + "mergedProviderModelRecords": 19, + "limits": { + "contextTokens": 1000000, + "inputTokens": 204800, + "maxTokens": 204800, + "outputTokens": 400000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": false, + "interleaved": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "MiniMax-M2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.33, + "output": 1.32 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "minimax-m2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.39, + "output": 1.57 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "minimax/minimax-m2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.255, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "minimax-m2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "minimax/minimax-m2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "minimax-cn-coding-plan", + "model": "MiniMax-M2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "minimax-cn", + "model": "MiniMax-M2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "minimax-coding-plan", + "model": "MiniMax-M2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "minimax", + "model": "MiniMax-M2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "MiniMax-M2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.17, + "output": 1.53 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "minimax/minimax-m2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "minimax/minimax-m2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.255, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:MiniMaxAI/MiniMax-M2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.19 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "minimax/minimax-m2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "minimax/minimax-m2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.38, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/minimax-m2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "minimax", + "model": "minimax/MiniMax-M2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/minimax/minimax-m2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 1.2 + }, + "extra": { + "input_cost_per_token_cache_hit": 3e-8 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/minimax/minimax-m2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.255, + "output": 1.02 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "minimax/minimax-m2", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.255, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M2", + "MiniMax-M2", + "MiniMax: MiniMax M2", + "Minimax/Minimax-M2", + "minimax-m2" + ], + "families": [ + "minimax" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-11", + "releaseDate": "2025-10-26", + "lastUpdated": "2025-10-26", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 19 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "MiniMax-M2", + "modelKey": "MiniMax-M2", + "displayName": "MiniMax-M2", + "metadata": { + "lastUpdated": "2025-10-26", + "openWeights": false, + "releaseDate": "2025-10-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "minimax-m2", + "modelKey": "minimax-m2", + "displayName": "MiniMax-M2", + "family": "minimax", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2025-10-27", + "openWeights": true, + "releaseDate": "2025-10-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "minimax/minimax-m2", + "modelKey": "minimax/minimax-m2", + "displayName": "MiniMax: MiniMax M2", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-10-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "minimax-m2", + "modelKey": "minimax-m2", + "displayName": "MiniMax-M2", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-10-27", + "openWeights": true, + "releaseDate": "2025-10-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "minimax/minimax-m2", + "modelKey": "minimax/minimax-m2", + "displayName": "MiniMax-M2", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-10-27", + "openWeights": true, + "releaseDate": "2025-10-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-cn-coding-plan", + "providerName": "MiniMax Token Plan (minimaxi.com)", + "providerApi": "https://api.minimaxi.com/anthropic/v1", + "providerDoc": "https://platform.minimaxi.com/docs/token-plan/intro", + "model": "MiniMax-M2", + "modelKey": "MiniMax-M2", + "displayName": "MiniMax-M2", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-10-27", + "openWeights": true, + "releaseDate": "2025-10-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-cn", + "providerName": "MiniMax (minimaxi.com)", + "providerApi": "https://api.minimaxi.com/anthropic/v1", + "providerDoc": "https://platform.minimaxi.com/docs/guides/quickstart", + "model": "MiniMax-M2", + "modelKey": "MiniMax-M2", + "displayName": "MiniMax-M2", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-10-27", + "openWeights": true, + "releaseDate": "2025-10-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-coding-plan", + "providerName": "MiniMax Token Plan (minimax.io)", + "providerApi": "https://api.minimax.io/anthropic/v1", + "providerDoc": "https://platform.minimax.io/docs/token-plan/intro", + "model": "MiniMax-M2", + "modelKey": "MiniMax-M2", + "displayName": "MiniMax-M2", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-10-27", + "openWeights": true, + "releaseDate": "2025-10-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax", + "providerName": "MiniMax (minimax.io)", + "providerApi": "https://api.minimax.io/anthropic/v1", + "providerDoc": "https://platform.minimax.io/docs/guides/quickstart", + "model": "MiniMax-M2", + "modelKey": "MiniMax-M2", + "displayName": "MiniMax-M2", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-10-27", + "openWeights": true, + "releaseDate": "2025-10-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "MiniMax-M2", + "modelKey": "MiniMax-M2", + "displayName": "MiniMax M2", + "metadata": { + "lastUpdated": "2025-10-25", + "openWeights": false, + "releaseDate": "2025-10-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "minimax/minimax-m2", + "modelKey": "minimax/minimax-m2", + "displayName": "MiniMax-M2", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-10-27", + "openWeights": true, + "releaseDate": "2025-10-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "minimax-m2", + "modelKey": "minimax-m2", + "displayName": "minimax-m2", + "family": "minimax", + "status": "deprecated", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-10-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "minimax/minimax-m2", + "modelKey": "minimax/minimax-m2", + "displayName": "MiniMax-M2", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-10-27", + "openWeights": true, + "releaseDate": "2025-10-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "minimax/minimax-m2", + "modelKey": "minimax/minimax-m2", + "displayName": "Minimax/Minimax-M2", + "metadata": { + "lastUpdated": "2025-10-28", + "openWeights": false, + "releaseDate": "2025-10-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:MiniMaxAI/MiniMax-M2", + "modelKey": "hf:MiniMaxAI/MiniMax-M2", + "displayName": "MiniMax-M2", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-10-27", + "openWeights": true, + "releaseDate": "2025-10-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "minimax/minimax-m2", + "modelKey": "minimax/minimax-m2", + "displayName": "MiniMax M2", + "family": "minimax", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-10-27", + "openWeights": true, + "releaseDate": "2025-10-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "minimax/minimax-m2", + "modelKey": "minimax/minimax-m2", + "displayName": "MiniMax M2", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-10-27", + "openWeights": false, + "releaseDate": "2025-10-27" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/minimax-m2", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "minimax", + "model": "minimax/MiniMax-M2", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/minimax/minimax-m2", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/minimax/minimax-m2", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "minimax/minimax-m2", + "displayName": "MiniMax: MiniMax M2", + "metadata": { + "canonicalSlug": "minimax/minimax-m2", + "createdAt": "2025-10-23T20:41:33.000Z", + "huggingFaceId": "MiniMaxAI/MiniMax-M2", + "links": { + "details": "/api/v1/models/minimax/minimax-m2/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 196608, + "max_completion_tokens": 196608, + "is_moderated": false + } + } + } + ] + }, + { + "id": "minimax/minimax-m2-5", + "provider": "minimax", + "model": "minimax-m2-5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "sources": [ + "models.dev" + ], + "providers": [ + "frogbot" + ], + "aliases": [ + "frogbot/minimax-m2-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 192000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "frogbot", + "model": "minimax-m2-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax-M2.5" + ], + "families": [ + "minimax" + ], + "knowledgeCutoff": "2024-09", + "releaseDate": "2025-01-15", + "lastUpdated": "2025-02-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "minimax-m2-5", + "modelKey": "minimax-m2-5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2025-02-22", + "openWeights": false, + "releaseDate": "2025-01-15" + } + } + ] + }, + { + "id": "minimax/minimax-m2-5-high-throughput", + "provider": "minimax", + "model": "minimax-m2-5-high-throughput", + "displayName": "MiniMax-M2.5 High Throughput", + "family": "minimax", + "sources": [ + "models.dev" + ], + "providers": [ + "clarifai" + ], + "aliases": [ + "clarifai/minimaxai/chat-completion/models/MiniMax-M2_5-high-throughput" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "clarifai", + "model": "minimaxai/chat-completion/models/MiniMax-M2_5-high-throughput", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax-M2.5 High Throughput" + ], + "families": [ + "minimax" + ], + "releaseDate": "2026-02-12", + "lastUpdated": "2026-02-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "clarifai", + "providerName": "Clarifai", + "providerApi": "https://api.clarifai.com/v2/ext/openai/v1", + "providerDoc": "https://docs.clarifai.com/compute/inference/", + "model": "minimaxai/chat-completion/models/MiniMax-M2_5-high-throughput", + "modelKey": "minimaxai/chat-completion/models/MiniMax-M2_5-high-throughput", + "displayName": "MiniMax-M2.5 High Throughput", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-25", + "openWeights": true, + "releaseDate": "2026-02-12" + } + } + ] + }, + { + "id": "minimax/minimax-m2-7", + "provider": "minimax", + "model": "minimax-m2-7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "sources": [ + "models.dev" + ], + "providers": [ + "auriko", + "frogbot" + ], + "aliases": [ + "auriko/minimax-m2-7", + "frogbot/minimax-m2-7" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 204800, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "auriko", + "model": "minimax-m2-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "frogbot", + "model": "minimax-m2-7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax-M2.7" + ], + "families": [ + "minimax" + ], + "knowledgeCutoff": "2024-09", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "auriko", + "providerName": "Auriko", + "providerApi": "https://api.auriko.ai/v1", + "providerDoc": "https://docs.auriko.ai", + "model": "minimax-m2-7", + "modelKey": "minimax-m2-7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "minimax-m2-7", + "modelKey": "minimax-m2-7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "minimax/minimax-m2-7-highspeed", + "provider": "minimax", + "model": "minimax-m2-7-highspeed", + "displayName": "MiniMax-M2.7-highspeed", + "family": "minimax", + "sources": [ + "models.dev" + ], + "providers": [ + "auriko" + ], + "aliases": [ + "auriko/minimax-m2-7-highspeed" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "auriko", + "model": "minimax-m2-7-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 0.375, + "input": 0.6, + "output": 2.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax-M2.7-highspeed" + ], + "families": [ + "minimax" + ], + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "auriko", + "providerName": "Auriko", + "providerApi": "https://api.auriko.ai/v1", + "providerDoc": "https://docs.auriko.ai", + "model": "minimax-m2-7-highspeed", + "modelKey": "minimax-m2-7-highspeed", + "displayName": "MiniMax-M2.7-highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "minimax/minimax-m2-her", + "provider": "minimax", + "model": "minimax-m2-her", + "displayName": "MiniMax: MiniMax M2-her", + "family": "minimax", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "kilo/minimax/minimax-m2-her", + "nano-gpt/minimax/minimax-m2-her", + "openrouter/minimax/minimax-m2-her" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 65536, + "inputTokens": 65532, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "minimax/minimax-m2-her", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "minimax/minimax-m2-her", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.30200000000000005, + "output": 1.2069999999999999 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "minimax/minimax-m2-her", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "minimax/minimax-m2-her", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M2-her", + "MiniMax: MiniMax M2-her" + ], + "families": [ + "minimax" + ], + "releaseDate": "2026-01-23", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "max_tokens", + "temperature", + "top_p" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "minimax/minimax-m2-her", + "modelKey": "minimax/minimax-m2-her", + "displayName": "MiniMax: MiniMax M2-her", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2026-01-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "minimax/minimax-m2-her", + "modelKey": "minimax/minimax-m2-her", + "displayName": "MiniMax M2-her", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-01-24", + "openWeights": false, + "releaseDate": "2026-01-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "minimax/minimax-m2-her", + "modelKey": "minimax/minimax-m2-her", + "displayName": "MiniMax M2-her", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-01-23", + "openWeights": false, + "releaseDate": "2026-01-23" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "minimax/minimax-m2-her", + "displayName": "MiniMax: MiniMax M2-her", + "metadata": { + "canonicalSlug": "minimax/minimax-m2-her-20260123", + "createdAt": "2026-01-23T14:07:19.000Z", + "links": { + "details": "/api/v1/models/minimax/minimax-m2-her-20260123/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "temperature", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 65536, + "max_completion_tokens": 2048, + "is_moderated": false + } + } + } + ] + }, + { + "id": "minimax/minimax-m2-maas", + "provider": "minimax", + "model": "minimax-m2-maas", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-minimax_models" + ], + "aliases": [ + "vertex_ai-minimax_models/vertex_ai/minimaxai/minimax-m2-maas" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 196608, + "inputTokens": 196608, + "maxTokens": 196608, + "outputTokens": 196608, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-minimax_models", + "model": "vertex_ai/minimaxai/minimax-m2-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-minimax_models", + "model": "vertex_ai/minimaxai/minimax-m2-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#partner-models" + } + } + ] + }, + { + "id": "minimax/minimax-m2.1", + "provider": "minimax", + "model": "minimax-m2.1", + "displayName": "MiniMax-M2.1", + "family": "minimax", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "cortecs", + "gmi", + "huggingface", + "jiekou", + "kilo", + "llmgateway", + "meganova", + "merge-gateway", + "minimax", + "minimax-cn", + "minimax-cn-coding-plan", + "minimax-coding-plan", + "moark", + "nano-gpt", + "novita", + "novita-ai", + "ollama-cloud", + "opencode", + "openrouter", + "poe", + "qiniu-ai", + "siliconflow-cn", + "synthetic", + "vercel", + "zenmux" + ], + "aliases": [ + "302ai/MiniMax-M2.1", + "cortecs/minimax-m2.1", + "gmi/MiniMaxAI/MiniMax-M2.1", + "huggingface/MiniMaxAI/MiniMax-M2.1", + "jiekou/minimax/minimax-m2.1", + "kilo/minimax/minimax-m2.1", + "llmgateway/minimax-m2.1", + "meganova/MiniMaxAI/MiniMax-M2.1", + "merge-gateway/minimax/minimax-m2.1", + "minimax-cn-coding-plan/MiniMax-M2.1", + "minimax-cn/MiniMax-M2.1", + "minimax-coding-plan/MiniMax-M2.1", + "minimax/MiniMax-M2.1", + "moark/MiniMax-M2.1", + "nano-gpt/minimax/minimax-m2.1", + "novita-ai/minimax/minimax-m2.1", + "novita/minimax/minimax-m2.1", + "ollama-cloud/minimax-m2.1", + "opencode/minimax-m2.1", + "openrouter/minimax/minimax-m2.1", + "poe/novita/minimax-m2.1", + "qiniu-ai/minimax/minimax-m2.1", + "siliconflow-cn/Pro/MiniMaxAI/MiniMax-M2.1", + "synthetic/hf:MiniMaxAI/MiniMax-M2.1", + "vercel/minimax/minimax-m2.1", + "zenmux/minimax/minimax-m2.1" + ], + "mergedProviderModelRecords": 26, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 131072, + "outputTokens": 196608, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "supports1MContext": true, + "structuredOutput": true, + "computerUse": false, + "vision": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": false, + "interleaved": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "MiniMax-M2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "minimax-m2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.34, + "output": 1.34 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "MiniMaxAI/MiniMax-M2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "minimax/minimax-m2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "minimax/minimax-m2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.27, + "output": 0.95 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "minimax-m2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "MiniMaxAI/MiniMax-M2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.28, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "minimax/minimax-m2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "minimax-cn-coding-plan", + "model": "MiniMax-M2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "minimax-cn", + "model": "MiniMax-M2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "minimax-coding-plan", + "model": "MiniMax-M2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "minimax", + "model": "MiniMax-M2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "moark", + "model": "MiniMax-M2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.1, + "output": 8.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "minimax/minimax-m2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.33, + "output": 1.32 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "minimax/minimax-m2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "minimax-m2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "minimax/minimax-m2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.29, + "output": 0.95 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Pro/MiniMaxAI/MiniMax-M2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:MiniMaxAI/MiniMax-M2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.19 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "minimax/minimax-m2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "minimax/minimax-m2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.38, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "gmi", + "model": "gmi/MiniMaxAI/MiniMax-M2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "minimax", + "model": "minimax/MiniMax-M2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/minimax/minimax-m2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 1.2 + }, + "extra": { + "input_cost_per_token_cache_hit": 3e-8 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/minimax/minimax-m2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0.27, + "output": 1.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "minimax/minimax-m2.1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.29, + "output": 0.95 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M2.1", + "MiniMax-M2.1", + "MiniMax: MiniMax M2.1", + "Minimax M2.1", + "Minimax/Minimax-M2.1", + "Pro/MiniMaxAI/MiniMax-M2.1", + "minimax-m2.1" + ], + "families": [ + "minimax" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-10", + "releaseDate": "2025-12-19", + "lastUpdated": "2025-12-19", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 26 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "MiniMax-M2.1", + "modelKey": "MiniMax-M2.1", + "displayName": "MiniMax-M2.1", + "metadata": { + "lastUpdated": "2025-12-19", + "openWeights": false, + "releaseDate": "2025-12-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "minimax-m2.1", + "modelKey": "minimax-m2.1", + "displayName": "MiniMax-M2.1", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "MiniMaxAI/MiniMax-M2.1", + "modelKey": "MiniMaxAI/MiniMax-M2.1", + "displayName": "MiniMax-M2.1", + "family": "minimax", + "metadata": { + "knowledgeCutoff": "2025-10", + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "minimax/minimax-m2.1", + "modelKey": "minimax/minimax-m2.1", + "displayName": "Minimax M2.1", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024, + "max": 131071 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "minimax/minimax-m2.1", + "modelKey": "minimax/minimax-m2.1", + "displayName": "MiniMax: MiniMax M2.1", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "minimax-m2.1", + "modelKey": "minimax-m2.1", + "displayName": "MiniMax-M2.1", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "MiniMaxAI/MiniMax-M2.1", + "modelKey": "MiniMaxAI/MiniMax-M2.1", + "displayName": "MiniMax M2.1", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "minimax/minimax-m2.1", + "modelKey": "minimax/minimax-m2.1", + "displayName": "MiniMax-M2.1", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-cn-coding-plan", + "providerName": "MiniMax Token Plan (minimaxi.com)", + "providerApi": "https://api.minimaxi.com/anthropic/v1", + "providerDoc": "https://platform.minimaxi.com/docs/token-plan/intro", + "model": "MiniMax-M2.1", + "modelKey": "MiniMax-M2.1", + "displayName": "MiniMax-M2.1", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-cn", + "providerName": "MiniMax (minimaxi.com)", + "providerApi": "https://api.minimaxi.com/anthropic/v1", + "providerDoc": "https://platform.minimaxi.com/docs/guides/quickstart", + "model": "MiniMax-M2.1", + "modelKey": "MiniMax-M2.1", + "displayName": "MiniMax-M2.1", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-coding-plan", + "providerName": "MiniMax Token Plan (minimax.io)", + "providerApi": "https://api.minimax.io/anthropic/v1", + "providerDoc": "https://platform.minimax.io/docs/token-plan/intro", + "model": "MiniMax-M2.1", + "modelKey": "MiniMax-M2.1", + "displayName": "MiniMax-M2.1", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax", + "providerName": "MiniMax (minimax.io)", + "providerApi": "https://api.minimax.io/anthropic/v1", + "providerDoc": "https://platform.minimax.io/docs/guides/quickstart", + "model": "MiniMax-M2.1", + "modelKey": "MiniMax-M2.1", + "displayName": "MiniMax-M2.1", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moark", + "providerName": "Moark", + "providerApi": "https://moark.com/v1", + "providerDoc": "https://moark.com/docs/openapi/v1#tag/%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90", + "model": "MiniMax-M2.1", + "modelKey": "MiniMax-M2.1", + "displayName": "MiniMax-M2.1", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "minimax/minimax-m2.1", + "modelKey": "minimax/minimax-m2.1", + "displayName": "MiniMax M2.1", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-12-19", + "openWeights": false, + "releaseDate": "2025-12-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "minimax/minimax-m2.1", + "modelKey": "minimax/minimax-m2.1", + "displayName": "Minimax M2.1", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "minimax-m2.1", + "modelKey": "minimax-m2.1", + "displayName": "minimax-m2.1", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "minimax-m2.1", + "modelKey": "minimax-m2.1", + "displayName": "MiniMax M2.1", + "family": "minimax", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "minimax/minimax-m2.1", + "modelKey": "minimax/minimax-m2.1", + "displayName": "MiniMax-M2.1", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "novita/minimax-m2.1", + "modelKey": "novita/minimax-m2.1", + "displayName": "minimax-m2.1", + "metadata": { + "lastUpdated": "2025-12-26", + "openWeights": false, + "releaseDate": "2025-12-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "minimax/minimax-m2.1", + "modelKey": "minimax/minimax-m2.1", + "displayName": "Minimax/Minimax-M2.1", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": false, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Pro/MiniMaxAI/MiniMax-M2.1", + "modelKey": "Pro/MiniMaxAI/MiniMax-M2.1", + "displayName": "Pro/MiniMaxAI/MiniMax-M2.1", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": false, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:MiniMaxAI/MiniMax-M2.1", + "modelKey": "hf:MiniMaxAI/MiniMax-M2.1", + "displayName": "MiniMax-M2.1", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "minimax/minimax-m2.1", + "modelKey": "minimax/minimax-m2.1", + "displayName": "MiniMax M2.1", + "family": "minimax", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-12-23", + "openWeights": false, + "releaseDate": "2025-10-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "minimax/minimax-m2.1", + "modelKey": "minimax/minimax-m2.1", + "displayName": "MiniMax M2.1", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-12-22", + "openWeights": false, + "releaseDate": "2025-12-22" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gmi", + "model": "gmi/MiniMaxAI/MiniMax-M2.1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "minimax", + "model": "minimax/MiniMax-M2.1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/minimax/minimax-m2.1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/minimax/minimax-m2.1", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "minimax/minimax-m2.1", + "displayName": "MiniMax: MiniMax M2.1", + "metadata": { + "canonicalSlug": "minimax/minimax-m2.1", + "createdAt": "2025-12-23T01:56:37.000Z", + "huggingFaceId": "MiniMaxAI/MiniMax-M2.1", + "links": { + "details": "/api/v1/models/minimax/minimax-m2.1/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 196608, + "max_completion_tokens": 196608, + "is_moderated": false + } + } + } + ] + }, + { + "id": "minimax/minimax-m2.1-free", + "provider": "minimax", + "model": "minimax-m2.1-free", + "displayName": "MiniMax M2.1 Free", + "family": "minimax-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/minimax-m2.1-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "minimax-m2.1-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M2.1 Free" + ], + "families": [ + "minimax-free" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-12-23", + "lastUpdated": "2025-12-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "minimax-m2.1-free", + "modelKey": "minimax-m2.1-free", + "displayName": "MiniMax M2.1 Free", + "family": "minimax-free", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + } + ] + }, + { + "id": "minimax/minimax-m2.1-lightning", + "provider": "minimax", + "model": "minimax-m2.1-lightning", + "displayName": "MiniMax M2.1 Lightning", + "family": "minimax", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "llmgateway", + "minimax", + "vercel" + ], + "aliases": [ + "llmgateway/minimax-m2.1-lightning", + "minimax/MiniMax-M2.1-lightning", + "vercel/minimax/minimax-m2.1-lightning" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": true, + "attachments": false, + "openWeights": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "minimax-m2.1-lightning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.48 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "minimax/minimax-m2.1-lightning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 2.4 + } + }, + { + "source": "litellm", + "provider": "minimax", + "model": "minimax/MiniMax-M2.1-lightning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 2.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M2.1 Lightning" + ], + "families": [ + "minimax" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-12-23", + "lastUpdated": "2025-12-23", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "minimax-m2.1-lightning", + "modelKey": "minimax-m2.1-lightning", + "displayName": "MiniMax M2.1 Lightning", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "minimax/minimax-m2.1-lightning", + "modelKey": "minimax/minimax-m2.1-lightning", + "displayName": "MiniMax M2.1 Lightning", + "family": "minimax", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-10-27", + "openWeights": false, + "releaseDate": "2025-10-27" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "minimax", + "model": "minimax/MiniMax-M2.1-lightning", + "mode": "chat" + } + ] + }, + { + "id": "minimax/minimax-m2.5", + "provider": "minimax", + "model": "minimax-m2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba-cn", + "alibaba-coding-plan", + "alibaba-coding-plan-cn", + "alibaba-token-plan", + "alibaba-token-plan-cn", + "baseten", + "cloudferro-sherlock", + "cortecs", + "crof", + "deepinfra", + "digitalocean", + "dinference", + "friendli", + "hpc-ai", + "huggingface", + "inceptron", + "kilo", + "llmgateway", + "meganova", + "merge-gateway", + "minimax", + "minimax-cn", + "minimax-cn-coding-plan", + "minimax-coding-plan", + "nano-gpt", + "nebius", + "novita-ai", + "ollama-cloud", + "opencode", + "opencode-go", + "openrouter", + "orcarouter", + "qiniu-ai", + "regolo-ai", + "routing-run", + "siliconflow", + "siliconflow-cn", + "synthetic", + "tencent-coding-plan", + "togetherai", + "vercel", + "wandb", + "zenmux" + ], + "aliases": [ + "alibaba-cn/MiniMax-M2.5", + "alibaba-coding-plan-cn/MiniMax-M2.5", + "alibaba-coding-plan/MiniMax-M2.5", + "alibaba-token-plan-cn/MiniMax-M2.5", + "alibaba-token-plan/MiniMax-M2.5", + "baseten/MiniMaxAI/MiniMax-M2.5", + "cloudferro-sherlock/MiniMaxAI/MiniMax-M2.5", + "cortecs/minimax-m2.5", + "crof/minimax-m2.5", + "deepinfra/MiniMaxAI/MiniMax-M2.5", + "digitalocean/minimax-m2.5", + "dinference/minimax-m2.5", + "friendli/MiniMaxAI/MiniMax-M2.5", + "hpc-ai/minimax/minimax-m2.5", + "huggingface/MiniMaxAI/MiniMax-M2.5", + "inceptron/MiniMaxAI/MiniMax-M2.5", + "kilo/minimax/minimax-m2.5", + "llmgateway/minimax-m2.5", + "meganova/MiniMaxAI/MiniMax-M2.5", + "merge-gateway/minimax/minimax-m2.5", + "minimax-cn-coding-plan/MiniMax-M2.5", + "minimax-cn/MiniMax-M2.5", + "minimax-coding-plan/MiniMax-M2.5", + "minimax/MiniMax-M2.5", + "nano-gpt/TEE/minimax-m2.5", + "nano-gpt/minimax/minimax-m2.5", + "nebius/MiniMaxAI/MiniMax-M2.5", + "novita-ai/minimax/minimax-m2.5", + "ollama-cloud/minimax-m2.5", + "opencode-go/minimax-m2.5", + "opencode/minimax-m2.5", + "openrouter/minimax/minimax-m2.5", + "orcarouter/minimax/minimax-m2.5", + "qiniu-ai/minimax/minimax-m2.5", + "regolo-ai/minimax-m2.5", + "routing-run/route/minimax-m2.5", + "siliconflow-cn/Pro/MiniMaxAI/MiniMax-M2.5", + "siliconflow/MiniMaxAI/MiniMax-M2.5", + "synthetic/hf:MiniMaxAI/MiniMax-M2.5", + "tencent-coding-plan/minimax-m2.5", + "togetherai/MiniMaxAI/MiniMax-M2.5", + "vercel/minimax/minimax-m2.5", + "wandb/MiniMaxAI/MiniMax-M2.5", + "zenmux/minimax/minimax-m2.5" + ], + "mergedProviderModelRecords": 44, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 197000, + "outputTokens": 204000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "supports1MContext": true, + "structuredOutput": true, + "computerUse": false, + "vision": false, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan-cn", + "model": "MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan", + "model": "MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "baseten", + "model": "MiniMaxAI/MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "cloudferro-sherlock", + "model": "MiniMaxAI/MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.32, + "output": 1.18 + } + }, + { + "source": "models.dev", + "provider": "crof", + "model": "minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "cacheWrite": 0.375, + "input": 0.11, + "output": 0.95 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "MiniMaxAI/MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.15, + "output": 1.15 + } + }, + { + "source": "models.dev", + "provider": "digitalocean", + "model": "minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "dinference", + "model": "minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.22, + "output": 0.88 + } + }, + { + "source": "models.dev", + "provider": "friendli", + "model": "MiniMaxAI/MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "hpc-ai", + "model": "minimax/minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "MiniMaxAI/MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "inceptron", + "model": "MiniMaxAI/MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0, + "input": 0.24, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "minimax/minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.029, + "input": 0.25, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "MiniMaxAI/MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "minimax/minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "minimax-cn-coding-plan", + "model": "MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "minimax-cn", + "model": "MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "minimax-coding-plan", + "model": "MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "minimax", + "model": "MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "minimax/minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.38 + } + }, + { + "source": "models.dev", + "provider": "nebius", + "model": "MiniMaxAI/MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "minimax/minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "opencode-go", + "model": "minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "minimax/minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.15, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "minimax/minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "regolo-ai", + "model": "minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 3.5 + } + }, + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.193, + "output": 1.238 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Pro/MiniMaxAI/MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.22 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "MiniMaxAI/MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:MiniMaxAI/MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.6, + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "tencent-coding-plan", + "model": "minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "MiniMaxAI/MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "minimax/minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "wandb", + "model": "MiniMaxAI/MiniMax-M2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "minimax/minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "baseten", + "model": "baseten/MiniMaxAI/MiniMax-M2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "minimax", + "model": "minimax/MiniMax-M2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/minimax/minimax-m2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.3, + "output": 1.1 + } + }, + { + "source": "litellm", + "provider": "wandb", + "model": "wandb/MiniMaxAI/MiniMax-M2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "minimax/minimax-m2.5", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.15, + "output": 0.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax 2.5", + "MiniMax M2.5", + "MiniMax M2.5 TEE", + "MiniMax-M2.5", + "MiniMax: MiniMax M2.5", + "MiniMaxAI/MiniMax-M2.5", + "Minimax/Minimax-M2.5", + "Pro/MiniMaxAI/MiniMax-M2.5", + "minimax-m2.5" + ], + "families": [ + "minimax", + "minimax-m2.5" + ], + "modes": [ + "chat" + ], + "statuses": [ + "beta", + "deprecated" + ], + "knowledgeCutoff": "2026-01", + "releaseDate": "2026-02-12", + "lastUpdated": "2026-02-12", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "parallel_tool_calls", + "presence_penalty", + "reasoning", + "reasoning_effort", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 44 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "MiniMax-M2.5", + "modelKey": "MiniMax-M2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan-cn", + "providerName": "Alibaba Coding Plan (China)", + "providerApi": "https://coding.dashscope.aliyuncs.com/v1", + "providerDoc": "https://help.aliyun.com/zh/model-studio/coding-plan", + "model": "MiniMax-M2.5", + "modelKey": "MiniMax-M2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan", + "providerName": "Alibaba Coding Plan", + "providerApi": "https://coding-intl.dashscope.aliyuncs.com/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/coding-plan", + "model": "MiniMax-M2.5", + "modelKey": "MiniMax-M2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "MiniMax-M2.5", + "modelKey": "MiniMax-M2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "MiniMax-M2.5", + "modelKey": "MiniMax-M2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "baseten", + "providerName": "Baseten", + "providerApi": "https://inference.baseten.co/v1", + "providerDoc": "https://docs.baseten.co/inference/model-apis/overview", + "model": "MiniMaxAI/MiniMax-M2.5", + "modelKey": "MiniMaxAI/MiniMax-M2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2026-01", + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudferro-sherlock", + "providerName": "CloudFerro Sherlock", + "providerApi": "https://api-sherlock.cloudferro.com/openai/v1/", + "providerDoc": "https://docs.sherlock.cloudferro.com/", + "model": "MiniMaxAI/MiniMax-M2.5", + "modelKey": "MiniMaxAI/MiniMax-M2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "knowledgeCutoff": "2026-01", + "lastUpdated": "2026-03-05", + "openWeights": true, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "minimax-m2.5", + "modelKey": "minimax-m2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "minimax-m2.5", + "modelKey": "minimax-m2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "MiniMaxAI/MiniMax-M2.5", + "modelKey": "MiniMaxAI/MiniMax-M2.5", + "displayName": "MiniMax M2.5", + "family": "minimax", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "minimax-m2.5", + "modelKey": "minimax-m2.5", + "displayName": "MiniMax M2.5", + "family": "minimax-m2.5", + "status": "beta", + "metadata": { + "knowledgeCutoff": "2025-08", + "lastUpdated": "2026-04-16", + "openWeights": true, + "releaseDate": "2026-02-12", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "dinference", + "providerName": "DInference", + "providerApi": "https://api.dinference.com/v1", + "providerDoc": "https://dinference.com", + "model": "minimax-m2.5", + "modelKey": "minimax-m2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "friendli", + "providerName": "Friendli", + "providerApi": "https://api.friendli.ai/serverless/v1", + "providerDoc": "https://friendli.ai/docs/guides/serverless_endpoints/introduction", + "model": "MiniMaxAI/MiniMax-M2.5", + "modelKey": "MiniMaxAI/MiniMax-M2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "hpc-ai", + "providerName": "HPC-AI", + "providerApi": "https://api.hpc-ai.com/inference/v1", + "providerDoc": "https://www.hpc-ai.com/doc/docs/quickstart/", + "model": "minimax/minimax-m2.5", + "modelKey": "minimax/minimax-m2.5", + "displayName": "MiniMax M2.5", + "family": "minimax-m2.5", + "metadata": { + "lastUpdated": "2026-06-01", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "MiniMaxAI/MiniMax-M2.5", + "modelKey": "MiniMaxAI/MiniMax-M2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "inceptron", + "providerName": "Inceptron", + "providerApi": "https://api.inceptron.io/v1", + "providerDoc": "https://docs.inceptron.io", + "model": "MiniMaxAI/MiniMax-M2.5", + "modelKey": "MiniMaxAI/MiniMax-M2.5", + "displayName": "MiniMax M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "minimax/minimax-m2.5", + "modelKey": "minimax/minimax-m2.5", + "displayName": "MiniMax: MiniMax M2.5", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "minimax-m2.5", + "modelKey": "minimax-m2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "MiniMaxAI/MiniMax-M2.5", + "modelKey": "MiniMaxAI/MiniMax-M2.5", + "displayName": "MiniMax M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "minimax/minimax-m2.5", + "modelKey": "minimax/minimax-m2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-cn-coding-plan", + "providerName": "MiniMax Token Plan (minimaxi.com)", + "providerApi": "https://api.minimaxi.com/anthropic/v1", + "providerDoc": "https://platform.minimaxi.com/docs/token-plan/intro", + "model": "MiniMax-M2.5", + "modelKey": "MiniMax-M2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-cn", + "providerName": "MiniMax (minimaxi.com)", + "providerApi": "https://api.minimaxi.com/anthropic/v1", + "providerDoc": "https://platform.minimaxi.com/docs/guides/quickstart", + "model": "MiniMax-M2.5", + "modelKey": "MiniMax-M2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-coding-plan", + "providerName": "MiniMax Token Plan (minimax.io)", + "providerApi": "https://api.minimax.io/anthropic/v1", + "providerDoc": "https://platform.minimax.io/docs/token-plan/intro", + "model": "MiniMax-M2.5", + "modelKey": "MiniMax-M2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax", + "providerName": "MiniMax (minimax.io)", + "providerApi": "https://api.minimax.io/anthropic/v1", + "providerDoc": "https://platform.minimax.io/docs/guides/quickstart", + "model": "MiniMax-M2.5", + "modelKey": "MiniMax-M2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "minimax/minimax-m2.5", + "modelKey": "minimax/minimax-m2.5", + "displayName": "MiniMax M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": false, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/minimax-m2.5", + "modelKey": "TEE/minimax-m2.5", + "displayName": "MiniMax M2.5 TEE", + "metadata": { + "lastUpdated": "2026-04-20", + "openWeights": false, + "releaseDate": "2026-04-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "MiniMaxAI/MiniMax-M2.5", + "modelKey": "MiniMaxAI/MiniMax-M2.5", + "displayName": "MiniMax-M2.5", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-07", + "openWeights": true, + "releaseDate": "2025-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "minimax/minimax-m2.5", + "modelKey": "minimax/minimax-m2.5", + "displayName": "MiniMax M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": false, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "minimax-m2.5", + "modelKey": "minimax-m2.5", + "displayName": "minimax-m2.5", + "family": "minimax", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "minimax-m2.5", + "modelKey": "minimax-m2.5", + "displayName": "MiniMax M2.5", + "family": "minimax-m2.5", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "minimax-m2.5", + "modelKey": "minimax-m2.5", + "displayName": "MiniMax M2.5", + "family": "minimax", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "minimax/minimax-m2.5", + "modelKey": "minimax/minimax-m2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "minimax/minimax-m2.5", + "modelKey": "minimax/minimax-m2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "minimax/minimax-m2.5", + "modelKey": "minimax/minimax-m2.5", + "displayName": "Minimax/Minimax-M2.5", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": false, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "regolo-ai", + "providerName": "Regolo AI", + "providerApi": "https://api.regolo.ai/v1", + "providerDoc": "https://docs.regolo.ai/", + "model": "minimax-m2.5", + "modelKey": "minimax-m2.5", + "displayName": "MiniMax 2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-10", + "openWeights": false, + "releaseDate": "2026-03-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/minimax-m2.5", + "modelKey": "route/minimax-m2.5", + "displayName": "MiniMax M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Pro/MiniMaxAI/MiniMax-M2.5", + "modelKey": "Pro/MiniMaxAI/MiniMax-M2.5", + "displayName": "Pro/MiniMaxAI/MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-13", + "openWeights": false, + "releaseDate": "2026-02-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "MiniMaxAI/MiniMax-M2.5", + "modelKey": "MiniMaxAI/MiniMax-M2.5", + "displayName": "MiniMaxAI/MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-06-15", + "openWeights": false, + "releaseDate": "2026-02-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:MiniMaxAI/MiniMax-M2.5", + "modelKey": "hf:MiniMaxAI/MiniMax-M2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-07", + "openWeights": true, + "releaseDate": "2026-02-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "tencent-coding-plan", + "providerName": "Tencent Coding Plan (China)", + "providerApi": "https://api.lkeap.cloud.tencent.com/coding/v3", + "providerDoc": "https://cloud.tencent.com/document/product/1772/128947", + "model": "minimax-m2.5", + "modelKey": "minimax-m2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "MiniMaxAI/MiniMax-M2.5", + "modelKey": "MiniMaxAI/MiniMax-M2.5", + "displayName": "MiniMax-M2.5", + "family": "minimax", + "status": "deprecated", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "minimax/minimax-m2.5", + "modelKey": "minimax/minimax-m2.5", + "displayName": "MiniMax M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": false, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "MiniMaxAI/MiniMax-M2.5", + "modelKey": "MiniMaxAI/MiniMax-M2.5", + "displayName": "MiniMax M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "minimax/minimax-m2.5", + "modelKey": "minimax/minimax-m2.5", + "displayName": "MiniMax M2.5", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-02-13", + "openWeights": false, + "releaseDate": "2026-02-13" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "baseten", + "model": "baseten/MiniMaxAI/MiniMax-M2.5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "minimax", + "model": "minimax/MiniMax-M2.5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/minimax/minimax-m2.5", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/minimax/minimax-m2.5" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "wandb", + "model": "wandb/MiniMaxAI/MiniMax-M2.5", + "mode": "chat", + "metadata": { + "source": "https://wandb.ai/inference/coreweave/cw_MiniMaxAI_MiniMax-M2.5" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "minimax/minimax-m2.5", + "displayName": "MiniMax: MiniMax M2.5", + "metadata": { + "canonicalSlug": "minimax/minimax-m2.5-20260211", + "createdAt": "2026-02-12T15:01:42.000Z", + "huggingFaceId": "MiniMaxAI/MiniMax-M2.5", + "links": { + "details": "/api/v1/models/minimax/minimax-m2.5-20260211/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "parallel_tool_calls", + "presence_penalty", + "reasoning", + "reasoning_effort", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 196608, + "max_completion_tokens": 196608, + "is_moderated": false + } + } + } + ] + }, + { + "id": "minimax/minimax-m2.5-fast", + "provider": "minimax", + "model": "minimax-m2.5-fast", + "displayName": "MiniMax-M2.5-fast", + "sources": [ + "models.dev" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/MiniMaxAI/MiniMax-M2.5-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 7000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nebius", + "model": "MiniMaxAI/MiniMax-M2.5-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax-M2.5-fast" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-01-20", + "lastUpdated": "2026-05-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "MiniMaxAI/MiniMax-M2.5-fast", + "modelKey": "MiniMaxAI/MiniMax-M2.5-fast", + "displayName": "MiniMax-M2.5-fast", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-07", + "openWeights": true, + "releaseDate": "2025-01-20" + } + } + ] + }, + { + "id": "minimax/minimax-m2.5-free", + "provider": "minimax", + "model": "minimax-m2.5-free", + "displayName": "MiniMax M2.5 Free", + "family": "minimax-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/minimax-m2.5-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "minimax-m2.5-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M2.5 Free" + ], + "families": [ + "minimax-free" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-02-12", + "lastUpdated": "2026-02-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "minimax-m2.5-free", + "modelKey": "minimax-m2.5-free", + "displayName": "MiniMax M2.5 Free", + "family": "minimax-free", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + } + ] + }, + { + "id": "minimax/minimax-m2.5-highspeed", + "provider": "minimax", + "model": "minimax-m2.5-highspeed", + "displayName": "MiniMax-M2.5-highspeed", + "family": "minimax", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway", + "merge-gateway", + "minimax", + "minimax-cn", + "minimax-cn-coding-plan", + "minimax-coding-plan", + "novita-ai", + "orcarouter", + "qiniu-ai", + "routing-run", + "vercel" + ], + "aliases": [ + "llmgateway/minimax-m2.5-highspeed", + "merge-gateway/minimax/minimax-m2.5-highspeed", + "minimax-cn-coding-plan/MiniMax-M2.5-highspeed", + "minimax-cn/MiniMax-M2.5-highspeed", + "minimax-coding-plan/MiniMax-M2.5-highspeed", + "minimax/MiniMax-M2.5-highspeed", + "novita-ai/minimax/minimax-m2.5-highspeed", + "orcarouter/minimax/minimax-m2.5-highspeed", + "qiniu-ai/minimax/minimax-m2.5-highspeed", + "routing-run/route/minimax-m2.5-highspeed", + "vercel/minimax/minimax-m2.5-highspeed" + ], + "mergedProviderModelRecords": 11, + "limits": { + "contextTokens": 204800, + "outputTokens": 131100, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "minimax-m2.5-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "minimax/minimax-m2.5-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "minimax-cn-coding-plan", + "model": "MiniMax-M2.5-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "minimax-cn", + "model": "MiniMax-M2.5-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "minimax-coding-plan", + "model": "MiniMax-M2.5-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "minimax", + "model": "MiniMax-M2.5-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "minimax/minimax-m2.5-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "minimax/minimax-m2.5-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/minimax-m2.5-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.193, + "output": 1.238 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "minimax/minimax-m2.5-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.6, + "output": 2.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M2.5 High Speed", + "MiniMax M2.5 Highspeed", + "MiniMax-M2.5-highspeed", + "Minimax/Minimax-M2.5 Highspeed" + ], + "families": [ + "minimax", + "minimax-m2.5" + ], + "releaseDate": "2026-02-13", + "lastUpdated": "2026-02-13", + "providerModelRecordCount": 11 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "minimax-m2.5-highspeed", + "modelKey": "minimax-m2.5-highspeed", + "displayName": "MiniMax-M2.5-highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-13", + "openWeights": true, + "releaseDate": "2026-02-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "minimax/minimax-m2.5-highspeed", + "modelKey": "minimax/minimax-m2.5-highspeed", + "displayName": "MiniMax-M2.5-highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-13", + "openWeights": true, + "releaseDate": "2026-02-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-cn-coding-plan", + "providerName": "MiniMax Token Plan (minimaxi.com)", + "providerApi": "https://api.minimaxi.com/anthropic/v1", + "providerDoc": "https://platform.minimaxi.com/docs/token-plan/intro", + "model": "MiniMax-M2.5-highspeed", + "modelKey": "MiniMax-M2.5-highspeed", + "displayName": "MiniMax-M2.5-highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-13", + "openWeights": true, + "releaseDate": "2026-02-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-cn", + "providerName": "MiniMax (minimaxi.com)", + "providerApi": "https://api.minimaxi.com/anthropic/v1", + "providerDoc": "https://platform.minimaxi.com/docs/guides/quickstart", + "model": "MiniMax-M2.5-highspeed", + "modelKey": "MiniMax-M2.5-highspeed", + "displayName": "MiniMax-M2.5-highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-13", + "openWeights": true, + "releaseDate": "2026-02-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-coding-plan", + "providerName": "MiniMax Token Plan (minimax.io)", + "providerApi": "https://api.minimax.io/anthropic/v1", + "providerDoc": "https://platform.minimax.io/docs/token-plan/intro", + "model": "MiniMax-M2.5-highspeed", + "modelKey": "MiniMax-M2.5-highspeed", + "displayName": "MiniMax-M2.5-highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-13", + "openWeights": true, + "releaseDate": "2026-02-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax", + "providerName": "MiniMax (minimax.io)", + "providerApi": "https://api.minimax.io/anthropic/v1", + "providerDoc": "https://platform.minimax.io/docs/guides/quickstart", + "model": "MiniMax-M2.5-highspeed", + "modelKey": "MiniMax-M2.5-highspeed", + "displayName": "MiniMax-M2.5-highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-13", + "openWeights": true, + "releaseDate": "2026-02-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "minimax/minimax-m2.5-highspeed", + "modelKey": "minimax/minimax-m2.5-highspeed", + "displayName": "MiniMax M2.5 Highspeed", + "family": "minimax-m2.5", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": false, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "minimax/minimax-m2.5-highspeed", + "modelKey": "minimax/minimax-m2.5-highspeed", + "displayName": "MiniMax-M2.5-highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-13", + "openWeights": true, + "releaseDate": "2026-02-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "minimax/minimax-m2.5-highspeed", + "modelKey": "minimax/minimax-m2.5-highspeed", + "displayName": "Minimax/Minimax-M2.5 Highspeed", + "metadata": { + "lastUpdated": "2026-02-14", + "openWeights": false, + "releaseDate": "2026-02-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/minimax-m2.5-highspeed", + "modelKey": "route/minimax-m2.5-highspeed", + "displayName": "MiniMax M2.5 Highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-13", + "openWeights": true, + "releaseDate": "2026-02-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "minimax/minimax-m2.5-highspeed", + "modelKey": "minimax/minimax-m2.5-highspeed", + "displayName": "MiniMax M2.5 High Speed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-13", + "openWeights": false, + "releaseDate": "2026-02-12" + } + } + ] + }, + { + "id": "minimax/minimax-m2.5-lightning", + "provider": "minimax", + "model": "minimax-m2.5-lightning", + "displayName": "MiniMax M2.5 highspeed", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "minimax", + "zenmux" + ], + "aliases": [ + "minimax/MiniMax-M2.5-lightning", + "zenmux/minimax/minimax-m2.5-lightning" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": true, + "attachments": false, + "openWeights": false, + "temperature": true, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "minimax/minimax-m2.5-lightning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.75, + "input": 0.6, + "output": 4.8 + } + }, + { + "source": "litellm", + "provider": "minimax", + "model": "minimax/MiniMax-M2.5-lightning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.375, + "input": 0.3, + "output": 2.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M2.5 highspeed" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01-01", + "releaseDate": "2026-02-13", + "lastUpdated": "2026-02-13", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "minimax/minimax-m2.5-lightning", + "modelKey": "minimax/minimax-m2.5-lightning", + "displayName": "MiniMax M2.5 highspeed", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-02-13", + "openWeights": false, + "releaseDate": "2026-02-13" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "minimax", + "model": "minimax/MiniMax-M2.5-lightning", + "mode": "chat" + } + ] + }, + { + "id": "minimax/minimax-m2.5-tee", + "provider": "minimax", + "model": "minimax-m2.5-tee", + "displayName": "MiniMax M2.5 TEE", + "family": "minimax", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/MiniMaxAI/MiniMax-M2.5-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 196608, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "MiniMaxAI/MiniMax-M2.5-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M2.5 TEE" + ], + "families": [ + "minimax" + ], + "releaseDate": "2026-02-12", + "lastUpdated": "2026-02-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "MiniMaxAI/MiniMax-M2.5-TEE", + "modelKey": "MiniMaxAI/MiniMax-M2.5-TEE", + "displayName": "MiniMax M2.5 TEE", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + } + ] + }, + { + "id": "minimax/minimax-m2.7", + "provider": "minimax", + "model": "minimax-m2.7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "aihubmix", + "alibaba-cn", + "cortecs", + "fastrouter", + "huggingface", + "kilo", + "lilac", + "llmgateway", + "merge-gateway", + "minimax", + "minimax-cn", + "minimax-cn-coding-plan", + "minimax-coding-plan", + "nano-gpt", + "novita-ai", + "nvidia", + "ollama-cloud", + "opencode", + "opencode-go", + "openrouter", + "orcarouter", + "routing-run", + "sambanova", + "togetherai", + "vercel", + "vultr", + "zenmux" + ], + "aliases": [ + "302ai/MiniMax-M2.7", + "aihubmix/minimax-m2.7", + "alibaba-cn/MiniMax/MiniMax-M2.7", + "cortecs/minimax-m2.7", + "fastrouter/minimax/minimax-m2.7", + "huggingface/MiniMaxAI/MiniMax-M2.7", + "kilo/minimax/minimax-m2.7", + "lilac/minimaxai/minimax-m2.7", + "llmgateway/minimax-m2.7", + "merge-gateway/minimax/minimax-m2.7", + "minimax-cn-coding-plan/MiniMax-M2.7", + "minimax-cn/MiniMax-M2.7", + "minimax-coding-plan/MiniMax-M2.7", + "minimax/MiniMax-M2.7", + "nano-gpt/minimax/minimax-m2.7", + "novita-ai/minimax/minimax-m2.7", + "nvidia/minimaxai/minimax-m2.7", + "ollama-cloud/minimax-m2.7", + "opencode-go/minimax-m2.7", + "opencode/minimax-m2.7", + "openrouter/minimax/minimax-m2.7", + "orcarouter/minimax/minimax-m2.7", + "routing-run/route/minimax-m2.7", + "sambanova/MiniMax-M2.7", + "togetherai/MiniMaxAI/MiniMax-M2.7", + "vercel/minimax/minimax-m2.7", + "vultr/MiniMaxAI/MiniMax-M2.7", + "zenmux/minimax/minimax-m2.7" + ], + "mergedProviderModelRecords": 28, + "limits": { + "contextTokens": 204800, + "inputTokens": 204800, + "maxTokens": 131072, + "outputTokens": 204800, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "MiniMax-M2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "aihubmix", + "model": "minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "MiniMax/MiniMax-M2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.47, + "output": 1.4 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "minimax/minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "MiniMaxAI/MiniMax-M2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "minimax/minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "lilac", + "model": "minimaxai/minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.055, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "minimax/minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "minimax-cn-coding-plan", + "model": "MiniMax-M2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "minimax-cn", + "model": "MiniMax-M2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "minimax-coding-plan", + "model": "MiniMax-M2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "minimax", + "model": "MiniMax-M2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "minimax/minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "minimax/minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "minimaxai/minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "opencode-go", + "model": "minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "minimax/minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.25, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "minimax/minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.33, + "output": 1.32 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "MiniMaxAI/MiniMax-M2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "minimax/minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "vultr", + "model": "MiniMaxAI/MiniMax-M2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "minimax/minimax-m2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3055, + "output": 1.2219 + } + }, + { + "source": "litellm", + "provider": "sambanova", + "model": "sambanova/MiniMax-M2.7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "minimax/minimax-m2.7", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.25, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M2.7", + "MiniMax-M2.7", + "MiniMax-m2.7", + "MiniMax: MiniMax M2.7", + "Minimax M2.7", + "minimax-m2.7" + ], + "families": [ + "minimax", + "minimax-m2.7" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-03-19", + "lastUpdated": "2026-03-19", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 28 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "MiniMax-M2.7", + "modelKey": "MiniMax-M2.7", + "displayName": "MiniMax-M2.7", + "metadata": { + "lastUpdated": "2026-03-19", + "openWeights": false, + "releaseDate": "2026-03-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "minimax-m2.7", + "modelKey": "minimax-m2.7", + "displayName": "MiniMax M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "MiniMax/MiniMax-M2.7", + "modelKey": "MiniMax/MiniMax-M2.7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "minimax-m2.7", + "modelKey": "minimax-m2.7", + "displayName": "MiniMax-m2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "minimax/minimax-m2.7", + "modelKey": "minimax/minimax-m2.7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "MiniMaxAI/MiniMax-M2.7", + "modelKey": "MiniMaxAI/MiniMax-M2.7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "minimax/minimax-m2.7", + "modelKey": "minimax/minimax-m2.7", + "displayName": "MiniMax: MiniMax M2.7", + "family": "minimax-m2.7", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "lilac", + "providerName": "Lilac", + "providerApi": "https://api.getlilac.com/v1", + "providerDoc": "https://docs.getlilac.com/inference/models", + "model": "minimaxai/minimax-m2.7", + "modelKey": "minimaxai/minimax-m2.7", + "displayName": "MiniMax M2.7", + "family": "minimax", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "minimax-m2.7", + "modelKey": "minimax-m2.7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "minimax/minimax-m2.7", + "modelKey": "minimax/minimax-m2.7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-cn-coding-plan", + "providerName": "MiniMax Token Plan (minimaxi.com)", + "providerApi": "https://api.minimaxi.com/anthropic/v1", + "providerDoc": "https://platform.minimaxi.com/docs/token-plan/intro", + "model": "MiniMax-M2.7", + "modelKey": "MiniMax-M2.7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-cn", + "providerName": "MiniMax (minimaxi.com)", + "providerApi": "https://api.minimaxi.com/anthropic/v1", + "providerDoc": "https://platform.minimaxi.com/docs/guides/quickstart", + "model": "MiniMax-M2.7", + "modelKey": "MiniMax-M2.7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-coding-plan", + "providerName": "MiniMax Token Plan (minimax.io)", + "providerApi": "https://api.minimax.io/anthropic/v1", + "providerDoc": "https://platform.minimax.io/docs/token-plan/intro", + "model": "MiniMax-M2.7", + "modelKey": "MiniMax-M2.7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax", + "providerName": "MiniMax (minimax.io)", + "providerApi": "https://api.minimax.io/anthropic/v1", + "providerDoc": "https://platform.minimax.io/docs/guides/quickstart", + "model": "MiniMax-M2.7", + "modelKey": "MiniMax-M2.7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "minimax/minimax-m2.7", + "modelKey": "minimax/minimax-m2.7", + "displayName": "MiniMax M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "minimax/minimax-m2.7", + "modelKey": "minimax/minimax-m2.7", + "displayName": "MiniMax M2.7", + "family": "minimax-m2.7", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "minimaxai/minimax-m2.7", + "modelKey": "minimaxai/minimax-m2.7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "minimax-m2.7", + "modelKey": "minimax-m2.7", + "displayName": "minimax-m2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "minimax-m2.7", + "modelKey": "minimax-m2.7", + "displayName": "MiniMax M2.7", + "family": "minimax-m2.7", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "minimax-m2.7", + "modelKey": "minimax-m2.7", + "displayName": "MiniMax M2.7", + "family": "minimax", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "minimax/minimax-m2.7", + "modelKey": "minimax/minimax-m2.7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "minimax/minimax-m2.7", + "modelKey": "minimax/minimax-m2.7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/minimax-m2.7", + "modelKey": "route/minimax-m2.7", + "displayName": "MiniMax M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "MiniMaxAI/MiniMax-M2.7", + "modelKey": "MiniMaxAI/MiniMax-M2.7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "minimax/minimax-m2.7", + "modelKey": "minimax/minimax-m2.7", + "displayName": "Minimax M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vultr", + "providerName": "Vultr", + "providerApi": "https://api.vultrinference.com/v1", + "providerDoc": "https://api.vultrinference.com/", + "model": "MiniMaxAI/MiniMax-M2.7", + "modelKey": "MiniMaxAI/MiniMax-M2.7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "minimax/minimax-m2.7", + "modelKey": "minimax/minimax-m2.7", + "displayName": "MiniMax M2.7", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-03-20", + "openWeights": false, + "releaseDate": "2026-03-20" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sambanova", + "model": "sambanova/MiniMax-M2.7", + "mode": "chat", + "metadata": { + "source": "https://cloud.sambanova.ai/plans/pricing" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "minimax/minimax-m2.7", + "displayName": "MiniMax: MiniMax M2.7", + "metadata": { + "canonicalSlug": "minimax/minimax-m2.7-20260318", + "createdAt": "2026-03-18T12:24:57.000Z", + "huggingFaceId": "MiniMaxAI/MiniMax-M2.7", + "links": { + "details": "/api/v1/models/minimax/minimax-m2.7-20260318/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 196608, + "max_completion_tokens": 131072, + "is_moderated": false + } + } + } + ] + }, + { + "id": "minimax/minimax-m2.7-highspeed", + "provider": "minimax", + "model": "minimax-m2.7-highspeed", + "displayName": "MiniMax-M2.7-highspeed", + "family": "minimax", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai", + "fastrouter", + "llmgateway", + "merge-gateway", + "minimax", + "minimax-cn", + "minimax-cn-coding-plan", + "minimax-coding-plan", + "novita-ai", + "orcarouter", + "routing-run", + "vercel", + "zenmux" + ], + "aliases": [ + "302ai/MiniMax-M2.7-highspeed", + "fastrouter/minimax/minimax-m2.7-highspeed", + "llmgateway/minimax-m2.7-highspeed", + "merge-gateway/minimax/minimax-m2.7-highspeed", + "minimax-cn-coding-plan/MiniMax-M2.7-highspeed", + "minimax-cn/MiniMax-M2.7-highspeed", + "minimax-coding-plan/MiniMax-M2.7-highspeed", + "minimax/MiniMax-M2.7-highspeed", + "novita-ai/minimax/minimax-m2.7-highspeed", + "orcarouter/minimax/minimax-m2.7-highspeed", + "routing-run/route/minimax-m2.7-highspeed", + "vercel/minimax/minimax-m2.7-highspeed", + "zenmux/minimax/minimax-m2.7-highspeed" + ], + "mergedProviderModelRecords": 13, + "limits": { + "contextTokens": 204800, + "outputTokens": 131100, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "MiniMax-M2.7-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 4.8 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "minimax/minimax-m2.7-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "minimax-m2.7-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "minimax/minimax-m2.7-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "minimax-cn-coding-plan", + "model": "MiniMax-M2.7-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "minimax-cn", + "model": "MiniMax-M2.7-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "minimax-coding-plan", + "model": "MiniMax-M2.7-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "minimax", + "model": "MiniMax-M2.7-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "minimax/minimax-m2.7-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "minimax/minimax-m2.7-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/minimax-m2.7-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.33, + "output": 1.32 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "minimax/minimax-m2.7-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "cacheWrite": 0.375, + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "minimax/minimax-m2.7-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.611, + "output": 2.4439 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M2.7 High Speed", + "MiniMax M2.7 Highspeed", + "MiniMax M2.7 highspeed", + "MiniMax-M2.7-highspeed" + ], + "families": [ + "minimax" + ], + "knowledgeCutoff": "2025-01-01", + "releaseDate": "2026-03-19", + "lastUpdated": "2026-03-19", + "providerModelRecordCount": 13 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "MiniMax-M2.7-highspeed", + "modelKey": "MiniMax-M2.7-highspeed", + "displayName": "MiniMax-M2.7-highspeed", + "metadata": { + "lastUpdated": "2026-03-19", + "openWeights": false, + "releaseDate": "2026-03-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "minimax/minimax-m2.7-highspeed", + "modelKey": "minimax/minimax-m2.7-highspeed", + "displayName": "MiniMax-M2.7-highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "minimax-m2.7-highspeed", + "modelKey": "minimax-m2.7-highspeed", + "displayName": "MiniMax-M2.7-highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "minimax/minimax-m2.7-highspeed", + "modelKey": "minimax/minimax-m2.7-highspeed", + "displayName": "MiniMax-M2.7-highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-cn-coding-plan", + "providerName": "MiniMax Token Plan (minimaxi.com)", + "providerApi": "https://api.minimaxi.com/anthropic/v1", + "providerDoc": "https://platform.minimaxi.com/docs/token-plan/intro", + "model": "MiniMax-M2.7-highspeed", + "modelKey": "MiniMax-M2.7-highspeed", + "displayName": "MiniMax-M2.7-highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-cn", + "providerName": "MiniMax (minimaxi.com)", + "providerApi": "https://api.minimaxi.com/anthropic/v1", + "providerDoc": "https://platform.minimaxi.com/docs/guides/quickstart", + "model": "MiniMax-M2.7-highspeed", + "modelKey": "MiniMax-M2.7-highspeed", + "displayName": "MiniMax-M2.7-highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-coding-plan", + "providerName": "MiniMax Token Plan (minimax.io)", + "providerApi": "https://api.minimax.io/anthropic/v1", + "providerDoc": "https://platform.minimax.io/docs/token-plan/intro", + "model": "MiniMax-M2.7-highspeed", + "modelKey": "MiniMax-M2.7-highspeed", + "displayName": "MiniMax-M2.7-highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax", + "providerName": "MiniMax (minimax.io)", + "providerApi": "https://api.minimax.io/anthropic/v1", + "providerDoc": "https://platform.minimax.io/docs/guides/quickstart", + "model": "MiniMax-M2.7-highspeed", + "modelKey": "MiniMax-M2.7-highspeed", + "displayName": "MiniMax-M2.7-highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "minimax/minimax-m2.7-highspeed", + "modelKey": "minimax/minimax-m2.7-highspeed", + "displayName": "MiniMax-M2.7-highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-05-27", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "minimax/minimax-m2.7-highspeed", + "modelKey": "minimax/minimax-m2.7-highspeed", + "displayName": "MiniMax-M2.7-highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/minimax-m2.7-highspeed", + "modelKey": "route/minimax-m2.7-highspeed", + "displayName": "MiniMax M2.7 Highspeed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "minimax/minimax-m2.7-highspeed", + "modelKey": "minimax/minimax-m2.7-highspeed", + "displayName": "MiniMax M2.7 High Speed", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "minimax/minimax-m2.7-highspeed", + "modelKey": "minimax/minimax-m2.7-highspeed", + "displayName": "MiniMax M2.7 highspeed", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-03-20", + "openWeights": false, + "releaseDate": "2026-03-20" + } + } + ] + }, + { + "id": "minimax/minimax-m2.7-turbo", + "provider": "minimax", + "model": "minimax-m2.7-turbo", + "displayName": "MiniMax M2.7 Turbo", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/minimax/minimax-m2.7-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "inputTokens": 204800, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "minimax/minimax-m2.7-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M2.7 Turbo" + ], + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "minimax/minimax-m2.7-turbo", + "modelKey": "minimax/minimax-m2.7-turbo", + "displayName": "MiniMax M2.7 Turbo", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "minimax/minimax-m25", + "provider": "minimax", + "model": "minimax-m25", + "displayName": "MiniMax M2.5", + "family": "minimax", + "sources": [ + "models.dev" + ], + "providers": [ + "drun", + "venice" + ], + "aliases": [ + "drun/public/minimax-m25", + "venice/minimax-m25" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 204800, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "drun", + "model": "public/minimax-m25", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 1.16 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "minimax-m25", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.34, + "output": 1.19 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M2.5" + ], + "families": [ + "minimax" + ], + "releaseDate": "2025-03-01", + "lastUpdated": "2025-03-01", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "drun", + "providerName": "D.Run (China)", + "providerApi": "https://chat.d.run/v1", + "providerDoc": "https://www.d.run", + "model": "public/minimax-m25", + "modelKey": "public/minimax-m25", + "displayName": "MiniMax M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-03-01", + "openWeights": false, + "releaseDate": "2025-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "minimax-m25", + "modelKey": "minimax-m25", + "displayName": "MiniMax M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-02-12", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "minimax/minimax-m27", + "provider": "minimax", + "model": "minimax-m27", + "displayName": "MiniMax M2.7", + "family": "minimax", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/minimax-m27" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 198000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "minimax-m27", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06875, + "input": 0.375, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M2.7" + ], + "families": [ + "minimax" + ], + "releaseDate": "2026-03-18", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "minimax-m27", + "modelKey": "minimax-m27", + "displayName": "MiniMax M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "minimax/minimax-m2p1", + "provider": "minimax", + "model": "minimax-m2p1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/minimax-m2p1", + "fireworks_ai/minimax-m2p1" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 204800, + "inputTokens": 204800, + "maxTokens": 204800, + "outputTokens": 204800, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/minimax-m2p1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/minimax-m2p1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/minimax-m2p1", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/models/fireworks/minimax-m2p1" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/minimax-m2p1", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/models/fireworks/minimax-m2p1" + } + } + ] + }, + { + "id": "minimax/minimax-m2p7", + "provider": "minimax", + "model": "minimax-m2p7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "sources": [ + "models.dev" + ], + "providers": [ + "fireworks-ai" + ], + "aliases": [ + "fireworks-ai/accounts/fireworks/models/minimax-m2p7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 196608, + "outputTokens": 196608, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fireworks-ai", + "model": "accounts/fireworks/models/minimax-m2p7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax-M2.7" + ], + "families": [ + "minimax" + ], + "releaseDate": "2026-04-12", + "lastUpdated": "2026-04-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fireworks-ai", + "providerName": "Fireworks AI", + "providerApi": "https://api.fireworks.ai/inference/v1/", + "providerDoc": "https://fireworks.ai/docs/", + "model": "accounts/fireworks/models/minimax-m2p7", + "modelKey": "accounts/fireworks/models/minimax-m2p7", + "displayName": "MiniMax-M2.7", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-04-12", + "openWeights": true, + "releaseDate": "2026-04-12", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "minimax/minimax-m3", + "provider": "minimax", + "model": "minimax-m3", + "displayName": "MiniMax-M3", + "family": "minimax", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "cortecs", + "fireworks-ai", + "llmgateway", + "minimax", + "minimax-cn", + "minimax-cn-coding-plan", + "minimax-coding-plan", + "nano-gpt", + "ollama-cloud", + "opencode-go", + "openrouter", + "synthetic", + "togetherai", + "venice", + "vercel", + "zenmux" + ], + "aliases": [ + "cortecs/minimax-m3", + "fireworks-ai/accounts/fireworks/models/minimax-m3", + "llmgateway/minimax-m3", + "minimax-cn-coding-plan/MiniMax-M3", + "minimax-cn/MiniMax-M3", + "minimax-coding-plan/MiniMax-M3", + "minimax/MiniMax-M3", + "nano-gpt/minimax/minimax-m3", + "ollama-cloud/minimax-m3", + "opencode-go/minimax-m3", + "openrouter/minimax/minimax-m3", + "synthetic/hf:MiniMaxAI/MiniMax-M3", + "togetherai/MiniMaxAI/MiniMax-M3", + "venice/minimax-m3", + "vercel/minimax/minimax-m3", + "zenmux/minimax/minimax-m3" + ], + "mergedProviderModelRecords": 16, + "limits": { + "contextTokens": 1048576, + "inputTokens": 512000, + "outputTokens": 1000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "minimax-m3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.089, + "input": 0.355, + "output": 1.775 + } + }, + { + "source": "models.dev", + "provider": "fireworks-ai", + "model": "accounts/fireworks/models/minimax-m3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "minimax-m3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12, + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "minimax-cn-coding-plan", + "model": "MiniMax-M3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "minimax-cn", + "model": "MiniMax-M3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12, + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "minimax-coding-plan", + "model": "MiniMax-M3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "minimax", + "model": "MiniMax-M3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12, + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "minimax/minimax-m3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "opencode-go", + "model": "minimax-m3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "minimax/minimax-m3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:MiniMaxAI/MiniMax-M3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.6, + "input": 0.6, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "MiniMaxAI/MiniMax-M3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "minimax-m3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "minimax/minimax-m3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "minimax/minimax-m3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "litellm", + "provider": "minimax", + "model": "minimax/MiniMax-M3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.12, + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "minimax/minimax-m3", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M3", + "MiniMax M3 (3x usage)", + "MiniMax-M3", + "MiniMax: MiniMax M3", + "minimax-m3" + ], + "families": [ + "minimax", + "minimax-m3" + ], + "modes": [ + "chat" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-06-01", + "lastUpdated": "2026-06-01", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 16 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "minimax-m3", + "modelKey": "minimax-m3", + "displayName": "MiniMax-M3", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-06-01", + "openWeights": true, + "releaseDate": "2026-06-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fireworks-ai", + "providerName": "Fireworks AI", + "providerApi": "https://api.fireworks.ai/inference/v1/", + "providerDoc": "https://fireworks.ai/docs/", + "model": "accounts/fireworks/models/minimax-m3", + "modelKey": "accounts/fireworks/models/minimax-m3", + "displayName": "MiniMax-M3", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "minimax-m3", + "modelKey": "minimax-m3", + "displayName": "MiniMax-M3", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-06-01", + "openWeights": true, + "releaseDate": "2026-06-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-cn-coding-plan", + "providerName": "MiniMax Token Plan (minimaxi.com)", + "providerApi": "https://api.minimaxi.com/anthropic/v1", + "providerDoc": "https://platform.minimaxi.com/docs/token-plan/intro", + "model": "MiniMax-M3", + "modelKey": "MiniMax-M3", + "displayName": "MiniMax-M3", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-06-01", + "openWeights": true, + "releaseDate": "2026-06-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-cn", + "providerName": "MiniMax (minimaxi.com)", + "providerApi": "https://api.minimaxi.com/anthropic/v1", + "providerDoc": "https://platform.minimaxi.com/docs/guides/quickstart", + "model": "MiniMax-M3", + "modelKey": "MiniMax-M3", + "displayName": "MiniMax-M3", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-06-01", + "openWeights": true, + "releaseDate": "2026-06-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax-coding-plan", + "providerName": "MiniMax Token Plan (minimax.io)", + "providerApi": "https://api.minimax.io/anthropic/v1", + "providerDoc": "https://platform.minimax.io/docs/token-plan/intro", + "model": "MiniMax-M3", + "modelKey": "MiniMax-M3", + "displayName": "MiniMax-M3", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-06-01", + "openWeights": true, + "releaseDate": "2026-06-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "minimax", + "providerName": "MiniMax (minimax.io)", + "providerApi": "https://api.minimax.io/anthropic/v1", + "providerDoc": "https://platform.minimax.io/docs/guides/quickstart", + "model": "MiniMax-M3", + "modelKey": "MiniMax-M3", + "displayName": "MiniMax-M3", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-06-01", + "openWeights": true, + "releaseDate": "2026-06-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "minimax/minimax-m3", + "modelKey": "minimax/minimax-m3", + "displayName": "MiniMax M3", + "metadata": { + "lastUpdated": "2026-06-01", + "openWeights": false, + "releaseDate": "2026-06-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "minimax-m3", + "modelKey": "minimax-m3", + "displayName": "minimax-m3", + "family": "minimax-m3", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-31", + "openWeights": true, + "releaseDate": "2026-05-31", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "minimax-m3", + "modelKey": "minimax-m3", + "displayName": "MiniMax M3 (3x usage)", + "family": "minimax-m3", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-31", + "openWeights": true, + "releaseDate": "2026-05-31", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "minimax/minimax-m3", + "modelKey": "minimax/minimax-m3", + "displayName": "MiniMax-M3", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-06-01", + "openWeights": true, + "releaseDate": "2026-06-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:MiniMaxAI/MiniMax-M3", + "modelKey": "hf:MiniMaxAI/MiniMax-M3", + "displayName": "MiniMax-M3", + "family": "minimax", + "status": "beta", + "metadata": { + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "MiniMaxAI/MiniMax-M3", + "modelKey": "MiniMaxAI/MiniMax-M3", + "displayName": "MiniMax-M3", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "minimax-m3", + "modelKey": "minimax-m3", + "displayName": "MiniMax M3", + "family": "minimax-m3", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-06-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "minimax/minimax-m3", + "modelKey": "minimax/minimax-m3", + "displayName": "MiniMax M3", + "family": "minimax-m3", + "metadata": { + "lastUpdated": "2026-06-01", + "openWeights": true, + "releaseDate": "2026-05-31", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "minimax/minimax-m3", + "modelKey": "minimax/minimax-m3", + "displayName": "MiniMax-M3", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-06-01", + "openWeights": true, + "releaseDate": "2026-06-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "minimax", + "model": "minimax/MiniMax-M3", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "minimax/minimax-m3", + "displayName": "MiniMax: MiniMax M3", + "metadata": { + "canonicalSlug": "minimax/minimax-m3-20260531", + "createdAt": "2026-05-31T16:36:14.000Z", + "huggingFaceId": "MiniMaxAI/Minimax-M3", + "links": { + "details": "/api/v1/models/minimax/minimax-m3-20260531/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 524288, + "max_completion_tokens": 512000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "minimax/minimax-m3-free", + "provider": "minimax", + "model": "minimax-m3-free", + "displayName": "MiniMax M3 Free", + "family": "minimax-m3-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/minimax-m3-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "minimax-m3-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M3 Free" + ], + "families": [ + "minimax-m3-free" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-05-31", + "lastUpdated": "2026-05-31", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "minimax-m3-free", + "modelKey": "minimax-m3-free", + "displayName": "MiniMax M3 Free", + "family": "minimax-m3-free", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-31", + "openWeights": true, + "releaseDate": "2026-05-31", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "minimax/minimax-m3-preview", + "provider": "minimax", + "model": "minimax-m3-preview", + "displayName": "MiniMax M3 Preview", + "family": "minimax-m3", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/minimax-m3-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 524288, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "minimax-m3-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M3 Preview" + ], + "families": [ + "minimax-m3" + ], + "releaseDate": "2026-06-12", + "lastUpdated": "2026-06-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "minimax-m3-preview", + "modelKey": "minimax-m3-preview", + "displayName": "MiniMax M3 Preview", + "family": "minimax-m3", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-06-12", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "minimax/minimax-m3:thinking", + "provider": "minimax", + "model": "minimax-m3:thinking", + "displayName": "MiniMax M3 Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/minimax/minimax-m3:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512000, + "inputTokens": 512000, + "outputTokens": 80000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "minimax/minimax-m3:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M3 Thinking" + ], + "releaseDate": "2026-06-01", + "lastUpdated": "2026-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "minimax/minimax-m3:thinking", + "modelKey": "minimax/minimax-m3:thinking", + "displayName": "MiniMax M3 Thinking", + "metadata": { + "lastUpdated": "2026-06-01", + "openWeights": false, + "releaseDate": "2026-06-01" + } + } + ] + }, + { + "id": "minimax/minimax-text-01", + "provider": "minimax", + "model": "minimax-text-01", + "displayName": "MiniMax Text 01", + "family": "minimax", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/minimax-text-01" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "minimax-text-01", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax Text 01" + ], + "families": [ + "minimax" + ], + "releaseDate": "2025-01-15", + "lastUpdated": "2025-01-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "minimax-text-01", + "modelKey": "minimax-text-01", + "displayName": "MiniMax Text 01", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-01-15", + "openWeights": true, + "releaseDate": "2025-01-15" + } + } + ] + }, + { + "id": "minimax/minimax.minimax-m2", + "provider": "minimax", + "model": "minimax.minimax-m2", + "displayName": "MiniMax M2", + "family": "minimax", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/minimax.minimax-m2", + "bedrock_converse/minimax.minimax-m2" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 204608, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "nativeStructuredOutput": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "minimax.minimax-m2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "minimax.minimax-m2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M2" + ], + "families": [ + "minimax" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-10-27", + "lastUpdated": "2025-10-27", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "minimax.minimax-m2", + "modelKey": "minimax.minimax-m2", + "displayName": "MiniMax M2", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-10-27", + "openWeights": true, + "releaseDate": "2025-10-27" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "minimax.minimax-m2", + "mode": "chat" + } + ] + }, + { + "id": "minimax/minimax.minimax-m2.1", + "provider": "minimax", + "model": "minimax.minimax-m2.1", + "displayName": "MiniMax M2.1", + "family": "minimax", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/minimax.minimax-m2.1", + "bedrock_converse/minimax.minimax-m2.1" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 204800, + "inputTokens": 196000, + "maxTokens": 8192, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "minimax.minimax-m2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "minimax.minimax-m2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M2.1" + ], + "families": [ + "minimax" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-12-23", + "lastUpdated": "2025-12-23", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "minimax.minimax-m2.1", + "modelKey": "minimax.minimax-m2.1", + "displayName": "MiniMax M2.1", + "family": "minimax", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": true, + "releaseDate": "2025-12-23" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "minimax.minimax-m2.1", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "minimax/minimax.minimax-m2.5", + "provider": "minimax", + "model": "minimax.minimax-m2.5", + "displayName": "MiniMax M2.5", + "family": "minimax", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/minimax.minimax-m2.5", + "bedrock_converse/minimax.minimax-m2.5" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 8192, + "outputTokens": 98304, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "minimax.minimax-m2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "minimax.minimax-m2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiniMax M2.5" + ], + "families": [ + "minimax" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "minimax.minimax-m2.5", + "modelKey": "minimax.minimax-m2.5", + "displayName": "MiniMax M2.5", + "family": "minimax", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "minimax.minimax-m2.5", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "minimax/speech-02-hd", + "provider": "minimax", + "model": "speech-02-hd", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "minimax" + ], + "aliases": [ + "minimax/speech-02-hd" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "minimax", + "model": "minimax/speech-02-hd", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.0001 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "minimax", + "model": "minimax/speech-02-hd", + "mode": "audio_speech", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "minimax/speech-02-turbo", + "provider": "minimax", + "model": "speech-02-turbo", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "minimax" + ], + "aliases": [ + "minimax/speech-02-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "minimax", + "model": "minimax/speech-02-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.00006 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "minimax", + "model": "minimax/speech-02-turbo", + "mode": "audio_speech", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "minimax/speech-2.6-hd", + "provider": "minimax", + "model": "speech-2.6-hd", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "minimax" + ], + "aliases": [ + "minimax/speech-2.6-hd" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "minimax", + "model": "minimax/speech-2.6-hd", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.0001 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "minimax", + "model": "minimax/speech-2.6-hd", + "mode": "audio_speech", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "minimax/speech-2.6-turbo", + "provider": "minimax", + "model": "speech-2.6-turbo", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "minimax" + ], + "aliases": [ + "minimax/speech-2.6-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "minimax", + "model": "minimax/speech-2.6-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.00006 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "minimax", + "model": "minimax/speech-2.6-turbo", + "mode": "audio_speech", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "mistral/codestral", + "provider": "mistral", + "model": "codestral", + "displayName": "Codestral (latest)", + "family": "codestral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "vercel/mistral/codestral", + "vercel_ai_gateway/mistral/codestral" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 4000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "mistral/codestral", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/codestral", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Codestral (latest)" + ], + "families": [ + "codestral" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-05-29", + "lastUpdated": "2025-01-04", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/codestral", + "modelKey": "mistral/codestral", + "displayName": "Codestral (latest)", + "family": "codestral", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-01-04", + "openWeights": true, + "releaseDate": "2024-05-29" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/codestral", + "mode": "chat" + } + ] + }, + { + "id": "mistral/codestral-2", + "provider": "mistral", + "model": "codestral-2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-mistral_models" + ], + "aliases": [ + "vertex_ai-mistral_models/vertex_ai/codestral-2", + "vertex_ai-mistral_models/vertex_ai/mistralai/codestral-2" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/codestral-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistralai/codestral-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/codestral-2", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistralai/codestral-2", + "mode": "chat" + } + ] + }, + { + "id": "mistral/codestral-2@001", + "provider": "mistral", + "model": "codestral-2@001", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-mistral_models" + ], + "aliases": [ + "vertex_ai-mistral_models/vertex_ai/codestral-2@001", + "vertex_ai-mistral_models/vertex_ai/mistralai/codestral-2@001" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/codestral-2@001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistralai/codestral-2@001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/codestral-2@001", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistralai/codestral-2@001", + "mode": "chat" + } + ] + }, + { + "id": "mistral/codestral-2405", + "provider": "mistral", + "model": "codestral-2405", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "codestral", + "mistral", + "text-completion-codestral" + ], + "aliases": [ + "codestral/codestral-2405", + "mistral/codestral-2405", + "text-completion-codestral/codestral-2405" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "codestral", + "model": "codestral/codestral-2405", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/codestral-2405", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "text-completion-codestral", + "model": "text-completion-codestral/codestral-2405", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat", + "completion" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "codestral", + "model": "codestral/codestral-2405", + "mode": "chat", + "metadata": { + "source": "https://docs.mistral.ai/capabilities/code_generation/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/codestral-2405", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "text-completion-codestral", + "model": "text-completion-codestral/codestral-2405", + "mode": "completion", + "metadata": { + "source": "https://docs.mistral.ai/capabilities/code_generation/" + } + } + ] + }, + { + "id": "mistral/codestral-2501", + "provider": "mistral", + "model": "codestral-2501", + "displayName": "Codestral 25.01", + "family": "codestral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "github-models", + "vertex_ai-mistral_models" + ], + "aliases": [ + "azure-cognitive-services/codestral-2501", + "azure/codestral-2501", + "github-models/mistral-ai/codestral-2501", + "vertex_ai-mistral_models/vertex_ai/codestral-2501" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 256000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "codestral-2501", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "codestral-2501", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "mistral-ai/codestral-2501", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/codestral-2501", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Codestral 25.01" + ], + "families": [ + "codestral" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-03", + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "codestral-2501", + "modelKey": "codestral-2501", + "displayName": "Codestral 25.01", + "family": "codestral", + "metadata": { + "knowledgeCutoff": "2024-03", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "codestral-2501", + "modelKey": "codestral-2501", + "displayName": "Codestral 25.01", + "family": "codestral", + "metadata": { + "knowledgeCutoff": "2024-03", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "mistral-ai/codestral-2501", + "modelKey": "mistral-ai/codestral-2501", + "displayName": "Codestral 25.01", + "family": "codestral", + "metadata": { + "knowledgeCutoff": "2024-03", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/codestral-2501", + "mode": "chat" + } + ] + }, + { + "id": "mistral/codestral-2508", + "provider": "mistral", + "model": "codestral-2508", + "displayName": "Codestral 2508", + "family": "mistral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "cortecs", + "kilo", + "llmgateway", + "mistral", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "cortecs/codestral-2508", + "kilo/mistralai/codestral-2508", + "llmgateway/codestral-2508", + "mistral/codestral-2508", + "nano-gpt/mistralai/codestral-2508", + "openrouter/mistralai/codestral-2508" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": true, + "openWeights": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "codestral-2508", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/codestral-2508", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "codestral-2508", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistralai/codestral-2508", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.8999999999999999 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/codestral-2508", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/codestral-2508", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/codestral-2508", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.3, + "output": 0.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Codestral", + "Codestral 2508", + "Mistral: Codestral 2508" + ], + "families": [ + "codestral", + "mistral" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03", + "releaseDate": "2025-07-30", + "lastUpdated": "2025-07-30", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "codestral-2508", + "modelKey": "codestral-2508", + "displayName": "Codestral 2508", + "family": "mistral", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2025-07-30", + "openWeights": true, + "releaseDate": "2025-07-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/codestral-2508", + "modelKey": "mistralai/codestral-2508", + "displayName": "Mistral: Codestral 2508", + "metadata": { + "lastUpdated": "2025-08-01", + "openWeights": true, + "releaseDate": "2025-08-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "codestral-2508", + "modelKey": "codestral-2508", + "displayName": "Codestral", + "family": "mistral", + "metadata": { + "lastUpdated": "2025-07-30", + "openWeights": true, + "releaseDate": "2025-07-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistralai/codestral-2508", + "modelKey": "mistralai/codestral-2508", + "displayName": "Codestral 2508", + "family": "codestral", + "metadata": { + "lastUpdated": "2025-08-01", + "openWeights": false, + "releaseDate": "2025-08-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/codestral-2508", + "modelKey": "mistralai/codestral-2508", + "displayName": "Codestral 2508", + "family": "codestral", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-08-01", + "openWeights": false, + "releaseDate": "2025-08-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/codestral-2508", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/news/codestral-25-08" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/codestral-2508", + "displayName": "Mistral: Codestral 2508", + "metadata": { + "canonicalSlug": "mistralai/codestral-2508", + "createdAt": "2025-08-01T20:20:30.000Z", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/mistralai/codestral-2508/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 256000, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/codestral-embed", + "provider": "mistral", + "model": "codestral-embed", + "displayName": "Codestral Embed", + "family": "codestral-embed", + "mode": "embedding", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "mistral", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "mistral/codestral-embed", + "vercel/mistral/codestral-embed", + "vercel_ai_gateway/mistral/codestral-embed" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding", + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/codestral-embed", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/codestral-embed", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Codestral Embed" + ], + "families": [ + "codestral-embed" + ], + "modes": [ + "chat", + "embedding" + ], + "releaseDate": "2025-05-28", + "lastUpdated": "2025-05-28", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/codestral-embed", + "modelKey": "mistral/codestral-embed", + "displayName": "Codestral Embed", + "family": "codestral-embed", + "metadata": { + "lastUpdated": "2025-05-28", + "openWeights": false, + "releaseDate": "2025-05-28" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/codestral-embed", + "mode": "embedding" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/codestral-embed", + "mode": "chat" + } + ] + }, + { + "id": "mistral/codestral-embed-2505", + "provider": "mistral", + "model": "codestral-embed-2505", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/codestral-embed-2505" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/codestral-embed-2505", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/codestral-embed-2505", + "mode": "embedding" + } + ] + }, + { + "id": "mistral/codestral-latest", + "provider": "mistral", + "model": "codestral-latest", + "displayName": "Codestral (latest)", + "family": "codestral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "codestral", + "merge-gateway", + "mistral", + "text-completion-codestral" + ], + "aliases": [ + "codestral/codestral-latest", + "merge-gateway/mistral/codestral-latest", + "mistral/codestral-latest", + "text-completion-codestral/codestral-latest" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 256000, + "inputTokens": 32000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "mistral/codestral-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "mistral", + "model": "codestral-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "codestral", + "model": "codestral/codestral-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/codestral-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "text-completion-codestral", + "model": "text-completion-codestral/codestral-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Codestral (latest)" + ], + "families": [ + "codestral" + ], + "modes": [ + "chat", + "completion" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-05-29", + "lastUpdated": "2025-01-04", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "mistral/codestral-latest", + "modelKey": "mistral/codestral-latest", + "displayName": "Codestral (latest)", + "family": "codestral", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-01-04", + "openWeights": true, + "releaseDate": "2024-05-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "codestral-latest", + "modelKey": "codestral-latest", + "displayName": "Codestral (latest)", + "family": "codestral", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-01-04", + "openWeights": true, + "releaseDate": "2024-05-29" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "codestral", + "model": "codestral/codestral-latest", + "mode": "chat", + "metadata": { + "source": "https://docs.mistral.ai/capabilities/code_generation/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/codestral-latest", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "text-completion-codestral", + "model": "text-completion-codestral/codestral-latest", + "mode": "completion", + "metadata": { + "source": "https://docs.mistral.ai/capabilities/code_generation/" + } + } + ] + }, + { + "id": "mistral/codestral-mamba-latest", + "provider": "mistral", + "model": "codestral-mamba-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/codestral-mamba-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/codestral-mamba-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 0.25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/codestral-mamba-latest", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/technology/" + } + } + ] + }, + { + "id": "mistral/codestral@2405", + "provider": "mistral", + "model": "codestral@2405", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-mistral_models" + ], + "aliases": [ + "vertex_ai-mistral_models/vertex_ai/codestral@2405" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/codestral@2405", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/codestral@2405", + "mode": "chat" + } + ] + }, + { + "id": "mistral/codestral@latest", + "provider": "mistral", + "model": "codestral@latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-mistral_models" + ], + "aliases": [ + "vertex_ai-mistral_models/vertex_ai/codestral@latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/codestral@latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/codestral@latest", + "mode": "chat" + } + ] + }, + { + "id": "mistral/devstral-2", + "provider": "mistral", + "model": "devstral-2", + "displayName": "Devstral 2", + "family": "devstral", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/mistral/devstral-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "mistral/devstral-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Devstral 2" + ], + "families": [ + "devstral" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-12-09", + "lastUpdated": "2025-12-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/devstral-2", + "modelKey": "mistral/devstral-2", + "displayName": "Devstral 2", + "family": "devstral", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-12-09", + "openWeights": false, + "releaseDate": "2025-12-09" + } + } + ] + }, + { + "id": "mistral/devstral-2-123b-instruct-2512", + "provider": "mistral", + "model": "devstral-2-123b-instruct-2512", + "displayName": "Devstral 2 123B", + "family": "devstral", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt", + "scaleway" + ], + "aliases": [ + "nano-gpt/mistralai/devstral-2-123b-instruct-2512", + "scaleway/devstral-2-123b-instruct-2512" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "temperature": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistralai/devstral-2-123b-instruct-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.4 + } + }, + { + "source": "models.dev", + "provider": "scaleway", + "model": "devstral-2-123b-instruct-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Devstral 2 123B", + "Devstral 2 123B Instruct (2512)" + ], + "families": [ + "devstral" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-12", + "releaseDate": "2025-12-09", + "lastUpdated": "2025-12-09", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistralai/devstral-2-123b-instruct-2512", + "modelKey": "mistralai/devstral-2-123b-instruct-2512", + "displayName": "Devstral 2 123B", + "family": "devstral", + "metadata": { + "lastUpdated": "2025-12-09", + "openWeights": false, + "releaseDate": "2025-12-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "scaleway", + "providerName": "Scaleway", + "providerApi": "https://api.scaleway.ai/v1", + "providerDoc": "https://www.scaleway.com/en/docs/generative-apis/", + "model": "devstral-2-123b-instruct-2512", + "modelKey": "devstral-2-123b-instruct-2512", + "displayName": "Devstral 2 123B Instruct (2512)", + "family": "devstral", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2026-03-17", + "openWeights": true, + "releaseDate": "2026-01-07" + } + } + ] + }, + { + "id": "mistral/devstral-2:123b", + "provider": "mistral", + "model": "devstral-2:123b", + "displayName": "devstral-2:123b", + "family": "devstral", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/devstral-2:123b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "devstral-2:123b" + ], + "families": [ + "devstral" + ], + "releaseDate": "2025-12-09", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "devstral-2:123b", + "modelKey": "devstral-2:123b", + "displayName": "devstral-2:123b", + "family": "devstral", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-12-09" + } + } + ] + }, + { + "id": "mistral/devstral-2512", + "provider": "mistral", + "model": "devstral-2512", + "displayName": "Devstral 2", + "family": "devstral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "anyapi", + "cortecs", + "kilo", + "llmgateway", + "merge-gateway", + "mistral", + "openrouter" + ], + "aliases": [ + "anyapi/mistralai/devstral-2512", + "cortecs/devstral-2512", + "kilo/mistralai/devstral-2512", + "llmgateway/devstral-2512", + "merge-gateway/mistral/devstral-2512", + "mistral/devstral-2512", + "openrouter/mistralai/devstral-2512" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 256000, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false, + "structuredOutput": true, + "promptCaching": false, + "vision": false, + "parallelFunctionCalling": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "devstral-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/devstral-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "devstral-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "mistral/devstral-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "mistral", + "model": "devstral-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/devstral-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.4, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/devstral-2512", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/mistralai/devstral-2512", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + }, + "perImage": { + "input": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/devstral-2512", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Devstral 2", + "Devstral 2 2512", + "Mistral: Devstral 2 2512" + ], + "families": [ + "devstral" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-12", + "releaseDate": "2025-12-09", + "lastUpdated": "2025-12-09", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "mistralai/devstral-2512", + "modelKey": "mistralai/devstral-2512", + "displayName": "Devstral 2", + "family": "devstral", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2025-12-09", + "openWeights": true, + "releaseDate": "2025-12-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "devstral-2512", + "modelKey": "devstral-2512", + "displayName": "Devstral 2 2512", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2025-12-09", + "openWeights": true, + "releaseDate": "2025-12-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/devstral-2512", + "modelKey": "mistralai/devstral-2512", + "displayName": "Mistral: Devstral 2 2512", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-09-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "devstral-2512", + "modelKey": "devstral-2512", + "displayName": "Devstral 2", + "family": "devstral", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2025-12-09", + "openWeights": true, + "releaseDate": "2025-12-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "mistral/devstral-2512", + "modelKey": "mistral/devstral-2512", + "displayName": "Devstral 2", + "family": "devstral", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2025-12-09", + "openWeights": true, + "releaseDate": "2025-12-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "devstral-2512", + "modelKey": "devstral-2512", + "displayName": "Devstral 2", + "family": "devstral", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2025-12-09", + "openWeights": true, + "releaseDate": "2025-12-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/devstral-2512", + "modelKey": "mistralai/devstral-2512", + "displayName": "Devstral 2", + "family": "devstral", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2025-12-09", + "openWeights": true, + "releaseDate": "2025-12-09" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/devstral-2512", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/news/devstral-2-vibe-cli" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/mistralai/devstral-2512", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/devstral-2512", + "displayName": "Mistral: Devstral 2 2512", + "metadata": { + "canonicalSlug": "mistralai/devstral-2512", + "createdAt": "2025-12-09T13:03:39.000Z", + "huggingFaceId": "mistralai/Devstral-2-123B-Instruct-2512", + "links": { + "details": "/api/v1/models/mistralai/devstral-2512/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/devstral-latest", + "provider": "mistral", + "model": "devstral-latest", + "displayName": "Devstral 2", + "family": "devstral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/devstral-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "mistral", + "model": "devstral-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/devstral-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Devstral 2" + ], + "families": [ + "devstral" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-12", + "releaseDate": "2025-12-09", + "lastUpdated": "2025-12-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "devstral-latest", + "modelKey": "devstral-latest", + "displayName": "Devstral 2", + "family": "devstral", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2025-12-09", + "openWeights": true, + "releaseDate": "2025-12-09" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/devstral-latest", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/news/devstral-2-vibe-cli" + } + } + ] + }, + { + "id": "mistral/devstral-medium", + "provider": "mistral", + "model": "devstral-medium", + "displayName": "Mistral: Devstral Medium", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/mistralai/devstral-medium" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 26215, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/devstral-medium", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral: Devstral Medium" + ], + "releaseDate": "2025-07-10", + "lastUpdated": "2025-07-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/devstral-medium", + "modelKey": "mistralai/devstral-medium", + "displayName": "Mistral: Devstral Medium", + "metadata": { + "lastUpdated": "2025-07-10", + "openWeights": true, + "releaseDate": "2025-07-10" + } + } + ] + }, + { + "id": "mistral/devstral-medium-2507", + "provider": "mistral", + "model": "devstral-medium-2507", + "displayName": "Devstral Medium", + "family": "devstral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "merge-gateway", + "mistral" + ], + "aliases": [ + "merge-gateway/mistral/devstral-medium-2507", + "mistral/devstral-medium-2507" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "mistral/devstral-medium-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "mistral", + "model": "devstral-medium-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/devstral-medium-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Devstral Medium" + ], + "families": [ + "devstral" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2025-07-10", + "lastUpdated": "2025-07-10", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "mistral/devstral-medium-2507", + "modelKey": "mistral/devstral-medium-2507", + "displayName": "Devstral Medium", + "family": "devstral", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-07-10", + "openWeights": false, + "releaseDate": "2025-07-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "devstral-medium-2507", + "modelKey": "devstral-medium-2507", + "displayName": "Devstral Medium", + "family": "devstral", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-07-10", + "openWeights": true, + "releaseDate": "2025-07-10" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/devstral-medium-2507", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/news/devstral" + } + } + ] + }, + { + "id": "mistral/devstral-medium-latest", + "provider": "mistral", + "model": "devstral-medium-latest", + "displayName": "Devstral 2 (latest)", + "family": "devstral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "merge-gateway", + "mistral" + ], + "aliases": [ + "merge-gateway/mistral/devstral-medium-latest", + "mistral/devstral-medium-latest" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "mistral/devstral-medium-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "mistral", + "model": "devstral-medium-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/devstral-medium-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Devstral 2 (latest)" + ], + "families": [ + "devstral" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-12", + "releaseDate": "2025-12-02", + "lastUpdated": "2025-12-02", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "mistral/devstral-medium-latest", + "modelKey": "mistral/devstral-medium-latest", + "displayName": "Devstral 2 (latest)", + "family": "devstral", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2025-12-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "devstral-medium-latest", + "modelKey": "devstral-medium-latest", + "displayName": "Devstral 2 (latest)", + "family": "devstral", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2025-12-02" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/devstral-medium-latest", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/news/devstral-2-vibe-cli" + } + } + ] + }, + { + "id": "mistral/devstral-small", + "provider": "mistral", + "model": "devstral-small", + "displayName": "Mistral: Devstral Small 1.1", + "family": "devstral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "kilo", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "kilo/mistralai/devstral-small", + "vercel/mistral/devstral-small", + "vercel_ai_gateway/mistral/devstral-small" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 131072, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/devstral-small", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "mistral/devstral-small", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/devstral-small", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Devstral Small 1.1", + "Mistral: Devstral Small 1.1" + ], + "families": [ + "devstral" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-05-07", + "lastUpdated": "2025-07-10", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/devstral-small", + "modelKey": "mistralai/devstral-small", + "displayName": "Mistral: Devstral Small 1.1", + "metadata": { + "lastUpdated": "2025-07-10", + "openWeights": true, + "releaseDate": "2025-05-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/devstral-small", + "modelKey": "mistral/devstral-small", + "displayName": "Devstral Small 1.1", + "family": "devstral", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-05-07", + "openWeights": false, + "releaseDate": "2025-05-07" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/devstral-small", + "mode": "chat" + } + ] + }, + { + "id": "mistral/devstral-small-2", + "provider": "mistral", + "model": "devstral-small-2", + "displayName": "Devstral Small 2", + "family": "devstral", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/mistral/devstral-small-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "mistral/devstral-small-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Devstral Small 2" + ], + "families": [ + "devstral" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-05-07", + "lastUpdated": "2025-05-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/devstral-small-2", + "modelKey": "mistral/devstral-small-2", + "displayName": "Devstral Small 2", + "family": "devstral", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-05-07", + "openWeights": false, + "releaseDate": "2025-05-07" + } + } + ] + }, + { + "id": "mistral/devstral-small-2-24b-instruct-2512", + "provider": "mistral", + "model": "devstral-small-2-24b-instruct-2512", + "displayName": "Devstral Small 2 24B Instruct 2512", + "family": "devstral", + "sources": [ + "models.dev" + ], + "providers": [ + "evroc" + ], + "aliases": [ + "evroc/mistralai/devstral-small-2-24b-instruct-2512" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "evroc", + "model": "mistralai/devstral-small-2-24b-instruct-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.47 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Devstral Small 2 24B Instruct 2512" + ], + "families": [ + "devstral" + ], + "releaseDate": "2025-12-01", + "lastUpdated": "2025-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "evroc", + "providerName": "evroc", + "providerApi": "https://models.think.evroc.com/v1", + "providerDoc": "https://docs.evroc.com/products/think/overview.html", + "model": "mistralai/devstral-small-2-24b-instruct-2512", + "modelKey": "mistralai/devstral-small-2-24b-instruct-2512", + "displayName": "Devstral Small 2 24B Instruct 2512", + "family": "devstral", + "metadata": { + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01" + } + } + ] + }, + { + "id": "mistral/devstral-small-2:24b", + "provider": "mistral", + "model": "devstral-small-2:24b", + "displayName": "devstral-small-2:24b", + "family": "devstral", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/devstral-small-2:24b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "devstral-small-2:24b" + ], + "families": [ + "devstral" + ], + "releaseDate": "2025-12-09", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "devstral-small-2:24b", + "modelKey": "devstral-small-2:24b", + "displayName": "devstral-small-2:24b", + "family": "devstral", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-12-09" + } + } + ] + }, + { + "id": "mistral/devstral-small-2505", + "provider": "mistral", + "model": "devstral-small-2505", + "displayName": "Devstral Small 2505", + "family": "devstral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "fireworks_ai", + "io-net", + "mistral", + "nano-gpt" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/devstral-small-2505", + "io-net/mistralai/Devstral-Small-2505", + "mistral/devstral-small-2505", + "nano-gpt/mistralai/Devstral-Small-2505" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "io-net", + "model": "mistralai/Devstral-Small-2505", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 0.1, + "input": 0.05, + "output": 0.22 + } + }, + { + "source": "models.dev", + "provider": "mistral", + "model": "devstral-small-2505", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistralai/Devstral-Small-2505", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.060000000000000005, + "output": 0.060000000000000005 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/devstral-small-2505", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/devstral-small-2505", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Devstral Small 2505", + "Mistral Devstral Small 2505" + ], + "families": [ + "devstral" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-05-01", + "lastUpdated": "2025-05-01", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "io-net", + "providerName": "IO.NET", + "providerApi": "https://api.intelligence.io.solutions/api/v1", + "providerDoc": "https://io.net/docs/guides/intelligence/io-intelligence", + "model": "mistralai/Devstral-Small-2505", + "modelKey": "mistralai/Devstral-Small-2505", + "displayName": "Devstral Small 2505", + "family": "devstral", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-05-01", + "openWeights": false, + "releaseDate": "2025-05-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "devstral-small-2505", + "modelKey": "devstral-small-2505", + "displayName": "Devstral Small 2505", + "family": "devstral", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-05-07", + "openWeights": true, + "releaseDate": "2025-05-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistralai/Devstral-Small-2505", + "modelKey": "mistralai/Devstral-Small-2505", + "displayName": "Mistral Devstral Small 2505", + "family": "devstral", + "metadata": { + "lastUpdated": "2025-08-02", + "openWeights": false, + "releaseDate": "2025-08-02" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/devstral-small-2505", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/devstral-small-2505", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/news/devstral" + } + } + ] + }, + { + "id": "mistral/devstral-small-2507", + "provider": "mistral", + "model": "devstral-small-2507", + "displayName": "Devstral Small", + "family": "devstral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "llmgateway", + "merge-gateway", + "mistral" + ], + "aliases": [ + "llmgateway/devstral-small-2507", + "merge-gateway/mistral/devstral-small-2507", + "mistral/devstral-small-2507" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "devstral-small-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "mistral/devstral-small-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "mistral", + "model": "devstral-small-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/devstral-small-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Devstral Small" + ], + "families": [ + "devstral" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2025-07-10", + "lastUpdated": "2025-07-10", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "devstral-small-2507", + "modelKey": "devstral-small-2507", + "displayName": "Devstral Small", + "family": "devstral", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-07-10", + "openWeights": true, + "releaseDate": "2025-07-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "mistral/devstral-small-2507", + "modelKey": "mistral/devstral-small-2507", + "displayName": "Devstral Small", + "family": "devstral", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-07-10", + "openWeights": true, + "releaseDate": "2025-07-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "devstral-small-2507", + "modelKey": "devstral-small-2507", + "displayName": "Devstral Small", + "family": "devstral", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-07-10", + "openWeights": true, + "releaseDate": "2025-07-10" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/devstral-small-2507", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/news/devstral" + } + } + ] + }, + { + "id": "mistral/devstral-small-2512", + "provider": "mistral", + "model": "devstral-small-2512", + "displayName": "Devstral Small 2 2512", + "sources": [ + "models.dev" + ], + "providers": [ + "cortecs" + ], + "aliases": [ + "cortecs/devstral-small-2512" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262000, + "outputTokens": 262000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "devstral-small-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Devstral Small 2 2512" + ], + "knowledgeCutoff": "2025-12", + "releaseDate": "2025-12-09", + "lastUpdated": "2025-12-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "devstral-small-2512", + "modelKey": "devstral-small-2512", + "displayName": "Devstral Small 2 2512", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2025-12-09", + "openWeights": true, + "releaseDate": "2025-12-09" + } + } + ] + }, + { + "id": "mistral/devstral-small-latest", + "provider": "mistral", + "model": "devstral-small-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/devstral-small-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/devstral-small-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/devstral-small-latest", + "mode": "chat", + "metadata": { + "source": "https://docs.mistral.ai/models/devstral-small-2-25-12" + } + } + ] + }, + { + "id": "mistral/labs-devstral-small-2512", + "provider": "mistral", + "model": "labs-devstral-small-2512", + "displayName": "Devstral Small 2", + "family": "devstral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/labs-devstral-small-2512" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "mistral", + "model": "labs-devstral-small-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/labs-devstral-small-2512", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Devstral Small 2" + ], + "families": [ + "devstral" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-12", + "releaseDate": "2025-12-09", + "lastUpdated": "2025-12-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "labs-devstral-small-2512", + "modelKey": "labs-devstral-small-2512", + "displayName": "Devstral Small 2", + "family": "devstral", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2025-12-09", + "openWeights": true, + "releaseDate": "2025-12-09" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/labs-devstral-small-2512", + "mode": "chat", + "metadata": { + "source": "https://docs.mistral.ai/models/devstral-small-2-25-12" + } + } + ] + }, + { + "id": "mistral/magistral-medium", + "provider": "mistral", + "model": "magistral-medium", + "displayName": "Magistral Medium (latest)", + "family": "magistral-medium", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "vercel/mistral/magistral-medium", + "vercel_ai_gateway/mistral/magistral-medium" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "mistral/magistral-medium", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 5 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/magistral-medium", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Magistral Medium (latest)" + ], + "families": [ + "magistral-medium" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2025-03-17", + "lastUpdated": "2025-03-20", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/magistral-medium", + "modelKey": "mistral/magistral-medium", + "displayName": "Magistral Medium (latest)", + "family": "magistral-medium", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-03-20", + "openWeights": true, + "releaseDate": "2025-03-17" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/magistral-medium", + "mode": "chat" + } + ] + }, + { + "id": "mistral/magistral-medium-1-2-2509", + "provider": "mistral", + "model": "magistral-medium-1-2-2509", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/magistral-medium-1-2-2509" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 40000, + "inputTokens": 40000, + "maxTokens": 40000, + "outputTokens": 40000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/magistral-medium-1-2-2509", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/magistral-medium-1-2-2509", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/news/magistral" + } + } + ] + }, + { + "id": "mistral/magistral-medium-2506", + "provider": "mistral", + "model": "magistral-medium-2506", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/magistral-medium-2506" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 40000, + "inputTokens": 40000, + "maxTokens": 40000, + "outputTokens": 40000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/magistral-medium-2506", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/magistral-medium-2506", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/news/magistral" + } + } + ] + }, + { + "id": "mistral/magistral-medium-2509", + "provider": "mistral", + "model": "magistral-medium-2509", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/magistral-medium-2509" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 40000, + "inputTokens": 40000, + "maxTokens": 40000, + "outputTokens": 40000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/magistral-medium-2509", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/magistral-medium-2509", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/news/magistral" + } + } + ] + }, + { + "id": "mistral/magistral-medium-latest", + "provider": "mistral", + "model": "magistral-medium-latest", + "displayName": "Magistral Medium (latest)", + "family": "magistral-medium", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "merge-gateway", + "mistral" + ], + "aliases": [ + "merge-gateway/mistral/magistral-medium-latest", + "mistral/magistral-medium-latest" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 40000, + "maxTokens": 40000, + "outputTokens": 40000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "mistral/magistral-medium-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 5 + } + }, + { + "source": "models.dev", + "provider": "mistral", + "model": "magistral-medium-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 5 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/magistral-medium-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Magistral Medium (latest)" + ], + "families": [ + "magistral-medium" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2025-03-17", + "lastUpdated": "2025-03-20", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "mistral/magistral-medium-latest", + "modelKey": "mistral/magistral-medium-latest", + "displayName": "Magistral Medium (latest)", + "family": "magistral-medium", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-03-20", + "openWeights": false, + "releaseDate": "2025-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "magistral-medium-latest", + "modelKey": "magistral-medium-latest", + "displayName": "Magistral Medium (latest)", + "family": "magistral-medium", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-03-20", + "openWeights": true, + "releaseDate": "2025-03-17" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/magistral-medium-latest", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/news/magistral" + } + } + ] + }, + { + "id": "mistral/magistral-small", + "provider": "mistral", + "model": "magistral-small", + "displayName": "Magistral Small", + "family": "magistral-small", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "mistral", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "mistral/magistral-small", + "vercel/mistral/magistral-small", + "vercel_ai_gateway/mistral/magistral-small" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 64000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "mistral", + "model": "magistral-small", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "mistral/magistral-small", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/magistral-small", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Magistral Small" + ], + "families": [ + "magistral-small" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2025-03-17", + "lastUpdated": "2025-03-17", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "magistral-small", + "modelKey": "magistral-small", + "displayName": "Magistral Small", + "family": "magistral-small", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-03-17", + "openWeights": true, + "releaseDate": "2025-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/magistral-small", + "modelKey": "mistral/magistral-small", + "displayName": "Magistral Small", + "family": "magistral-small", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-03-17", + "openWeights": true, + "releaseDate": "2025-03-17" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/magistral-small", + "mode": "chat" + } + ] + }, + { + "id": "mistral/magistral-small-1-2-2509", + "provider": "mistral", + "model": "magistral-small-1-2-2509", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/magistral-small-1-2-2509" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 40000, + "inputTokens": 40000, + "maxTokens": 40000, + "outputTokens": 40000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/magistral-small-1-2-2509", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/magistral-small-1-2-2509", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/pricing#api-pricing" + } + } + ] + }, + { + "id": "mistral/magistral-small-2506", + "provider": "mistral", + "model": "magistral-small-2506", + "displayName": "Magistral Small 2506", + "family": "magistral-small", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "io-net", + "mistral", + "nano-gpt", + "nvidia" + ], + "aliases": [ + "io-net/mistralai/Magistral-Small-2506", + "mistral/magistral-small-2506", + "nano-gpt/Magistral-Small-2506", + "nvidia/mistralai/magistral-small-2506" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 128000, + "inputTokens": 40000, + "maxTokens": 40000, + "outputTokens": 40000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "temperature": true, + "toolCalling": true, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "io-net", + "model": "mistralai/Magistral-Small-2506", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "cacheWrite": 1, + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Magistral-Small-2506", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.4 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "mistralai/magistral-small-2506", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/magistral-small-2506", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Magistral Small 2506" + ], + "families": [ + "magistral-small" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-06-01", + "lastUpdated": "2025-06-01", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "io-net", + "providerName": "IO.NET", + "providerApi": "https://api.intelligence.io.solutions/api/v1", + "providerDoc": "https://io.net/docs/guides/intelligence/io-intelligence", + "model": "mistralai/Magistral-Small-2506", + "modelKey": "mistralai/Magistral-Small-2506", + "displayName": "Magistral Small 2506", + "family": "magistral-small", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-06-01", + "openWeights": false, + "releaseDate": "2025-06-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Magistral-Small-2506", + "modelKey": "Magistral-Small-2506", + "displayName": "Magistral Small 2506", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "mistralai/magistral-small-2506", + "modelKey": "mistralai/magistral-small-2506", + "displayName": "Magistral Small 2506", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/magistral-small-2506", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/pricing#api-pricing" + } + } + ] + }, + { + "id": "mistral/magistral-small-2509", + "provider": "mistral", + "model": "magistral-small-2509", + "displayName": "Magistral Small 1.2 24B", + "family": "magistral-small", + "sources": [ + "models.dev" + ], + "providers": [ + "evroc" + ], + "aliases": [ + "evroc/mistralai/Magistral-Small-2509" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "evroc", + "model": "mistralai/Magistral-Small-2509", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.59, + "output": 2.36 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Magistral Small 1.2 24B" + ], + "families": [ + "magistral-small" + ], + "releaseDate": "2025-06-01", + "lastUpdated": "2025-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "evroc", + "providerName": "evroc", + "providerApi": "https://models.think.evroc.com/v1", + "providerDoc": "https://docs.evroc.com/products/think/overview.html", + "model": "mistralai/Magistral-Small-2509", + "modelKey": "mistralai/Magistral-Small-2509", + "displayName": "Magistral Small 1.2 24B", + "family": "magistral-small", + "metadata": { + "lastUpdated": "2025-06-01", + "openWeights": true, + "releaseDate": "2025-06-01" + } + } + ] + }, + { + "id": "mistral/magistral-small-latest", + "provider": "mistral", + "model": "magistral-small-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/magistral-small-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 40000, + "inputTokens": 40000, + "maxTokens": 40000, + "outputTokens": 40000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/magistral-small-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/magistral-small-latest", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/pricing#api-pricing" + } + } + ] + }, + { + "id": "mistral/ministral-14b", + "provider": "mistral", + "model": "ministral-14b", + "displayName": "Ministral 14B", + "family": "ministral", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/mistral/ministral-14b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "mistral/ministral-14b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ministral 14B" + ], + "families": [ + "ministral" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-12-01", + "lastUpdated": "2025-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/ministral-14b", + "modelKey": "mistral/ministral-14b", + "displayName": "Ministral 14B", + "family": "ministral", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-12-01", + "openWeights": false, + "releaseDate": "2025-12-01" + } + } + ] + }, + { + "id": "mistral/ministral-14b-2512", + "provider": "mistral", + "model": "ministral-14b-2512", + "displayName": "Ministral 3 14B 2512", + "family": "ministral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "kilo", + "llmgateway", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "302ai/ministral-14b-2512", + "kilo/mistralai/ministral-14b-2512", + "llmgateway/ministral-14b-2512", + "nano-gpt/mistralai/ministral-14b-2512", + "openrouter/mistralai/ministral-14b-2512" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "ministral-14b-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.33, + "output": 0.33 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/ministral-14b-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "ministral-14b-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistralai/ministral-14b-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/ministral-14b-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/mistralai/ministral-14b-2512", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + }, + "perImage": { + "input": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/ministral-14b-2512", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ministral 14B", + "Ministral 3 14B 2512", + "Mistral: Ministral 3 14B 2512", + "ministral-14b-2512" + ], + "families": [ + "ministral", + "mistral" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-12-16", + "lastUpdated": "2025-12-16", + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "ministral-14b-2512", + "modelKey": "ministral-14b-2512", + "displayName": "ministral-14b-2512", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-12-16", + "openWeights": false, + "releaseDate": "2025-12-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/ministral-14b-2512", + "modelKey": "mistralai/ministral-14b-2512", + "displayName": "Mistral: Ministral 3 14B 2512", + "metadata": { + "lastUpdated": "2025-12-16", + "openWeights": false, + "releaseDate": "2025-12-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "ministral-14b-2512", + "modelKey": "ministral-14b-2512", + "displayName": "Ministral 14B", + "family": "mistral", + "metadata": { + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2025-12-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistralai/ministral-14b-2512", + "modelKey": "mistralai/ministral-14b-2512", + "displayName": "Ministral 14B", + "family": "ministral", + "metadata": { + "lastUpdated": "2025-12-04", + "openWeights": false, + "releaseDate": "2025-12-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/ministral-14b-2512", + "modelKey": "mistralai/ministral-14b-2512", + "displayName": "Ministral 3 14B 2512", + "family": "ministral", + "metadata": { + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2025-12-02" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/mistralai/ministral-14b-2512", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/ministral-14b-2512", + "displayName": "Mistral: Ministral 3 14B 2512", + "metadata": { + "canonicalSlug": "mistralai/ministral-14b-2512", + "createdAt": "2025-12-02T13:22:15.000Z", + "huggingFaceId": "mistralai/Ministral-3-14B-Instruct-2512", + "links": { + "details": "/api/v1/models/mistralai/ministral-14b-2512/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/ministral-14b-instruct-2512", + "provider": "mistral", + "model": "ministral-14b-instruct-2512", + "displayName": "Ministral 3 14B", + "family": "ministral", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/mistralai/ministral-14b-instruct-2512" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistralai/ministral-14b-instruct-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ministral 3 14B" + ], + "families": [ + "ministral" + ], + "releaseDate": "2025-12-02", + "lastUpdated": "2025-12-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistralai/ministral-14b-instruct-2512", + "modelKey": "mistralai/ministral-14b-instruct-2512", + "displayName": "Ministral 3 14B", + "family": "ministral", + "metadata": { + "lastUpdated": "2025-12-02", + "openWeights": false, + "releaseDate": "2025-12-02" + } + } + ] + }, + { + "id": "mistral/ministral-3-14b-2512", + "provider": "mistral", + "model": "ministral-3-14b-2512", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/ministral-3-14b-2512" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/ministral-3-14b-2512", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/ministral-3-14b-2512", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/pricing" + } + } + ] + }, + { + "id": "mistral/ministral-3-14b-instruct-2512", + "provider": "mistral", + "model": "ministral-3-14b-instruct-2512", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/ministral-3-14b-instruct-2512" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/ministral-3-14b-instruct-2512", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/ministral-3-14b-instruct-2512", + "mode": "chat" + } + ] + }, + { + "id": "mistral/ministral-3-14b-reasoning-2512", + "provider": "mistral", + "model": "ministral-3-14b-reasoning-2512", + "displayName": "Ministral 3 14B Reasoning 2512", + "family": "ministral", + "sources": [ + "models.dev" + ], + "providers": [ + "clarifai" + ], + "aliases": [ + "clarifai/mistralai/completion/models/Ministral-3-14B-Reasoning-2512" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "clarifai", + "model": "mistralai/completion/models/Ministral-3-14B-Reasoning-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 1.7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ministral 3 14B Reasoning 2512" + ], + "families": [ + "ministral" + ], + "knowledgeCutoff": "2025-12", + "releaseDate": "2025-12-01", + "lastUpdated": "2025-12-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "clarifai", + "providerName": "Clarifai", + "providerApi": "https://api.clarifai.com/v2/ext/openai/v1", + "providerDoc": "https://docs.clarifai.com/compute/inference/", + "model": "mistralai/completion/models/Ministral-3-14B-Reasoning-2512", + "modelKey": "mistralai/completion/models/Ministral-3-14B-Reasoning-2512", + "displayName": "Ministral 3 14B Reasoning 2512", + "family": "ministral", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2025-12-12", + "openWeights": true, + "releaseDate": "2025-12-01" + } + } + ] + }, + { + "id": "mistral/ministral-3-3b-2512", + "provider": "mistral", + "model": "ministral-3-3b-2512", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/ministral-3-3b-2512" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/ministral-3-3b-2512", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/ministral-3-3b-2512", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/pricing" + } + } + ] + }, + { + "id": "mistral/ministral-3-3b-instruct-2512", + "provider": "mistral", + "model": "ministral-3-3b-instruct-2512", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/ministral-3-3b-instruct-2512" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/ministral-3-3b-instruct-2512", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/ministral-3-3b-instruct-2512", + "mode": "chat" + } + ] + }, + { + "id": "mistral/ministral-3-3b-reasoning-2512", + "provider": "mistral", + "model": "ministral-3-3b-reasoning-2512", + "displayName": "Ministral 3 3B Reasoning 2512", + "family": "ministral", + "sources": [ + "models.dev" + ], + "providers": [ + "clarifai" + ], + "aliases": [ + "clarifai/mistralai/completion/models/Ministral-3-3B-Reasoning-2512" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "clarifai", + "model": "mistralai/completion/models/Ministral-3-3B-Reasoning-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.039, + "output": 0.54825 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ministral 3 3B Reasoning 2512" + ], + "families": [ + "ministral" + ], + "releaseDate": "2025-12", + "lastUpdated": "2026-02-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "clarifai", + "providerName": "Clarifai", + "providerApi": "https://api.clarifai.com/v2/ext/openai/v1", + "providerDoc": "https://docs.clarifai.com/compute/inference/", + "model": "mistralai/completion/models/Ministral-3-3B-Reasoning-2512", + "modelKey": "mistralai/completion/models/Ministral-3-3B-Reasoning-2512", + "displayName": "Ministral 3 3B Reasoning 2512", + "family": "ministral", + "metadata": { + "lastUpdated": "2026-02-25", + "openWeights": true, + "releaseDate": "2025-12" + } + } + ] + }, + { + "id": "mistral/ministral-3-8b-2512", + "provider": "mistral", + "model": "ministral-3-8b-2512", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/ministral-3-8b-2512" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/ministral-3-8b-2512", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/ministral-3-8b-2512", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/pricing" + } + } + ] + }, + { + "id": "mistral/ministral-3-8b-instruct-2512", + "provider": "mistral", + "model": "ministral-3-8b-instruct-2512", + "displayName": "Ministral 3 8B", + "family": "ministral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "digitalocean", + "fireworks_ai" + ], + "aliases": [ + "digitalocean/ministral-3-8b-instruct-2512", + "fireworks_ai/accounts/fireworks/models/ministral-3-8b-instruct-2512" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": true, + "openWeights": true, + "reasoning": false, + "temperature": true, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/ministral-3-8b-instruct-2512", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ministral 3 8B" + ], + "families": [ + "ministral" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-12-15", + "lastUpdated": "2025-12-15", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "ministral-3-8b-instruct-2512", + "modelKey": "ministral-3-8b-instruct-2512", + "displayName": "Ministral 3 8B", + "family": "ministral", + "metadata": { + "lastUpdated": "2025-12-15", + "openWeights": true, + "releaseDate": "2025-12-15" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/ministral-3-8b-instruct-2512", + "mode": "chat" + } + ] + }, + { + "id": "mistral/ministral-3:14b", + "provider": "mistral", + "model": "ministral-3:14b", + "displayName": "ministral-3:14b", + "family": "ministral", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/ministral-3:14b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "ministral-3:14b" + ], + "families": [ + "ministral" + ], + "releaseDate": "2024-12-01", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "ministral-3:14b", + "modelKey": "ministral-3:14b", + "displayName": "ministral-3:14b", + "family": "ministral", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2024-12-01" + } + } + ] + }, + { + "id": "mistral/ministral-3:3b", + "provider": "mistral", + "model": "ministral-3:3b", + "displayName": "ministral-3:3b", + "family": "ministral", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/ministral-3:3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "ministral-3:3b" + ], + "families": [ + "ministral" + ], + "releaseDate": "2024-10-22", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "ministral-3:3b", + "modelKey": "ministral-3:3b", + "displayName": "ministral-3:3b", + "family": "ministral", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2024-10-22" + } + } + ] + }, + { + "id": "mistral/ministral-3:8b", + "provider": "mistral", + "model": "ministral-3:8b", + "displayName": "ministral-3:8b", + "family": "ministral", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/ministral-3:8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "ministral-3:8b" + ], + "families": [ + "ministral" + ], + "releaseDate": "2024-12-01", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "ministral-3:8b", + "modelKey": "ministral-3:8b", + "displayName": "ministral-3:8b", + "family": "ministral", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2024-12-01" + } + } + ] + }, + { + "id": "mistral/ministral-3b", + "provider": "mistral", + "model": "ministral-3b", + "displayName": "Ministral 3B", + "family": "ministral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "azure_ai", + "github-models", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "azure-cognitive-services/ministral-3b", + "azure/ministral-3b", + "azure_ai/ministral-3b", + "github-models/mistral-ai/ministral-3b", + "vercel/mistral/ministral-3b", + "vercel_ai_gateway/mistral/ministral-3b" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "ministral-3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.04 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "ministral-3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.04 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "mistral-ai/ministral-3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "mistral/ministral-3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.04 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/ministral-3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.04 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/ministral-3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.04 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ministral 3B", + "Ministral 3B (latest)" + ], + "families": [ + "ministral" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-03", + "releaseDate": "2024-10-22", + "lastUpdated": "2024-10-22", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "ministral-3b", + "modelKey": "ministral-3b", + "displayName": "Ministral 3B", + "family": "ministral", + "metadata": { + "knowledgeCutoff": "2024-03", + "lastUpdated": "2024-10-22", + "openWeights": true, + "releaseDate": "2024-10-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "ministral-3b", + "modelKey": "ministral-3b", + "displayName": "Ministral 3B", + "family": "ministral", + "metadata": { + "knowledgeCutoff": "2024-03", + "lastUpdated": "2024-10-22", + "openWeights": true, + "releaseDate": "2024-10-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "mistral-ai/ministral-3b", + "modelKey": "mistral-ai/ministral-3b", + "displayName": "Ministral 3B", + "family": "ministral", + "metadata": { + "knowledgeCutoff": "2024-03", + "lastUpdated": "2024-10-22", + "openWeights": true, + "releaseDate": "2024-10-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/ministral-3b", + "modelKey": "mistral/ministral-3b", + "displayName": "Ministral 3B (latest)", + "family": "ministral", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-10-04", + "openWeights": true, + "releaseDate": "2024-10-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/ministral-3b", + "mode": "chat", + "metadata": { + "source": "https://azuremarketplace.microsoft.com/en/marketplace/apps/000-000.ministral-3b-2410-offer?tab=Overview" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/ministral-3b", + "mode": "chat" + } + ] + }, + { + "id": "mistral/ministral-3b-2512", + "provider": "mistral", + "model": "ministral-3b-2512", + "displayName": "Ministral 3 3B 2512", + "family": "ministral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "llmgateway", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "kilo/mistralai/ministral-3b-2512", + "llmgateway/ministral-3b-2512", + "nano-gpt/mistralai/ministral-3b-2512", + "openrouter/mistralai/ministral-3b-2512" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/ministral-3b-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "ministral-3b-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistralai/ministral-3b-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/ministral-3b-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/mistralai/ministral-3b-2512", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + }, + "perImage": { + "input": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/ministral-3b-2512", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ministral 3 3B 2512", + "Ministral 3B", + "Mistral: Ministral 3 3B 2512" + ], + "families": [ + "ministral", + "mistral" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-12-02", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/ministral-3b-2512", + "modelKey": "mistralai/ministral-3b-2512", + "displayName": "Mistral: Ministral 3 3B 2512", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-12-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "ministral-3b-2512", + "modelKey": "ministral-3b-2512", + "displayName": "Ministral 3B", + "family": "mistral", + "metadata": { + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2025-12-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistralai/ministral-3b-2512", + "modelKey": "mistralai/ministral-3b-2512", + "displayName": "Ministral 3B", + "family": "ministral", + "metadata": { + "lastUpdated": "2025-12-04", + "openWeights": false, + "releaseDate": "2025-12-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/ministral-3b-2512", + "modelKey": "mistralai/ministral-3b-2512", + "displayName": "Ministral 3 3B 2512", + "family": "ministral", + "metadata": { + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2025-12-02" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/mistralai/ministral-3b-2512", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/ministral-3b-2512", + "displayName": "Mistral: Ministral 3 3B 2512", + "metadata": { + "canonicalSlug": "mistralai/ministral-3b-2512", + "createdAt": "2025-12-02T13:19:20.000Z", + "huggingFaceId": "mistralai/Ministral-3-3B-Instruct-2512", + "links": { + "details": "/api/v1/models/mistralai/ministral-3b-2512/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/ministral-3b-latest", + "provider": "mistral", + "model": "ministral-3b-latest", + "displayName": "Ministral 3B (latest)", + "family": "ministral", + "sources": [ + "models.dev" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/ministral-3b-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "mistral", + "model": "ministral-3b-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.04 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ministral 3B (latest)" + ], + "families": [ + "ministral" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-10-01", + "lastUpdated": "2024-10-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "ministral-3b-latest", + "modelKey": "ministral-3b-latest", + "displayName": "Ministral 3B (latest)", + "family": "ministral", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-10-04", + "openWeights": true, + "releaseDate": "2024-10-01" + } + } + ] + }, + { + "id": "mistral/ministral-8b", + "provider": "mistral", + "model": "ministral-8b", + "displayName": "Ministral 8B (latest)", + "family": "ministral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "vercel/mistral/ministral-8b", + "vercel_ai_gateway/mistral/ministral-8b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "mistral/ministral-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/ministral-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ministral 8B (latest)" + ], + "families": [ + "ministral" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-10-01", + "lastUpdated": "2024-10-04", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/ministral-8b", + "modelKey": "mistral/ministral-8b", + "displayName": "Ministral 8B (latest)", + "family": "ministral", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-10-04", + "openWeights": true, + "releaseDate": "2024-10-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/ministral-8b", + "mode": "chat" + } + ] + }, + { + "id": "mistral/ministral-8b-2512", + "provider": "mistral", + "model": "ministral-8b-2512", + "displayName": "Ministral 3 8B 2512", + "family": "ministral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "llmgateway", + "mistral", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "kilo/mistralai/ministral-8b-2512", + "llmgateway/ministral-8b-2512", + "mistral/ministral-8b-2512", + "nano-gpt/mistralai/ministral-8b-2512", + "openrouter/mistralai/ministral-8b-2512" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false, + "attachments": true, + "openWeights": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "promptCaching": false, + "parallelFunctionCalling": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/ministral-8b-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "ministral-8b-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistralai/ministral-8b-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/ministral-8b-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/ministral-8b-2512", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/mistralai/ministral-8b-2512", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + }, + "perImage": { + "input": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/ministral-8b-2512", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ministral 3 8B 2512", + "Ministral 8B", + "Mistral: Ministral 3 8B 2512" + ], + "families": [ + "ministral", + "mistral" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-12-02", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/ministral-8b-2512", + "modelKey": "mistralai/ministral-8b-2512", + "displayName": "Mistral: Ministral 3 8B 2512", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-12-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "ministral-8b-2512", + "modelKey": "ministral-8b-2512", + "displayName": "Ministral 8B", + "family": "mistral", + "metadata": { + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2025-12-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistralai/ministral-8b-2512", + "modelKey": "mistralai/ministral-8b-2512", + "displayName": "Ministral 8B", + "family": "ministral", + "metadata": { + "lastUpdated": "2025-12-04", + "openWeights": false, + "releaseDate": "2025-12-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/ministral-8b-2512", + "modelKey": "mistralai/ministral-8b-2512", + "displayName": "Ministral 3 8B 2512", + "family": "ministral", + "metadata": { + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2025-12-02" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/ministral-8b-2512", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/mistralai/ministral-8b-2512", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/ministral-8b-2512", + "displayName": "Mistral: Ministral 3 8B 2512", + "metadata": { + "canonicalSlug": "mistralai/ministral-8b-2512", + "createdAt": "2025-12-02T13:20:54.000Z", + "huggingFaceId": "mistralai/Ministral-3-8B-Instruct-2512", + "links": { + "details": "/api/v1/models/mistralai/ministral-8b-2512/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/ministral-8b-latest", + "provider": "mistral", + "model": "ministral-8b-latest", + "displayName": "Ministral 8B (latest)", + "family": "ministral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/ministral-8b-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "mistral", + "model": "ministral-8b-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/ministral-8b-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ministral 8B (latest)" + ], + "families": [ + "ministral" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-10-01", + "lastUpdated": "2024-10-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "ministral-8b-latest", + "modelKey": "ministral-8b-latest", + "displayName": "Ministral 8B (latest)", + "family": "ministral", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-10-04", + "openWeights": true, + "releaseDate": "2024-10-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/ministral-8b-latest", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/pricing" + } + } + ] + }, + { + "id": "mistral/mistral", + "provider": "mistral", + "model": "mistral", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/mistral" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/mistral", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/mistral", + "mode": "completion" + } + ] + }, + { + "id": "mistral/mistral-3-14b", + "provider": "mistral", + "model": "mistral-3-14b", + "displayName": "Ministral 3 14B Instruct", + "family": "ministral", + "sources": [ + "models.dev" + ], + "providers": [ + "digitalocean" + ], + "aliases": [ + "digitalocean/mistral-3-14B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "digitalocean", + "model": "mistral-3-14B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ministral 3 14B Instruct" + ], + "families": [ + "ministral" + ], + "releaseDate": "2025-12-15", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "mistral-3-14B", + "modelKey": "mistral-3-14B", + "displayName": "Ministral 3 14B Instruct", + "family": "ministral", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2025-12-15" + } + } + ] + }, + { + "id": "mistral/mistral-7b", + "provider": "mistral", + "model": "mistral-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai", + "snowflake" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/mistral-7b", + "snowflake/mistral-7b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/mistral-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-7b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/mistral-7b", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-7b-instruct", + "provider": "mistral", + "model": "mistral-7b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/mistralai/mistral-7b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/mistralai/mistral-7b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0.13 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/mistralai/mistral-7b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-7b-instruct-4k", + "provider": "mistral", + "model": "mistral-7b-instruct-4k", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/mistral-7b-instruct-4k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-7b-instruct-4k", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-7b-instruct-4k", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-7b-instruct-v0.1", + "provider": "mistral", + "model": "mistral-7b-instruct-v0.1", + "displayName": "Mistral 7B Instruct v0.1", + "family": "mistral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "anyscale", + "cloudflare", + "cloudflare-ai-gateway", + "kilo", + "ollama", + "together_ai" + ], + "aliases": [ + "anyscale/mistralai/Mistral-7B-Instruct-v0.1", + "cloudflare-ai-gateway/workers-ai/@cf/mistral/mistral-7b-instruct-v0.1", + "cloudflare/@cf/mistral/mistral-7b-instruct-v0.1", + "kilo/mistralai/mistral-7b-instruct-v0.1", + "ollama/mistral-7B-Instruct-v0.1", + "together_ai/mistralai/Mistral-7B-Instruct-v0.1" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 128000, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/mistral/mistral-7b-instruct-v0.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.11, + "output": 0.19 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/mistral-7b-instruct-v0.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.11, + "output": 0.19 + } + }, + { + "source": "litellm", + "provider": "anyscale", + "model": "anyscale/mistralai/Mistral-7B-Instruct-v0.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "cloudflare", + "model": "cloudflare/@cf/mistral/mistral-7b-instruct-v0.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.923, + "output": 1.923 + } + }, + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/mistral-7B-Instruct-v0.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/mistralai/Mistral-7B-Instruct-v0.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral 7B Instruct v0.1", + "Mistral: Mistral 7B Instruct v0.1" + ], + "families": [ + "mistral" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-04-03", + "lastUpdated": "2025-04-03", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/mistral/mistral-7b-instruct-v0.1", + "modelKey": "workers-ai/@cf/mistral/mistral-7b-instruct-v0.1", + "displayName": "Mistral 7B Instruct v0.1", + "family": "mistral", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/mistral-7b-instruct-v0.1", + "modelKey": "mistralai/mistral-7b-instruct-v0.1", + "displayName": "Mistral: Mistral 7B Instruct v0.1", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anyscale", + "model": "anyscale/mistralai/Mistral-7B-Instruct-v0.1", + "mode": "chat", + "metadata": { + "source": "https://docs.anyscale.com/preview/endpoints/text-generation/supported-models/mistralai-Mistral-7B-Instruct-v0.1" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cloudflare", + "model": "cloudflare/@cf/mistral/mistral-7b-instruct-v0.1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/mistral-7B-Instruct-v0.1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/mistralai/Mistral-7B-Instruct-v0.1", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-7b-instruct-v0.2", + "provider": "mistral", + "model": "mistral-7b-instruct-v0.2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ollama", + "replicate" + ], + "aliases": [ + "ollama/mistral-7B-Instruct-v0.2", + "replicate/mistralai/mistral-7b-instruct-v0.2" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "toolChoice": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/mistral-7B-Instruct-v0.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/mistralai/mistral-7b-instruct-v0.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/mistral-7B-Instruct-v0.2", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/mistralai/mistral-7b-instruct-v0.2", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-7b-instruct-v0.3", + "provider": "mistral", + "model": "mistral-7b-instruct-v0.3", + "displayName": "Mistral-7B-Instruct-v0.3", + "family": "mistral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "digitalocean", + "ovhcloud" + ], + "aliases": [ + "digitalocean/mistral-7b-instruct-v0.3", + "ovhcloud/Mistral-7B-Instruct-v0.3", + "ovhcloud/mistral-7b-instruct-v0.3" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 127000, + "inputTokens": 127000, + "maxTokens": 127000, + "outputTokens": 127000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "ovhcloud", + "model": "mistral-7b-instruct-v0.3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.11, + "output": 0.11 + } + }, + { + "source": "litellm", + "provider": "ovhcloud", + "model": "ovhcloud/Mistral-7B-Instruct-v0.3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral 7B Instruct v0.3", + "Mistral-7B-Instruct-v0.3" + ], + "families": [ + "mistral" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-05-22", + "lastUpdated": "2024-05-22", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "mistral-7b-instruct-v0.3", + "modelKey": "mistral-7b-instruct-v0.3", + "displayName": "Mistral 7B Instruct v0.3", + "family": "mistral", + "metadata": { + "lastUpdated": "2024-05-22", + "openWeights": true, + "releaseDate": "2024-05-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ovhcloud", + "providerName": "OVHcloud AI Endpoints", + "providerApi": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", + "providerDoc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", + "model": "mistral-7b-instruct-v0.3", + "modelKey": "mistral-7b-instruct-v0.3", + "displayName": "Mistral-7B-Instruct-v0.3", + "metadata": { + "lastUpdated": "2025-04-01", + "openWeights": true, + "releaseDate": "2025-04-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ovhcloud", + "model": "ovhcloud/Mistral-7B-Instruct-v0.3", + "mode": "chat", + "metadata": { + "source": "https://endpoints.ai.cloud.ovh.net/models/mistral-7b-instruct-v0-3" + } + } + ] + }, + { + "id": "mistral/mistral-7b-instruct-v03", + "provider": "mistral", + "model": "mistral-7b-instruct-v03", + "displayName": "Mistral-7B-Instruct-v0.3", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/mistralai/mistral-7b-instruct-v03" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "mistralai/mistral-7b-instruct-v03", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral-7B-Instruct-v0.3" + ], + "releaseDate": "2025-04-01", + "lastUpdated": "2025-04-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "mistralai/mistral-7b-instruct-v03", + "modelKey": "mistralai/mistral-7b-instruct-v03", + "displayName": "Mistral-7B-Instruct-v0.3", + "metadata": { + "lastUpdated": "2025-04-01", + "openWeights": true, + "releaseDate": "2025-04-01" + } + } + ] + }, + { + "id": "mistral/mistral-7b-instruct-v0p2", + "provider": "mistral", + "model": "mistral-7b-instruct-v0p2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/mistral-7b-instruct-v0p2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-7b-instruct-v0p2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-7b-instruct-v0p2", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-7b-instruct-v3", + "provider": "mistral", + "model": "mistral-7b-instruct-v3", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/mistral-7b-instruct-v3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-7b-instruct-v3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-7b-instruct-v3", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-7b-v0.1", + "provider": "mistral", + "model": "mistral-7b-v0.1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "replicate" + ], + "aliases": [ + "replicate/mistralai/mistral-7b-v0.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/mistralai/mistral-7b-v0.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/mistralai/mistral-7b-v0.1", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-7b-v0.3", + "provider": "mistral", + "model": "mistral-7b-v0.3", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "llamagate" + ], + "aliases": [ + "llamagate/mistral-7b-v0.3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "llamagate", + "model": "llamagate/mistral-7b-v0.3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "llamagate", + "model": "llamagate/mistral-7b-v0.3", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-7b-v0p2", + "provider": "mistral", + "model": "mistral-7b-v0p2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/mistral-7b-v0p2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-7b-v0p2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-7b-v0p2", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-code-agent-latest", + "provider": "mistral", + "model": "mistral-code-agent-latest", + "displayName": "Mistral Code Agent Latest", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/mistral-code-agent-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistral-code-agent-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Code Agent Latest" + ], + "releaseDate": "2026-06-02", + "lastUpdated": "2026-06-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistral-code-agent-latest", + "modelKey": "mistral-code-agent-latest", + "displayName": "Mistral Code Agent Latest", + "metadata": { + "lastUpdated": "2026-06-02", + "openWeights": false, + "releaseDate": "2026-06-02" + } + } + ] + }, + { + "id": "mistral/mistral-code-latest", + "provider": "mistral", + "model": "mistral-code-latest", + "displayName": "Mistral Code Latest", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/mistral-code-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistral-code-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Code Latest" + ], + "releaseDate": "2026-06-02", + "lastUpdated": "2026-06-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistral-code-latest", + "modelKey": "mistral-code-latest", + "displayName": "Mistral Code Latest", + "metadata": { + "lastUpdated": "2026-06-02", + "openWeights": false, + "releaseDate": "2026-06-02" + } + } + ] + }, + { + "id": "mistral/mistral-document-ai-2505", + "provider": "mistral", + "model": "mistral-document-ai-2505", + "mode": "ocr", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/mistral-document-ai-2505" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/mistral-document-ai-2505", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPage": { + "ocr": 0.003 + } + } + ] + }, + "metadata": { + "modes": [ + "ocr" + ], + "supportedEndpoints": [ + "/v1/ocr" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/mistral-document-ai-2505", + "mode": "ocr", + "metadata": { + "source": "https://devblogs.microsoft.com/foundry/whats-new-in-azure-ai-foundry-august-2025/#mistral-document-ai-(ocr)-%E2%80%94-serverless-in-foundry", + "supportedEndpoints": [ + "/v1/ocr" + ] + } + } + ] + }, + { + "id": "mistral/mistral-document-ai-2512", + "provider": "mistral", + "model": "mistral-document-ai-2512", + "mode": "ocr", + "sources": [ + "litellm" + ], + "providers": [ + "azure_ai" + ], + "aliases": [ + "azure_ai/mistral-document-ai-2512" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/mistral-document-ai-2512", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPage": { + "ocr": 0.003 + } + } + ] + }, + "metadata": { + "modes": [ + "ocr" + ], + "supportedEndpoints": [ + "/v1/ocr" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/mistral-document-ai-2512", + "mode": "ocr", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/ai-foundry-models/", + "supportedEndpoints": [ + "/v1/ocr" + ] + } + } + ] + }, + { + "id": "mistral/mistral-embed", + "provider": "mistral", + "model": "mistral-embed", + "displayName": "Mistral Embed", + "family": "mistral-embed", + "mode": "embedding", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "mistral", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "mistral/mistral-embed", + "vercel/mistral/mistral-embed", + "vercel_ai_gateway/mistral/mistral-embed" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding", + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "embedding": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "mistral", + "model": "mistral-embed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-embed", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/mistral-embed", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Embed" + ], + "families": [ + "mistral-embed" + ], + "modes": [ + "chat", + "embedding" + ], + "releaseDate": "2023-12-11", + "lastUpdated": "2023-12-11", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "mistral-embed", + "modelKey": "mistral-embed", + "displayName": "Mistral Embed", + "family": "mistral-embed", + "metadata": { + "lastUpdated": "2023-12-11", + "openWeights": false, + "releaseDate": "2023-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/mistral-embed", + "modelKey": "mistral/mistral-embed", + "displayName": "Mistral Embed", + "family": "mistral-embed", + "metadata": { + "lastUpdated": "2023-12-11", + "openWeights": false, + "releaseDate": "2023-12-11" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-embed", + "mode": "embedding" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/mistral-embed", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-large", + "provider": "mistral", + "model": "mistral-large", + "displayName": "Mistral Large", + "family": "mistral-large", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure_ai", + "kilo", + "nano-gpt", + "openrouter", + "snowflake", + "vercel_ai_gateway", + "watsonx" + ], + "aliases": [ + "azure_ai/mistral-large", + "kilo/mistralai/mistral-large", + "nano-gpt/mistralai/mistral-large", + "openrouter/mistralai/mistral-large", + "snowflake/mistral-large", + "vercel_ai_gateway/mistral/mistral-large", + "watsonx/mistralai/mistral-large" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 16384, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false, + "functionCalling": true, + "promptCaching": true, + "systemMessages": true, + "vision": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/mistral-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistralai/mistral-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.006, + "output": 6.001 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/mistral-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/mistral-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 4, + "output": 12 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/mistralai/mistral-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 8, + "output": 24 + } + }, + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/mistral-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/mistral-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/mistralai/mistral-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/mistral-large", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Large", + "Mistral Large 2411" + ], + "families": [ + "mistral-large" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-11-30", + "releaseDate": "2024-07-24", + "lastUpdated": "2025-12-02", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/mistral-large", + "modelKey": "mistralai/mistral-large", + "displayName": "Mistral Large", + "metadata": { + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2024-07-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistralai/mistral-large", + "modelKey": "mistralai/mistral-large", + "displayName": "Mistral Large 2411", + "family": "mistral-large", + "metadata": { + "lastUpdated": "2024-02-26", + "openWeights": false, + "releaseDate": "2024-02-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/mistral-large", + "modelKey": "mistralai/mistral-large", + "displayName": "Mistral Large", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-11-30", + "lastUpdated": "2024-02-26", + "openWeights": false, + "releaseDate": "2024-02-26" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/mistral-large", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/mistralai/mistral-large", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/mistral-large", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/mistral-large", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/mistralai/mistral-large", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/mistral-large", + "displayName": "Mistral Large", + "metadata": { + "canonicalSlug": "mistralai/mistral-large", + "createdAt": "2024-02-26T00:00:00.000Z", + "knowledgeCutoff": "2024-11-30", + "links": { + "details": "/api/v1/models/mistralai/mistral-large/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/mistral-large-2402", + "provider": "mistral", + "model": "mistral-large-2402", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "mistral" + ], + "aliases": [ + "azure/mistral-large-2402", + "mistral/mistral-large-2402" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/mistral-large-2402", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 8, + "output": 24 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-large-2402", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 4, + "output": 12 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/mistral-large-2402", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-large-2402", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-large-2407", + "provider": "mistral", + "model": "mistral-large-2407", + "displayName": "Mistral Large 2407", + "family": "mistral-large", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure_ai", + "kilo", + "mistral", + "openrouter" + ], + "aliases": [ + "azure_ai/mistral-large-2407", + "kilo/mistralai/mistral-large-2407", + "mistral/mistral-large-2407", + "openrouter/mistralai/mistral-large-2407" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 131072, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": true, + "openWeights": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/mistral-large-2407", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/mistral-large-2407", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/mistral-large-2407", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-large-2407", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 9 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/mistral-large-2407", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Large 2407" + ], + "families": [ + "mistral-large" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-03-31", + "releaseDate": "2024-11-19", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/mistral-large-2407", + "modelKey": "mistralai/mistral-large-2407", + "displayName": "Mistral Large 2407", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2024-11-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/mistral-large-2407", + "modelKey": "mistralai/mistral-large-2407", + "displayName": "Mistral Large 2407", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-03-31", + "lastUpdated": "2024-11-19", + "openWeights": false, + "releaseDate": "2024-11-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/mistral-large-2407", + "mode": "chat", + "metadata": { + "source": "https://azuremarketplace.microsoft.com/en/marketplace/apps/000-000.mistral-ai-large-2407-offer?tab=Overview" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-large-2407", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/mistral-large-2407", + "displayName": "Mistral Large 2407", + "metadata": { + "canonicalSlug": "mistralai/mistral-large-2407", + "createdAt": "2024-11-19T01:06:55.000Z", + "knowledgeCutoff": "2024-03-31", + "links": { + "details": "/api/v1/models/mistralai/mistral-large-2407/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/mistral-large-2411", + "provider": "mistral", + "model": "mistral-large-2411", + "displayName": "Mistral Large 2.1", + "family": "mistral-large", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "github-models", + "helicone", + "kilo", + "merge-gateway", + "mistral", + "vertex_ai-mistral_models" + ], + "aliases": [ + "azure-cognitive-services/mistral-large-2411", + "azure/mistral-large-2411", + "github-models/mistral-ai/mistral-large-2411", + "helicone/mistral-large-2411", + "kilo/mistralai/mistral-large-2411", + "merge-gateway/mistral/mistral-large-2411", + "mistral/mistral-large-2411", + "vertex_ai-mistral_models/vertex_ai/mistral-large-2411" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 131072, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "mistral-large-2411", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "mistral-large-2411", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "mistral-ai/mistral-large-2411", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "mistral-large-2411", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/mistral-large-2411", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "mistral/mistral-large-2411", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "mistral", + "model": "mistral-large-2411", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-large-2411", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-large-2411", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Large 2.1", + "Mistral Large 24.11", + "Mistral Large 2411", + "Mistral-Large" + ], + "families": [ + "mistral-large" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-09", + "releaseDate": "2024-11-01", + "lastUpdated": "2024-11-01", + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "mistral-large-2411", + "modelKey": "mistral-large-2411", + "displayName": "Mistral Large 24.11", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2024-11-01", + "openWeights": false, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "mistral-large-2411", + "modelKey": "mistral-large-2411", + "displayName": "Mistral Large 24.11", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2024-11-01", + "openWeights": false, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "mistral-ai/mistral-large-2411", + "modelKey": "mistral-ai/mistral-large-2411", + "displayName": "Mistral Large 24.11", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2024-11-01", + "openWeights": false, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "mistral-large-2411", + "modelKey": "mistral-large-2411", + "displayName": "Mistral-Large", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2024-07-24", + "openWeights": false, + "releaseDate": "2024-07-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/mistral-large-2411", + "modelKey": "mistralai/mistral-large-2411", + "displayName": "Mistral Large 2411", + "metadata": { + "lastUpdated": "2024-11-04", + "openWeights": true, + "releaseDate": "2024-07-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "mistral/mistral-large-2411", + "modelKey": "mistral/mistral-large-2411", + "displayName": "Mistral Large 2.1", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2024-11-18", + "openWeights": true, + "releaseDate": "2024-11-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "mistral-large-2411", + "modelKey": "mistral-large-2411", + "displayName": "Mistral Large 2.1", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2024-11-18", + "openWeights": true, + "releaseDate": "2024-11-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-large-2411", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-large-2411", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-large-2512", + "provider": "mistral", + "model": "mistral-large-2512", + "displayName": "Mistral Large 3", + "family": "mistral-large", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "anyapi", + "cortecs", + "kilo", + "llmgateway", + "merge-gateway", + "mistral", + "openrouter" + ], + "aliases": [ + "302ai/mistral-large-2512", + "anyapi/mistralai/mistral-large-2512", + "cortecs/mistral-large-2512", + "kilo/mistralai/mistral-large-2512", + "llmgateway/mistral-large-2512", + "merge-gateway/mistral/mistral-large-2512", + "mistral/mistral-large-2512", + "openrouter/mistralai/mistral-large-2512" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "structuredOutput": true, + "promptCaching": false, + "parallelFunctionCalling": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "mistral-large-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.1, + "output": 3.3 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "mistral-large-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/mistral-large-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "mistral-large-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "mistral/mistral-large-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "mistral", + "model": "mistral-large-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/mistral-large-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-large-2512", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/mistralai/mistral-large-2512", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + }, + "perImage": { + "input": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/mistral-large-2512", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Large 3", + "Mistral Large 3 2512", + "Mistral: Mistral Large 3 2512", + "mistral-large-2512" + ], + "families": [ + "mistral-large" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-12-16", + "lastUpdated": "2025-12-16", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "mistral-large-2512", + "modelKey": "mistral-large-2512", + "displayName": "mistral-large-2512", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-12-16", + "openWeights": false, + "releaseDate": "2025-12-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "mistralai/mistral-large-2512", + "modelKey": "mistralai/mistral-large-2512", + "displayName": "Mistral Large 3", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "mistral-large-2512", + "modelKey": "mistral-large-2512", + "displayName": "Mistral Large 3 2512", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/mistral-large-2512", + "modelKey": "mistralai/mistral-large-2512", + "displayName": "Mistral: Mistral Large 3 2512", + "metadata": { + "lastUpdated": "2025-12-16", + "openWeights": true, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "mistral-large-2512", + "modelKey": "mistral-large-2512", + "displayName": "Mistral Large 3", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "mistral/mistral-large-2512", + "modelKey": "mistral/mistral-large-2512", + "displayName": "Mistral Large 3", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "mistral-large-2512", + "modelKey": "mistral-large-2512", + "displayName": "Mistral Large 3", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/mistral-large-2512", + "modelKey": "mistralai/mistral-large-2512", + "displayName": "Mistral Large 3", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2024-11-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-large-2512", + "mode": "chat", + "metadata": { + "source": "https://docs.mistral.ai/models/mistral-large-3-25-12" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/mistralai/mistral-large-2512", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/mistral-large-2512", + "displayName": "Mistral: Mistral Large 3 2512", + "metadata": { + "canonicalSlug": "mistralai/mistral-large-2512", + "createdAt": "2025-12-01T21:27:52.000Z", + "links": { + "details": "/api/v1/models/mistralai/mistral-large-2512/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/mistral-large-3", + "provider": "mistral", + "model": "mistral-large-3", + "displayName": "Mistral Large 3", + "family": "mistral-large", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure_ai", + "mistral", + "routing-run", + "vercel" + ], + "aliases": [ + "azure_ai/mistral-large-3", + "mistral/mistral-large-3", + "routing-run/route/mistral-large-3", + "vercel/mistral/mistral-large-3" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false, + "attachments": true, + "openWeights": true, + "reasoning": false, + "temperature": true, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/mistral-large-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "mistral/mistral-large-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/mistral-large-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-large-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Large 3" + ], + "families": [ + "mistral-large" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-11", + "releaseDate": "2024-11-01", + "lastUpdated": "2025-12-02", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/mistral-large-3", + "modelKey": "route/mistral-large-3", + "displayName": "Mistral Large 3", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/mistral-large-3", + "modelKey": "mistral/mistral-large-3", + "displayName": "Mistral Large 3", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-12-02", + "openWeights": false, + "releaseDate": "2025-12-02" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/mistral-large-3", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/blog/introducing-mistral-large-3-in-microsoft-foundry-open-capable-and-ready-for-production-workloads/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-large-3", + "mode": "chat", + "metadata": { + "source": "https://docs.mistral.ai/models/mistral-large-3-25-12" + } + } + ] + }, + { + "id": "mistral/mistral-large-3-675b-instruct-2512", + "provider": "mistral", + "model": "mistral-large-3-675b-instruct-2512", + "displayName": "Mistral Large 3 675B", + "family": "mistral-large", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt", + "nvidia" + ], + "aliases": [ + "nano-gpt/mistralai/mistral-large-3-675b-instruct-2512", + "nvidia/mistralai/mistral-large-3-675b-instruct-2512" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "temperature": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistralai/mistral-large-3-675b-instruct-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "mistralai/mistral-large-3-675b-instruct-2512", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Large 3 675B", + "Mistral Large 3 675B Instruct 2512" + ], + "families": [ + "mistral-large" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-12-02", + "lastUpdated": "2025-12-02", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistralai/mistral-large-3-675b-instruct-2512", + "modelKey": "mistralai/mistral-large-3-675b-instruct-2512", + "displayName": "Mistral Large 3 675B", + "family": "mistral-large", + "metadata": { + "lastUpdated": "2025-12-02", + "openWeights": false, + "releaseDate": "2025-12-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "mistralai/mistral-large-3-675b-instruct-2512", + "modelKey": "mistralai/mistral-large-3-675b-instruct-2512", + "displayName": "Mistral Large 3 675B Instruct 2512", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2025-12-02" + } + } + ] + }, + { + "id": "mistral/mistral-large-3-fp8", + "provider": "mistral", + "model": "mistral-large-3-fp8", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/mistral-large-3-fp8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-large-3-fp8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.2, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-large-3-fp8", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-large-3:675b", + "provider": "mistral", + "model": "mistral-large-3:675b", + "displayName": "mistral-large-3:675b", + "family": "mistral-large", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/mistral-large-3:675b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "mistral-large-3:675b" + ], + "families": [ + "mistral-large" + ], + "releaseDate": "2025-12-02", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "mistral-large-3:675b", + "modelKey": "mistral-large-3:675b", + "displayName": "mistral-large-3:675b", + "family": "mistral-large", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-12-02" + } + } + ] + }, + { + "id": "mistral/mistral-large-instruct-2407", + "provider": "mistral", + "model": "mistral-large-instruct-2407", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/mistral-large-instruct-2407" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/mistral-large-instruct-2407", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/mistral-large-instruct-2407", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-large-instruct-2411", + "provider": "mistral", + "model": "mistral-large-instruct-2411", + "displayName": "Mistral Large Instruct 2411", + "family": "mistral-large", + "sources": [ + "models.dev" + ], + "providers": [ + "io-net" + ], + "aliases": [ + "io-net/mistralai/Mistral-Large-Instruct-2411" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "io-net", + "model": "mistralai/Mistral-Large-Instruct-2411", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "cacheWrite": 4, + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Large Instruct 2411" + ], + "families": [ + "mistral-large" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-11-01", + "lastUpdated": "2024-11-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "io-net", + "providerName": "IO.NET", + "providerApi": "https://api.intelligence.io.solutions/api/v1", + "providerDoc": "https://io.net/docs/guides/intelligence/io-intelligence", + "model": "mistralai/Mistral-Large-Instruct-2411", + "modelKey": "mistralai/Mistral-Large-Instruct-2411", + "displayName": "Mistral Large Instruct 2411", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-11-01", + "openWeights": false, + "releaseDate": "2024-11-01" + } + } + ] + }, + { + "id": "mistral/mistral-large-latest", + "provider": "mistral", + "model": "mistral-large-latest", + "displayName": "Mistral Large (latest)", + "family": "mistral-large", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure_ai", + "llmgateway", + "merge-gateway", + "mistral" + ], + "aliases": [ + "azure/mistral-large-latest", + "azure_ai/mistral-large-latest", + "llmgateway/mistral-large-latest", + "merge-gateway/mistral/mistral-large-latest", + "mistral/mistral-large-latest" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "mistral-large-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "mistral/mistral-large-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "mistral", + "model": "mistral-large-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/mistral-large-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/mistral-large-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 8, + "output": 24 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-large-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Large (latest)" + ], + "families": [ + "mistral-large" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-11", + "releaseDate": "2024-11-01", + "lastUpdated": "2025-12-02", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "mistral-large-latest", + "modelKey": "mistral-large-latest", + "displayName": "Mistral Large (latest)", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "mistral/mistral-large-latest", + "modelKey": "mistral/mistral-large-latest", + "displayName": "Mistral Large (latest)", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "mistral-large-latest", + "modelKey": "mistral-large-latest", + "displayName": "Mistral Large (latest)", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2024-11-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/mistral-large-latest", + "mode": "chat", + "metadata": { + "source": "https://azuremarketplace.microsoft.com/en/marketplace/apps/000-000.mistral-ai-large-2407-offer?tab=Overview" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/mistral-large-latest", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-large-latest", + "mode": "chat", + "metadata": { + "source": "https://docs.mistral.ai/models/mistral-large-3-25-12" + } + } + ] + }, + { + "id": "mistral/mistral-large@2407", + "provider": "mistral", + "model": "mistral-large@2407", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-mistral_models" + ], + "aliases": [ + "vertex_ai-mistral_models/vertex_ai/mistral-large@2407" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-large@2407", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-large@2407", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-large@2411-001", + "provider": "mistral", + "model": "mistral-large@2411-001", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-mistral_models" + ], + "aliases": [ + "vertex_ai-mistral_models/vertex_ai/mistral-large@2411-001" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-large@2411-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-large@2411-001", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-large@latest", + "provider": "mistral", + "model": "mistral-large@latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-mistral_models" + ], + "aliases": [ + "vertex_ai-mistral_models/vertex_ai/mistral-large@latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-large@latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-large@latest", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-large2", + "provider": "mistral", + "model": "mistral-large2", + "displayName": "Mistral Large (latest)", + "family": "mistral-large", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "snowflake", + "snowflake-cortex" + ], + "aliases": [ + "snowflake-cortex/mistral-large2", + "snowflake/mistral-large2" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": true, + "openWeights": true, + "reasoning": false, + "temperature": true, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/mistral-large2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Large (latest)" + ], + "families": [ + "mistral-large" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-11", + "releaseDate": "2024-11-01", + "lastUpdated": "2025-12-02", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "mistral-large2", + "modelKey": "mistral-large2", + "displayName": "Mistral Large (latest)", + "family": "mistral-large", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2024-11-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/mistral-large2", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-medium", + "provider": "mistral", + "model": "mistral-medium", + "displayName": "Mistral Medium 3.1", + "family": "mistral-medium", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "mistral", + "vercel" + ], + "aliases": [ + "mistral/mistral-medium", + "vercel/mistral/mistral-medium" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 32000, + "maxTokens": 8191, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": true, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "mistral/mistral-medium", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-medium", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.7, + "output": 8.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Medium 3.1" + ], + "families": [ + "mistral-medium" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-05-07", + "lastUpdated": "2025-05-07", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/mistral-medium", + "modelKey": "mistral/mistral-medium", + "displayName": "Mistral Medium 3.1", + "family": "mistral-medium", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-05-07", + "openWeights": false, + "releaseDate": "2025-05-07" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-medium", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-medium-2312", + "provider": "mistral", + "model": "mistral-medium-2312", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/mistral-medium-2312" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-medium-2312", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.7, + "output": 8.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-medium-2312", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-medium-2505", + "provider": "mistral", + "model": "mistral-medium-2505", + "displayName": "Mistral Medium 3", + "family": "mistral-medium", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "azure_ai", + "github-models", + "merge-gateway", + "mistral", + "routing-run", + "watsonx" + ], + "aliases": [ + "azure-cognitive-services/mistral-medium-2505", + "azure/mistral-medium-2505", + "azure_ai/mistral-medium-2505", + "github-models/mistral-ai/mistral-medium-2505", + "merge-gateway/mistral/mistral-medium-2505", + "mistral/mistral-medium-2505", + "routing-run/route/mistral-medium-2505", + "watsonx/mistralai/mistral-medium-2505" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 128000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false, + "parallelFunctionCalling": true, + "vision": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "mistral-medium-2505", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "mistral-medium-2505", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "mistral-ai/mistral-medium-2505", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "mistral/mistral-medium-2505", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "mistral", + "model": "mistral-medium-2505", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/mistral-medium-2505", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/mistral-medium-2505", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-medium-2505", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/mistralai/mistral-medium-2505", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Medium 2505", + "Mistral Medium 3", + "Mistral Medium 3 (25.05)" + ], + "families": [ + "mistral-medium" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2025-05-07", + "lastUpdated": "2025-05-07", + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "mistral-medium-2505", + "modelKey": "mistral-medium-2505", + "displayName": "Mistral Medium 3", + "family": "mistral-medium", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-05-07", + "openWeights": false, + "releaseDate": "2025-05-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "mistral-medium-2505", + "modelKey": "mistral-medium-2505", + "displayName": "Mistral Medium 3", + "family": "mistral-medium", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-05-07", + "openWeights": false, + "releaseDate": "2025-05-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "mistral-ai/mistral-medium-2505", + "modelKey": "mistral-ai/mistral-medium-2505", + "displayName": "Mistral Medium 3 (25.05)", + "family": "mistral-medium", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2025-05-01", + "openWeights": false, + "releaseDate": "2025-05-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "mistral/mistral-medium-2505", + "modelKey": "mistral/mistral-medium-2505", + "displayName": "Mistral Medium 3", + "family": "mistral-medium", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-05-07", + "openWeights": false, + "releaseDate": "2025-05-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "mistral-medium-2505", + "modelKey": "mistral-medium-2505", + "displayName": "Mistral Medium 3", + "family": "mistral-medium", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-05-07", + "openWeights": false, + "releaseDate": "2025-05-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/mistral-medium-2505", + "modelKey": "route/mistral-medium-2505", + "displayName": "Mistral Medium 2505", + "family": "mistral-medium", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-05-07", + "openWeights": false, + "releaseDate": "2025-05-07" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/mistral-medium-2505", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-medium-2505", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/mistralai/mistral-medium-2505", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-medium-2508", + "provider": "mistral", + "model": "mistral-medium-2508", + "displayName": "Mistral Medium 3.1", + "family": "mistral-medium", + "sources": [ + "models.dev" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/mistral-medium-2508" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "mistral", + "model": "mistral-medium-2508", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Medium 3.1" + ], + "families": [ + "mistral-medium" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2025-08-12", + "lastUpdated": "2025-08-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "mistral-medium-2508", + "modelKey": "mistral-medium-2508", + "displayName": "Mistral Medium 3.1", + "family": "mistral-medium", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-08-12", + "openWeights": false, + "releaseDate": "2025-08-12" + } + } + ] + }, + { + "id": "mistral/mistral-medium-2604", + "provider": "mistral", + "model": "mistral-medium-2604", + "displayName": "Mistral Medium 3.5", + "family": "mistral-medium", + "sources": [ + "models.dev" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/mistral-medium-2604" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "mistral", + "model": "mistral-medium-2604", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 7.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Medium 3.5" + ], + "families": [ + "mistral-medium" + ], + "releaseDate": "2026-04-29", + "lastUpdated": "2026-04-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "mistral-medium-2604", + "modelKey": "mistral-medium-2604", + "displayName": "Mistral Medium 3.5", + "family": "mistral-medium", + "metadata": { + "lastUpdated": "2026-04-29", + "openWeights": true, + "releaseDate": "2026-04-29", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "mistral/mistral-medium-3", + "provider": "mistral", + "model": "mistral-medium-3", + "displayName": "Mistral: Mistral Medium 3", + "family": "mistral-medium", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openrouter", + "vertex_ai-mistral_models" + ], + "aliases": [ + "kilo/mistralai/mistral-medium-3", + "nano-gpt/mistralai/mistral-medium-3", + "openrouter/mistralai/mistral-medium-3", + "vertex_ai-mistral_models/vertex_ai/mistral-medium-3", + "vertex_ai-mistral_models/vertex_ai/mistralai/mistral-medium-3" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 8191, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/mistral-medium-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistralai/mistral-medium-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/mistral-medium-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.4, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-medium-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistralai/mistral-medium-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/mistral-medium-3", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Medium 3", + "Mistral: Mistral Medium 3" + ], + "families": [ + "mistral-medium" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-05-07", + "lastUpdated": "2025-05-07", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/mistral-medium-3", + "modelKey": "mistralai/mistral-medium-3", + "displayName": "Mistral: Mistral Medium 3", + "metadata": { + "lastUpdated": "2025-05-07", + "openWeights": false, + "releaseDate": "2025-05-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistralai/mistral-medium-3", + "modelKey": "mistralai/mistral-medium-3", + "displayName": "Mistral Medium 3", + "family": "mistral-medium", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/mistral-medium-3", + "modelKey": "mistralai/mistral-medium-3", + "displayName": "Mistral Medium 3", + "family": "mistral-medium", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-07", + "openWeights": false, + "releaseDate": "2025-05-07" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-medium-3", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistralai/mistral-medium-3", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/mistral-medium-3", + "displayName": "Mistral: Mistral Medium 3", + "metadata": { + "canonicalSlug": "mistralai/mistral-medium-3", + "createdAt": "2025-05-07T14:15:41.000Z", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/mistralai/mistral-medium-3/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/mistral-medium-3-1-2508", + "provider": "mistral", + "model": "mistral-medium-3-1-2508", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/mistral-medium-3-1-2508" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-medium-3-1-2508", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-medium-3-1-2508", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/news/mistral-medium-3" + } + } + ] + }, + { + "id": "mistral/mistral-medium-3-5", + "provider": "mistral", + "model": "mistral-medium-3-5", + "displayName": "Mistral: Mistral Medium 3.5", + "family": "mistral-medium", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/mistralai/mistral-medium-3-5", + "openrouter/mistralai/mistral-medium-3-5" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/mistral-medium-3-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 7.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/mistral-medium-3-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 7.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/mistral-medium-3-5", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.5, + "output": 7.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Medium 3.5", + "Mistral: Mistral Medium 3.5" + ], + "families": [ + "mistral-medium" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-05-07", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/mistral-medium-3-5", + "modelKey": "mistralai/mistral-medium-3-5", + "displayName": "Mistral: Mistral Medium 3.5", + "metadata": { + "lastUpdated": "2026-05-07", + "openWeights": false, + "releaseDate": "2026-04-30", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/mistral-medium-3-5", + "modelKey": "mistralai/mistral-medium-3-5", + "displayName": "Mistral Medium 3.5", + "family": "mistral-medium", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/mistral-medium-3-5", + "displayName": "Mistral: Mistral Medium 3.5", + "metadata": { + "canonicalSlug": "mistralai/mistral-medium-3.5-20260430", + "createdAt": "2026-04-30T17:33:59.000Z", + "links": { + "details": "/api/v1/models/mistralai/mistral-medium-3.5-20260430/endpoints" + }, + "reasoning": { + "mandatory": false, + "supported_efforts": [ + "high", + "none" + ], + "default_effort": "high" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/mistral-medium-3-instruct", + "provider": "mistral", + "model": "mistral-medium-3-instruct", + "displayName": "Mistral Medium 3", + "family": "mistral-medium", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/mistralai/mistral-medium-3-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "mistralai/mistral-medium-3-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Medium 3" + ], + "families": [ + "mistral-medium" + ], + "releaseDate": "2025-09-25", + "lastUpdated": "2025-09-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "mistralai/mistral-medium-3-instruct", + "modelKey": "mistralai/mistral-medium-3-instruct", + "displayName": "Mistral Medium 3", + "family": "mistral-medium", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + } + ] + }, + { + "id": "mistral/mistral-medium-3.1", + "provider": "mistral", + "model": "mistral-medium-3.1", + "displayName": "Mistral: Mistral Medium 3.1", + "family": "mistral-medium", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "kilo/mistralai/mistral-medium-3.1", + "nano-gpt/mistralai/mistral-medium-3.1", + "openrouter/mistralai/mistral-medium-3.1" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/mistral-medium-3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistralai/mistral-medium-3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/mistral-medium-3.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.4, + "output": 2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/mistral-medium-3.1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Medium 3.1", + "Mistral: Mistral Medium 3.1" + ], + "families": [ + "mistral-medium" + ], + "knowledgeCutoff": "2025-06-30", + "releaseDate": "2025-08-12", + "lastUpdated": "2025-08-12", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/mistral-medium-3.1", + "modelKey": "mistralai/mistral-medium-3.1", + "displayName": "Mistral: Mistral Medium 3.1", + "metadata": { + "lastUpdated": "2025-08-12", + "openWeights": false, + "releaseDate": "2025-08-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistralai/mistral-medium-3.1", + "modelKey": "mistralai/mistral-medium-3.1", + "displayName": "Mistral Medium 3.1", + "family": "mistral-medium", + "metadata": { + "lastUpdated": "2025-09-05", + "openWeights": false, + "releaseDate": "2025-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/mistral-medium-3.1", + "modelKey": "mistralai/mistral-medium-3.1", + "displayName": "Mistral Medium 3.1", + "family": "mistral-medium", + "metadata": { + "knowledgeCutoff": "2025-06-30", + "lastUpdated": "2025-08-13", + "openWeights": false, + "releaseDate": "2025-08-13" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/mistral-medium-3.1", + "displayName": "Mistral: Mistral Medium 3.1", + "metadata": { + "canonicalSlug": "mistralai/mistral-medium-3.1", + "createdAt": "2025-08-13T14:33:59.000Z", + "knowledgeCutoff": "2025-06-30", + "links": { + "details": "/api/v1/models/mistralai/mistral-medium-3.1/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/mistral-medium-3.5", + "provider": "mistral", + "model": "mistral-medium-3.5", + "displayName": "Mistral Medium 3.5", + "family": "mistral-medium", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt", + "vercel" + ], + "aliases": [ + "nano-gpt/mistral/mistral-medium-3.5", + "vercel/mistral/mistral-medium-3.5" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "temperature": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistral/mistral-medium-3.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 7.5 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "mistral/mistral-medium-3.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 7.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Medium 3.5", + "Mistral Medium Latest" + ], + "families": [ + "mistral-medium" + ], + "releaseDate": "2026-04-29", + "lastUpdated": "2026-04-29", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistral/mistral-medium-3.5", + "modelKey": "mistral/mistral-medium-3.5", + "displayName": "Mistral Medium 3.5", + "metadata": { + "lastUpdated": "2026-04-29", + "openWeights": false, + "releaseDate": "2026-04-29", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/mistral-medium-3.5", + "modelKey": "mistral/mistral-medium-3.5", + "displayName": "Mistral Medium Latest", + "family": "mistral-medium", + "metadata": { + "lastUpdated": "2026-05-21", + "openWeights": false, + "releaseDate": "2026-05-21", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "mistral/mistral-medium-3.5-128b", + "provider": "mistral", + "model": "mistral-medium-3.5-128b", + "displayName": "Mistral Medium 3.5 128B", + "family": "mistral-medium", + "sources": [ + "models.dev" + ], + "providers": [ + "berget", + "scaleway" + ], + "aliases": [ + "berget/mistralai/Mistral-Medium-3.5-128B", + "scaleway/mistral-medium-3.5-128b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "berget", + "model": "mistralai/Mistral-Medium-3.5-128B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.65, + "output": 5.5 + } + }, + { + "source": "models.dev", + "provider": "scaleway", + "model": "mistral-medium-3.5-128b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 7.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Medium 3.5 128B" + ], + "families": [ + "mistral-medium" + ], + "knowledgeCutoff": "2026-04", + "releaseDate": "2026-04-29", + "lastUpdated": "2026-04-29", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "berget", + "providerName": "Berget.AI", + "providerApi": "https://api.berget.ai/v1", + "providerDoc": "https://api.berget.ai", + "model": "mistralai/Mistral-Medium-3.5-128B", + "modelKey": "mistralai/Mistral-Medium-3.5-128B", + "displayName": "Mistral Medium 3.5 128B", + "family": "mistral-medium", + "metadata": { + "knowledgeCutoff": "2026-04", + "lastUpdated": "2026-04-29", + "openWeights": true, + "releaseDate": "2026-04-29", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "scaleway", + "providerName": "Scaleway", + "providerApi": "https://api.scaleway.ai/v1", + "providerDoc": "https://www.scaleway.com/en/docs/generative-apis/", + "model": "mistral-medium-3.5-128b", + "modelKey": "mistral-medium-3.5-128b", + "displayName": "Mistral Medium 3.5 128B", + "family": "mistral-medium", + "metadata": { + "lastUpdated": "2026-04-29", + "openWeights": true, + "releaseDate": "2026-04-29" + } + } + ] + }, + { + "id": "mistral/mistral-medium-3.5:thinking", + "provider": "mistral", + "model": "mistral-medium-3.5:thinking", + "displayName": "Mistral Medium 3.5 Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/mistral/mistral-medium-3.5:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistral/mistral-medium-3.5:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 7.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Medium 3.5 Thinking" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistral/mistral-medium-3.5:thinking", + "modelKey": "mistral/mistral-medium-3.5:thinking", + "displayName": "Mistral Medium 3.5 Thinking", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + } + ] + }, + { + "id": "mistral/mistral-medium-3@001", + "provider": "mistral", + "model": "mistral-medium-3@001", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-mistral_models" + ], + "aliases": [ + "vertex_ai-mistral_models/vertex_ai/mistral-medium-3@001", + "vertex_ai-mistral_models/vertex_ai/mistralai/mistral-medium-3@001" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-medium-3@001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistralai/mistral-medium-3@001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-medium-3@001", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistralai/mistral-medium-3@001", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-medium-latest", + "provider": "mistral", + "model": "mistral-medium-latest", + "displayName": "Mistral Medium (latest)", + "family": "mistral-medium", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "merge-gateway", + "mistral" + ], + "aliases": [ + "merge-gateway/mistral/mistral-medium-latest", + "mistral/mistral-medium-latest" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "mistral/mistral-medium-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "mistral", + "model": "mistral-medium-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-medium-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Medium (latest)" + ], + "families": [ + "mistral-medium" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2025-08-12", + "lastUpdated": "2025-08-12", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "mistral/mistral-medium-latest", + "modelKey": "mistral/mistral-medium-latest", + "displayName": "Mistral Medium (latest)", + "family": "mistral-medium", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-08-12", + "openWeights": false, + "releaseDate": "2025-08-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "mistral-medium-latest", + "modelKey": "mistral-medium-latest", + "displayName": "Mistral Medium (latest)", + "family": "mistral-medium", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-08-12", + "openWeights": false, + "releaseDate": "2025-08-12" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-medium-latest", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-nemo", + "provider": "mistral", + "model": "mistral-nemo", + "displayName": "Mistral Nemo", + "family": "mistral-nemo", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "azure_ai", + "github-models", + "helicone", + "kilo", + "mistral", + "novita", + "novita-ai", + "openrouter", + "vercel" + ], + "aliases": [ + "azure-cognitive-services/mistral-nemo", + "azure/mistral-nemo", + "azure_ai/mistral-nemo", + "github-models/mistral-ai/mistral-nemo", + "helicone/mistral-nemo", + "kilo/mistralai/mistral-nemo", + "mistral/mistral-nemo", + "novita-ai/mistralai/mistral-nemo", + "novita/mistralai/mistral-nemo", + "openrouter/mistralai/mistral-nemo", + "vercel/mistral/mistral-nemo" + ], + "mergedProviderModelRecords": 11, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 16000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "mistral-nemo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "mistral-nemo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "mistral-ai/mistral-nemo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "mistral-nemo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 20, + "output": 40 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/mistral-nemo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.04 + } + }, + { + "source": "models.dev", + "provider": "mistral", + "model": "mistral-nemo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "mistralai/mistral-nemo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.17 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/mistral-nemo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.03 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "mistral/mistral-nemo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/mistral-nemo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/mistralai/mistral-nemo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.17 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/mistral-nemo", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0.03 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Nemo", + "Mistral: Mistral Nemo" + ], + "families": [ + "mistral-nemo" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2024-07-18", + "lastUpdated": "2024-07-18", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 11 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "mistral-nemo", + "modelKey": "mistral-nemo", + "displayName": "Mistral Nemo", + "family": "mistral-nemo", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2024-07-18", + "openWeights": true, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "mistral-nemo", + "modelKey": "mistral-nemo", + "displayName": "Mistral Nemo", + "family": "mistral-nemo", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2024-07-18", + "openWeights": true, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "mistral-ai/mistral-nemo", + "modelKey": "mistral-ai/mistral-nemo", + "displayName": "Mistral Nemo", + "family": "mistral-nemo", + "metadata": { + "knowledgeCutoff": "2024-03", + "lastUpdated": "2024-07-18", + "openWeights": true, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "mistral-nemo", + "modelKey": "mistral-nemo", + "displayName": "Mistral Nemo", + "family": "mistral-nemo", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/mistral-nemo", + "modelKey": "mistralai/mistral-nemo", + "displayName": "Mistral: Mistral Nemo", + "metadata": { + "lastUpdated": "2024-07-30", + "openWeights": true, + "releaseDate": "2024-07-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "mistral-nemo", + "modelKey": "mistral-nemo", + "displayName": "Mistral Nemo", + "family": "mistral-nemo", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2024-07-01", + "openWeights": true, + "releaseDate": "2024-07-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "mistralai/mistral-nemo", + "modelKey": "mistralai/mistral-nemo", + "displayName": "Mistral Nemo", + "family": "mistral-nemo", + "metadata": { + "lastUpdated": "2024-07-30", + "openWeights": true, + "releaseDate": "2024-07-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/mistral-nemo", + "modelKey": "mistralai/mistral-nemo", + "displayName": "Mistral Nemo", + "family": "mistral-nemo", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2024-07-01", + "openWeights": true, + "releaseDate": "2024-07-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/mistral-nemo", + "modelKey": "mistral/mistral-nemo", + "displayName": "Mistral Nemo", + "family": "mistral-nemo", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-07-01", + "openWeights": false, + "releaseDate": "2024-07-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/mistral-nemo", + "mode": "chat", + "metadata": { + "source": "https://azuremarketplace.microsoft.com/en/marketplace/apps/000-000.mistral-nemo-12b-2407?tab=PlansAndPrice" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/mistralai/mistral-nemo", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/mistral-nemo", + "displayName": "Mistral: Mistral Nemo", + "metadata": { + "canonicalSlug": "mistralai/mistral-nemo", + "createdAt": "2024-07-19T00:00:00.000Z", + "huggingFaceId": "mistralai/Mistral-Nemo-Instruct-2407", + "instructType": "mistral", + "knowledgeCutoff": "2024-04-30", + "links": { + "details": "/api/v1/models/mistralai/mistral-nemo/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/mistral-nemo-12b-instruct", + "provider": "mistral", + "model": "mistral-nemo-12b-instruct", + "displayName": "Mistral Nemo 12B Instruct", + "family": "mistral-nemo", + "sources": [ + "models.dev" + ], + "providers": [ + "inference" + ], + "aliases": [ + "inference/mistral/mistral-nemo-12b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "inference", + "model": "mistral/mistral-nemo-12b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.038, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Nemo 12B Instruct" + ], + "families": [ + "mistral-nemo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "inference", + "providerName": "Inference", + "providerApi": "https://inference.net/v1", + "providerDoc": "https://inference.net/models", + "model": "mistral/mistral-nemo-12b-instruct", + "modelKey": "mistral/mistral-nemo-12b-instruct", + "displayName": "Mistral Nemo 12B Instruct", + "family": "mistral-nemo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-01-01", + "openWeights": true, + "releaseDate": "2025-01-01" + } + } + ] + }, + { + "id": "mistral/mistral-nemo-base-2407", + "provider": "mistral", + "model": "mistral-nemo-base-2407", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/mistral-nemo-base-2407" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-nemo-base-2407", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-nemo-base-2407", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-nemo-instruct-2407", + "provider": "mistral", + "model": "mistral-nemo-instruct-2407", + "displayName": "Mistral-Nemo-Instruct-2407", + "family": "unsloth", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "chutes", + "deepinfra", + "digitalocean", + "fireworks_ai", + "gradient_ai", + "io-net", + "meganova", + "nano-gpt", + "nebius", + "ovhcloud" + ], + "aliases": [ + "chutes/unsloth/Mistral-Nemo-Instruct-2407", + "deepinfra/mistralai/Mistral-Nemo-Instruct-2407", + "digitalocean/mistral-nemo-instruct-2407", + "fireworks_ai/accounts/fireworks/models/mistral-nemo-instruct-2407", + "gradient_ai/mistral-nemo-instruct-2407", + "io-net/mistralai/Mistral-Nemo-Instruct-2407", + "meganova/mistralai/Mistral-Nemo-Instruct-2407", + "nano-gpt/mistralai/Mistral-Nemo-Instruct-2407", + "nebius/mistralai/Mistral-Nemo-Instruct-2407", + "ovhcloud/Mistral-Nemo-Instruct-2407", + "ovhcloud/mistral-nemo-instruct-2407" + ], + "mergedProviderModelRecords": 10, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "unsloth/Mistral-Nemo-Instruct-2407", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.02, + "output": 0.04 + } + }, + { + "source": "models.dev", + "provider": "digitalocean", + "model": "mistral-nemo-instruct-2407", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "io-net", + "model": "mistralai/Mistral-Nemo-Instruct-2407", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0.04, + "input": 0.02, + "output": 0.04 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "mistralai/Mistral-Nemo-Instruct-2407", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.04 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistralai/Mistral-Nemo-Instruct-2407", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1003, + "output": 0.1207 + } + }, + { + "source": "models.dev", + "provider": "ovhcloud", + "model": "mistral-nemo-instruct-2407", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.14 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/mistralai/Mistral-Nemo-Instruct-2407", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0.04 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-nemo-instruct-2407", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "gradient_ai", + "model": "gradient_ai/mistral-nemo-instruct-2407", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/mistralai/Mistral-Nemo-Instruct-2407", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.12 + } + }, + { + "source": "litellm", + "provider": "ovhcloud", + "model": "ovhcloud/Mistral-Nemo-Instruct-2407", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0.13 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Nemo", + "Mistral Nemo Instruct", + "Mistral Nemo Instruct 2407", + "Mistral-Nemo-Instruct-2407" + ], + "families": [ + "mistral", + "mistral-nemo", + "unsloth" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-05", + "releaseDate": "2025-12-29", + "lastUpdated": "2026-04-25", + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 10 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "unsloth/Mistral-Nemo-Instruct-2407", + "modelKey": "unsloth/Mistral-Nemo-Instruct-2407", + "displayName": "Mistral Nemo Instruct 2407", + "family": "unsloth", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "mistral-nemo-instruct-2407", + "modelKey": "mistral-nemo-instruct-2407", + "displayName": "Mistral Nemo Instruct", + "family": "mistral", + "status": "deprecated", + "metadata": { + "lastUpdated": "2024-07-18", + "openWeights": true, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "io-net", + "providerName": "IO.NET", + "providerApi": "https://api.intelligence.io.solutions/api/v1", + "providerDoc": "https://io.net/docs/guides/intelligence/io-intelligence", + "model": "mistralai/Mistral-Nemo-Instruct-2407", + "modelKey": "mistralai/Mistral-Nemo-Instruct-2407", + "displayName": "Mistral Nemo Instruct 2407", + "family": "mistral-nemo", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2024-07-01", + "openWeights": true, + "releaseDate": "2024-07-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "mistralai/Mistral-Nemo-Instruct-2407", + "modelKey": "mistralai/Mistral-Nemo-Instruct-2407", + "displayName": "Mistral Nemo Instruct 2407", + "family": "mistral", + "metadata": { + "lastUpdated": "2024-07-18", + "openWeights": true, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistralai/Mistral-Nemo-Instruct-2407", + "modelKey": "mistralai/Mistral-Nemo-Instruct-2407", + "displayName": "Mistral Nemo", + "family": "mistral-nemo", + "metadata": { + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ovhcloud", + "providerName": "OVHcloud AI Endpoints", + "providerApi": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", + "providerDoc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", + "model": "mistral-nemo-instruct-2407", + "modelKey": "mistral-nemo-instruct-2407", + "displayName": "Mistral-Nemo-Instruct-2407", + "metadata": { + "lastUpdated": "2024-11-20", + "openWeights": true, + "releaseDate": "2024-11-20" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/mistralai/Mistral-Nemo-Instruct-2407", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-nemo-instruct-2407", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gradient_ai", + "model": "gradient_ai/mistral-nemo-instruct-2407", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/mistralai/Mistral-Nemo-Instruct-2407", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ovhcloud", + "model": "ovhcloud/Mistral-Nemo-Instruct-2407", + "mode": "chat", + "metadata": { + "source": "https://endpoints.ai.cloud.ovh.net/models/mistral-nemo-instruct-2407" + } + } + ] + }, + { + "id": "mistral/mistral-nemo-instruct-2407-fp8", + "provider": "mistral", + "model": "mistral-nemo-instruct-2407-fp8", + "displayName": "Mistral Nemo", + "family": "mistral", + "sources": [ + "models.dev" + ], + "providers": [ + "stackit" + ], + "aliases": [ + "stackit/neuralmagic/Mistral-Nemo-Instruct-2407-FP8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "stackit", + "model": "neuralmagic/Mistral-Nemo-Instruct-2407-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49, + "output": 0.71 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Nemo" + ], + "families": [ + "mistral" + ], + "releaseDate": "2024-07-01", + "lastUpdated": "2024-07-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "stackit", + "providerName": "STACKIT", + "providerApi": "https://api.openai-compat.model-serving.eu01.onstackit.cloud/v1", + "providerDoc": "https://docs.stackit.cloud/products/data-and-ai/ai-model-serving/basics/available-shared-models", + "model": "neuralmagic/Mistral-Nemo-Instruct-2407-FP8", + "modelKey": "neuralmagic/Mistral-Nemo-Instruct-2407-FP8", + "displayName": "Mistral Nemo", + "family": "mistral", + "metadata": { + "lastUpdated": "2024-07-01", + "openWeights": true, + "releaseDate": "2024-07-01" + } + } + ] + }, + { + "id": "mistral/mistral-nemo@2407", + "provider": "mistral", + "model": "mistral-nemo@2407", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-mistral_models" + ], + "aliases": [ + "vertex_ai-mistral_models/vertex_ai/mistral-nemo@2407" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-nemo@2407", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-nemo@2407", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-nemo@latest", + "provider": "mistral", + "model": "mistral-nemo@latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-mistral_models" + ], + "aliases": [ + "vertex_ai-mistral_models/vertex_ai/mistral-nemo@latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-nemo@latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-nemo@latest", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-nemotron", + "provider": "mistral", + "model": "mistral-nemotron", + "displayName": "mistral-nemotron", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/mistralai/mistral-nemotron" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "mistralai/mistral-nemotron", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "mistral-nemotron" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2025-06-11", + "lastUpdated": "2025-06-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "mistralai/mistral-nemotron", + "modelKey": "mistralai/mistral-nemotron", + "displayName": "mistral-nemotron", + "family": "nemotron", + "metadata": { + "lastUpdated": "2025-06-12", + "openWeights": true, + "releaseDate": "2025-06-11" + } + } + ] + }, + { + "id": "mistral/mistral-ocr-2505", + "provider": "mistral", + "model": "mistral-ocr-2505", + "mode": "ocr", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai" + ], + "aliases": [ + "vertex_ai/mistral-ocr-2505" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai", + "model": "vertex_ai/mistral-ocr-2505", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPage": { + "ocr": 0.0005 + } + } + ] + }, + "metadata": { + "modes": [ + "ocr" + ], + "supportedEndpoints": [ + "/v1/ocr" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai", + "model": "vertex_ai/mistral-ocr-2505", + "mode": "ocr", + "metadata": { + "source": "https://cloud.google.com/generative-ai-app-builder/pricing", + "supportedEndpoints": [ + "/v1/ocr" + ] + } + } + ] + }, + { + "id": "mistral/mistral-ocr-2505-completion", + "provider": "mistral", + "model": "mistral-ocr-2505-completion", + "mode": "ocr", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/mistral-ocr-2505-completion" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-ocr-2505-completion", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPage": { + "annotation": 0.003, + "ocr": 0.001 + } + } + ] + }, + "metadata": { + "modes": [ + "ocr" + ], + "supportedEndpoints": [ + "/v1/ocr" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-ocr-2505-completion", + "mode": "ocr", + "metadata": { + "source": "https://mistral.ai/pricing#api-pricing", + "supportedEndpoints": [ + "/v1/ocr" + ] + } + } + ] + }, + { + "id": "mistral/mistral-ocr-latest", + "provider": "mistral", + "model": "mistral-ocr-latest", + "mode": "ocr", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/mistral-ocr-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-ocr-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPage": { + "annotation": 0.003, + "ocr": 0.001 + } + } + ] + }, + "metadata": { + "modes": [ + "ocr" + ], + "supportedEndpoints": [ + "/v1/ocr" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-ocr-latest", + "mode": "ocr", + "metadata": { + "source": "https://mistral.ai/pricing#api-pricing", + "supportedEndpoints": [ + "/v1/ocr" + ] + } + } + ] + }, + { + "id": "mistral/mistral-saba", + "provider": "mistral", + "model": "mistral-saba", + "displayName": "Mistral: Saba", + "family": "mistral", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "kilo/mistralai/mistral-saba", + "nano-gpt/mistralai/mistral-saba", + "openrouter/mistralai/mistral-saba" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 32768, + "inputTokens": 32000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/mistral-saba", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistralai/mistral-saba", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1989, + "output": 0.595 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/mistral-saba", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 0.6 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/mistral-saba", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Saba", + "Mistral: Saba", + "Saba" + ], + "families": [ + "mistral" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2025-02-17", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/mistral-saba", + "modelKey": "mistralai/mistral-saba", + "displayName": "Mistral: Saba", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-02-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistralai/mistral-saba", + "modelKey": "mistralai/mistral-saba", + "displayName": "Mistral Saba", + "family": "mistral", + "metadata": { + "lastUpdated": "2025-02-17", + "openWeights": false, + "releaseDate": "2025-02-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/mistral-saba", + "modelKey": "mistralai/mistral-saba", + "displayName": "Saba", + "family": "mistral", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-02-17", + "openWeights": false, + "releaseDate": "2025-02-17" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/mistral-saba", + "displayName": "Mistral: Saba", + "metadata": { + "canonicalSlug": "mistralai/mistral-saba-2502", + "createdAt": "2025-02-17T14:40:39.000Z", + "knowledgeCutoff": "2024-09-30", + "links": { + "details": "/api/v1/models/mistralai/mistral-saba-2502/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/mistral-saba-24b", + "provider": "mistral", + "model": "mistral-saba-24b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vercel_ai_gateway" + ], + "aliases": [ + "vercel_ai_gateway/mistral/mistral-saba-24b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/mistral-saba-24b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.79, + "output": 0.79 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/mistral-saba-24b", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-small", + "provider": "mistral", + "model": "mistral-small", + "displayName": "Mistral Small 3.2", + "family": "mistral-small", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure_ai", + "helicone", + "mistral", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "azure_ai/mistral-small", + "helicone/mistral-small", + "mistral/mistral-small", + "vercel/mistral/mistral-small", + "vercel_ai_gateway/mistral/mistral-small" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 128000, + "inputTokens": 32000, + "maxTokens": 8191, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": true, + "openWeights": true, + "reasoning": false, + "temperature": true, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "mistral-small", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.075, + "output": 0.2 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "mistral/mistral-small", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/mistral-small", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-small", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/mistral-small", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Small (latest)", + "Mistral Small 3.2" + ], + "families": [ + "mistral-small" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-03", + "releaseDate": "2025-06-20", + "lastUpdated": "2025-06-20", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "mistral-small", + "modelKey": "mistral-small", + "displayName": "Mistral Small 3.2", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2025-06-20", + "openWeights": true, + "releaseDate": "2025-06-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/mistral-small", + "modelKey": "mistral/mistral-small", + "displayName": "Mistral Small (latest)", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-03-16", + "openWeights": true, + "releaseDate": "2024-09-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/mistral-small", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-small", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/mistral-small", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-small-24b-instruct-2501", + "provider": "mistral", + "model": "mistral-small-24b-instruct-2501", + "displayName": "Mistral: Mistral Small 3", + "family": "mistral-small", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "deepinfra", + "fireworks_ai", + "kilo", + "openrouter", + "together_ai" + ], + "aliases": [ + "deepinfra/mistralai/Mistral-Small-24B-Instruct-2501", + "fireworks_ai/accounts/fireworks/models/mistral-small-24b-instruct-2501", + "kilo/mistralai/mistral-small-24b-instruct-2501", + "openrouter/mistralai/mistral-small-24b-instruct-2501", + "together_ai/mistralai/Mistral-Small-24B-Instruct-2501" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/mistral-small-24b-instruct-2501", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.08 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/mistral-small-24b-instruct-2501", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.08 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/mistralai/Mistral-Small-24B-Instruct-2501", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.08 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-small-24b-instruct-2501", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/mistralai/Mistral-Small-24B-Instruct-2501", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/mistral-small-24b-instruct-2501", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.08 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Small 3", + "Mistral: Mistral Small 3" + ], + "families": [ + "mistral-small" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-10-31", + "releaseDate": "2025-12-29", + "lastUpdated": "2026-01-10", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/mistral-small-24b-instruct-2501", + "modelKey": "mistralai/mistral-small-24b-instruct-2501", + "displayName": "Mistral: Mistral Small 3", + "metadata": { + "lastUpdated": "2026-01-10", + "openWeights": true, + "releaseDate": "2025-12-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/mistral-small-24b-instruct-2501", + "modelKey": "mistralai/mistral-small-24b-instruct-2501", + "displayName": "Mistral Small 3", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2023-10-31", + "lastUpdated": "2025-01-30", + "openWeights": true, + "releaseDate": "2025-01-30" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/mistralai/Mistral-Small-24B-Instruct-2501", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mistral-small-24b-instruct-2501", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/mistralai/Mistral-Small-24B-Instruct-2501", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/mistral-small-24b-instruct-2501", + "displayName": "Mistral: Mistral Small 3", + "metadata": { + "canonicalSlug": "mistralai/mistral-small-24b-instruct-2501", + "createdAt": "2025-01-30T16:43:29.000Z", + "huggingFaceId": "mistralai/Mistral-Small-24B-Instruct-2501", + "knowledgeCutoff": "2023-10-31", + "links": { + "details": "/api/v1/models/mistralai/mistral-small-24b-instruct-2501/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/mistral-small-2503", + "provider": "mistral", + "model": "mistral-small-2503", + "displayName": "Mistral Small 3.1", + "family": "mistral-small", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "azure_ai", + "github-models", + "routing-run", + "vertex_ai-mistral_models", + "watsonx" + ], + "aliases": [ + "azure-cognitive-services/mistral-small-2503", + "azure/mistral-small-2503", + "azure_ai/mistral-small-2503", + "github-models/mistral-ai/mistral-small-2503", + "routing-run/route/mistral-small-2503", + "vertex_ai-mistral_models/vertex_ai/mistral-small-2503", + "watsonx/mistralai/mistral-small-2503" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "mistral-small-2503", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "mistral-small-2503", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "mistral-ai/mistral-small-2503", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/mistral-small-2503", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/mistral-small-2503", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-small-2503", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/mistralai/mistral-small-2503", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Small 2503", + "Mistral Small 3.1" + ], + "families": [ + "mistral-small" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-09", + "releaseDate": "2025-03-01", + "lastUpdated": "2025-03-01", + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "mistral-small-2503", + "modelKey": "mistral-small-2503", + "displayName": "Mistral Small 3.1", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2025-03-01", + "openWeights": false, + "releaseDate": "2025-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "mistral-small-2503", + "modelKey": "mistral-small-2503", + "displayName": "Mistral Small 3.1", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2025-03-01", + "openWeights": false, + "releaseDate": "2025-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "mistral-ai/mistral-small-2503", + "modelKey": "mistral-ai/mistral-small-2503", + "displayName": "Mistral Small 3.1", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2025-03-01", + "openWeights": false, + "releaseDate": "2025-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/mistral-small-2503", + "modelKey": "route/mistral-small-2503", + "displayName": "Mistral Small 2503", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-03-16", + "openWeights": true, + "releaseDate": "2026-03-16" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/mistral-small-2503", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-small-2503", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/mistralai/mistral-small-2503", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-small-2503@001", + "provider": "mistral", + "model": "mistral-small-2503@001", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-mistral_models" + ], + "aliases": [ + "vertex_ai-mistral_models/vertex_ai/mistral-small-2503@001" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-small-2503@001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-mistral_models", + "model": "vertex_ai/mistral-small-2503@001", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-small-2506", + "provider": "mistral", + "model": "mistral-small-2506", + "displayName": "Mistral Small 3.2", + "family": "mistral-small", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway", + "mistral" + ], + "aliases": [ + "llmgateway/mistral-small-2506", + "mistral/mistral-small-2506" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "mistral-small-2506", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "mistral", + "model": "mistral-small-2506", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Small 3.2" + ], + "families": [ + "mistral-small" + ], + "knowledgeCutoff": "2025-03", + "releaseDate": "2025-06-20", + "lastUpdated": "2025-06-20", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "mistral-small-2506", + "modelKey": "mistral-small-2506", + "displayName": "Mistral Small 3.2", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2025-06-20", + "openWeights": true, + "releaseDate": "2025-06-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "mistral-small-2506", + "modelKey": "mistral-small-2506", + "displayName": "Mistral Small 3.2", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2025-06-20", + "openWeights": true, + "releaseDate": "2025-06-20" + } + } + ] + }, + { + "id": "mistral/mistral-small-2603", + "provider": "mistral", + "model": "mistral-small-2603", + "displayName": "Mistral Small 4", + "family": "mistral-small", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "mistral", + "openrouter", + "venice" + ], + "aliases": [ + "kilo/mistralai/mistral-small-2603", + "mistral/mistral-small-2603", + "openrouter/mistralai/mistral-small-2603", + "venice/mistral-small-2603" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/mistral-small-2603", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "mistral", + "model": "mistral-small-2603", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/mistral-small-2603", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "mistral-small-2603", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1875, + "output": 0.75 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/mistral-small-2603", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Small 4", + "Mistral: Mistral Small 4" + ], + "families": [ + "mistral-small" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2026-03-16", + "lastUpdated": "2026-04-11", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/mistral-small-2603", + "modelKey": "mistralai/mistral-small-2603", + "displayName": "Mistral: Mistral Small 4", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": true, + "releaseDate": "2026-03-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "mistral-small-2603", + "modelKey": "mistral-small-2603", + "displayName": "Mistral Small 4", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-03-16", + "openWeights": true, + "releaseDate": "2026-03-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/mistral-small-2603", + "modelKey": "mistralai/mistral-small-2603", + "displayName": "Mistral Small 4", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-03-16", + "openWeights": true, + "releaseDate": "2026-03-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "mistral-small-2603", + "modelKey": "mistral-small-2603", + "displayName": "Mistral Small 4", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-03-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "high" + ] + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/mistral-small-2603", + "displayName": "Mistral: Mistral Small 4", + "metadata": { + "canonicalSlug": "mistralai/mistral-small-2603", + "createdAt": "2026-03-16T21:14:45.000Z", + "huggingFaceId": "mistralai/Mistral-Small-4-119B-2603", + "links": { + "details": "/api/v1/models/mistralai/mistral-small-2603/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": false, + "supported_efforts": [ + "high", + "none" + ], + "default_effort": "high" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/mistral-small-3-1-24b-instruct-2503", + "provider": "mistral", + "model": "mistral-small-3-1-24b-instruct-2503", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/mistralai/mistral-small-3-1-24b-instruct-2503" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/mistralai/mistral-small-3-1-24b-instruct-2503", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/mistralai/mistral-small-3-1-24b-instruct-2503", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral-small-3-2-24b-instruct", + "provider": "mistral", + "model": "mistral-small-3-2-24b-instruct", + "displayName": "Mistral Small 3.2 24B Instruct", + "family": "mistral-small", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/mistral-small-3-2-24b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "mistral-small-3-2-24b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09375, + "output": 0.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Small 3.2 24B Instruct" + ], + "families": [ + "mistral-small" + ], + "releaseDate": "2026-01-15", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "mistral-small-3-2-24b-instruct", + "modelKey": "mistral-small-3-2-24b-instruct", + "displayName": "Mistral Small 3.2 24B Instruct", + "family": "mistral-small", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-01-15" + } + } + ] + }, + { + "id": "mistral/mistral-small-3-2-2506", + "provider": "mistral", + "model": "mistral-small-3-2-2506", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/mistral-small-3-2-2506" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-small-3-2-2506", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.18 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-small-3-2-2506", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/pricing" + } + } + ] + }, + { + "id": "mistral/mistral-small-3.1-24b-instruct", + "provider": "mistral", + "model": "mistral-small-3.1-24b-instruct", + "displayName": "Mistral Small 3.1 24B", + "family": "mistral-small", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "cloudflare-ai-gateway", + "cloudflare-workers-ai", + "kilo", + "openrouter" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/mistralai/mistral-small-3.1-24b-instruct", + "cloudflare-workers-ai/@cf/mistralai/mistral-small-3.1-24b-instruct", + "kilo/mistralai/mistral-small-3.1-24b-instruct", + "openrouter/mistralai/mistral-small-3.1-24b-instruct" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/mistralai/mistral-small-3.1-24b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.35, + "output": 0.56 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/mistralai/mistral-small-3.1-24b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.351, + "output": 0.555 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/mistral-small-3.1-24b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.35, + "output": 0.56 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/mistral-small-3.1-24b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.351, + "output": 0.555 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/mistralai/mistral-small-3.1-24b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/mistral-small-3.1-24b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.351, + "output": 0.555 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Small 3.1 24B", + "Mistral Small 3.1 24B Instruct", + "Mistral: Mistral Small 3.1 24B" + ], + "families": [ + "mistral-small" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-10-31", + "releaseDate": "2025-04-11", + "lastUpdated": "2025-04-11", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "seed", + "stop", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/mistralai/mistral-small-3.1-24b-instruct", + "modelKey": "workers-ai/@cf/mistralai/mistral-small-3.1-24b-instruct", + "displayName": "Mistral Small 3.1 24B Instruct", + "family": "mistral-small", + "metadata": { + "lastUpdated": "2025-04-11", + "openWeights": false, + "releaseDate": "2025-04-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/mistralai/mistral-small-3.1-24b-instruct", + "modelKey": "@cf/mistralai/mistral-small-3.1-24b-instruct", + "displayName": "Mistral Small 3.1 24B Instruct", + "family": "mistral-small", + "metadata": { + "lastUpdated": "2025-03-18", + "openWeights": true, + "releaseDate": "2025-03-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/mistral-small-3.1-24b-instruct", + "modelKey": "mistralai/mistral-small-3.1-24b-instruct", + "displayName": "Mistral: Mistral Small 3.1 24B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/mistral-small-3.1-24b-instruct", + "modelKey": "mistralai/mistral-small-3.1-24b-instruct", + "displayName": "Mistral Small 3.1 24B", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2023-10-31", + "lastUpdated": "2025-03-17", + "openWeights": true, + "releaseDate": "2025-03-17" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/mistralai/mistral-small-3.1-24b-instruct", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/mistral-small-3.1-24b-instruct", + "displayName": "Mistral: Mistral Small 3.1 24B", + "metadata": { + "canonicalSlug": "mistralai/mistral-small-3.1-24b-instruct-2503", + "createdAt": "2025-03-17T19:15:37.000Z", + "huggingFaceId": "mistralai/Mistral-Small-3.1-24B-Instruct-2503", + "knowledgeCutoff": "2023-10-31", + "links": { + "details": "/api/v1/models/mistralai/mistral-small-3.1-24b-instruct-2503/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "seed", + "stop", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 128000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/mistral-small-3.2-24b-instruct", + "provider": "mistral", + "model": "mistral-small-3.2-24b-instruct", + "displayName": "Mistral Small 3.2 24B", + "family": "mistral-small", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/mistralai/mistral-small-3.2-24b-instruct", + "openrouter/mistralai/mistral-small-3.2-24b-instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/mistral-small-3.2-24b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.06, + "output": 0.18 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/mistral-small-3.2-24b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.075, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/mistralai/mistral-small-3.2-24b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/mistral-small-3.2-24b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.075, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Small 3.2 24B", + "Mistral: Mistral Small 3.2 24B" + ], + "families": [ + "mistral-small" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-10-31", + "releaseDate": "2025-06-20", + "lastUpdated": "2025-06-20", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/mistral-small-3.2-24b-instruct", + "modelKey": "mistralai/mistral-small-3.2-24b-instruct", + "displayName": "Mistral: Mistral Small 3.2 24B", + "metadata": { + "lastUpdated": "2025-06-20", + "openWeights": true, + "releaseDate": "2025-06-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/mistral-small-3.2-24b-instruct", + "modelKey": "mistralai/mistral-small-3.2-24b-instruct", + "displayName": "Mistral Small 3.2 24B", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2023-10-31", + "lastUpdated": "2025-06-20", + "openWeights": true, + "releaseDate": "2025-06-20" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/mistralai/mistral-small-3.2-24b-instruct", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/mistral-small-3.2-24b-instruct", + "displayName": "Mistral: Mistral Small 3.2 24B", + "metadata": { + "canonicalSlug": "mistralai/mistral-small-3.2-24b-instruct-2506", + "createdAt": "2025-06-20T18:10:16.000Z", + "huggingFaceId": "mistralai/Mistral-Small-3.2-24B-Instruct-2506", + "knowledgeCutoff": "2023-10-31", + "links": { + "details": "/api/v1/models/mistralai/mistral-small-3.2-24b-instruct-2506/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/mistral-small-3.2-24b-instruct-2506", + "provider": "mistral", + "model": "mistral-small-3.2-24b-instruct-2506", + "displayName": "Mistral-Small-3.2-24B-Instruct-2506", + "family": "mistral-small", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "berget", + "deepinfra", + "meganova", + "nano-gpt", + "ovhcloud", + "scaleway" + ], + "aliases": [ + "berget/mistralai/Mistral-Small-3.2-24B-Instruct-2506", + "deepinfra/mistralai/Mistral-Small-3.2-24B-Instruct-2506", + "meganova/mistralai/Mistral-Small-3.2-24B-Instruct-2506", + "nano-gpt/chutesai/Mistral-Small-3.2-24B-Instruct-2506", + "ovhcloud/Mistral-Small-3.2-24B-Instruct-2506", + "ovhcloud/mistral-small-3.2-24b-instruct-2506", + "scaleway/mistral-small-3.2-24b-instruct-2506" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 131072, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "berget", + "model": "mistralai/Mistral-Small-3.2-24B-Instruct-2506", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.33, + "output": 0.33 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "mistralai/Mistral-Small-3.2-24B-Instruct-2506", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "chutesai/Mistral-Small-3.2-24B-Instruct-2506", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "ovhcloud", + "model": "mistral-small-3.2-24b-instruct-2506", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.31 + } + }, + { + "source": "models.dev", + "provider": "scaleway", + "model": "mistral-small-3.2-24b-instruct-2506", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.35 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/mistralai/Mistral-Small-3.2-24B-Instruct-2506", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.075, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "ovhcloud", + "model": "ovhcloud/Mistral-Small-3.2-24B-Instruct-2506", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.09, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Small 3.2 24B Instruct", + "Mistral Small 3.2 24B Instruct (2506)", + "Mistral Small 3.2 24B Instruct 2506", + "Mistral Small 3.2 24b Instruct", + "Mistral-Small-3.2-24B-Instruct-2506" + ], + "families": [ + "chutesai", + "mistral-small" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-09", + "releaseDate": "2025-10-01", + "lastUpdated": "2025-10-01", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "berget", + "providerName": "Berget.AI", + "providerApi": "https://api.berget.ai/v1", + "providerDoc": "https://api.berget.ai", + "model": "mistralai/Mistral-Small-3.2-24B-Instruct-2506", + "modelKey": "mistralai/Mistral-Small-3.2-24B-Instruct-2506", + "displayName": "Mistral Small 3.2 24B Instruct 2506", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2025-10-01", + "openWeights": true, + "releaseDate": "2025-10-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "mistralai/Mistral-Small-3.2-24B-Instruct-2506", + "modelKey": "mistralai/Mistral-Small-3.2-24B-Instruct-2506", + "displayName": "Mistral Small 3.2 24B Instruct", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-06-20", + "openWeights": true, + "releaseDate": "2025-06-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "chutesai/Mistral-Small-3.2-24B-Instruct-2506", + "modelKey": "chutesai/Mistral-Small-3.2-24B-Instruct-2506", + "displayName": "Mistral Small 3.2 24b Instruct", + "family": "chutesai", + "metadata": { + "lastUpdated": "2025-04-15", + "openWeights": false, + "releaseDate": "2025-04-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ovhcloud", + "providerName": "OVHcloud AI Endpoints", + "providerApi": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", + "providerDoc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", + "model": "mistral-small-3.2-24b-instruct-2506", + "modelKey": "mistral-small-3.2-24b-instruct-2506", + "displayName": "Mistral-Small-3.2-24B-Instruct-2506", + "metadata": { + "lastUpdated": "2025-07-16", + "openWeights": true, + "releaseDate": "2025-07-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "scaleway", + "providerName": "Scaleway", + "providerApi": "https://api.scaleway.ai/v1", + "providerDoc": "https://www.scaleway.com/en/docs/generative-apis/", + "model": "mistral-small-3.2-24b-instruct-2506", + "modelKey": "mistral-small-3.2-24b-instruct-2506", + "displayName": "Mistral Small 3.2 24B Instruct (2506)", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2026-03-17", + "openWeights": true, + "releaseDate": "2025-06-20" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/mistralai/Mistral-Small-3.2-24B-Instruct-2506", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ovhcloud", + "model": "ovhcloud/Mistral-Small-3.2-24B-Instruct-2506", + "mode": "chat", + "metadata": { + "source": "https://endpoints.ai.cloud.ovh.net/models/mistral-small-3-2-24b-instruct-2506" + } + } + ] + }, + { + "id": "mistral/mistral-small-31-24b-instruct", + "provider": "mistral", + "model": "mistral-small-31-24b-instruct", + "displayName": "Mistral Small 31 24b Instruct", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/mistral-small-31-24b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistral-small-31-24b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Small 31 24b Instruct" + ], + "releaseDate": "2025-04-15", + "lastUpdated": "2025-04-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistral-small-31-24b-instruct", + "modelKey": "mistral-small-31-24b-instruct", + "displayName": "Mistral Small 31 24b Instruct", + "metadata": { + "lastUpdated": "2025-04-15", + "openWeights": false, + "releaseDate": "2025-04-15" + } + } + ] + }, + { + "id": "mistral/mistral-small-4-119b", + "provider": "mistral", + "model": "mistral-small-4-119b", + "displayName": "Mistral Small 4 119B", + "family": "mistral-small", + "sources": [ + "models.dev" + ], + "providers": [ + "regolo-ai" + ], + "aliases": [ + "regolo-ai/mistral-small-4-119b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "regolo-ai", + "model": "mistral-small-4-119b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.75, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Small 4 119B" + ], + "families": [ + "mistral-small" + ], + "releaseDate": "2026-03-15", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "regolo-ai", + "providerName": "Regolo AI", + "providerApi": "https://api.regolo.ai/v1", + "providerDoc": "https://docs.regolo.ai/", + "model": "mistral-small-4-119b", + "modelKey": "mistral-small-4-119b", + "displayName": "Mistral Small 4 119B", + "family": "mistral-small", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-03-15" + } + } + ] + }, + { + "id": "mistral/mistral-small-4-119b-2603", + "provider": "mistral", + "model": "mistral-small-4-119b-2603", + "displayName": "Mistral Small 4 119B", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt", + "nvidia" + ], + "aliases": [ + "nano-gpt/mistralai/mistral-small-4-119b-2603", + "nvidia/mistralai/mistral-small-4-119b-2603" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "temperature": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistralai/mistral-small-4-119b-2603", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.4 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "mistralai/mistral-small-4-119b-2603", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Small 4 119B", + "mistral-small-4-119b-2603" + ], + "releaseDate": "2026-03-16", + "lastUpdated": "2026-03-16", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistralai/mistral-small-4-119b-2603", + "modelKey": "mistralai/mistral-small-4-119b-2603", + "displayName": "Mistral Small 4 119B", + "metadata": { + "lastUpdated": "2026-03-16", + "openWeights": false, + "releaseDate": "2026-03-16", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "mistralai/mistral-small-4-119b-2603", + "modelKey": "mistralai/mistral-small-4-119b-2603", + "displayName": "mistral-small-4-119b-2603", + "metadata": { + "lastUpdated": "2026-03-16", + "openWeights": true, + "releaseDate": "2026-03-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "mistral/mistral-small-4-119b-2603:thinking", + "provider": "mistral", + "model": "mistral-small-4-119b-2603:thinking", + "displayName": "Mistral Small 4 119B Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/mistralai/mistral-small-4-119b-2603:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistralai/mistral-small-4-119b-2603:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Small 4 119B Thinking" + ], + "releaseDate": "2026-03-17", + "lastUpdated": "2026-03-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistralai/mistral-small-4-119b-2603:thinking", + "modelKey": "mistralai/mistral-small-4-119b-2603:thinking", + "displayName": "Mistral Small 4 119B Thinking", + "metadata": { + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + } + ] + }, + { + "id": "mistral/mistral-small-latest", + "provider": "mistral", + "model": "mistral-small-latest", + "displayName": "Mistral Small (latest)", + "family": "mistral-small", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "merge-gateway", + "mistral" + ], + "aliases": [ + "merge-gateway/mistral/mistral-small-latest", + "mistral/mistral-small-latest" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 256000, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "mistral/mistral-small-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "mistral", + "model": "mistral-small-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-small-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.18 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Small (latest)" + ], + "families": [ + "mistral-small" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2026-03-16", + "lastUpdated": "2026-03-16", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "mistral/mistral-small-latest", + "modelKey": "mistral/mistral-small-latest", + "displayName": "Mistral Small (latest)", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-03-16", + "openWeights": true, + "releaseDate": "2026-03-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "mistral-small-latest", + "modelKey": "mistral-small-latest", + "displayName": "Mistral Small (latest)", + "family": "mistral-small", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-03-16", + "openWeights": true, + "releaseDate": "2026-03-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-small-latest", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/pricing" + } + } + ] + }, + { + "id": "mistral/mistral-small3.2", + "provider": "mistral", + "model": "mistral-small3.2", + "displayName": "Mistral Small 3.2", + "family": "mistral-small", + "sources": [ + "models.dev" + ], + "providers": [ + "regolo-ai" + ], + "aliases": [ + "regolo-ai/mistral-small3.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 120000, + "outputTokens": 120000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "regolo-ai", + "model": "mistral-small3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 2.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Small 3.2" + ], + "families": [ + "mistral-small" + ], + "releaseDate": "2025-01-31", + "lastUpdated": "2025-01-31", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "regolo-ai", + "providerName": "Regolo AI", + "providerApi": "https://api.regolo.ai/v1", + "providerDoc": "https://docs.regolo.ai/", + "model": "mistral-small3.2", + "modelKey": "mistral-small3.2", + "displayName": "Mistral Small 3.2", + "family": "mistral-small", + "metadata": { + "lastUpdated": "2025-01-31", + "openWeights": false, + "releaseDate": "2025-01-31" + } + } + ] + }, + { + "id": "mistral/mistral-tiny", + "provider": "mistral", + "model": "mistral-tiny", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/mistral-tiny" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/mistral-tiny", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 0.25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/mistral-tiny", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral.devstral-2-123b", + "provider": "mistral", + "model": "mistral.devstral-2-123b", + "displayName": "Devstral 2 123B", + "family": "devstral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/mistral.devstral-2-123b", + "bedrock_converse/mistral.devstral-2-123b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "mistral.devstral-2-123b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "mistral.devstral-2-123b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Devstral 2 123B" + ], + "families": [ + "devstral" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-02-17", + "lastUpdated": "2026-02-17", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "mistral.devstral-2-123b", + "modelKey": "mistral.devstral-2-123b", + "displayName": "Devstral 2 123B", + "family": "devstral", + "metadata": { + "lastUpdated": "2026-02-17", + "openWeights": true, + "releaseDate": "2026-02-17" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "mistral.devstral-2-123b", + "mode": "chat", + "metadata": { + "source": "https://aws.amazon.com/bedrock/pricing/" + } + } + ] + }, + { + "id": "mistral/mistral.magistral-small-2509", + "provider": "mistral", + "model": "mistral.magistral-small-2509", + "displayName": "Magistral Small 1.2", + "family": "magistral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/mistral.magistral-small-2509", + "bedrock_converse/mistral.magistral-small-2509" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 40000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "mistral.magistral-small-2509", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "mistral.magistral-small-2509", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Magistral Small 1.2" + ], + "families": [ + "magistral" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-12-02", + "lastUpdated": "2025-12-02", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "mistral.magistral-small-2509", + "modelKey": "mistral.magistral-small-2509", + "displayName": "Magistral Small 1.2", + "family": "magistral", + "metadata": { + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2025-12-02" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "mistral.magistral-small-2509", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral.ministral-3-14b-instruct", + "provider": "mistral", + "model": "mistral.ministral-3-14b-instruct", + "displayName": "Ministral 14B 3.0", + "family": "ministral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/mistral.ministral-3-14b-instruct", + "bedrock_converse/mistral.ministral-3-14b-instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStructuredOutput": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "mistral.ministral-3-14b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "mistral.ministral-3-14b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ministral 14B 3.0" + ], + "families": [ + "ministral" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-12-01", + "lastUpdated": "2024-12-01", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "mistral.ministral-3-14b-instruct", + "modelKey": "mistral.ministral-3-14b-instruct", + "displayName": "Ministral 14B 3.0", + "family": "ministral", + "metadata": { + "lastUpdated": "2024-12-01", + "openWeights": false, + "releaseDate": "2024-12-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "mistral.ministral-3-14b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral.ministral-3-3b-instruct", + "provider": "mistral", + "model": "mistral.ministral-3-3b-instruct", + "displayName": "Ministral 3 3B", + "family": "ministral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/mistral.ministral-3-3b-instruct", + "bedrock_converse/mistral.ministral-3-3b-instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 256000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStructuredOutput": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "mistral.ministral-3-3b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "mistral.ministral-3-3b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ministral 3 3B" + ], + "families": [ + "ministral" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-12-02", + "lastUpdated": "2025-12-02", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "mistral.ministral-3-3b-instruct", + "modelKey": "mistral.ministral-3-3b-instruct", + "displayName": "Ministral 3 3B", + "family": "ministral", + "metadata": { + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2025-12-02" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "mistral.ministral-3-3b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral.ministral-3-8b-instruct", + "provider": "mistral", + "model": "mistral.ministral-3-8b-instruct", + "displayName": "Ministral 3 8B", + "family": "ministral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/mistral.ministral-3-8b-instruct", + "bedrock_converse/mistral.ministral-3-8b-instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStructuredOutput": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "mistral.ministral-3-8b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "mistral.ministral-3-8b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ministral 3 8B" + ], + "families": [ + "ministral" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-12-01", + "lastUpdated": "2024-12-01", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "mistral.ministral-3-8b-instruct", + "modelKey": "mistral.ministral-3-8b-instruct", + "displayName": "Ministral 3 8B", + "family": "ministral", + "metadata": { + "lastUpdated": "2024-12-01", + "openWeights": false, + "releaseDate": "2024-12-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "mistral.ministral-3-8b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral.mistral-7b-instruct-v0:2", + "provider": "mistral", + "model": "mistral.mistral-7b-instruct-v0:2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/mistral.mistral-7b-instruct-v0:2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "mistral.mistral-7b-instruct-v0:2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "mistral.mistral-7b-instruct-v0:2", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral.mistral-large-2402-v1:0", + "provider": "mistral", + "model": "mistral.mistral-large-2402-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/mistral.mistral-large-2402-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "mistral.mistral-large-2402-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 8, + "output": 24 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "mistral.mistral-large-2402-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral.mistral-large-2407-v1:0", + "provider": "mistral", + "model": "mistral.mistral-large-2407-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/mistral.mistral-large-2407-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "mistral.mistral-large-2407-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "mistral.mistral-large-2407-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral.mistral-large-3-675b-instruct", + "provider": "mistral", + "model": "mistral.mistral-large-3-675b-instruct", + "displayName": "Mistral Large 3", + "family": "mistral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/mistral.mistral-large-3-675b-instruct", + "bedrock_converse/mistral.mistral-large-3-675b-instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 256000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStructuredOutput": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "mistral.mistral-large-3-675b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "mistral.mistral-large-3-675b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Large 3" + ], + "families": [ + "mistral" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-12-02", + "lastUpdated": "2025-12-02", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "mistral.mistral-large-3-675b-instruct", + "modelKey": "mistral.mistral-large-3-675b-instruct", + "displayName": "Mistral Large 3", + "family": "mistral", + "metadata": { + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2025-12-02" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "mistral.mistral-large-3-675b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral.mistral-small-2402-v1:0", + "provider": "mistral", + "model": "mistral.mistral-small-2402-v1:0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/mistral.mistral-small-2402-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "mistral.mistral-small-2402-v1:0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "mistral.mistral-small-2402-v1:0", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral.mixtral-8x7b-instruct-v0:1", + "provider": "mistral", + "model": "mistral.mixtral-8x7b-instruct-v0:1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "bedrock" + ], + "aliases": [ + "bedrock/mistral.mixtral-8x7b-instruct-v0:1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "bedrock", + "model": "mistral.mixtral-8x7b-instruct-v0:1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.45, + "output": 0.7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock", + "model": "mistral.mixtral-8x7b-instruct-v0:1", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral.pixtral-large-2502-v1:0", + "provider": "mistral", + "model": "mistral.pixtral-large-2502-v1:0", + "displayName": "Pixtral Large (25.02)", + "family": "mistral", + "sources": [ + "models.dev" + ], + "providers": [ + "amazon-bedrock" + ], + "aliases": [ + "amazon-bedrock/mistral.pixtral-large-2502-v1:0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "mistral.pixtral-large-2502-v1:0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Pixtral Large (25.02)" + ], + "families": [ + "mistral" + ], + "releaseDate": "2025-04-08", + "lastUpdated": "2025-04-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "mistral.pixtral-large-2502-v1:0", + "modelKey": "mistral.pixtral-large-2502-v1:0", + "displayName": "Pixtral Large (25.02)", + "family": "mistral", + "metadata": { + "lastUpdated": "2025-04-08", + "openWeights": false, + "releaseDate": "2025-04-08" + } + } + ] + }, + { + "id": "mistral/mistral.voxtral-mini-3b-2507", + "provider": "mistral", + "model": "mistral.voxtral-mini-3b-2507", + "displayName": "Voxtral Mini 3B 2507", + "family": "mistral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/mistral.voxtral-mini-3b-2507", + "bedrock_converse/mistral.voxtral-mini-3b-2507" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": true, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "nativeStructuredOutput": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "mistral.voxtral-mini-3b-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.04 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "mistral.voxtral-mini-3b-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.04 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Voxtral Mini 3B 2507" + ], + "families": [ + "mistral" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-12-01", + "lastUpdated": "2024-12-01", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "mistral.voxtral-mini-3b-2507", + "modelKey": "mistral.voxtral-mini-3b-2507", + "displayName": "Voxtral Mini 3B 2507", + "family": "mistral", + "metadata": { + "lastUpdated": "2024-12-01", + "openWeights": false, + "releaseDate": "2024-12-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "mistral.voxtral-mini-3b-2507", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mistral.voxtral-small-24b-2507", + "provider": "mistral", + "model": "mistral.voxtral-small-24b-2507", + "displayName": "Voxtral Small 24B 2507", + "family": "mistral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "amazon-bedrock", + "bedrock_converse" + ], + "aliases": [ + "amazon-bedrock/mistral.voxtral-small-24b-2507", + "bedrock_converse/mistral.voxtral-small-24b-2507" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "nativeStructuredOutput": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "amazon-bedrock", + "model": "mistral.voxtral-small-24b-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.35 + } + }, + { + "source": "litellm", + "provider": "bedrock_converse", + "model": "mistral.voxtral-small-24b-2507", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Voxtral Small 24B 2507" + ], + "families": [ + "mistral" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-07-01", + "lastUpdated": "2025-07-01", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "amazon-bedrock", + "providerName": "Amazon Bedrock", + "providerDoc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "model": "mistral.voxtral-small-24b-2507", + "modelKey": "mistral.voxtral-small-24b-2507", + "displayName": "Voxtral Small 24B 2507", + "family": "mistral", + "metadata": { + "lastUpdated": "2025-07-01", + "openWeights": true, + "releaseDate": "2025-07-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "bedrock_converse", + "model": "mistral.voxtral-small-24b-2507", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mixtral-8x22b", + "provider": "mistral", + "model": "mixtral-8x22b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/mixtral-8x22b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mixtral-8x22b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.2, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mixtral-8x22b", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mixtral-8x22b-instruct", + "provider": "mistral", + "model": "mixtral-8x22b-instruct", + "displayName": "Mixtral 8x22B Instruct", + "family": "mistral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "fireworks_ai", + "kilo", + "nvidia", + "openrouter", + "vercel_ai_gateway" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/mixtral-8x22b-instruct", + "kilo/mistralai/mixtral-8x22b-instruct", + "nvidia/mistralai/mixtral-8x22b-instruct", + "openrouter/mistralai/mixtral-8x22b-instruct", + "vercel_ai_gateway/mistral/mixtral-8x22b-instruct" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false, + "functionCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/mixtral-8x22b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "mistralai/mixtral-8x22b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/mixtral-8x22b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mixtral-8x22b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.2, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/mistralai/mixtral-8x22b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.65, + "output": 0.65 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/mixtral-8x22b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.2, + "output": 1.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/mixtral-8x22b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral: Mixtral 8x22B Instruct", + "Mixtral 8x22B Instruct" + ], + "families": [ + "mistral" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-01-31", + "releaseDate": "2024-04-17", + "lastUpdated": "2024-04-17", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/mixtral-8x22b-instruct", + "modelKey": "mistralai/mixtral-8x22b-instruct", + "displayName": "Mistral: Mixtral 8x22B Instruct", + "metadata": { + "lastUpdated": "2024-04-17", + "openWeights": true, + "releaseDate": "2024-04-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "mistralai/mixtral-8x22b-instruct", + "modelKey": "mistralai/mixtral-8x22b-instruct", + "displayName": "Mistral: Mixtral 8x22B Instruct", + "metadata": { + "lastUpdated": "2024-04-17", + "openWeights": true, + "releaseDate": "2024-04-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/mixtral-8x22b-instruct", + "modelKey": "mistralai/mixtral-8x22b-instruct", + "displayName": "Mixtral 8x22B Instruct", + "family": "mistral", + "metadata": { + "knowledgeCutoff": "2024-01-31", + "lastUpdated": "2024-04-17", + "openWeights": true, + "releaseDate": "2024-04-17" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mixtral-8x22b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/mistralai/mixtral-8x22b-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/mixtral-8x22b-instruct", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/mixtral-8x22b-instruct", + "displayName": "Mistral: Mixtral 8x22B Instruct", + "metadata": { + "canonicalSlug": "mistralai/mixtral-8x22b-instruct", + "createdAt": "2024-04-17T00:00:00.000Z", + "huggingFaceId": "mistralai/Mixtral-8x22B-Instruct-v0.1", + "instructType": "mistral", + "knowledgeCutoff": "2024-01-31", + "links": { + "details": "/api/v1/models/mistralai/mixtral-8x22b-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 65536, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "mistral/mixtral-8x22b-instruct-hf", + "provider": "mistral", + "model": "mixtral-8x22b-instruct-hf", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/mixtral-8x22b-instruct-hf" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mixtral-8x22b-instruct-hf", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.2, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mixtral-8x22b-instruct-hf", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "mistral/mixtral-8x22b-instruct-v0.1", + "provider": "mistral", + "model": "mixtral-8x22b-instruct-v0.1", + "displayName": "Mixtral 8x22B", + "family": "mixtral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "anyscale", + "nano-gpt", + "nscale", + "ollama" + ], + "aliases": [ + "anyscale/mistralai/Mixtral-8x22B-Instruct-v0.1", + "nano-gpt/mistralai/mixtral-8x22b-instruct-v0.1", + "nscale/mistralai/mixtral-8x22b-instruct-v0.1", + "ollama/mixtral-8x22B-Instruct-v0.1" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistralai/mixtral-8x22b-instruct-v0.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8999999999999999, + "output": 0.8999999999999999 + } + }, + { + "source": "litellm", + "provider": "anyscale", + "model": "anyscale/mistralai/Mixtral-8x22B-Instruct-v0.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "nscale", + "model": "nscale/mistralai/mixtral-8x22b-instruct-v0.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/mixtral-8x22B-Instruct-v0.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mixtral 8x22B" + ], + "families": [ + "mixtral" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-12-11", + "lastUpdated": "2025-12-11", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistralai/mixtral-8x22b-instruct-v0.1", + "modelKey": "mistralai/mixtral-8x22b-instruct-v0.1", + "displayName": "Mixtral 8x22B", + "family": "mixtral", + "metadata": { + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anyscale", + "model": "anyscale/mistralai/Mixtral-8x22B-Instruct-v0.1", + "mode": "chat", + "metadata": { + "source": "https://docs.anyscale.com/preview/endpoints/text-generation/supported-models/mistralai-Mixtral-8x22B-Instruct-v0.1" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nscale", + "model": "nscale/mistralai/mixtral-8x22b-instruct-v0.1", + "mode": "chat", + "metadata": { + "metadata": { + "notes": "Pricing listed as $1.20/1M tokens total. Assumed 50/50 split for input/output." + }, + "source": "https://docs.nscale.com/docs/inference/serverless-models/current#chat-models" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/mixtral-8x22B-Instruct-v0.1", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mixtral-8x7b", + "provider": "mistral", + "model": "mixtral-8x7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai", + "snowflake" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/mixtral-8x7b", + "snowflake/mixtral-8x7b" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mixtral-8x7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/mixtral-8x7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mixtral-8x7b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/mixtral-8x7b", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mixtral-8x7b-instruct", + "provider": "mistral", + "model": "mixtral-8x7b-instruct", + "displayName": "Mistral: Mixtral 8x7B Instruct", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "fireworks_ai", + "nvidia" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/mixtral-8x7b-instruct", + "nvidia/mistralai/mixtral-8x7b-instruct" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "mistralai/mixtral-8x7b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mixtral-8x7b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral: Mixtral 8x7B Instruct" + ], + "modes": [ + "chat" + ], + "releaseDate": "2023-12-10", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "mistralai/mixtral-8x7b-instruct", + "modelKey": "mistralai/mixtral-8x7b-instruct", + "displayName": "Mistral: Mixtral 8x7B Instruct", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2023-12-10" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mixtral-8x7b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mixtral-8x7b-instruct-hf", + "provider": "mistral", + "model": "mixtral-8x7b-instruct-hf", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/mixtral-8x7b-instruct-hf" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mixtral-8x7b-instruct-hf", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/mixtral-8x7b-instruct-hf", + "mode": "chat" + } + ] + }, + { + "id": "mistral/mixtral-8x7b-instruct-v0.1", + "provider": "mistral", + "model": "mixtral-8x7b-instruct-v0.1", + "displayName": "Mixtral 8x7B Instruct v0.1", + "family": "mixtral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "anyscale", + "cortecs", + "deepinfra", + "nano-gpt", + "ollama", + "ovhcloud", + "replicate", + "together_ai" + ], + "aliases": [ + "anyscale/mistralai/Mixtral-8x7B-Instruct-v0.1", + "cortecs/mixtral-8x7B-instruct-v0.1", + "deepinfra/mistralai/Mixtral-8x7B-Instruct-v0.1", + "nano-gpt/mistralai/mixtral-8x7b-instruct-v0.1", + "ollama/mixtral-8x7B-Instruct-v0.1", + "ovhcloud/Mixtral-8x7B-Instruct-v0.1", + "replicate/mistralai/mixtral-8x7b-instruct-v0.1", + "together_ai/mistralai/Mixtral-8x7B-Instruct-v0.1" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "toolChoice": true, + "responseSchema": true, + "parallelFunctionCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "mixtral-8x7B-instruct-v0.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.438, + "output": 0.68 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mistralai/mixtral-8x7b-instruct-v0.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.27, + "output": 0.27 + } + }, + { + "source": "litellm", + "provider": "anyscale", + "model": "anyscale/mistralai/Mixtral-8x7B-Instruct-v0.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/mistralai/Mixtral-8x7B-Instruct-v0.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/mixtral-8x7B-Instruct-v0.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "ovhcloud", + "model": "ovhcloud/Mixtral-8x7B-Instruct-v0.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.63, + "output": 0.63 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/mistralai/mixtral-8x7b-instruct-v0.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/mistralai/Mixtral-8x7B-Instruct-v0.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mixtral 8x7B", + "Mixtral 8x7B Instruct v0.1" + ], + "families": [ + "mixtral" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-09", + "releaseDate": "2023-12-11", + "lastUpdated": "2023-12-11", + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "mixtral-8x7B-instruct-v0.1", + "modelKey": "mixtral-8x7B-instruct-v0.1", + "displayName": "Mixtral 8x7B Instruct v0.1", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2023-12-11", + "openWeights": true, + "releaseDate": "2023-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mistralai/mixtral-8x7b-instruct-v0.1", + "modelKey": "mistralai/mixtral-8x7b-instruct-v0.1", + "displayName": "Mixtral 8x7B", + "family": "mixtral", + "metadata": { + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "anyscale", + "model": "anyscale/mistralai/Mixtral-8x7B-Instruct-v0.1", + "mode": "chat", + "metadata": { + "source": "https://docs.anyscale.com/preview/endpoints/text-generation/supported-models/mistralai-Mixtral-8x7B-Instruct-v0.1" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/mistralai/Mixtral-8x7B-Instruct-v0.1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/mixtral-8x7B-Instruct-v0.1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ovhcloud", + "model": "ovhcloud/Mixtral-8x7B-Instruct-v0.1", + "mode": "chat", + "metadata": { + "source": "https://endpoints.ai.cloud.ovh.net/models/mixtral-8x7b-instruct-v0-1" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/mistralai/mixtral-8x7b-instruct-v0.1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/mistralai/Mixtral-8x7B-Instruct-v0.1", + "mode": "chat" + } + ] + }, + { + "id": "mistral/open-codestral-mamba", + "provider": "mistral", + "model": "open-codestral-mamba", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/open-codestral-mamba" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/open-codestral-mamba", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 0.25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/open-codestral-mamba", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/technology/" + } + } + ] + }, + { + "id": "mistral/open-mistral-7b", + "provider": "mistral", + "model": "open-mistral-7b", + "displayName": "Mistral 7B", + "family": "mistral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/open-mistral-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "mistral", + "model": "open-mistral-7b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 0.25 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/open-mistral-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 0.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral 7B" + ], + "families": [ + "mistral" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2023-09-27", + "lastUpdated": "2023-09-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "open-mistral-7b", + "modelKey": "open-mistral-7b", + "displayName": "Mistral 7B", + "family": "mistral", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2023-09-27", + "openWeights": true, + "releaseDate": "2023-09-27" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/open-mistral-7b", + "mode": "chat" + } + ] + }, + { + "id": "mistral/open-mistral-nemo", + "provider": "mistral", + "model": "open-mistral-nemo", + "displayName": "Open Mistral Nemo", + "family": "mistral-nemo", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/open-mistral-nemo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "mistral", + "model": "open-mistral-nemo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/open-mistral-nemo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Open Mistral Nemo" + ], + "families": [ + "mistral-nemo" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2024-07-01", + "lastUpdated": "2024-07-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "open-mistral-nemo", + "modelKey": "open-mistral-nemo", + "displayName": "Open Mistral Nemo", + "family": "mistral-nemo", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2024-07-01", + "openWeights": true, + "releaseDate": "2024-07-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/open-mistral-nemo", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/technology/" + } + } + ] + }, + { + "id": "mistral/open-mistral-nemo-2407", + "provider": "mistral", + "model": "open-mistral-nemo-2407", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/open-mistral-nemo-2407" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/open-mistral-nemo-2407", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/open-mistral-nemo-2407", + "mode": "chat", + "metadata": { + "source": "https://mistral.ai/technology/" + } + } + ] + }, + { + "id": "mistral/open-mixtral-8x22b", + "provider": "mistral", + "model": "open-mixtral-8x22b", + "displayName": "Mixtral 8x22B", + "family": "mixtral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/open-mixtral-8x22b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65336, + "inputTokens": 65336, + "maxTokens": 8191, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "mistral", + "model": "open-mixtral-8x22b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/open-mixtral-8x22b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mixtral 8x22B" + ], + "families": [ + "mixtral" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-04-17", + "lastUpdated": "2024-04-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "open-mixtral-8x22b", + "modelKey": "open-mixtral-8x22b", + "displayName": "Mixtral 8x22B", + "family": "mixtral", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-04-17", + "openWeights": true, + "releaseDate": "2024-04-17" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/open-mixtral-8x22b", + "mode": "chat" + } + ] + }, + { + "id": "mistral/open-mixtral-8x7b", + "provider": "mistral", + "model": "open-mixtral-8x7b", + "displayName": "Mixtral 8x7B", + "family": "mixtral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "mistral" + ], + "aliases": [ + "mistral/open-mixtral-8x7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 8191, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "mistral", + "model": "open-mixtral-8x7b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 0.7 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/open-mixtral-8x7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.7, + "output": 0.7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mixtral 8x7B" + ], + "families": [ + "mixtral" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-01", + "releaseDate": "2023-12-11", + "lastUpdated": "2023-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "open-mixtral-8x7b", + "modelKey": "open-mixtral-8x7b", + "displayName": "Mixtral 8x7B", + "family": "mixtral", + "metadata": { + "knowledgeCutoff": "2024-01", + "lastUpdated": "2023-12-11", + "openWeights": true, + "releaseDate": "2023-12-11" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/open-mixtral-8x7b", + "mode": "chat" + } + ] + }, + { + "id": "mistral/pixtral-12b", + "provider": "mistral", + "model": "pixtral-12b", + "displayName": "Pixtral 12B", + "family": "pixtral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "mistral", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "mistral/pixtral-12b", + "vercel/mistral/pixtral-12b", + "vercel_ai_gateway/mistral/pixtral-12b" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "mistral", + "model": "pixtral-12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "mistral/pixtral-12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/pixtral-12b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Pixtral 12B" + ], + "families": [ + "pixtral" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-09", + "releaseDate": "2024-09-01", + "lastUpdated": "2024-09-01", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "pixtral-12b", + "modelKey": "pixtral-12b", + "displayName": "Pixtral 12B", + "family": "pixtral", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2024-09-01", + "openWeights": true, + "releaseDate": "2024-09-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/pixtral-12b", + "modelKey": "mistral/pixtral-12b", + "displayName": "Pixtral 12B", + "family": "pixtral", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2024-09-01", + "openWeights": true, + "releaseDate": "2024-09-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/pixtral-12b", + "mode": "chat" + } + ] + }, + { + "id": "mistral/pixtral-12b-2409", + "provider": "mistral", + "model": "pixtral-12b-2409", + "displayName": "Pixtral 12B 2409", + "family": "pixtral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "mistral", + "scaleway", + "watsonx" + ], + "aliases": [ + "mistral/pixtral-12b-2409", + "scaleway/pixtral-12b-2409", + "watsonx/mistralai/pixtral-12b-2409" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false, + "attachments": true, + "openWeights": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "parallelFunctionCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "scaleway", + "model": "pixtral-12b-2409", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/pixtral-12b-2409", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/mistralai/pixtral-12b-2409", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.35, + "output": 0.35 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Pixtral 12B 2409" + ], + "families": [ + "pixtral" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-09", + "releaseDate": "2024-09-25", + "lastUpdated": "2026-03-17", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "scaleway", + "providerName": "Scaleway", + "providerApi": "https://api.scaleway.ai/v1", + "providerDoc": "https://www.scaleway.com/en/docs/generative-apis/", + "model": "pixtral-12b-2409", + "modelKey": "pixtral-12b-2409", + "displayName": "Pixtral 12B 2409", + "family": "pixtral", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2026-03-17", + "openWeights": true, + "releaseDate": "2024-09-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/pixtral-12b-2409", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/mistralai/pixtral-12b-2409", + "mode": "chat" + } + ] + }, + { + "id": "mistral/pixtral-large", + "provider": "mistral", + "model": "pixtral-large", + "displayName": "Pixtral Large (latest)", + "family": "pixtral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "vercel/mistral/pixtral-large", + "vercel_ai_gateway/mistral/pixtral-large" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "mistral/pixtral-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/pixtral-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Pixtral Large (latest)" + ], + "families": [ + "pixtral" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-11", + "releaseDate": "2024-11-01", + "lastUpdated": "2024-11-04", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "mistral/pixtral-large", + "modelKey": "mistral/pixtral-large", + "displayName": "Pixtral Large (latest)", + "family": "pixtral", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2024-11-04", + "openWeights": true, + "releaseDate": "2024-11-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/mistral/pixtral-large", + "mode": "chat" + } + ] + }, + { + "id": "mistral/pixtral-large-2411", + "provider": "mistral", + "model": "pixtral-large-2411", + "displayName": "Mistral: Pixtral Large 2411", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "kilo", + "mistral" + ], + "aliases": [ + "kilo/mistralai/pixtral-large-2411", + "mistral/pixtral-large-2411" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false, + "attachments": true, + "openWeights": true, + "reasoning": false, + "temperature": true, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/pixtral-large-2411", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/pixtral-large-2411", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral: Pixtral Large 2411" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-11-19", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/pixtral-large-2411", + "modelKey": "mistralai/pixtral-large-2411", + "displayName": "Mistral: Pixtral Large 2411", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2024-11-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/pixtral-large-2411", + "mode": "chat" + } + ] + }, + { + "id": "mistral/pixtral-large-latest", + "provider": "mistral", + "model": "pixtral-large-latest", + "displayName": "Pixtral Large (latest)", + "family": "pixtral", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "llmgateway", + "merge-gateway", + "mistral" + ], + "aliases": [ + "llmgateway/pixtral-large-latest", + "merge-gateway/mistral/pixtral-large-latest", + "mistral/pixtral-large-latest" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "assistantPrefill": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "pixtral-large-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "mistral/pixtral-large-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "mistral", + "model": "pixtral-large-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "mistral", + "model": "mistral/pixtral-large-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Pixtral Large (latest)" + ], + "families": [ + "pixtral" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-11", + "releaseDate": "2024-11-01", + "lastUpdated": "2024-11-04", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "pixtral-large-latest", + "modelKey": "pixtral-large-latest", + "displayName": "Pixtral Large (latest)", + "family": "pixtral", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2024-11-04", + "openWeights": true, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "mistral/pixtral-large-latest", + "modelKey": "mistral/pixtral-large-latest", + "displayName": "Pixtral Large (latest)", + "family": "pixtral", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2024-11-04", + "openWeights": true, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "mistral", + "providerName": "Mistral", + "providerDoc": "https://docs.mistral.ai/getting-started/models/", + "model": "pixtral-large-latest", + "modelKey": "pixtral-large-latest", + "displayName": "Pixtral Large (latest)", + "family": "pixtral", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2024-11-04", + "openWeights": true, + "releaseDate": "2024-11-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "mistral", + "model": "mistral/pixtral-large-latest", + "mode": "chat" + } + ] + }, + { + "id": "mistral/voxtral-small-24b-2507", + "provider": "mistral", + "model": "voxtral-small-24b-2507", + "displayName": "Voxtral Small 24B", + "family": "voxtral", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "evroc", + "kilo", + "openrouter", + "scaleway" + ], + "aliases": [ + "evroc/mistralai/Voxtral-Small-24B-2507", + "kilo/mistralai/voxtral-small-24b-2507", + "openrouter/mistralai/voxtral-small-24b-2507", + "scaleway/voxtral-small-24b-2507" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "file", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "temperature": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "evroc", + "model": "mistralai/Voxtral-Small-24B-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.00236, + "output": 0.00236, + "outputAudio": 2.36 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "mistralai/voxtral-small-24b-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "mistralai/voxtral-small-24b-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "scaleway", + "model": "voxtral-small-24b-2507", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.35 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mistralai/voxtral-small-24b-2507", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "output": 0.3 + }, + "other": { + "audio": 0.0001 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral: Voxtral Small 24B 2507", + "Voxtral Small 24B", + "Voxtral Small 24B 2507" + ], + "families": [ + "mistral", + "voxtral" + ], + "releaseDate": "2025-03-01", + "lastUpdated": "2025-03-01", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "evroc", + "providerName": "evroc", + "providerApi": "https://models.think.evroc.com/v1", + "providerDoc": "https://docs.evroc.com/products/think/overview.html", + "model": "mistralai/Voxtral-Small-24B-2507", + "modelKey": "mistralai/Voxtral-Small-24B-2507", + "displayName": "Voxtral Small 24B", + "family": "voxtral", + "metadata": { + "lastUpdated": "2025-03-01", + "openWeights": true, + "releaseDate": "2025-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "mistralai/voxtral-small-24b-2507", + "modelKey": "mistralai/voxtral-small-24b-2507", + "displayName": "Mistral: Voxtral Small 24B 2507", + "metadata": { + "lastUpdated": "2025-07-01", + "openWeights": true, + "releaseDate": "2025-07-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mistralai/voxtral-small-24b-2507", + "modelKey": "mistralai/voxtral-small-24b-2507", + "displayName": "Voxtral Small 24B 2507", + "family": "mistral", + "metadata": { + "lastUpdated": "2025-10-30", + "openWeights": true, + "releaseDate": "2025-10-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "scaleway", + "providerName": "Scaleway", + "providerApi": "https://api.scaleway.ai/v1", + "providerDoc": "https://www.scaleway.com/en/docs/generative-apis/", + "model": "voxtral-small-24b-2507", + "modelKey": "voxtral-small-24b-2507", + "displayName": "Voxtral Small 24B 2507", + "family": "voxtral", + "metadata": { + "lastUpdated": "2026-03-17", + "openWeights": true, + "releaseDate": "2025-07-01" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mistralai/voxtral-small-24b-2507", + "displayName": "Mistral: Voxtral Small 24B 2507", + "metadata": { + "canonicalSlug": "mistralai/voxtral-small-24b-2507", + "createdAt": "2025-10-30T14:39:04.000Z", + "huggingFaceId": "mistralai/Voxtral-Small-24B-2507", + "links": { + "details": "/api/v1/models/mistralai/voxtral-small-24b-2507/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 32000, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "moonshotai/kimi-k2", + "provider": "moonshotai", + "model": "kimi-k2", + "displayName": "Kimi K2", + "family": "kimi-k2", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "fastrouter", + "iflowcn", + "kilo", + "llmgateway", + "opencode", + "openrouter", + "qiniu-ai", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "fastrouter/moonshotai/kimi-k2", + "iflowcn/kimi-k2", + "kilo/moonshotai/kimi-k2", + "llmgateway/kimi-k2", + "opencode/kimi-k2", + "openrouter/moonshotai/kimi-k2", + "qiniu-ai/kimi-k2", + "vercel/moonshotai/kimi-k2", + "vercel_ai_gateway/moonshotai/kimi-k2" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 262144, + "inputTokens": 131072, + "maxTokens": 16384, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fastrouter", + "model": "moonshotai/kimi-k2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "iflowcn", + "model": "kimi-k2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "moonshotai/kimi-k2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "kimi-k2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12, + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "kimi-k2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.4, + "input": 0.4, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "moonshotai/kimi-k2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.57, + "output": 2.3 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "moonshotai/kimi-k2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.57, + "output": 2.3 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/moonshotai/kimi-k2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.55, + "output": 2.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "moonshotai/kimi-k2", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.57, + "output": 2.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2", + "Kimi K2 0711", + "Kimi K2 Instruct", + "Kimi-K2", + "MoonshotAI: Kimi K2 0711" + ], + "families": [ + "kimi-k2" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-07-11", + "lastUpdated": "2025-07-11", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "moonshotai/kimi-k2", + "modelKey": "moonshotai/kimi-k2", + "displayName": "Kimi K2", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-07-11", + "openWeights": true, + "releaseDate": "2025-07-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "iflowcn", + "providerName": "iFlow", + "providerApi": "https://apis.iflow.cn/v1", + "providerDoc": "https://platform.iflow.cn/en/docs", + "model": "kimi-k2", + "modelKey": "kimi-k2", + "displayName": "Kimi-K2", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-12-01", + "openWeights": false, + "releaseDate": "2024-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "moonshotai/kimi-k2", + "modelKey": "moonshotai/kimi-k2", + "displayName": "MoonshotAI: Kimi K2 0711", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-07-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "kimi-k2", + "modelKey": "kimi-k2", + "displayName": "Kimi K2", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2025-07-11", + "openWeights": true, + "releaseDate": "2025-07-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "kimi-k2", + "modelKey": "kimi-k2", + "displayName": "Kimi K2", + "family": "kimi-k2", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-09-05", + "openWeights": true, + "releaseDate": "2025-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "moonshotai/kimi-k2", + "modelKey": "moonshotai/kimi-k2", + "displayName": "Kimi K2 0711", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-12-31", + "lastUpdated": "2025-07-11", + "openWeights": true, + "releaseDate": "2025-07-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "kimi-k2", + "modelKey": "kimi-k2", + "displayName": "Kimi K2", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "moonshotai/kimi-k2", + "modelKey": "moonshotai/kimi-k2", + "displayName": "Kimi K2 Instruct", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2025-09-05", + "openWeights": false, + "releaseDate": "2025-09-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/moonshotai/kimi-k2", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "moonshotai/kimi-k2", + "displayName": "MoonshotAI: Kimi K2 0711", + "metadata": { + "canonicalSlug": "moonshotai/kimi-k2", + "createdAt": "2025-07-11T19:47:32.000Z", + "huggingFaceId": "moonshotai/Kimi-K2-Instruct", + "knowledgeCutoff": "2024-12-31", + "links": { + "details": "/api/v1/models/moonshotai/kimi-k2/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "moonshotai/kimi-k2-0711", + "provider": "moonshotai", + "model": "kimi-k2-0711", + "displayName": "Kimi K2 (07/11)", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "helicone" + ], + "aliases": [ + "helicone/kimi-k2-0711" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "kimi-k2-0711", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5700000000000001, + "output": 2.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2 (07/11)" + ], + "families": [ + "kimi-k2" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "kimi-k2-0711", + "modelKey": "kimi-k2-0711", + "displayName": "Kimi K2 (07/11)", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2-0711-preview", + "provider": "moonshotai", + "model": "kimi-k2-0711-preview", + "displayName": "Kimi K2 0711", + "family": "kimi-k2", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "moonshot", + "moonshotai", + "moonshotai-cn" + ], + "aliases": [ + "moonshot/kimi-k2-0711-preview", + "moonshotai-cn/kimi-k2-0711-preview", + "moonshotai/kimi-k2-0711-preview" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "moonshotai-cn", + "model": "kimi-k2-0711-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "moonshotai", + "model": "kimi-k2-0711-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/kimi-k2-0711-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2 0711" + ], + "families": [ + "kimi-k2" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-07-14", + "lastUpdated": "2025-07-14", + "deprecationDate": "2026-05-25", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai-cn", + "providerName": "Moonshot AI (China)", + "providerApi": "https://api.moonshot.cn/v1", + "providerDoc": "https://platform.moonshot.cn/docs/api/chat", + "model": "kimi-k2-0711-preview", + "modelKey": "kimi-k2-0711-preview", + "displayName": "Kimi K2 0711", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-07-14", + "openWeights": true, + "releaseDate": "2025-07-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai", + "providerName": "Moonshot AI", + "providerApi": "https://api.moonshot.ai/v1", + "providerDoc": "https://platform.moonshot.ai/docs/api/chat", + "model": "kimi-k2-0711-preview", + "modelKey": "kimi-k2-0711-preview", + "displayName": "Kimi K2 0711", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-07-14", + "openWeights": true, + "releaseDate": "2025-07-14" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/kimi-k2-0711-preview", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-25", + "source": "https://platform.moonshot.ai/docs/pricing/chat#generation-model-kimi-k2" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2-0905", + "provider": "moonshotai", + "model": "kimi-k2-0905", + "displayName": "Kimi K2 (09/05)", + "family": "kimi-k2", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "helicone", + "iflowcn", + "jiekou", + "kilo", + "novita", + "novita-ai", + "openrouter", + "qiniu-ai", + "zenmux" + ], + "aliases": [ + "helicone/kimi-k2-0905", + "iflowcn/kimi-k2-0905", + "jiekou/moonshotai/kimi-k2-0905", + "kilo/moonshotai/kimi-k2-0905", + "novita-ai/moonshotai/kimi-k2-0905", + "novita/moonshotai/kimi-k2-0905", + "openrouter/moonshotai/kimi-k2-0905", + "qiniu-ai/moonshotai/kimi-k2-0905", + "zenmux/moonshotai/kimi-k2-0905" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "kimi-k2-0905", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.39999999999999997, + "input": 0.5, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "iflowcn", + "model": "kimi-k2-0905", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "moonshotai/kimi-k2-0905", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "moonshotai/kimi-k2-0905", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "moonshotai/kimi-k2-0905", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "moonshotai/kimi-k2-0905", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "moonshotai/kimi-k2-0905", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/moonshotai/kimi-k2-0905", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "moonshotai/kimi-k2-0905", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2 (09/05)", + "Kimi K2 0905", + "Kimi-K2-0905", + "MoonshotAI: Kimi K2 0905" + ], + "families": [ + "kimi-k2" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-09", + "releaseDate": "2025-09-05", + "lastUpdated": "2025-09-05", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "kimi-k2-0905", + "modelKey": "kimi-k2-0905", + "displayName": "Kimi K2 (09/05)", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2025-09-05", + "openWeights": false, + "releaseDate": "2025-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "iflowcn", + "providerName": "iFlow", + "providerApi": "https://apis.iflow.cn/v1", + "providerDoc": "https://platform.iflow.cn/en/docs", + "model": "kimi-k2-0905", + "modelKey": "kimi-k2-0905", + "displayName": "Kimi-K2-0905", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-09-05", + "openWeights": false, + "releaseDate": "2025-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "moonshotai/kimi-k2-0905", + "modelKey": "moonshotai/kimi-k2-0905", + "displayName": "Kimi K2 0905", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "moonshotai/kimi-k2-0905", + "modelKey": "moonshotai/kimi-k2-0905", + "displayName": "MoonshotAI: Kimi K2 0905", + "metadata": { + "lastUpdated": "2025-09-05", + "openWeights": true, + "releaseDate": "2025-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "moonshotai/kimi-k2-0905", + "modelKey": "moonshotai/kimi-k2-0905", + "displayName": "Kimi K2 0905", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-09-05", + "openWeights": true, + "releaseDate": "2025-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "moonshotai/kimi-k2-0905", + "modelKey": "moonshotai/kimi-k2-0905", + "displayName": "Kimi K2 0905", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-12-31", + "lastUpdated": "2025-09-04", + "openWeights": true, + "releaseDate": "2025-09-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "moonshotai/kimi-k2-0905", + "modelKey": "moonshotai/kimi-k2-0905", + "displayName": "Kimi K2 0905", + "metadata": { + "lastUpdated": "2025-09-08", + "openWeights": false, + "releaseDate": "2025-09-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "moonshotai/kimi-k2-0905", + "modelKey": "moonshotai/kimi-k2-0905", + "displayName": "Kimi K2 0905", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-09-04", + "openWeights": false, + "releaseDate": "2025-09-04" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/moonshotai/kimi-k2-0905", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "moonshotai/kimi-k2-0905", + "displayName": "MoonshotAI: Kimi K2 0905", + "metadata": { + "canonicalSlug": "moonshotai/kimi-k2-0905", + "createdAt": "2025-09-04T21:25:47.000Z", + "huggingFaceId": "moonshotai/Kimi-K2-Instruct-0905", + "knowledgeCutoff": "2024-12-31", + "links": { + "details": "/api/v1/models/moonshotai/kimi-k2-0905/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 262144, + "is_moderated": false + } + } + } + ] + }, + { + "id": "moonshotai/kimi-k2-0905-preview", + "provider": "moonshotai", + "model": "kimi-k2-0905-preview", + "displayName": "Kimi K2 0905", + "family": "kimi-k2", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "moonshot", + "moonshotai", + "moonshotai-cn" + ], + "aliases": [ + "302ai/kimi-k2-0905-preview", + "moonshot/kimi-k2-0905-preview", + "moonshotai-cn/kimi-k2-0905-preview", + "moonshotai/kimi-k2-0905-preview" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "kimi-k2-0905-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.632, + "output": 2.53 + } + }, + { + "source": "models.dev", + "provider": "moonshotai-cn", + "model": "kimi-k2-0905-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "moonshotai", + "model": "kimi-k2-0905-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/kimi-k2-0905-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2 0905", + "kimi-k2-0905-preview" + ], + "families": [ + "kimi-k2" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2025-09-05", + "lastUpdated": "2025-09-05", + "deprecationDate": "2026-05-25", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "kimi-k2-0905-preview", + "modelKey": "kimi-k2-0905-preview", + "displayName": "kimi-k2-0905-preview", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-09-05", + "openWeights": false, + "releaseDate": "2025-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai-cn", + "providerName": "Moonshot AI (China)", + "providerApi": "https://api.moonshot.cn/v1", + "providerDoc": "https://platform.moonshot.cn/docs/api/chat", + "model": "kimi-k2-0905-preview", + "modelKey": "kimi-k2-0905-preview", + "displayName": "Kimi K2 0905", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-09-05", + "openWeights": true, + "releaseDate": "2025-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai", + "providerName": "Moonshot AI", + "providerApi": "https://api.moonshot.ai/v1", + "providerDoc": "https://platform.moonshot.ai/docs/api/chat", + "model": "kimi-k2-0905-preview", + "modelKey": "kimi-k2-0905-preview", + "displayName": "Kimi K2 0905", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-09-05", + "openWeights": true, + "releaseDate": "2025-09-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/kimi-k2-0905-preview", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-25", + "source": "https://platform.moonshot.ai/docs/pricing/chat#generation-model-kimi-k2" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2-5", + "provider": "moonshotai", + "model": "kimi-k2-5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/kimi-k2-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "kimi-k2-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.22, + "input": 0.56, + "output": 3.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.5" + ], + "families": [ + "kimi-k2" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2026-01-27", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "kimi-k2-5", + "modelKey": "kimi-k2-5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-01-27", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "moonshotai/kimi-k2-6", + "provider": "moonshotai", + "model": "kimi-k2-6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "clarifai", + "frogbot", + "venice" + ], + "aliases": [ + "clarifai/moonshotai/chat-completion/models/Kimi-K2_6", + "frogbot/kimi-k2-6", + "venice/kimi-k2-6" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "clarifai", + "model": "moonshotai/chat-completion/models/Kimi-K2_6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "frogbot", + "model": "kimi-k2-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "kimi-k2-6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.22, + "input": 0.85, + "output": 4.655 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.6", + "Kimi-K2.6" + ], + "families": [ + "kimi-k2" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-04-21", + "lastUpdated": "2026-04-21", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "clarifai", + "providerName": "Clarifai", + "providerApi": "https://api.clarifai.com/v2/ext/openai/v1", + "providerDoc": "https://docs.clarifai.com/compute/inference/", + "model": "moonshotai/chat-completion/models/Kimi-K2_6", + "modelKey": "moonshotai/chat-completion/models/Kimi-K2_6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "kimi-k2-6", + "modelKey": "kimi-k2-6", + "displayName": "Kimi-K2.6", + "metadata": { + "lastUpdated": "1970-01-01", + "openWeights": false, + "releaseDate": "1970-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "kimi-k2-6", + "modelKey": "kimi-k2-6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-04-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "moonshotai/kimi-k2-7-code", + "provider": "moonshotai", + "model": "kimi-k2-7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/kimi-k2-7-code" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "kimi-k2-7-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.9, + "output": 4.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.7 Code" + ], + "families": [ + "kimi-k2" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-06-13", + "lastUpdated": "2026-06-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "kimi-k2-7-code", + "modelKey": "kimi-k2-7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-16", + "openWeights": true, + "releaseDate": "2026-06-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "moonshotai/kimi-k2-instruct", + "provider": "moonshotai", + "model": "kimi-k2-instruct", + "displayName": "Kimi K2 Instruct", + "family": "kimi-k2", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "cortecs", + "deepinfra", + "fireworks_ai", + "huggingface", + "hyperbolic", + "jiekou", + "nano-gpt", + "novita", + "novita-ai", + "siliconflow", + "together_ai", + "wandb" + ], + "aliases": [ + "cortecs/kimi-k2-instruct", + "deepinfra/moonshotai/Kimi-K2-Instruct", + "fireworks_ai/accounts/fireworks/models/kimi-k2-instruct", + "huggingface/moonshotai/Kimi-K2-Instruct", + "hyperbolic/moonshotai/Kimi-K2-Instruct", + "jiekou/moonshotai/kimi-k2-instruct", + "nano-gpt/moonshotai/kimi-k2-instruct", + "novita-ai/moonshotai/kimi-k2-instruct", + "novita/moonshotai/kimi-k2-instruct", + "siliconflow/moonshotai/Kimi-K2-Instruct", + "together_ai/moonshotai/Kimi-K2-Instruct", + "wandb/moonshotai/Kimi-K2-Instruct" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "responseSchema": true, + "parallelFunctionCalling": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cortecs", + "model": "kimi-k2-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.551, + "output": 2.646 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "moonshotai/Kimi-K2-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "moonshotai/kimi-k2-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.57, + "output": 2.3 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "moonshotai/kimi-k2-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "moonshotai/kimi-k2-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.57, + "output": 2.3 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "moonshotai/Kimi-K2-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.58, + "output": 2.29 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/moonshotai/Kimi-K2-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/kimi-k2-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "hyperbolic", + "model": "hyperbolic/moonshotai/Kimi-K2-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/moonshotai/kimi-k2-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.57, + "output": 2.3 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/moonshotai/Kimi-K2-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "wandb", + "model": "wandb/moonshotai/Kimi-K2-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2 Instruct", + "Kimi-K2-Instruct", + "moonshotai/Kimi-K2-Instruct" + ], + "families": [ + "kimi-k2" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2025-07-11", + "lastUpdated": "2025-09-05", + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "kimi-k2-instruct", + "modelKey": "kimi-k2-instruct", + "displayName": "Kimi K2 Instruct", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-09-05", + "openWeights": true, + "releaseDate": "2025-07-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "moonshotai/Kimi-K2-Instruct", + "modelKey": "moonshotai/Kimi-K2-Instruct", + "displayName": "Kimi-K2-Instruct", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-07-14", + "openWeights": true, + "releaseDate": "2025-07-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "moonshotai/kimi-k2-instruct", + "modelKey": "moonshotai/kimi-k2-instruct", + "displayName": "Kimi K2 Instruct", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "moonshotai/kimi-k2-instruct", + "modelKey": "moonshotai/kimi-k2-instruct", + "displayName": "Kimi K2 Instruct", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2025-07-01", + "openWeights": false, + "releaseDate": "2025-07-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "moonshotai/kimi-k2-instruct", + "modelKey": "moonshotai/kimi-k2-instruct", + "displayName": "Kimi K2 Instruct", + "metadata": { + "lastUpdated": "2025-07-11", + "openWeights": true, + "releaseDate": "2025-07-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "moonshotai/Kimi-K2-Instruct", + "modelKey": "moonshotai/Kimi-K2-Instruct", + "displayName": "moonshotai/Kimi-K2-Instruct", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-07-13" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/moonshotai/Kimi-K2-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/kimi-k2-instruct", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/models/fireworks/kimi-k2-instruct" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "hyperbolic", + "model": "hyperbolic/moonshotai/Kimi-K2-Instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/moonshotai/kimi-k2-instruct", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/moonshotai/Kimi-K2-Instruct", + "mode": "chat", + "metadata": { + "source": "https://www.together.ai/models/kimi-k2-instruct" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "wandb", + "model": "wandb/moonshotai/Kimi-K2-Instruct", + "mode": "chat" + } + ] + }, + { + "id": "moonshotai/kimi-k2-instruct-0711", + "provider": "moonshotai", + "model": "kimi-k2-instruct-0711", + "displayName": "Kimi K2 0711", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/moonshotai/kimi-k2-instruct-0711" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "moonshotai/kimi-k2-instruct-0711", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2 0711" + ], + "families": [ + "kimi-k2" + ], + "releaseDate": "2025-07-11", + "lastUpdated": "2025-07-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "moonshotai/kimi-k2-instruct-0711", + "modelKey": "moonshotai/kimi-k2-instruct-0711", + "displayName": "Kimi K2 0711", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2025-07-11", + "openWeights": false, + "releaseDate": "2025-07-11" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2-instruct-0905", + "provider": "moonshotai", + "model": "kimi-k2-instruct-0905", + "displayName": "Kimi-K2-Instruct-0905", + "family": "kimi-k2", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "baseten", + "deepinfra", + "fireworks_ai", + "groq", + "huggingface", + "io-net", + "nano-gpt", + "nvidia", + "siliconflow", + "siliconflow-cn", + "synthetic", + "together_ai" + ], + "aliases": [ + "baseten/moonshotai/Kimi-K2-Instruct-0905", + "deepinfra/moonshotai/Kimi-K2-Instruct-0905", + "fireworks_ai/accounts/fireworks/models/kimi-k2-instruct-0905", + "groq/moonshotai/kimi-k2-instruct-0905", + "huggingface/moonshotai/Kimi-K2-Instruct-0905", + "io-net/moonshotai/Kimi-K2-Instruct-0905", + "nano-gpt/moonshotai/Kimi-K2-Instruct-0905", + "nvidia/moonshotai/kimi-k2-instruct-0905", + "siliconflow-cn/Pro/moonshotai/Kimi-K2-Instruct-0905", + "siliconflow-cn/moonshotai/Kimi-K2-Instruct-0905", + "siliconflow/moonshotai/Kimi-K2-Instruct-0905", + "synthetic/hf:moonshotai/Kimi-K2-Instruct-0905", + "together_ai/moonshotai/Kimi-K2-Instruct-0905" + ], + "mergedProviderModelRecords": 13, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "functionCalling": true, + "toolChoice": true, + "responseSchema": true, + "parallelFunctionCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "huggingface", + "model": "moonshotai/Kimi-K2-Instruct-0905", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "io-net", + "model": "moonshotai/Kimi-K2-Instruct-0905", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.195, + "cacheWrite": 0.78, + "input": 0.39, + "output": 1.9 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "moonshotai/Kimi-K2-Instruct-0905", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "moonshotai/kimi-k2-instruct-0905", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "moonshotai/Kimi-K2-Instruct-0905", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Pro/moonshotai/Kimi-K2-Instruct-0905", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "moonshotai/Kimi-K2-Instruct-0905", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:moonshotai/Kimi-K2-Instruct-0905", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.2, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "baseten", + "model": "baseten/moonshotai/Kimi-K2-Instruct-0905", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/moonshotai/Kimi-K2-Instruct-0905", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.4, + "input": 0.5, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/kimi-k2-instruct-0905", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "groq", + "model": "groq/moonshotai/kimi-k2-instruct-0905", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 1, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/moonshotai/Kimi-K2-Instruct-0905", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2 0905", + "Kimi K2 Instruct", + "Kimi-K2-Instruct-0905", + "Pro/moonshotai/Kimi-K2-Instruct-0905", + "moonshotai/Kimi-K2-Instruct-0905" + ], + "families": [ + "kimi-k2" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-09-04", + "lastUpdated": "2025-09-04", + "providerModelRecordCount": 13 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "moonshotai/Kimi-K2-Instruct-0905", + "modelKey": "moonshotai/Kimi-K2-Instruct-0905", + "displayName": "Kimi-K2-Instruct-0905", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-09-04", + "openWeights": true, + "releaseDate": "2025-09-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "io-net", + "providerName": "IO.NET", + "providerApi": "https://api.intelligence.io.solutions/api/v1", + "providerDoc": "https://io.net/docs/guides/intelligence/io-intelligence", + "model": "moonshotai/Kimi-K2-Instruct-0905", + "modelKey": "moonshotai/Kimi-K2-Instruct-0905", + "displayName": "Kimi K2 Instruct", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2024-09-05", + "openWeights": false, + "releaseDate": "2024-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "moonshotai/Kimi-K2-Instruct-0905", + "modelKey": "moonshotai/Kimi-K2-Instruct-0905", + "displayName": "Kimi K2 0905", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "moonshotai/kimi-k2-instruct-0905", + "modelKey": "moonshotai/kimi-k2-instruct-0905", + "displayName": "Kimi K2 0905", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-09-05", + "openWeights": true, + "releaseDate": "2025-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "moonshotai/Kimi-K2-Instruct-0905", + "modelKey": "moonshotai/Kimi-K2-Instruct-0905", + "displayName": "moonshotai/Kimi-K2-Instruct-0905", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-09-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Pro/moonshotai/Kimi-K2-Instruct-0905", + "modelKey": "Pro/moonshotai/Kimi-K2-Instruct-0905", + "displayName": "Pro/moonshotai/Kimi-K2-Instruct-0905", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-09-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "moonshotai/Kimi-K2-Instruct-0905", + "modelKey": "moonshotai/Kimi-K2-Instruct-0905", + "displayName": "moonshotai/Kimi-K2-Instruct-0905", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-09-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:moonshotai/Kimi-K2-Instruct-0905", + "modelKey": "hf:moonshotai/Kimi-K2-Instruct-0905", + "displayName": "Kimi K2 0905", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-09-05", + "openWeights": true, + "releaseDate": "2025-09-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "baseten", + "model": "baseten/moonshotai/Kimi-K2-Instruct-0905", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/moonshotai/Kimi-K2-Instruct-0905", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/kimi-k2-instruct-0905", + "mode": "chat", + "metadata": { + "source": "https://app.fireworks.ai/models/fireworks/kimi-k2-instruct-0905" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "groq", + "model": "groq/moonshotai/kimi-k2-instruct-0905", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/moonshotai/Kimi-K2-Instruct-0905", + "mode": "chat", + "metadata": { + "source": "https://www.together.ai/models/kimi-k2-0905" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2-instruct-fast", + "provider": "moonshotai", + "model": "kimi-k2-instruct-fast", + "displayName": "Kimi K2 0711 Fast", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/kimi-k2-instruct-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "kimi-k2-instruct-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2 0711 Fast" + ], + "releaseDate": "2025-07-15", + "lastUpdated": "2025-07-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "kimi-k2-instruct-fast", + "modelKey": "kimi-k2-instruct-fast", + "displayName": "Kimi K2 0711 Fast", + "metadata": { + "lastUpdated": "2025-07-15", + "openWeights": false, + "releaseDate": "2025-07-15" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2-instruct-fp4", + "provider": "moonshotai", + "model": "kimi-k2-instruct-fp4", + "displayName": "Kimi K2 0711 Instruct FP4", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/baseten/Kimi-K2-Instruct-FP4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "baseten/Kimi-K2-Instruct-FP4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2 0711 Instruct FP4" + ], + "families": [ + "kimi-k2" + ], + "releaseDate": "2025-07-11", + "lastUpdated": "2025-07-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "baseten/Kimi-K2-Instruct-FP4", + "modelKey": "baseten/Kimi-K2-Instruct-FP4", + "displayName": "Kimi K2 0711 Instruct FP4", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2025-07-11", + "openWeights": false, + "releaseDate": "2025-07-11" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2-thinking", + "provider": "moonshotai", + "model": "kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "alibaba-cn", + "azure", + "azure-cognitive-services", + "baseten", + "cortecs", + "crusoe", + "fireworks_ai", + "gmi", + "helicone", + "huggingface", + "io-net", + "kilo", + "kimi-for-coding", + "llmgateway", + "meganova", + "moonshot", + "moonshotai", + "moonshotai-cn", + "nano-gpt", + "novita", + "novita-ai", + "ollama-cloud", + "opencode", + "openrouter", + "poe", + "qiniu-ai", + "siliconflow", + "siliconflow-cn", + "synthetic", + "vercel", + "zenmux" + ], + "aliases": [ + "302ai/kimi-k2-thinking", + "alibaba-cn/kimi-k2-thinking", + "azure-cognitive-services/kimi-k2-thinking", + "azure/kimi-k2-thinking", + "baseten/moonshotai/Kimi-K2-Thinking", + "cortecs/kimi-k2-thinking", + "crusoe/moonshotai/Kimi-K2-Thinking", + "fireworks_ai/accounts/fireworks/models/kimi-k2-thinking", + "gmi/moonshotai/Kimi-K2-Thinking", + "helicone/kimi-k2-thinking", + "huggingface/moonshotai/Kimi-K2-Thinking", + "io-net/moonshotai/Kimi-K2-Thinking", + "kilo/moonshotai/kimi-k2-thinking", + "kimi-for-coding/kimi-k2-thinking", + "llmgateway/kimi-k2-thinking", + "meganova/moonshotai/Kimi-K2-Thinking", + "moonshot/kimi-k2-thinking", + "moonshotai-cn/kimi-k2-thinking", + "moonshotai/kimi-k2-thinking", + "nano-gpt/moonshotai/kimi-k2-thinking", + "novita-ai/moonshotai/kimi-k2-thinking", + "novita/moonshotai/kimi-k2-thinking", + "ollama-cloud/kimi-k2-thinking", + "opencode/kimi-k2-thinking", + "openrouter/moonshotai/kimi-k2-thinking", + "poe/novita/kimi-k2-thinking", + "qiniu-ai/moonshotai/kimi-k2-thinking", + "siliconflow-cn/Pro/moonshotai/Kimi-K2-Thinking", + "siliconflow-cn/moonshotai/Kimi-K2-Thinking", + "siliconflow/moonshotai/Kimi-K2-Thinking", + "synthetic/hf:moonshotai/Kimi-K2-Thinking", + "vercel/moonshotai/kimi-k2-thinking", + "zenmux/moonshotai/kimi-k2-thinking" + ], + "mergedProviderModelRecords": 33, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "interleaved": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": true, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "functionCalling": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.575, + "output": 2.3 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.574, + "output": 2.294 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.656, + "output": 2.731 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.48, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "moonshotai/Kimi-K2-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "io-net", + "model": "moonshotai/Kimi-K2-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.275, + "cacheWrite": 1.1, + "input": 0.55, + "output": 2.25 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "moonshotai/kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.47, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "kimi-for-coding", + "model": "kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "moonshotai/Kimi-K2-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.6 + } + }, + { + "source": "models.dev", + "provider": "moonshotai-cn", + "model": "kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "moonshotai", + "model": "kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "moonshotai/kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "moonshotai/kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.4, + "input": 0.4, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "moonshotai/kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "moonshotai/Kimi-K2-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Pro/moonshotai/Kimi-K2-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "moonshotai/Kimi-K2-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:moonshotai/Kimi-K2-Thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.19 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "moonshotai/kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "moonshotai/kimi-k2-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "baseten", + "model": "baseten/moonshotai/Kimi-K2-Thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "crusoe", + "model": "crusoe/moonshotai/Kimi-K2-Thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/kimi-k2-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "gmi", + "model": "gmi/moonshotai/Kimi-K2-Thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/kimi-k2-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/moonshotai/kimi-k2-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "moonshotai/kimi-k2-thinking", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2 Thinking", + "Kimi-K2-Thinking", + "Moonshot Kimi K2 Thinking", + "MoonshotAI: Kimi K2 Thinking", + "Pro/moonshotai/Kimi-K2-Thinking", + "kimi-k2-thinking", + "moonshotai/Kimi-K2-Thinking" + ], + "families": [ + "kimi-thinking" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2025-09-05", + "lastUpdated": "2025-09-05", + "deprecationDate": "2026-05-25", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 33 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "kimi-k2-thinking", + "modelKey": "kimi-k2-thinking", + "displayName": "kimi-k2-thinking", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-09-05", + "openWeights": false, + "releaseDate": "2025-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "kimi-k2-thinking", + "modelKey": "kimi-k2-thinking", + "displayName": "Moonshot Kimi K2 Thinking", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2025-11-06", + "openWeights": true, + "releaseDate": "2025-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "kimi-k2-thinking", + "modelKey": "kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2025-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "kimi-k2-thinking", + "modelKey": "kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-12-02", + "openWeights": true, + "releaseDate": "2025-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "kimi-k2-thinking", + "modelKey": "kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2025-12-08", + "openWeights": true, + "releaseDate": "2025-12-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "kimi-k2-thinking", + "modelKey": "kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2025-11", + "lastUpdated": "2025-11-06", + "openWeights": false, + "releaseDate": "2025-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "moonshotai/Kimi-K2-Thinking", + "modelKey": "moonshotai/Kimi-K2-Thinking", + "displayName": "Kimi-K2-Thinking", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-11-06", + "openWeights": true, + "releaseDate": "2025-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "io-net", + "providerName": "IO.NET", + "providerApi": "https://api.intelligence.io.solutions/api/v1", + "providerDoc": "https://io.net/docs/guides/intelligence/io-intelligence", + "model": "moonshotai/Kimi-K2-Thinking", + "modelKey": "moonshotai/Kimi-K2-Thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2024-11-01", + "openWeights": false, + "releaseDate": "2024-11-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "moonshotai/kimi-k2-thinking", + "modelKey": "moonshotai/kimi-k2-thinking", + "displayName": "MoonshotAI: Kimi K2 Thinking", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-11-06", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kimi-for-coding", + "providerName": "Kimi For Coding", + "providerApi": "https://api.kimi.com/coding/v1", + "providerDoc": "https://www.kimi.com/code/docs/en/third-party-tools/other-coding-agents.html", + "model": "kimi-k2-thinking", + "modelKey": "kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2025-12", + "openWeights": true, + "releaseDate": "2025-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "kimi-k2-thinking", + "modelKey": "kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-11-06", + "openWeights": true, + "releaseDate": "2025-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "moonshotai/Kimi-K2-Thinking", + "modelKey": "moonshotai/Kimi-K2-Thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-11-06", + "openWeights": true, + "releaseDate": "2025-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai-cn", + "providerName": "Moonshot AI (China)", + "providerApi": "https://api.moonshot.cn/v1", + "providerDoc": "https://platform.moonshot.cn/docs/api/chat", + "model": "kimi-k2-thinking", + "modelKey": "kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-11-06", + "openWeights": true, + "releaseDate": "2025-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai", + "providerName": "Moonshot AI", + "providerApi": "https://api.moonshot.ai/v1", + "providerDoc": "https://platform.moonshot.ai/docs/api/chat", + "model": "kimi-k2-thinking", + "modelKey": "kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-11-06", + "openWeights": true, + "releaseDate": "2025-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "moonshotai/kimi-k2-thinking", + "modelKey": "moonshotai/kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2025-11-06", + "openWeights": false, + "releaseDate": "2025-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "moonshotai/kimi-k2-thinking", + "modelKey": "moonshotai/kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2025-11-07", + "openWeights": true, + "releaseDate": "2025-11-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "kimi-k2-thinking", + "modelKey": "kimi-k2-thinking", + "displayName": "kimi-k2-thinking", + "family": "kimi-thinking", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "kimi-k2-thinking", + "modelKey": "kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-09-05", + "openWeights": true, + "releaseDate": "2025-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "moonshotai/kimi-k2-thinking", + "modelKey": "moonshotai/kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-11-06", + "openWeights": true, + "releaseDate": "2025-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "novita/kimi-k2-thinking", + "modelKey": "novita/kimi-k2-thinking", + "displayName": "kimi-k2-thinking", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2025-11-07", + "openWeights": false, + "releaseDate": "2025-11-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "moonshotai/kimi-k2-thinking", + "modelKey": "moonshotai/kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "metadata": { + "lastUpdated": "2025-11-07", + "openWeights": false, + "releaseDate": "2025-11-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "moonshotai/Kimi-K2-Thinking", + "modelKey": "moonshotai/Kimi-K2-Thinking", + "displayName": "moonshotai/Kimi-K2-Thinking", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-11-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Pro/moonshotai/Kimi-K2-Thinking", + "modelKey": "Pro/moonshotai/Kimi-K2-Thinking", + "displayName": "Pro/moonshotai/Kimi-K2-Thinking", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-11-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "moonshotai/Kimi-K2-Thinking", + "modelKey": "moonshotai/Kimi-K2-Thinking", + "displayName": "moonshotai/Kimi-K2-Thinking", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-11-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:moonshotai/Kimi-K2-Thinking", + "modelKey": "hf:moonshotai/Kimi-K2-Thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2025-11", + "lastUpdated": "2025-11-07", + "openWeights": true, + "releaseDate": "2025-11-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "moonshotai/kimi-k2-thinking", + "modelKey": "moonshotai/kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-11-06", + "openWeights": false, + "releaseDate": "2025-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "moonshotai/kimi-k2-thinking", + "modelKey": "moonshotai/kimi-k2-thinking", + "displayName": "Kimi K2 Thinking", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-11-06", + "openWeights": false, + "releaseDate": "2025-11-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "baseten", + "model": "baseten/moonshotai/Kimi-K2-Thinking", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "crusoe", + "model": "crusoe/moonshotai/Kimi-K2-Thinking", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/kimi-k2-thinking", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gmi", + "model": "gmi/moonshotai/Kimi-K2-Thinking", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/kimi-k2-thinking", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-25", + "source": "https://platform.moonshot.ai/docs/pricing/chat#generation-model-kimi-k2" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/moonshotai/kimi-k2-thinking", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "moonshotai/kimi-k2-thinking", + "displayName": "MoonshotAI: Kimi K2 Thinking", + "metadata": { + "canonicalSlug": "moonshotai/kimi-k2-thinking-20251106", + "createdAt": "2025-11-06T14:50:22.000Z", + "huggingFaceId": "moonshotai/Kimi-K2-Thinking", + "links": { + "details": "/api/v1/models/moonshotai/kimi-k2-thinking-20251106/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 262144, + "is_moderated": false + } + } + } + ] + }, + { + "id": "moonshotai/kimi-k2-thinking-251104", + "provider": "moonshotai", + "model": "kimi-k2-thinking-251104", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "volcengine" + ], + "aliases": [ + "volcengine/kimi-k2-thinking-251104" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 229376, + "inputTokens": 229376, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "volcengine", + "model": "kimi-k2-thinking-251104", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "volcengine", + "model": "kimi-k2-thinking-251104", + "mode": "chat" + } + ] + }, + { + "id": "moonshotai/kimi-k2-thinking-maas", + "provider": "moonshotai", + "model": "kimi-k2-thinking-maas", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "vertex_ai-moonshot_models" + ], + "aliases": [ + "google-vertex/moonshotai/kimi-k2-thinking-maas", + "vertex_ai-moonshot_models/vertex_ai/moonshotai/kimi-k2-thinking-maas" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex", + "model": "moonshotai/kimi-k2-thinking-maas", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-moonshot_models", + "model": "vertex_ai/moonshotai/kimi-k2-thinking-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2 Thinking" + ], + "families": [ + "kimi-thinking" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-08", + "releaseDate": "2025-11-13", + "lastUpdated": "2025-11-13", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "moonshotai/kimi-k2-thinking-maas", + "modelKey": "moonshotai/kimi-k2-thinking-maas", + "displayName": "Kimi K2 Thinking", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-11-13", + "openWeights": true, + "releaseDate": "2025-11-13" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-moonshot_models", + "model": "vertex_ai/moonshotai/kimi-k2-thinking-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#partner-models" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2-thinking-original", + "provider": "moonshotai", + "model": "kimi-k2-thinking-original", + "displayName": "Kimi K2 Thinking Original", + "family": "kimi-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/moonshotai/kimi-k2-thinking-original" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "moonshotai/kimi-k2-thinking-original", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2 Thinking Original" + ], + "families": [ + "kimi-thinking" + ], + "releaseDate": "2025-11-06", + "lastUpdated": "2025-11-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "moonshotai/kimi-k2-thinking-original", + "modelKey": "moonshotai/kimi-k2-thinking-original", + "displayName": "Kimi K2 Thinking Original", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2025-11-06", + "openWeights": false, + "releaseDate": "2025-11-06" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2-thinking-turbo", + "provider": "moonshotai", + "model": "kimi-k2-thinking-turbo", + "displayName": "Kimi K2 Thinking Turbo", + "family": "kimi-thinking", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "llmgateway", + "moonshot", + "moonshotai", + "moonshotai-cn", + "zenmux" + ], + "aliases": [ + "302ai/kimi-k2-thinking-turbo", + "llmgateway/kimi-k2-thinking-turbo", + "moonshot/kimi-k2-thinking-turbo", + "moonshotai-cn/kimi-k2-thinking-turbo", + "moonshotai/kimi-k2-thinking-turbo", + "zenmux/moonshotai/kimi-k2-thinking-turbo" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "kimi-k2-thinking-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.265, + "output": 9.119 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "kimi-k2-thinking-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.15, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "moonshotai-cn", + "model": "kimi-k2-thinking-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.15, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "moonshotai", + "model": "kimi-k2-thinking-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.15, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "moonshotai/kimi-k2-thinking-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.15, + "output": 8 + } + }, + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/kimi-k2-thinking-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.15, + "output": 8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2 Thinking Turbo", + "kimi-k2-thinking-turbo" + ], + "families": [ + "kimi-thinking" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2025-09-05", + "lastUpdated": "2025-09-05", + "deprecationDate": "2026-05-25", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "kimi-k2-thinking-turbo", + "modelKey": "kimi-k2-thinking-turbo", + "displayName": "kimi-k2-thinking-turbo", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-09-05", + "openWeights": false, + "releaseDate": "2025-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "kimi-k2-thinking-turbo", + "modelKey": "kimi-k2-thinking-turbo", + "displayName": "Kimi K2 Thinking Turbo", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-11-06", + "openWeights": true, + "releaseDate": "2025-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai-cn", + "providerName": "Moonshot AI (China)", + "providerApi": "https://api.moonshot.cn/v1", + "providerDoc": "https://platform.moonshot.cn/docs/api/chat", + "model": "kimi-k2-thinking-turbo", + "modelKey": "kimi-k2-thinking-turbo", + "displayName": "Kimi K2 Thinking Turbo", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-11-06", + "openWeights": true, + "releaseDate": "2025-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai", + "providerName": "Moonshot AI", + "providerApi": "https://api.moonshot.ai/v1", + "providerDoc": "https://platform.moonshot.ai/docs/api/chat", + "model": "kimi-k2-thinking-turbo", + "modelKey": "kimi-k2-thinking-turbo", + "displayName": "Kimi K2 Thinking Turbo", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-11-06", + "openWeights": true, + "releaseDate": "2025-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "moonshotai/kimi-k2-thinking-turbo", + "modelKey": "moonshotai/kimi-k2-thinking-turbo", + "displayName": "Kimi K2 Thinking Turbo", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-11-06", + "openWeights": false, + "releaseDate": "2025-11-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/kimi-k2-thinking-turbo", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-25", + "source": "https://platform.moonshot.ai/docs/pricing/chat#generation-model-kimi-k2" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2-thinking-turbo-original", + "provider": "moonshotai", + "model": "kimi-k2-thinking-turbo-original", + "displayName": "Kimi K2 Thinking Turbo Original", + "family": "kimi-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/moonshotai/kimi-k2-thinking-turbo-original" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "moonshotai/kimi-k2-thinking-turbo-original", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.15, + "output": 8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2 Thinking Turbo Original" + ], + "families": [ + "kimi-thinking" + ], + "releaseDate": "2025-11-06", + "lastUpdated": "2025-11-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "moonshotai/kimi-k2-thinking-turbo-original", + "modelKey": "moonshotai/kimi-k2-thinking-turbo-original", + "displayName": "Kimi K2 Thinking Turbo Original", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2025-11-06", + "openWeights": false, + "releaseDate": "2025-11-06" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2-turbo-preview", + "provider": "moonshotai", + "model": "kimi-k2-turbo-preview", + "displayName": "Kimi K2 Turbo", + "family": "kimi-k2", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "abacus", + "moonshot", + "moonshotai", + "moonshotai-cn" + ], + "aliases": [ + "abacus/kimi-k2-turbo-preview", + "moonshot/kimi-k2-turbo-preview", + "moonshotai-cn/kimi-k2-turbo-preview", + "moonshotai/kimi-k2-turbo-preview" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "kimi-k2-turbo-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "moonshotai-cn", + "model": "kimi-k2-turbo-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.6, + "input": 2.4, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "moonshotai", + "model": "kimi-k2-turbo-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.6, + "input": 2.4, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/kimi-k2-turbo-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.15, + "output": 8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2 Turbo", + "Kimi K2 Turbo Preview" + ], + "families": [ + "kimi-k2" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-07-08", + "lastUpdated": "2025-07-08", + "deprecationDate": "2026-05-25", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "kimi-k2-turbo-preview", + "modelKey": "kimi-k2-turbo-preview", + "displayName": "Kimi K2 Turbo Preview", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2025-07-08", + "openWeights": false, + "releaseDate": "2025-07-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai-cn", + "providerName": "Moonshot AI (China)", + "providerApi": "https://api.moonshot.cn/v1", + "providerDoc": "https://platform.moonshot.cn/docs/api/chat", + "model": "kimi-k2-turbo-preview", + "modelKey": "kimi-k2-turbo-preview", + "displayName": "Kimi K2 Turbo", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-09-05", + "openWeights": true, + "releaseDate": "2025-09-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai", + "providerName": "Moonshot AI", + "providerApi": "https://api.moonshot.ai/v1", + "providerDoc": "https://platform.moonshot.ai/docs/api/chat", + "model": "kimi-k2-turbo-preview", + "modelKey": "kimi-k2-turbo-preview", + "displayName": "Kimi K2 Turbo", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-09-05", + "openWeights": true, + "releaseDate": "2025-09-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/kimi-k2-turbo-preview", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-25", + "source": "https://platform.moonshot.ai/docs/pricing/chat#generation-model-kimi-k2" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2:1t", + "provider": "moonshotai", + "model": "kimi-k2:1t", + "displayName": "kimi-k2:1t", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/kimi-k2:1t" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "kimi-k2:1t" + ], + "families": [ + "kimi-k2" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-07-11", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "kimi-k2:1t", + "modelKey": "kimi-k2:1t", + "displayName": "kimi-k2:1t", + "family": "kimi-k2", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-07-11" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2.5", + "provider": "moonshotai", + "model": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "aihubmix", + "alibaba-cn", + "alibaba-coding-plan", + "alibaba-coding-plan-cn", + "alibaba-token-plan", + "alibaba-token-plan-cn", + "auriko", + "azure", + "azure-cognitive-services", + "azure_ai", + "baseten", + "cloudflare-ai-gateway", + "cortecs", + "crof", + "deepinfra", + "digitalocean", + "evroc", + "frogbot", + "hpc-ai", + "huggingface", + "jiekou", + "kilo", + "llmgateway", + "meganova", + "moonshot", + "moonshotai", + "moonshotai-cn", + "nano-gpt", + "nebius", + "neuralwatt", + "novita-ai", + "ollama-cloud", + "opencode", + "opencode-go", + "openrouter", + "orcarouter", + "poe", + "qiniu-ai", + "routing-run", + "siliconflow", + "siliconflow-cn", + "synthetic", + "tencent-coding-plan", + "together_ai", + "togetherai", + "vercel", + "wandb", + "zenmux" + ], + "aliases": [ + "abacus/kimi-k2.5", + "aihubmix/kimi-k2.5", + "alibaba-cn/kimi-k2.5", + "alibaba-cn/kimi/kimi-k2.5", + "alibaba-coding-plan-cn/kimi-k2.5", + "alibaba-coding-plan/kimi-k2.5", + "alibaba-token-plan-cn/kimi-k2.5", + "alibaba-token-plan/kimi-k2.5", + "auriko/kimi-k2.5", + "azure-cognitive-services/kimi-k2.5", + "azure/kimi-k2.5", + "azure_ai/kimi-k2.5", + "baseten/moonshotai/Kimi-K2.5", + "cloudflare-ai-gateway/workers-ai/@cf/moonshotai/kimi-k2.5", + "cortecs/kimi-k2.5", + "crof/kimi-k2.5", + "deepinfra/moonshotai/Kimi-K2.5", + "digitalocean/kimi-k2.5", + "evroc/moonshotai/Kimi-K2.5", + "frogbot/kimi-k2.5", + "hpc-ai/moonshotai/kimi-k2.5", + "huggingface/moonshotai/Kimi-K2.5", + "jiekou/moonshotai/kimi-k2.5", + "kilo/moonshotai/kimi-k2.5", + "llmgateway/kimi-k2.5", + "meganova/moonshotai/Kimi-K2.5", + "moonshot/kimi-k2.5", + "moonshotai-cn/kimi-k2.5", + "moonshotai/kimi-k2.5", + "nano-gpt/TEE/kimi-k2.5", + "nano-gpt/moonshotai/kimi-k2.5", + "nebius/moonshotai/Kimi-K2.5", + "neuralwatt/moonshotai/Kimi-K2.5", + "novita-ai/moonshotai/kimi-k2.5", + "ollama-cloud/kimi-k2.5", + "opencode-go/kimi-k2.5", + "opencode/kimi-k2.5", + "openrouter/moonshotai/kimi-k2.5", + "orcarouter/kimi/kimi-k2.5", + "poe/novita/kimi-k2.5", + "qiniu-ai/moonshotai/kimi-k2.5", + "routing-run/route/kimi-k2.5", + "siliconflow-cn/Pro/moonshotai/Kimi-K2.5", + "siliconflow/moonshotai/Kimi-K2.5", + "synthetic/hf:moonshotai/Kimi-K2.5", + "tencent-coding-plan/kimi-k2.5", + "together_ai/moonshotai/Kimi-K2.5", + "togetherai/moonshotai/Kimi-K2.5", + "vercel/moonshotai/kimi-k2.5", + "wandb/moonshotai/Kimi-K2.5", + "zenmux/moonshotai/kimi-k2.5" + ], + "mergedProviderModelRecords": 51, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "functionCalling": true, + "toolChoice": true, + "vision": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "interleaved": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "aihubmix", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.574, + "output": 2.411 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "kimi/kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan-cn", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "auriko", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 2.8 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "baseten", + "model": "moonshotai/Kimi-K2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12, + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/moonshotai/kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.76 + } + }, + { + "source": "models.dev", + "provider": "crof", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.07, + "input": 0.35, + "output": 1.7 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "moonshotai/Kimi-K2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.07, + "input": 0.45, + "output": 2.25 + } + }, + { + "source": "models.dev", + "provider": "digitalocean", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 2.7 + } + }, + { + "source": "models.dev", + "provider": "evroc", + "model": "moonshotai/Kimi-K2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.47, + "output": 5.9 + } + }, + { + "source": "models.dev", + "provider": "frogbot", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "hpc-ai", + "model": "moonshotai/kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.3, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "moonshotai/Kimi-K2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "moonshotai/kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "moonshotai/kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "moonshotai/Kimi-K2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 2.8 + } + }, + { + "source": "models.dev", + "provider": "moonshotai-cn", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "moonshotai", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "moonshotai/kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.9 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.9 + } + }, + { + "source": "models.dev", + "provider": "nebius", + "model": "moonshotai/Kimi-K2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.625, + "input": 0.5, + "output": 2.5, + "reasoningOutput": 2.5 + } + }, + { + "source": "models.dev", + "provider": "neuralwatt", + "model": "moonshotai/Kimi-K2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.52, + "output": 2.59 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "moonshotai/kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "opencode-go", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "moonshotai/kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.375, + "output": 2.025 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "kimi/kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "novita/kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.462, + "output": 2.42 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Pro/moonshotai/Kimi-K2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 2.25 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "moonshotai/Kimi-K2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 2.25 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:moonshotai/Kimi-K2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.19 + } + }, + { + "source": "models.dev", + "provider": "tencent-coding-plan", + "model": "kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "moonshotai/Kimi-K2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 2.8 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "moonshotai/kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "wandb", + "model": "moonshotai/Kimi-K2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 2.85 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "moonshotai/kimi-k2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.58, + "output": 3.02 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/kimi-k2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "baseten", + "model": "baseten/moonshotai/Kimi-K2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/kimi-k2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/moonshotai/kimi-k2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/moonshotai/Kimi-K2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 2.8 + } + }, + { + "source": "litellm", + "provider": "wandb", + "model": "wandb/moonshotai/Kimi-K2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "moonshotai/kimi-k2.5", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.375, + "output": 2.025 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.5", + "Kimi K2.5 TEE", + "Kimi-K2.5", + "Moonshot Kimi K2.5", + "MoonshotAI: Kimi K2.5", + "Moonshotai/Kimi-K2.5", + "Pro/moonshotai/Kimi-K2.5", + "kimi-k2.5", + "kimi/kimi-k2.5", + "moonshotai/Kimi-K2.5" + ], + "families": [ + "kimi-k2", + "kimi-thinking" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-01", + "lastUpdated": "2026-01", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 51 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Moonshot Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "kimi/kimi-k2.5", + "modelKey": "kimi/kimi-k2.5", + "displayName": "kimi/kimi-k2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan-cn", + "providerName": "Alibaba Coding Plan (China)", + "providerApi": "https://coding.dashscope.aliyuncs.com/v1", + "providerDoc": "https://help.aliyun.com/zh/model-studio/coding-plan", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan", + "providerName": "Alibaba Coding Plan", + "providerApi": "https://coding-intl.dashscope.aliyuncs.com/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/coding-plan", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "auriko", + "providerName": "Auriko", + "providerApi": "https://api.auriko.ai/v1", + "providerDoc": "https://docs.auriko.ai", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-06", + "openWeights": true, + "releaseDate": "2026-02-06", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "baseten", + "providerName": "Baseten", + "providerApi": "https://inference.baseten.co/v1", + "providerDoc": "https://docs.baseten.co/inference/model-apis/overview", + "model": "moonshotai/Kimi-K2.5", + "modelKey": "moonshotai/Kimi-K2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-01-30", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/moonshotai/kimi-k2.5", + "modelKey": "workers-ai/@cf/moonshotai/kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-thinking", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "moonshotai/Kimi-K2.5", + "modelKey": "moonshotai/Kimi-K2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-16", + "openWeights": true, + "releaseDate": "2026-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "evroc", + "providerName": "evroc", + "providerApi": "https://models.think.evroc.com/v1", + "providerDoc": "https://docs.evroc.com/products/think/overview.html", + "model": "moonshotai/Kimi-K2.5", + "modelKey": "moonshotai/Kimi-K2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi-K2.5", + "metadata": { + "lastUpdated": "1970-01-01", + "openWeights": false, + "releaseDate": "1970-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "hpc-ai", + "providerName": "HPC-AI", + "providerApi": "https://api.hpc-ai.com/inference/v1", + "providerDoc": "https://www.hpc-ai.com/doc/docs/quickstart/", + "model": "moonshotai/kimi-k2.5", + "modelKey": "moonshotai/kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-06-01", + "openWeights": true, + "releaseDate": "2026-01-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "moonshotai/Kimi-K2.5", + "modelKey": "moonshotai/Kimi-K2.5", + "displayName": "Kimi-K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01-01", + "openWeights": true, + "releaseDate": "2026-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "moonshotai/kimi-k2.5", + "modelKey": "moonshotai/kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 1024, + "max": 262143 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "moonshotai/kimi-k2.5", + "modelKey": "moonshotai/kimi-k2.5", + "displayName": "MoonshotAI: Kimi K2.5", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2026-01-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "moonshotai/Kimi-K2.5", + "modelKey": "moonshotai/Kimi-K2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2026-01", + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai-cn", + "providerName": "Moonshot AI (China)", + "providerApi": "https://api.moonshot.cn/v1", + "providerDoc": "https://platform.moonshot.cn/docs/api/chat", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai", + "providerName": "Moonshot AI", + "providerApi": "https://api.moonshot.ai/v1", + "providerDoc": "https://platform.moonshot.ai/docs/api/chat", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "moonshotai/kimi-k2.5", + "modelKey": "moonshotai/kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-01-26", + "openWeights": false, + "releaseDate": "2026-01-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/kimi-k2.5", + "modelKey": "TEE/kimi-k2.5", + "displayName": "Kimi K2.5 TEE", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-01-29", + "openWeights": false, + "releaseDate": "2026-01-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "moonshotai/Kimi-K2.5", + "modelKey": "moonshotai/Kimi-K2.5", + "displayName": "Kimi-K2.5", + "family": "kimi-k2", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2025-12-15", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neuralwatt", + "providerName": "Neuralwatt", + "providerApi": "https://api.neuralwatt.com/v1", + "providerDoc": "https://portal.neuralwatt.com/docs", + "model": "moonshotai/Kimi-K2.5", + "modelKey": "moonshotai/Kimi-K2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "moonshotai/kimi-k2.5", + "modelKey": "moonshotai/kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "kimi-k2.5", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "moonshotai/kimi-k2.5", + "modelKey": "moonshotai/kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "kimi/kimi-k2.5", + "modelKey": "kimi/kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "novita/kimi-k2.5", + "modelKey": "novita/kimi-k2.5", + "displayName": "Kimi-K2.5", + "metadata": { + "lastUpdated": "2026-01-27", + "openWeights": false, + "releaseDate": "2026-01-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "moonshotai/kimi-k2.5", + "modelKey": "moonshotai/kimi-k2.5", + "displayName": "Moonshotai/Kimi-K2.5", + "metadata": { + "lastUpdated": "2026-01-28", + "openWeights": false, + "releaseDate": "2026-01-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/kimi-k2.5", + "modelKey": "route/kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Pro/moonshotai/Kimi-K2.5", + "modelKey": "Pro/moonshotai/Kimi-K2.5", + "displayName": "Pro/moonshotai/Kimi-K2.5", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "moonshotai/Kimi-K2.5", + "modelKey": "moonshotai/Kimi-K2.5", + "displayName": "moonshotai/Kimi-K2.5", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:moonshotai/Kimi-K2.5", + "modelKey": "hf:moonshotai/Kimi-K2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "tencent-coding-plan", + "providerName": "Tencent Coding Plan (China)", + "providerApi": "https://api.lkeap.cloud.tencent.com/coding/v3", + "providerDoc": "https://cloud.tencent.com/document/product/1772/128947", + "model": "kimi-k2.5", + "modelKey": "kimi-k2.5", + "displayName": "Kimi-K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "moonshotai/Kimi-K2.5", + "modelKey": "moonshotai/Kimi-K2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2026-01", + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "moonshotai/kimi-k2.5", + "modelKey": "moonshotai/kimi-k2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01-26", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "moonshotai/Kimi-K2.5", + "modelKey": "moonshotai/Kimi-K2.5", + "displayName": "Kimi K2.5", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-03-12", + "openWeights": true, + "releaseDate": "2026-01-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "moonshotai/kimi-k2.5", + "modelKey": "moonshotai/kimi-k2.5", + "displayName": "Kimi K2.5", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-01-27", + "openWeights": false, + "releaseDate": "2026-01-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/kimi-k2.5", + "mode": "chat", + "metadata": { + "source": "https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/kimi-k2-5-now-in-microsoft-foundry/4492321" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "baseten", + "model": "baseten/moonshotai/Kimi-K2.5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/kimi-k2.5", + "mode": "chat", + "metadata": { + "source": "https://platform.moonshot.ai/docs/guide/kimi-k2-5-quickstart" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/moonshotai/kimi-k2.5", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/moonshotai/kimi-k2.5" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/moonshotai/Kimi-K2.5", + "mode": "chat", + "metadata": { + "source": "https://www.together.ai/models/kimi-k2-5" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "wandb", + "model": "wandb/moonshotai/Kimi-K2.5", + "mode": "chat", + "metadata": { + "source": "https://wandb.ai/inference/coreweave/cw_moonshotai_Kimi-K2.5" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "moonshotai/kimi-k2.5", + "displayName": "MoonshotAI: Kimi K2.5", + "metadata": { + "canonicalSlug": "moonshotai/kimi-k2.5-0127", + "createdAt": "2026-01-27T04:11:16.000Z", + "huggingFaceId": "moonshotai/Kimi-K2.5", + "links": { + "details": "/api/v1/models/moonshotai/kimi-k2.5-0127/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 256000, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "moonshotai/kimi-k2.5-fast", + "provider": "moonshotai", + "model": "kimi-k2.5-fast", + "displayName": "Kimi-K2.5-fast", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "nebius", + "neuralwatt" + ], + "aliases": [ + "nebius/moonshotai/Kimi-K2.5-fast", + "neuralwatt/kimi-k2.5-fast" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262128, + "inputTokens": 256000, + "outputTokens": 262128, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nebius", + "model": "moonshotai/Kimi-K2.5-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.625, + "input": 0.5, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "neuralwatt", + "model": "kimi-k2.5-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.52, + "output": 2.59 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.5 Fast", + "Kimi-K2.5-fast" + ], + "families": [ + "kimi-k2" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2025-12-15", + "lastUpdated": "2026-02-04", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "moonshotai/Kimi-K2.5-fast", + "modelKey": "moonshotai/Kimi-K2.5-fast", + "displayName": "Kimi-K2.5-fast", + "family": "kimi-k2", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2025-12-15", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neuralwatt", + "providerName": "Neuralwatt", + "providerApi": "https://api.neuralwatt.com/v1", + "providerDoc": "https://portal.neuralwatt.com/docs", + "model": "kimi-k2.5-fast", + "modelKey": "kimi-k2.5-fast", + "displayName": "Kimi K2.5 Fast", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2.5-free", + "provider": "moonshotai", + "model": "kimi-k2.5-free", + "displayName": "Kimi K2.5 Free", + "family": "kimi-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/kimi-k2.5-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "kimi-k2.5-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.5 Free" + ], + "families": [ + "kimi-free" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2026-01-27", + "lastUpdated": "2026-01-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "kimi-k2.5-free", + "modelKey": "kimi-k2.5-free", + "displayName": "Kimi K2.5 Free", + "family": "kimi-free", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2026-01-27", + "openWeights": true, + "releaseDate": "2026-01-27" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2.5-fw", + "provider": "moonshotai", + "model": "kimi-k2.5-fw", + "displayName": "Kimi-K2.5-FW", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/fireworks-ai/kimi-k2.5-fw" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 245760, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "fireworks-ai/kimi-k2.5-fw", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi-K2.5-FW" + ], + "releaseDate": "2026-01-27", + "lastUpdated": "2026-01-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "fireworks-ai/kimi-k2.5-fw", + "modelKey": "fireworks-ai/kimi-k2.5-fw", + "displayName": "Kimi-K2.5-FW", + "metadata": { + "lastUpdated": "2026-01-27", + "openWeights": false, + "releaseDate": "2026-01-27" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2.5-lightning", + "provider": "moonshotai", + "model": "kimi-k2.5-lightning", + "displayName": "Kimi K2.5 (Lightning)", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "crof" + ], + "aliases": [ + "crof/kimi-k2.5-lightning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "crof", + "model": "kimi-k2.5-lightning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.5 (Lightning)" + ], + "families": [ + "kimi-k2" + ], + "releaseDate": "2026-02-06", + "lastUpdated": "2026-02-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "kimi-k2.5-lightning", + "modelKey": "kimi-k2.5-lightning", + "displayName": "Kimi K2.5 (Lightning)", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-02-06", + "openWeights": true, + "releaseDate": "2026-02-06", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "moonshotai/kimi-k2.5-nvfp4", + "provider": "moonshotai", + "model": "kimi-k2.5-nvfp4", + "displayName": "Kimi K2.5 (NVFP4)", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "synthetic" + ], + "aliases": [ + "synthetic/hf:nvidia/Kimi-K2.5-NVFP4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:nvidia/Kimi-K2.5-NVFP4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.19 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.5 (NVFP4)" + ], + "families": [ + "kimi-k2" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-01", + "lastUpdated": "2026-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:nvidia/Kimi-K2.5-NVFP4", + "modelKey": "hf:nvidia/Kimi-K2.5-NVFP4", + "displayName": "Kimi K2.5 (NVFP4)", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2.5-tee", + "provider": "moonshotai", + "model": "kimi-k2.5-tee", + "displayName": "Kimi K2.5 TEE", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/moonshotai/Kimi-K2.5-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65535, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "moonshotai/Kimi-K2.5-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.22, + "input": 0.44, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.5 TEE" + ], + "families": [ + "kimi-k2" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2026-01", + "lastUpdated": "2026-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "moonshotai/Kimi-K2.5-TEE", + "modelKey": "moonshotai/Kimi-K2.5-TEE", + "displayName": "Kimi K2.5 TEE", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "moonshotai/kimi-k2.5-thinking", + "provider": "moonshotai", + "model": "kimi-k2.5-thinking", + "displayName": "Kimi K2.5 Thinking TEE", + "family": "kimi-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TEE/kimi-k2.5-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 65535, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/kimi-k2.5-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.5 Thinking TEE" + ], + "families": [ + "kimi-thinking" + ], + "releaseDate": "2026-01-29", + "lastUpdated": "2026-01-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/kimi-k2.5-thinking", + "modelKey": "TEE/kimi-k2.5-thinking", + "displayName": "Kimi K2.5 Thinking TEE", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2026-01-29", + "openWeights": false, + "releaseDate": "2026-01-29" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2.5:thinking", + "provider": "moonshotai", + "model": "kimi-k2.5:thinking", + "displayName": "Kimi K2.5 Thinking", + "family": "kimi-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/moonshotai/kimi-k2.5:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "moonshotai/kimi-k2.5:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.5 Thinking" + ], + "families": [ + "kimi-thinking" + ], + "releaseDate": "2026-01-26", + "lastUpdated": "2026-01-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "moonshotai/kimi-k2.5:thinking", + "modelKey": "moonshotai/kimi-k2.5:thinking", + "displayName": "Kimi K2.5 Thinking", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2026-01-26", + "openWeights": false, + "releaseDate": "2026-01-26" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2.6", + "provider": "moonshotai", + "model": "kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "aihubmix", + "alibaba-cn", + "alibaba-token-plan", + "alibaba-token-plan-cn", + "ambient", + "auriko", + "azure", + "azure-cognitive-services", + "azure_ai", + "baseten", + "berget", + "cloudflare-ai-gateway", + "cloudflare-workers-ai", + "cortecs", + "crof", + "deepinfra", + "digitalocean", + "fastrouter", + "gmicloud", + "huggingface", + "inceptron", + "kilo", + "lilac", + "llmgateway", + "moonshot", + "moonshotai", + "moonshotai-cn", + "nano-gpt", + "neuralwatt", + "novita-ai", + "nvidia", + "ollama-cloud", + "opencode", + "opencode-go", + "openrouter", + "orcarouter", + "poe", + "routing-run", + "siliconflow", + "siliconflow-cn", + "synthetic", + "togetherai", + "vercel", + "vultr", + "wafer.ai", + "zenmux" + ], + "aliases": [ + "aihubmix/kimi-k2.6", + "alibaba-cn/kimi-k2.6", + "alibaba-token-plan-cn/kimi-k2.6", + "alibaba-token-plan/kimi-k2.6", + "ambient/moonshotai/kimi-k2.6", + "auriko/kimi-k2.6", + "azure-cognitive-services/kimi-k2.6", + "azure/kimi-k2.6", + "azure_ai/kimi-k2.6", + "baseten/moonshotai/Kimi-K2.6", + "berget/moonshotai/Kimi-K2.6", + "cloudflare-ai-gateway/workers-ai/@cf/moonshotai/kimi-k2.6", + "cloudflare-workers-ai/@cf/moonshotai/kimi-k2.6", + "cortecs/kimi-k2.6", + "crof/kimi-k2.6", + "deepinfra/moonshotai/Kimi-K2.6", + "digitalocean/kimi-k2.6", + "fastrouter/moonshotai/kimi-k2.6", + "gmicloud/moonshotai/Kimi-K2.6", + "huggingface/moonshotai/Kimi-K2.6", + "inceptron/moonshotai/Kimi-K2.6", + "kilo/moonshotai/kimi-k2.6", + "lilac/moonshotai/kimi-k2.6", + "llmgateway/kimi-k2.6", + "moonshot/kimi-k2.6", + "moonshotai-cn/kimi-k2.6", + "moonshotai/kimi-k2.6", + "nano-gpt/TEE/kimi-k2.6", + "nano-gpt/moonshotai/kimi-k2.6", + "neuralwatt/moonshotai/Kimi-K2.6", + "novita-ai/moonshotai/kimi-k2.6", + "nvidia/moonshotai/kimi-k2.6", + "ollama-cloud/kimi-k2.6", + "opencode-go/kimi-k2.6", + "opencode/kimi-k2.6", + "openrouter/moonshotai/kimi-k2.6", + "orcarouter/kimi/kimi-k2.6", + "poe/novita/kimi-k2.6", + "routing-run/route/kimi-k2.6", + "siliconflow-cn/Pro/moonshotai/Kimi-K2.6", + "siliconflow/moonshotai/Kimi-K2.6", + "synthetic/hf:moonshotai/Kimi-K2.6", + "togetherai/moonshotai/Kimi-K2.6", + "vercel/moonshotai/kimi-k2.6", + "vultr/moonshotai/Kimi-K2.6", + "wafer.ai/Kimi-K2.6", + "zenmux/moonshotai/kimi-k2.6" + ], + "mergedProviderModelRecords": 47, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "interleaved": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.929, + "output": 3.858 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "ambient", + "model": "moonshotai/kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "auriko", + "model": "kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "baseten", + "model": "moonshotai/Kimi-K2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "berget", + "model": "moonshotai/Kimi-K2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.83, + "output": 3.85 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/moonshotai/kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/moonshotai/kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.81, + "output": 3.54 + } + }, + { + "source": "models.dev", + "provider": "crof", + "model": "kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.5, + "output": 1.99 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "moonshotai/Kimi-K2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.75, + "output": 3.5 + } + }, + { + "source": "models.dev", + "provider": "digitalocean", + "model": "kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "moonshotai/kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.75, + "output": 3.5 + } + }, + { + "source": "models.dev", + "provider": "gmicloud", + "model": "moonshotai/Kimi-K2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.144, + "input": 0.855, + "output": 3.6 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "moonshotai/Kimi-K2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "inceptron", + "model": "moonshotai/Kimi-K2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0, + "input": 0.78, + "output": 3.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "moonshotai/kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.375, + "input": 0.75, + "output": 3.5 + } + }, + { + "source": "models.dev", + "provider": "lilac", + "model": "moonshotai/kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.7, + "output": 3.5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "moonshotai-cn", + "model": "kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "moonshotai", + "model": "kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "moonshotai/kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.53, + "output": 2.73 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.375, + "input": 1.5, + "output": 5.25 + } + }, + { + "source": "models.dev", + "provider": "neuralwatt", + "model": "moonshotai/Kimi-K2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.69, + "output": 3.22 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "moonshotai/kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "moonshotai/kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "opencode-go", + "model": "kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "moonshotai/kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.67, + "output": 3.5 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "kimi/kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "novita/kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.96, + "output": 4.04 + } + }, + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.462, + "output": 2.42 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Pro/moonshotai/Kimi-K2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "moonshotai/Kimi-K2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.77, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:moonshotai/Kimi-K2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.95, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "moonshotai/Kimi-K2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.2, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "moonshotai/kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "vultr", + "model": "moonshotai/Kimi-K2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "wafer.ai", + "model": "Kimi-K2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.07, + "cacheWrite": 0, + "input": 0.68, + "output": 3.15 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "moonshotai/kimi-k2.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/kimi-k2.6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.95, + "output": 4 + } + }, + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/kimi-k2.6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "moonshotai/kimi-k2.6", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.67, + "output": 3.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.6", + "Kimi K2.6 TEE", + "Kimi-K2.6", + "Moonshot Kimi K2.6", + "MoonshotAI: Kimi K2.6", + "Pro/moonshotai/Kimi-K2.6", + "kimi-k2.6", + "moonshotai/Kimi-K2.6" + ], + "families": [ + "kimi-k2", + "kimi-thinking" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-04-21", + "lastUpdated": "2026-04-21", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "parallel_tool_calls", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 47 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "kimi-k2.6", + "modelKey": "kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "kimi-k2.6", + "modelKey": "kimi-k2.6", + "displayName": "Moonshot Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "kimi-k2.6", + "modelKey": "kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "kimi-k2.6", + "modelKey": "kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ambient", + "providerName": "Ambient", + "providerApi": "https://api.ambient.xyz/v1", + "providerDoc": "https://ambient.xyz", + "model": "moonshotai/kimi-k2.6", + "modelKey": "moonshotai/kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "auriko", + "providerName": "Auriko", + "providerApi": "https://api.auriko.ai/v1", + "providerDoc": "https://docs.auriko.ai", + "model": "kimi-k2.6", + "modelKey": "kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "kimi-k2.6", + "modelKey": "kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "kimi-k2.6", + "modelKey": "kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "baseten", + "providerName": "Baseten", + "providerApi": "https://inference.baseten.co/v1", + "providerDoc": "https://docs.baseten.co/inference/model-apis/overview", + "model": "moonshotai/Kimi-K2.6", + "modelKey": "moonshotai/Kimi-K2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "berget", + "providerName": "Berget.AI", + "providerApi": "https://api.berget.ai/v1", + "providerDoc": "https://api.berget.ai", + "model": "moonshotai/Kimi-K2.6", + "modelKey": "moonshotai/Kimi-K2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-07", + "openWeights": true, + "releaseDate": "2026-05-07", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/moonshotai/kimi-k2.6", + "modelKey": "workers-ai/@cf/moonshotai/kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-20", + "openWeights": true, + "releaseDate": "2026-04-20", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/moonshotai/kimi-k2.6", + "modelKey": "@cf/moonshotai/kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "kimi-k2.6", + "modelKey": "kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": true, + "releaseDate": "2026-04-17", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "kimi-k2.6", + "modelKey": "kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "moonshotai/Kimi-K2.6", + "modelKey": "moonshotai/Kimi-K2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "kimi-k2.6", + "modelKey": "kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "moonshotai/kimi-k2.6", + "modelKey": "moonshotai/kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gmicloud", + "providerName": "GMI Cloud", + "providerApi": "https://api.gmi-serving.com/v1", + "providerDoc": "https://docs.gmicloud.ai/inference-engine/api-reference/llm-api-reference", + "model": "moonshotai/Kimi-K2.6", + "modelKey": "moonshotai/Kimi-K2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "moonshotai/Kimi-K2.6", + "modelKey": "moonshotai/Kimi-K2.6", + "displayName": "Kimi-K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-20", + "openWeights": true, + "releaseDate": "2026-04-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "inceptron", + "providerName": "Inceptron", + "providerApi": "https://api.inceptron.io/v1", + "providerDoc": "https://docs.inceptron.io", + "model": "moonshotai/Kimi-K2.6", + "modelKey": "moonshotai/Kimi-K2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "moonshotai/kimi-k2.6", + "modelKey": "moonshotai/kimi-k2.6", + "displayName": "MoonshotAI: Kimi K2.6", + "metadata": { + "lastUpdated": "2026-05-12", + "openWeights": true, + "releaseDate": "2026-04-20", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "lilac", + "providerName": "Lilac", + "providerApi": "https://api.getlilac.com/v1", + "providerDoc": "https://docs.getlilac.com/inference/models", + "model": "moonshotai/kimi-k2.6", + "modelKey": "moonshotai/kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "kimi-k2.6", + "modelKey": "kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai-cn", + "providerName": "Moonshot AI (China)", + "providerApi": "https://api.moonshot.cn/v1", + "providerDoc": "https://platform.moonshot.cn/docs/api/chat", + "model": "kimi-k2.6", + "modelKey": "kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai", + "providerName": "Moonshot AI", + "providerApi": "https://api.moonshot.ai/v1", + "providerDoc": "https://platform.moonshot.ai/docs/api/chat", + "model": "kimi-k2.6", + "modelKey": "kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "moonshotai/kimi-k2.6", + "modelKey": "moonshotai/kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/kimi-k2.6", + "modelKey": "TEE/kimi-k2.6", + "displayName": "Kimi K2.6 TEE", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": false, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neuralwatt", + "providerName": "Neuralwatt", + "providerApi": "https://api.neuralwatt.com/v1", + "providerDoc": "https://portal.neuralwatt.com/docs", + "model": "moonshotai/Kimi-K2.6", + "modelKey": "moonshotai/Kimi-K2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "moonshotai/kimi-k2.6", + "modelKey": "moonshotai/kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "moonshotai/kimi-k2.6", + "modelKey": "moonshotai/kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "kimi-k2.6", + "modelKey": "kimi-k2.6", + "displayName": "kimi-k2.6", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-04-20", + "openWeights": true, + "releaseDate": "2026-04-20", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "kimi-k2.6", + "modelKey": "kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "kimi-k2.6", + "modelKey": "kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "moonshotai/kimi-k2.6", + "modelKey": "moonshotai/kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "kimi/kimi-k2.6", + "modelKey": "kimi/kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "novita/kimi-k2.6", + "modelKey": "novita/kimi-k2.6", + "displayName": "Kimi-K2.6", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-05-02", + "openWeights": true, + "releaseDate": "2026-04-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/kimi-k2.6", + "modelKey": "route/kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Pro/moonshotai/Kimi-K2.6", + "modelKey": "Pro/moonshotai/Kimi-K2.6", + "displayName": "Pro/moonshotai/Kimi-K2.6", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "moonshotai/Kimi-K2.6", + "modelKey": "moonshotai/Kimi-K2.6", + "displayName": "moonshotai/Kimi-K2.6", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-06-15", + "openWeights": true, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:moonshotai/Kimi-K2.6", + "modelKey": "hf:moonshotai/Kimi-K2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "moonshotai/Kimi-K2.6", + "modelKey": "moonshotai/Kimi-K2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "moonshotai/kimi-k2.6", + "modelKey": "moonshotai/kimi-k2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-20", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vultr", + "providerName": "Vultr", + "providerApi": "https://api.vultrinference.com/v1", + "providerDoc": "https://api.vultrinference.com/", + "model": "moonshotai/Kimi-K2.6", + "modelKey": "moonshotai/Kimi-K2.6", + "displayName": "Kimi K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wafer.ai", + "providerName": "Wafer", + "providerApi": "https://pass.wafer.ai/v1", + "providerDoc": "https://docs.wafer.ai/wafer-pass", + "model": "Kimi-K2.6", + "modelKey": "Kimi-K2.6", + "displayName": "Kimi-K2.6", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-01", + "openWeights": true, + "releaseDate": "2026-05-13", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "moonshotai/kimi-k2.6", + "modelKey": "moonshotai/kimi-k2.6", + "displayName": "Kimi K2.6", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-04-20", + "openWeights": true, + "releaseDate": "2026-04-20", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/kimi-k2.6", + "mode": "chat", + "metadata": { + "source": "https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/introducing-kimi-k2-6-in-microsoft-foundry/4513125" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/kimi-k2.6", + "mode": "chat", + "metadata": { + "source": "https://platform.kimi.ai/docs/pricing/chat-k26" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "moonshotai/kimi-k2.6", + "displayName": "MoonshotAI: Kimi K2.6", + "metadata": { + "canonicalSlug": "moonshotai/kimi-k2.6-20260420", + "createdAt": "2026-04-20T15:36:42.000Z", + "huggingFaceId": "moonshotai/Kimi-K2.6", + "links": { + "details": "/api/v1/models/moonshotai/kimi-k2.6-20260420/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "parallel_tool_calls", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 262144, + "is_moderated": false + } + } + } + ] + }, + { + "id": "moonshotai/kimi-k2.6-6bit", + "provider": "moonshotai", + "model": "kimi-k2.6-6bit", + "displayName": "Kimi K2.6 6bit", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "routing-run" + ], + "aliases": [ + "routing-run/route/kimi-k2.6-6bit" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/kimi-k2.6-6bit", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.462, + "output": 2.42 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.6 6bit" + ], + "families": [ + "kimi-k2" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-04-21", + "lastUpdated": "2026-04-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/kimi-k2.6-6bit", + "modelKey": "route/kimi-k2.6-6bit", + "displayName": "Kimi K2.6 6bit", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2.6-fast", + "provider": "moonshotai", + "model": "kimi-k2.6-fast", + "displayName": "Kimi K2.6 Fast", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "neuralwatt" + ], + "aliases": [ + "neuralwatt/kimi-k2.6-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262128, + "outputTokens": 262128, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "neuralwatt", + "model": "kimi-k2.6-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.69, + "output": 3.22 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.6 Fast" + ], + "families": [ + "kimi-k2" + ], + "releaseDate": "2026-04-21", + "lastUpdated": "2026-04-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neuralwatt", + "providerName": "Neuralwatt", + "providerApi": "https://api.neuralwatt.com/v1", + "providerDoc": "https://portal.neuralwatt.com/docs", + "model": "kimi-k2.6-fast", + "modelKey": "kimi-k2.6-fast", + "displayName": "Kimi K2.6 Fast", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2.6-tee", + "provider": "moonshotai", + "model": "kimi-k2.6-tee", + "displayName": "Kimi K2.6 TEE", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/moonshotai/Kimi-K2.6-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65535, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "moonshotai/Kimi-K2.6-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.475, + "input": 0.95, + "output": 4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.6 TEE" + ], + "families": [ + "kimi-k2" + ], + "knowledgeCutoff": "2025-12", + "releaseDate": "2026-04-21", + "lastUpdated": "2026-04-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "moonshotai/Kimi-K2.6-TEE", + "modelKey": "moonshotai/Kimi-K2.6-TEE", + "displayName": "Kimi K2.6 TEE", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "moonshotai/kimi-k2.6:thinking", + "provider": "moonshotai", + "model": "kimi-k2.6:thinking", + "displayName": "Kimi K2.6 Thinking", + "family": "kimi-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/moonshotai/kimi-k2.6:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "moonshotai/kimi-k2.6:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.53, + "output": 2.73 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.6 Thinking" + ], + "families": [ + "kimi-thinking" + ], + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "moonshotai/kimi-k2.6:thinking", + "modelKey": "moonshotai/kimi-k2.6:thinking", + "displayName": "Kimi K2.6 Thinking", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-16" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2.7-code", + "provider": "moonshotai", + "model": "kimi-k2.7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba-token-plan", + "alibaba-token-plan-cn", + "ambient", + "baseten", + "cloudflare-workers-ai", + "cortecs", + "crof", + "llmgateway", + "moonshotai", + "moonshotai-cn", + "neuralwatt", + "ollama-cloud", + "opencode-go", + "openrouter", + "togetherai", + "vercel", + "zenmux" + ], + "aliases": [ + "alibaba-token-plan-cn/kimi-k2.7-code", + "alibaba-token-plan/kimi-k2.7-code", + "ambient/moonshotai/kimi-k2.7-code", + "baseten/moonshotai/Kimi-K2.7-Code", + "cloudflare-workers-ai/@cf/moonshotai/kimi-k2.7-code", + "cortecs/kimi-k2.7-code", + "crof/kimi-k2.7-code", + "llmgateway/kimi-k2.7-code", + "moonshotai-cn/kimi-k2.7-code", + "moonshotai/kimi-k2.7-code", + "neuralwatt/moonshotai/Kimi-K2.7-Code", + "ollama-cloud/kimi-k2.7-code", + "opencode-go/kimi-k2.7-code", + "openrouter/moonshotai/kimi-k2.7-code", + "togetherai/moonshotai/Kimi-K2.7-Code", + "vercel/moonshotai/kimi-k2.7-code", + "zenmux/moonshotai/kimi-k2.7-code" + ], + "mergedProviderModelRecords": 17, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "kimi-k2.7-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "kimi-k2.7-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "ambient", + "model": "moonshotai/kimi-k2.7-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "cacheWrite": 0, + "input": 0.75, + "output": 3.5 + } + }, + { + "source": "models.dev", + "provider": "baseten", + "model": "moonshotai/Kimi-K2.7-Code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/moonshotai/kimi-k2.7-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.19, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "kimi-k2.7-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.32, + "input": 1.28, + "output": 4.63 + } + }, + { + "source": "models.dev", + "provider": "crof", + "model": "kimi-k2.7-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.55, + "output": 2.25 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "kimi-k2.7-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.19, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "moonshotai-cn", + "model": "kimi-k2.7-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.19, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "moonshotai", + "model": "kimi-k2.7-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.19, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "neuralwatt", + "model": "moonshotai/Kimi-K2.7-Code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "opencode-go", + "model": "kimi-k2.7-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.19, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "moonshotai/kimi-k2.7-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.144, + "input": 0.68, + "output": 3.41 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "moonshotai/Kimi-K2.7-Code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.19, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "moonshotai/kimi-k2.7-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.19, + "input": 0.95, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "moonshotai/kimi-k2.7-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "moonshotai/kimi-k2.7-code", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1296, + "input": 0.612, + "output": 3.069 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.7 Code", + "MoonshotAI: Kimi K2.7 Code", + "kimi-k2.7-code" + ], + "families": [ + "kimi-k2" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-06-12", + "lastUpdated": "2026-06-12", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 17 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "kimi-k2.7-code", + "modelKey": "kimi-k2.7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "kimi-k2.7-code", + "modelKey": "kimi-k2.7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ambient", + "providerName": "Ambient", + "providerApi": "https://api.ambient.xyz/v1", + "providerDoc": "https://ambient.xyz", + "model": "moonshotai/kimi-k2.7-code", + "modelKey": "moonshotai/kimi-k2.7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "baseten", + "providerName": "Baseten", + "providerApi": "https://inference.baseten.co/v1", + "providerDoc": "https://docs.baseten.co/inference/model-apis/overview", + "model": "moonshotai/Kimi-K2.7-Code", + "modelKey": "moonshotai/Kimi-K2.7-Code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/moonshotai/kimi-k2.7-code", + "modelKey": "@cf/moonshotai/kimi-k2.7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "kimi-k2.7-code", + "modelKey": "kimi-k2.7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "kimi-k2.7-code", + "modelKey": "kimi-k2.7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "kimi-k2.7-code", + "modelKey": "kimi-k2.7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai-cn", + "providerName": "Moonshot AI (China)", + "providerApi": "https://api.moonshot.cn/v1", + "providerDoc": "https://platform.moonshot.cn/docs/api/chat", + "model": "kimi-k2.7-code", + "modelKey": "kimi-k2.7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai", + "providerName": "Moonshot AI", + "providerApi": "https://api.moonshot.ai/v1", + "providerDoc": "https://platform.moonshot.ai/docs/api/chat", + "model": "kimi-k2.7-code", + "modelKey": "kimi-k2.7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neuralwatt", + "providerName": "Neuralwatt", + "providerApi": "https://api.neuralwatt.com/v1", + "providerDoc": "https://portal.neuralwatt.com/docs", + "model": "moonshotai/Kimi-K2.7-Code", + "modelKey": "moonshotai/Kimi-K2.7-Code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "kimi-k2.7-code", + "modelKey": "kimi-k2.7-code", + "displayName": "kimi-k2.7-code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "kimi-k2.7-code", + "modelKey": "kimi-k2.7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "moonshotai/kimi-k2.7-code", + "modelKey": "moonshotai/kimi-k2.7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "moonshotai/Kimi-K2.7-Code", + "modelKey": "moonshotai/Kimi-K2.7-Code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-06-14", + "openWeights": true, + "releaseDate": "2026-06-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "moonshotai/kimi-k2.7-code", + "modelKey": "moonshotai/kimi-k2.7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": false, + "releaseDate": "2026-06-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "moonshotai/kimi-k2.7-code", + "modelKey": "moonshotai/kimi-k2.7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "moonshotai/kimi-k2.7-code", + "displayName": "MoonshotAI: Kimi K2.7 Code", + "metadata": { + "canonicalSlug": "moonshotai/kimi-k2.7-code-20260612", + "createdAt": "2026-06-12T12:12:41.000Z", + "huggingFaceId": "moonshotai/Kimi-K2.7-Code", + "links": { + "details": "/api/v1/models/moonshotai/kimi-k2.7-code-20260612/endpoints" + }, + "reasoning": { + "mandatory": true, + "default_enabled": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 262144, + "is_moderated": false + } + } + } + ] + }, + { + "id": "moonshotai/kimi-k2.7-code-free", + "provider": "moonshotai", + "model": "kimi-k2.7-code-free", + "displayName": "Kimi K2.7 Code (Free)", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/moonshotai/kimi-k2.7-code-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "moonshotai/kimi-k2.7-code-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.7 Code (Free)" + ], + "families": [ + "kimi-k2" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-06-12", + "lastUpdated": "2026-06-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "moonshotai/kimi-k2.7-code-free", + "modelKey": "moonshotai/kimi-k2.7-code-free", + "displayName": "Kimi K2.7 Code (Free)", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2.7-code-highspeed", + "provider": "moonshotai", + "model": "kimi-k2.7-code-highspeed", + "displayName": "Kimi K2.7 Code HighSpeed", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "moonshotai", + "moonshotai-cn", + "vercel" + ], + "aliases": [ + "moonshotai-cn/kimi-k2.7-code-highspeed", + "moonshotai/kimi-k2.7-code-highspeed", + "vercel/moonshotai/kimi-k2.7-code-highspeed" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "moonshotai-cn", + "model": "kimi-k2.7-code-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.38, + "input": 1.9, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "moonshotai", + "model": "kimi-k2.7-code-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.38, + "input": 1.9, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "moonshotai/kimi-k2.7-code-highspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.38, + "input": 1.9, + "output": 8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.7 Code High Speed", + "Kimi K2.7 Code HighSpeed" + ], + "families": [ + "kimi-k2" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-06-12", + "lastUpdated": "2026-06-12", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai-cn", + "providerName": "Moonshot AI (China)", + "providerApi": "https://api.moonshot.cn/v1", + "providerDoc": "https://platform.moonshot.cn/docs/api/chat", + "model": "kimi-k2.7-code-highspeed", + "modelKey": "kimi-k2.7-code-highspeed", + "displayName": "Kimi K2.7 Code HighSpeed", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moonshotai", + "providerName": "Moonshot AI", + "providerApi": "https://api.moonshot.ai/v1", + "providerDoc": "https://platform.moonshot.ai/docs/api/chat", + "model": "kimi-k2.7-code-highspeed", + "modelKey": "kimi-k2.7-code-highspeed", + "displayName": "Kimi K2.7 Code HighSpeed", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "moonshotai/kimi-k2.7-code-highspeed", + "modelKey": "moonshotai/kimi-k2.7-code-highspeed", + "displayName": "Kimi K2.7 Code High Speed", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-06-15", + "openWeights": false, + "releaseDate": "2026-06-15" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2p5", + "provider": "moonshotai", + "model": "kimi-k2p5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/kimi-k2p5", + "fireworks_ai/kimi-k2p5" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/kimi-k2p5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/kimi-k2p5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/kimi-k2p5", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/kimi-k2p5", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "moonshotai/kimi-k2p6", + "provider": "moonshotai", + "model": "kimi-k2p6", + "displayName": "Kimi K2.6", + "family": "kimi-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "fireworks-ai" + ], + "aliases": [ + "fireworks-ai/accounts/fireworks/models/kimi-k2p6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262000, + "outputTokens": 262000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fireworks-ai", + "model": "accounts/fireworks/models/kimi-k2p6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 0.95, + "output": 4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.6" + ], + "families": [ + "kimi-thinking" + ], + "releaseDate": "2026-04-17", + "lastUpdated": "2026-04-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fireworks-ai", + "providerName": "Fireworks AI", + "providerApi": "https://api.fireworks.ai/inference/v1/", + "providerDoc": "https://fireworks.ai/docs/", + "model": "accounts/fireworks/models/kimi-k2p6", + "modelKey": "accounts/fireworks/models/kimi-k2p6", + "displayName": "Kimi K2.6", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": true, + "releaseDate": "2026-04-17", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "moonshotai/kimi-k2p6-fast", + "provider": "moonshotai", + "model": "kimi-k2p6-fast", + "displayName": "Kimi K2.6 Fast", + "family": "kimi-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "fireworks-ai" + ], + "aliases": [ + "fireworks-ai/accounts/fireworks/routers/kimi-k2p6-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262000, + "outputTokens": 262000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fireworks-ai", + "model": "accounts/fireworks/routers/kimi-k2p6-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.6 Fast" + ], + "families": [ + "kimi-thinking" + ], + "releaseDate": "2026-04-17", + "lastUpdated": "2026-06-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fireworks-ai", + "providerName": "Fireworks AI", + "providerApi": "https://api.fireworks.ai/inference/v1/", + "providerDoc": "https://fireworks.ai/docs/", + "model": "accounts/fireworks/routers/kimi-k2p6-fast", + "modelKey": "accounts/fireworks/routers/kimi-k2p6-fast", + "displayName": "Kimi K2.6 Fast", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2026-06-05", + "openWeights": true, + "releaseDate": "2026-04-17", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "moonshotai/kimi-k2p6-turbo", + "provider": "moonshotai", + "model": "kimi-k2p6-turbo", + "displayName": "Kimi K2.6 Turbo", + "family": "kimi-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "firepass", + "fireworks-ai" + ], + "aliases": [ + "firepass/accounts/fireworks/routers/kimi-k2p6-turbo", + "fireworks-ai/accounts/fireworks/routers/kimi-k2p6-turbo" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262000, + "outputTokens": 262000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "firepass", + "model": "accounts/fireworks/routers/kimi-k2p6-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "fireworks-ai", + "model": "accounts/fireworks/routers/kimi-k2p6-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.6 Turbo" + ], + "families": [ + "kimi-thinking" + ], + "releaseDate": "2026-04-17", + "lastUpdated": "2026-04-17", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "firepass", + "providerName": "Fireworks (Firepass)", + "providerApi": "https://api.fireworks.ai/inference/v1/", + "providerDoc": "https://docs.fireworks.ai/firepass", + "model": "accounts/fireworks/routers/kimi-k2p6-turbo", + "modelKey": "accounts/fireworks/routers/kimi-k2p6-turbo", + "displayName": "Kimi K2.6 Turbo", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": true, + "releaseDate": "2026-04-17", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fireworks-ai", + "providerName": "Fireworks AI", + "providerApi": "https://api.fireworks.ai/inference/v1/", + "providerDoc": "https://fireworks.ai/docs/", + "model": "accounts/fireworks/routers/kimi-k2p6-turbo", + "modelKey": "accounts/fireworks/routers/kimi-k2p6-turbo", + "displayName": "Kimi K2.6 Turbo", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": true, + "releaseDate": "2026-04-17", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "moonshotai/kimi-k2p7-code", + "provider": "moonshotai", + "model": "kimi-k2p7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "fireworks-ai" + ], + "aliases": [ + "fireworks-ai/accounts/fireworks/models/kimi-k2p7-code" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262000, + "outputTokens": 262000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fireworks-ai", + "model": "accounts/fireworks/models/kimi-k2p7-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.19, + "input": 0.95, + "output": 4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.7 Code" + ], + "families": [ + "kimi-k2" + ], + "releaseDate": "2026-06-12", + "lastUpdated": "2026-06-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fireworks-ai", + "providerName": "Fireworks AI", + "providerApi": "https://api.fireworks.ai/inference/v1/", + "providerDoc": "https://fireworks.ai/docs/", + "model": "accounts/fireworks/models/kimi-k2p7-code", + "modelKey": "accounts/fireworks/models/kimi-k2p7-code", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-06-16", + "openWeights": true, + "releaseDate": "2026-06-12", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "moonshotai/kimi-k2p7-code-fast", + "provider": "moonshotai", + "model": "kimi-k2p7-code-fast", + "displayName": "Kimi K2.7 Code Fast", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "fireworks-ai" + ], + "aliases": [ + "fireworks-ai/accounts/fireworks/routers/kimi-k2p7-code-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262000, + "outputTokens": 262000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fireworks-ai", + "model": "accounts/fireworks/routers/kimi-k2p7-code-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.38, + "input": 1.9, + "output": 8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.7 Code Fast" + ], + "families": [ + "kimi-k2" + ], + "releaseDate": "2026-06-12", + "lastUpdated": "2026-06-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fireworks-ai", + "providerName": "Fireworks AI", + "providerApi": "https://api.fireworks.ai/inference/v1/", + "providerDoc": "https://fireworks.ai/docs/", + "model": "accounts/fireworks/routers/kimi-k2p7-code-fast", + "modelKey": "accounts/fireworks/routers/kimi-k2p7-code-fast", + "displayName": "Kimi K2.7 Code Fast", + "family": "kimi-k2", + "metadata": { + "lastUpdated": "2026-06-16", + "openWeights": true, + "releaseDate": "2026-06-12", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "moonshotai/kimi-latest", + "provider": "moonshotai", + "model": "kimi-latest", + "displayName": "MoonshotAI: Kimi Latest", + "family": "kimi", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "moonshot", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "kilo/~moonshotai/kimi-latest", + "moonshot/kimi-latest", + "nano-gpt/moonshotai/kimi-latest", + "openrouter/~moonshotai/kimi-latest" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 262144, + "inputTokens": 256000, + "maxTokens": 131072, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "~moonshotai/kimi-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.14, + "input": 0.74, + "output": 3.49 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "moonshotai/kimi-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 0.5, + "output": 2.6 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "~moonshotai/kimi-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.67, + "output": 3.5 + } + }, + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/kimi-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 2, + "output": 5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "~moonshotai/kimi-latest", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.67, + "output": 3.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi Latest", + "MoonshotAI Kimi Latest", + "MoonshotAI: Kimi Latest" + ], + "families": [ + "kimi" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-04-27", + "lastUpdated": "2026-05-01", + "deprecationDate": "2026-01-28", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "parallel_tool_calls", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "~moonshotai/kimi-latest", + "modelKey": "~moonshotai/kimi-latest", + "displayName": "MoonshotAI: Kimi Latest", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "moonshotai/kimi-latest", + "modelKey": "moonshotai/kimi-latest", + "displayName": "Kimi Latest", + "metadata": { + "lastUpdated": "2026-05-03", + "openWeights": false, + "releaseDate": "2026-05-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "~moonshotai/kimi-latest", + "modelKey": "~moonshotai/kimi-latest", + "displayName": "MoonshotAI Kimi Latest", + "family": "kimi", + "metadata": { + "lastUpdated": "2026-04-27", + "openWeights": false, + "releaseDate": "2026-04-27" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/kimi-latest", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-01-28", + "source": "https://platform.moonshot.ai/docs/pricing" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "~moonshotai/kimi-latest", + "displayName": "MoonshotAI Kimi Latest", + "metadata": { + "canonicalSlug": "~moonshotai/kimi-latest", + "createdAt": "2026-04-27T19:33:48.000Z", + "links": { + "details": "/api/v1/models/~moonshotai/kimi-latest/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "parallel_tool_calls", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Router", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 262144, + "is_moderated": false + } + } + } + ] + }, + { + "id": "moonshotai/kimi-latest-128k", + "provider": "moonshotai", + "model": "kimi-latest-128k", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "moonshot" + ], + "aliases": [ + "moonshot/kimi-latest-128k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/kimi-latest-128k", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 2, + "output": 5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2026-01-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/kimi-latest-128k", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-01-28", + "source": "https://platform.moonshot.ai/docs/pricing" + } + } + ] + }, + { + "id": "moonshotai/kimi-latest-32k", + "provider": "moonshotai", + "model": "kimi-latest-32k", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "moonshot" + ], + "aliases": [ + "moonshot/kimi-latest-32k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/kimi-latest-32k", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2026-01-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/kimi-latest-32k", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-01-28", + "source": "https://platform.moonshot.ai/docs/pricing" + } + } + ] + }, + { + "id": "moonshotai/kimi-latest-8k", + "provider": "moonshotai", + "model": "kimi-latest-8k", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "moonshot" + ], + "aliases": [ + "moonshot/kimi-latest-8k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/kimi-latest-8k", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.2, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2026-01-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/kimi-latest-8k", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-01-28", + "source": "https://platform.moonshot.ai/docs/pricing" + } + } + ] + }, + { + "id": "moonshotai/kimi-thinking-preview", + "provider": "moonshotai", + "model": "kimi-thinking-preview", + "displayName": "Kimi Thinking Preview", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "moonshot", + "nano-gpt" + ], + "aliases": [ + "moonshot/kimi-thinking-preview", + "nano-gpt/kimi-thinking-preview" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "kimi-thinking-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 31.46, + "output": 31.46 + } + }, + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/kimi-thinking-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi Thinking Preview" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-05-07", + "lastUpdated": "2025-05-07", + "deprecationDate": "2025-11-11", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "kimi-thinking-preview", + "modelKey": "kimi-thinking-preview", + "displayName": "Kimi Thinking Preview", + "metadata": { + "lastUpdated": "2025-05-07", + "openWeights": false, + "releaseDate": "2025-05-07" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/kimi-thinking-preview", + "mode": "chat", + "metadata": { + "deprecationDate": "2025-11-11", + "source": "https://platform.moonshot.ai/docs/pricing/chat#generation-model-kimi-k2" + } + } + ] + }, + { + "id": "moonshotai/moonshot-v1-128k", + "provider": "moonshotai", + "model": "moonshot-v1-128k", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "moonshot" + ], + "aliases": [ + "moonshot/moonshot-v1-128k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-128k", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-128k", + "mode": "chat", + "metadata": { + "source": "https://platform.moonshot.ai/docs/pricing" + } + } + ] + }, + { + "id": "moonshotai/moonshot-v1-128k-0430", + "provider": "moonshotai", + "model": "moonshot-v1-128k-0430", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "moonshot" + ], + "aliases": [ + "moonshot/moonshot-v1-128k-0430" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-128k-0430", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2024-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-128k-0430", + "mode": "chat", + "metadata": { + "deprecationDate": "2024-04-30", + "source": "https://platform.moonshot.ai/docs/pricing" + } + } + ] + }, + { + "id": "moonshotai/moonshot-v1-128k-vision-preview", + "provider": "moonshotai", + "model": "moonshot-v1-128k-vision-preview", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "moonshot" + ], + "aliases": [ + "moonshot/moonshot-v1-128k-vision-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-128k-vision-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-128k-vision-preview", + "mode": "chat", + "metadata": { + "source": "https://platform.moonshot.ai/docs/pricing" + } + } + ] + }, + { + "id": "moonshotai/moonshot-v1-32k", + "provider": "moonshotai", + "model": "moonshot-v1-32k", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "moonshot" + ], + "aliases": [ + "moonshot/moonshot-v1-32k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-32k", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-32k", + "mode": "chat", + "metadata": { + "source": "https://platform.moonshot.ai/docs/pricing" + } + } + ] + }, + { + "id": "moonshotai/moonshot-v1-32k-0430", + "provider": "moonshotai", + "model": "moonshot-v1-32k-0430", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "moonshot" + ], + "aliases": [ + "moonshot/moonshot-v1-32k-0430" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-32k-0430", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2024-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-32k-0430", + "mode": "chat", + "metadata": { + "deprecationDate": "2024-04-30", + "source": "https://platform.moonshot.ai/docs/pricing" + } + } + ] + }, + { + "id": "moonshotai/moonshot-v1-32k-vision-preview", + "provider": "moonshotai", + "model": "moonshot-v1-32k-vision-preview", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "moonshot" + ], + "aliases": [ + "moonshot/moonshot-v1-32k-vision-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-32k-vision-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-32k-vision-preview", + "mode": "chat", + "metadata": { + "source": "https://platform.moonshot.ai/docs/pricing" + } + } + ] + }, + { + "id": "moonshotai/moonshot-v1-8k", + "provider": "moonshotai", + "model": "moonshot-v1-8k", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "moonshot" + ], + "aliases": [ + "moonshot/moonshot-v1-8k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-8k", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-8k", + "mode": "chat", + "metadata": { + "source": "https://platform.moonshot.ai/docs/pricing" + } + } + ] + }, + { + "id": "moonshotai/moonshot-v1-8k-0430", + "provider": "moonshotai", + "model": "moonshot-v1-8k-0430", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "moonshot" + ], + "aliases": [ + "moonshot/moonshot-v1-8k-0430" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-8k-0430", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2024-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-8k-0430", + "mode": "chat", + "metadata": { + "deprecationDate": "2024-04-30", + "source": "https://platform.moonshot.ai/docs/pricing" + } + } + ] + }, + { + "id": "moonshotai/moonshot-v1-8k-vision-preview", + "provider": "moonshotai", + "model": "moonshot-v1-8k-vision-preview", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "moonshot" + ], + "aliases": [ + "moonshot/moonshot-v1-8k-vision-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-8k-vision-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-8k-vision-preview", + "mode": "chat", + "metadata": { + "source": "https://platform.moonshot.ai/docs/pricing" + } + } + ] + }, + { + "id": "moonshotai/moonshot-v1-auto", + "provider": "moonshotai", + "model": "moonshot-v1-auto", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "moonshot" + ], + "aliases": [ + "moonshot/moonshot-v1-auto" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-auto", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "moonshot", + "model": "moonshot/moonshot-v1-auto", + "mode": "chat", + "metadata": { + "source": "https://platform.moonshot.ai/docs/pricing" + } + } + ] + }, + { + "id": "morph/auto", + "provider": "morph", + "model": "auto", + "displayName": "Auto", + "family": "auto", + "sources": [ + "models.dev" + ], + "providers": [ + "morph" + ], + "aliases": [ + "morph/auto" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "morph", + "model": "auto", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.85, + "output": 1.55 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Auto" + ], + "families": [ + "auto" + ], + "releaseDate": "2024-06-01", + "lastUpdated": "2024-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "morph", + "providerName": "Morph", + "providerApi": "https://api.morphllm.com/v1", + "providerDoc": "https://docs.morphllm.com/api-reference/introduction", + "model": "auto", + "modelKey": "auto", + "displayName": "Auto", + "family": "auto", + "metadata": { + "lastUpdated": "2024-06-01", + "openWeights": false, + "releaseDate": "2024-06-01" + } + } + ] + }, + { + "id": "morph/morph-v3-fast", + "provider": "morph", + "model": "morph-v3-fast", + "displayName": "Morph v3 Fast", + "family": "morph", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "morph" + ], + "aliases": [ + "morph/morph-v3-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16000, + "inputTokens": 16000, + "maxTokens": 16000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": false, + "transcription": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "morph", + "model": "morph-v3-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 1.2 + } + }, + { + "source": "litellm", + "provider": "morph", + "model": "morph/morph-v3-fast", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Morph v3 Fast" + ], + "families": [ + "morph" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-08-15", + "lastUpdated": "2024-08-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "morph", + "providerName": "Morph", + "providerApi": "https://api.morphllm.com/v1", + "providerDoc": "https://docs.morphllm.com/api-reference/introduction", + "model": "morph-v3-fast", + "modelKey": "morph-v3-fast", + "displayName": "Morph v3 Fast", + "family": "morph", + "metadata": { + "lastUpdated": "2024-08-15", + "openWeights": false, + "releaseDate": "2024-08-15" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "morph", + "model": "morph/morph-v3-fast", + "mode": "chat" + } + ] + }, + { + "id": "morph/morph-v3-large", + "provider": "morph", + "model": "morph-v3-large", + "displayName": "Morph v3 Large", + "family": "morph", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "morph" + ], + "aliases": [ + "morph/morph-v3-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 16000, + "maxTokens": 16000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": false, + "transcription": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "morph", + "model": "morph-v3-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.9, + "output": 1.9 + } + }, + { + "source": "litellm", + "provider": "morph", + "model": "morph/morph-v3-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 1.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Morph v3 Large" + ], + "families": [ + "morph" + ], + "modes": [ + "chat" + ], + "releaseDate": "2024-08-15", + "lastUpdated": "2024-08-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "morph", + "providerName": "Morph", + "providerApi": "https://api.morphllm.com/v1", + "providerDoc": "https://docs.morphllm.com/api-reference/introduction", + "model": "morph-v3-large", + "modelKey": "morph-v3-large", + "displayName": "Morph v3 Large", + "family": "morph", + "metadata": { + "lastUpdated": "2024-08-15", + "openWeights": false, + "releaseDate": "2024-08-15" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "morph", + "model": "morph/morph-v3-large", + "mode": "chat" + } + ] + }, + { + "id": "nano-gpt/aion-1.0", + "provider": "nano-gpt", + "model": "aion-1.0", + "displayName": "Aion 1.0", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/aion-labs/aion-1.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "aion-labs/aion-1.0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3.995, + "output": 7.99 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Aion 1.0" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-02-01", + "lastUpdated": "2025-02-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "aion-labs/aion-1.0", + "modelKey": "aion-labs/aion-1.0", + "displayName": "Aion 1.0", + "family": "llama", + "metadata": { + "lastUpdated": "2025-02-01", + "openWeights": false, + "releaseDate": "2025-02-01" + } + } + ] + }, + { + "id": "nano-gpt/aion-1.0-mini", + "provider": "nano-gpt", + "model": "aion-1.0-mini", + "displayName": "Aion 1.0 mini (DeepSeek)", + "family": "deepseek", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/aion-labs/aion-1.0-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "aion-labs/aion-1.0-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7989999999999999, + "output": 1.394 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Aion 1.0 mini (DeepSeek)" + ], + "families": [ + "deepseek" + ], + "releaseDate": "2025-02-20", + "lastUpdated": "2025-02-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "aion-labs/aion-1.0-mini", + "modelKey": "aion-labs/aion-1.0-mini", + "displayName": "Aion 1.0 mini (DeepSeek)", + "family": "deepseek", + "metadata": { + "lastUpdated": "2025-02-20", + "openWeights": false, + "releaseDate": "2025-02-20" + } + } + ] + }, + { + "id": "nano-gpt/aion-2.0", + "provider": "nano-gpt", + "model": "aion-2.0", + "displayName": "AionLabs: Aion-2.0", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/aion-labs/aion-2.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "aion-labs/aion-2.0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 1.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "AionLabs: Aion-2.0" + ], + "releaseDate": "2026-02-23", + "lastUpdated": "2026-02-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "aion-labs/aion-2.0", + "modelKey": "aion-labs/aion-2.0", + "displayName": "AionLabs: Aion-2.0", + "metadata": { + "lastUpdated": "2026-02-23", + "openWeights": false, + "releaseDate": "2026-02-23" + } + } + ] + }, + { + "id": "nano-gpt/aion-2.5", + "provider": "nano-gpt", + "model": "aion-2.5", + "displayName": "AionLabs: Aion-2.5", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/aion-labs/aion-2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "aion-labs/aion-2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.35, + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "AionLabs: Aion-2.5" + ], + "releaseDate": "2026-03-20", + "lastUpdated": "2026-03-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "aion-labs/aion-2.5", + "modelKey": "aion-labs/aion-2.5", + "displayName": "AionLabs: Aion-2.5", + "metadata": { + "lastUpdated": "2026-03-20", + "openWeights": false, + "releaseDate": "2026-03-20" + } + } + ] + }, + { + "id": "nano-gpt/aion-rp-llama-3.1-8b", + "provider": "nano-gpt", + "model": "aion-rp-llama-3.1-8b", + "displayName": "Llama 3.1 8b (uncensored)", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/aion-labs/aion-rp-llama-3.1-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "aion-labs/aion-rp-llama-3.1-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2006, + "output": 0.2006 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 8b (uncensored)" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "aion-labs/aion-rp-llama-3.1-8b", + "modelKey": "aion-labs/aion-rp-llama-3.1-8b", + "displayName": "Llama 3.1 8b (uncensored)", + "family": "llama", + "metadata": { + "lastUpdated": "2024-07-23", + "openWeights": false, + "releaseDate": "2024-07-23" + } + } + ] + }, + { + "id": "nano-gpt/amoral-gemma3-27b-v2", + "provider": "nano-gpt", + "model": "amoral-gemma3-27b-v2", + "displayName": "Amoral Gemma3 27B v2", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/soob3123/amoral-gemma3-27B-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "soob3123/amoral-gemma3-27B-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Amoral Gemma3 27B v2" + ], + "families": [ + "gemma" + ], + "releaseDate": "2025-05-23", + "lastUpdated": "2025-05-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "soob3123/amoral-gemma3-27B-v2", + "modelKey": "soob3123/amoral-gemma3-27B-v2", + "displayName": "Amoral Gemma3 27B v2", + "family": "gemma", + "metadata": { + "lastUpdated": "2025-05-23", + "openWeights": false, + "releaseDate": "2025-05-23" + } + } + ] + }, + { + "id": "nano-gpt/anubis-70b-v1", + "provider": "nano-gpt", + "model": "anubis-70b-v1", + "displayName": "Anubis 70B v1", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TheDrummer/Anubis-70B-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TheDrummer/Anubis-70B-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.31, + "output": 0.31 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anubis 70B v1" + ], + "releaseDate": "2024-01-01", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TheDrummer/Anubis-70B-v1", + "modelKey": "TheDrummer/Anubis-70B-v1", + "displayName": "Anubis 70B v1", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + } + ] + }, + { + "id": "nano-gpt/anubis-70b-v1.1", + "provider": "nano-gpt", + "model": "anubis-70b-v1.1", + "displayName": "Anubis 70B v1.1", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TheDrummer/Anubis-70B-v1.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TheDrummer/Anubis-70B-v1.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.31, + "output": 0.31 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Anubis 70B v1.1" + ], + "releaseDate": "2024-01-01", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TheDrummer/Anubis-70B-v1.1", + "modelKey": "TheDrummer/Anubis-70B-v1.1", + "displayName": "Anubis 70B v1.1", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + } + ] + }, + { + "id": "nano-gpt/asi1-mini", + "provider": "nano-gpt", + "model": "asi1-mini", + "displayName": "ASI1 Mini", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/asi1-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "asi1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ASI1 Mini" + ], + "releaseDate": "2025-03-25", + "lastUpdated": "2025-03-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "asi1-mini", + "modelKey": "asi1-mini", + "displayName": "ASI1 Mini", + "metadata": { + "lastUpdated": "2025-03-25", + "openWeights": false, + "releaseDate": "2025-03-25" + } + } + ] + }, + { + "id": "nano-gpt/auto-model", + "provider": "nano-gpt", + "model": "auto-model", + "displayName": "Auto model", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/auto-model" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 1000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "auto-model", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Auto model" + ], + "releaseDate": "2024-06-01", + "lastUpdated": "2024-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "auto-model", + "modelKey": "auto-model", + "displayName": "Auto model", + "metadata": { + "lastUpdated": "2024-06-01", + "openWeights": false, + "releaseDate": "2024-06-01" + } + } + ] + }, + { + "id": "nano-gpt/auto-model-basic", + "provider": "nano-gpt", + "model": "auto-model-basic", + "displayName": "Auto model (Basic)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/auto-model-basic" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 1000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "auto-model-basic", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 9.996, + "output": 19.992 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Auto model (Basic)" + ], + "releaseDate": "2024-06-01", + "lastUpdated": "2024-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "auto-model-basic", + "modelKey": "auto-model-basic", + "displayName": "Auto model (Basic)", + "metadata": { + "lastUpdated": "2024-06-01", + "openWeights": false, + "releaseDate": "2024-06-01" + } + } + ] + }, + { + "id": "nano-gpt/auto-model-premium", + "provider": "nano-gpt", + "model": "auto-model-premium", + "displayName": "Auto model (Premium)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/auto-model-premium" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 1000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "auto-model-premium", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 9.996, + "output": 19.992 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Auto model (Premium)" + ], + "releaseDate": "2024-06-01", + "lastUpdated": "2024-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "auto-model-premium", + "modelKey": "auto-model-premium", + "displayName": "Auto model (Premium)", + "metadata": { + "lastUpdated": "2024-06-01", + "openWeights": false, + "releaseDate": "2024-06-01" + } + } + ] + }, + { + "id": "nano-gpt/auto-model-standard", + "provider": "nano-gpt", + "model": "auto-model-standard", + "displayName": "Auto model (Standard)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/auto-model-standard" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 1000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "auto-model-standard", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 9.996, + "output": 19.992 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Auto model (Standard)" + ], + "releaseDate": "2024-06-01", + "lastUpdated": "2024-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "auto-model-standard", + "modelKey": "auto-model-standard", + "displayName": "Auto model (Standard)", + "metadata": { + "lastUpdated": "2024-06-01", + "openWeights": false, + "releaseDate": "2024-06-01" + } + } + ] + }, + { + "id": "nano-gpt/azure-gpt-4-turbo", + "provider": "nano-gpt", + "model": "azure-gpt-4-turbo", + "displayName": "Azure gpt-4-turbo", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/azure-gpt-4-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "azure-gpt-4-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 9.996, + "output": 30.005 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Azure gpt-4-turbo" + ], + "releaseDate": "2023-11-06", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "azure-gpt-4-turbo", + "modelKey": "azure-gpt-4-turbo", + "displayName": "Azure gpt-4-turbo", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2023-11-06" + } + } + ] + }, + { + "id": "nano-gpt/azure-gpt-4o", + "provider": "nano-gpt", + "model": "azure-gpt-4o", + "displayName": "Azure gpt-4o", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/azure-gpt-4o" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "azure-gpt-4o", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.499, + "output": 9.996 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Azure gpt-4o" + ], + "releaseDate": "2024-05-13", + "lastUpdated": "2024-05-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "azure-gpt-4o", + "modelKey": "azure-gpt-4o", + "displayName": "Azure gpt-4o", + "metadata": { + "lastUpdated": "2024-05-13", + "openWeights": false, + "releaseDate": "2024-05-13" + } + } + ] + }, + { + "id": "nano-gpt/azure-gpt-4o-mini", + "provider": "nano-gpt", + "model": "azure-gpt-4o-mini", + "displayName": "Azure gpt-4o-mini", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/azure-gpt-4o-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "azure-gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1496, + "output": 0.595 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Azure gpt-4o-mini" + ], + "releaseDate": "2024-07-18", + "lastUpdated": "2024-07-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "azure-gpt-4o-mini", + "modelKey": "azure-gpt-4o-mini", + "displayName": "Azure gpt-4o-mini", + "metadata": { + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + } + ] + }, + { + "id": "nano-gpt/azure-o1", + "provider": "nano-gpt", + "model": "azure-o1", + "displayName": "Azure o1", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/azure-o1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "azure-o1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14.994, + "output": 59.993 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Azure o1" + ], + "releaseDate": "2024-12-17", + "lastUpdated": "2024-12-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "azure-o1", + "modelKey": "azure-o1", + "displayName": "Azure o1", + "metadata": { + "lastUpdated": "2024-12-17", + "openWeights": false, + "releaseDate": "2024-12-17" + } + } + ] + }, + { + "id": "nano-gpt/azure-o3-mini", + "provider": "nano-gpt", + "model": "azure-o3-mini", + "displayName": "Azure o3-mini", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/azure-o3-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "azure-o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.088, + "output": 4.3996 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Azure o3-mini" + ], + "releaseDate": "2025-01-31", + "lastUpdated": "2025-01-31", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "azure-o3-mini", + "modelKey": "azure-o3-mini", + "displayName": "Azure o3-mini", + "metadata": { + "lastUpdated": "2025-01-31", + "openWeights": false, + "releaseDate": "2025-01-31" + } + } + ] + }, + { + "id": "nano-gpt/baichuan-m2", + "provider": "nano-gpt", + "model": "baichuan-m2", + "displayName": "Baichuan M2 32B Medical", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Baichuan-M2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Baichuan-M2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15.73, + "output": 15.73 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Baichuan M2 32B Medical" + ], + "releaseDate": "2025-08-19", + "lastUpdated": "2025-08-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Baichuan-M2", + "modelKey": "Baichuan-M2", + "displayName": "Baichuan M2 32B Medical", + "metadata": { + "lastUpdated": "2025-08-19", + "openWeights": false, + "releaseDate": "2025-08-19" + } + } + ] + }, + { + "id": "nano-gpt/baichuan4-air", + "provider": "nano-gpt", + "model": "baichuan4-air", + "displayName": "Baichuan 4 Air", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Baichuan4-Air" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Baichuan4-Air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.157, + "output": 0.157 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Baichuan 4 Air" + ], + "releaseDate": "2025-08-19", + "lastUpdated": "2025-08-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Baichuan4-Air", + "modelKey": "Baichuan4-Air", + "displayName": "Baichuan 4 Air", + "metadata": { + "lastUpdated": "2025-08-19", + "openWeights": false, + "releaseDate": "2025-08-19" + } + } + ] + }, + { + "id": "nano-gpt/baichuan4-turbo", + "provider": "nano-gpt", + "model": "baichuan4-turbo", + "displayName": "Baichuan 4 Turbo", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Baichuan4-Turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Baichuan4-Turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.42, + "output": 2.42 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Baichuan 4 Turbo" + ], + "releaseDate": "2025-08-19", + "lastUpdated": "2025-08-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Baichuan4-Turbo", + "modelKey": "Baichuan4-Turbo", + "displayName": "Baichuan 4 Turbo", + "metadata": { + "lastUpdated": "2025-08-19", + "openWeights": false, + "releaseDate": "2025-08-19" + } + } + ] + }, + { + "id": "nano-gpt/brave", + "provider": "nano-gpt", + "model": "brave", + "displayName": "Brave (Answers)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/brave" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "brave", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Brave (Answers)" + ], + "releaseDate": "2023-03-02", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "brave", + "modelKey": "brave", + "displayName": "Brave (Answers)", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2023-03-02" + } + } + ] + }, + { + "id": "nano-gpt/brave-pro", + "provider": "nano-gpt", + "model": "brave-pro", + "displayName": "Brave (Pro)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/brave-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "brave-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Brave (Pro)" + ], + "releaseDate": "2023-03-02", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "brave-pro", + "modelKey": "brave-pro", + "displayName": "Brave (Pro)", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2023-03-02" + } + } + ] + }, + { + "id": "nano-gpt/brave-research", + "provider": "nano-gpt", + "model": "brave-research", + "displayName": "Brave (Research)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/brave-research" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "brave-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Brave (Research)" + ], + "releaseDate": "2023-03-02", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "brave-research", + "modelKey": "brave-research", + "displayName": "Brave (Research)", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2023-03-02" + } + } + ] + }, + { + "id": "nano-gpt/claw-high", + "provider": "nano-gpt", + "model": "claw-high", + "displayName": "Claw High", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claw-high" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claw-high", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4.998, + "output": 25.007 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claw High" + ], + "releaseDate": "2026-05-11", + "lastUpdated": "2026-05-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claw-high", + "modelKey": "claw-high", + "displayName": "Claw High", + "metadata": { + "lastUpdated": "2026-05-11", + "openWeights": false, + "releaseDate": "2026-05-11" + } + } + ] + }, + { + "id": "nano-gpt/claw-low", + "provider": "nano-gpt", + "model": "claw-low", + "displayName": "Claw Low", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claw-low" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claw-low", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claw Low" + ], + "releaseDate": "2026-05-11", + "lastUpdated": "2026-05-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claw-low", + "modelKey": "claw-low", + "displayName": "Claw Low", + "metadata": { + "lastUpdated": "2026-05-11", + "openWeights": false, + "releaseDate": "2026-05-11" + } + } + ] + }, + { + "id": "nano-gpt/claw-medium", + "provider": "nano-gpt", + "model": "claw-medium", + "displayName": "Claw Medium", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/claw-medium" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "inputTokens": 204800, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "claw-medium", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Claw Medium" + ], + "releaseDate": "2026-05-11", + "lastUpdated": "2026-05-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "claw-medium", + "modelKey": "claw-medium", + "displayName": "Claw Medium", + "metadata": { + "lastUpdated": "2026-05-11", + "openWeights": false, + "releaseDate": "2026-05-11" + } + } + ] + }, + { + "id": "nano-gpt/coding-router", + "provider": "nano-gpt", + "model": "coding-router", + "displayName": "Coding Router", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/nanogpt/coding-router" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "nanogpt/coding-router", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 1.1, + "output": 2.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Coding Router" + ], + "releaseDate": "2026-05-12", + "lastUpdated": "2026-05-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "nanogpt/coding-router", + "modelKey": "nanogpt/coding-router", + "displayName": "Coding Router", + "metadata": { + "lastUpdated": "2026-05-12", + "openWeights": false, + "releaseDate": "2026-05-12" + } + } + ] + }, + { + "id": "nano-gpt/coding-router:high", + "provider": "nano-gpt", + "model": "coding-router:high", + "displayName": "Coding Router High", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/nanogpt/coding-router:high" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "nanogpt/coding-router:high", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 1.1, + "output": 2.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Coding Router High" + ], + "releaseDate": "2026-05-12", + "lastUpdated": "2026-05-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "nanogpt/coding-router:high", + "modelKey": "nanogpt/coding-router:high", + "displayName": "Coding Router High", + "metadata": { + "lastUpdated": "2026-05-12", + "openWeights": false, + "releaseDate": "2026-05-12" + } + } + ] + }, + { + "id": "nano-gpt/coding-router:low", + "provider": "nano-gpt", + "model": "coding-router:low", + "displayName": "Coding Router Low", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/nanogpt/coding-router:low" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "nanogpt/coding-router:low", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.14, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Coding Router Low" + ], + "releaseDate": "2026-05-12", + "lastUpdated": "2026-05-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "nanogpt/coding-router:low", + "modelKey": "nanogpt/coding-router:low", + "displayName": "Coding Router Low", + "metadata": { + "lastUpdated": "2026-05-12", + "openWeights": false, + "releaseDate": "2026-05-12" + } + } + ] + }, + { + "id": "nano-gpt/coding-router:max", + "provider": "nano-gpt", + "model": "coding-router:max", + "displayName": "Coding Router Max", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/nanogpt/coding-router:max" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "nanogpt/coding-router:max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Coding Router Max" + ], + "releaseDate": "2026-05-12", + "lastUpdated": "2026-05-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "nanogpt/coding-router:max", + "modelKey": "nanogpt/coding-router:max", + "displayName": "Coding Router Max", + "metadata": { + "lastUpdated": "2026-05-12", + "openWeights": false, + "releaseDate": "2026-05-12" + } + } + ] + }, + { + "id": "nano-gpt/coding-router:medium", + "provider": "nano-gpt", + "model": "coding-router:medium", + "displayName": "Coding Router Medium", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/nanogpt/coding-router:medium" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "nanogpt/coding-router:medium", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.14, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Coding Router Medium" + ], + "releaseDate": "2026-05-12", + "lastUpdated": "2026-05-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "nanogpt/coding-router:medium", + "modelKey": "nanogpt/coding-router:medium", + "displayName": "Coding Router Medium", + "metadata": { + "lastUpdated": "2026-05-12", + "openWeights": false, + "releaseDate": "2026-05-12" + } + } + ] + }, + { + "id": "nano-gpt/cogito-v1-preview-qwen-32b", + "provider": "nano-gpt", + "model": "cogito-v1-preview-qwen-32b", + "displayName": "Cogito v1 Preview Qwen 32B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/deepcogito/cogito-v1-preview-qwen-32B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepcogito/cogito-v1-preview-qwen-32B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.7999999999999998, + "output": 1.7999999999999998 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cogito v1 Preview Qwen 32B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-05-10", + "lastUpdated": "2025-05-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepcogito/cogito-v1-preview-qwen-32B", + "modelKey": "deepcogito/cogito-v1-preview-qwen-32B", + "displayName": "Cogito v1 Preview Qwen 32B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-05-10", + "openWeights": false, + "releaseDate": "2025-05-10" + } + } + ] + }, + { + "id": "nano-gpt/cydonia-24b-v2", + "provider": "nano-gpt", + "model": "cydonia-24b-v2", + "displayName": "The Drummer Cydonia 24B v2", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TheDrummer/Cydonia-24B-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TheDrummer/Cydonia-24B-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1003, + "output": 0.1207 + } + } + ] + }, + "metadata": { + "displayNames": [ + "The Drummer Cydonia 24B v2" + ], + "releaseDate": "2025-02-17", + "lastUpdated": "2025-02-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TheDrummer/Cydonia-24B-v2", + "modelKey": "TheDrummer/Cydonia-24B-v2", + "displayName": "The Drummer Cydonia 24B v2", + "metadata": { + "lastUpdated": "2025-02-17", + "openWeights": false, + "releaseDate": "2025-02-17" + } + } + ] + }, + { + "id": "nano-gpt/cydonia-24b-v4", + "provider": "nano-gpt", + "model": "cydonia-24b-v4", + "displayName": "The Drummer Cydonia 24B v4", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TheDrummer/Cydonia-24B-v4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TheDrummer/Cydonia-24B-v4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2006, + "output": 0.2414 + } + } + ] + }, + "metadata": { + "displayNames": [ + "The Drummer Cydonia 24B v4" + ], + "releaseDate": "2025-07-22", + "lastUpdated": "2025-07-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TheDrummer/Cydonia-24B-v4", + "modelKey": "TheDrummer/Cydonia-24B-v4", + "displayName": "The Drummer Cydonia 24B v4", + "metadata": { + "lastUpdated": "2025-07-22", + "openWeights": false, + "releaseDate": "2025-07-22" + } + } + ] + }, + { + "id": "nano-gpt/cydonia-24b-v4.1", + "provider": "nano-gpt", + "model": "cydonia-24b-v4.1", + "displayName": "The Drummer Cydonia 24B v4.1", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TheDrummer/Cydonia-24B-v4.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TheDrummer/Cydonia-24B-v4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1003, + "output": 0.1207 + } + } + ] + }, + "metadata": { + "displayNames": [ + "The Drummer Cydonia 24B v4.1" + ], + "releaseDate": "2025-08-19", + "lastUpdated": "2025-08-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TheDrummer/Cydonia-24B-v4.1", + "modelKey": "TheDrummer/Cydonia-24B-v4.1", + "displayName": "The Drummer Cydonia 24B v4.1", + "metadata": { + "lastUpdated": "2025-08-19", + "openWeights": false, + "releaseDate": "2025-08-19" + } + } + ] + }, + { + "id": "nano-gpt/cydonia-24b-v4.3", + "provider": "nano-gpt", + "model": "cydonia-24b-v4.3", + "displayName": "The Drummer Cydonia 24B v4.3", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TheDrummer/Cydonia-24B-v4.3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TheDrummer/Cydonia-24B-v4.3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1003, + "output": 0.1207 + } + } + ] + }, + "metadata": { + "displayNames": [ + "The Drummer Cydonia 24B v4.3" + ], + "releaseDate": "2025-12-25", + "lastUpdated": "2025-12-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TheDrummer/Cydonia-24B-v4.3", + "modelKey": "TheDrummer/Cydonia-24B-v4.3", + "displayName": "The Drummer Cydonia 24B v4.3", + "metadata": { + "lastUpdated": "2025-12-25", + "openWeights": false, + "releaseDate": "2025-12-25" + } + } + ] + }, + { + "id": "nano-gpt/deepclaude", + "provider": "nano-gpt", + "model": "deepclaude", + "displayName": "DeepClaude", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/deepclaude" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "deepclaude", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepClaude" + ], + "releaseDate": "2025-02-01", + "lastUpdated": "2025-02-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "deepclaude", + "modelKey": "deepclaude", + "displayName": "DeepClaude", + "metadata": { + "lastUpdated": "2025-02-01", + "openWeights": false, + "releaseDate": "2025-02-01" + } + } + ] + }, + { + "id": "nano-gpt/deephermes-3-mistral-24b-preview", + "provider": "nano-gpt", + "model": "deephermes-3-mistral-24b-preview", + "displayName": "DeepHermes-3 Mistral 24B (Preview)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/NousResearch/DeepHermes-3-Mistral-24B-Preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "NousResearch/DeepHermes-3-Mistral-24B-Preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DeepHermes-3 Mistral 24B (Preview)" + ], + "releaseDate": "2025-05-10", + "lastUpdated": "2025-05-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "NousResearch/DeepHermes-3-Mistral-24B-Preview", + "modelKey": "NousResearch/DeepHermes-3-Mistral-24B-Preview", + "displayName": "DeepHermes-3 Mistral 24B (Preview)", + "metadata": { + "lastUpdated": "2025-05-10", + "openWeights": false, + "releaseDate": "2025-05-10" + } + } + ] + }, + { + "id": "nano-gpt/dmind-1", + "provider": "nano-gpt", + "model": "dmind-1", + "displayName": "DMind-1", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/dmind/dmind-1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "dmind/dmind-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DMind-1" + ], + "families": [ + "gpt" + ], + "releaseDate": "2025-06-01", + "lastUpdated": "2025-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "dmind/dmind-1", + "modelKey": "dmind/dmind-1", + "displayName": "DMind-1", + "family": "gpt", + "metadata": { + "lastUpdated": "2025-06-01", + "openWeights": false, + "releaseDate": "2025-06-01" + } + } + ] + }, + { + "id": "nano-gpt/dmind-1-mini", + "provider": "nano-gpt", + "model": "dmind-1-mini", + "displayName": "DMind-1-Mini", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/dmind/dmind-1-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "dmind/dmind-1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DMind-1-Mini" + ], + "families": [ + "gpt" + ], + "releaseDate": "2025-06-01", + "lastUpdated": "2025-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "dmind/dmind-1-mini", + "modelKey": "dmind/dmind-1-mini", + "displayName": "DMind-1-Mini", + "family": "gpt", + "metadata": { + "lastUpdated": "2025-06-01", + "openWeights": false, + "releaseDate": "2025-06-01" + } + } + ] + }, + { + "id": "nano-gpt/dolphin-2.9.2-qwen2-72b", + "provider": "nano-gpt", + "model": "dolphin-2.9.2-qwen2-72b", + "displayName": "Dolphin 72b", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/cognitivecomputations/dolphin-2.9.2-qwen2-72b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "cognitivecomputations/dolphin-2.9.2-qwen2-72b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Dolphin 72b" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-02-27", + "lastUpdated": "2025-02-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "cognitivecomputations/dolphin-2.9.2-qwen2-72b", + "modelKey": "cognitivecomputations/dolphin-2.9.2-qwen2-72b", + "displayName": "Dolphin 72b", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-02-27", + "openWeights": false, + "releaseDate": "2025-02-27" + } + } + ] + }, + { + "id": "nano-gpt/doubao-1-5-thinking-pro-250415", + "provider": "nano-gpt", + "model": "doubao-1-5-thinking-pro-250415", + "displayName": "Doubao 1.5 Thinking Pro", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/doubao-1-5-thinking-pro-250415" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "doubao-1-5-thinking-pro-250415", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao 1.5 Thinking Pro" + ], + "releaseDate": "2025-04-17", + "lastUpdated": "2025-04-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "doubao-1-5-thinking-pro-250415", + "modelKey": "doubao-1-5-thinking-pro-250415", + "displayName": "Doubao 1.5 Thinking Pro", + "metadata": { + "lastUpdated": "2025-04-17", + "openWeights": false, + "releaseDate": "2025-04-17" + } + } + ] + }, + { + "id": "nano-gpt/doubao-1-5-thinking-pro-vision-250415", + "provider": "nano-gpt", + "model": "doubao-1-5-thinking-pro-vision-250415", + "displayName": "Doubao 1.5 Thinking Pro Vision", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/doubao-1-5-thinking-pro-vision-250415" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "doubao-1-5-thinking-pro-vision-250415", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao 1.5 Thinking Pro Vision" + ], + "releaseDate": "2025-04-15", + "lastUpdated": "2025-04-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "doubao-1-5-thinking-pro-vision-250415", + "modelKey": "doubao-1-5-thinking-pro-vision-250415", + "displayName": "Doubao 1.5 Thinking Pro Vision", + "metadata": { + "lastUpdated": "2025-04-15", + "openWeights": false, + "releaseDate": "2025-04-15" + } + } + ] + }, + { + "id": "nano-gpt/doubao-1-5-thinking-vision-pro-250428", + "provider": "nano-gpt", + "model": "doubao-1-5-thinking-vision-pro-250428", + "displayName": "Doubao 1.5 Thinking Vision Pro", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/doubao-1-5-thinking-vision-pro-250428" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "doubao-1-5-thinking-vision-pro-250428", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 1.43 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao 1.5 Thinking Vision Pro" + ], + "releaseDate": "2025-05-15", + "lastUpdated": "2025-05-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "doubao-1-5-thinking-vision-pro-250428", + "modelKey": "doubao-1-5-thinking-vision-pro-250428", + "displayName": "Doubao 1.5 Thinking Vision Pro", + "metadata": { + "lastUpdated": "2025-05-15", + "openWeights": false, + "releaseDate": "2025-05-15" + } + } + ] + }, + { + "id": "nano-gpt/doubao-1.5-pro-256k", + "provider": "nano-gpt", + "model": "doubao-1.5-pro-256k", + "displayName": "Doubao 1.5 Pro 256k", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/doubao-1.5-pro-256k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "doubao-1.5-pro-256k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.799, + "output": 1.445 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao 1.5 Pro 256k" + ], + "releaseDate": "2025-03-12", + "lastUpdated": "2025-03-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "doubao-1.5-pro-256k", + "modelKey": "doubao-1.5-pro-256k", + "displayName": "Doubao 1.5 Pro 256k", + "metadata": { + "lastUpdated": "2025-03-12", + "openWeights": false, + "releaseDate": "2025-03-12" + } + } + ] + }, + { + "id": "nano-gpt/doubao-1.5-pro-32k", + "provider": "nano-gpt", + "model": "doubao-1.5-pro-32k", + "displayName": "Doubao 1.5 Pro 32k", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/doubao-1.5-pro-32k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "doubao-1.5-pro-32k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1343, + "output": 0.3349 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao 1.5 Pro 32k" + ], + "releaseDate": "2025-01-22", + "lastUpdated": "2025-01-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "doubao-1.5-pro-32k", + "modelKey": "doubao-1.5-pro-32k", + "displayName": "Doubao 1.5 Pro 32k", + "metadata": { + "lastUpdated": "2025-01-22", + "openWeights": false, + "releaseDate": "2025-01-22" + } + } + ] + }, + { + "id": "nano-gpt/doubao-1.5-vision-pro-32k", + "provider": "nano-gpt", + "model": "doubao-1.5-vision-pro-32k", + "displayName": "Doubao 1.5 Vision Pro 32k", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/doubao-1.5-vision-pro-32k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "doubao-1.5-vision-pro-32k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.459, + "output": 1.377 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao 1.5 Vision Pro 32k" + ], + "releaseDate": "2025-01-22", + "lastUpdated": "2025-01-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "doubao-1.5-vision-pro-32k", + "modelKey": "doubao-1.5-vision-pro-32k", + "displayName": "Doubao 1.5 Vision Pro 32k", + "metadata": { + "lastUpdated": "2025-01-22", + "openWeights": false, + "releaseDate": "2025-01-22" + } + } + ] + }, + { + "id": "nano-gpt/doubao-seed-1-6-250615", + "provider": "nano-gpt", + "model": "doubao-seed-1-6-250615", + "displayName": "Doubao Seed 1.6", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/doubao-seed-1-6-250615" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "doubao-seed-1-6-250615", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.204, + "output": 0.51 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao Seed 1.6" + ], + "releaseDate": "2025-06-15", + "lastUpdated": "2025-06-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "doubao-seed-1-6-250615", + "modelKey": "doubao-seed-1-6-250615", + "displayName": "Doubao Seed 1.6", + "metadata": { + "lastUpdated": "2025-06-15", + "openWeights": false, + "releaseDate": "2025-06-15" + } + } + ] + }, + { + "id": "nano-gpt/doubao-seed-1-6-flash-250615", + "provider": "nano-gpt", + "model": "doubao-seed-1-6-flash-250615", + "displayName": "Doubao Seed 1.6 Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/doubao-seed-1-6-flash-250615" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "doubao-seed-1-6-flash-250615", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0374, + "output": 0.374 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao Seed 1.6 Flash" + ], + "releaseDate": "2025-06-15", + "lastUpdated": "2025-06-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "doubao-seed-1-6-flash-250615", + "modelKey": "doubao-seed-1-6-flash-250615", + "displayName": "Doubao Seed 1.6 Flash", + "metadata": { + "lastUpdated": "2025-06-15", + "openWeights": false, + "releaseDate": "2025-06-15" + } + } + ] + }, + { + "id": "nano-gpt/doubao-seed-1-6-thinking-250615", + "provider": "nano-gpt", + "model": "doubao-seed-1-6-thinking-250615", + "displayName": "Doubao Seed 1.6 Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/doubao-seed-1-6-thinking-250615" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "doubao-seed-1-6-thinking-250615", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.204, + "output": 2.04 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao Seed 1.6 Thinking" + ], + "releaseDate": "2025-06-15", + "lastUpdated": "2025-06-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "doubao-seed-1-6-thinking-250615", + "modelKey": "doubao-seed-1-6-thinking-250615", + "displayName": "Doubao Seed 1.6 Thinking", + "metadata": { + "lastUpdated": "2025-06-15", + "openWeights": false, + "releaseDate": "2025-06-15" + } + } + ] + }, + { + "id": "nano-gpt/doubao-seed-1-8-251215", + "provider": "nano-gpt", + "model": "doubao-seed-1-8-251215", + "displayName": "Doubao Seed 1.8", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/doubao-seed-1-8-251215" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "doubao-seed-1-8-251215", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.612, + "output": 6.12 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao Seed 1.8" + ], + "releaseDate": "2025-12-15", + "lastUpdated": "2025-12-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "doubao-seed-1-8-251215", + "modelKey": "doubao-seed-1-8-251215", + "displayName": "Doubao Seed 1.8", + "metadata": { + "lastUpdated": "2025-12-15", + "openWeights": false, + "releaseDate": "2025-12-15" + } + } + ] + }, + { + "id": "nano-gpt/doubao-seed-2-0-code-preview-260215", + "provider": "nano-gpt", + "model": "doubao-seed-2-0-code-preview-260215", + "displayName": "Doubao Seed 2.0 Code Preview", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/doubao-seed-2-0-code-preview-260215" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "doubao-seed-2-0-code-preview-260215", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.782, + "output": 3.893 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao Seed 2.0 Code Preview" + ], + "releaseDate": "2026-02-14", + "lastUpdated": "2026-02-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "doubao-seed-2-0-code-preview-260215", + "modelKey": "doubao-seed-2-0-code-preview-260215", + "displayName": "Doubao Seed 2.0 Code Preview", + "metadata": { + "lastUpdated": "2026-02-14", + "openWeights": false, + "releaseDate": "2026-02-14" + } + } + ] + }, + { + "id": "nano-gpt/doubao-seed-2-0-lite-260215", + "provider": "nano-gpt", + "model": "doubao-seed-2-0-lite-260215", + "displayName": "Doubao Seed 2.0 Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/doubao-seed-2-0-lite-260215" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "doubao-seed-2-0-lite-260215", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1462, + "output": 0.8738 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao Seed 2.0 Lite" + ], + "releaseDate": "2026-02-14", + "lastUpdated": "2026-02-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "doubao-seed-2-0-lite-260215", + "modelKey": "doubao-seed-2-0-lite-260215", + "displayName": "Doubao Seed 2.0 Lite", + "metadata": { + "lastUpdated": "2026-02-14", + "openWeights": false, + "releaseDate": "2026-02-14" + } + } + ] + }, + { + "id": "nano-gpt/doubao-seed-2-0-mini-260215", + "provider": "nano-gpt", + "model": "doubao-seed-2-0-mini-260215", + "displayName": "Doubao Seed 2.0 Mini", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/doubao-seed-2-0-mini-260215" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "doubao-seed-2-0-mini-260215", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0493, + "output": 0.4845 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao Seed 2.0 Mini" + ], + "releaseDate": "2026-02-14", + "lastUpdated": "2026-02-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "doubao-seed-2-0-mini-260215", + "modelKey": "doubao-seed-2-0-mini-260215", + "displayName": "Doubao Seed 2.0 Mini", + "metadata": { + "lastUpdated": "2026-02-14", + "openWeights": false, + "releaseDate": "2026-02-14" + } + } + ] + }, + { + "id": "nano-gpt/doubao-seed-2-0-pro-260215", + "provider": "nano-gpt", + "model": "doubao-seed-2-0-pro-260215", + "displayName": "Doubao Seed 2.0 Pro", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/doubao-seed-2-0-pro-260215" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "doubao-seed-2-0-pro-260215", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.782, + "output": 3.876 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao Seed 2.0 Pro" + ], + "releaseDate": "2026-02-14", + "lastUpdated": "2026-02-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "doubao-seed-2-0-pro-260215", + "modelKey": "doubao-seed-2-0-pro-260215", + "displayName": "Doubao Seed 2.0 Pro", + "metadata": { + "lastUpdated": "2026-02-14", + "openWeights": false, + "releaseDate": "2026-02-14" + } + } + ] + }, + { + "id": "nano-gpt/dracarys-72b-instruct", + "provider": "nano-gpt", + "model": "dracarys-72b-instruct", + "displayName": "Llama 3.1 70B Dracarys 2", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/abacusai/Dracarys-72B-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "abacusai/Dracarys-72B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49299999999999994, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 70B Dracarys 2" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-08-02", + "lastUpdated": "2025-08-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "abacusai/Dracarys-72B-Instruct", + "modelKey": "abacusai/Dracarys-72B-Instruct", + "displayName": "Llama 3.1 70B Dracarys 2", + "family": "llama", + "metadata": { + "lastUpdated": "2025-08-02", + "openWeights": false, + "releaseDate": "2025-08-02" + } + } + ] + }, + { + "id": "nano-gpt/ernie-4.5-8k-preview", + "provider": "nano-gpt", + "model": "ernie-4.5-8k-preview", + "displayName": "Ernie 4.5 8k Preview", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/ernie-4.5-8k-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 8000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "ernie-4.5-8k-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.66, + "output": 2.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ernie 4.5 8k Preview" + ], + "releaseDate": "2025-03-25", + "lastUpdated": "2025-03-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "ernie-4.5-8k-preview", + "modelKey": "ernie-4.5-8k-preview", + "displayName": "Ernie 4.5 8k Preview", + "metadata": { + "lastUpdated": "2025-03-25", + "openWeights": false, + "releaseDate": "2025-03-25" + } + } + ] + }, + { + "id": "nano-gpt/ernie-4.5-turbo-128k", + "provider": "nano-gpt", + "model": "ernie-4.5-turbo-128k", + "displayName": "Ernie 4.5 Turbo 128k", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/ernie-4.5-turbo-128k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "ernie-4.5-turbo-128k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.132, + "output": 0.55 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ernie 4.5 Turbo 128k" + ], + "releaseDate": "2025-05-08", + "lastUpdated": "2025-05-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "ernie-4.5-turbo-128k", + "modelKey": "ernie-4.5-turbo-128k", + "displayName": "Ernie 4.5 Turbo 128k", + "metadata": { + "lastUpdated": "2025-05-08", + "openWeights": false, + "releaseDate": "2025-05-08" + } + } + ] + }, + { + "id": "nano-gpt/ernie-4.5-turbo-vl-32k", + "provider": "nano-gpt", + "model": "ernie-4.5-turbo-vl-32k", + "displayName": "Ernie 4.5 Turbo VL 32k", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/ernie-4.5-turbo-vl-32k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "ernie-4.5-turbo-vl-32k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.495, + "output": 1.43 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ernie 4.5 Turbo VL 32k" + ], + "releaseDate": "2025-05-08", + "lastUpdated": "2025-05-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "ernie-4.5-turbo-vl-32k", + "modelKey": "ernie-4.5-turbo-vl-32k", + "displayName": "Ernie 4.5 Turbo VL 32k", + "metadata": { + "lastUpdated": "2025-05-08", + "openWeights": false, + "releaseDate": "2025-05-08" + } + } + ] + }, + { + "id": "nano-gpt/ernie-4.5-vl-28b-a3b", + "provider": "nano-gpt", + "model": "ernie-4.5-vl-28b-a3b", + "displayName": "ERNIE 4.5 VL 28B", + "family": "ernie", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/baidu/ernie-4.5-vl-28b-a3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "baidu/ernie-4.5-vl-28b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13999999999999999, + "output": 0.5599999999999999 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ERNIE 4.5 VL 28B" + ], + "families": [ + "ernie" + ], + "releaseDate": "2025-06-30", + "lastUpdated": "2025-06-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "baidu/ernie-4.5-vl-28b-a3b", + "modelKey": "baidu/ernie-4.5-vl-28b-a3b", + "displayName": "ERNIE 4.5 VL 28B", + "family": "ernie", + "metadata": { + "lastUpdated": "2025-06-30", + "openWeights": false, + "releaseDate": "2025-06-30" + } + } + ] + }, + { + "id": "nano-gpt/ernie-5.0-thinking-preview", + "provider": "nano-gpt", + "model": "ernie-5.0-thinking-preview", + "displayName": "Ernie 5.0 Thinking Preview", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/ernie-5.0-thinking-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "ernie-5.0-thinking-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.1, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ernie 5.0 Thinking Preview" + ], + "releaseDate": "2025-11-18", + "lastUpdated": "2025-11-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "ernie-5.0-thinking-preview", + "modelKey": "ernie-5.0-thinking-preview", + "displayName": "Ernie 5.0 Thinking Preview", + "metadata": { + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18" + } + } + ] + }, + { + "id": "nano-gpt/ernie-5.1", + "provider": "nano-gpt", + "model": "ernie-5.1", + "displayName": "ERNIE 5.1", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/ernie-5.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 119000, + "inputTokens": 119000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "ernie-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.75, + "input": 0.75, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ERNIE 5.1" + ], + "releaseDate": "2026-05-10", + "lastUpdated": "2026-05-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "ernie-5.1", + "modelKey": "ernie-5.1", + "displayName": "ERNIE 5.1", + "metadata": { + "lastUpdated": "2026-05-10", + "openWeights": false, + "releaseDate": "2026-05-10" + } + } + ] + }, + { + "id": "nano-gpt/ernie-5.1:thinking", + "provider": "nano-gpt", + "model": "ernie-5.1:thinking", + "displayName": "ERNIE 5.1 Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/ernie-5.1:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 119000, + "inputTokens": 119000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "ernie-5.1:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.75, + "input": 0.75, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ERNIE 5.1 Thinking" + ], + "releaseDate": "2026-05-10", + "lastUpdated": "2026-05-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "ernie-5.1:thinking", + "modelKey": "ernie-5.1:thinking", + "displayName": "ERNIE 5.1 Thinking", + "metadata": { + "lastUpdated": "2026-05-10", + "openWeights": false, + "releaseDate": "2026-05-10" + } + } + ] + }, + { + "id": "nano-gpt/ernie-x1-32k", + "provider": "nano-gpt", + "model": "ernie-x1-32k", + "displayName": "Ernie X1 32k", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/ernie-x1-32k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "ernie-x1-32k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.33, + "output": 1.32 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ernie X1 32k" + ], + "releaseDate": "2025-05-08", + "lastUpdated": "2025-05-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "ernie-x1-32k", + "modelKey": "ernie-x1-32k", + "displayName": "Ernie X1 32k", + "metadata": { + "lastUpdated": "2025-05-08", + "openWeights": false, + "releaseDate": "2025-05-08" + } + } + ] + }, + { + "id": "nano-gpt/ernie-x1-32k-preview", + "provider": "nano-gpt", + "model": "ernie-x1-32k-preview", + "displayName": "Ernie X1 32k", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/ernie-x1-32k-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "ernie-x1-32k-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.33, + "output": 1.32 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ernie X1 32k" + ], + "releaseDate": "2025-04-03", + "lastUpdated": "2025-04-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "ernie-x1-32k-preview", + "modelKey": "ernie-x1-32k-preview", + "displayName": "Ernie X1 32k", + "metadata": { + "lastUpdated": "2025-04-03", + "openWeights": false, + "releaseDate": "2025-04-03" + } + } + ] + }, + { + "id": "nano-gpt/ernie-x1-turbo-32k", + "provider": "nano-gpt", + "model": "ernie-x1-turbo-32k", + "displayName": "Ernie X1 Turbo 32k", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/ernie-x1-turbo-32k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "ernie-x1-turbo-32k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.165, + "output": 0.66 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ernie X1 Turbo 32k" + ], + "releaseDate": "2025-05-08", + "lastUpdated": "2025-05-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "ernie-x1-turbo-32k", + "modelKey": "ernie-x1-turbo-32k", + "displayName": "Ernie X1 Turbo 32k", + "metadata": { + "lastUpdated": "2025-05-08", + "openWeights": false, + "releaseDate": "2025-05-08" + } + } + ] + }, + { + "id": "nano-gpt/ernie-x1.1-preview", + "provider": "nano-gpt", + "model": "ernie-x1.1-preview", + "displayName": "ERNIE X1.1", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/ernie-x1.1-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 64000, + "inputTokens": 64000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "ernie-x1.1-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ERNIE X1.1" + ], + "releaseDate": "2025-09-10", + "lastUpdated": "2025-09-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "ernie-x1.1-preview", + "modelKey": "ernie-x1.1-preview", + "displayName": "ERNIE X1.1", + "metadata": { + "lastUpdated": "2025-09-10", + "openWeights": false, + "releaseDate": "2025-09-10" + } + } + ] + }, + { + "id": "nano-gpt/eva-llama-3.33-70b-v0.0", + "provider": "nano-gpt", + "model": "eva-llama-3.33-70b-v0.0", + "displayName": "EVA Llama 3.33 70B", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.006, + "output": 2.006 + } + } + ] + }, + "metadata": { + "displayNames": [ + "EVA Llama 3.33 70B" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-07-26", + "lastUpdated": "2025-07-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.0", + "modelKey": "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.0", + "displayName": "EVA Llama 3.33 70B", + "family": "llama", + "metadata": { + "lastUpdated": "2025-07-26", + "openWeights": false, + "releaseDate": "2025-07-26" + } + } + ] + }, + { + "id": "nano-gpt/eva-llama-3.33-70b-v0.1", + "provider": "nano-gpt", + "model": "eva-llama-3.33-70b-v0.1", + "displayName": "EVA-LLaMA-3.33-70B-v0.1", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.006, + "output": 2.006 + } + } + ] + }, + "metadata": { + "displayNames": [ + "EVA-LLaMA-3.33-70B-v0.1" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-09-25", + "lastUpdated": "2025-09-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.1", + "modelKey": "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.1", + "displayName": "EVA-LLaMA-3.33-70B-v0.1", + "family": "llama", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + } + ] + }, + { + "id": "nano-gpt/eva-qwen2.5-32b-v0.2", + "provider": "nano-gpt", + "model": "eva-qwen2.5-32b-v0.2", + "displayName": "EVA-Qwen2.5-32B-v0.2", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/EVA-UNIT-01/EVA-Qwen2.5-32B-v0.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "EVA-UNIT-01/EVA-Qwen2.5-32B-v0.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7989999999999999, + "output": 0.7989999999999999 + } + } + ] + }, + "metadata": { + "displayNames": [ + "EVA-Qwen2.5-32B-v0.2" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-07-26", + "lastUpdated": "2025-07-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "EVA-UNIT-01/EVA-Qwen2.5-32B-v0.2", + "modelKey": "EVA-UNIT-01/EVA-Qwen2.5-32B-v0.2", + "displayName": "EVA-Qwen2.5-32B-v0.2", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-07-26", + "openWeights": false, + "releaseDate": "2025-07-26" + } + } + ] + }, + { + "id": "nano-gpt/eva-qwen2.5-72b-v0.2", + "provider": "nano-gpt", + "model": "eva-qwen2.5-72b-v0.2", + "displayName": "EVA-Qwen2.5-72B-v0.2", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/EVA-UNIT-01/EVA-Qwen2.5-72B-v0.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "EVA-UNIT-01/EVA-Qwen2.5-72B-v0.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7989999999999999, + "output": 0.7989999999999999 + } + } + ] + }, + "metadata": { + "displayNames": [ + "EVA-Qwen2.5-72B-v0.2" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-09-25", + "lastUpdated": "2025-09-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "EVA-UNIT-01/EVA-Qwen2.5-72B-v0.2", + "modelKey": "EVA-UNIT-01/EVA-Qwen2.5-72B-v0.2", + "displayName": "EVA-Qwen2.5-72B-v0.2", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + } + ] + }, + { + "id": "nano-gpt/exa-answer", + "provider": "nano-gpt", + "model": "exa-answer", + "displayName": "Exa (Answer)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/exa-answer" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "exa-answer", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Exa (Answer)" + ], + "releaseDate": "2025-06-04", + "lastUpdated": "2025-06-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "exa-answer", + "modelKey": "exa-answer", + "displayName": "Exa (Answer)", + "metadata": { + "lastUpdated": "2025-06-04", + "openWeights": false, + "releaseDate": "2025-06-04" + } + } + ] + }, + { + "id": "nano-gpt/exa-research", + "provider": "nano-gpt", + "model": "exa-research", + "displayName": "Exa (Research)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/exa-research" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "exa-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Exa (Research)" + ], + "releaseDate": "2025-06-04", + "lastUpdated": "2025-06-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "exa-research", + "modelKey": "exa-research", + "displayName": "Exa (Research)", + "metadata": { + "lastUpdated": "2025-06-04", + "openWeights": false, + "releaseDate": "2025-06-04" + } + } + ] + }, + { + "id": "nano-gpt/exa-research-pro", + "provider": "nano-gpt", + "model": "exa-research-pro", + "displayName": "Exa (Research Pro)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/exa-research-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "exa-research-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Exa (Research Pro)" + ], + "releaseDate": "2025-06-04", + "lastUpdated": "2025-06-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "exa-research-pro", + "modelKey": "exa-research-pro", + "displayName": "Exa (Research Pro)", + "metadata": { + "lastUpdated": "2025-06-04", + "openWeights": false, + "releaseDate": "2025-06-04" + } + } + ] + }, + { + "id": "nano-gpt/fastgpt", + "provider": "nano-gpt", + "model": "fastgpt", + "displayName": "Web Answer", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/fastgpt" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "fastgpt", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 7.5, + "output": 7.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Web Answer" + ], + "releaseDate": "2023-08-01", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "fastgpt", + "modelKey": "fastgpt", + "displayName": "Web Answer", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2023-08-01" + } + } + ] + }, + { + "id": "nano-gpt/gemma-3-12b-it", + "provider": "nano-gpt", + "model": "gemma-3-12b-it", + "displayName": "Gemma 3 12B IT", + "family": "unsloth", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/unsloth/gemma-3-12b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "unsloth/gemma-3-12b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.272, + "output": 0.272 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 3 12B IT" + ], + "families": [ + "unsloth" + ], + "releaseDate": "2025-03-10", + "lastUpdated": "2025-03-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "unsloth/gemma-3-12b-it", + "modelKey": "unsloth/gemma-3-12b-it", + "displayName": "Gemma 3 12B IT", + "family": "unsloth", + "metadata": { + "lastUpdated": "2025-03-10", + "openWeights": false, + "releaseDate": "2025-03-10" + } + } + ] + }, + { + "id": "nano-gpt/gemma-3-27b-it", + "provider": "nano-gpt", + "model": "gemma-3-27b-it", + "displayName": "Gemma 3 27B TEE", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TEE/gemma-3-27b-it", + "nano-gpt/unsloth/gemma-3-27b-it" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "outputTokens": 96000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/gemma-3-27b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "unsloth/gemma-3-27b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2992, + "output": 0.2992 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 3 27B IT", + "Gemma 3 27B TEE" + ], + "families": [ + "gemma", + "unsloth" + ], + "releaseDate": "2025-03-10", + "lastUpdated": "2025-03-10", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/gemma-3-27b-it", + "modelKey": "TEE/gemma-3-27b-it", + "displayName": "Gemma 3 27B TEE", + "family": "gemma", + "metadata": { + "lastUpdated": "2025-03-10", + "openWeights": false, + "releaseDate": "2025-03-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "unsloth/gemma-3-27b-it", + "modelKey": "unsloth/gemma-3-27b-it", + "displayName": "Gemma 3 27B IT", + "family": "unsloth", + "metadata": { + "lastUpdated": "2025-03-10", + "openWeights": false, + "releaseDate": "2025-03-10" + } + } + ] + }, + { + "id": "nano-gpt/gemma-3-4b-it", + "provider": "nano-gpt", + "model": "gemma-3-4b-it", + "displayName": "Gemma 3 4B IT", + "family": "unsloth", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/unsloth/gemma-3-4b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "unsloth/gemma-3-4b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2006, + "output": 0.2006 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 3 4B IT" + ], + "families": [ + "unsloth" + ], + "releaseDate": "2025-03-10", + "lastUpdated": "2025-03-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "unsloth/gemma-3-4b-it", + "modelKey": "unsloth/gemma-3-4b-it", + "displayName": "Gemma 3 4B IT", + "family": "unsloth", + "metadata": { + "lastUpdated": "2025-03-10", + "openWeights": false, + "releaseDate": "2025-03-10" + } + } + ] + }, + { + "id": "nano-gpt/gemma-4-26b-a4b-uncensored", + "provider": "nano-gpt", + "model": "gemma-4-26b-a4b-uncensored", + "displayName": "Gemma 4 26B A4B Uncensored TEE", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TEE/gemma-4-26b-a4b-uncensored" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/gemma-4-26b-a4b-uncensored", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 26B A4B Uncensored TEE" + ], + "releaseDate": "2026-05-23", + "lastUpdated": "2026-05-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/gemma-4-26b-a4b-uncensored", + "modelKey": "TEE/gemma-4-26b-a4b-uncensored", + "displayName": "Gemma 4 26B A4B Uncensored TEE", + "metadata": { + "lastUpdated": "2026-05-23", + "openWeights": false, + "releaseDate": "2026-05-23" + } + } + ] + }, + { + "id": "nano-gpt/gemma-4-31b-claude-4.6-opus-reasoning-distilled", + "provider": "nano-gpt", + "model": "gemma-4-31b-claude-4.6-opus-reasoning-distilled", + "displayName": "Gemma 4 31B Claude 4.6 Opus Reasoning Distilled", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Gemma-4-31B-Claude-4.6-Opus-Reasoning-Distilled" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Gemma-4-31B-Claude-4.6-Opus-Reasoning-Distilled", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0306, + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B Claude 4.6 Opus Reasoning Distilled" + ], + "releaseDate": "2026-05-01", + "lastUpdated": "2026-05-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Gemma-4-31B-Claude-4.6-Opus-Reasoning-Distilled", + "modelKey": "Gemma-4-31B-Claude-4.6-Opus-Reasoning-Distilled", + "displayName": "Gemma 4 31B Claude 4.6 Opus Reasoning Distilled", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-05-01" + } + } + ] + }, + { + "id": "nano-gpt/gemma-4-31b-cognitive-unshackled", + "provider": "nano-gpt", + "model": "gemma-4-31b-cognitive-unshackled", + "displayName": "Gemma 4 31B Cognitive Unshackled", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Gemma-4-31B-Cognitive-Unshackled" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Gemma-4-31B-Cognitive-Unshackled", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B Cognitive Unshackled" + ], + "releaseDate": "2026-05-01", + "lastUpdated": "2026-05-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Gemma-4-31B-Cognitive-Unshackled", + "modelKey": "Gemma-4-31B-Cognitive-Unshackled", + "displayName": "Gemma 4 31B Cognitive Unshackled", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-05-01" + } + } + ] + }, + { + "id": "nano-gpt/gemma-4-31b-darkidol", + "provider": "nano-gpt", + "model": "gemma-4-31b-darkidol", + "displayName": "Gemma 4 31B DarkIdol", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Gemma-4-31B-DarkIdol" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Gemma-4-31B-DarkIdol", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B DarkIdol" + ], + "releaseDate": "2026-05-01", + "lastUpdated": "2026-05-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Gemma-4-31B-DarkIdol", + "modelKey": "Gemma-4-31B-DarkIdol", + "displayName": "Gemma 4 31B DarkIdol", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-05-01" + } + } + ] + }, + { + "id": "nano-gpt/gemma-4-31b-fabled", + "provider": "nano-gpt", + "model": "gemma-4-31b-fabled", + "displayName": "Gemma 4 31B Fabled", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/gemma-4-31B-Fabled" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemma-4-31B-Fabled", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B Fabled" + ], + "releaseDate": "2026-05-02", + "lastUpdated": "2026-05-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemma-4-31B-Fabled", + "modelKey": "gemma-4-31B-Fabled", + "displayName": "Gemma 4 31B Fabled", + "metadata": { + "lastUpdated": "2026-05-02", + "openWeights": false, + "releaseDate": "2026-05-02" + } + } + ] + }, + { + "id": "nano-gpt/gemma-4-31b-garnet", + "provider": "nano-gpt", + "model": "gemma-4-31b-garnet", + "displayName": "Gemma 4 31B Garnet", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/gemma-4-31B-Garnet" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemma-4-31B-Garnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B Garnet" + ], + "releaseDate": "2026-05-02", + "lastUpdated": "2026-05-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemma-4-31B-Garnet", + "modelKey": "gemma-4-31B-Garnet", + "displayName": "Gemma 4 31B Garnet", + "metadata": { + "lastUpdated": "2026-05-02", + "openWeights": false, + "releaseDate": "2026-05-02" + } + } + ] + }, + { + "id": "nano-gpt/gemma-4-31b-garnetv2", + "provider": "nano-gpt", + "model": "gemma-4-31b-garnetv2", + "displayName": "Gemma 4 31B Garnet V2", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Gemma-4-31B-GarnetV2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Gemma-4-31B-GarnetV2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B Garnet V2" + ], + "releaseDate": "2026-05-01", + "lastUpdated": "2026-05-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Gemma-4-31B-GarnetV2", + "modelKey": "Gemma-4-31B-GarnetV2", + "displayName": "Gemma 4 31B Garnet V2", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-05-01" + } + } + ] + }, + { + "id": "nano-gpt/gemma-4-31b-gemopus", + "provider": "nano-gpt", + "model": "gemma-4-31b-gemopus", + "displayName": "Gemma 4 31B Gemopus", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Gemma-4-31B-Gemopus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Gemma-4-31B-Gemopus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B Gemopus" + ], + "releaseDate": "2026-05-01", + "lastUpdated": "2026-05-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Gemma-4-31B-Gemopus", + "modelKey": "Gemma-4-31B-Gemopus", + "displayName": "Gemma 4 31B Gemopus", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-05-01" + } + } + ] + }, + { + "id": "nano-gpt/gemma-4-31b-it", + "provider": "nano-gpt", + "model": "gemma-4-31b-it", + "displayName": "Gemma 4 31B IT", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Gemma-4-31B-it", + "nano-gpt/TEE/gemma-4-31b-it" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Gemma-4-31B-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/gemma-4-31b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.46 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B IT", + "Gemma 4 31B IT TEE" + ], + "releaseDate": "2026-04-09", + "lastUpdated": "2026-04-09", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Gemma-4-31B-it", + "modelKey": "Gemma-4-31B-it", + "displayName": "Gemma 4 31B IT", + "metadata": { + "lastUpdated": "2026-04-09", + "openWeights": false, + "releaseDate": "2026-04-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/gemma-4-31b-it", + "modelKey": "TEE/gemma-4-31b-it", + "displayName": "Gemma 4 31B IT TEE", + "metadata": { + "lastUpdated": "2026-05-26", + "openWeights": false, + "releaseDate": "2026-05-26" + } + } + ] + }, + { + "id": "nano-gpt/gemma-4-31b-k1-v5", + "provider": "nano-gpt", + "model": "gemma-4-31b-k1-v5", + "displayName": "Gemma 4 31B K1 v5", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/gemma-4-31B-K1-v5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemma-4-31B-K1-v5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B K1 v5" + ], + "releaseDate": "2026-05-02", + "lastUpdated": "2026-05-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemma-4-31B-K1-v5", + "modelKey": "gemma-4-31B-K1-v5", + "displayName": "Gemma 4 31B K1 v5", + "metadata": { + "lastUpdated": "2026-05-02", + "openWeights": false, + "releaseDate": "2026-05-02" + } + } + ] + }, + { + "id": "nano-gpt/gemma-4-31b-larkspur-v0.5", + "provider": "nano-gpt", + "model": "gemma-4-31b-larkspur-v0.5", + "displayName": "Gemma 4 31B Larkspur v0.5", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/gemma-4-31B-Larkspur-v0.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemma-4-31B-Larkspur-v0.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B Larkspur v0.5" + ], + "releaseDate": "2026-05-02", + "lastUpdated": "2026-05-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemma-4-31B-Larkspur-v0.5", + "modelKey": "gemma-4-31B-Larkspur-v0.5", + "displayName": "Gemma 4 31B Larkspur v0.5", + "metadata": { + "lastUpdated": "2026-05-02", + "openWeights": false, + "releaseDate": "2026-05-02" + } + } + ] + }, + { + "id": "nano-gpt/gemma-4-31b-meromero", + "provider": "nano-gpt", + "model": "gemma-4-31b-meromero", + "displayName": "Gemma 4 31B MeroMero", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/gemma-4-31B-MeroMero" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "gemma-4-31B-MeroMero", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B MeroMero" + ], + "releaseDate": "2026-05-02", + "lastUpdated": "2026-05-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "gemma-4-31B-MeroMero", + "modelKey": "gemma-4-31B-MeroMero", + "displayName": "Gemma 4 31B MeroMero", + "metadata": { + "lastUpdated": "2026-05-02", + "openWeights": false, + "releaseDate": "2026-05-02" + } + } + ] + }, + { + "id": "nano-gpt/gemma-4-31b-musica-v1", + "provider": "nano-gpt", + "model": "gemma-4-31b-musica-v1", + "displayName": "Gemma 4 31B Musica v1", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Gemma-4-31B-Musica-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Gemma-4-31B-Musica-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B Musica v1" + ], + "releaseDate": "2026-05-01", + "lastUpdated": "2026-05-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Gemma-4-31B-Musica-v1", + "modelKey": "Gemma-4-31B-Musica-v1", + "displayName": "Gemma 4 31B Musica v1", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-05-01" + } + } + ] + }, + { + "id": "nano-gpt/gemma-4-31b-queen", + "provider": "nano-gpt", + "model": "gemma-4-31b-queen", + "displayName": "Gemma 4 31B Queen", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Gemma-4-31B-Queen" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Gemma-4-31B-Queen", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B Queen" + ], + "releaseDate": "2026-05-01", + "lastUpdated": "2026-05-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Gemma-4-31B-Queen", + "modelKey": "Gemma-4-31B-Queen", + "displayName": "Gemma 4 31B Queen", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-05-01" + } + } + ] + }, + { + "id": "nano-gpt/gemma4-31b", + "provider": "nano-gpt", + "model": "gemma4-31b", + "displayName": "Gemma 4 31B", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TEE/gemma4-31b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/gemma4-31b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B" + ], + "releaseDate": "2026-04-04", + "lastUpdated": "2026-04-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/gemma4-31b", + "modelKey": "TEE/gemma4-31b", + "displayName": "Gemma 4 31B", + "metadata": { + "lastUpdated": "2026-04-04", + "openWeights": false, + "releaseDate": "2026-04-04" + } + } + ] + }, + { + "id": "nano-gpt/gemma4-31b:thinking", + "provider": "nano-gpt", + "model": "gemma4-31b:thinking", + "displayName": "Gemma 4 31B Thinking TEE", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TEE/gemma4-31b:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/gemma4-31b:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B Thinking TEE" + ], + "releaseDate": "2026-05-02", + "lastUpdated": "2026-05-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/gemma4-31b:thinking", + "modelKey": "TEE/gemma4-31b:thinking", + "displayName": "Gemma 4 31B Thinking TEE", + "metadata": { + "lastUpdated": "2026-05-02", + "openWeights": false, + "releaseDate": "2026-05-02" + } + } + ] + }, + { + "id": "nano-gpt/granite-4.1-8b", + "provider": "nano-gpt", + "model": "granite-4.1-8b", + "displayName": "Granite 4.1 8B", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/ibm-granite/granite-4.1-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "ibm-granite/granite-4.1-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.05, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Granite 4.1 8B" + ], + "releaseDate": "2026-04-29", + "lastUpdated": "2026-04-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "ibm-granite/granite-4.1-8b", + "modelKey": "ibm-granite/granite-4.1-8b", + "displayName": "Granite 4.1 8B", + "metadata": { + "lastUpdated": "2026-04-29", + "openWeights": false, + "releaseDate": "2026-04-29" + } + } + ] + }, + { + "id": "nano-gpt/grayline-qwen3-8b", + "provider": "nano-gpt", + "model": "grayline-qwen3-8b", + "displayName": "Grayline Qwen3 8B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/soob3123/GrayLine-Qwen3-8B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "soob3123/GrayLine-Qwen3-8B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grayline Qwen3 8B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2025-09-25", + "lastUpdated": "2025-09-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "soob3123/GrayLine-Qwen3-8B", + "modelKey": "soob3123/GrayLine-Qwen3-8B", + "displayName": "Grayline Qwen3 8B", + "family": "qwen", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": false, + "releaseDate": "2025-09-25" + } + } + ] + }, + { + "id": "nano-gpt/hermes-3-llama-3.1-70b", + "provider": "nano-gpt", + "model": "hermes-3-llama-3.1-70b", + "displayName": "Hermes 3 70B", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/NousResearch/hermes-3-llama-3.1-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "NousResearch/hermes-3-llama-3.1-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.408, + "output": 0.408 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes 3 70B" + ], + "releaseDate": "2026-01-07", + "lastUpdated": "2026-01-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "NousResearch/hermes-3-llama-3.1-70b", + "modelKey": "NousResearch/hermes-3-llama-3.1-70b", + "displayName": "Hermes 3 70B", + "metadata": { + "lastUpdated": "2026-01-07", + "openWeights": false, + "releaseDate": "2026-01-07" + } + } + ] + }, + { + "id": "nano-gpt/hermes-4-405b", + "provider": "nano-gpt", + "model": "hermes-4-405b", + "displayName": "Hermes 4 Large", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/NousResearch/hermes-4-405b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "NousResearch/hermes-4-405b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes 4 Large" + ], + "releaseDate": "2025-08-26", + "lastUpdated": "2025-08-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "NousResearch/hermes-4-405b", + "modelKey": "NousResearch/hermes-4-405b", + "displayName": "Hermes 4 Large", + "metadata": { + "lastUpdated": "2025-08-26", + "openWeights": false, + "releaseDate": "2025-08-26" + } + } + ] + }, + { + "id": "nano-gpt/hermes-4-405b:thinking", + "provider": "nano-gpt", + "model": "hermes-4-405b:thinking", + "displayName": "Hermes 4 Large (Thinking)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/NousResearch/hermes-4-405b:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "NousResearch/hermes-4-405b:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes 4 Large (Thinking)" + ], + "releaseDate": "2024-01-01", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "NousResearch/hermes-4-405b:thinking", + "modelKey": "NousResearch/hermes-4-405b:thinking", + "displayName": "Hermes 4 Large (Thinking)", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + } + ] + }, + { + "id": "nano-gpt/hermes-4-70b", + "provider": "nano-gpt", + "model": "hermes-4-70b", + "displayName": "Hermes 4 Medium", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/NousResearch/hermes-4-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "NousResearch/hermes-4-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2006, + "output": 0.3995 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes 4 Medium" + ], + "releaseDate": "2025-07-03", + "lastUpdated": "2025-07-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "NousResearch/hermes-4-70b", + "modelKey": "NousResearch/hermes-4-70b", + "displayName": "Hermes 4 Medium", + "metadata": { + "lastUpdated": "2025-07-03", + "openWeights": false, + "releaseDate": "2025-07-03" + } + } + ] + }, + { + "id": "nano-gpt/hermes-4-70b:thinking", + "provider": "nano-gpt", + "model": "hermes-4-70b:thinking", + "displayName": "Hermes 4 (Thinking)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/NousResearch/Hermes-4-70B:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "NousResearch/Hermes-4-70B:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2006, + "output": 0.3995 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes 4 (Thinking)" + ], + "releaseDate": "2025-09-17", + "lastUpdated": "2025-09-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "NousResearch/Hermes-4-70B:thinking", + "modelKey": "NousResearch/Hermes-4-70B:thinking", + "displayName": "Hermes 4 (Thinking)", + "metadata": { + "lastUpdated": "2025-09-17", + "openWeights": false, + "releaseDate": "2025-09-17" + } + } + ] + }, + { + "id": "nano-gpt/hermes-high", + "provider": "nano-gpt", + "model": "hermes-high", + "displayName": "Hermes High", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/hermes-high" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "hermes-high", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4.998, + "output": 25.007 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes High" + ], + "releaseDate": "2026-05-11", + "lastUpdated": "2026-05-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "hermes-high", + "modelKey": "hermes-high", + "displayName": "Hermes High", + "metadata": { + "lastUpdated": "2026-05-11", + "openWeights": false, + "releaseDate": "2026-05-11" + } + } + ] + }, + { + "id": "nano-gpt/hermes-low", + "provider": "nano-gpt", + "model": "hermes-low", + "displayName": "Hermes Low", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/hermes-low" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "hermes-low", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes Low" + ], + "releaseDate": "2026-05-11", + "lastUpdated": "2026-05-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "hermes-low", + "modelKey": "hermes-low", + "displayName": "Hermes Low", + "metadata": { + "lastUpdated": "2026-05-11", + "openWeights": false, + "releaseDate": "2026-05-11" + } + } + ] + }, + { + "id": "nano-gpt/hermes-medium", + "provider": "nano-gpt", + "model": "hermes-medium", + "displayName": "Hermes Medium", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/hermes-medium" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "inputTokens": 204800, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "hermes-medium", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes Medium" + ], + "releaseDate": "2026-05-11", + "lastUpdated": "2026-05-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "hermes-medium", + "modelKey": "hermes-medium", + "displayName": "Hermes Medium", + "metadata": { + "lastUpdated": "2026-05-11", + "openWeights": false, + "releaseDate": "2026-05-11" + } + } + ] + }, + { + "id": "nano-gpt/holo3-35b-a3b", + "provider": "nano-gpt", + "model": "holo3-35b-a3b", + "displayName": "Holo3-35B-A3B", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/holo3-35b-a3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "holo3-35b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Holo3-35B-A3B" + ], + "releaseDate": "2024-01-01", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "holo3-35b-a3b", + "modelKey": "holo3-35b-a3b", + "displayName": "Holo3-35B-A3B", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "nano-gpt/holo3-35b-a3b:thinking", + "provider": "nano-gpt", + "model": "holo3-35b-a3b:thinking", + "displayName": "Holo3-35B-A3B Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/holo3-35b-a3b:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "holo3-35b-a3b:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Holo3-35B-A3B Thinking" + ], + "releaseDate": "2024-01-01", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "holo3-35b-a3b:thinking", + "modelKey": "holo3-35b-a3b:thinking", + "displayName": "Holo3-35B-A3B Thinking", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + } + ] + }, + { + "id": "nano-gpt/hunyuan-mt-7b", + "provider": "nano-gpt", + "model": "hunyuan-mt-7b", + "displayName": "Hunyuan MT 7B", + "family": "hunyuan", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/tencent/Hunyuan-MT-7B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "tencent/Hunyuan-MT-7B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 20 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hunyuan MT 7B" + ], + "families": [ + "hunyuan" + ], + "releaseDate": "2025-09-18", + "lastUpdated": "2025-09-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "tencent/Hunyuan-MT-7B", + "modelKey": "tencent/Hunyuan-MT-7B", + "displayName": "Hunyuan MT 7B", + "family": "hunyuan", + "metadata": { + "lastUpdated": "2025-09-18", + "openWeights": false, + "releaseDate": "2025-09-18" + } + } + ] + }, + { + "id": "nano-gpt/hunyuan-turbos-20250226", + "provider": "nano-gpt", + "model": "hunyuan-turbos-20250226", + "displayName": "Hunyuan Turbo S", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/hunyuan-turbos-20250226" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 24000, + "inputTokens": 24000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "hunyuan-turbos-20250226", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.187, + "output": 0.374 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hunyuan Turbo S" + ], + "releaseDate": "2025-02-27", + "lastUpdated": "2025-02-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "hunyuan-turbos-20250226", + "modelKey": "hunyuan-turbos-20250226", + "displayName": "Hunyuan Turbo S", + "metadata": { + "lastUpdated": "2025-02-27", + "openWeights": false, + "releaseDate": "2025-02-27" + } + } + ] + }, + { + "id": "nano-gpt/hy3-preview", + "provider": "nano-gpt", + "model": "hy3-preview", + "displayName": "Tencent: Hy3 preview", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/tencent/hy3-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "tencent/hy3-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.029, + "input": 0.066, + "output": 0.26 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Tencent: Hy3 preview" + ], + "releaseDate": "2026-04-23", + "lastUpdated": "2026-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "tencent/hy3-preview", + "modelKey": "tencent/hy3-preview", + "displayName": "Tencent: Hy3 preview", + "metadata": { + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + } + ] + }, + { + "id": "nano-gpt/inflection-3-pi", + "provider": "nano-gpt", + "model": "inflection-3-pi", + "displayName": "Inflection 3 Pi", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/inflection/inflection-3-pi" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 8000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "inflection/inflection-3-pi", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.499, + "output": 9.996 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Inflection 3 Pi" + ], + "families": [ + "gpt" + ], + "releaseDate": "2024-10-11", + "lastUpdated": "2024-10-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "inflection/inflection-3-pi", + "modelKey": "inflection/inflection-3-pi", + "displayName": "Inflection 3 Pi", + "family": "gpt", + "metadata": { + "lastUpdated": "2024-10-11", + "openWeights": false, + "releaseDate": "2024-10-11" + } + } + ] + }, + { + "id": "nano-gpt/inflection-3-productivity", + "provider": "nano-gpt", + "model": "inflection-3-productivity", + "displayName": "Inflection 3 Productivity", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/inflection/inflection-3-productivity" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 8000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "inflection/inflection-3-productivity", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.499, + "output": 9.996 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Inflection 3 Productivity" + ], + "families": [ + "gpt" + ], + "releaseDate": "2024-10-11", + "lastUpdated": "2024-10-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "inflection/inflection-3-productivity", + "modelKey": "inflection/inflection-3-productivity", + "displayName": "Inflection 3 Productivity", + "family": "gpt", + "metadata": { + "lastUpdated": "2024-10-11", + "openWeights": false, + "releaseDate": "2024-10-11" + } + } + ] + }, + { + "id": "nano-gpt/jamba-large", + "provider": "nano-gpt", + "model": "jamba-large", + "displayName": "Jamba Large", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/jamba-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "jamba-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.989, + "output": 7.99 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Jamba Large" + ], + "releaseDate": "2025-07-09", + "lastUpdated": "2025-07-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "jamba-large", + "modelKey": "jamba-large", + "displayName": "Jamba Large", + "metadata": { + "lastUpdated": "2025-07-09", + "openWeights": false, + "releaseDate": "2025-07-09" + } + } + ] + }, + { + "id": "nano-gpt/jamba-large-1.6", + "provider": "nano-gpt", + "model": "jamba-large-1.6", + "displayName": "Jamba Large 1.6", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/jamba-large-1.6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "jamba-large-1.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.989, + "output": 7.99 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Jamba Large 1.6" + ], + "releaseDate": "2025-03-12", + "lastUpdated": "2025-03-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "jamba-large-1.6", + "modelKey": "jamba-large-1.6", + "displayName": "Jamba Large 1.6", + "metadata": { + "lastUpdated": "2025-03-12", + "openWeights": false, + "releaseDate": "2025-03-12" + } + } + ] + }, + { + "id": "nano-gpt/jamba-large-1.7", + "provider": "nano-gpt", + "model": "jamba-large-1.7", + "displayName": "Jamba Large 1.7", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/jamba-large-1.7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "jamba-large-1.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.989, + "output": 7.99 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Jamba Large 1.7" + ], + "releaseDate": "2025-07-09", + "lastUpdated": "2025-07-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "jamba-large-1.7", + "modelKey": "jamba-large-1.7", + "displayName": "Jamba Large 1.7", + "metadata": { + "lastUpdated": "2025-07-09", + "openWeights": false, + "releaseDate": "2025-07-09" + } + } + ] + }, + { + "id": "nano-gpt/jamba-mini", + "provider": "nano-gpt", + "model": "jamba-mini", + "displayName": "Jamba Mini", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/jamba-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "jamba-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1989, + "output": 0.408 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Jamba Mini" + ], + "releaseDate": "2025-07-09", + "lastUpdated": "2025-07-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "jamba-mini", + "modelKey": "jamba-mini", + "displayName": "Jamba Mini", + "metadata": { + "lastUpdated": "2025-07-09", + "openWeights": false, + "releaseDate": "2025-07-09" + } + } + ] + }, + { + "id": "nano-gpt/jamba-mini-1.6", + "provider": "nano-gpt", + "model": "jamba-mini-1.6", + "displayName": "Jamba Mini 1.6", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/jamba-mini-1.6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "jamba-mini-1.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1989, + "output": 0.408 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Jamba Mini 1.6" + ], + "releaseDate": "2025-03-01", + "lastUpdated": "2025-03-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "jamba-mini-1.6", + "modelKey": "jamba-mini-1.6", + "displayName": "Jamba Mini 1.6", + "metadata": { + "lastUpdated": "2025-03-01", + "openWeights": false, + "releaseDate": "2025-03-01" + } + } + ] + }, + { + "id": "nano-gpt/jamba-mini-1.7", + "provider": "nano-gpt", + "model": "jamba-mini-1.7", + "displayName": "Jamba Mini 1.7", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/jamba-mini-1.7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "jamba-mini-1.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1989, + "output": 0.408 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Jamba Mini 1.7" + ], + "releaseDate": "2025-07-09", + "lastUpdated": "2025-07-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "jamba-mini-1.7", + "modelKey": "jamba-mini-1.7", + "displayName": "Jamba Mini 1.7", + "metadata": { + "lastUpdated": "2025-07-09", + "openWeights": false, + "releaseDate": "2025-07-09" + } + } + ] + }, + { + "id": "nano-gpt/k2-think", + "provider": "nano-gpt", + "model": "k2-think", + "displayName": "K2-Think", + "family": "kimi-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/LLM360/K2-Think" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "LLM360/K2-Think", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.17, + "output": 0.68 + } + } + ] + }, + "metadata": { + "displayNames": [ + "K2-Think" + ], + "families": [ + "kimi-thinking" + ], + "releaseDate": "2025-07-26", + "lastUpdated": "2025-07-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "LLM360/K2-Think", + "modelKey": "LLM360/K2-Think", + "displayName": "K2-Think", + "family": "kimi-thinking", + "metadata": { + "lastUpdated": "2025-07-26", + "openWeights": false, + "releaseDate": "2025-07-26" + } + } + ] + }, + { + "id": "nano-gpt/kat-coder-air-v1", + "provider": "nano-gpt", + "model": "kat-coder-air-v1", + "displayName": "KAT Coder Air V1", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/KAT-Coder-Air-V1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "KAT-Coder-Air-V1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "KAT Coder Air V1" + ], + "releaseDate": "2025-10-28", + "lastUpdated": "2025-10-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "KAT-Coder-Air-V1", + "modelKey": "KAT-Coder-Air-V1", + "displayName": "KAT Coder Air V1", + "metadata": { + "lastUpdated": "2025-10-28", + "openWeights": false, + "releaseDate": "2025-10-28" + } + } + ] + }, + { + "id": "nano-gpt/kat-coder-exp-72b-1010", + "provider": "nano-gpt", + "model": "kat-coder-exp-72b-1010", + "displayName": "KAT Coder Exp 72B 1010", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/KAT-Coder-Exp-72B-1010" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "KAT-Coder-Exp-72B-1010", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "KAT Coder Exp 72B 1010" + ], + "releaseDate": "2025-10-28", + "lastUpdated": "2025-10-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "KAT-Coder-Exp-72B-1010", + "modelKey": "KAT-Coder-Exp-72B-1010", + "displayName": "KAT Coder Exp 72B 1010", + "metadata": { + "lastUpdated": "2025-10-28", + "openWeights": false, + "releaseDate": "2025-10-28" + } + } + ] + }, + { + "id": "nano-gpt/kat-coder-pro-v2", + "provider": "nano-gpt", + "model": "kat-coder-pro-v2", + "displayName": "KAT Coder Pro V2", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/kwaipilot/kat-coder-pro-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 80000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "kwaipilot/kat-coder-pro-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "KAT Coder Pro V2" + ], + "releaseDate": "2026-03-28", + "lastUpdated": "2026-03-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "kwaipilot/kat-coder-pro-v2", + "modelKey": "kwaipilot/kat-coder-pro-v2", + "displayName": "KAT Coder Pro V2", + "metadata": { + "lastUpdated": "2026-03-28", + "openWeights": false, + "releaseDate": "2026-03-28" + } + } + ] + }, + { + "id": "nano-gpt/l3-8b-stheno-v3.2", + "provider": "nano-gpt", + "model": "l3-8b-stheno-v3.2", + "displayName": "Sao10K Stheno 8b", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Sao10K/L3-8B-Stheno-v3.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Sao10K/L3-8B-Stheno-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2006, + "output": 0.2006 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Sao10K Stheno 8b" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-11-29", + "lastUpdated": "2024-11-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Sao10K/L3-8B-Stheno-v3.2", + "modelKey": "Sao10K/L3-8B-Stheno-v3.2", + "displayName": "Sao10K Stheno 8b", + "family": "llama", + "metadata": { + "lastUpdated": "2024-11-29", + "openWeights": false, + "releaseDate": "2024-11-29" + } + } + ] + }, + { + "id": "nano-gpt/l3.1-70b-celeste-v0.1-bf16", + "provider": "nano-gpt", + "model": "l3.1-70b-celeste-v0.1-bf16", + "displayName": "Llama 3.1 70B Celeste v0.1", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/nothingiisreal/L3.1-70B-Celeste-V0.1-BF16" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "nothingiisreal/L3.1-70B-Celeste-V0.1-BF16", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49299999999999994, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 70B Celeste v0.1" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "nothingiisreal/L3.1-70B-Celeste-V0.1-BF16", + "modelKey": "nothingiisreal/L3.1-70B-Celeste-V0.1-BF16", + "displayName": "Llama 3.1 70B Celeste v0.1", + "family": "llama", + "metadata": { + "lastUpdated": "2024-07-23", + "openWeights": false, + "releaseDate": "2024-07-23" + } + } + ] + }, + { + "id": "nano-gpt/l3.1-70b-euryale-v2.2", + "provider": "nano-gpt", + "model": "l3.1-70b-euryale-v2.2", + "displayName": "Llama 3.1 70B Euryale", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Sao10K/L3.1-70B-Euryale-v2.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 20480, + "inputTokens": 20480, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Sao10K/L3.1-70B-Euryale-v2.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.306, + "output": 0.357 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 70B Euryale" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Sao10K/L3.1-70B-Euryale-v2.2", + "modelKey": "Sao10K/L3.1-70B-Euryale-v2.2", + "displayName": "Llama 3.1 70B Euryale", + "family": "llama", + "metadata": { + "lastUpdated": "2024-07-23", + "openWeights": false, + "releaseDate": "2024-07-23" + } + } + ] + }, + { + "id": "nano-gpt/l3.1-70b-hanami-x1", + "provider": "nano-gpt", + "model": "l3.1-70b-hanami-x1", + "displayName": "Llama 3.1 70B Hanami", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Sao10K/L3.1-70B-Hanami-x1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Sao10K/L3.1-70B-Hanami-x1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49299999999999994, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 70B Hanami" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-07-23", + "lastUpdated": "2024-07-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Sao10K/L3.1-70B-Hanami-x1", + "modelKey": "Sao10K/L3.1-70B-Hanami-x1", + "displayName": "Llama 3.1 70B Hanami", + "family": "llama", + "metadata": { + "lastUpdated": "2024-07-23", + "openWeights": false, + "releaseDate": "2024-07-23" + } + } + ] + }, + { + "id": "nano-gpt/l3.3-70b-euryale-v2.3", + "provider": "nano-gpt", + "model": "l3.3-70b-euryale-v2.3", + "displayName": "Llama 3.3 70B Euryale", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Sao10K/L3.3-70B-Euryale-v2.3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 20480, + "inputTokens": 20480, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Sao10K/L3.3-70B-Euryale-v2.3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49299999999999994, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 70B Euryale" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-12-06", + "lastUpdated": "2024-12-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Sao10K/L3.3-70B-Euryale-v2.3", + "modelKey": "Sao10K/L3.3-70B-Euryale-v2.3", + "displayName": "Llama 3.3 70B Euryale", + "family": "llama", + "metadata": { + "lastUpdated": "2024-12-06", + "openWeights": false, + "releaseDate": "2024-12-06" + } + } + ] + }, + { + "id": "nano-gpt/l3.3-cu-mai-r1-70b", + "provider": "nano-gpt", + "model": "l3.3-cu-mai-r1-70b", + "displayName": "Llama 3.3 70B Cu Mai", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Steelskull/L3.3-Cu-Mai-R1-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Steelskull/L3.3-Cu-Mai-R1-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49299999999999994, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 70B Cu Mai" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-12-06", + "lastUpdated": "2024-12-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Steelskull/L3.3-Cu-Mai-R1-70b", + "modelKey": "Steelskull/L3.3-Cu-Mai-R1-70b", + "displayName": "Llama 3.3 70B Cu Mai", + "family": "llama", + "metadata": { + "lastUpdated": "2024-12-06", + "openWeights": false, + "releaseDate": "2024-12-06" + } + } + ] + }, + { + "id": "nano-gpt/l3.3-electra-r1-70b", + "provider": "nano-gpt", + "model": "l3.3-electra-r1-70b", + "displayName": "Steelskull Electra R1 70b", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Steelskull/L3.3-Electra-R1-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Steelskull/L3.3-Electra-R1-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.69989, + "output": 0.69989 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Steelskull Electra R1 70b" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-12-06", + "lastUpdated": "2024-12-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Steelskull/L3.3-Electra-R1-70b", + "modelKey": "Steelskull/L3.3-Electra-R1-70b", + "displayName": "Steelskull Electra R1 70b", + "family": "llama", + "metadata": { + "lastUpdated": "2024-12-06", + "openWeights": false, + "releaseDate": "2024-12-06" + } + } + ] + }, + { + "id": "nano-gpt/l3.3-ms-evalebis-70b", + "provider": "nano-gpt", + "model": "l3.3-ms-evalebis-70b", + "displayName": "MS Evalebis 70b", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Steelskull/L3.3-MS-Evalebis-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Steelskull/L3.3-MS-Evalebis-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49299999999999994, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MS Evalebis 70b" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-12-06", + "lastUpdated": "2024-12-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Steelskull/L3.3-MS-Evalebis-70b", + "modelKey": "Steelskull/L3.3-MS-Evalebis-70b", + "displayName": "MS Evalebis 70b", + "family": "llama", + "metadata": { + "lastUpdated": "2024-12-06", + "openWeights": false, + "releaseDate": "2024-12-06" + } + } + ] + }, + { + "id": "nano-gpt/l3.3-ms-evayale-70b", + "provider": "nano-gpt", + "model": "l3.3-ms-evayale-70b", + "displayName": "Evayale 70b", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Steelskull/L3.3-MS-Evayale-70B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Steelskull/L3.3-MS-Evayale-70B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49299999999999994, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Evayale 70b" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-12-06", + "lastUpdated": "2024-12-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Steelskull/L3.3-MS-Evayale-70B", + "modelKey": "Steelskull/L3.3-MS-Evayale-70B", + "displayName": "Evayale 70b", + "family": "llama", + "metadata": { + "lastUpdated": "2024-12-06", + "openWeights": false, + "releaseDate": "2024-12-06" + } + } + ] + }, + { + "id": "nano-gpt/l3.3-ms-nevoria-70b", + "provider": "nano-gpt", + "model": "l3.3-ms-nevoria-70b", + "displayName": "Steelskull Nevoria 70b", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Steelskull/L3.3-MS-Nevoria-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Steelskull/L3.3-MS-Nevoria-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49299999999999994, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Steelskull Nevoria 70b" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-12-06", + "lastUpdated": "2024-12-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Steelskull/L3.3-MS-Nevoria-70b", + "modelKey": "Steelskull/L3.3-MS-Nevoria-70b", + "displayName": "Steelskull Nevoria 70b", + "family": "llama", + "metadata": { + "lastUpdated": "2024-12-06", + "openWeights": false, + "releaseDate": "2024-12-06" + } + } + ] + }, + { + "id": "nano-gpt/l3.3-nevoria-r1-70b", + "provider": "nano-gpt", + "model": "l3.3-nevoria-r1-70b", + "displayName": "Steelskull Nevoria R1 70b", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Steelskull/L3.3-Nevoria-R1-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Steelskull/L3.3-Nevoria-R1-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49299999999999994, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Steelskull Nevoria R1 70b" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-12-06", + "lastUpdated": "2024-12-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Steelskull/L3.3-Nevoria-R1-70b", + "modelKey": "Steelskull/L3.3-Nevoria-R1-70b", + "displayName": "Steelskull Nevoria R1 70b", + "family": "llama", + "metadata": { + "lastUpdated": "2024-12-06", + "openWeights": false, + "releaseDate": "2024-12-06" + } + } + ] + }, + { + "id": "nano-gpt/laguna-m.1", + "provider": "nano-gpt", + "model": "laguna-m.1", + "displayName": "Laguna M.1", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/poolside/laguna-m.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "poolside/laguna-m.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Laguna M.1" + ], + "releaseDate": "2026-04-29", + "lastUpdated": "2026-04-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "poolside/laguna-m.1", + "modelKey": "poolside/laguna-m.1", + "displayName": "Laguna M.1", + "metadata": { + "lastUpdated": "2026-04-29", + "openWeights": false, + "releaseDate": "2026-04-29" + } + } + ] + }, + { + "id": "nano-gpt/laguna-xs.2", + "provider": "nano-gpt", + "model": "laguna-xs.2", + "displayName": "Laguna XS.2", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/poolside/laguna-xs.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "poolside/laguna-xs.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Laguna XS.2" + ], + "releaseDate": "2026-04-29", + "lastUpdated": "2026-04-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "poolside/laguna-xs.2", + "modelKey": "poolside/laguna-xs.2", + "displayName": "Laguna XS.2", + "metadata": { + "lastUpdated": "2026-04-29", + "openWeights": false, + "releaseDate": "2026-04-29" + } + } + ] + }, + { + "id": "nano-gpt/learnlm-1.5-pro-experimental", + "provider": "nano-gpt", + "model": "learnlm-1.5-pro-experimental", + "displayName": "Gemini LearnLM Experimental", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/learnlm-1.5-pro-experimental" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32767, + "inputTokens": 32767, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "learnlm-1.5-pro-experimental", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3.502, + "output": 10.506 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemini LearnLM Experimental" + ], + "releaseDate": "2024-05-14", + "lastUpdated": "2024-05-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "learnlm-1.5-pro-experimental", + "modelKey": "learnlm-1.5-pro-experimental", + "displayName": "Gemini LearnLM Experimental", + "metadata": { + "lastUpdated": "2024-05-14", + "openWeights": false, + "releaseDate": "2024-05-14" + } + } + ] + }, + { + "id": "nano-gpt/lfm-2-24b-a2b", + "provider": "nano-gpt", + "model": "lfm-2-24b-a2b", + "displayName": "LFM2 24B A2B", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/liquid/lfm-2-24b-a2b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "liquid/lfm-2-24b-a2b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.03, + "output": 0.12 + } + } + ] + }, + "metadata": { + "displayNames": [ + "LFM2 24B A2B" + ], + "releaseDate": "2025-12-20", + "lastUpdated": "2025-12-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "liquid/lfm-2-24b-a2b", + "modelKey": "liquid/lfm-2-24b-a2b", + "displayName": "LFM2 24B A2B", + "metadata": { + "lastUpdated": "2025-12-20", + "openWeights": false, + "releaseDate": "2025-12-20" + } + } + ] + }, + { + "id": "nano-gpt/ling-2.6-1t", + "provider": "nano-gpt", + "model": "ling-2.6-1t", + "displayName": "Ling 2.6 1T", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/inclusionai/ling-2.6-1t" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "inclusionai/ling-2.6-1t", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ling 2.6 1T" + ], + "releaseDate": "2026-04-23", + "lastUpdated": "2026-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "inclusionai/ling-2.6-1t", + "modelKey": "inclusionai/ling-2.6-1t", + "displayName": "Ling 2.6 1T", + "metadata": { + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + } + ] + }, + { + "id": "nano-gpt/ling-2.6-flash", + "provider": "nano-gpt", + "model": "ling-2.6-flash", + "displayName": "Ling 2.6 Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/inclusionai/ling-2.6-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "inclusionai/ling-2.6-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "output": 0.24 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ling 2.6 Flash" + ], + "releaseDate": "2026-04-21", + "lastUpdated": "2026-04-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "inclusionai/ling-2.6-flash", + "modelKey": "inclusionai/ling-2.6-flash", + "displayName": "Ling 2.6 Flash", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": false, + "releaseDate": "2026-04-21" + } + } + ] + }, + { + "id": "nano-gpt/llama3-3-70b", + "provider": "nano-gpt", + "model": "llama3-3-70b", + "displayName": "Llama 3.3 70B", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TEE/llama3-3-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/llama3-3-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 70B" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-07-03", + "lastUpdated": "2025-07-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/llama3-3-70b", + "modelKey": "TEE/llama3-3-70b", + "displayName": "Llama 3.3 70B", + "family": "llama", + "metadata": { + "lastUpdated": "2025-07-03", + "openWeights": false, + "releaseDate": "2025-07-03" + } + } + ] + }, + { + "id": "nano-gpt/lumimaid-v0.2-70b", + "provider": "nano-gpt", + "model": "lumimaid-v0.2-70b", + "displayName": "Lumimaid v0.2", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/NeverSleep/Lumimaid-v0.2-70B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "NeverSleep/Lumimaid-v0.2-70B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Lumimaid v0.2" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-07-01", + "lastUpdated": "2024-07-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "NeverSleep/Lumimaid-v0.2-70B", + "modelKey": "NeverSleep/Lumimaid-v0.2-70B", + "displayName": "Lumimaid v0.2", + "family": "llama", + "metadata": { + "lastUpdated": "2024-07-01", + "openWeights": false, + "releaseDate": "2024-07-01" + } + } + ] + }, + { + "id": "nano-gpt/m-prometheus-14b", + "provider": "nano-gpt", + "model": "m-prometheus-14b", + "displayName": "M-Prometheus 14B", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Unbabel/M-Prometheus-14B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Unbabel/M-Prometheus-14B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "M-Prometheus 14B" + ], + "releaseDate": "2026-05-29", + "lastUpdated": "2026-05-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Unbabel/M-Prometheus-14B", + "modelKey": "Unbabel/M-Prometheus-14B", + "displayName": "M-Prometheus 14B", + "metadata": { + "lastUpdated": "2026-05-29", + "openWeights": false, + "releaseDate": "2026-05-29" + } + } + ] + }, + { + "id": "nano-gpt/magidonia-24b-v4.3", + "provider": "nano-gpt", + "model": "magidonia-24b-v4.3", + "displayName": "The Drummer Magidonia 24B v4.3", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TheDrummer/Magidonia-24B-v4.3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TheDrummer/Magidonia-24B-v4.3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1003, + "output": 0.1207 + } + } + ] + }, + "metadata": { + "displayNames": [ + "The Drummer Magidonia 24B v4.3" + ], + "releaseDate": "2025-12-25", + "lastUpdated": "2025-12-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TheDrummer/Magidonia-24B-v4.3", + "modelKey": "TheDrummer/Magidonia-24B-v4.3", + "displayName": "The Drummer Magidonia 24B v4.3", + "metadata": { + "lastUpdated": "2025-12-25", + "openWeights": false, + "releaseDate": "2025-12-25" + } + } + ] + }, + { + "id": "nano-gpt/magnum-v2-72b", + "provider": "nano-gpt", + "model": "magnum-v2-72b", + "displayName": "Magnum V2 72B", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/anthracite-org/magnum-v2-72b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "anthracite-org/magnum-v2-72b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.006, + "output": 2.992 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Magnum V2 72B" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-07-01", + "lastUpdated": "2024-07-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "anthracite-org/magnum-v2-72b", + "modelKey": "anthracite-org/magnum-v2-72b", + "displayName": "Magnum V2 72B", + "family": "llama", + "metadata": { + "lastUpdated": "2024-07-01", + "openWeights": false, + "releaseDate": "2024-07-01" + } + } + ] + }, + { + "id": "nano-gpt/magnum-v4-72b", + "provider": "nano-gpt", + "model": "magnum-v4-72b", + "displayName": "Magnum v4 72B", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/anthracite-org/magnum-v4-72b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "anthracite-org/magnum-v4-72b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.006, + "output": 2.992 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Magnum v4 72B" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "anthracite-org/magnum-v4-72b", + "modelKey": "anthracite-org/magnum-v4-72b", + "displayName": "Magnum v4 72B", + "family": "llama", + "metadata": { + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + } + ] + }, + { + "id": "nano-gpt/manta-flash-1.0", + "provider": "nano-gpt", + "model": "manta-flash-1.0", + "displayName": "Manta Flash 1.0", + "family": "nova", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/meganova-ai/manta-flash-1.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "meganova-ai/manta-flash-1.0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.16 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Manta Flash 1.0" + ], + "families": [ + "nova" + ], + "releaseDate": "2025-12-20", + "lastUpdated": "2025-12-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "meganova-ai/manta-flash-1.0", + "modelKey": "meganova-ai/manta-flash-1.0", + "displayName": "Manta Flash 1.0", + "family": "nova", + "metadata": { + "lastUpdated": "2025-12-20", + "openWeights": false, + "releaseDate": "2025-12-20" + } + } + ] + }, + { + "id": "nano-gpt/manta-mini-1.0", + "provider": "nano-gpt", + "model": "manta-mini-1.0", + "displayName": "Manta Mini 1.0", + "family": "nova", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/meganova-ai/manta-mini-1.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "meganova-ai/manta-mini-1.0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.16 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Manta Mini 1.0" + ], + "families": [ + "nova" + ], + "releaseDate": "2025-12-20", + "lastUpdated": "2025-12-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "meganova-ai/manta-mini-1.0", + "modelKey": "meganova-ai/manta-mini-1.0", + "displayName": "Manta Mini 1.0", + "family": "nova", + "metadata": { + "lastUpdated": "2025-12-20", + "openWeights": false, + "releaseDate": "2025-12-20" + } + } + ] + }, + { + "id": "nano-gpt/manta-pro-1.0", + "provider": "nano-gpt", + "model": "manta-pro-1.0", + "displayName": "Manta Pro 1.0", + "family": "nova", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/meganova-ai/manta-pro-1.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "meganova-ai/manta-pro-1.0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.060000000000000005, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Manta Pro 1.0" + ], + "families": [ + "nova" + ], + "releaseDate": "2025-12-20", + "lastUpdated": "2025-12-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "meganova-ai/manta-pro-1.0", + "modelKey": "meganova-ai/manta-pro-1.0", + "displayName": "Manta Pro 1.0", + "family": "nova", + "metadata": { + "lastUpdated": "2025-12-20", + "openWeights": false, + "releaseDate": "2025-12-20" + } + } + ] + }, + { + "id": "nano-gpt/mercury-2", + "provider": "nano-gpt", + "model": "mercury-2", + "displayName": "Mercury 2", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/mercury-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 50000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mercury-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 0.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mercury 2" + ], + "releaseDate": "2024-01-01", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mercury-2", + "modelKey": "mercury-2", + "displayName": "Mercury 2", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + } + ] + }, + { + "id": "nano-gpt/mimo-v2-flash", + "provider": "nano-gpt", + "model": "mimo-v2-flash", + "displayName": "MiMo V2 Flash", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/xiaomi/mimo-v2-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "xiaomi/mimo-v2-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.102, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2 Flash" + ], + "families": [ + "mimo" + ], + "releaseDate": "2025-12-17", + "lastUpdated": "2025-12-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "xiaomi/mimo-v2-flash", + "modelKey": "xiaomi/mimo-v2-flash", + "displayName": "MiMo V2 Flash", + "family": "mimo", + "metadata": { + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "nano-gpt/mimo-v2-flash-original", + "provider": "nano-gpt", + "model": "mimo-v2-flash-original", + "displayName": "MiMo V2 Flash Original", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/xiaomi/mimo-v2-flash-original" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "xiaomi/mimo-v2-flash-original", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.102, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2 Flash Original" + ], + "families": [ + "mimo" + ], + "releaseDate": "2025-12-17", + "lastUpdated": "2025-12-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "xiaomi/mimo-v2-flash-original", + "modelKey": "xiaomi/mimo-v2-flash-original", + "displayName": "MiMo V2 Flash Original", + "family": "mimo", + "metadata": { + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "nano-gpt/mimo-v2-flash-thinking", + "provider": "nano-gpt", + "model": "mimo-v2-flash-thinking", + "displayName": "MiMo V2 Flash (Thinking)", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/xiaomi/mimo-v2-flash-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "xiaomi/mimo-v2-flash-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.102, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2 Flash (Thinking)" + ], + "families": [ + "mimo" + ], + "releaseDate": "2025-12-17", + "lastUpdated": "2025-12-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "xiaomi/mimo-v2-flash-thinking", + "modelKey": "xiaomi/mimo-v2-flash-thinking", + "displayName": "MiMo V2 Flash (Thinking)", + "family": "mimo", + "metadata": { + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "nano-gpt/mimo-v2-flash-thinking-original", + "provider": "nano-gpt", + "model": "mimo-v2-flash-thinking-original", + "displayName": "MiMo V2 Flash (Thinking) Original", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/xiaomi/mimo-v2-flash-thinking-original" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "xiaomi/mimo-v2-flash-thinking-original", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.102, + "output": 0.306 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2 Flash (Thinking) Original" + ], + "families": [ + "mimo" + ], + "releaseDate": "2025-12-17", + "lastUpdated": "2025-12-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "xiaomi/mimo-v2-flash-thinking-original", + "modelKey": "xiaomi/mimo-v2-flash-thinking-original", + "displayName": "MiMo V2 Flash (Thinking) Original", + "family": "mimo", + "metadata": { + "lastUpdated": "2025-12-17", + "openWeights": false, + "releaseDate": "2025-12-17", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "nano-gpt/mimo-v2-omni", + "provider": "nano-gpt", + "model": "mimo-v2-omni", + "displayName": "MiMo V2 Omni", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/xiaomi/mimo-v2-omni" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "xiaomi/mimo-v2-omni", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2 Omni" + ], + "releaseDate": "2026-03-19", + "lastUpdated": "2026-03-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "xiaomi/mimo-v2-omni", + "modelKey": "xiaomi/mimo-v2-omni", + "displayName": "MiMo V2 Omni", + "metadata": { + "lastUpdated": "2026-03-19", + "openWeights": false, + "releaseDate": "2026-03-19", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "nano-gpt/mimo-v2-pro", + "provider": "nano-gpt", + "model": "mimo-v2-pro", + "displayName": "MiMo V2 Pro", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/xiaomi/mimo-v2-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "xiaomi/mimo-v2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2 Pro" + ], + "releaseDate": "2026-03-19", + "lastUpdated": "2026-03-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "xiaomi/mimo-v2-pro", + "modelKey": "xiaomi/mimo-v2-pro", + "displayName": "MiMo V2 Pro", + "metadata": { + "lastUpdated": "2026-03-19", + "openWeights": false, + "releaseDate": "2026-03-19", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "nano-gpt/mimo-v2.5", + "provider": "nano-gpt", + "model": "mimo-v2.5", + "displayName": "MiMo V2.5", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/xiaomi/mimo-v2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "xiaomi/mimo-v2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.14, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2.5" + ], + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "xiaomi/mimo-v2.5", + "modelKey": "xiaomi/mimo-v2.5", + "displayName": "MiMo V2.5", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": false, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "nano-gpt/mimo-v2.5-pro", + "provider": "nano-gpt", + "model": "mimo-v2.5-pro", + "displayName": "MiMo V2.5 Pro", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/xiaomi/mimo-v2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "xiaomi/mimo-v2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0036, + "input": 0.435, + "output": 0.87 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2.5 Pro" + ], + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "xiaomi/mimo-v2.5-pro", + "modelKey": "xiaomi/mimo-v2.5-pro", + "displayName": "MiMo V2.5 Pro", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": false, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "nano-gpt/mirothinker-1-7-deepresearch", + "provider": "nano-gpt", + "model": "mirothinker-1-7-deepresearch", + "displayName": "MiroThinker 1.7 Deep Research", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/mirothinker-1-7-deepresearch" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mirothinker-1-7-deepresearch", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiroThinker 1.7 Deep Research" + ], + "releaseDate": "2026-05-11", + "lastUpdated": "2026-05-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mirothinker-1-7-deepresearch", + "modelKey": "mirothinker-1-7-deepresearch", + "displayName": "MiroThinker 1.7 Deep Research", + "metadata": { + "lastUpdated": "2026-05-11", + "openWeights": false, + "releaseDate": "2026-05-11" + } + } + ] + }, + { + "id": "nano-gpt/mirothinker-1-7-deepresearch-mini", + "provider": "nano-gpt", + "model": "mirothinker-1-7-deepresearch-mini", + "displayName": "MiroThinker 1.7 Deep Research Mini", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/mirothinker-1-7-deepresearch-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mirothinker-1-7-deepresearch-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiroThinker 1.7 Deep Research Mini" + ], + "releaseDate": "2026-05-11", + "lastUpdated": "2026-05-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mirothinker-1-7-deepresearch-mini", + "modelKey": "mirothinker-1-7-deepresearch-mini", + "displayName": "MiroThinker 1.7 Deep Research Mini", + "metadata": { + "lastUpdated": "2026-05-11", + "openWeights": false, + "releaseDate": "2026-05-11" + } + } + ] + }, + { + "id": "nano-gpt/mn-12b-inferor-v0.0", + "provider": "nano-gpt", + "model": "mn-12b-inferor-v0.0", + "displayName": "Mistral Nemo Inferor 12B", + "family": "mistral-nemo", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Infermatic/MN-12B-Inferor-v0.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Infermatic/MN-12B-Inferor-v0.0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25499999999999995, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Nemo Inferor 12B" + ], + "families": [ + "mistral-nemo" + ], + "releaseDate": "2024-07-01", + "lastUpdated": "2024-07-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Infermatic/MN-12B-Inferor-v0.0", + "modelKey": "Infermatic/MN-12B-Inferor-v0.0", + "displayName": "Mistral Nemo Inferor 12B", + "family": "mistral-nemo", + "metadata": { + "lastUpdated": "2024-07-01", + "openWeights": false, + "releaseDate": "2024-07-01" + } + } + ] + }, + { + "id": "nano-gpt/mn-12b-mag-mell-r1", + "provider": "nano-gpt", + "model": "mn-12b-mag-mell-r1", + "displayName": "Mag Mell R1", + "family": "mistral-nemo", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/inflatebot/MN-12B-Mag-Mell-R1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "inflatebot/MN-12B-Mag-Mell-R1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49299999999999994, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mag Mell R1" + ], + "families": [ + "mistral-nemo" + ], + "releaseDate": "2024-07-01", + "lastUpdated": "2024-07-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "inflatebot/MN-12B-Mag-Mell-R1", + "modelKey": "inflatebot/MN-12B-Mag-Mell-R1", + "displayName": "Mag Mell R1", + "family": "mistral-nemo", + "metadata": { + "lastUpdated": "2024-07-01", + "openWeights": false, + "releaseDate": "2024-07-01" + } + } + ] + }, + { + "id": "nano-gpt/mn-loosecannon-12b-v1", + "provider": "nano-gpt", + "model": "mn-loosecannon-12b-v1", + "displayName": "MN-LooseCannon-12B-v1", + "family": "mistral-nemo", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/GalrionSoftworks/MN-LooseCannon-12B-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "GalrionSoftworks/MN-LooseCannon-12B-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49299999999999994, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MN-LooseCannon-12B-v1" + ], + "families": [ + "mistral-nemo" + ], + "releaseDate": "2024-07-01", + "lastUpdated": "2024-07-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "GalrionSoftworks/MN-LooseCannon-12B-v1", + "modelKey": "GalrionSoftworks/MN-LooseCannon-12B-v1", + "displayName": "MN-LooseCannon-12B-v1", + "family": "mistral-nemo", + "metadata": { + "lastUpdated": "2024-07-01", + "openWeights": false, + "releaseDate": "2024-07-01" + } + } + ] + }, + { + "id": "nano-gpt/ms3.2-24b-magnum-diamond", + "provider": "nano-gpt", + "model": "ms3.2-24b-magnum-diamond", + "displayName": "MS3.2 24B Magnum Diamond", + "family": "mistral", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Doctor-Shotgun/MS3.2-24B-Magnum-Diamond" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Doctor-Shotgun/MS3.2-24B-Magnum-Diamond", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49299999999999994, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MS3.2 24B Magnum Diamond" + ], + "families": [ + "mistral" + ], + "releaseDate": "2025-11-24", + "lastUpdated": "2025-11-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Doctor-Shotgun/MS3.2-24B-Magnum-Diamond", + "modelKey": "Doctor-Shotgun/MS3.2-24B-Magnum-Diamond", + "displayName": "MS3.2 24B Magnum Diamond", + "family": "mistral", + "metadata": { + "lastUpdated": "2025-11-24", + "openWeights": false, + "releaseDate": "2025-11-24" + } + } + ] + }, + { + "id": "nano-gpt/ms3.2-the-omega-directive-24b-unslop-v2.0", + "provider": "nano-gpt", + "model": "ms3.2-the-omega-directive-24b-unslop-v2.0", + "displayName": "Omega Directive 24B Unslop v2.0", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/ReadyArt/MS3.2-The-Omega-Directive-24B-Unslop-v2.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "ReadyArt/MS3.2-The-Omega-Directive-24B-Unslop-v2.0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Omega Directive 24B Unslop v2.0" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-12-08", + "lastUpdated": "2025-12-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "ReadyArt/MS3.2-The-Omega-Directive-24B-Unslop-v2.0", + "modelKey": "ReadyArt/MS3.2-The-Omega-Directive-24B-Unslop-v2.0", + "displayName": "Omega Directive 24B Unslop v2.0", + "family": "llama", + "metadata": { + "lastUpdated": "2025-12-08", + "openWeights": false, + "releaseDate": "2025-12-08" + } + } + ] + }, + { + "id": "nano-gpt/mythomax-l2-13b", + "provider": "nano-gpt", + "model": "mythomax-l2-13b", + "displayName": "MythoMax 13B", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Gryphe/MythoMax-L2-13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4000, + "inputTokens": 4000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Gryphe/MythoMax-L2-13b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1003, + "output": 0.1003 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MythoMax 13B" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-08-08", + "lastUpdated": "2025-08-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Gryphe/MythoMax-L2-13b", + "modelKey": "Gryphe/MythoMax-L2-13b", + "displayName": "MythoMax 13B", + "family": "llama", + "metadata": { + "lastUpdated": "2025-08-08", + "openWeights": false, + "releaseDate": "2025-08-08" + } + } + ] + }, + { + "id": "nano-gpt/nemomix-unleashed-12b", + "provider": "nano-gpt", + "model": "nemomix-unleashed-12b", + "displayName": "NemoMix 12B Unleashed", + "family": "mistral-nemo", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/MarinaraSpaghetti/NemoMix-Unleashed-12B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "MarinaraSpaghetti/NemoMix-Unleashed-12B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49299999999999994, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NemoMix 12B Unleashed" + ], + "families": [ + "mistral-nemo" + ], + "releaseDate": "2024-07-01", + "lastUpdated": "2024-07-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "MarinaraSpaghetti/NemoMix-Unleashed-12B", + "modelKey": "MarinaraSpaghetti/NemoMix-Unleashed-12B", + "displayName": "NemoMix 12B Unleashed", + "family": "mistral-nemo", + "metadata": { + "lastUpdated": "2024-07-01", + "openWeights": false, + "releaseDate": "2024-07-01" + } + } + ] + }, + { + "id": "nano-gpt/nemotron-3-nano-30b-a3b", + "provider": "nano-gpt", + "model": "nemotron-3-nano-30b-a3b", + "displayName": "Nvidia Nemotron 3 Nano 30B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/nvidia/nemotron-3-nano-30b-a3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "nvidia/nemotron-3-nano-30b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.17, + "output": 0.68 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nvidia Nemotron 3 Nano 30B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2025-12-15", + "lastUpdated": "2025-12-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "nvidia/nemotron-3-nano-30b-a3b", + "modelKey": "nvidia/nemotron-3-nano-30b-a3b", + "displayName": "Nvidia Nemotron 3 Nano 30B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2025-12-15", + "openWeights": false, + "releaseDate": "2025-12-15" + } + } + ] + }, + { + "id": "nano-gpt/nemotron-3-nano-omni-30b-a3b-reasoning", + "provider": "nano-gpt", + "model": "nemotron-3-nano-omni-30b-a3b-reasoning", + "displayName": "Nvidia Nemotron 3 Nano Omni", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/nvidia/nemotron-3-nano-omni-30b-a3b-reasoning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.105, + "output": 0.42 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nvidia Nemotron 3 Nano Omni" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-04-28", + "lastUpdated": "2026-04-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", + "modelKey": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", + "displayName": "Nvidia Nemotron 3 Nano Omni", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-04-28", + "openWeights": false, + "releaseDate": "2026-04-28" + } + } + ] + }, + { + "id": "nano-gpt/nemotron-3-super-120b-a12b", + "provider": "nano-gpt", + "model": "nemotron-3-super-120b-a12b", + "displayName": "Nvidia Nemotron 3 Super 120B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/nvidia/nemotron-3-super-120b-a12b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "nvidia/nemotron-3-super-120b-a12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nvidia Nemotron 3 Super 120B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-03-01", + "lastUpdated": "2026-03-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "nvidia/nemotron-3-super-120b-a12b", + "modelKey": "nvidia/nemotron-3-super-120b-a12b", + "displayName": "Nvidia Nemotron 3 Super 120B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-03-01", + "openWeights": false, + "releaseDate": "2026-03-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "nano-gpt/nemotron-3-super-120b-a12b:thinking", + "provider": "nano-gpt", + "model": "nemotron-3-super-120b-a12b:thinking", + "displayName": "Nvidia Nemotron 3 Super 120B Thinking", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/nvidia/nemotron-3-super-120b-a12b:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "nvidia/nemotron-3-super-120b-a12b:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nvidia Nemotron 3 Super 120B Thinking" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-03-01", + "lastUpdated": "2026-03-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "nvidia/nemotron-3-super-120b-a12b:thinking", + "modelKey": "nvidia/nemotron-3-super-120b-a12b:thinking", + "displayName": "Nvidia Nemotron 3 Super 120B Thinking", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-03-01", + "openWeights": false, + "releaseDate": "2026-03-01" + } + } + ] + }, + { + "id": "nano-gpt/neuraldaredevil-8b-abliterated", + "provider": "nano-gpt", + "model": "neuraldaredevil-8b-abliterated", + "displayName": "Neural Daredevil 8B abliterated", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/mlabonne/NeuralDaredevil-8B-abliterated" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "mlabonne/NeuralDaredevil-8B-abliterated", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.44, + "output": 0.44 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Neural Daredevil 8B abliterated" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-12-01", + "lastUpdated": "2024-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "mlabonne/NeuralDaredevil-8B-abliterated", + "modelKey": "mlabonne/NeuralDaredevil-8B-abliterated", + "displayName": "Neural Daredevil 8B abliterated", + "family": "llama", + "metadata": { + "lastUpdated": "2024-12-01", + "openWeights": false, + "releaseDate": "2024-12-01" + } + } + ] + }, + { + "id": "nano-gpt/nvidia-nemotron-nano-9b-v2", + "provider": "nano-gpt", + "model": "nvidia-nemotron-nano-9b-v2", + "displayName": "Nvidia Nemotron Nano 9B v2", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/nvidia/nvidia-nemotron-nano-9b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "nvidia/nvidia-nemotron-nano-9b-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.17, + "output": 0.68 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nvidia Nemotron Nano 9B v2" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2025-08-18", + "lastUpdated": "2025-08-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "nvidia/nvidia-nemotron-nano-9b-v2", + "modelKey": "nvidia/nvidia-nemotron-nano-9b-v2", + "displayName": "Nvidia Nemotron Nano 9B v2", + "family": "nemotron", + "metadata": { + "lastUpdated": "2025-08-18", + "openWeights": false, + "releaseDate": "2025-08-18" + } + } + ] + }, + { + "id": "nano-gpt/olmo-3-32b-think", + "provider": "nano-gpt", + "model": "olmo-3-32b-think", + "displayName": "Olmo 3 32B Think", + "family": "allenai", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/allenai/olmo-3-32b-think" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "allenai/olmo-3-32b-think", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.44999999999999996 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Olmo 3 32B Think" + ], + "families": [ + "allenai" + ], + "releaseDate": "2025-11-01", + "lastUpdated": "2025-11-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "allenai/olmo-3-32b-think", + "modelKey": "allenai/olmo-3-32b-think", + "displayName": "Olmo 3 32B Think", + "family": "allenai", + "metadata": { + "lastUpdated": "2025-11-01", + "openWeights": false, + "releaseDate": "2025-11-01" + } + } + ] + }, + { + "id": "nano-gpt/openreasoning-nemotron-32b", + "provider": "nano-gpt", + "model": "openreasoning-nemotron-32b", + "displayName": "OpenReasoning Nemotron 32B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/pamanseau/OpenReasoning-Nemotron-32B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "pamanseau/OpenReasoning-Nemotron-32B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenReasoning Nemotron 32B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2025-08-21", + "lastUpdated": "2025-08-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "pamanseau/OpenReasoning-Nemotron-32B", + "modelKey": "pamanseau/OpenReasoning-Nemotron-32B", + "displayName": "OpenReasoning Nemotron 32B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2025-08-21", + "openWeights": false, + "releaseDate": "2025-08-21" + } + } + ] + }, + { + "id": "nano-gpt/owl", + "provider": "nano-gpt", + "model": "owl", + "displayName": "OWL", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/owl" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048756, + "inputTokens": 1048756, + "outputTokens": 262144, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "owl", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OWL" + ], + "releaseDate": "2026-05-01", + "lastUpdated": "2026-05-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "owl", + "modelKey": "owl", + "displayName": "OWL", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-05-01" + } + } + ] + }, + { + "id": "nano-gpt/perceptron-mk1", + "provider": "nano-gpt", + "model": "perceptron-mk1", + "displayName": "Perceptron Mk1", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/perceptron/perceptron-mk1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "perceptron/perceptron-mk1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Perceptron Mk1" + ], + "releaseDate": "2026-05-12", + "lastUpdated": "2026-05-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "perceptron/perceptron-mk1", + "modelKey": "perceptron/perceptron-mk1", + "displayName": "Perceptron Mk1", + "metadata": { + "lastUpdated": "2026-05-12", + "openWeights": false, + "releaseDate": "2026-05-12" + } + } + ] + }, + { + "id": "nano-gpt/phi-4-mini-instruct", + "provider": "nano-gpt", + "model": "phi-4-mini-instruct", + "displayName": "Phi 4 Mini", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/phi-4-mini-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "phi-4-mini-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.17, + "output": 0.68 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi 4 Mini" + ], + "releaseDate": "2025-07-26", + "lastUpdated": "2025-07-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "phi-4-mini-instruct", + "modelKey": "phi-4-mini-instruct", + "displayName": "Phi 4 Mini", + "metadata": { + "lastUpdated": "2025-07-26", + "openWeights": false, + "releaseDate": "2025-07-26" + } + } + ] + }, + { + "id": "nano-gpt/phi-4-multimodal-instruct", + "provider": "nano-gpt", + "model": "phi-4-multimodal-instruct", + "displayName": "Phi 4 Multimodal", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/phi-4-multimodal-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "phi-4-multimodal-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.11 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi 4 Multimodal" + ], + "releaseDate": "2025-07-26", + "lastUpdated": "2025-07-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "phi-4-multimodal-instruct", + "modelKey": "phi-4-multimodal-instruct", + "displayName": "Phi 4 Multimodal", + "metadata": { + "lastUpdated": "2025-07-26", + "openWeights": false, + "releaseDate": "2025-07-26" + } + } + ] + }, + { + "id": "nano-gpt/qvq-max", + "provider": "nano-gpt", + "model": "qvq-max", + "displayName": "Qwen: QvQ Max", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/qvq-max" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "qvq-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.4, + "output": 5.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen: QvQ Max" + ], + "releaseDate": "2025-03-28", + "lastUpdated": "2025-03-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "qvq-max", + "modelKey": "qvq-max", + "displayName": "Qwen: QvQ Max", + "metadata": { + "lastUpdated": "2025-03-28", + "openWeights": false, + "releaseDate": "2025-03-28" + } + } + ] + }, + { + "id": "nano-gpt/qwerky-72b", + "provider": "nano-gpt", + "model": "qwerky-72b", + "displayName": "Qwerky 72B", + "family": "qwerky", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/featherless-ai/Qwerky-72B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "featherless-ai/Qwerky-72B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwerky 72B" + ], + "families": [ + "qwerky" + ], + "releaseDate": "2025-03-20", + "lastUpdated": "2025-03-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "featherless-ai/Qwerky-72B", + "modelKey": "featherless-ai/Qwerky-72B", + "displayName": "Qwerky 72B", + "family": "qwerky", + "metadata": { + "lastUpdated": "2025-03-20", + "openWeights": false, + "releaseDate": "2025-03-20" + } + } + ] + }, + { + "id": "nano-gpt/remm-slerp-l2-13b", + "provider": "nano-gpt", + "model": "remm-slerp-l2-13b", + "displayName": "ReMM SLERP 13B", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/undi95/remm-slerp-l2-13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 6144, + "inputTokens": 6144, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "undi95/remm-slerp-l2-13b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7989999999999999, + "output": 1.2069999999999999 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ReMM SLERP 13B" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "undi95/remm-slerp-l2-13b", + "modelKey": "undi95/remm-slerp-l2-13b", + "displayName": "ReMM SLERP 13B", + "family": "llama", + "metadata": { + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + } + ] + }, + { + "id": "nano-gpt/ring-2.6-1t", + "provider": "nano-gpt", + "model": "ring-2.6-1t", + "displayName": "Ring 2.6 1T", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/inclusionai/ring-2.6-1t" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "inclusionai/ring-2.6-1t", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ring 2.6 1T" + ], + "releaseDate": "2026-05-08", + "lastUpdated": "2026-05-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "inclusionai/ring-2.6-1t", + "modelKey": "inclusionai/ring-2.6-1t", + "displayName": "Ring 2.6 1T", + "metadata": { + "lastUpdated": "2026-05-08", + "openWeights": false, + "releaseDate": "2026-05-08" + } + } + ] + }, + { + "id": "nano-gpt/rnj-1-instruct", + "provider": "nano-gpt", + "model": "rnj-1-instruct", + "displayName": "RNJ-1 Instruct 8B", + "family": "rnj", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/essentialai/rnj-1-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "essentialai/rnj-1-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "RNJ-1 Instruct 8B" + ], + "families": [ + "rnj" + ], + "releaseDate": "2025-12-13", + "lastUpdated": "2025-12-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "essentialai/rnj-1-instruct", + "modelKey": "essentialai/rnj-1-instruct", + "displayName": "RNJ-1 Instruct 8B", + "family": "rnj", + "metadata": { + "lastUpdated": "2025-12-13", + "openWeights": false, + "releaseDate": "2025-12-13" + } + } + ] + }, + { + "id": "nano-gpt/rocinante-12b-v1.1", + "provider": "nano-gpt", + "model": "rocinante-12b-v1.1", + "displayName": "Rocinante 12b", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TheDrummer/Rocinante-12B-v1.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TheDrummer/Rocinante-12B-v1.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.408, + "output": 0.595 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Rocinante 12b" + ], + "releaseDate": "2024-01-01", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TheDrummer/Rocinante-12B-v1.1", + "modelKey": "TheDrummer/Rocinante-12B-v1.1", + "displayName": "Rocinante 12b", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + } + ] + }, + { + "id": "nano-gpt/sarvam-105b", + "provider": "nano-gpt", + "model": "sarvam-105b", + "displayName": "Sarvam 105B", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/sarvam-105b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "sarvam-105b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.045, + "output": 0.177 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Sarvam 105B" + ], + "releaseDate": "2026-05-12", + "lastUpdated": "2026-05-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "sarvam-105b", + "modelKey": "sarvam-105b", + "displayName": "Sarvam 105B", + "metadata": { + "lastUpdated": "2026-05-12", + "openWeights": false, + "releaseDate": "2026-05-12" + } + } + ] + }, + { + "id": "nano-gpt/sarvam-30b", + "provider": "nano-gpt", + "model": "sarvam-30b", + "displayName": "Sarvam 30B", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/sarvam-30b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "sarvam-30b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.017, + "input": 0.028, + "output": 0.111 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Sarvam 30B" + ], + "releaseDate": "2026-05-12", + "lastUpdated": "2026-05-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "sarvam-30b", + "modelKey": "sarvam-30b", + "displayName": "Sarvam 30B", + "metadata": { + "lastUpdated": "2026-05-12", + "openWeights": false, + "releaseDate": "2026-05-12" + } + } + ] + }, + { + "id": "nano-gpt/seed-2.0-lite", + "provider": "nano-gpt", + "model": "seed-2.0-lite", + "displayName": "ByteDance Seed 2.0 Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/bytedance-seed/seed-2.0-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "bytedance-seed/seed-2.0-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ByteDance Seed 2.0 Lite" + ], + "releaseDate": "2026-03-10", + "lastUpdated": "2026-03-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "bytedance-seed/seed-2.0-lite", + "modelKey": "bytedance-seed/seed-2.0-lite", + "displayName": "ByteDance Seed 2.0 Lite", + "metadata": { + "lastUpdated": "2026-03-10", + "openWeights": false, + "releaseDate": "2026-03-10" + } + } + ] + }, + { + "id": "nano-gpt/shisa-v2-llama3.3-70b", + "provider": "nano-gpt", + "model": "shisa-v2-llama3.3-70b", + "displayName": "Shisa V2 Llama 3.3 70B", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/shisa-ai/shisa-v2-llama3.3-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "shisa-ai/shisa-v2-llama3.3-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Shisa V2 Llama 3.3 70B" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-07-26", + "lastUpdated": "2025-07-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "shisa-ai/shisa-v2-llama3.3-70b", + "modelKey": "shisa-ai/shisa-v2-llama3.3-70b", + "displayName": "Shisa V2 Llama 3.3 70B", + "family": "llama", + "metadata": { + "lastUpdated": "2025-07-26", + "openWeights": false, + "releaseDate": "2025-07-26" + } + } + ] + }, + { + "id": "nano-gpt/shisa-v2.1-llama3.3-70b", + "provider": "nano-gpt", + "model": "shisa-v2.1-llama3.3-70b", + "displayName": "Shisa V2.1 Llama 3.3 70B", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/shisa-ai/shisa-v2.1-llama3.3-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "shisa-ai/shisa-v2.1-llama3.3-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Shisa V2.1 Llama 3.3 70B" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-12-06", + "lastUpdated": "2024-12-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "shisa-ai/shisa-v2.1-llama3.3-70b", + "modelKey": "shisa-ai/shisa-v2.1-llama3.3-70b", + "displayName": "Shisa V2.1 Llama 3.3 70B", + "family": "llama", + "metadata": { + "lastUpdated": "2024-12-06", + "openWeights": false, + "releaseDate": "2024-12-06" + } + } + ] + }, + { + "id": "nano-gpt/skyfall-31b-v4.2", + "provider": "nano-gpt", + "model": "skyfall-31b-v4.2", + "displayName": "TheDrummer Skyfall 31B v4.2", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TheDrummer/Skyfall-31B-v4.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TheDrummer/Skyfall-31B-v4.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 0.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "TheDrummer Skyfall 31B v4.2" + ], + "releaseDate": "2026-03-26", + "lastUpdated": "2026-03-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TheDrummer/Skyfall-31B-v4.2", + "modelKey": "TheDrummer/Skyfall-31B-v4.2", + "displayName": "TheDrummer Skyfall 31B v4.2", + "metadata": { + "lastUpdated": "2026-03-26", + "openWeights": false, + "releaseDate": "2026-03-26" + } + } + ] + }, + { + "id": "nano-gpt/skyfall-36b-v2", + "provider": "nano-gpt", + "model": "skyfall-36b-v2", + "displayName": "TheDrummer Skyfall 36B V2", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TheDrummer/skyfall-36b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 64000, + "inputTokens": 64000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TheDrummer/skyfall-36b-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.493, + "output": 0.493 + } + } + ] + }, + "metadata": { + "displayNames": [ + "TheDrummer Skyfall 36B V2" + ], + "releaseDate": "2025-03-10", + "lastUpdated": "2025-03-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TheDrummer/skyfall-36b-v2", + "modelKey": "TheDrummer/skyfall-36b-v2", + "displayName": "TheDrummer Skyfall 36B V2", + "metadata": { + "lastUpdated": "2025-03-10", + "openWeights": false, + "releaseDate": "2025-03-10" + } + } + ] + }, + { + "id": "nano-gpt/solar-pro-3", + "provider": "nano-gpt", + "model": "solar-pro-3", + "displayName": "Solar Pro 3", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/upstage/solar-pro-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "upstage/solar-pro-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Solar Pro 3" + ], + "releaseDate": "2026-03-03", + "lastUpdated": "2026-03-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "upstage/solar-pro-3", + "modelKey": "upstage/solar-pro-3", + "displayName": "Solar Pro 3", + "metadata": { + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + } + ] + }, + { + "id": "nano-gpt/sonar", + "provider": "nano-gpt", + "model": "sonar", + "displayName": "Perplexity Simple", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/sonar" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 127000, + "inputTokens": 127000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "sonar", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.003, + "output": 1.003 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Perplexity Simple" + ], + "releaseDate": "2025-02-19", + "lastUpdated": "2025-02-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "sonar", + "modelKey": "sonar", + "displayName": "Perplexity Simple", + "metadata": { + "lastUpdated": "2025-02-19", + "openWeights": false, + "releaseDate": "2025-02-19" + } + } + ] + }, + { + "id": "nano-gpt/starcannon-unleashed-12b-v1.0", + "provider": "nano-gpt", + "model": "starcannon-unleashed-12b-v1.0", + "displayName": "Mistral Nemo Starcannon 12b v1", + "family": "mistral-nemo", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/VongolaChouko/Starcannon-Unleashed-12B-v1.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "VongolaChouko/Starcannon-Unleashed-12B-v1.0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49299999999999994, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mistral Nemo Starcannon 12b v1" + ], + "families": [ + "mistral-nemo" + ], + "releaseDate": "2024-07-01", + "lastUpdated": "2024-07-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "VongolaChouko/Starcannon-Unleashed-12B-v1.0", + "modelKey": "VongolaChouko/Starcannon-Unleashed-12B-v1.0", + "displayName": "Mistral Nemo Starcannon 12b v1", + "family": "mistral-nemo", + "metadata": { + "lastUpdated": "2024-07-01", + "openWeights": false, + "releaseDate": "2024-07-01" + } + } + ] + }, + { + "id": "nano-gpt/step-2-16k-exp", + "provider": "nano-gpt", + "model": "step-2-16k-exp", + "displayName": "Step-2 16k Exp", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/step-2-16k-exp" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16000, + "inputTokens": 16000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "step-2-16k-exp", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 7.004, + "output": 19.992 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step-2 16k Exp" + ], + "releaseDate": "2024-07-05", + "lastUpdated": "2024-07-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "step-2-16k-exp", + "modelKey": "step-2-16k-exp", + "displayName": "Step-2 16k Exp", + "metadata": { + "lastUpdated": "2024-07-05", + "openWeights": false, + "releaseDate": "2024-07-05" + } + } + ] + }, + { + "id": "nano-gpt/step-2-mini", + "provider": "nano-gpt", + "model": "step-2-mini", + "displayName": "Step-2 Mini", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/step-2-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 8000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "step-2-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2006, + "output": 0.408 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step-2 Mini" + ], + "releaseDate": "2024-07-05", + "lastUpdated": "2024-07-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "step-2-mini", + "modelKey": "step-2-mini", + "displayName": "Step-2 Mini", + "metadata": { + "lastUpdated": "2024-07-05", + "openWeights": false, + "releaseDate": "2024-07-05" + } + } + ] + }, + { + "id": "nano-gpt/step-3", + "provider": "nano-gpt", + "model": "step-3", + "displayName": "Step-3", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/step-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "step-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2499, + "output": 0.6494 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step-3" + ], + "releaseDate": "2025-07-31", + "lastUpdated": "2025-07-31", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "step-3", + "modelKey": "step-3", + "displayName": "Step-3", + "metadata": { + "lastUpdated": "2025-07-31", + "openWeights": false, + "releaseDate": "2025-07-31" + } + } + ] + }, + { + "id": "nano-gpt/step-3.5-flash", + "provider": "nano-gpt", + "model": "step-3.5-flash", + "displayName": "Step 3.5 Flash", + "family": "step", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/stepfun-ai/step-3.5-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "stepfun-ai/step-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 3.5 Flash" + ], + "families": [ + "step" + ], + "releaseDate": "2026-02-02", + "lastUpdated": "2026-02-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "stepfun-ai/step-3.5-flash", + "modelKey": "stepfun-ai/step-3.5-flash", + "displayName": "Step 3.5 Flash", + "family": "step", + "metadata": { + "lastUpdated": "2026-02-02", + "openWeights": false, + "releaseDate": "2026-02-02", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "nano-gpt/step-3.5-flash-2603", + "provider": "nano-gpt", + "model": "step-3.5-flash-2603", + "displayName": "Step 3.5 Flash 2603", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/stepfun-ai/step-3.5-flash-2603" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "stepfun-ai/step-3.5-flash-2603", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 3.5 Flash 2603" + ], + "releaseDate": "2026-04-14", + "lastUpdated": "2026-04-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "stepfun-ai/step-3.5-flash-2603", + "modelKey": "stepfun-ai/step-3.5-flash-2603", + "displayName": "Step 3.5 Flash 2603", + "metadata": { + "lastUpdated": "2026-04-14", + "openWeights": false, + "releaseDate": "2026-04-14", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "nano-gpt/step-3.7-flash:thinking", + "provider": "nano-gpt", + "model": "step-3.7-flash:thinking", + "displayName": "Step 3.7 Flash Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/stepfun/step-3.7-flash:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "stepfun/step-3.7-flash:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.2, + "output": 1.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 3.7 Flash Thinking" + ], + "releaseDate": "2026-05-29", + "lastUpdated": "2026-05-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "stepfun/step-3.7-flash:thinking", + "modelKey": "stepfun/step-3.7-flash:thinking", + "displayName": "Step 3.7 Flash Thinking", + "metadata": { + "lastUpdated": "2026-05-29", + "openWeights": false, + "releaseDate": "2026-05-29" + } + } + ] + }, + { + "id": "nano-gpt/step-r1-v-mini", + "provider": "nano-gpt", + "model": "step-r1-v-mini", + "displayName": "Step R1 V Mini", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/step-r1-v-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "step-r1-v-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 11 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step R1 V Mini" + ], + "releaseDate": "2025-04-08", + "lastUpdated": "2025-04-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "step-r1-v-mini", + "modelKey": "step-r1-v-mini", + "displayName": "Step R1 V Mini", + "metadata": { + "lastUpdated": "2025-04-08", + "openWeights": false, + "releaseDate": "2025-04-08" + } + } + ] + }, + { + "id": "nano-gpt/tongyi-deepresearch-30b-a3b", + "provider": "nano-gpt", + "model": "tongyi-deepresearch-30b-a3b", + "displayName": "Tongyi DeepResearch 30B A3B", + "family": "yi", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/Alibaba-NLP/Tongyi-DeepResearch-30B-A3B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "Alibaba-NLP/Tongyi-DeepResearch-30B-A3B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "output": 0.24000000000000002 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Tongyi DeepResearch 30B A3B" + ], + "families": [ + "yi" + ], + "releaseDate": "2025-08-26", + "lastUpdated": "2025-08-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "Alibaba-NLP/Tongyi-DeepResearch-30B-A3B", + "modelKey": "Alibaba-NLP/Tongyi-DeepResearch-30B-A3B", + "displayName": "Tongyi DeepResearch 30B A3B", + "family": "yi", + "metadata": { + "lastUpdated": "2025-08-26", + "openWeights": false, + "releaseDate": "2025-08-26" + } + } + ] + }, + { + "id": "nano-gpt/trinity-large-thinking", + "provider": "nano-gpt", + "model": "trinity-large-thinking", + "displayName": "Trinity Large Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/arcee-ai/trinity-large-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "outputTokens": 80000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "arcee-ai/trinity-large-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 0.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Trinity Large Thinking" + ], + "releaseDate": "2026-04-01", + "lastUpdated": "2026-04-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "arcee-ai/trinity-large-thinking", + "modelKey": "arcee-ai/trinity-large-thinking", + "displayName": "Trinity Large Thinking", + "metadata": { + "lastUpdated": "2026-04-01", + "openWeights": false, + "releaseDate": "2026-04-01" + } + } + ] + }, + { + "id": "nano-gpt/trinity-mini", + "provider": "nano-gpt", + "model": "trinity-mini", + "displayName": "Trinity Mini", + "family": "trinity-mini", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/arcee-ai/trinity-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "arcee-ai/trinity-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.045000000000000005, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Trinity Mini" + ], + "families": [ + "trinity-mini" + ], + "releaseDate": "2025-12-01", + "lastUpdated": "2025-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "arcee-ai/trinity-mini", + "modelKey": "arcee-ai/trinity-mini", + "displayName": "Trinity Mini", + "family": "trinity-mini", + "metadata": { + "lastUpdated": "2025-12-01", + "openWeights": false, + "releaseDate": "2025-12-01" + } + } + ] + }, + { + "id": "nano-gpt/universal-summarizer", + "provider": "nano-gpt", + "model": "universal-summarizer", + "displayName": "Universal Summarizer", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/universal-summarizer" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "universal-summarizer", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 30 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Universal Summarizer" + ], + "releaseDate": "2023-05-01", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "universal-summarizer", + "modelKey": "universal-summarizer", + "displayName": "Universal Summarizer", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2023-05-01" + } + } + ] + }, + { + "id": "nano-gpt/unslopnemo-12b-v4.1", + "provider": "nano-gpt", + "model": "unslopnemo-12b-v4.1", + "displayName": "UnslopNemo 12b v4", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TheDrummer/UnslopNemo-12B-v4.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TheDrummer/UnslopNemo-12B-v4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.493, + "output": 0.493 + } + } + ] + }, + "metadata": { + "displayNames": [ + "UnslopNemo 12b v4" + ], + "releaseDate": "2024-01-01", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TheDrummer/UnslopNemo-12B-v4.1", + "modelKey": "TheDrummer/UnslopNemo-12B-v4.1", + "displayName": "UnslopNemo 12b v4", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + } + ] + }, + { + "id": "nano-gpt/v0-1.0-md", + "provider": "nano-gpt", + "model": "v0-1.0-md", + "displayName": "v0 1.0 MD", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/v0-1.0-md" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "v0-1.0-md", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "v0 1.0 MD" + ], + "releaseDate": "2025-07-04", + "lastUpdated": "2025-07-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "v0-1.0-md", + "modelKey": "v0-1.0-md", + "displayName": "v0 1.0 MD", + "metadata": { + "lastUpdated": "2025-07-04", + "openWeights": false, + "releaseDate": "2025-07-04" + } + } + ] + }, + { + "id": "nano-gpt/v0-1.5-lg", + "provider": "nano-gpt", + "model": "v0-1.5-lg", + "displayName": "v0 1.5 LG", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/v0-1.5-lg" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "v0-1.5-lg", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "v0 1.5 LG" + ], + "releaseDate": "2025-07-04", + "lastUpdated": "2025-07-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "v0-1.5-lg", + "modelKey": "v0-1.5-lg", + "displayName": "v0 1.5 LG", + "metadata": { + "lastUpdated": "2025-07-04", + "openWeights": false, + "releaseDate": "2025-07-04" + } + } + ] + }, + { + "id": "nano-gpt/v0-1.5-md", + "provider": "nano-gpt", + "model": "v0-1.5-md", + "displayName": "v0 1.5 MD", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/v0-1.5-md" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "v0-1.5-md", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "v0 1.5 MD" + ], + "releaseDate": "2025-07-04", + "lastUpdated": "2025-07-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "v0-1.5-md", + "modelKey": "v0-1.5-md", + "displayName": "v0 1.5 MD", + "metadata": { + "lastUpdated": "2025-07-04", + "openWeights": false, + "releaseDate": "2025-07-04" + } + } + ] + }, + { + "id": "nano-gpt/veiled-calla-12b", + "provider": "nano-gpt", + "model": "veiled-calla-12b", + "displayName": "Veiled Calla 12B", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/soob3123/Veiled-Calla-12B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "soob3123/Veiled-Calla-12B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Veiled Calla 12B" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-04-13", + "lastUpdated": "2025-04-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "soob3123/Veiled-Calla-12B", + "modelKey": "soob3123/Veiled-Calla-12B", + "displayName": "Veiled Calla 12B", + "family": "llama", + "metadata": { + "lastUpdated": "2025-04-13", + "openWeights": false, + "releaseDate": "2025-04-13" + } + } + ] + }, + { + "id": "nano-gpt/venice-uncensored", + "provider": "nano-gpt", + "model": "venice-uncensored", + "displayName": "Venice Uncensored", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/venice-uncensored" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "venice-uncensored", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Venice Uncensored" + ], + "releaseDate": "2025-02-24", + "lastUpdated": "2025-02-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "venice-uncensored", + "modelKey": "venice-uncensored", + "displayName": "Venice Uncensored", + "metadata": { + "lastUpdated": "2025-02-24", + "openWeights": false, + "releaseDate": "2025-02-24" + } + } + ] + }, + { + "id": "nano-gpt/venice-uncensored:web", + "provider": "nano-gpt", + "model": "venice-uncensored:web", + "displayName": "Venice Uncensored Web", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/venice-uncensored:web" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 80000, + "inputTokens": 80000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "venice-uncensored:web", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Venice Uncensored Web" + ], + "releaseDate": "2024-05-01", + "lastUpdated": "2024-05-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "venice-uncensored:web", + "modelKey": "venice-uncensored:web", + "displayName": "Venice Uncensored Web", + "metadata": { + "lastUpdated": "2024-05-01", + "openWeights": false, + "releaseDate": "2024-05-01" + } + } + ] + }, + { + "id": "nano-gpt/wayfarer-large-70b-llama-3.3", + "provider": "nano-gpt", + "model": "wayfarer-large-70b-llama-3.3", + "displayName": "Llama 3.3 70B Wayfarer", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/LatitudeGames/Wayfarer-Large-70B-Llama-3.3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "LatitudeGames/Wayfarer-Large-70B-Llama-3.3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.700000007, + "output": 0.700000007 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 70B Wayfarer" + ], + "families": [ + "llama" + ], + "releaseDate": "2025-02-20", + "lastUpdated": "2025-02-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "LatitudeGames/Wayfarer-Large-70B-Llama-3.3", + "modelKey": "LatitudeGames/Wayfarer-Large-70B-Llama-3.3", + "displayName": "Llama 3.3 70B Wayfarer", + "family": "llama", + "metadata": { + "lastUpdated": "2025-02-20", + "openWeights": false, + "releaseDate": "2025-02-20" + } + } + ] + }, + { + "id": "nano-gpt/wizardlm-2-8x22b", + "provider": "nano-gpt", + "model": "wizardlm-2-8x22b", + "displayName": "WizardLM-2 8x22B", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/microsoft/wizardlm-2-8x22b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "microsoft/wizardlm-2-8x22b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49299999999999994, + "output": 0.49299999999999994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "WizardLM-2 8x22B" + ], + "families": [ + "gpt" + ], + "releaseDate": "2025-04-15", + "lastUpdated": "2025-04-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "microsoft/wizardlm-2-8x22b", + "modelKey": "microsoft/wizardlm-2-8x22b", + "displayName": "WizardLM-2 8x22B", + "family": "gpt", + "metadata": { + "lastUpdated": "2025-04-15", + "openWeights": false, + "releaseDate": "2025-04-15" + } + } + ] + }, + { + "id": "nano-gpt/yi-large", + "provider": "nano-gpt", + "model": "yi-large", + "displayName": "Yi Large", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/yi-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "yi-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3.196, + "output": 3.196 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Yi Large" + ], + "releaseDate": "2024-05-13", + "lastUpdated": "2024-05-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "yi-large", + "modelKey": "yi-large", + "displayName": "Yi Large", + "metadata": { + "lastUpdated": "2024-05-13", + "openWeights": false, + "releaseDate": "2024-05-13" + } + } + ] + }, + { + "id": "nano-gpt/yi-lightning", + "provider": "nano-gpt", + "model": "yi-lightning", + "displayName": "Yi Lightning", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/yi-lightning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 12000, + "inputTokens": 12000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "yi-lightning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2006, + "output": 0.2006 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Yi Lightning" + ], + "releaseDate": "2024-10-16", + "lastUpdated": "2024-10-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "yi-lightning", + "modelKey": "yi-lightning", + "displayName": "Yi Lightning", + "metadata": { + "lastUpdated": "2024-10-16", + "openWeights": false, + "releaseDate": "2024-10-16" + } + } + ] + }, + { + "id": "nano-gpt/yi-medium-200k", + "provider": "nano-gpt", + "model": "yi-medium-200k", + "displayName": "Yi Medium 200k", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/yi-medium-200k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "yi-medium-200k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.499, + "output": 2.499 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Yi Medium 200k" + ], + "releaseDate": "2024-03-01", + "lastUpdated": "2024-03-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "yi-medium-200k", + "modelKey": "yi-medium-200k", + "displayName": "Yi Medium 200k", + "metadata": { + "lastUpdated": "2024-03-01", + "openWeights": false, + "releaseDate": "2024-03-01" + } + } + ] + }, + { + "id": "nearai/flux.2-klein-4b", + "provider": "nearai", + "model": "flux.2-klein-4b", + "displayName": "FLUX.2 Klein 4B", + "family": "flux", + "sources": [ + "models.dev" + ], + "providers": [ + "nearai" + ], + "aliases": [ + "nearai/black-forest-labs/FLUX.2-klein-4B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nearai", + "model": "black-forest-labs/FLUX.2-klein-4B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "FLUX.2 Klein 4B" + ], + "families": [ + "flux" + ], + "releaseDate": "2026-01-14", + "lastUpdated": "2026-01-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "black-forest-labs/FLUX.2-klein-4B", + "modelKey": "black-forest-labs/FLUX.2-klein-4B", + "displayName": "FLUX.2 Klein 4B", + "family": "flux", + "metadata": { + "lastUpdated": "2026-01-14", + "openWeights": true, + "releaseDate": "2026-01-14" + } + } + ] + }, + { + "id": "nebius/bge-en-icl", + "provider": "nebius", + "model": "bge-en-icl", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/BAAI/bge-en-icl" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/BAAI/bge-en-icl", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.01, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/BAAI/bge-en-icl", + "mode": "embedding", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + } + ] + }, + { + "id": "nebius/bge-multilingual-gemma2", + "provider": "nebius", + "model": "bge-multilingual-gemma2", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/BAAI/bge-multilingual-gemma2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/BAAI/bge-multilingual-gemma2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.01, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/BAAI/bge-multilingual-gemma2", + "mode": "embedding", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + } + ] + }, + { + "id": "nebius/e5-mistral-7b-instruct", + "provider": "nebius", + "model": "e5-mistral-7b-instruct", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/intfloat/e5-mistral-7b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/intfloat/e5-mistral-7b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.01, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/intfloat/e5-mistral-7b-instruct", + "mode": "embedding", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + } + ] + }, + { + "id": "nebius/hermes-3-llama-3.1-405b", + "provider": "nebius", + "model": "hermes-3-llama-3.1-405b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/NousResearch/Hermes-3-Llama-3.1-405B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "nebius", + "model": "nebius/NousResearch/Hermes-3-Llama-3.1-405B", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nebius", + "model": "nebius/NousResearch/Hermes-3-Llama-3.1-405B", + "mode": "chat", + "metadata": { + "source": "https://nebius.com/prices-ai-studio" + } + } + ] + }, + { + "id": "nebius/hermes-4-405b", + "provider": "nebius", + "model": "hermes-4-405b", + "displayName": "Hermes-4-405B", + "sources": [ + "models.dev" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/NousResearch/Hermes-4-405B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 120000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nebius", + "model": "NousResearch/Hermes-4-405B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 3, + "reasoningOutput": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes-4-405B" + ], + "knowledgeCutoff": "2025-11", + "releaseDate": "2026-01-30", + "lastUpdated": "2026-02-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "NousResearch/Hermes-4-405B", + "modelKey": "NousResearch/Hermes-4-405B", + "displayName": "Hermes-4-405B", + "metadata": { + "knowledgeCutoff": "2025-11", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2026-01-30" + } + } + ] + }, + { + "id": "nebius/hermes-4-70b", + "provider": "nebius", + "model": "hermes-4-70b", + "displayName": "Hermes-4-70B", + "sources": [ + "models.dev" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/NousResearch/Hermes-4-70B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 120000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nebius", + "model": "NousResearch/Hermes-4-70B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.013, + "cacheWrite": 0.16, + "input": 0.13, + "output": 0.4, + "reasoningOutput": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes-4-70B" + ], + "knowledgeCutoff": "2025-11", + "releaseDate": "2026-01-30", + "lastUpdated": "2026-02-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "NousResearch/Hermes-4-70B", + "modelKey": "NousResearch/Hermes-4-70B", + "displayName": "Hermes-4-70B", + "metadata": { + "knowledgeCutoff": "2025-11", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2026-01-30" + } + } + ] + }, + { + "id": "nebius/intellect-3", + "provider": "nebius", + "model": "intellect-3", + "displayName": "INTELLECT-3", + "sources": [ + "models.dev" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/PrimeIntellect/INTELLECT-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 120000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nebius", + "model": "PrimeIntellect/INTELLECT-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "cacheWrite": 0.25, + "input": 0.2, + "output": 1.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "INTELLECT-3" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-10", + "releaseDate": "2026-01-25", + "lastUpdated": "2026-02-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "PrimeIntellect/INTELLECT-3", + "modelKey": "PrimeIntellect/INTELLECT-3", + "displayName": "INTELLECT-3", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-10", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2026-01-25" + } + } + ] + }, + { + "id": "nebius/nemotron-3-nano-omni", + "provider": "nebius", + "model": "nemotron-3-nano-omni", + "displayName": "Nemotron-3-Nano-Omni", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/nvidia/Nemotron-3-Nano-Omni" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "inputTokens": 60000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nebius", + "model": "nvidia/Nemotron-3-Nano-Omni", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.006, + "cacheWrite": 0.075, + "input": 0.06, + "output": 0.24 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron-3-Nano-Omni" + ], + "families": [ + "nemotron" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-01-20", + "lastUpdated": "2026-05-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "nvidia/Nemotron-3-Nano-Omni", + "modelKey": "nvidia/Nemotron-3-Nano-Omni", + "displayName": "Nemotron-3-Nano-Omni", + "family": "nemotron", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-05-07", + "openWeights": true, + "releaseDate": "2025-01-20" + } + } + ] + }, + { + "id": "nebius/nemotron-3-super-120b-a12b", + "provider": "nebius", + "model": "nemotron-3-super-120b-a12b", + "displayName": "Nemotron-3-Super-120B-A12B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/nvidia/nemotron-3-super-120b-a12b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nebius", + "model": "nvidia/nemotron-3-super-120b-a12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron-3-Super-120B-A12B" + ], + "families": [ + "nemotron" + ], + "knowledgeCutoff": "2026-02", + "releaseDate": "2026-03-11", + "lastUpdated": "2026-03-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "nvidia/nemotron-3-super-120b-a12b", + "modelKey": "nvidia/nemotron-3-super-120b-a12b", + "displayName": "Nemotron-3-Super-120B-A12B", + "family": "nemotron", + "metadata": { + "knowledgeCutoff": "2026-02", + "lastUpdated": "2026-03-12", + "openWeights": true, + "releaseDate": "2026-03-11" + } + } + ] + }, + { + "id": "nebius/nvidia-nemotron-3-nano-30b-a3b", + "provider": "nebius", + "model": "nvidia-nemotron-3-nano-30b-a3b", + "displayName": "Nemotron-3-Nano-30B-A3B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 30000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nebius", + "model": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.006, + "cacheWrite": 0.075, + "input": 0.06, + "output": 0.24 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron-3-Nano-30B-A3B" + ], + "families": [ + "nemotron" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2025-08-10", + "lastUpdated": "2026-02-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B", + "modelKey": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B", + "displayName": "Nemotron-3-Nano-30B-A3B", + "family": "nemotron", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2025-08-10" + } + } + ] + }, + { + "id": "nlp-cloud/chatdolphin", + "provider": "nlp-cloud", + "model": "chatdolphin", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "nlp_cloud" + ], + "aliases": [ + "nlp_cloud/chatdolphin" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "nlp_cloud", + "model": "chatdolphin", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nlp_cloud", + "model": "chatdolphin", + "mode": "chat" + } + ] + }, + { + "id": "nlp-cloud/dolphin", + "provider": "nlp-cloud", + "model": "dolphin", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "nlp_cloud" + ], + "aliases": [ + "nlp_cloud/dolphin" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "nlp_cloud", + "model": "dolphin", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nlp_cloud", + "model": "dolphin", + "mode": "completion" + } + ] + }, + { + "id": "novita-ai/baichuan-m2-32b", + "provider": "novita-ai", + "model": "baichuan-m2-32b", + "displayName": "baichuan-m2-32b", + "family": "baichuan", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/baichuan/baichuan-m2-32b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "baichuan/baichuan-m2-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.07 + } + } + ] + }, + "metadata": { + "displayNames": [ + "baichuan-m2-32b" + ], + "families": [ + "baichuan" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-08-13", + "lastUpdated": "2025-08-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "baichuan/baichuan-m2-32b", + "modelKey": "baichuan/baichuan-m2-32b", + "displayName": "baichuan-m2-32b", + "family": "baichuan", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-08-13", + "openWeights": true, + "releaseDate": "2025-08-13" + } + } + ] + }, + { + "id": "novita-ai/ernie-4.5-21b-a3b", + "provider": "novita-ai", + "model": "ernie-4.5-21b-a3b", + "displayName": "ERNIE 4.5 21B A3B", + "family": "ernie", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/baidu/ernie-4.5-21B-a3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 120000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "baidu/ernie-4.5-21B-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ERNIE 4.5 21B A3B" + ], + "families": [ + "ernie" + ], + "knowledgeCutoff": "2025-03", + "releaseDate": "2025-06-30", + "lastUpdated": "2025-06-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "baidu/ernie-4.5-21B-a3b", + "modelKey": "baidu/ernie-4.5-21B-a3b", + "displayName": "ERNIE 4.5 21B A3B", + "family": "ernie", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2025-06-30", + "openWeights": true, + "releaseDate": "2025-06-30" + } + } + ] + }, + { + "id": "novita-ai/ernie-4.5-21b-a3b-thinking", + "provider": "novita-ai", + "model": "ernie-4.5-21b-a3b-thinking", + "displayName": "ERNIE-4.5-21B-A3B-Thinking", + "family": "ernie", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/baidu/ernie-4.5-21B-a3b-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "baidu/ernie-4.5-21B-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ERNIE-4.5-21B-A3B-Thinking" + ], + "families": [ + "ernie" + ], + "knowledgeCutoff": "2025-03", + "releaseDate": "2025-09-19", + "lastUpdated": "2025-09-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "baidu/ernie-4.5-21B-a3b-thinking", + "modelKey": "baidu/ernie-4.5-21B-a3b-thinking", + "displayName": "ERNIE-4.5-21B-A3B-Thinking", + "family": "ernie", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2025-09-19", + "openWeights": true, + "releaseDate": "2025-09-19" + } + } + ] + }, + { + "id": "novita-ai/ernie-4.5-300b-a47b-paddle", + "provider": "novita-ai", + "model": "ernie-4.5-300b-a47b-paddle", + "displayName": "ERNIE 4.5 300B A47B", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/baidu/ernie-4.5-300b-a47b-paddle" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 123000, + "outputTokens": 12000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "baidu/ernie-4.5-300b-a47b-paddle", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.28, + "output": 1.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ERNIE 4.5 300B A47B" + ], + "releaseDate": "2025-06-30", + "lastUpdated": "2025-06-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "baidu/ernie-4.5-300b-a47b-paddle", + "modelKey": "baidu/ernie-4.5-300b-a47b-paddle", + "displayName": "ERNIE 4.5 300B A47B", + "metadata": { + "lastUpdated": "2025-06-30", + "openWeights": true, + "releaseDate": "2025-06-30" + } + } + ] + }, + { + "id": "novita-ai/ernie-4.5-vl-28b-a3b", + "provider": "novita-ai", + "model": "ernie-4.5-vl-28b-a3b", + "displayName": "ERNIE 4.5 VL 28B A3B", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/baidu/ernie-4.5-vl-28b-a3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 30000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "baidu/ernie-4.5-vl-28b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.56 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ERNIE 4.5 VL 28B A3B" + ], + "releaseDate": "2025-06-30", + "lastUpdated": "2026-06-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "baidu/ernie-4.5-vl-28b-a3b", + "modelKey": "baidu/ernie-4.5-vl-28b-a3b", + "displayName": "ERNIE 4.5 VL 28B A3B", + "metadata": { + "lastUpdated": "2026-06-14", + "openWeights": true, + "releaseDate": "2025-06-30" + } + } + ] + }, + { + "id": "novita-ai/ernie-4.5-vl-28b-a3b-thinking", + "provider": "novita-ai", + "model": "ernie-4.5-vl-28b-a3b-thinking", + "displayName": "ERNIE-4.5-VL-28B-A3B-Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/baidu/ernie-4.5-vl-28b-a3b-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "baidu/ernie-4.5-vl-28b-a3b-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.39, + "output": 0.39 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ERNIE-4.5-VL-28B-A3B-Thinking" + ], + "releaseDate": "2025-11-26", + "lastUpdated": "2025-11-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "baidu/ernie-4.5-vl-28b-a3b-thinking", + "modelKey": "baidu/ernie-4.5-vl-28b-a3b-thinking", + "displayName": "ERNIE-4.5-VL-28B-A3B-Thinking", + "metadata": { + "lastUpdated": "2025-11-26", + "openWeights": true, + "releaseDate": "2025-11-26" + } + } + ] + }, + { + "id": "novita-ai/ernie-4.5-vl-424b-a47b", + "provider": "novita-ai", + "model": "ernie-4.5-vl-424b-a47b", + "displayName": "ERNIE 4.5 VL 424B A47B", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/baidu/ernie-4.5-vl-424b-a47b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 123000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "baidu/ernie-4.5-vl-424b-a47b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.42, + "output": 1.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ERNIE 4.5 VL 424B A47B" + ], + "releaseDate": "2025-06-30", + "lastUpdated": "2025-06-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "baidu/ernie-4.5-vl-424b-a47b", + "modelKey": "baidu/ernie-4.5-vl-424b-a47b", + "displayName": "ERNIE 4.5 VL 424B A47B", + "metadata": { + "lastUpdated": "2025-06-30", + "openWeights": true, + "releaseDate": "2025-06-30" + } + } + ] + }, + { + "id": "novita-ai/hermes-2-pro-llama-3-8b", + "provider": "novita-ai", + "model": "hermes-2-pro-llama-3-8b", + "displayName": "Hermes 2 Pro Llama 3 8B", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/nousresearch/hermes-2-pro-llama-3-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "nousresearch/hermes-2-pro-llama-3-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes 2 Pro Llama 3 8B" + ], + "releaseDate": "2024-06-27", + "lastUpdated": "2024-06-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "nousresearch/hermes-2-pro-llama-3-8b", + "modelKey": "nousresearch/hermes-2-pro-llama-3-8b", + "displayName": "Hermes 2 Pro Llama 3 8B", + "metadata": { + "lastUpdated": "2024-06-27", + "openWeights": true, + "releaseDate": "2024-06-27" + } + } + ] + }, + { + "id": "novita-ai/kat-coder-pro", + "provider": "novita-ai", + "model": "kat-coder-pro", + "displayName": "Kat Coder Pro", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/kwaipilot/kat-coder-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "kwaipilot/kat-coder-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kat Coder Pro" + ], + "releaseDate": "2026-01-05", + "lastUpdated": "2026-01-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "kwaipilot/kat-coder-pro", + "modelKey": "kwaipilot/kat-coder-pro", + "displayName": "Kat Coder Pro", + "metadata": { + "lastUpdated": "2026-01-05", + "openWeights": true, + "releaseDate": "2026-01-05" + } + } + ] + }, + { + "id": "novita-ai/l3-70b-euryale-v2.1", + "provider": "novita-ai", + "model": "l3-70b-euryale-v2.1", + "displayName": "L3 70B Euryale V2.1", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/sao10K/l3-70b-euryale-v2.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "sao10K/l3-70b-euryale-v2.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.48, + "output": 1.48 + } + } + ] + }, + "metadata": { + "displayNames": [ + "L3 70B Euryale V2.1" + ], + "releaseDate": "2024-06-18", + "lastUpdated": "2024-06-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "sao10K/l3-70b-euryale-v2.1", + "modelKey": "sao10K/l3-70b-euryale-v2.1", + "displayName": "L3 70B Euryale V2.1", + "metadata": { + "lastUpdated": "2024-06-18", + "openWeights": true, + "releaseDate": "2024-06-18" + } + } + ] + }, + { + "id": "novita-ai/l3-8b-lunaris", + "provider": "novita-ai", + "model": "l3-8b-lunaris", + "displayName": "Sao10k L3 8B Lunaris", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/sao10K/l3-8b-lunaris" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "sao10K/l3-8b-lunaris", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.05 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Sao10k L3 8B Lunaris" + ], + "releaseDate": "2024-11-28", + "lastUpdated": "2024-11-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "sao10K/l3-8b-lunaris", + "modelKey": "sao10K/l3-8b-lunaris", + "displayName": "Sao10k L3 8B Lunaris", + "metadata": { + "lastUpdated": "2024-11-28", + "openWeights": true, + "releaseDate": "2024-11-28" + } + } + ] + }, + { + "id": "novita-ai/l3-8b-stheno-v3.2", + "provider": "novita-ai", + "model": "l3-8b-stheno-v3.2", + "displayName": "L3 8B Stheno V3.2", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/sao10K/L3-8B-stheno-v3.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "sao10K/L3-8B-stheno-v3.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.05 + } + } + ] + }, + "metadata": { + "displayNames": [ + "L3 8B Stheno V3.2" + ], + "families": [ + "llama" + ], + "releaseDate": "2024-11-29", + "lastUpdated": "2024-11-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "sao10K/L3-8B-stheno-v3.2", + "modelKey": "sao10K/L3-8B-stheno-v3.2", + "displayName": "L3 8B Stheno V3.2", + "family": "llama", + "metadata": { + "lastUpdated": "2024-11-29", + "openWeights": true, + "releaseDate": "2024-11-29" + } + } + ] + }, + { + "id": "novita-ai/l31-70b-euryale-v2.2", + "provider": "novita-ai", + "model": "l31-70b-euryale-v2.2", + "displayName": "L31 70B Euryale V2.2", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/sao10K/l31-70b-euryale-v2.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "sao10K/l31-70b-euryale-v2.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.48, + "output": 1.48 + } + } + ] + }, + "metadata": { + "displayNames": [ + "L31 70B Euryale V2.2" + ], + "releaseDate": "2024-09-19", + "lastUpdated": "2024-09-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "sao10K/l31-70b-euryale-v2.2", + "modelKey": "sao10K/l31-70b-euryale-v2.2", + "displayName": "L31 70B Euryale V2.2", + "metadata": { + "lastUpdated": "2024-09-19", + "openWeights": true, + "releaseDate": "2024-09-19" + } + } + ] + }, + { + "id": "novita-ai/ling-2.6-1t", + "provider": "novita-ai", + "model": "ling-2.6-1t", + "displayName": "Ling-2.6-1T", + "family": "ling", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/inclusionai/ling-2.6-1t" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "inclusionai/ling-2.6-1t", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ling-2.6-1T" + ], + "families": [ + "ling" + ], + "releaseDate": "2026-04-23", + "lastUpdated": "2026-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "inclusionai/ling-2.6-1t", + "modelKey": "inclusionai/ling-2.6-1t", + "displayName": "Ling-2.6-1T", + "family": "ling", + "metadata": { + "lastUpdated": "2026-04-23", + "openWeights": true, + "releaseDate": "2026-04-23" + } + } + ] + }, + { + "id": "novita-ai/ling-2.6-flash", + "provider": "novita-ai", + "model": "ling-2.6-flash", + "displayName": "Ling-2.6-flash", + "family": "ling", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/inclusionai/ling-2.6-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "inclusionai/ling-2.6-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ling-2.6-flash" + ], + "families": [ + "ling" + ], + "releaseDate": "2026-04-24", + "lastUpdated": "2026-04-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "inclusionai/ling-2.6-flash", + "modelKey": "inclusionai/ling-2.6-flash", + "displayName": "Ling-2.6-flash", + "family": "ling", + "metadata": { + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + } + ] + }, + { + "id": "novita-ai/mimo-v2-flash", + "provider": "novita-ai", + "model": "mimo-v2-flash", + "displayName": "XiaomiMiMo/MiMo-V2-Flash", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/xiaomimimo/mimo-v2-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "xiaomimimo/mimo-v2-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "XiaomiMiMo/MiMo-V2-Flash" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-12-19", + "lastUpdated": "2025-12-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "xiaomimimo/mimo-v2-flash", + "modelKey": "xiaomimimo/mimo-v2-flash", + "displayName": "XiaomiMiMo/MiMo-V2-Flash", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-12-19", + "openWeights": true, + "releaseDate": "2025-12-19" + } + } + ] + }, + { + "id": "novita-ai/mimo-v2-pro", + "provider": "novita-ai", + "model": "mimo-v2-pro", + "displayName": "MiMo-V2-Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/xiaomimimo/mimo-v2-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "xiaomimimo/mimo-v2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.4, + "input": 2, + "output": 6 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.4, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-05-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "xiaomimimo/mimo-v2-pro", + "modelKey": "xiaomimimo/mimo-v2-pro", + "displayName": "MiMo-V2-Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-05-27", + "openWeights": false, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "novita-ai/mimo-v2.5-pro", + "provider": "novita-ai", + "model": "mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/xiaomimimo/mimo-v2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "xiaomimimo/mimo-v2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.4, + "input": 2, + "output": 6 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.4, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-05-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "xiaomimimo/mimo-v2.5-pro", + "modelKey": "xiaomimimo/mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-05-27", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "novita-ai/mythomax-l2-13b", + "provider": "novita-ai", + "model": "mythomax-l2-13b", + "displayName": "Mythomax L2 13B", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/gryphe/mythomax-l2-13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 3200, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "gryphe/mythomax-l2-13b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.09 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mythomax L2 13B" + ], + "releaseDate": "2024-04-25", + "lastUpdated": "2024-04-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "gryphe/mythomax-l2-13b", + "modelKey": "gryphe/mythomax-l2-13b", + "displayName": "Mythomax L2 13B", + "metadata": { + "lastUpdated": "2024-04-25", + "openWeights": true, + "releaseDate": "2024-04-25" + } + } + ] + }, + { + "id": "novita-ai/paddleocr-vl", + "provider": "novita-ai", + "model": "paddleocr-vl", + "displayName": "PaddleOCR-VL", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/paddlepaddle/paddleocr-vl" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "paddlepaddle/paddleocr-vl", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.02 + } + } + ] + }, + "metadata": { + "displayNames": [ + "PaddleOCR-VL" + ], + "releaseDate": "2025-10-22", + "lastUpdated": "2025-10-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "paddlepaddle/paddleocr-vl", + "modelKey": "paddlepaddle/paddleocr-vl", + "displayName": "PaddleOCR-VL", + "metadata": { + "lastUpdated": "2025-10-22", + "openWeights": true, + "releaseDate": "2025-10-22" + } + } + ] + }, + { + "id": "novita-ai/ring-2.6-1t", + "provider": "novita-ai", + "model": "ring-2.6-1t", + "displayName": "Ring-2.6-1T", + "family": "ring", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/inclusionai/ring-2.6-1t" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "inclusionai/ring-2.6-1t", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ring-2.6-1T" + ], + "families": [ + "ring" + ], + "releaseDate": "2026-05-08", + "lastUpdated": "2026-05-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "inclusionai/ring-2.6-1t", + "modelKey": "inclusionai/ring-2.6-1t", + "displayName": "Ring-2.6-1T", + "family": "ring", + "metadata": { + "lastUpdated": "2026-05-27", + "openWeights": false, + "releaseDate": "2026-05-08" + } + } + ] + }, + { + "id": "novita-ai/wizardlm-2-8x22b", + "provider": "novita-ai", + "model": "wizardlm-2-8x22b", + "displayName": "Wizardlm 2 8x22B", + "sources": [ + "models.dev" + ], + "providers": [ + "novita-ai" + ], + "aliases": [ + "novita-ai/microsoft/wizardlm-2-8x22b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65535, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "microsoft/wizardlm-2-8x22b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.62, + "output": 0.62 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Wizardlm 2 8x22B" + ], + "releaseDate": "2024-04-24", + "lastUpdated": "2024-04-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "microsoft/wizardlm-2-8x22b", + "modelKey": "microsoft/wizardlm-2-8x22b", + "displayName": "Wizardlm 2 8x22B", + "metadata": { + "lastUpdated": "2024-04-24", + "openWeights": true, + "releaseDate": "2024-04-24" + } + } + ] + }, + { + "id": "novita/baichuan-m2-32b", + "provider": "novita", + "model": "baichuan-m2-32b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/baichuan/baichuan-m2-32b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/baichuan/baichuan-m2-32b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0.07 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/baichuan/baichuan-m2-32b", + "mode": "chat" + } + ] + }, + { + "id": "novita/bge-m3", + "provider": "novita", + "model": "bge-m3", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/baai/bge-m3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 96000, + "outputTokens": 96000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/baai/bge-m3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.01, + "output": 0.01 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/baai/bge-m3", + "mode": "embedding" + } + ] + }, + { + "id": "novita/bge-reranker-v2-m3", + "provider": "novita", + "model": "bge-reranker-v2-m3", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/baai/bge-reranker-v2-m3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 8000, + "maxTokens": 8000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/baai/bge-reranker-v2-m3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.01, + "output": 0.01 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/baai/bge-reranker-v2-m3", + "mode": "rerank" + } + ] + }, + { + "id": "novita/ernie-4.5-21b-a3b", + "provider": "novita", + "model": "ernie-4.5-21b-a3b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/baidu/ernie-4.5-21B-a3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 120000, + "inputTokens": 120000, + "maxTokens": 8000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/baidu/ernie-4.5-21B-a3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0.28 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/baidu/ernie-4.5-21B-a3b", + "mode": "chat" + } + ] + }, + { + "id": "novita/ernie-4.5-21b-a3b-thinking", + "provider": "novita", + "model": "ernie-4.5-21b-a3b-thinking", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/baidu/ernie-4.5-21B-a3b-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/baidu/ernie-4.5-21B-a3b-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0.28 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/baidu/ernie-4.5-21B-a3b-thinking", + "mode": "chat" + } + ] + }, + { + "id": "novita/ernie-4.5-300b-a47b-paddle", + "provider": "novita", + "model": "ernie-4.5-300b-a47b-paddle", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/baidu/ernie-4.5-300b-a47b-paddle" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 123000, + "inputTokens": 123000, + "maxTokens": 12000, + "outputTokens": 12000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/baidu/ernie-4.5-300b-a47b-paddle", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.28, + "output": 1.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/baidu/ernie-4.5-300b-a47b-paddle", + "mode": "chat" + } + ] + }, + { + "id": "novita/ernie-4.5-vl-28b-a3b", + "provider": "novita", + "model": "ernie-4.5-vl-28b-a3b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/baidu/ernie-4.5-vl-28b-a3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 30000, + "inputTokens": 30000, + "maxTokens": 8000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/baidu/ernie-4.5-vl-28b-a3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.14, + "output": 0.56 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/baidu/ernie-4.5-vl-28b-a3b", + "mode": "chat" + } + ] + }, + { + "id": "novita/ernie-4.5-vl-28b-a3b-thinking", + "provider": "novita", + "model": "ernie-4.5-vl-28b-a3b-thinking", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/baidu/ernie-4.5-vl-28b-a3b-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/baidu/ernie-4.5-vl-28b-a3b-thinking", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.39, + "output": 0.39 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/baidu/ernie-4.5-vl-28b-a3b-thinking", + "mode": "chat" + } + ] + }, + { + "id": "novita/ernie-4.5-vl-424b-a47b", + "provider": "novita", + "model": "ernie-4.5-vl-424b-a47b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/baidu/ernie-4.5-vl-424b-a47b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 123000, + "inputTokens": 123000, + "maxTokens": 16000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/baidu/ernie-4.5-vl-424b-a47b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.42, + "output": 1.25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/baidu/ernie-4.5-vl-424b-a47b", + "mode": "chat" + } + ] + }, + { + "id": "novita/hermes-2-pro-llama-3-8b", + "provider": "novita", + "model": "hermes-2-pro-llama-3-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/nousresearch/hermes-2-pro-llama-3-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/nousresearch/hermes-2-pro-llama-3-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.14, + "output": 0.14 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/nousresearch/hermes-2-pro-llama-3-8b", + "mode": "chat" + } + ] + }, + { + "id": "novita/kat-coder-pro", + "provider": "novita", + "model": "kat-coder-pro", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/kwaipilot/kat-coder-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/kwaipilot/kat-coder-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + }, + "extra": { + "input_cost_per_token_cache_hit": 6e-8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/kwaipilot/kat-coder-pro", + "mode": "chat" + } + ] + }, + { + "id": "novita/l3-70b-euryale-v2.1", + "provider": "novita", + "model": "l3-70b-euryale-v2.1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/sao10k/l3-70b-euryale-v2.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/sao10k/l3-70b-euryale-v2.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.48, + "output": 1.48 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/sao10k/l3-70b-euryale-v2.1", + "mode": "chat" + } + ] + }, + { + "id": "novita/l3-8b-lunaris", + "provider": "novita", + "model": "l3-8b-lunaris", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/sao10k/l3-8b-lunaris" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/sao10k/l3-8b-lunaris", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.05 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/sao10k/l3-8b-lunaris", + "mode": "chat" + } + ] + }, + { + "id": "novita/l3-8b-stheno-v3.2", + "provider": "novita", + "model": "l3-8b-stheno-v3.2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/Sao10K/L3-8B-Stheno-v3.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/Sao10K/L3-8B-Stheno-v3.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.05 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/Sao10K/L3-8B-Stheno-v3.2", + "mode": "chat" + } + ] + }, + { + "id": "novita/l31-70b-euryale-v2.2", + "provider": "novita", + "model": "l31-70b-euryale-v2.2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/sao10k/l31-70b-euryale-v2.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/sao10k/l31-70b-euryale-v2.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.48, + "output": 1.48 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/sao10k/l31-70b-euryale-v2.2", + "mode": "chat" + } + ] + }, + { + "id": "novita/mimo-v2-flash", + "provider": "novita", + "model": "mimo-v2-flash", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/xiaomimimo/mimo-v2-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/xiaomimimo/mimo-v2-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.1, + "output": 0.3 + }, + "extra": { + "input_cost_per_token_cache_hit": 2e-8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/xiaomimimo/mimo-v2-flash", + "mode": "chat" + } + ] + }, + { + "id": "novita/mythomax-l2-13b", + "provider": "novita", + "model": "mythomax-l2-13b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/gryphe/mythomax-l2-13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 3200, + "outputTokens": 3200, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/gryphe/mythomax-l2-13b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.09, + "output": 0.09 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/gryphe/mythomax-l2-13b", + "mode": "chat" + } + ] + }, + { + "id": "novita/paddleocr-vl", + "provider": "novita", + "model": "paddleocr-vl", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/paddlepaddle/paddleocr-vl" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/paddlepaddle/paddleocr-vl", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0.02 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/paddlepaddle/paddleocr-vl", + "mode": "chat" + } + ] + }, + { + "id": "novita/r1v4-lite", + "provider": "novita", + "model": "r1v4-lite", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/skywork/r1v4-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/skywork/r1v4-lite", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/skywork/r1v4-lite", + "mode": "chat" + } + ] + }, + { + "id": "novita/wizardlm-2-8x22b", + "provider": "novita", + "model": "wizardlm-2-8x22b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "novita" + ], + "aliases": [ + "novita/microsoft/wizardlm-2-8x22b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65535, + "inputTokens": 65535, + "maxTokens": 8000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "novita", + "model": "novita/microsoft/wizardlm-2-8x22b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.62, + "output": 0.62 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/microsoft/wizardlm-2-8x22b", + "mode": "chat" + } + ] + }, + { + "id": "nscale/flux.1-schnell", + "provider": "nscale", + "model": "flux.1-schnell", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "nscale" + ], + "aliases": [ + "nscale/black-forest-labs/FLUX.1-schnell" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "nscale", + "model": "nscale/black-forest-labs/FLUX.1-schnell", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 1.3e-9, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nscale", + "model": "nscale/black-forest-labs/FLUX.1-schnell", + "mode": "image_generation", + "metadata": { + "source": "https://docs.nscale.com/docs/inference/serverless-models/current#image-models", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "nscale/stable-diffusion-xl-base-1.0", + "provider": "nscale", + "model": "stable-diffusion-xl-base-1.0", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "nscale" + ], + "aliases": [ + "nscale/stabilityai/stable-diffusion-xl-base-1.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "nscale", + "model": "nscale/stabilityai/stable-diffusion-xl-base-1.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 3e-9, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nscale", + "model": "nscale/stabilityai/stable-diffusion-xl-base-1.0", + "mode": "image_generation", + "metadata": { + "source": "https://docs.nscale.com/docs/inference/serverless-models/current#image-models", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "nvidia-nim/nv-rerankqa-mistral-4b-v3", + "provider": "nvidia-nim", + "model": "nv-rerankqa-mistral-4b-v3", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "nvidia_nim" + ], + "aliases": [ + "nvidia_nim/nvidia/nv-rerankqa-mistral-4b-v3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "nvidia_nim", + "model": "nvidia_nim/nvidia/nv-rerankqa-mistral-4b-v3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + }, + "perQuery": { + "input": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "nvidia_nim", + "model": "nvidia_nim/nvidia/nv-rerankqa-mistral-4b-v3", + "mode": "rerank" + } + ] + }, + { + "id": "nvidia/active-speaker-detection", + "provider": "nvidia", + "model": "active-speaker-detection", + "displayName": "Active Speaker Detection", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/active-speaker-detection" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/active-speaker-detection", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Active Speaker Detection" + ], + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/active-speaker-detection", + "modelKey": "nvidia/active-speaker-detection", + "displayName": "Active Speaker Detection", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": true, + "releaseDate": "2026-04-16" + } + } + ] + }, + { + "id": "nvidia/bevformer", + "provider": "nvidia", + "model": "bevformer", + "displayName": "bevformer", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/bevformer" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/bevformer", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "bevformer" + ], + "releaseDate": "2025-03-18", + "lastUpdated": "2025-07-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/bevformer", + "modelKey": "nvidia/bevformer", + "displayName": "bevformer", + "metadata": { + "lastUpdated": "2025-07-20", + "openWeights": true, + "releaseDate": "2025-03-18" + } + } + ] + }, + { + "id": "nvidia/bge-m3", + "provider": "nvidia", + "model": "bge-m3", + "displayName": "BGE M3", + "family": "bge", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/baai/bge-m3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "baai/bge-m3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "BGE M3" + ], + "families": [ + "bge" + ], + "releaseDate": "2024-01-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "baai/bge-m3", + "modelKey": "baai/bge-m3", + "displayName": "BGE M3", + "family": "bge", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2024-01-30" + } + } + ] + }, + { + "id": "nvidia/cosmos-predict1-5b", + "provider": "nvidia", + "model": "cosmos-predict1-5b", + "displayName": "cosmos-predict1-5b", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/cosmos-predict1-5b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/cosmos-predict1-5b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "cosmos-predict1-5b" + ], + "releaseDate": "2025-03-18", + "lastUpdated": "2025-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/cosmos-predict1-5b", + "modelKey": "nvidia/cosmos-predict1-5b", + "displayName": "cosmos-predict1-5b", + "metadata": { + "lastUpdated": "2025-03-18", + "openWeights": true, + "releaseDate": "2025-03-18" + } + } + ] + }, + { + "id": "nvidia/cosmos-transfer1-7b", + "provider": "nvidia", + "model": "cosmos-transfer1-7b", + "displayName": "cosmos-transfer1-7b", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/cosmos-transfer1-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/cosmos-transfer1-7b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "cosmos-transfer1-7b" + ], + "releaseDate": "2025-06-13", + "lastUpdated": "2025-06-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/cosmos-transfer1-7b", + "modelKey": "nvidia/cosmos-transfer1-7b", + "displayName": "cosmos-transfer1-7b", + "metadata": { + "lastUpdated": "2025-06-30", + "openWeights": true, + "releaseDate": "2025-06-13" + } + } + ] + }, + { + "id": "nvidia/cosmos-transfer2-5-2b", + "provider": "nvidia", + "model": "cosmos-transfer2-5-2b", + "displayName": "cosmos-transfer2.5-2b", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/cosmos-transfer2_5-2b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/cosmos-transfer2_5-2b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "cosmos-transfer2.5-2b" + ], + "releaseDate": "2026-02-26", + "lastUpdated": "2026-02-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/cosmos-transfer2_5-2b", + "modelKey": "nvidia/cosmos-transfer2_5-2b", + "displayName": "cosmos-transfer2.5-2b", + "metadata": { + "lastUpdated": "2026-02-26", + "openWeights": true, + "releaseDate": "2026-02-26" + } + } + ] + }, + { + "id": "nvidia/dracarys-llama-3-1-70b-instruct", + "provider": "nvidia", + "model": "dracarys-llama-3-1-70b-instruct", + "displayName": "dracarys-llama-3.1-70b-instruct", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/abacusai/dracarys-llama-3_1-70b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "abacusai/dracarys-llama-3_1-70b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "dracarys-llama-3.1-70b-instruct" + ], + "releaseDate": "2024-09-11", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "abacusai/dracarys-llama-3_1-70b-instruct", + "modelKey": "abacusai/dracarys-llama-3_1-70b-instruct", + "displayName": "dracarys-llama-3.1-70b-instruct", + "metadata": { + "lastUpdated": "2025-05-22", + "openWeights": true, + "releaseDate": "2024-09-11" + } + } + ] + }, + { + "id": "nvidia/flux-1-kontext-dev", + "provider": "nvidia", + "model": "flux-1-kontext-dev", + "displayName": "FLUX.1-Kontext-dev", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/black-forest-labs/flux_1-kontext-dev" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 40960, + "outputTokens": 40960, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "black-forest-labs/flux_1-kontext-dev", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "FLUX.1-Kontext-dev" + ], + "releaseDate": "2025-08-12", + "lastUpdated": "2025-08-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "black-forest-labs/flux_1-kontext-dev", + "modelKey": "black-forest-labs/flux_1-kontext-dev", + "displayName": "FLUX.1-Kontext-dev", + "metadata": { + "lastUpdated": "2025-08-12", + "openWeights": true, + "releaseDate": "2025-08-12" + } + } + ] + }, + { + "id": "nvidia/flux-1-schnell", + "provider": "nvidia", + "model": "flux-1-schnell", + "displayName": "FLUX.1-schnell", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/black-forest-labs/flux_1-schnell" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 77, + "inputTokens": 77, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "black-forest-labs/flux_1-schnell", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "FLUX.1-schnell" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2024-08-01", + "lastUpdated": "2026-02-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "black-forest-labs/flux_1-schnell", + "modelKey": "black-forest-labs/flux_1-schnell", + "displayName": "FLUX.1-schnell", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2024-08-01" + } + } + ] + }, + { + "id": "nvidia/flux-2-klein-4b", + "provider": "nvidia", + "model": "flux-2-klein-4b", + "displayName": "FLUX.2 Klein 4B", + "family": "flux", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/black-forest-labs/flux_2-klein-4b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 40960, + "outputTokens": 40960, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "black-forest-labs/flux_2-klein-4b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "FLUX.2 Klein 4B" + ], + "families": [ + "flux" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2026-01-14", + "lastUpdated": "2026-01-31", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "black-forest-labs/flux_2-klein-4b", + "modelKey": "black-forest-labs/flux_2-klein-4b", + "displayName": "FLUX.2 Klein 4B", + "family": "flux", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-01-31", + "openWeights": true, + "releaseDate": "2026-01-14" + } + } + ] + }, + { + "id": "nvidia/flux.1-dev", + "provider": "nvidia", + "model": "flux.1-dev", + "displayName": "FLUX.1-dev", + "family": "flux", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/black-forest-labs/flux.1-dev" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "black-forest-labs/flux.1-dev", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "FLUX.1-dev" + ], + "families": [ + "flux" + ], + "knowledgeCutoff": "2024-08", + "releaseDate": "2024-08-01", + "lastUpdated": "2025-09-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "black-forest-labs/flux.1-dev", + "modelKey": "black-forest-labs/flux.1-dev", + "displayName": "FLUX.1-dev", + "family": "flux", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-09-05", + "openWeights": false, + "releaseDate": "2024-08-01" + } + } + ] + }, + { + "id": "nvidia/gliner-pii", + "provider": "nvidia", + "model": "gliner-pii", + "displayName": "gliner-pii", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/gliner-pii" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/gliner-pii", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gliner-pii" + ], + "releaseDate": "2026-03-03", + "lastUpdated": "2026-03-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/gliner-pii", + "modelKey": "nvidia/gliner-pii", + "displayName": "gliner-pii", + "metadata": { + "lastUpdated": "2026-03-03", + "openWeights": true, + "releaseDate": "2026-03-03" + } + } + ] + }, + { + "id": "nvidia/magpie-tts-zeroshot", + "provider": "nvidia", + "model": "magpie-tts-zeroshot", + "displayName": "magpie-tts-zeroshot", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/magpie-tts-zeroshot" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/magpie-tts-zeroshot", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "magpie-tts-zeroshot" + ], + "releaseDate": "2025-05-22", + "lastUpdated": "2025-06-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/magpie-tts-zeroshot", + "modelKey": "nvidia/magpie-tts-zeroshot", + "displayName": "magpie-tts-zeroshot", + "metadata": { + "lastUpdated": "2025-06-12", + "openWeights": true, + "releaseDate": "2025-05-22" + } + } + ] + }, + { + "id": "nvidia/nemotron-3-content-safety", + "provider": "nvidia", + "model": "nemotron-3-content-safety", + "displayName": "nemotron-3-content-safety", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/nemotron-3-content-safety" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/nemotron-3-content-safety", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "nemotron-3-content-safety" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/nemotron-3-content-safety", + "modelKey": "nvidia/nemotron-3-content-safety", + "displayName": "nemotron-3-content-safety", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": true, + "releaseDate": "2026-04-16" + } + } + ] + }, + { + "id": "nvidia/nemotron-3-nano-30b-a3b", + "provider": "nvidia", + "model": "nemotron-3-nano-30b-a3b", + "displayName": "nemotron-3-nano-30b-a3b", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/nemotron-3-nano-30b-a3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/nemotron-3-nano-30b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "nemotron-3-nano-30b-a3b" + ], + "families": [ + "nemotron" + ], + "knowledgeCutoff": "2024-09", + "releaseDate": "2024-12", + "lastUpdated": "2024-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/nemotron-3-nano-30b-a3b", + "modelKey": "nvidia/nemotron-3-nano-30b-a3b", + "displayName": "nemotron-3-nano-30b-a3b", + "family": "nemotron", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2024-12", + "openWeights": true, + "releaseDate": "2024-12", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", + "provider": "nvidia", + "model": "nemotron-3-nano-omni-30b-a3b-reasoning", + "displayName": "Nemotron 3 Nano Omni", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron 3 Nano Omni" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-04-28", + "lastUpdated": "2026-04-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", + "modelKey": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", + "displayName": "Nemotron 3 Nano Omni", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-04-28", + "openWeights": true, + "releaseDate": "2026-04-28", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": -1, + "max": 32768 + } + ] + } + } + ] + }, + { + "id": "nvidia/nemotron-3-super-120b-a12b", + "provider": "nvidia", + "model": "nemotron-3-super-120b-a12b", + "displayName": "Nemotron 3 Super", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/nemotron-3-super-120b-a12b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/nemotron-3-super-120b-a12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron 3 Super" + ], + "families": [ + "nemotron" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2026-03-11", + "lastUpdated": "2026-03-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/nemotron-3-super-120b-a12b", + "modelKey": "nvidia/nemotron-3-super-120b-a12b", + "displayName": "Nemotron 3 Super", + "family": "nemotron", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2026-03-11", + "openWeights": true, + "releaseDate": "2026-03-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "nvidia/nemotron-3-ultra-550b-a55b", + "provider": "nvidia", + "model": "nemotron-3-ultra-550b-a55b", + "displayName": "Nemotron 3 Ultra 550B A55B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/nemotron-3-ultra-550b-a55b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/nemotron-3-ultra-550b-a55b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.5, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron 3 Ultra 550B A55B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-06-04", + "lastUpdated": "2026-06-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/nemotron-3-ultra-550b-a55b", + "modelKey": "nvidia/nemotron-3-ultra-550b-a55b", + "displayName": "Nemotron 3 Ultra 550B A55B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-06-04", + "openWeights": true, + "releaseDate": "2026-06-04", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "nvidia/nemotron-content-safety-reasoning-4b", + "provider": "nvidia", + "model": "nemotron-content-safety-reasoning-4b", + "displayName": "nemotron-content-safety-reasoning-4b", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/nemotron-content-safety-reasoning-4b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/nemotron-content-safety-reasoning-4b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "nemotron-content-safety-reasoning-4b" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-01-22", + "lastUpdated": "2026-01-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/nemotron-content-safety-reasoning-4b", + "modelKey": "nvidia/nemotron-content-safety-reasoning-4b", + "displayName": "nemotron-content-safety-reasoning-4b", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-01-22", + "openWeights": true, + "releaseDate": "2026-01-22" + } + } + ] + }, + { + "id": "nvidia/nemotron-mini-4b-instruct", + "provider": "nvidia", + "model": "nemotron-mini-4b-instruct", + "displayName": "nemotron-mini-4b-instruct", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/nemotron-mini-4b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/nemotron-mini-4b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "nemotron-mini-4b-instruct" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2024-08-21", + "lastUpdated": "2024-08-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/nemotron-mini-4b-instruct", + "modelKey": "nvidia/nemotron-mini-4b-instruct", + "displayName": "nemotron-mini-4b-instruct", + "family": "nemotron", + "metadata": { + "lastUpdated": "2024-08-26", + "openWeights": true, + "releaseDate": "2024-08-21" + } + } + ] + }, + { + "id": "nvidia/nemotron-voicechat", + "provider": "nvidia", + "model": "nemotron-voicechat", + "displayName": "nemotron-voicechat", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/nemotron-voicechat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/nemotron-voicechat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "nemotron-voicechat" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-03-16", + "lastUpdated": "2026-03-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/nemotron-voicechat", + "modelKey": "nvidia/nemotron-voicechat", + "displayName": "nemotron-voicechat", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-03-16", + "openWeights": true, + "releaseDate": "2026-03-16" + } + } + ] + }, + { + "id": "nvidia/nv-embed-v1", + "provider": "nvidia", + "model": "nv-embed-v1", + "displayName": "nv-embed-v1", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/nv-embed-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/nv-embed-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "nv-embed-v1" + ], + "releaseDate": "2024-06-07", + "lastUpdated": "2025-07-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/nv-embed-v1", + "modelKey": "nvidia/nv-embed-v1", + "displayName": "nv-embed-v1", + "metadata": { + "lastUpdated": "2025-07-22", + "openWeights": true, + "releaseDate": "2024-06-07" + } + } + ] + }, + { + "id": "nvidia/nv-embedcode-7b-v1", + "provider": "nvidia", + "model": "nv-embedcode-7b-v1", + "displayName": "nv-embedcode-7b-v1", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/nv-embedcode-7b-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/nv-embedcode-7b-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "nv-embedcode-7b-v1" + ], + "releaseDate": "2025-03-17", + "lastUpdated": "2025-05-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/nv-embedcode-7b-v1", + "modelKey": "nvidia/nv-embedcode-7b-v1", + "displayName": "nv-embedcode-7b-v1", + "metadata": { + "lastUpdated": "2025-05-29", + "openWeights": true, + "releaseDate": "2025-03-17" + } + } + ] + }, + { + "id": "nvidia/nvidia-nemotron-nano-9b-v2", + "provider": "nvidia", + "model": "nvidia-nemotron-nano-9b-v2", + "displayName": "nvidia-nemotron-nano-9b-v2", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/nvidia-nemotron-nano-9b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/nvidia-nemotron-nano-9b-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "nvidia-nemotron-nano-9b-v2" + ], + "families": [ + "nemotron" + ], + "knowledgeCutoff": "2024-09", + "releaseDate": "2025-08-18", + "lastUpdated": "2025-08-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/nvidia-nemotron-nano-9b-v2", + "modelKey": "nvidia/nvidia-nemotron-nano-9b-v2", + "displayName": "nvidia-nemotron-nano-9b-v2", + "family": "nemotron", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2025-08-18", + "openWeights": true, + "releaseDate": "2025-08-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "nvidia/phi-4-mini-instruct", + "provider": "nvidia", + "model": "phi-4-mini-instruct", + "displayName": "Phi-4-Mini", + "family": "phi", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/microsoft/phi-4-mini-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "microsoft/phi-4-mini-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4-Mini" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2024-12-01", + "lastUpdated": "2025-09-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "microsoft/phi-4-mini-instruct", + "modelKey": "microsoft/phi-4-mini-instruct", + "displayName": "Phi-4-Mini", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-09-05", + "openWeights": true, + "releaseDate": "2024-12-01" + } + } + ] + }, + { + "id": "nvidia/phi-4-multimodal-instruct", + "provider": "nvidia", + "model": "phi-4-multimodal-instruct", + "displayName": "Phi 4 Multimodal", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/microsoft/phi-4-multimodal-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "microsoft/phi-4-multimodal-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi 4 Multimodal" + ], + "releaseDate": "2025-07-26", + "lastUpdated": "2025-07-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "microsoft/phi-4-multimodal-instruct", + "modelKey": "microsoft/phi-4-multimodal-instruct", + "displayName": "Phi 4 Multimodal", + "metadata": { + "lastUpdated": "2025-07-26", + "openWeights": false, + "releaseDate": "2025-07-26" + } + } + ] + }, + { + "id": "nvidia/rerank-qa-mistral-4b", + "provider": "nvidia", + "model": "rerank-qa-mistral-4b", + "displayName": "rerank-qa-mistral-4b", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/rerank-qa-mistral-4b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/rerank-qa-mistral-4b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "rerank-qa-mistral-4b" + ], + "releaseDate": "2024-03-17", + "lastUpdated": "2025-01-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/rerank-qa-mistral-4b", + "modelKey": "nvidia/rerank-qa-mistral-4b", + "displayName": "rerank-qa-mistral-4b", + "metadata": { + "lastUpdated": "2025-01-17", + "openWeights": true, + "releaseDate": "2024-03-17" + } + } + ] + }, + { + "id": "nvidia/riva-translate-4b-instruct-v1-1", + "provider": "nvidia", + "model": "riva-translate-4b-instruct-v1-1", + "displayName": "riva-translate-4b-instruct-v1_1", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/riva-translate-4b-instruct-v1_1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/riva-translate-4b-instruct-v1_1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "riva-translate-4b-instruct-v1_1" + ], + "releaseDate": "2025-12-12", + "lastUpdated": "2025-12-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/riva-translate-4b-instruct-v1_1", + "modelKey": "nvidia/riva-translate-4b-instruct-v1_1", + "displayName": "riva-translate-4b-instruct-v1_1", + "metadata": { + "lastUpdated": "2025-12-12", + "openWeights": true, + "releaseDate": "2025-12-12" + } + } + ] + }, + { + "id": "nvidia/sarvam-m", + "provider": "nvidia", + "model": "sarvam-m", + "displayName": "sarvam-m", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/sarvamai/sarvam-m" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "sarvamai/sarvam-m", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "sarvam-m" + ], + "releaseDate": "2025-07-25", + "lastUpdated": "2025-07-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "sarvamai/sarvam-m", + "modelKey": "sarvamai/sarvam-m", + "displayName": "sarvam-m", + "metadata": { + "lastUpdated": "2025-07-25", + "openWeights": true, + "releaseDate": "2025-07-25" + } + } + ] + }, + { + "id": "nvidia/seed-oss-36b-instruct", + "provider": "nvidia", + "model": "seed-oss-36b-instruct", + "displayName": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/bytedance/seed-oss-36b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262000, + "outputTokens": 262000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "bytedance/seed-oss-36b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ByteDance-Seed/Seed-OSS-36B-Instruct" + ], + "families": [ + "seed" + ], + "releaseDate": "2025-09-04", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "bytedance/seed-oss-36b-instruct", + "modelKey": "bytedance/seed-oss-36b-instruct", + "displayName": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "family": "seed", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-09-04" + } + } + ] + }, + { + "id": "nvidia/solar-10-7b-instruct", + "provider": "nvidia", + "model": "solar-10-7b-instruct", + "displayName": "solar-10.7b-instruct", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/upstage/solar-10_7b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "upstage/solar-10_7b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "solar-10.7b-instruct" + ], + "releaseDate": "2024-06-05", + "lastUpdated": "2025-04-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "upstage/solar-10_7b-instruct", + "modelKey": "upstage/solar-10_7b-instruct", + "displayName": "solar-10.7b-instruct", + "metadata": { + "lastUpdated": "2025-04-10", + "openWeights": true, + "releaseDate": "2024-06-05" + } + } + ] + }, + { + "id": "nvidia/sparsedrive", + "provider": "nvidia", + "model": "sparsedrive", + "displayName": "sparsedrive", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/sparsedrive" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/sparsedrive", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "sparsedrive" + ], + "releaseDate": "2025-03-18", + "lastUpdated": "2025-07-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/sparsedrive", + "modelKey": "nvidia/sparsedrive", + "displayName": "sparsedrive", + "metadata": { + "lastUpdated": "2025-07-20", + "openWeights": true, + "releaseDate": "2025-03-18" + } + } + ] + }, + { + "id": "nvidia/step-3.5-flash", + "provider": "nvidia", + "model": "step-3.5-flash", + "displayName": "Step 3.5 Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/stepfun-ai/step-3.5-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "stepfun-ai/step-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 3.5 Flash" + ], + "releaseDate": "2026-02-02", + "lastUpdated": "2026-02-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "stepfun-ai/step-3.5-flash", + "modelKey": "stepfun-ai/step-3.5-flash", + "displayName": "Step 3.5 Flash", + "metadata": { + "lastUpdated": "2026-02-02", + "openWeights": true, + "releaseDate": "2026-02-02", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "nvidia/step-3.7-flash", + "provider": "nvidia", + "model": "step-3.7-flash", + "displayName": "Step 3.7 Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/stepfun-ai/step-3.7-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "stepfun-ai/step-3.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 3.7 Flash" + ], + "releaseDate": "2026-05-28", + "lastUpdated": "2026-05-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "stepfun-ai/step-3.7-flash", + "modelKey": "stepfun-ai/step-3.7-flash", + "displayName": "Step 3.7 Flash", + "metadata": { + "lastUpdated": "2026-05-28", + "openWeights": true, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "nvidia/streampetr", + "provider": "nvidia", + "model": "streampetr", + "displayName": "streampetr", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/streampetr" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/streampetr", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "streampetr" + ], + "releaseDate": "2025-11-13", + "lastUpdated": "2025-11-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/streampetr", + "modelKey": "nvidia/streampetr", + "displayName": "streampetr", + "metadata": { + "lastUpdated": "2025-11-13", + "openWeights": true, + "releaseDate": "2025-11-13" + } + } + ] + }, + { + "id": "nvidia/studiovoice", + "provider": "nvidia", + "model": "studiovoice", + "displayName": "studiovoice", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/studiovoice" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/studiovoice", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "studiovoice" + ], + "releaseDate": "2024-10-03", + "lastUpdated": "2025-06-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/studiovoice", + "modelKey": "nvidia/studiovoice", + "displayName": "studiovoice", + "metadata": { + "lastUpdated": "2025-06-13", + "openWeights": true, + "releaseDate": "2024-10-03" + } + } + ] + }, + { + "id": "nvidia/synthetic-video-detector", + "provider": "nvidia", + "model": "synthetic-video-detector", + "displayName": "synthetic-video-detector", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/synthetic-video-detector" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/synthetic-video-detector", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "synthetic-video-detector" + ], + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/synthetic-video-detector", + "modelKey": "nvidia/synthetic-video-detector", + "displayName": "synthetic-video-detector", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": true, + "releaseDate": "2026-04-16" + } + } + ] + }, + { + "id": "nvidia/usdcode", + "provider": "nvidia", + "model": "usdcode", + "displayName": "usdcode", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/usdcode" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/usdcode", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "usdcode" + ], + "releaseDate": "2026-01-01", + "lastUpdated": "2026-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/usdcode", + "modelKey": "nvidia/usdcode", + "displayName": "usdcode", + "metadata": { + "lastUpdated": "2026-01-01", + "openWeights": false, + "releaseDate": "2026-01-01" + } + } + ] + }, + { + "id": "nvidia/usdvalidate", + "provider": "nvidia", + "model": "usdvalidate", + "displayName": "usdvalidate", + "sources": [ + "models.dev" + ], + "providers": [ + "nvidia" + ], + "aliases": [ + "nvidia/usdvalidate" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nvidia", + "model": "nvidia/usdvalidate", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "usdvalidate" + ], + "releaseDate": "2024-07-24", + "lastUpdated": "2025-01-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "nvidia/usdvalidate", + "modelKey": "nvidia/usdvalidate", + "displayName": "usdvalidate", + "metadata": { + "lastUpdated": "2025-01-08", + "openWeights": true, + "releaseDate": "2024-07-24" + } + } + ] + }, + { + "id": "oci/cohere.command-a-03-2025", + "provider": "oci", + "model": "cohere.command-a-03-2025", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.command-a-03-2025" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.command-a-03-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.56, + "output": 1.56 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.command-a-03-2025", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/cloud/ai/generative-ai/pricing/" + } + } + ] + }, + { + "id": "oci/cohere.command-a-reasoning", + "provider": "oci", + "model": "cohere.command-a-reasoning", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.command-a-reasoning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.command-a-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.56, + "output": 1.56 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.command-a-reasoning", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/cloud/ai/generative-ai/pricing/" + } + } + ] + }, + { + "id": "oci/cohere.command-a-reasoning-08-2025", + "provider": "oci", + "model": "cohere.command-a-reasoning-08-2025", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.command-a-reasoning-08-2025" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.command-a-reasoning-08-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.56, + "output": 1.56 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.command-a-reasoning-08-2025", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/cohere.command-a-translate-08-2025", + "provider": "oci", + "model": "cohere.command-a-translate-08-2025", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.command-a-translate-08-2025" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.command-a-translate-08-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.09, + "output": 0.09 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.command-a-translate-08-2025", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/cohere.command-a-vision", + "provider": "oci", + "model": "cohere.command-a-vision", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.command-a-vision" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.command-a-vision", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.56, + "output": 1.56 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.command-a-vision", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/cloud/ai/generative-ai/pricing/" + } + } + ] + }, + { + "id": "oci/cohere.command-a-vision-07-2025", + "provider": "oci", + "model": "cohere.command-a-vision-07-2025", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.command-a-vision-07-2025" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.command-a-vision-07-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.56, + "output": 1.56 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.command-a-vision-07-2025", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/cohere.command-latest", + "provider": "oci", + "model": "cohere.command-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.command-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.command-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.56, + "output": 1.56 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.command-latest", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/cloud/ai/generative-ai/pricing/" + } + } + ] + }, + { + "id": "oci/cohere.command-plus-latest", + "provider": "oci", + "model": "cohere.command-plus-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.command-plus-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.command-plus-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.56, + "output": 1.56 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.command-plus-latest", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/cloud/ai/generative-ai/pricing/" + } + } + ] + }, + { + "id": "oci/cohere.command-r-08-2024", + "provider": "oci", + "model": "cohere.command-r-08-2024", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.command-r-08-2024" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.command-r-08-2024", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.command-r-08-2024", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/cohere.command-r-plus-08-2024", + "provider": "oci", + "model": "cohere.command-r-plus-08-2024", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.command-r-plus-08-2024" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.command-r-plus-08-2024", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.56, + "output": 1.56 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.command-r-plus-08-2024", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/cohere.embed-english-image-v3.0", + "provider": "oci", + "model": "cohere.embed-english-image-v3.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.embed-english-image-v3.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "outputVectorSize": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.embed-english-image-v3.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.embed-english-image-v3.0", + "mode": "embedding", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/cohere.embed-english-light-image-v3.0", + "provider": "oci", + "model": "cohere.embed-english-light-image-v3.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.embed-english-light-image-v3.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "outputVectorSize": 384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.embed-english-light-image-v3.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.embed-english-light-image-v3.0", + "mode": "embedding", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/cohere.embed-english-light-v3.0", + "provider": "oci", + "model": "cohere.embed-english-light-v3.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.embed-english-light-v3.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "outputVectorSize": 384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.embed-english-light-v3.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.embed-english-light-v3.0", + "mode": "embedding", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/cohere.embed-english-v3.0", + "provider": "oci", + "model": "cohere.embed-english-v3.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.embed-english-v3.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "outputVectorSize": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.embed-english-v3.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.embed-english-v3.0", + "mode": "embedding", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/cohere.embed-multilingual-image-v3.0", + "provider": "oci", + "model": "cohere.embed-multilingual-image-v3.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.embed-multilingual-image-v3.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "outputVectorSize": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.embed-multilingual-image-v3.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.embed-multilingual-image-v3.0", + "mode": "embedding", + "metadata": { + "source": "https://www.oracle.com/cloud/ai/generative-ai/pricing/" + } + } + ] + }, + { + "id": "oci/cohere.embed-multilingual-light-image-v3.0", + "provider": "oci", + "model": "cohere.embed-multilingual-light-image-v3.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.embed-multilingual-light-image-v3.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "outputVectorSize": 384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.embed-multilingual-light-image-v3.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.embed-multilingual-light-image-v3.0", + "mode": "embedding", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/cohere.embed-multilingual-light-v3.0", + "provider": "oci", + "model": "cohere.embed-multilingual-light-v3.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.embed-multilingual-light-v3.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "outputVectorSize": 384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.embed-multilingual-light-v3.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.embed-multilingual-light-v3.0", + "mode": "embedding", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/cohere.embed-multilingual-v3.0", + "provider": "oci", + "model": "cohere.embed-multilingual-v3.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.embed-multilingual-v3.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "outputVectorSize": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.embed-multilingual-v3.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.embed-multilingual-v3.0", + "mode": "embedding", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/cohere.embed-v4.0", + "provider": "oci", + "model": "cohere.embed-v4.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/cohere.embed-v4.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "outputVectorSize": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "embeddingImageInput": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/cohere.embed-v4.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/cohere.embed-v4.0", + "mode": "embedding", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/google.gemini-2.5-flash", + "provider": "oci", + "model": "google.gemini-2.5-flash", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/google.gemini-2.5-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/google.gemini-2.5-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/google.gemini-2.5-flash", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/google.gemini-2.5-flash-lite", + "provider": "oci", + "model": "google.gemini-2.5-flash-lite", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/google.gemini-2.5-flash-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/google.gemini-2.5-flash-lite", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/google.gemini-2.5-flash-lite", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/google.gemini-2.5-pro", + "provider": "oci", + "model": "google.gemini-2.5-pro", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/google.gemini-2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/google.gemini-2.5-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/google.gemini-2.5-pro", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/meta.llama-3.1-405b-instruct", + "provider": "oci", + "model": "meta.llama-3.1-405b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/meta.llama-3.1-405b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/meta.llama-3.1-405b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10.68, + "output": 10.68 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/meta.llama-3.1-405b-instruct", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/meta.llama-3.1-70b-instruct", + "provider": "oci", + "model": "meta.llama-3.1-70b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/meta.llama-3.1-70b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/meta.llama-3.1-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/meta.llama-3.1-70b-instruct", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/meta.llama-3.1-8b-instruct", + "provider": "oci", + "model": "meta.llama-3.1-8b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/meta.llama-3.1-8b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/meta.llama-3.1-8b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/meta.llama-3.1-8b-instruct", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/meta.llama-3.2-11b-vision-instruct", + "provider": "oci", + "model": "meta.llama-3.2-11b-vision-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/meta.llama-3.2-11b-vision-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/meta.llama-3.2-11b-vision-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/meta.llama-3.2-11b-vision-instruct", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/meta.llama-3.2-90b-vision-instruct", + "provider": "oci", + "model": "meta.llama-3.2-90b-vision-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/meta.llama-3.2-90b-vision-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/meta.llama-3.2-90b-vision-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/meta.llama-3.2-90b-vision-instruct", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/meta.llama-3.3-70b-instruct", + "provider": "oci", + "model": "meta.llama-3.3-70b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/meta.llama-3.3-70b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/meta.llama-3.3-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/meta.llama-3.3-70b-instruct", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/meta.llama-3.3-70b-instruct-fp8-dynamic", + "provider": "oci", + "model": "meta.llama-3.3-70b-instruct-fp8-dynamic", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/meta.llama-3.3-70b-instruct-fp8-dynamic" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/meta.llama-3.3-70b-instruct-fp8-dynamic", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/meta.llama-3.3-70b-instruct-fp8-dynamic", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/meta.llama-4-maverick-17b-128e-instruct-fp8", + "provider": "oci", + "model": "meta.llama-4-maverick-17b-128e-instruct-fp8", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/meta.llama-4-maverick-17b-128e-instruct-fp8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/meta.llama-4-maverick-17b-128e-instruct-fp8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/meta.llama-4-maverick-17b-128e-instruct-fp8", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/meta.llama-4-scout-17b-16e-instruct", + "provider": "oci", + "model": "meta.llama-4-scout-17b-16e-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/meta.llama-4-scout-17b-16e-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 10485760, + "inputTokens": 10485760, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/meta.llama-4-scout-17b-16e-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/meta.llama-4-scout-17b-16e-instruct", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/openai.gpt-5", + "provider": "oci", + "model": "openai.gpt-5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/openai.gpt-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 272000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/openai.gpt-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/openai.gpt-5", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/openai.gpt-5-mini", + "provider": "oci", + "model": "openai.gpt-5-mini", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/openai.gpt-5-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 272000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/openai.gpt-5-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/openai.gpt-5-mini", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/openai.gpt-5-nano", + "provider": "oci", + "model": "openai.gpt-5-nano", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/openai.gpt-5-nano" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 272000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/openai.gpt-5-nano", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/openai.gpt-5-nano", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/xai.grok-3", + "provider": "oci", + "model": "xai.grok-3", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/xai.grok-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/xai.grok-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/xai.grok-3", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/xai.grok-3-fast", + "provider": "oci", + "model": "xai.grok-3-fast", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/xai.grok-3-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/xai.grok-3-fast", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/xai.grok-3-fast", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/xai.grok-3-mini", + "provider": "oci", + "model": "xai.grok-3-mini", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/xai.grok-3-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/xai.grok-3-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/xai.grok-3-mini", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/xai.grok-3-mini-fast", + "provider": "oci", + "model": "xai.grok-3-mini-fast", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/xai.grok-3-mini-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/xai.grok-3-mini-fast", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/xai.grok-3-mini-fast", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/xai.grok-4", + "provider": "oci", + "model": "xai.grok-4", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/xai.grok-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/xai.grok-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/xai.grok-4", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/xai.grok-4-fast", + "provider": "oci", + "model": "xai.grok-4-fast", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/xai.grok-4-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/xai.grok-4-fast", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/xai.grok-4-fast", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/xai.grok-4.1-fast", + "provider": "oci", + "model": "xai.grok-4.1-fast", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/xai.grok-4.1-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/xai.grok-4.1-fast", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/xai.grok-4.1-fast", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/xai.grok-4.20", + "provider": "oci", + "model": "xai.grok-4.20", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/xai.grok-4.20" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/xai.grok-4.20", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/xai.grok-4.20", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/xai.grok-4.20-multi-agent", + "provider": "oci", + "model": "xai.grok-4.20-multi-agent", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/xai.grok-4.20-multi-agent" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/xai.grok-4.20-multi-agent", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/xai.grok-4.20-multi-agent", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "oci/xai.grok-code-fast-1", + "provider": "oci", + "model": "xai.grok-code-fast-1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "oci" + ], + "aliases": [ + "oci/xai.grok-code-fast-1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "oci", + "model": "oci/xai.grok-code-fast-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "oci", + "model": "oci/xai.grok-code-fast-1", + "mode": "chat", + "metadata": { + "source": "https://www.oracle.com/artificial-intelligence/generative-ai/generative-ai-service/pricing" + } + } + ] + }, + { + "id": "ollama-cloud/cogito-2.1:671b", + "provider": "ollama-cloud", + "model": "cogito-2.1:671b", + "displayName": "cogito-2.1:671b", + "family": "cogito", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/cogito-2.1:671b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "cogito-2.1:671b" + ], + "families": [ + "cogito" + ], + "statuses": [ + "deprecated" + ], + "releaseDate": "2025-11-19", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "cogito-2.1:671b", + "modelKey": "cogito-2.1:671b", + "displayName": "cogito-2.1:671b", + "family": "cogito", + "status": "deprecated", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-11-19", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "ollama-cloud/gemma3:12b", + "provider": "ollama-cloud", + "model": "gemma3:12b", + "displayName": "gemma3:12b", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/gemma3:12b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "gemma3:12b" + ], + "families": [ + "gemma" + ], + "releaseDate": "2024-12-01", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "gemma3:12b", + "modelKey": "gemma3:12b", + "displayName": "gemma3:12b", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2024-12-01" + } + } + ] + }, + { + "id": "ollama-cloud/gemma3:27b", + "provider": "ollama-cloud", + "model": "gemma3:27b", + "displayName": "gemma3:27b", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/gemma3:27b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "gemma3:27b" + ], + "families": [ + "gemma" + ], + "releaseDate": "2025-07-27", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "gemma3:27b", + "modelKey": "gemma3:27b", + "displayName": "gemma3:27b", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-07-27" + } + } + ] + }, + { + "id": "ollama-cloud/gemma3:4b", + "provider": "ollama-cloud", + "model": "gemma3:4b", + "displayName": "gemma3:4b", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/gemma3:4b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "gemma3:4b" + ], + "families": [ + "gemma" + ], + "releaseDate": "2024-12-01", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "gemma3:4b", + "modelKey": "gemma3:4b", + "displayName": "gemma3:4b", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2024-12-01" + } + } + ] + }, + { + "id": "ollama-cloud/gemma4:31b", + "provider": "ollama-cloud", + "model": "gemma4:31b", + "displayName": "gemma4:31b", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/gemma4:31b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "gemma4:31b" + ], + "families": [ + "gemma" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "gemma4:31b", + "modelKey": "gemma4:31b", + "displayName": "gemma4:31b", + "family": "gemma", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-08", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "ollama-cloud/nemotron-3-nano:30b", + "provider": "ollama-cloud", + "model": "nemotron-3-nano:30b", + "displayName": "nemotron-3-nano:30b", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/nemotron-3-nano:30b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "metadata": { + "displayNames": [ + "nemotron-3-nano:30b" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2025-12-15", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "nemotron-3-nano:30b", + "modelKey": "nemotron-3-nano:30b", + "displayName": "nemotron-3-nano:30b", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-12-15", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "ollama-cloud/nemotron-3-super", + "provider": "ollama-cloud", + "model": "nemotron-3-super", + "displayName": "nemotron-3-super", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/nemotron-3-super" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "nemotron-3-super" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-03-11", + "lastUpdated": "2026-03-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "nemotron-3-super", + "modelKey": "nemotron-3-super", + "displayName": "nemotron-3-super", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-03-12", + "openWeights": true, + "releaseDate": "2026-03-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "ollama-cloud/nemotron-3-ultra", + "provider": "ollama-cloud", + "model": "nemotron-3-ultra", + "displayName": "nemotron-3-ultra", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/nemotron-3-ultra" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "nemotron-3-ultra" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-06-04", + "lastUpdated": "2026-06-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "nemotron-3-ultra", + "modelKey": "nemotron-3-ultra", + "displayName": "nemotron-3-ultra", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-06-04", + "openWeights": true, + "releaseDate": "2026-06-04", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "ollama-cloud/rnj-1:8b", + "provider": "ollama-cloud", + "model": "rnj-1:8b", + "displayName": "rnj-1:8b", + "family": "rnj", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/rnj-1:8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "rnj-1:8b" + ], + "families": [ + "rnj" + ], + "releaseDate": "2025-12-06", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "rnj-1:8b", + "modelKey": "rnj-1:8b", + "displayName": "rnj-1:8b", + "family": "rnj", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-12-06" + } + } + ] + }, + { + "id": "ollama/codegeex4", + "provider": "ollama", + "model": "codegeex4", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/codegeex4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/codegeex4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/codegeex4", + "mode": "chat" + } + ] + }, + { + "id": "ollama/codegemma", + "provider": "ollama", + "model": "codegemma", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/codegemma" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/codegemma", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/codegemma", + "mode": "completion" + } + ] + }, + { + "id": "ollama/internlm2-5-20b-chat", + "provider": "ollama", + "model": "internlm2-5-20b-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/internlm2_5-20b-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/internlm2_5-20b-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/internlm2_5-20b-chat", + "mode": "chat" + } + ] + }, + { + "id": "ollama/llama2", + "provider": "ollama", + "model": "llama2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/llama2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/llama2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/llama2", + "mode": "chat" + } + ] + }, + { + "id": "ollama/llama2-uncensored", + "provider": "ollama", + "model": "llama2-uncensored", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/llama2-uncensored" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/llama2-uncensored", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/llama2-uncensored", + "mode": "completion" + } + ] + }, + { + "id": "ollama/llama2:13b", + "provider": "ollama", + "model": "llama2:13b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/llama2:13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/llama2:13b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/llama2:13b", + "mode": "chat" + } + ] + }, + { + "id": "ollama/llama2:70b", + "provider": "ollama", + "model": "llama2:70b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/llama2:70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/llama2:70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/llama2:70b", + "mode": "chat" + } + ] + }, + { + "id": "ollama/llama2:7b", + "provider": "ollama", + "model": "llama2:7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/llama2:7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/llama2:7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/llama2:7b", + "mode": "chat" + } + ] + }, + { + "id": "ollama/llama3", + "provider": "ollama", + "model": "llama3", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/llama3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/llama3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/llama3", + "mode": "chat" + } + ] + }, + { + "id": "ollama/llama3:70b", + "provider": "ollama", + "model": "llama3:70b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/llama3:70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/llama3:70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/llama3:70b", + "mode": "chat" + } + ] + }, + { + "id": "ollama/llama3:8b", + "provider": "ollama", + "model": "llama3:8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/llama3:8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/llama3:8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/llama3:8b", + "mode": "chat" + } + ] + }, + { + "id": "ollama/llama3.1", + "provider": "ollama", + "model": "llama3.1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/llama3.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/llama3.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/llama3.1", + "mode": "chat" + } + ] + }, + { + "id": "ollama/orca-mini", + "provider": "ollama", + "model": "orca-mini", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/orca-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/orca-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/orca-mini", + "mode": "completion" + } + ] + }, + { + "id": "ollama/vicuna", + "provider": "ollama", + "model": "vicuna", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/vicuna" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2048, + "inputTokens": 2048, + "maxTokens": 2048, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/vicuna", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/vicuna", + "mode": "completion" + } + ] + }, + { + "id": "openai/chatgpt-4o-latest", + "provider": "openai", + "model": "chatgpt-4o-latest", + "displayName": "chatgpt-4o-latest", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "helicone", + "openai", + "poe" + ], + "aliases": [ + "302ai/chatgpt-4o-latest", + "helicone/chatgpt-4o-latest", + "openai/chatgpt-4o-latest", + "poe/openai/chatgpt-4o-latest" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false, + "attachments": true, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "chatgpt-4o-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "chatgpt-4o-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 2.5, + "input": 5, + "output": 20 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/chatgpt-4o-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4.5, + "output": 14 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "chatgpt-4o-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ChatGPT-4o-Latest", + "OpenAI ChatGPT-4o", + "chatgpt-4o-latest" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2023-09", + "releaseDate": "2024-08-08", + "lastUpdated": "2024-08-08", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "chatgpt-4o-latest", + "modelKey": "chatgpt-4o-latest", + "displayName": "chatgpt-4o-latest", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-08-08", + "openWeights": false, + "releaseDate": "2024-08-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "chatgpt-4o-latest", + "modelKey": "chatgpt-4o-latest", + "displayName": "OpenAI ChatGPT-4o", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2024-08-14", + "openWeights": false, + "releaseDate": "2024-08-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/chatgpt-4o-latest", + "modelKey": "openai/chatgpt-4o-latest", + "displayName": "ChatGPT-4o-Latest", + "family": "gpt", + "status": "deprecated", + "metadata": { + "lastUpdated": "2024-08-14", + "openWeights": false, + "releaseDate": "2024-08-14" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "chatgpt-4o-latest", + "mode": "chat" + } + ] + }, + { + "id": "openai/chatgpt-image-latest", + "provider": "openai", + "model": "chatgpt-image-latest", + "displayName": "chatgpt-image-latest", + "family": "gpt-image", + "mode": "image_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/chatgpt-image-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "inputTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "embedding": false, + "imageGeneration": true, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "chatgpt-image-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "inputImage": 10, + "outputImage": 40 + }, + "extra": { + "cache_read_input_image_token_cost": 0.0000025 + } + } + ] + }, + "metadata": { + "displayNames": [ + "chatgpt-image-latest" + ], + "families": [ + "gpt-image" + ], + "modes": [ + "image_generation" + ], + "releaseDate": "2025-12-16", + "lastUpdated": "2025-12-16", + "supportedEndpoints": [ + "/v1/images/edits", + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "chatgpt-image-latest", + "modelKey": "chatgpt-image-latest", + "displayName": "chatgpt-image-latest", + "family": "gpt-image", + "metadata": { + "lastUpdated": "2025-12-16", + "openWeights": false, + "releaseDate": "2025-12-16" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "chatgpt-image-latest", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "openai/codex-mini", + "provider": "openai", + "model": "codex-mini", + "displayName": "Codex Mini", + "family": "gpt-codex-mini", + "mode": "responses", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/codex-mini", + "azure/codex-mini" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.375, + "input": 1.5, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.375, + "input": 1.5, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/codex-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.375, + "input": 1.5, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Codex Mini" + ], + "families": [ + "gpt-codex-mini" + ], + "modes": [ + "responses" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-05-16", + "lastUpdated": "2025-05-16", + "supportedEndpoints": [ + "/v1/responses" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "codex-mini", + "modelKey": "codex-mini", + "displayName": "Codex Mini", + "family": "gpt-codex-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-05-16", + "openWeights": false, + "releaseDate": "2025-05-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "codex-mini", + "modelKey": "codex-mini", + "displayName": "Codex Mini", + "family": "gpt-codex-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-05-16", + "openWeights": false, + "releaseDate": "2025-05-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/codex-mini", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/codex-mini-latest", + "provider": "openai", + "model": "codex-mini-latest", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/codex-mini-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "codex-mini-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.375, + "input": 1.5, + "output": 6 + } + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "supportedEndpoints": [ + "/v1/responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "codex-mini-latest", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/container", + "provider": "openai", + "model": "container", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/container" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "openai/container", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perSession": { + "codeInterpreter": 0.03 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "openai/container", + "mode": "chat" + } + ] + }, + { + "id": "openai/dall-e-2", + "provider": "openai", + "model": "dall-e-2", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "aiml", + "azure", + "openai" + ], + "aliases": [ + "aiml/dall-e-2", + "azure/standard/1024-x-1024/dall-e-2", + "openai/1024-x-1024/dall-e-2", + "openai/256-x-256/dall-e-2", + "openai/512-x-512/dall-e-2", + "openai/dall-e-2" + ], + "mergedProviderModelRecords": 6, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": true, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "aiml", + "model": "aiml/dall-e-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.026 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/standard/1024-x-1024/dall-e-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "output": 0 + }, + "perPixel": { + "input": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "1024-x-1024/dall-e-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 1.9e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "256-x-256/dall-e-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 2.4414e-7, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "512-x-512/dall-e-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 6.86e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "dall-e-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.02 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/edits", + "/v1/images/generations", + "/v1/images/variations" + ], + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "aiml", + "model": "aiml/dall-e-2", + "mode": "image_generation", + "metadata": { + "metadata": { + "notes": "DALL-E 2 via AI/ML API - Reliable text-to-image generation" + }, + "source": "https://docs.aimlapi.com/", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/standard/1024-x-1024/dall-e-2", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "1024-x-1024/dall-e-2", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "256-x-256/dall-e-2", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "512-x-512/dall-e-2", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "dall-e-2", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits", + "/v1/images/variations" + ] + } + } + ] + }, + { + "id": "openai/dall-e-3", + "provider": "openai", + "model": "dall-e-3", + "displayName": "DALL-E-3", + "family": "dall-e", + "mode": "image_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "aiml", + "azure", + "openai", + "poe" + ], + "aliases": [ + "aiml/dall-e-3", + "azure/hd/1024-x-1024/dall-e-3", + "azure/hd/1024-x-1792/dall-e-3", + "azure/hd/1792-x-1024/dall-e-3", + "azure/standard/1024-x-1024/dall-e-3", + "azure/standard/1024-x-1792/dall-e-3", + "azure/standard/1792-x-1024/dall-e-3", + "openai/dall-e-3", + "openai/hd/1024-x-1024/dall-e-3", + "openai/hd/1024-x-1792/dall-e-3", + "openai/hd/1792-x-1024/dall-e-3", + "openai/standard/1024-x-1024/dall-e-3", + "openai/standard/1024-x-1792/dall-e-3", + "openai/standard/1792-x-1024/dall-e-3", + "poe/openai/dall-e-3" + ], + "mergedProviderModelRecords": 15, + "limits": { + "contextTokens": 800, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": true, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": true, + "openWeights": false, + "reasoning": false, + "temperature": false, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "aiml", + "model": "aiml/dall-e-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.052 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/hd/1024-x-1024/dall-e-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "output": 0 + }, + "perPixel": { + "input": 7.629e-8 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/hd/1024-x-1792/dall-e-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "output": 0 + }, + "perPixel": { + "input": 6.539e-8 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/hd/1792-x-1024/dall-e-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "output": 0 + }, + "perPixel": { + "input": 6.539e-8 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/standard/1024-x-1024/dall-e-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "output": 0 + }, + "perPixel": { + "input": 3.81469e-8 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/standard/1024-x-1792/dall-e-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "output": 0 + }, + "perPixel": { + "input": 4.359e-8 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/standard/1792-x-1024/dall-e-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "output": 0 + }, + "perPixel": { + "input": 4.359e-8 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "dall-e-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.04 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "hd/1024-x-1024/dall-e-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 7.629e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "hd/1024-x-1792/dall-e-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 6.539e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "hd/1792-x-1024/dall-e-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 6.539e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "standard/1024-x-1024/dall-e-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 3.81469e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "standard/1024-x-1792/dall-e-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 4.359e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "standard/1792-x-1024/dall-e-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 4.359e-8, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "DALL-E-3" + ], + "families": [ + "dall-e" + ], + "modes": [ + "image_generation" + ], + "releaseDate": "2023-11-06", + "lastUpdated": "2023-11-06", + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 15 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/dall-e-3", + "modelKey": "openai/dall-e-3", + "displayName": "DALL-E-3", + "family": "dall-e", + "metadata": { + "lastUpdated": "2023-11-06", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "aiml", + "model": "aiml/dall-e-3", + "mode": "image_generation", + "metadata": { + "metadata": { + "notes": "DALL-E 3 via AI/ML API - High-quality text-to-image generation" + }, + "source": "https://docs.aimlapi.com/", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/hd/1024-x-1024/dall-e-3", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/hd/1024-x-1792/dall-e-3", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/hd/1792-x-1024/dall-e-3", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/standard/1024-x-1024/dall-e-3", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/standard/1024-x-1792/dall-e-3", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/standard/1792-x-1024/dall-e-3", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "dall-e-3", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "hd/1024-x-1024/dall-e-3", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "hd/1024-x-1792/dall-e-3", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "hd/1792-x-1024/dall-e-3", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "standard/1024-x-1024/dall-e-3", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "standard/1024-x-1792/dall-e-3", + "mode": "image_generation" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "standard/1792-x-1024/dall-e-3", + "mode": "image_generation" + } + ] + }, + { + "id": "openai/ft:gpt-3.5-turbo", + "provider": "openai", + "model": "ft:gpt-3.5-turbo", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/ft:gpt-3.5-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16385, + "inputTokens": 16385, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "ft:gpt-3.5-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 6 + }, + "extra": { + "input_cost_per_token_batches": 0.0000015, + "output_cost_per_token_batches": 0.000003 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "ft:gpt-3.5-turbo", + "mode": "chat" + } + ] + }, + { + "id": "openai/ft:gpt-3.5-turbo-0125", + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/ft:gpt-3.5-turbo-0125" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16385, + "inputTokens": 16385, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125", + "mode": "chat" + } + ] + }, + { + "id": "openai/ft:gpt-3.5-turbo-0613", + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0613", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/ft:gpt-3.5-turbo-0613" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0613", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0613", + "mode": "chat" + } + ] + }, + { + "id": "openai/ft:gpt-3.5-turbo-1106", + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/ft:gpt-3.5-turbo-1106" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16385, + "inputTokens": 16385, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106", + "mode": "chat" + } + ] + }, + { + "id": "openai/ft:gpt-4-0613", + "provider": "openai", + "model": "ft:gpt-4-0613", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/ft:gpt-4-0613" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "ft:gpt-4-0613", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 30, + "output": 60 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "ft:gpt-4-0613", + "mode": "chat", + "metadata": { + "source": "OpenAI needs to add pricing for this ft model, will be updated when added by OpenAI. Defaulting to base model pricing" + } + } + ] + }, + { + "id": "openai/ft:gpt-4.1-2025-04-14", + "provider": "openai", + "model": "ft:gpt-4.1-2025-04-14", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/ft:gpt-4.1-2025-04-14" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1047576, + "inputTokens": 1047576, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "ft:gpt-4.1-2025-04-14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.75, + "input": 3, + "output": 12 + }, + "extra": { + "input_cost_per_token_batches": 0.0000015, + "output_cost_per_token_batches": 0.000006 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "ft:gpt-4.1-2025-04-14", + "mode": "chat" + } + ] + }, + { + "id": "openai/ft:gpt-4.1-mini-2025-04-14", + "provider": "openai", + "model": "ft:gpt-4.1-mini-2025-04-14", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/ft:gpt-4.1-mini-2025-04-14" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1047576, + "inputTokens": 1047576, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "ft:gpt-4.1-mini-2025-04-14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.8, + "output": 3.2 + }, + "extra": { + "input_cost_per_token_batches": 4e-7, + "output_cost_per_token_batches": 0.0000016 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "ft:gpt-4.1-mini-2025-04-14", + "mode": "chat" + } + ] + }, + { + "id": "openai/ft:gpt-4.1-nano-2025-04-14", + "provider": "openai", + "model": "ft:gpt-4.1-nano-2025-04-14", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/ft:gpt-4.1-nano-2025-04-14" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1047576, + "inputTokens": 1047576, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "ft:gpt-4.1-nano-2025-04-14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.8 + }, + "extra": { + "input_cost_per_token_batches": 1e-7, + "output_cost_per_token_batches": 4e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "ft:gpt-4.1-nano-2025-04-14", + "mode": "chat" + } + ] + }, + { + "id": "openai/ft:gpt-4o-2024-08-06", + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/ft:gpt-4o-2024-08-06" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.875, + "input": 3.75, + "output": 15 + }, + "extra": { + "input_cost_per_token_batches": 0.000001875, + "output_cost_per_token_batches": 0.0000075 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06", + "mode": "chat" + } + ] + }, + { + "id": "openai/ft:gpt-4o-2024-11-20", + "provider": "openai", + "model": "ft:gpt-4o-2024-11-20", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/ft:gpt-4o-2024-11-20" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "ft:gpt-4o-2024-11-20", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheWrite": 1.875, + "input": 3.75, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "ft:gpt-4o-2024-11-20", + "mode": "chat" + } + ] + }, + { + "id": "openai/ft:gpt-4o-mini-2024-07-18", + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/ft:gpt-4o-mini-2024-07-18" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.3, + "output": 1.2 + }, + "extra": { + "input_cost_per_token_batches": 1.5e-7, + "output_cost_per_token_batches": 6e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18", + "mode": "chat" + } + ] + }, + { + "id": "openai/ft:o4-mini-2025-04-16", + "provider": "openai", + "model": "ft:o4-mini-2025-04-16", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/ft:o4-mini-2025-04-16" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "ft:o4-mini-2025-04-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1, + "input": 4, + "output": 16 + }, + "extra": { + "input_cost_per_token_batches": 0.000002, + "output_cost_per_token_batches": 0.000008 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "ft:o4-mini-2025-04-16", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-3.5-turbo", + "provider": "openai", + "model": "gpt-3.5-turbo", + "displayName": "GPT-3.5-turbo", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "cloudflare-ai-gateway", + "github_copilot", + "kilo", + "llmgateway", + "nano-gpt", + "openai", + "openrouter", + "orcarouter", + "poe", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "azure/gpt-3.5-turbo", + "cloudflare-ai-gateway/openai/gpt-3.5-turbo", + "github_copilot/gpt-3.5-turbo", + "kilo/openai/gpt-3.5-turbo", + "llmgateway/gpt-3.5-turbo", + "nano-gpt/openai/gpt-3.5-turbo", + "openai/gpt-3.5-turbo", + "openrouter/openai/gpt-3.5-turbo", + "orcarouter/openai/gpt-3.5-turbo", + "poe/openai/gpt-3.5-turbo", + "vercel/openai/gpt-3.5-turbo", + "vercel_ai_gateway/openai/gpt-3.5-turbo" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 16385, + "inputTokens": 16385, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "supports1MContext": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "openai/gpt-3.5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-3.5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-3.5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-3.5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-3.5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-3.5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-3.5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 1.4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-3.5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-3.5-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-3.5-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-3.5-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-3.5-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.5, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/gpt-3.5-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-3.5 Turbo", + "GPT-3.5-Turbo", + "GPT-3.5-turbo", + "OpenAI: GPT-3.5 Turbo" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2021-09-01", + "releaseDate": "2023-03-01", + "lastUpdated": "2023-11-06", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "openai/gpt-3.5-turbo", + "modelKey": "openai/gpt-3.5-turbo", + "displayName": "GPT-3.5-turbo", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-09-01", + "lastUpdated": "2023-11-06", + "openWeights": false, + "releaseDate": "2023-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-3.5-turbo", + "modelKey": "openai/gpt-3.5-turbo", + "displayName": "OpenAI: GPT-3.5 Turbo", + "metadata": { + "lastUpdated": "2023-11-06", + "openWeights": false, + "releaseDate": "2023-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-3.5-turbo", + "modelKey": "gpt-3.5-turbo", + "displayName": "GPT-3.5-turbo", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-09-01", + "lastUpdated": "2023-11-06", + "openWeights": false, + "releaseDate": "2023-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-3.5-turbo", + "modelKey": "openai/gpt-3.5-turbo", + "displayName": "GPT-3.5 Turbo", + "family": "gpt", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2022-11-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-3.5-turbo", + "modelKey": "gpt-3.5-turbo", + "displayName": "GPT-3.5-turbo", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-09-01", + "lastUpdated": "2023-11-06", + "openWeights": false, + "releaseDate": "2023-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-3.5-turbo", + "modelKey": "openai/gpt-3.5-turbo", + "displayName": "GPT-3.5-turbo", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-09-01", + "lastUpdated": "2023-11-06", + "openWeights": false, + "releaseDate": "2023-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-3.5-turbo", + "modelKey": "openai/gpt-3.5-turbo", + "displayName": "GPT-3.5-turbo", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-09-01", + "lastUpdated": "2023-11-06", + "openWeights": false, + "releaseDate": "2023-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-3.5-turbo", + "modelKey": "openai/gpt-3.5-turbo", + "displayName": "GPT-3.5-Turbo", + "family": "gpt", + "metadata": { + "lastUpdated": "2023-09-13", + "openWeights": false, + "releaseDate": "2023-09-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-3.5-turbo", + "modelKey": "openai/gpt-3.5-turbo", + "displayName": "GPT-3.5 Turbo", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-09", + "lastUpdated": "2023-11-06", + "openWeights": false, + "releaseDate": "2023-05-28" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-3.5-turbo", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-3.5-turbo", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-3.5-turbo", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-3.5-turbo", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/gpt-3.5-turbo", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo", + "displayName": "OpenAI: GPT-3.5 Turbo", + "metadata": { + "canonicalSlug": "openai/gpt-3.5-turbo", + "createdAt": "2023-05-28T00:00:00.000Z", + "knowledgeCutoff": "2021-09-30", + "links": { + "details": "/api/v1/models/openai/gpt-3.5-turbo/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 16385, + "max_completion_tokens": 4096, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-3.5-turbo-0125", + "provider": "openai", + "model": "gpt-3.5-turbo-0125", + "displayName": "GPT-3.5 Turbo 0125", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "openai" + ], + "aliases": [ + "azure-cognitive-services/gpt-3.5-turbo-0125", + "azure/gpt-3.5-turbo-0125", + "openai/gpt-3.5-turbo-0125" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 16385, + "inputTokens": 16385, + "maxTokens": 4096, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-3.5-turbo-0125", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-3.5-turbo-0125", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-3.5-turbo-0125", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-3.5-turbo-0125", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-3.5 Turbo 0125" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2021-08", + "releaseDate": "2024-01-25", + "lastUpdated": "2024-01-25", + "deprecationDate": "2025-03-31", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-3.5-turbo-0125", + "modelKey": "gpt-3.5-turbo-0125", + "displayName": "GPT-3.5 Turbo 0125", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-08", + "lastUpdated": "2024-01-25", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-3.5-turbo-0125", + "modelKey": "gpt-3.5-turbo-0125", + "displayName": "GPT-3.5 Turbo 0125", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-08", + "lastUpdated": "2024-01-25", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-3.5-turbo-0125", + "mode": "chat", + "metadata": { + "deprecationDate": "2025-03-31" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-3.5-turbo-0125", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-3.5-turbo-0301", + "provider": "openai", + "model": "gpt-3.5-turbo-0301", + "displayName": "GPT-3.5 Turbo 0301", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/gpt-3.5-turbo-0301", + "azure/gpt-3.5-turbo-0301" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-3.5-turbo-0301", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-3.5-turbo-0301", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-3.5 Turbo 0301" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2021-08", + "releaseDate": "2023-03-01", + "lastUpdated": "2023-03-01", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-3.5-turbo-0301", + "modelKey": "gpt-3.5-turbo-0301", + "displayName": "GPT-3.5 Turbo 0301", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-08", + "lastUpdated": "2023-03-01", + "openWeights": false, + "releaseDate": "2023-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-3.5-turbo-0301", + "modelKey": "gpt-3.5-turbo-0301", + "displayName": "GPT-3.5 Turbo 0301", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-08", + "lastUpdated": "2023-03-01", + "openWeights": false, + "releaseDate": "2023-03-01" + } + } + ] + }, + { + "id": "openai/gpt-3.5-turbo-0613", + "provider": "openai", + "model": "gpt-3.5-turbo-0613", + "displayName": "GPT-3.5 Turbo 0613", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "github_copilot", + "kilo", + "openrouter" + ], + "aliases": [ + "azure-cognitive-services/gpt-3.5-turbo-0613", + "azure/gpt-3.5-turbo-0613", + "github_copilot/gpt-3.5-turbo-0613", + "kilo/openai/gpt-3.5-turbo-0613", + "openrouter/openai/gpt-3.5-turbo-0613" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 4096, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-3.5-turbo-0613", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-3.5-turbo-0613", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-3.5-turbo-0613", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo-0613", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-3.5-turbo-0613", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo-0613", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-3.5 Turbo (older v0613)", + "GPT-3.5 Turbo 0613", + "OpenAI: GPT-3.5 Turbo (older v0613)" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2021-08", + "releaseDate": "2023-06-13", + "lastUpdated": "2023-06-13", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_completion_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-3.5-turbo-0613", + "modelKey": "gpt-3.5-turbo-0613", + "displayName": "GPT-3.5 Turbo 0613", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-08", + "lastUpdated": "2023-06-13", + "openWeights": false, + "releaseDate": "2023-06-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-3.5-turbo-0613", + "modelKey": "gpt-3.5-turbo-0613", + "displayName": "GPT-3.5 Turbo 0613", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-08", + "lastUpdated": "2023-06-13", + "openWeights": false, + "releaseDate": "2023-06-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-3.5-turbo-0613", + "modelKey": "openai/gpt-3.5-turbo-0613", + "displayName": "OpenAI: GPT-3.5 Turbo (older v0613)", + "metadata": { + "lastUpdated": "2023-06-13", + "openWeights": false, + "releaseDate": "2023-06-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-3.5-turbo-0613", + "modelKey": "openai/gpt-3.5-turbo-0613", + "displayName": "GPT-3.5 Turbo (older v0613)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-09-30", + "lastUpdated": "2024-01-25", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-3.5-turbo-0613", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo-0613", + "displayName": "OpenAI: GPT-3.5 Turbo (older v0613)", + "metadata": { + "canonicalSlug": "openai/gpt-3.5-turbo-0613", + "createdAt": "2024-01-25T00:00:00.000Z", + "knowledgeCutoff": "2021-09-30", + "links": { + "details": "/api/v1/models/openai/gpt-3.5-turbo-0613/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_completion_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 4095, + "max_completion_tokens": 4096, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openai/gpt-3.5-turbo-1106", + "provider": "openai", + "model": "gpt-3.5-turbo-1106", + "displayName": "GPT-3.5 Turbo 1106", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "openai" + ], + "aliases": [ + "azure-cognitive-services/gpt-3.5-turbo-1106", + "azure/gpt-3.5-turbo-1106", + "openai/gpt-3.5-turbo-1106" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 16385, + "inputTokens": 16385, + "maxTokens": 4096, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-3.5-turbo-1106", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-3.5-turbo-1106", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-3.5-turbo-1106", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-3.5 Turbo 1106" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2021-08", + "releaseDate": "2023-11-06", + "lastUpdated": "2023-11-06", + "deprecationDate": "2026-09-28", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-3.5-turbo-1106", + "modelKey": "gpt-3.5-turbo-1106", + "displayName": "GPT-3.5 Turbo 1106", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-08", + "lastUpdated": "2023-11-06", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-3.5-turbo-1106", + "modelKey": "gpt-3.5-turbo-1106", + "displayName": "GPT-3.5 Turbo 1106", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-08", + "lastUpdated": "2023-11-06", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-3.5-turbo-1106", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-09-28" + } + } + ] + }, + { + "id": "openai/gpt-3.5-turbo-16k", + "provider": "openai", + "model": "gpt-3.5-turbo-16k", + "displayName": "GPT-3.5 Turbo 16k", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openai", + "openrouter" + ], + "aliases": [ + "kilo/openai/gpt-3.5-turbo-16k", + "openai/gpt-3.5-turbo-16k", + "openrouter/openai/gpt-3.5-turbo-16k" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 16385, + "inputTokens": 16385, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-3.5-turbo-16k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo-16k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 4 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-3.5-turbo-16k", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 4 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-3.5-turbo-16k", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo-16k", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-3.5 Turbo 16k", + "OpenAI: GPT-3.5 Turbo 16k" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2021-09-30", + "releaseDate": "2023-08-28", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_completion_tokens", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-3.5-turbo-16k", + "modelKey": "openai/gpt-3.5-turbo-16k", + "displayName": "OpenAI: GPT-3.5 Turbo 16k", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2023-08-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-3.5-turbo-16k", + "modelKey": "openai/gpt-3.5-turbo-16k", + "displayName": "GPT-3.5 Turbo 16k", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-09-30", + "lastUpdated": "2023-08-28", + "openWeights": false, + "releaseDate": "2023-08-28" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-3.5-turbo-16k", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-3.5-turbo-16k", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo-16k", + "displayName": "OpenAI: GPT-3.5 Turbo 16k", + "metadata": { + "canonicalSlug": "openai/gpt-3.5-turbo-16k", + "createdAt": "2023-08-28T00:00:00.000Z", + "knowledgeCutoff": "2021-09-30", + "links": { + "details": "/api/v1/models/openai/gpt-3.5-turbo-16k/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_completion_tokens", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 16385, + "max_completion_tokens": 4096, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-3.5-turbo-instruct", + "provider": "openai", + "model": "gpt-3.5-turbo-instruct", + "displayName": "GPT-3.5 Turbo Instruct", + "family": "gpt", + "mode": "completion", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "kilo", + "openrouter", + "poe", + "text-completion-openai", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "azure-cognitive-services/gpt-3.5-turbo-instruct", + "azure/gpt-3.5-turbo-instruct", + "kilo/openai/gpt-3.5-turbo-instruct", + "openrouter/openai/gpt-3.5-turbo-instruct", + "poe/openai/gpt-3.5-turbo-instruct", + "text-completion-openai/gpt-3.5-turbo-instruct", + "vercel/openai/gpt-3.5-turbo-instruct", + "vercel_ai_gateway/openai/gpt-3.5-turbo-instruct" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-3.5-turbo-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-3.5-turbo-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-3.5-turbo-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-3.5-turbo-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.4, + "output": 1.8 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-3.5-turbo-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "text-completion-openai", + "model": "gpt-3.5-turbo-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.5, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/gpt-3.5-turbo-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.5, + "output": 2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.5, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-3.5 Turbo Instruct", + "GPT-3.5-Turbo-Instruct", + "OpenAI: GPT-3.5 Turbo Instruct" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat", + "completion" + ], + "knowledgeCutoff": "2021-08", + "releaseDate": "2023-09-21", + "lastUpdated": "2023-09-21", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-3.5-turbo-instruct", + "modelKey": "gpt-3.5-turbo-instruct", + "displayName": "GPT-3.5 Turbo Instruct", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-08", + "lastUpdated": "2023-09-21", + "openWeights": false, + "releaseDate": "2023-09-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-3.5-turbo-instruct", + "modelKey": "gpt-3.5-turbo-instruct", + "displayName": "GPT-3.5 Turbo Instruct", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-08", + "lastUpdated": "2023-09-21", + "openWeights": false, + "releaseDate": "2023-09-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-3.5-turbo-instruct", + "modelKey": "openai/gpt-3.5-turbo-instruct", + "displayName": "OpenAI: GPT-3.5 Turbo Instruct", + "metadata": { + "lastUpdated": "2023-09-21", + "openWeights": false, + "releaseDate": "2023-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-3.5-turbo-instruct", + "modelKey": "openai/gpt-3.5-turbo-instruct", + "displayName": "GPT-3.5 Turbo Instruct", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-09-30", + "lastUpdated": "2023-09-28", + "openWeights": false, + "releaseDate": "2023-09-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-3.5-turbo-instruct", + "modelKey": "openai/gpt-3.5-turbo-instruct", + "displayName": "GPT-3.5-Turbo-Instruct", + "family": "gpt", + "metadata": { + "lastUpdated": "2023-09-20", + "openWeights": false, + "releaseDate": "2023-09-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-3.5-turbo-instruct", + "modelKey": "openai/gpt-3.5-turbo-instruct", + "displayName": "GPT-3.5 Turbo Instruct", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2021-09", + "lastUpdated": "2023-03-01", + "openWeights": false, + "releaseDate": "2023-09-28" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "text-completion-openai", + "model": "gpt-3.5-turbo-instruct", + "mode": "completion" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/gpt-3.5-turbo-instruct", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo-instruct", + "displayName": "OpenAI: GPT-3.5 Turbo Instruct", + "metadata": { + "canonicalSlug": "openai/gpt-3.5-turbo-instruct", + "createdAt": "2023-09-28T00:00:00.000Z", + "instructType": "chatml", + "knowledgeCutoff": "2021-09-30", + "links": { + "details": "/api/v1/models/openai/gpt-3.5-turbo-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_logprobs", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 4095, + "max_completion_tokens": 4096, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-3.5-turbo-instruct-0914", + "provider": "openai", + "model": "gpt-3.5-turbo-instruct-0914", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "azure_text", + "text-completion-openai" + ], + "aliases": [ + "azure_text/azure/gpt-3.5-turbo-instruct-0914", + "text-completion-openai/gpt-3.5-turbo-instruct-0914" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 4097, + "outputTokens": 4097, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_text", + "model": "azure/gpt-3.5-turbo-instruct-0914", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.5, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "text-completion-openai", + "model": "gpt-3.5-turbo-instruct-0914", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.5, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_text", + "model": "azure/gpt-3.5-turbo-instruct-0914", + "mode": "completion" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "text-completion-openai", + "model": "gpt-3.5-turbo-instruct-0914", + "mode": "completion" + } + ] + }, + { + "id": "openai/gpt-3.5-turbo-raw", + "provider": "openai", + "model": "gpt-3.5-turbo-raw", + "displayName": "GPT-3.5-Turbo-Raw", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/openai/gpt-3.5-turbo-raw" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4524, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-3.5-turbo-raw", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 1.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-3.5-Turbo-Raw" + ], + "families": [ + "gpt" + ], + "releaseDate": "2023-09-27", + "lastUpdated": "2023-09-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-3.5-turbo-raw", + "modelKey": "openai/gpt-3.5-turbo-raw", + "displayName": "GPT-3.5-Turbo-Raw", + "family": "gpt", + "metadata": { + "lastUpdated": "2023-09-27", + "openWeights": false, + "releaseDate": "2023-09-27" + } + } + ] + }, + { + "id": "openai/gpt-35-turbo", + "provider": "openai", + "model": "gpt-35-turbo", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/gpt-35-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4097, + "inputTokens": 4097, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-35-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-35-turbo", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-35-turbo-0125", + "provider": "openai", + "model": "gpt-35-turbo-0125", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/gpt-35-turbo-0125" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-35-turbo-0125", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 1.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2025-05-31", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-35-turbo-0125", + "mode": "chat", + "metadata": { + "deprecationDate": "2025-05-31" + } + } + ] + }, + { + "id": "openai/gpt-35-turbo-1106", + "provider": "openai", + "model": "gpt-35-turbo-1106", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/gpt-35-turbo-1106" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-35-turbo-1106", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2025-03-31", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-35-turbo-1106", + "mode": "chat", + "metadata": { + "deprecationDate": "2025-03-31" + } + } + ] + }, + { + "id": "openai/gpt-35-turbo-16k", + "provider": "openai", + "model": "gpt-35-turbo-16k", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/gpt-35-turbo-16k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16385, + "inputTokens": 16385, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-35-turbo-16k", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-35-turbo-16k", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-35-turbo-16k-0613", + "provider": "openai", + "model": "gpt-35-turbo-16k-0613", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/gpt-35-turbo-16k-0613" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16385, + "inputTokens": 16385, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-35-turbo-16k-0613", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-35-turbo-16k-0613", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-35-turbo-instruct", + "provider": "openai", + "model": "gpt-35-turbo-instruct", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "azure_text" + ], + "aliases": [ + "azure_text/azure/gpt-35-turbo-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4097, + "inputTokens": 4097, + "maxTokens": 4097, + "outputTokens": 4097, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_text", + "model": "azure/gpt-35-turbo-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.5, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_text", + "model": "azure/gpt-35-turbo-instruct", + "mode": "completion" + } + ] + }, + { + "id": "openai/gpt-35-turbo-instruct-0914", + "provider": "openai", + "model": "gpt-35-turbo-instruct-0914", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "azure_text" + ], + "aliases": [ + "azure_text/azure/gpt-35-turbo-instruct-0914" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4097, + "inputTokens": 4097, + "maxTokens": 4097, + "outputTokens": 4097, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_text", + "model": "azure/gpt-35-turbo-instruct-0914", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.5, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_text", + "model": "azure/gpt-35-turbo-instruct-0914", + "mode": "completion" + } + ] + }, + { + "id": "openai/gpt-4", + "provider": "openai", + "model": "gpt-4", + "displayName": "GPT-4", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "cloudflare-ai-gateway", + "github_copilot", + "kilo", + "llmgateway", + "openai", + "openrouter", + "orcarouter" + ], + "aliases": [ + "azure-cognitive-services/gpt-4", + "azure/gpt-4", + "cloudflare-ai-gateway/openai/gpt-4", + "github_copilot/gpt-4", + "kilo/openai/gpt-4", + "llmgateway/gpt-4", + "openai/gpt-4", + "openrouter/openai/gpt-4", + "orcarouter/openai/gpt-4" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 4096, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "supports1MContext": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 60, + "output": 120 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 60, + "output": 120 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "openai/gpt-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 60 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 60 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 60 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 60 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 60 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 60 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 30, + "output": 60 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 30, + "output": 60 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 30, + "output": 60 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-4", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 30, + "output": 60 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4", + "OpenAI: GPT-4" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-11", + "releaseDate": "2023-03-14", + "lastUpdated": "2023-03-14", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_completion_tokens", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4", + "modelKey": "gpt-4", + "displayName": "GPT-4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-11", + "lastUpdated": "2023-03-14", + "openWeights": false, + "releaseDate": "2023-03-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4", + "modelKey": "gpt-4", + "displayName": "GPT-4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-11", + "lastUpdated": "2023-03-14", + "openWeights": false, + "releaseDate": "2023-03-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "openai/gpt-4", + "modelKey": "openai/gpt-4", + "displayName": "GPT-4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-11", + "lastUpdated": "2024-04-09", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-4", + "modelKey": "openai/gpt-4", + "displayName": "OpenAI: GPT-4", + "metadata": { + "lastUpdated": "2024-04-09", + "openWeights": false, + "releaseDate": "2023-03-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-4", + "modelKey": "gpt-4", + "displayName": "GPT-4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-11", + "lastUpdated": "2024-04-09", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-4", + "modelKey": "gpt-4", + "displayName": "GPT-4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-11", + "lastUpdated": "2024-04-09", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-4", + "modelKey": "openai/gpt-4", + "displayName": "GPT-4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-11", + "lastUpdated": "2024-04-09", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-4", + "modelKey": "openai/gpt-4", + "displayName": "GPT-4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-11", + "lastUpdated": "2024-04-09", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-4", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-4", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-4", + "displayName": "OpenAI: GPT-4", + "metadata": { + "canonicalSlug": "openai/gpt-4", + "createdAt": "2023-05-28T00:00:00.000Z", + "knowledgeCutoff": "2021-09-30", + "links": { + "details": "/api/v1/models/openai/gpt-4/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_completion_tokens", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 8191, + "max_completion_tokens": 4096, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-4-0125-preview", + "provider": "openai", + "model": "gpt-4-0125-preview", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-4-0125-preview", + "openai/gpt-4-0125-preview" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4-0125-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4-0125-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10, + "output": 30 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2026-03-26", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4-0125-preview", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4-0125-preview", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-03-26" + } + } + ] + }, + { + "id": "openai/gpt-4-0314", + "provider": "openai", + "model": "gpt-4-0314", + "displayName": "OpenAI: GPT-4 (older v0314)", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "kilo", + "openai" + ], + "aliases": [ + "kilo/openai/gpt-4-0314", + "openai/gpt-4-0314" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-4-0314", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 60 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4-0314", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 30, + "output": 60 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI: GPT-4 (older v0314)" + ], + "modes": [ + "chat" + ], + "releaseDate": "2023-05-28", + "lastUpdated": "2026-03-15", + "deprecationDate": "2026-03-26", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-4-0314", + "modelKey": "openai/gpt-4-0314", + "displayName": "OpenAI: GPT-4 (older v0314)", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2023-05-28" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4-0314", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-03-26" + } + } + ] + }, + { + "id": "openai/gpt-4-0613", + "provider": "openai", + "model": "gpt-4-0613", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "github_copilot", + "openai" + ], + "aliases": [ + "azure/gpt-4-0613", + "github_copilot/gpt-4-0613", + "openai/gpt-4-0613" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4-0613", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 30, + "output": 60 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-4-0613", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4-0613", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 30, + "output": 60 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2025-06-06", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4-0613", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-4-0613", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4-0613", + "mode": "chat", + "metadata": { + "deprecationDate": "2025-06-06" + } + } + ] + }, + { + "id": "openai/gpt-4-1106-preview", + "provider": "openai", + "model": "gpt-4-1106-preview", + "displayName": "OpenAI: GPT-4 Turbo (older v1106)", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "kilo", + "openai" + ], + "aliases": [ + "azure/gpt-4-1106-preview", + "kilo/openai/gpt-4-1106-preview", + "openai/gpt-4-1106-preview" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-4-1106-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4-1106-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4-1106-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10, + "output": 30 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI: GPT-4 Turbo (older v1106)" + ], + "modes": [ + "chat" + ], + "releaseDate": "2023-11-06", + "lastUpdated": "2026-03-15", + "deprecationDate": "2026-03-26", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-4-1106-preview", + "modelKey": "openai/gpt-4-1106-preview", + "displayName": "OpenAI: GPT-4 Turbo (older v1106)", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4-1106-preview", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4-1106-preview", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-03-26" + } + } + ] + }, + { + "id": "openai/gpt-4-32k", + "provider": "openai", + "model": "gpt-4-32k", + "displayName": "GPT-4 32K", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/gpt-4-32k", + "azure/gpt-4-32k" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 4096, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-4-32k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 60, + "output": 120 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-4-32k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 60, + "output": 120 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4-32k", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 60, + "output": 120 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4 32K" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-11", + "releaseDate": "2023-03-14", + "lastUpdated": "2023-03-14", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4-32k", + "modelKey": "gpt-4-32k", + "displayName": "GPT-4 32K", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-11", + "lastUpdated": "2023-03-14", + "openWeights": false, + "releaseDate": "2023-03-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4-32k", + "modelKey": "gpt-4-32k", + "displayName": "GPT-4 32K", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-11", + "lastUpdated": "2023-03-14", + "openWeights": false, + "releaseDate": "2023-03-14" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4-32k", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4-32k-0613", + "provider": "openai", + "model": "gpt-4-32k-0613", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/gpt-4-32k-0613" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4-32k-0613", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 60, + "output": 120 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4-32k-0613", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4-classic", + "provider": "openai", + "model": "gpt-4-classic", + "displayName": "GPT-4-Classic", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/openai/gpt-4-classic" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-4-classic", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 27, + "output": 54 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4-Classic" + ], + "families": [ + "gpt" + ], + "statuses": [ + "deprecated" + ], + "releaseDate": "2024-03-25", + "lastUpdated": "2024-03-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-4-classic", + "modelKey": "openai/gpt-4-classic", + "displayName": "GPT-4-Classic", + "family": "gpt", + "status": "deprecated", + "metadata": { + "lastUpdated": "2024-03-25", + "openWeights": false, + "releaseDate": "2024-03-25" + } + } + ] + }, + { + "id": "openai/gpt-4-classic-0314", + "provider": "openai", + "model": "gpt-4-classic-0314", + "displayName": "GPT-4-Classic-0314", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/openai/gpt-4-classic-0314" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-4-classic-0314", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 27, + "output": 54 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4-Classic-0314" + ], + "families": [ + "gpt" + ], + "statuses": [ + "deprecated" + ], + "releaseDate": "2024-08-26", + "lastUpdated": "2024-08-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-4-classic-0314", + "modelKey": "openai/gpt-4-classic-0314", + "displayName": "GPT-4-Classic-0314", + "family": "gpt", + "status": "deprecated", + "metadata": { + "lastUpdated": "2024-08-26", + "openWeights": false, + "releaseDate": "2024-08-26" + } + } + ] + }, + { + "id": "openai/gpt-4-o-preview", + "provider": "openai", + "model": "gpt-4-o-preview", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "github_copilot" + ], + "aliases": [ + "github_copilot/gpt-4-o-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 64000, + "inputTokens": 64000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-4-o-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-4-o-preview", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4-turbo", + "provider": "openai", + "model": "gpt-4-turbo", + "displayName": "GPT-4 Turbo", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "cloudflare-ai-gateway", + "kilo", + "llmgateway", + "nano-gpt", + "openai", + "openrouter", + "orcarouter", + "poe", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "azure-cognitive-services/gpt-4-turbo", + "azure/gpt-4-turbo", + "cloudflare-ai-gateway/openai/gpt-4-turbo", + "kilo/openai/gpt-4-turbo", + "llmgateway/gpt-4-turbo", + "nano-gpt/openai/gpt-4-turbo", + "openai/gpt-4-turbo", + "openrouter/openai/gpt-4-turbo", + "orcarouter/openai/gpt-4-turbo", + "poe/openai/gpt-4-turbo", + "vercel/openai/gpt-4-turbo", + "vercel_ai_gateway/openai/gpt-4-turbo" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "responseSchema": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-4-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-4-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "openai/gpt-4-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-4-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-4-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-4-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-4-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-4-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-4-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-4-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 9, + "output": 27 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-4-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/gpt-4-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-4-turbo", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10, + "output": 30 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4 Turbo", + "GPT-4-Turbo", + "OpenAI: GPT-4 Turbo" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2023-11-06", + "lastUpdated": "2024-04-09", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4-turbo", + "modelKey": "gpt-4-turbo", + "displayName": "GPT-4 Turbo", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-04-09", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4-turbo", + "modelKey": "gpt-4-turbo", + "displayName": "GPT-4 Turbo", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-04-09", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "openai/gpt-4-turbo", + "modelKey": "openai/gpt-4-turbo", + "displayName": "GPT-4 Turbo", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-04-09", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-4-turbo", + "modelKey": "openai/gpt-4-turbo", + "displayName": "OpenAI: GPT-4 Turbo", + "metadata": { + "lastUpdated": "2024-04-09", + "openWeights": false, + "releaseDate": "2023-09-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-4-turbo", + "modelKey": "gpt-4-turbo", + "displayName": "GPT-4 Turbo", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-04-09", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-4-turbo", + "modelKey": "openai/gpt-4-turbo", + "displayName": "GPT-4 Turbo", + "family": "gpt", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-4-turbo", + "modelKey": "gpt-4-turbo", + "displayName": "GPT-4 Turbo", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-04-09", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-4-turbo", + "modelKey": "openai/gpt-4-turbo", + "displayName": "GPT-4 Turbo", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-04-09", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-4-turbo", + "modelKey": "openai/gpt-4-turbo", + "displayName": "GPT-4 Turbo", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-04-09", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-4-turbo", + "modelKey": "openai/gpt-4-turbo", + "displayName": "GPT-4-Turbo", + "family": "gpt", + "metadata": { + "lastUpdated": "2023-09-13", + "openWeights": false, + "releaseDate": "2023-09-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-4-turbo", + "modelKey": "openai/gpt-4-turbo", + "displayName": "GPT-4 Turbo", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-04-09", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4-turbo", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4-turbo", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/gpt-4-turbo", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-4-turbo", + "displayName": "OpenAI: GPT-4 Turbo", + "metadata": { + "canonicalSlug": "openai/gpt-4-turbo", + "createdAt": "2024-04-09T00:00:00.000Z", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/openai/gpt-4-turbo/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 4096, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-4-turbo-2024-04-09", + "provider": "openai", + "model": "gpt-4-turbo-2024-04-09", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-4-turbo-2024-04-09", + "openai/gpt-4-turbo-2024-04-09" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4-turbo-2024-04-09", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4-turbo-2024-04-09", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10, + "output": 30 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4-turbo-2024-04-09", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4-turbo-2024-04-09", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4-turbo-preview", + "provider": "openai", + "model": "gpt-4-turbo-preview", + "displayName": "OpenAI: GPT-4 Turbo Preview", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openai", + "openrouter" + ], + "aliases": [ + "kilo/openai/gpt-4-turbo-preview", + "nano-gpt/openai/gpt-4-turbo-preview", + "openai/gpt-4-turbo-preview", + "openrouter/openai/gpt-4-turbo-preview" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "structuredOutput": true, + "responseSchema": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-4-turbo-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-4-turbo-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 9.996, + "output": 30.004999999999995 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-4-turbo-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4-turbo-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-4-turbo-preview", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10, + "output": 30 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4 Turbo Preview", + "OpenAI: GPT-4 Turbo Preview" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-12-31", + "releaseDate": "2024-01-25", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-4-turbo-preview", + "modelKey": "openai/gpt-4-turbo-preview", + "displayName": "OpenAI: GPT-4 Turbo Preview", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-4-turbo-preview", + "modelKey": "openai/gpt-4-turbo-preview", + "displayName": "GPT-4 Turbo Preview", + "family": "gpt", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-4-turbo-preview", + "modelKey": "openai/gpt-4-turbo-preview", + "displayName": "GPT-4 Turbo Preview", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-12-31", + "lastUpdated": "2024-01-25", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4-turbo-preview", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-4-turbo-preview", + "displayName": "OpenAI: GPT-4 Turbo Preview", + "metadata": { + "canonicalSlug": "openai/gpt-4-turbo-preview", + "createdAt": "2024-01-25T00:00:00.000Z", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/openai/gpt-4-turbo-preview/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 4096, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-4-turbo-vision", + "provider": "openai", + "model": "gpt-4-turbo-vision", + "displayName": "GPT-4 Turbo Vision", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services" + ], + "aliases": [ + "azure-cognitive-services/gpt-4-turbo-vision", + "azure/gpt-4-turbo-vision" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-4-turbo-vision", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-4-turbo-vision", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 30 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4 Turbo Vision" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2023-11", + "releaseDate": "2023-11-06", + "lastUpdated": "2024-04-09", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4-turbo-vision", + "modelKey": "gpt-4-turbo-vision", + "displayName": "GPT-4 Turbo Vision", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-11", + "lastUpdated": "2024-04-09", + "openWeights": false, + "releaseDate": "2023-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4-turbo-vision", + "modelKey": "gpt-4-turbo-vision", + "displayName": "GPT-4 Turbo Vision", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-11", + "lastUpdated": "2024-04-09", + "openWeights": false, + "releaseDate": "2023-11-06" + } + } + ] + }, + { + "id": "openai/gpt-4-turbo-vision-preview", + "provider": "openai", + "model": "gpt-4-turbo-vision-preview", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/gpt-4-turbo-vision-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4-turbo-vision-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10, + "output": 30 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4-turbo-vision-preview", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4.1", + "provider": "openai", + "model": "gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "abacus", + "anyapi", + "azure", + "azure-cognitive-services", + "cortecs", + "fastrouter", + "github-copilot", + "github-models", + "github_copilot", + "helicone", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "openai", + "openrouter", + "orcarouter", + "poe", + "replicate", + "requesty", + "sap-ai-core", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "302ai/gpt-4.1", + "abacus/gpt-4.1", + "anyapi/openai/gpt-4.1", + "azure-cognitive-services/gpt-4.1", + "azure/gpt-4.1", + "cortecs/gpt-4.1", + "fastrouter/openai/gpt-4.1", + "github-copilot/gpt-4.1", + "github-models/openai/gpt-4.1", + "github_copilot/gpt-4.1", + "helicone/gpt-4.1", + "kilo/openai/gpt-4.1", + "llmgateway/gpt-4.1", + "merge-gateway/openai/gpt-4.1", + "nano-gpt/openai/gpt-4.1", + "nearai/openai/gpt-4.1", + "openai/gpt-4.1", + "openrouter/openai/gpt-4.1", + "orcarouter/openai/gpt-4.1", + "poe/openai/gpt-4.1", + "replicate/openai/gpt-4.1", + "requesty/openai/gpt-4.1", + "sap-ai-core/gpt-4.1", + "vercel/openai/gpt-4.1", + "vercel_ai_gateway/openai/gpt-4.1" + ], + "mergedProviderModelRecords": 25, + "limits": { + "contextTokens": 1047576, + "inputTokens": 1047576, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.354, + "output": 9.417 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "openai/gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "github-copilot", + "model": "gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "openai/gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "openai/gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.45, + "input": 1.8, + "output": 7.2 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + }, + "extra": { + "input_cost_per_token_batches": 0.000001, + "output_cost_per_token_batches": 0.000004 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-4.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + }, + "extra": { + "cache_read_input_token_cost_priority": 8.75e-7, + "input_cost_per_token_batches": 0.000001, + "input_cost_per_token_priority": 0.0000035, + "output_cost_per_token_batches": 0.000004, + "output_cost_per_token_priority": 0.000014, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-4.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/openai/gpt-4.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 8 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/gpt-4.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 0, + "input": 2, + "output": 8 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-4.1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 4.1", + "GPT-4.1", + "OpenAI GPT-4.1", + "OpenAI: GPT-4.1", + "gpt-4.1" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-04-14", + "lastUpdated": "2025-04-14", + "supportedParameters": [ + "max_completion_tokens", + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 25 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-4.1", + "modelKey": "gpt-4.1", + "displayName": "gpt-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-4.1", + "modelKey": "gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "openai/gpt-4.1", + "modelKey": "openai/gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4.1", + "modelKey": "gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4.1", + "modelKey": "gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "gpt-4.1", + "modelKey": "gpt-4.1", + "displayName": "GPT 4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "openai/gpt-4.1", + "modelKey": "openai/gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "gpt-4.1", + "modelKey": "gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "openai/gpt-4.1", + "modelKey": "openai/gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-4.1", + "modelKey": "gpt-4.1", + "displayName": "OpenAI GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-4.1", + "modelKey": "openai/gpt-4.1", + "displayName": "OpenAI: GPT-4.1", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-4.1", + "modelKey": "gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-4.1", + "modelKey": "openai/gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-4.1", + "modelKey": "openai/gpt-4.1", + "displayName": "GPT 4.1", + "family": "gpt", + "metadata": { + "lastUpdated": "2025-09-10", + "openWeights": false, + "releaseDate": "2025-09-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "openai/gpt-4.1", + "modelKey": "openai/gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-4.1", + "modelKey": "gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-4.1", + "modelKey": "openai/gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-4.1", + "modelKey": "openai/gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-4.1", + "modelKey": "openai/gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-4.1", + "modelKey": "openai/gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "gpt-4.1", + "modelKey": "gpt-4.1", + "displayName": "gpt-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-4.1", + "modelKey": "openai/gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4.1", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-4.1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4.1", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-4.1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/openai/gpt-4.1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/gpt-4.1", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-4.1", + "displayName": "OpenAI: GPT-4.1", + "metadata": { + "canonicalSlug": "openai/gpt-4.1-2025-04-14", + "createdAt": "2025-04-14T17:23:05.000Z", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/openai/gpt-4.1-2025-04-14/endpoints" + }, + "supportedParameters": [ + "max_completion_tokens", + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 1047576, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openai/gpt-4.1-2025-04-14", + "provider": "openai", + "model": "gpt-4.1-2025-04-14", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "github_copilot", + "openai" + ], + "aliases": [ + "azure/gpt-4.1-2025-04-14", + "azure/us/gpt-4.1-2025-04-14", + "github_copilot/gpt-4.1-2025-04-14", + "openai/gpt-4.1-2025-04-14" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 1047576, + "inputTokens": 1047576, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4.1-2025-04-14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + }, + "extra": { + "input_cost_per_token_batches": 0.000001, + "output_cost_per_token_batches": 0.000004 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/gpt-4.1-2025-04-14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "input": 2.2, + "output": 8.8 + }, + "extra": { + "input_cost_per_token_batches": 0.0000011, + "output_cost_per_token_batches": 0.0000044 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-4.1-2025-04-14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4.1-2025-04-14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + }, + "extra": { + "input_cost_per_token_batches": 0.000001, + "output_cost_per_token_batches": 0.000004 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2026-11-04", + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4.1-2025-04-14", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-11-04", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/gpt-4.1-2025-04-14", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-11-04", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-4.1-2025-04-14", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4.1-2025-04-14", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-4.1-mini", + "provider": "openai", + "model": "gpt-4.1-mini", + "displayName": "GPT-4.1 mini", + "family": "gpt-mini", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "abacus", + "anyapi", + "azure", + "azure-cognitive-services", + "github-models", + "helicone", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "openai", + "openrouter", + "orcarouter", + "poe", + "replicate", + "requesty", + "sap-ai-core", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "302ai/gpt-4.1-mini", + "abacus/gpt-4.1-mini", + "anyapi/openai/gpt-4.1-mini", + "azure-cognitive-services/gpt-4.1-mini", + "azure/gpt-4.1-mini", + "github-models/openai/gpt-4.1-mini", + "helicone/gpt-4.1-mini", + "kilo/openai/gpt-4.1-mini", + "llmgateway/gpt-4.1-mini", + "merge-gateway/openai/gpt-4.1-mini", + "nano-gpt/openai/gpt-4.1-mini", + "nearai/openai/gpt-4.1-mini", + "openai/gpt-4.1-mini", + "openrouter/openai/gpt-4.1-mini", + "orcarouter/openai/gpt-4.1-mini", + "poe/openai/gpt-4.1-mini", + "replicate/openai/gpt-4.1-mini", + "requesty/openai/gpt-4.1-mini", + "sap-ai-core/gpt-4.1-mini", + "vercel/openai/gpt-4.1-mini", + "vercel_ai_gateway/openai/gpt-4.1-mini" + ], + "mergedProviderModelRecords": 21, + "limits": { + "contextTokens": 1047576, + "inputTokens": 1047576, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "openai/gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.09999999999999999, + "input": 0.39999999999999997, + "output": 1.5999999999999999 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "openai/gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.09, + "input": 0.36, + "output": 1.4 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-4.1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4.1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + }, + "extra": { + "input_cost_per_token_batches": 2e-7, + "output_cost_per_token_batches": 8e-7 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4.1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + }, + "extra": { + "cache_read_input_token_cost_priority": 1.75e-7, + "input_cost_per_token_batches": 2e-7, + "input_cost_per_token_priority": 7e-7, + "output_cost_per_token_batches": 8e-7, + "output_cost_per_token_priority": 0.0000028, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-4.1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/openai/gpt-4.1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/gpt-4.1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 0, + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-4.1-mini", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 4.1 Mini", + "GPT-4.1 Mini", + "GPT-4.1 mini", + "GPT-4.1-mini", + "OpenAI GPT-4.1 Mini", + "OpenAI: GPT-4.1 Mini", + "gpt-4.1-mini" + ], + "families": [ + "gpt", + "gpt-mini" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-04-14", + "lastUpdated": "2025-04-14", + "supportedParameters": [ + "max_completion_tokens", + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 21 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-4.1-mini", + "modelKey": "gpt-4.1-mini", + "displayName": "gpt-4.1-mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-4.1-mini", + "modelKey": "gpt-4.1-mini", + "displayName": "GPT-4.1 Mini", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "openai/gpt-4.1-mini", + "modelKey": "openai/gpt-4.1-mini", + "displayName": "GPT-4.1 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4.1-mini", + "modelKey": "gpt-4.1-mini", + "displayName": "GPT-4.1 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4.1-mini", + "modelKey": "gpt-4.1-mini", + "displayName": "GPT-4.1 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "openai/gpt-4.1-mini", + "modelKey": "openai/gpt-4.1-mini", + "displayName": "GPT-4.1-mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-4.1-mini", + "modelKey": "gpt-4.1-mini", + "displayName": "OpenAI GPT-4.1 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-4.1-mini", + "modelKey": "openai/gpt-4.1-mini", + "displayName": "OpenAI: GPT-4.1 Mini", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-4.1-mini", + "modelKey": "gpt-4.1-mini", + "displayName": "GPT-4.1 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-4.1-mini", + "modelKey": "openai/gpt-4.1-mini", + "displayName": "GPT-4.1 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-4.1-mini", + "modelKey": "openai/gpt-4.1-mini", + "displayName": "GPT 4.1 Mini", + "family": "gpt-mini", + "metadata": { + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "openai/gpt-4.1-mini", + "modelKey": "openai/gpt-4.1-mini", + "displayName": "GPT-4.1 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-4.1-mini", + "modelKey": "gpt-4.1-mini", + "displayName": "GPT-4.1 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-4.1-mini", + "modelKey": "openai/gpt-4.1-mini", + "displayName": "GPT-4.1 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-4.1-mini", + "modelKey": "openai/gpt-4.1-mini", + "displayName": "GPT-4.1 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-4.1-mini", + "modelKey": "openai/gpt-4.1-mini", + "displayName": "GPT-4.1-mini", + "family": "gpt-mini", + "metadata": { + "lastUpdated": "2025-04-15", + "openWeights": false, + "releaseDate": "2025-04-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-4.1-mini", + "modelKey": "openai/gpt-4.1-mini", + "displayName": "GPT-4.1 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "gpt-4.1-mini", + "modelKey": "gpt-4.1-mini", + "displayName": "gpt-4.1-mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-4.1-mini", + "modelKey": "openai/gpt-4.1-mini", + "displayName": "GPT-4.1 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4.1-mini", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4.1-mini", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-4.1-mini", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/openai/gpt-4.1-mini", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/gpt-4.1-mini", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-4.1-mini", + "displayName": "OpenAI: GPT-4.1 Mini", + "metadata": { + "canonicalSlug": "openai/gpt-4.1-mini-2025-04-14", + "createdAt": "2025-04-14T17:23:01.000Z", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/openai/gpt-4.1-mini-2025-04-14/endpoints" + }, + "supportedParameters": [ + "max_completion_tokens", + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 1047576, + "max_completion_tokens": 32768, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-4.1-mini-2025-04-14", + "provider": "openai", + "model": "gpt-4.1-mini-2025-04-14", + "displayName": "OpenAI GPT-4.1 Mini", + "family": "gpt-mini", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "helicone", + "openai" + ], + "aliases": [ + "azure/gpt-4.1-mini-2025-04-14", + "azure/us/gpt-4.1-mini-2025-04-14", + "helicone/gpt-4.1-mini-2025-04-14", + "openai/gpt-4.1-mini-2025-04-14" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 1047576, + "inputTokens": 1047576, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": true, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-4.1-mini-2025-04-14", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.09999999999999999, + "input": 0.39999999999999997, + "output": 1.5999999999999999 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4.1-mini-2025-04-14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + }, + "extra": { + "input_cost_per_token_batches": 2e-7, + "output_cost_per_token_batches": 8e-7 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/gpt-4.1-mini-2025-04-14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.44, + "output": 1.76 + }, + "extra": { + "input_cost_per_token_batches": 2.2e-7, + "output_cost_per_token_batches": 8.8e-7 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4.1-mini-2025-04-14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.4, + "output": 1.6 + }, + "extra": { + "input_cost_per_token_batches": 2e-7, + "output_cost_per_token_batches": 8e-7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI GPT-4.1 Mini" + ], + "families": [ + "gpt-mini" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-04-14", + "lastUpdated": "2025-04-14", + "deprecationDate": "2026-11-04", + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-4.1-mini-2025-04-14", + "modelKey": "gpt-4.1-mini-2025-04-14", + "displayName": "OpenAI GPT-4.1 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4.1-mini-2025-04-14", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-11-04", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/gpt-4.1-mini-2025-04-14", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-11-04", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4.1-mini-2025-04-14", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-4.1-nano", + "provider": "openai", + "model": "gpt-4.1-nano", + "displayName": "GPT-4.1 nano", + "family": "gpt-nano", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "abacus", + "azure", + "azure-cognitive-services", + "github-models", + "helicone", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "openai", + "openrouter", + "orcarouter", + "poe", + "replicate", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "302ai/gpt-4.1-nano", + "abacus/gpt-4.1-nano", + "azure-cognitive-services/gpt-4.1-nano", + "azure/gpt-4.1-nano", + "github-models/openai/gpt-4.1-nano", + "helicone/gpt-4.1-nano", + "kilo/openai/gpt-4.1-nano", + "llmgateway/gpt-4.1-nano", + "merge-gateway/openai/gpt-4.1-nano", + "nano-gpt/openai/gpt-4.1-nano", + "nearai/openai/gpt-4.1-nano", + "openai/gpt-4.1-nano", + "openrouter/openai/gpt-4.1-nano", + "orcarouter/openai/gpt-4.1-nano", + "poe/openai/gpt-4.1-nano", + "replicate/openai/gpt-4.1-nano", + "vercel/openai/gpt-4.1-nano", + "vercel_ai_gateway/openai/gpt-4.1-nano" + ], + "mergedProviderModelRecords": 18, + "limits": { + "contextTokens": 1047576, + "inputTokens": 1047576, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-4.1-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-4.1-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-4.1-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-4.1-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "openai/gpt-4.1-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-4.1-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.024999999999999998, + "input": 0.09999999999999999, + "output": 0.39999999999999997 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-4.1-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-4.1-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-4.1-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-4.1-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "openai/gpt-4.1-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-4.1-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-4.1-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-4.1-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-4.1-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.022, + "input": 0.09, + "output": 0.36 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-4.1-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4.1-nano", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + }, + "extra": { + "input_cost_per_token_batches": 5e-8, + "output_cost_per_token_batches": 2e-7 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4.1-nano", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + }, + "extra": { + "cache_read_input_token_cost_priority": 5e-8, + "input_cost_per_token_batches": 5e-8, + "input_cost_per_token_priority": 2e-7, + "output_cost_per_token_batches": 2e-7, + "output_cost_per_token_priority": 8e-7, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-4.1-nano", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/openai/gpt-4.1-nano", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/gpt-4.1-nano", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "cacheWrite": 0, + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-4.1-nano", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 4.1 Nano", + "GPT-4.1 Nano", + "GPT-4.1 nano", + "GPT-4.1-nano", + "OpenAI GPT-4.1 Nano", + "OpenAI: GPT-4.1 Nano", + "gpt-4.1-nano" + ], + "families": [ + "gpt", + "gpt-nano" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-04-14", + "lastUpdated": "2025-04-14", + "supportedParameters": [ + "max_completion_tokens", + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 18 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-4.1-nano", + "modelKey": "gpt-4.1-nano", + "displayName": "gpt-4.1-nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-4.1-nano", + "modelKey": "gpt-4.1-nano", + "displayName": "GPT-4.1 Nano", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4.1-nano", + "modelKey": "gpt-4.1-nano", + "displayName": "GPT-4.1 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4.1-nano", + "modelKey": "gpt-4.1-nano", + "displayName": "GPT-4.1 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "openai/gpt-4.1-nano", + "modelKey": "openai/gpt-4.1-nano", + "displayName": "GPT-4.1-nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-4.1-nano", + "modelKey": "gpt-4.1-nano", + "displayName": "OpenAI GPT-4.1 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-4.1-nano", + "modelKey": "openai/gpt-4.1-nano", + "displayName": "OpenAI: GPT-4.1 Nano", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-4.1-nano", + "modelKey": "gpt-4.1-nano", + "displayName": "GPT-4.1 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-4.1-nano", + "modelKey": "openai/gpt-4.1-nano", + "displayName": "GPT-4.1 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-4.1-nano", + "modelKey": "openai/gpt-4.1-nano", + "displayName": "GPT 4.1 Nano", + "family": "gpt-nano", + "metadata": { + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "openai/gpt-4.1-nano", + "modelKey": "openai/gpt-4.1-nano", + "displayName": "GPT-4.1 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-4.1-nano", + "modelKey": "gpt-4.1-nano", + "displayName": "GPT-4.1 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-4.1-nano", + "modelKey": "openai/gpt-4.1-nano", + "displayName": "GPT-4.1 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-4.1-nano", + "modelKey": "openai/gpt-4.1-nano", + "displayName": "GPT-4.1 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-4.1-nano", + "modelKey": "openai/gpt-4.1-nano", + "displayName": "GPT-4.1-nano", + "family": "gpt-nano", + "metadata": { + "lastUpdated": "2025-04-15", + "openWeights": false, + "releaseDate": "2025-04-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-4.1-nano", + "modelKey": "openai/gpt-4.1-nano", + "displayName": "GPT-4.1 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4.1-nano", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4.1-nano", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-4.1-nano", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/openai/gpt-4.1-nano", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/gpt-4.1-nano", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-4.1-nano", + "displayName": "OpenAI: GPT-4.1 Nano", + "metadata": { + "canonicalSlug": "openai/gpt-4.1-nano-2025-04-14", + "createdAt": "2025-04-14T17:22:49.000Z", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/openai/gpt-4.1-nano-2025-04-14/endpoints" + }, + "supportedParameters": [ + "max_completion_tokens", + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 1047576, + "max_completion_tokens": 32768, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-4.1-nano-2025-04-14", + "provider": "openai", + "model": "gpt-4.1-nano-2025-04-14", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-4.1-nano-2025-04-14", + "azure/us/gpt-4.1-nano-2025-04-14", + "openai/gpt-4.1-nano-2025-04-14" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1047576, + "inputTokens": 1047576, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4.1-nano-2025-04-14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + }, + "extra": { + "input_cost_per_token_batches": 5e-8, + "output_cost_per_token_batches": 2e-7 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/gpt-4.1-nano-2025-04-14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.11, + "output": 0.44 + }, + "extra": { + "input_cost_per_token_batches": 6e-8, + "output_cost_per_token_batches": 2.2e-7 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4.1-nano-2025-04-14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.1, + "output": 0.4 + }, + "extra": { + "input_cost_per_token_batches": 5e-8, + "output_cost_per_token_batches": 2e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2026-11-04", + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4.1-nano-2025-04-14", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-11-04", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/gpt-4.1-nano-2025-04-14", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-11-04", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4.1-nano-2025-04-14", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-4.5-preview", + "provider": "openai", + "model": "gpt-4.5-preview", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/gpt-4.5-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4.5-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 37.5, + "input": 75, + "output": 150 + }, + "extra": { + "input_cost_per_token_batches": 0.0000375, + "output_cost_per_token_batches": 0.000075 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4.5-preview", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-41-copilot", + "provider": "openai", + "model": "gpt-41-copilot", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "github_copilot" + ], + "aliases": [ + "github_copilot/gpt-41-copilot" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-41-copilot", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-41-copilot", + "mode": "completion" + } + ] + }, + { + "id": "openai/gpt-4o", + "provider": "openai", + "model": "gpt-4o", + "displayName": "GPT-4o", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "azure", + "azure-cognitive-services", + "cloudflare-ai-gateway", + "frogbot", + "github-models", + "github_copilot", + "gmi", + "helicone", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "openai", + "openrouter", + "orcarouter", + "poe", + "replicate", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "302ai/gpt-4o", + "azure-cognitive-services/gpt-4o", + "azure/gpt-4o", + "cloudflare-ai-gateway/openai/gpt-4o", + "frogbot/gpt-4o", + "github-models/openai/gpt-4o", + "github_copilot/gpt-4o", + "gmi/openai/gpt-4o", + "helicone/gpt-4o", + "kilo/openai/gpt-4o", + "llmgateway/gpt-4o", + "merge-gateway/openai/gpt-4o", + "nano-gpt/openai/gpt-4o", + "openai/gpt-4o", + "openrouter/openai/gpt-4o", + "orcarouter/openai/gpt-4o", + "poe/openai/gpt-4o", + "replicate/openai/gpt-4o", + "vercel/openai/gpt-4o", + "vercel_ai_gateway/openai/gpt-4o" + ], + "mergedProviderModelRecords": 20, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-4o", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-4o", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-4o", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "openai/gpt-4o", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "frogbot", + "model": "gpt-4o", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "openai/gpt-4o", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-4o", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-4o", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-4o", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-4o", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-4o", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.499, + "output": 9.996 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-4o", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-4o", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-4o", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-4o", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4o", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-4o", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "gmi", + "model": "gmi/openai/gpt-4o", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + }, + "extra": { + "cache_read_input_token_cost_priority": 0.000002125, + "input_cost_per_token_batches": 0.00000125, + "input_cost_per_token_priority": 0.00000425, + "output_cost_per_token_batches": 0.000005, + "output_cost_per_token_priority": 0.000017, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-4o", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/openai/gpt-4o", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/gpt-4o", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "cacheWrite": 0, + "input": 2.5, + "output": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-4o", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4o", + "OpenAI GPT-4o", + "OpenAI: GPT-4o", + "gpt-4o" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-09", + "releaseDate": "2024-05-13", + "lastUpdated": "2024-05-13", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_completion_tokens", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ], + "providerModelRecordCount": 20 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-4o", + "modelKey": "gpt-4o", + "displayName": "gpt-4o", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-05-13", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4o", + "modelKey": "gpt-4o", + "displayName": "GPT-4o", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-08-06", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4o", + "modelKey": "gpt-4o", + "displayName": "GPT-4o", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-08-06", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "openai/gpt-4o", + "modelKey": "openai/gpt-4o", + "displayName": "GPT-4o", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-08-06", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "gpt-4o", + "modelKey": "gpt-4o", + "displayName": "GPT-4o", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-08-06", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "openai/gpt-4o", + "modelKey": "openai/gpt-4o", + "displayName": "GPT-4o", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-05-13", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-4o", + "modelKey": "gpt-4o", + "displayName": "OpenAI GPT-4o", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2024-05-13", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-4o", + "modelKey": "openai/gpt-4o", + "displayName": "OpenAI: GPT-4o", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-4o", + "modelKey": "gpt-4o", + "displayName": "GPT-4o", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-08-06", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-4o", + "modelKey": "openai/gpt-4o", + "displayName": "GPT-4o", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-08-06", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-4o", + "modelKey": "openai/gpt-4o", + "displayName": "GPT-4o", + "family": "gpt", + "metadata": { + "lastUpdated": "2024-05-13", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-4o", + "modelKey": "gpt-4o", + "displayName": "GPT-4o", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-08-06", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-4o", + "modelKey": "openai/gpt-4o", + "displayName": "GPT-4o", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-08-06", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-4o", + "modelKey": "openai/gpt-4o", + "displayName": "GPT-4o", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-08-06", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-4o", + "modelKey": "openai/gpt-4o", + "displayName": "GPT-4o", + "family": "gpt", + "metadata": { + "lastUpdated": "2024-05-13", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-4o", + "modelKey": "openai/gpt-4o", + "displayName": "GPT-4o", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-08-06", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4o", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-4o", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gmi", + "model": "gmi/openai/gpt-4o", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-4o", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/openai/gpt-4o", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/gpt-4o", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-4o", + "displayName": "OpenAI: GPT-4o", + "metadata": { + "canonicalSlug": "openai/gpt-4o", + "createdAt": "2024-05-13T00:00:00.000Z", + "knowledgeCutoff": "2023-10-31", + "links": { + "details": "/api/v1/models/openai/gpt-4o/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_completion_tokens", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openai/gpt-4o-2024-05-13", + "provider": "openai", + "model": "gpt-4o-2024-05-13", + "displayName": "GPT-4o (2024-05-13)", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "github_copilot", + "kilo", + "merge-gateway", + "openai", + "openrouter", + "orcarouter" + ], + "aliases": [ + "azure/gpt-4o-2024-05-13", + "github_copilot/gpt-4o-2024-05-13", + "kilo/openai/gpt-4o-2024-05-13", + "merge-gateway/openai/gpt-4o-2024-05-13", + "openai/gpt-4o-2024-05-13", + "openrouter/openai/gpt-4o-2024-05-13", + "orcarouter/openai/gpt-4o-2024-05-13" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "responseSchema": true, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-4o-2024-05-13", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-4o-2024-05-13", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-4o-2024-05-13", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-4o-2024-05-13", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-4o-2024-05-13", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4o-2024-05-13", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-4o-2024-05-13", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-2024-05-13", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5, + "output": 15 + }, + "extra": { + "input_cost_per_token_batches": 0.0000025, + "input_cost_per_token_priority": 0.00000875, + "output_cost_per_token_batches": 0.0000075, + "output_cost_per_token_priority": 0.00002625 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-4o-2024-05-13", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5, + "output": 15 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-4o-2024-05-13", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4o (2024-05-13)", + "OpenAI: GPT-4o (2024-05-13)" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-09", + "releaseDate": "2024-05-13", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_completion_tokens", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ], + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-4o-2024-05-13", + "modelKey": "openai/gpt-4o-2024-05-13", + "displayName": "OpenAI: GPT-4o (2024-05-13)", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-4o-2024-05-13", + "modelKey": "openai/gpt-4o-2024-05-13", + "displayName": "GPT-4o (2024-05-13)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-05-13", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-4o-2024-05-13", + "modelKey": "gpt-4o-2024-05-13", + "displayName": "GPT-4o (2024-05-13)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-05-13", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-4o-2024-05-13", + "modelKey": "openai/gpt-4o-2024-05-13", + "displayName": "GPT-4o (2024-05-13)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-05-13", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-4o-2024-05-13", + "modelKey": "openai/gpt-4o-2024-05-13", + "displayName": "GPT-4o (2024-05-13)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-05-13", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4o-2024-05-13", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-4o-2024-05-13", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-2024-05-13", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-4o-2024-05-13", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-4o-2024-05-13", + "displayName": "OpenAI: GPT-4o (2024-05-13)", + "metadata": { + "canonicalSlug": "openai/gpt-4o-2024-05-13", + "createdAt": "2024-05-13T00:00:00.000Z", + "knowledgeCutoff": "2023-10-31", + "links": { + "details": "/api/v1/models/openai/gpt-4o-2024-05-13/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_completion_tokens", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 4096, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openai/gpt-4o-2024-08-06", + "provider": "openai", + "model": "gpt-4o-2024-08-06", + "displayName": "GPT-4o (2024-08-06)", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "github_copilot", + "kilo", + "merge-gateway", + "nano-gpt", + "openai", + "openrouter", + "orcarouter" + ], + "aliases": [ + "azure/eu/gpt-4o-2024-08-06", + "azure/global-standard/gpt-4o-2024-08-06", + "azure/global/gpt-4o-2024-08-06", + "azure/gpt-4o-2024-08-06", + "azure/us/gpt-4o-2024-08-06", + "github_copilot/gpt-4o-2024-08-06", + "kilo/openai/gpt-4o-2024-08-06", + "merge-gateway/openai/gpt-4o-2024-08-06", + "nano-gpt/openai/gpt-4o-2024-08-06", + "openai/gpt-4o-2024-08-06", + "openrouter/openai/gpt-4o-2024-08-06", + "orcarouter/openai/gpt-4o-2024-08-06" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-4o-2024-08-06", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-4o-2024-08-06", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-4o-2024-08-06", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.499, + "output": 9.996 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-4o-2024-08-06", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-4o-2024-08-06", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-4o-2024-08-06", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/eu/gpt-4o-2024-08-06", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.375, + "input": 2.75, + "output": 11 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/global-standard/gpt-4o-2024-08-06", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/global/gpt-4o-2024-08-06", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4o-2024-08-06", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/gpt-4o-2024-08-06", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.375, + "input": 2.75, + "output": 11 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-4o-2024-08-06", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-2024-08-06", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + }, + "extra": { + "input_cost_per_token_batches": 0.00000125, + "output_cost_per_token_batches": 0.000005, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-4o-2024-08-06", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4o (2024-08-06)", + "OpenAI: GPT-4o (2024-08-06)" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-09", + "releaseDate": "2024-08-06", + "lastUpdated": "2026-03-15", + "deprecationDate": "2026-02-27", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_completion_tokens", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ], + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-4o-2024-08-06", + "modelKey": "openai/gpt-4o-2024-08-06", + "displayName": "OpenAI: GPT-4o (2024-08-06)", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-08-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-4o-2024-08-06", + "modelKey": "openai/gpt-4o-2024-08-06", + "displayName": "GPT-4o (2024-08-06)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-08-06", + "openWeights": false, + "releaseDate": "2024-08-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-4o-2024-08-06", + "modelKey": "openai/gpt-4o-2024-08-06", + "displayName": "GPT-4o (2024-08-06)", + "family": "gpt", + "metadata": { + "lastUpdated": "2024-08-06", + "openWeights": false, + "releaseDate": "2024-08-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-4o-2024-08-06", + "modelKey": "gpt-4o-2024-08-06", + "displayName": "GPT-4o (2024-08-06)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-08-06", + "openWeights": false, + "releaseDate": "2024-08-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-4o-2024-08-06", + "modelKey": "openai/gpt-4o-2024-08-06", + "displayName": "GPT-4o (2024-08-06)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-08-06", + "openWeights": false, + "releaseDate": "2024-08-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-4o-2024-08-06", + "modelKey": "openai/gpt-4o-2024-08-06", + "displayName": "GPT-4o (2024-08-06)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-08-06", + "openWeights": false, + "releaseDate": "2024-08-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/eu/gpt-4o-2024-08-06", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-02-27" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/global-standard/gpt-4o-2024-08-06", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-02-27" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/global/gpt-4o-2024-08-06", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-02-27" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4o-2024-08-06", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-02-27" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/gpt-4o-2024-08-06", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-02-27" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-4o-2024-08-06", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-2024-08-06", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-4o-2024-08-06", + "displayName": "OpenAI: GPT-4o (2024-08-06)", + "metadata": { + "canonicalSlug": "openai/gpt-4o-2024-08-06", + "createdAt": "2024-08-06T00:00:00.000Z", + "knowledgeCutoff": "2023-10-31", + "links": { + "details": "/api/v1/models/openai/gpt-4o-2024-08-06/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_completion_tokens", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openai/gpt-4o-2024-11-20", + "provider": "openai", + "model": "gpt-4o-2024-11-20", + "displayName": "GPT-4o (2024-11-20)", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "azure", + "github_copilot", + "kilo", + "merge-gateway", + "nano-gpt", + "openai", + "openrouter", + "orcarouter" + ], + "aliases": [ + "abacus/gpt-4o-2024-11-20", + "azure/eu/gpt-4o-2024-11-20", + "azure/global-standard/gpt-4o-2024-11-20", + "azure/global/gpt-4o-2024-11-20", + "azure/gpt-4o-2024-11-20", + "azure/us/gpt-4o-2024-11-20", + "github_copilot/gpt-4o-2024-11-20", + "kilo/openai/gpt-4o-2024-11-20", + "merge-gateway/openai/gpt-4o-2024-11-20", + "nano-gpt/openai/gpt-4o-2024-11-20", + "openai/gpt-4o-2024-11-20", + "openrouter/openai/gpt-4o-2024-11-20", + "orcarouter/openai/gpt-4o-2024-11-20" + ], + "mergedProviderModelRecords": 13, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-4o-2024-11-20", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-4o-2024-11-20", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-4o-2024-11-20", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-4o-2024-11-20", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-4o-2024-11-20", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-4o-2024-11-20", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-4o-2024-11-20", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/eu/gpt-4o-2024-11-20", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheWrite": 1.38, + "input": 2.75, + "output": 11 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/global-standard/gpt-4o-2024-11-20", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/global/gpt-4o-2024-11-20", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4o-2024-11-20", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.75, + "output": 11 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/gpt-4o-2024-11-20", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheWrite": 1.38, + "input": 2.75, + "output": 11 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-4o-2024-11-20", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-2024-11-20", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + }, + "extra": { + "input_cost_per_token_batches": 0.00000125, + "output_cost_per_token_batches": 0.000005, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-4o-2024-11-20", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4o (2024-11-20)", + "OpenAI: GPT-4o (2024-11-20)" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-11-20", + "lastUpdated": "2024-11-20", + "deprecationDate": "2026-03-01", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ], + "providerModelRecordCount": 13 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-4o-2024-11-20", + "modelKey": "gpt-4o-2024-11-20", + "displayName": "GPT-4o (2024-11-20)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-11-20", + "openWeights": false, + "releaseDate": "2024-11-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-4o-2024-11-20", + "modelKey": "openai/gpt-4o-2024-11-20", + "displayName": "OpenAI: GPT-4o (2024-11-20)", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-11-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-4o-2024-11-20", + "modelKey": "openai/gpt-4o-2024-11-20", + "displayName": "GPT-4o (2024-11-20)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-11-20", + "openWeights": false, + "releaseDate": "2024-11-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-4o-2024-11-20", + "modelKey": "openai/gpt-4o-2024-11-20", + "displayName": "GPT-4o (2024-11-20)", + "family": "gpt", + "metadata": { + "lastUpdated": "2024-11-20", + "openWeights": false, + "releaseDate": "2024-11-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-4o-2024-11-20", + "modelKey": "gpt-4o-2024-11-20", + "displayName": "GPT-4o (2024-11-20)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-11-20", + "openWeights": false, + "releaseDate": "2024-11-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-4o-2024-11-20", + "modelKey": "openai/gpt-4o-2024-11-20", + "displayName": "GPT-4o (2024-11-20)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-11-20", + "openWeights": false, + "releaseDate": "2024-11-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-4o-2024-11-20", + "modelKey": "openai/gpt-4o-2024-11-20", + "displayName": "GPT-4o (2024-11-20)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-11-20", + "openWeights": false, + "releaseDate": "2024-11-20" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/eu/gpt-4o-2024-11-20", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-03-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/global-standard/gpt-4o-2024-11-20", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-03-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/global/gpt-4o-2024-11-20", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-03-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4o-2024-11-20", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-03-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/gpt-4o-2024-11-20", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-03-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-4o-2024-11-20", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-2024-11-20", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-4o-2024-11-20", + "displayName": "OpenAI: GPT-4o (2024-11-20)", + "metadata": { + "canonicalSlug": "openai/gpt-4o-2024-11-20", + "createdAt": "2024-11-20T18:33:14.000Z", + "knowledgeCutoff": "2023-10-31", + "links": { + "details": "/api/v1/models/openai/gpt-4o-2024-11-20/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-4o-audio-preview", + "provider": "openai", + "model": "gpt-4o-audio-preview", + "displayName": "OpenAI: GPT-4o Audio", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "kilo", + "openai" + ], + "aliases": [ + "kilo/openai/gpt-4o-audio-preview", + "openai/gpt-4o-audio-preview" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-4o-audio-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-audio-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "inputAudio": 40, + "output": 10, + "outputAudio": 80 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI: GPT-4o Audio" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-08-15", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-4o-audio-preview", + "modelKey": "openai/gpt-4o-audio-preview", + "displayName": "OpenAI: GPT-4o Audio", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-08-15" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-audio-preview", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4o-audio-preview-2024-12-17", + "provider": "openai", + "model": "gpt-4o-audio-preview-2024-12-17", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-4o-audio-preview-2024-12-17", + "openai/gpt-4o-audio-preview-2024-12-17" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "nativeStreaming": true, + "promptCaching": false, + "reasoning": false, + "responseSchema": false, + "vision": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4o-audio-preview-2024-12-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "inputAudio": 40, + "output": 10, + "outputAudio": 80 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-audio-preview-2024-12-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "inputAudio": 40, + "output": 10, + "outputAudio": 80 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4o-audio-preview-2024-12-17", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-audio-preview-2024-12-17", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4o-audio-preview-2025-06-03", + "provider": "openai", + "model": "gpt-4o-audio-preview-2025-06-03", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-4o-audio-preview-2025-06-03" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-audio-preview-2025-06-03", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "inputAudio": 40, + "output": 10, + "outputAudio": 80 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-audio-preview-2025-06-03", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4o-aug", + "provider": "openai", + "model": "gpt-4o-aug", + "displayName": "GPT-4o-Aug", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/openai/gpt-4o-aug" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-4o-aug", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.1, + "input": 2.2, + "output": 9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4o-Aug" + ], + "families": [ + "gpt" + ], + "releaseDate": "2024-11-21", + "lastUpdated": "2024-11-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-4o-aug", + "modelKey": "openai/gpt-4o-aug", + "displayName": "GPT-4o-Aug", + "family": "gpt", + "metadata": { + "lastUpdated": "2024-11-21", + "openWeights": false, + "releaseDate": "2024-11-21" + } + } + ] + }, + { + "id": "openai/gpt-4o-mini", + "provider": "openai", + "model": "gpt-4o-mini", + "displayName": "GPT-4o mini", + "family": "gpt-mini", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "azure", + "azure-cognitive-services", + "cloudflare-ai-gateway", + "github-models", + "github_copilot", + "gmi", + "helicone", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "openai", + "openrouter", + "orcarouter", + "poe", + "replicate", + "requesty", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "abacus/gpt-4o-mini", + "azure-cognitive-services/gpt-4o-mini", + "azure/global-standard/gpt-4o-mini", + "azure/gpt-4o-mini", + "cloudflare-ai-gateway/openai/gpt-4o-mini", + "github-models/openai/gpt-4o-mini", + "github_copilot/gpt-4o-mini", + "gmi/openai/gpt-4o-mini", + "helicone/gpt-4o-mini", + "kilo/openai/gpt-4o-mini", + "llmgateway/gpt-4o-mini", + "merge-gateway/openai/gpt-4o-mini", + "nano-gpt/openai/gpt-4o-mini", + "openai/gpt-4o-mini", + "openrouter/openai/gpt-4o-mini", + "orcarouter/openai/gpt-4o-mini", + "poe/openai/gpt-4o-mini", + "replicate/openai/gpt-4o-mini", + "requesty/openai/gpt-4o-mini", + "vercel/openai/gpt-4o-mini", + "vercel_ai_gateway/openai/gpt-4o-mini" + ], + "mergedProviderModelRecords": 21, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "openai/gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "openai/gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1496, + "output": 0.595 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.068, + "input": 0.14, + "output": 0.54 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-4o-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/global-standard/gpt-4o-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4o-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.165, + "output": 0.66 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-4o-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "gmi", + "model": "gmi/openai/gpt-4o-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + }, + "extra": { + "cache_read_input_token_cost_priority": 1.25e-7, + "input_cost_per_token_batches": 7.5e-8, + "input_cost_per_token_priority": 2.5e-7, + "output_cost_per_token_batches": 3e-7, + "output_cost_per_token_priority": 0.000001, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/openai/gpt-4o-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/gpt-4o-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "cacheWrite": 0, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-4o-mini", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4o Mini", + "GPT-4o mini", + "GPT-4o-mini", + "OpenAI GPT-4o-mini", + "OpenAI: GPT-4o-mini" + ], + "families": [ + "gpt", + "gpt-mini" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2024-07-18", + "lastUpdated": "2024-07-18", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_completion_tokens", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ], + "providerModelRecordCount": 21 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-4o-mini", + "modelKey": "gpt-4o-mini", + "displayName": "GPT-4o Mini", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4o-mini", + "modelKey": "gpt-4o-mini", + "displayName": "GPT-4o mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-4o-mini", + "modelKey": "gpt-4o-mini", + "displayName": "GPT-4o mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "openai/gpt-4o-mini", + "modelKey": "openai/gpt-4o-mini", + "displayName": "GPT-4o mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "openai/gpt-4o-mini", + "modelKey": "openai/gpt-4o-mini", + "displayName": "GPT-4o mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-4o-mini", + "modelKey": "gpt-4o-mini", + "displayName": "OpenAI GPT-4o-mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-4o-mini", + "modelKey": "openai/gpt-4o-mini", + "displayName": "OpenAI: GPT-4o-mini", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-4o-mini", + "modelKey": "gpt-4o-mini", + "displayName": "GPT-4o mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-4o-mini", + "modelKey": "openai/gpt-4o-mini", + "displayName": "GPT-4o mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-4o-mini", + "modelKey": "openai/gpt-4o-mini", + "displayName": "GPT-4o mini", + "family": "gpt-mini", + "metadata": { + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-4o-mini", + "modelKey": "gpt-4o-mini", + "displayName": "GPT-4o mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-4o-mini", + "modelKey": "openai/gpt-4o-mini", + "displayName": "GPT-4o mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-4o-mini", + "modelKey": "openai/gpt-4o-mini", + "displayName": "GPT-4o mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-4o-mini", + "modelKey": "openai/gpt-4o-mini", + "displayName": "GPT-4o-mini", + "family": "gpt-mini", + "metadata": { + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-4o-mini", + "modelKey": "openai/gpt-4o-mini", + "displayName": "GPT-4o Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-4o-mini", + "modelKey": "openai/gpt-4o-mini", + "displayName": "GPT-4o mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/global-standard/gpt-4o-mini", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4o-mini", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-4o-mini", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gmi", + "model": "gmi/openai/gpt-4o-mini", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-mini", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/openai/gpt-4o-mini", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/gpt-4o-mini", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-4o-mini", + "displayName": "OpenAI: GPT-4o-mini", + "metadata": { + "canonicalSlug": "openai/gpt-4o-mini", + "createdAt": "2024-07-18T00:00:00.000Z", + "knowledgeCutoff": "2023-10-31", + "links": { + "details": "/api/v1/models/openai/gpt-4o-mini/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_completion_tokens", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openai/gpt-4o-mini-2024-07-18", + "provider": "openai", + "model": "gpt-4o-mini-2024-07-18", + "displayName": "OpenAI: GPT-4o-mini (2024-07-18)", + "family": "o-mini", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "github_copilot", + "kilo", + "openai", + "openrouter" + ], + "aliases": [ + "azure/eu/gpt-4o-mini-2024-07-18", + "azure/gpt-4o-mini-2024-07-18", + "azure/us/gpt-4o-mini-2024-07-18", + "github_copilot/gpt-4o-mini-2024-07-18", + "kilo/openai/gpt-4o-mini-2024-07-18", + "openai/gpt-4o-mini-2024-07-18", + "openrouter/openai/gpt-4o-mini-2024-07-18" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false, + "attachments": true, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "structuredOutput": true, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-4o-mini-2024-07-18", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-4o-mini-2024-07-18", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/eu/gpt-4o-mini-2024-07-18", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.083, + "input": 0.165, + "output": 0.66 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4o-mini-2024-07-18", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.165, + "output": 0.66 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/gpt-4o-mini-2024-07-18", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.083, + "input": 0.165, + "output": 0.66 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-4o-mini-2024-07-18", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-mini-2024-07-18", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.03, + "search_context_size_low": 0.025, + "search_context_size_medium": 0.0275 + }, + "extra": { + "input_cost_per_token_batches": 7.5e-8, + "output_cost_per_token_batches": 3e-7 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-4o-mini-2024-07-18", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4o-mini (2024-07-18)", + "OpenAI: GPT-4o-mini (2024-07-18)" + ], + "families": [ + "o-mini" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-10-31", + "releaseDate": "2024-07-18", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ], + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-4o-mini-2024-07-18", + "modelKey": "openai/gpt-4o-mini-2024-07-18", + "displayName": "OpenAI: GPT-4o-mini (2024-07-18)", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-4o-mini-2024-07-18", + "modelKey": "openai/gpt-4o-mini-2024-07-18", + "displayName": "GPT-4o-mini (2024-07-18)", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2023-10-31", + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/eu/gpt-4o-mini-2024-07-18", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4o-mini-2024-07-18", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/gpt-4o-mini-2024-07-18", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-4o-mini-2024-07-18", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-mini-2024-07-18", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-4o-mini-2024-07-18", + "displayName": "OpenAI: GPT-4o-mini (2024-07-18)", + "metadata": { + "canonicalSlug": "openai/gpt-4o-mini-2024-07-18", + "createdAt": "2024-07-18T00:00:00.000Z", + "knowledgeCutoff": "2023-10-31", + "links": { + "details": "/api/v1/models/openai/gpt-4o-mini-2024-07-18/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-4o-mini-audio-preview", + "provider": "openai", + "model": "gpt-4o-mini-audio-preview", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-4o-mini-audio-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-mini-audio-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "inputAudio": 10, + "output": 0.6, + "outputAudio": 20 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-mini-audio-preview", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4o-mini-audio-preview-2024-12-17", + "provider": "openai", + "model": "gpt-4o-mini-audio-preview-2024-12-17", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-4o-mini-audio-preview-2024-12-17", + "openai/gpt-4o-mini-audio-preview-2024-12-17" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "nativeStreaming": true, + "promptCaching": false, + "reasoning": false, + "responseSchema": false, + "vision": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4o-mini-audio-preview-2024-12-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "inputAudio": 40, + "output": 10, + "outputAudio": 80 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-mini-audio-preview-2024-12-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "inputAudio": 10, + "output": 0.6, + "outputAudio": 20 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4o-mini-audio-preview-2024-12-17", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-mini-audio-preview-2024-12-17", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4o-mini-realtime-preview", + "provider": "openai", + "model": "gpt-4o-mini-realtime-preview", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-4o-mini-realtime-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-mini-realtime-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "input": 0.6, + "inputAudio": 10, + "output": 2.4, + "outputAudio": 20 + }, + "extra": { + "cache_creation_input_audio_token_cost": 3e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-mini-realtime-preview", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4o-mini-realtime-preview-2024-12-17", + "provider": "openai", + "model": "gpt-4o-mini-realtime-preview-2024-12-17", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/eu/gpt-4o-mini-realtime-preview-2024-12-17", + "azure/gpt-4o-mini-realtime-preview-2024-12-17", + "azure/us/gpt-4o-mini-realtime-preview-2024-12-17", + "openai/gpt-4o-mini-realtime-preview-2024-12-17" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/eu/gpt-4o-mini-realtime-preview-2024-12-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.33, + "input": 0.66, + "inputAudio": 11, + "output": 2.64, + "outputAudio": 22 + }, + "extra": { + "cache_creation_input_audio_token_cost": 3.3e-7 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4o-mini-realtime-preview-2024-12-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "input": 0.6, + "inputAudio": 10, + "output": 2.4, + "outputAudio": 20 + }, + "extra": { + "cache_creation_input_audio_token_cost": 3e-7 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/gpt-4o-mini-realtime-preview-2024-12-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.33, + "input": 0.66, + "inputAudio": 11, + "output": 2.64, + "outputAudio": 22 + }, + "extra": { + "cache_creation_input_audio_token_cost": 3.3e-7 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-mini-realtime-preview-2024-12-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "input": 0.6, + "inputAudio": 10, + "output": 2.4, + "outputAudio": 20 + }, + "extra": { + "cache_creation_input_audio_token_cost": 3e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/eu/gpt-4o-mini-realtime-preview-2024-12-17", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4o-mini-realtime-preview-2024-12-17", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/gpt-4o-mini-realtime-preview-2024-12-17", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-mini-realtime-preview-2024-12-17", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4o-mini-search", + "provider": "openai", + "model": "gpt-4o-mini-search", + "displayName": "GPT-4o-mini-Search", + "family": "gpt-mini", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/openai/gpt-4o-mini-search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-4o-mini-search", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.54 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4o-mini-Search" + ], + "families": [ + "gpt-mini" + ], + "releaseDate": "2025-03-11", + "lastUpdated": "2025-03-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-4o-mini-search", + "modelKey": "openai/gpt-4o-mini-search", + "displayName": "GPT-4o-mini-Search", + "family": "gpt-mini", + "metadata": { + "lastUpdated": "2025-03-11", + "openWeights": false, + "releaseDate": "2025-03-11" + } + } + ] + }, + { + "id": "openai/gpt-4o-mini-search-preview", + "provider": "openai", + "model": "gpt-4o-mini-search-preview", + "displayName": "OpenAI: GPT-4o-mini Search Preview", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "llmgateway", + "nano-gpt", + "openai", + "openrouter", + "vercel" + ], + "aliases": [ + "kilo/openai/gpt-4o-mini-search-preview", + "llmgateway/gpt-4o-mini-search-preview", + "nano-gpt/openai/gpt-4o-mini-search-preview", + "openai/gpt-4o-mini-search-preview", + "openrouter/openai/gpt-4o-mini-search-preview", + "vercel/openai/gpt-4o-mini-search-preview" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": false, + "attachments": true, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-4o-mini-search-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-4o-mini-search-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-4o-mini-search-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.088, + "output": 0.35 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-4o-mini-search-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-4o-mini-search-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-mini-search-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.03, + "search_context_size_low": 0.025, + "search_context_size_medium": 0.0275 + }, + "extra": { + "input_cost_per_token_batches": 7.5e-8, + "output_cost_per_token_batches": 3e-7 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-4o-mini-search-preview", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + }, + "other": { + "webSearch": 0.0275 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 4o Mini Search Preview", + "GPT-4o Mini Search Preview", + "GPT-4o mini Search Preview", + "GPT-4o-mini Search Preview", + "OpenAI: GPT-4o-mini Search Preview" + ], + "families": [ + "gpt", + "gpt-mini", + "o-mini" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-10-31", + "releaseDate": "2025-01", + "lastUpdated": "2025-01", + "supportedParameters": [ + "max_tokens", + "response_format", + "structured_outputs", + "web_search_options" + ], + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-4o-mini-search-preview", + "modelKey": "openai/gpt-4o-mini-search-preview", + "displayName": "OpenAI: GPT-4o-mini Search Preview", + "metadata": { + "lastUpdated": "2025-01", + "openWeights": false, + "releaseDate": "2025-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-4o-mini-search-preview", + "modelKey": "gpt-4o-mini-search-preview", + "displayName": "GPT-4o Mini Search Preview", + "family": "gpt", + "metadata": { + "lastUpdated": "2024-10-01", + "openWeights": false, + "releaseDate": "2024-10-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-4o-mini-search-preview", + "modelKey": "openai/gpt-4o-mini-search-preview", + "displayName": "GPT-4o mini Search Preview", + "family": "gpt-mini", + "metadata": { + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-4o-mini-search-preview", + "modelKey": "openai/gpt-4o-mini-search-preview", + "displayName": "GPT-4o-mini Search Preview", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2023-10-31", + "lastUpdated": "2025-03-12", + "openWeights": false, + "releaseDate": "2025-03-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-4o-mini-search-preview", + "modelKey": "openai/gpt-4o-mini-search-preview", + "displayName": "GPT 4o Mini Search Preview", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2025-01", + "openWeights": false, + "releaseDate": "2025-03-12" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-mini-search-preview", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-4o-mini-search-preview", + "displayName": "OpenAI: GPT-4o-mini Search Preview", + "metadata": { + "canonicalSlug": "openai/gpt-4o-mini-search-preview-2025-03-11", + "createdAt": "2025-03-12T22:22:02.000Z", + "knowledgeCutoff": "2023-10-31", + "links": { + "details": "/api/v1/models/openai/gpt-4o-mini-search-preview-2025-03-11/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "response_format", + "structured_outputs", + "web_search_options" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-4o-mini-search-preview-2025-03-11", + "provider": "openai", + "model": "gpt-4o-mini-search-preview-2025-03-11", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-4o-mini-search-preview-2025-03-11" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-mini-search-preview-2025-03-11", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + }, + "extra": { + "input_cost_per_token_batches": 7.5e-8, + "output_cost_per_token_batches": 3e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-mini-search-preview-2025-03-11", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4o-mini-transcribe", + "provider": "openai", + "model": "gpt-4o-mini-transcribe", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-4o-mini-transcribe", + "openai/gpt-4o-mini-transcribe" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 16000, + "inputTokens": 16000, + "outputTokens": 2000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4o-mini-transcribe", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.25, + "inputAudio": 1.25, + "output": 5 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-mini-transcribe", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.25, + "inputAudio": 1.25, + "output": 5 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4o-mini-transcribe", + "mode": "audio_transcription", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-mini-transcribe", + "mode": "audio_transcription", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "openai/gpt-4o-mini-transcribe-2025-03-20", + "provider": "openai", + "model": "gpt-4o-mini-transcribe-2025-03-20", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-4o-mini-transcribe-2025-03-20" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16000, + "inputTokens": 16000, + "outputTokens": 2000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-mini-transcribe-2025-03-20", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.25, + "inputAudio": 1.25, + "output": 5 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-mini-transcribe-2025-03-20", + "mode": "audio_transcription", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "openai/gpt-4o-mini-transcribe-2025-12-15", + "provider": "openai", + "model": "gpt-4o-mini-transcribe-2025-12-15", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-4o-mini-transcribe-2025-12-15" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16000, + "inputTokens": 16000, + "outputTokens": 2000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-mini-transcribe-2025-12-15", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.25, + "inputAudio": 1.25, + "output": 5 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-mini-transcribe-2025-12-15", + "mode": "audio_transcription", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "openai/gpt-4o-mini-tts", + "provider": "openai", + "model": "gpt-4o-mini-tts", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-4o-mini-tts", + "openai/gpt-4o-mini-tts" + ], + "mergedProviderModelRecords": 2, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4o-mini-tts", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10, + "outputAudio": 12 + }, + "perAudioSecond": { + "output": 0.00025 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-mini-tts", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10, + "outputAudio": 12 + }, + "perAudioSecond": { + "output": 0.00025 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4o-mini-tts", + "mode": "audio_speech", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-mini-tts", + "mode": "audio_speech", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "openai/gpt-4o-mini-tts-2025-03-20", + "provider": "openai", + "model": "gpt-4o-mini-tts-2025-03-20", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-4o-mini-tts-2025-03-20" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-mini-tts-2025-03-20", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10, + "outputAudio": 12 + }, + "perAudioSecond": { + "output": 0.00025 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-mini-tts-2025-03-20", + "mode": "audio_speech", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "openai/gpt-4o-mini-tts-2025-12-15", + "provider": "openai", + "model": "gpt-4o-mini-tts-2025-12-15", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-4o-mini-tts-2025-12-15" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-mini-tts-2025-12-15", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10, + "outputAudio": 12 + }, + "perAudioSecond": { + "output": 0.00025 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-mini-tts-2025-12-15", + "mode": "audio_speech", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "openai/gpt-4o-realtime-preview", + "provider": "openai", + "model": "gpt-4o-realtime-preview", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-4o-realtime-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-realtime-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 2.5, + "input": 5, + "inputAudio": 40, + "output": 20, + "outputAudio": 80 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-realtime-preview", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4o-realtime-preview-2024-10-01", + "provider": "openai", + "model": "gpt-4o-realtime-preview-2024-10-01", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/eu/gpt-4o-realtime-preview-2024-10-01", + "azure/gpt-4o-realtime-preview-2024-10-01", + "azure/us/gpt-4o-realtime-preview-2024-10-01" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/eu/gpt-4o-realtime-preview-2024-10-01", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 2.75, + "input": 5.5, + "inputAudio": 110, + "output": 22, + "outputAudio": 220 + }, + "extra": { + "cache_creation_input_audio_token_cost": 0.000022 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4o-realtime-preview-2024-10-01", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 2.5, + "input": 5, + "inputAudio": 100, + "output": 20, + "outputAudio": 200 + }, + "extra": { + "cache_creation_input_audio_token_cost": 0.00002 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/gpt-4o-realtime-preview-2024-10-01", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 2.75, + "input": 5.5, + "inputAudio": 110, + "output": 22, + "outputAudio": 220 + }, + "extra": { + "cache_creation_input_audio_token_cost": 0.000022 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/eu/gpt-4o-realtime-preview-2024-10-01", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4o-realtime-preview-2024-10-01", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/gpt-4o-realtime-preview-2024-10-01", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4o-realtime-preview-2024-12-17", + "provider": "openai", + "model": "gpt-4o-realtime-preview-2024-12-17", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/eu/gpt-4o-realtime-preview-2024-12-17", + "azure/gpt-4o-realtime-preview-2024-12-17", + "azure/us/gpt-4o-realtime-preview-2024-12-17", + "openai/gpt-4o-realtime-preview-2024-12-17" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/eu/gpt-4o-realtime-preview-2024-12-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 2.75, + "input": 5.5, + "inputAudio": 44, + "output": 22, + "outputAudio": 80 + }, + "extra": { + "cache_read_input_audio_token_cost": 0.0000025 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4o-realtime-preview-2024-12-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 2.5, + "input": 5, + "inputAudio": 40, + "output": 20, + "outputAudio": 80 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/gpt-4o-realtime-preview-2024-12-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 2.75, + "input": 5.5, + "inputAudio": 44, + "output": 22, + "outputAudio": 80 + }, + "extra": { + "cache_read_input_audio_token_cost": 0.0000025 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-realtime-preview-2024-12-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 2.5, + "input": 5, + "inputAudio": 40, + "output": 20, + "outputAudio": 80 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/eu/gpt-4o-realtime-preview-2024-12-17", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4o-realtime-preview-2024-12-17", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/gpt-4o-realtime-preview-2024-12-17", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-realtime-preview-2024-12-17", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4o-realtime-preview-2025-06-03", + "provider": "openai", + "model": "gpt-4o-realtime-preview-2025-06-03", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-4o-realtime-preview-2025-06-03" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-realtime-preview-2025-06-03", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 2.5, + "input": 5, + "inputAudio": 40, + "output": 20, + "outputAudio": 80 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-realtime-preview-2025-06-03", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4o-search", + "provider": "openai", + "model": "gpt-4o-search", + "displayName": "GPT-4o-Search", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/openai/gpt-4o-search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-4o-search", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.2, + "output": 9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4o-Search" + ], + "families": [ + "gpt" + ], + "releaseDate": "2025-03-11", + "lastUpdated": "2025-03-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-4o-search", + "modelKey": "openai/gpt-4o-search", + "displayName": "GPT-4o-Search", + "family": "gpt", + "metadata": { + "lastUpdated": "2025-03-11", + "openWeights": false, + "releaseDate": "2025-03-11" + } + } + ] + }, + { + "id": "openai/gpt-4o-search-preview", + "provider": "openai", + "model": "gpt-4o-search-preview", + "displayName": "OpenAI: GPT-4o Search Preview", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "llmgateway", + "nano-gpt", + "openai", + "openrouter" + ], + "aliases": [ + "kilo/openai/gpt-4o-search-preview", + "llmgateway/gpt-4o-search-preview", + "nano-gpt/openai/gpt-4o-search-preview", + "openai/gpt-4o-search-preview", + "openrouter/openai/gpt-4o-search-preview" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": false, + "attachments": true, + "openWeights": false, + "reasoning": false, + "toolCalling": false, + "structuredOutput": true, + "temperature": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-4o-search-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-4o-search-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-4o-search-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.47, + "output": 5.88 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-4o-search-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-search-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.05, + "search_context_size_low": 0.03, + "search_context_size_medium": 0.035 + }, + "extra": { + "input_cost_per_token_batches": 0.00000125, + "output_cost_per_token_batches": 0.000005 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-4o-search-preview", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + }, + "other": { + "webSearch": 0.035 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4o Search Preview", + "OpenAI: GPT-4o Search Preview" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-10-31", + "releaseDate": "2025-03-13", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "max_tokens", + "response_format", + "structured_outputs", + "web_search_options" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-4o-search-preview", + "modelKey": "openai/gpt-4o-search-preview", + "displayName": "OpenAI: GPT-4o Search Preview", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-03-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-4o-search-preview", + "modelKey": "gpt-4o-search-preview", + "displayName": "GPT-4o Search Preview", + "family": "gpt", + "metadata": { + "lastUpdated": "2024-10-01", + "openWeights": false, + "releaseDate": "2024-10-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-4o-search-preview", + "modelKey": "openai/gpt-4o-search-preview", + "displayName": "GPT-4o Search Preview", + "family": "gpt", + "metadata": { + "lastUpdated": "2024-05-13", + "openWeights": false, + "releaseDate": "2024-05-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-4o-search-preview", + "modelKey": "openai/gpt-4o-search-preview", + "displayName": "GPT-4o Search Preview", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-10-31", + "lastUpdated": "2025-03-12", + "openWeights": false, + "releaseDate": "2025-03-12" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-search-preview", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-4o-search-preview", + "displayName": "OpenAI: GPT-4o Search Preview", + "metadata": { + "canonicalSlug": "openai/gpt-4o-search-preview-2025-03-11", + "createdAt": "2025-03-12T22:19:09.000Z", + "knowledgeCutoff": "2023-10-31", + "links": { + "details": "/api/v1/models/openai/gpt-4o-search-preview-2025-03-11/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "response_format", + "structured_outputs", + "web_search_options" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-4o-search-preview-2025-03-11", + "provider": "openai", + "model": "gpt-4o-search-preview-2025-03-11", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-4o-search-preview-2025-03-11" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-search-preview-2025-03-11", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 2.5, + "output": 10 + }, + "extra": { + "input_cost_per_token_batches": 0.00000125, + "output_cost_per_token_batches": 0.000005 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-search-preview-2025-03-11", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-4o-transcribe", + "provider": "openai", + "model": "gpt-4o-transcribe", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-4o-transcribe", + "openai/gpt-4o-transcribe" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 16000, + "inputTokens": 16000, + "outputTokens": 2000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4o-transcribe", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "inputAudio": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-transcribe", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "inputAudio": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4o-transcribe", + "mode": "audio_transcription", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-transcribe", + "mode": "audio_transcription", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "openai/gpt-4o-transcribe-diarize", + "provider": "openai", + "model": "gpt-4o-transcribe-diarize", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-4o-transcribe-diarize", + "openai/gpt-4o-transcribe-diarize" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 16000, + "inputTokens": 16000, + "outputTokens": 2000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-4o-transcribe-diarize", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "inputAudio": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-4o-transcribe-diarize", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "inputAudio": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-4o-transcribe-diarize", + "mode": "audio_transcription", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-4o-transcribe-diarize", + "mode": "audio_transcription", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "openai/gpt-5", + "provider": "openai", + "model": "gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "abacus", + "anyapi", + "azure", + "azure-cognitive-services", + "fastrouter", + "github_copilot", + "gmi", + "helicone", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "neon", + "openai", + "opencode", + "openrouter", + "orcarouter", + "poe", + "qiniu-ai", + "replicate", + "requesty", + "sap-ai-core", + "vercel", + "zenmux" + ], + "aliases": [ + "302ai/gpt-5", + "abacus/gpt-5", + "anyapi/openai/gpt-5", + "azure-cognitive-services/gpt-5", + "azure/gpt-5", + "fastrouter/openai/gpt-5", + "github_copilot/gpt-5", + "gmi/openai/gpt-5", + "helicone/gpt-5", + "kilo/openai/gpt-5", + "llmgateway/gpt-5", + "merge-gateway/openai/gpt-5", + "nano-gpt/openai/gpt-5", + "nearai/openai/gpt-5", + "neon/gpt-5", + "openai/gpt-5", + "opencode/gpt-5", + "openrouter/openai/gpt-5", + "orcarouter/openai/gpt-5", + "poe/openai/gpt-5", + "qiniu-ai/openai/gpt-5", + "replicate/openai/gpt-5", + "requesty/openai/gpt-5", + "sap-ai-core/gpt-5", + "vercel/openai/gpt-5", + "zenmux/openai/gpt-5" + ], + "mergedProviderModelRecords": 26, + "limits": { + "contextTokens": 409600, + "inputTokens": 409600, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "audio", + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "openai/gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12500000000000003, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "openai/gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "neon", + "model": "gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.107, + "input": 1.07, + "output": 8.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 1.1, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "gmi", + "model": "gmi/openai/gpt-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "extra": { + "cache_read_input_token_cost_flex": 6.25e-8, + "cache_read_input_token_cost_priority": 2.5e-7, + "input_cost_per_token_flex": 6.25e-7, + "input_cost_per_token_priority": 0.0000025, + "output_cost_per_token_flex": 0.000005, + "output_cost_per_token_priority": 0.00002, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/openai/gpt-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5", + "GPT-5", + "OpenAI GPT-5", + "OpenAI/GPT-5", + "OpenAI: GPT-5", + "gpt-5" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2025-08-08", + "lastUpdated": "2025-08-08", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 26 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-5", + "modelKey": "gpt-5", + "displayName": "gpt-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-08", + "openWeights": false, + "releaseDate": "2025-08-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-5", + "modelKey": "gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "openai/gpt-5", + "modelKey": "openai/gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5", + "modelKey": "gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5", + "modelKey": "gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "openai/gpt-5", + "modelKey": "openai/gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-10-01", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-5", + "modelKey": "gpt-5", + "displayName": "OpenAI GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5", + "modelKey": "openai/gpt-5", + "displayName": "OpenAI: GPT-5", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5", + "modelKey": "gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-5", + "modelKey": "openai/gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5", + "modelKey": "openai/gpt-5", + "displayName": "GPT 5", + "family": "gpt", + "metadata": { + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "openai/gpt-5", + "modelKey": "openai/gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "gpt-5", + "modelKey": "gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5", + "modelKey": "gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gpt-5", + "modelKey": "gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5", + "modelKey": "openai/gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5", + "modelKey": "openai/gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5", + "modelKey": "openai/gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "openai/gpt-5", + "modelKey": "openai/gpt-5", + "displayName": "OpenAI/GPT-5", + "metadata": { + "lastUpdated": "2025-09-19", + "openWeights": false, + "releaseDate": "2025-09-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5", + "modelKey": "openai/gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "gpt-5", + "modelKey": "gpt-5", + "displayName": "gpt-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5", + "modelKey": "openai/gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5", + "modelKey": "openai/gpt-5", + "displayName": "GPT-5", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-5", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gmi", + "model": "gmi/openai/gpt-5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/openai/gpt-5", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5", + "displayName": "OpenAI: GPT-5", + "metadata": { + "canonicalSlug": "openai/gpt-5-2025-08-07", + "createdAt": "2025-08-07T17:23:33.000Z", + "knowledgeCutoff": "2024-09-30", + "links": { + "details": "/api/v1/models/openai/gpt-5-2025-08-07/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "high", + "medium", + "low", + "minimal" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openai/gpt-5-1", + "provider": "openai", + "model": "gpt-5-1", + "displayName": "GPT-5.1", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "neon" + ], + "aliases": [ + "neon/gpt-5-1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "neon", + "model": "gpt-5-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.1" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2025-11-13", + "lastUpdated": "2025-11-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "gpt-5-1", + "modelKey": "gpt-5-1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "openai/gpt-5-2", + "provider": "openai", + "model": "gpt-5-2", + "displayName": "GPT-5.2", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "neon" + ], + "aliases": [ + "neon/gpt-5-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "neon", + "model": "gpt-5-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.2" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2025-12-11", + "lastUpdated": "2025-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "gpt-5-2", + "modelKey": "gpt-5-2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "openai/gpt-5-2025-08-07", + "provider": "openai", + "model": "gpt-5-2025-08-07", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/eu/gpt-5-2025-08-07", + "azure/gpt-5-2025-08-07", + "azure/us/gpt-5-2025-08-07", + "openai/gpt-5-2025-08-07" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 272000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/eu/gpt-5-2025-08-07", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1375, + "input": 1.375, + "output": 11 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5-2025-08-07", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/gpt-5-2025-08-07", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1375, + "input": 1.375, + "output": 11 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5-2025-08-07", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "extra": { + "cache_read_input_token_cost_flex": 6.25e-8, + "cache_read_input_token_cost_priority": 2.5e-7, + "input_cost_per_token_flex": 6.25e-7, + "input_cost_per_token_priority": 0.0000025, + "output_cost_per_token_flex": 0.000005, + "output_cost_per_token_priority": 0.00002 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/eu/gpt-5-2025-08-07", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5-2025-08-07", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/gpt-5-2025-08-07", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5-2025-08-07", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5-3-codex", + "provider": "openai", + "model": "gpt-5-3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "frogbot" + ], + "aliases": [ + "frogbot/gpt-5-3-codex" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "frogbot", + "model": "gpt-5-3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.3 Codex" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-02-15", + "lastUpdated": "2026-02-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "gpt-5-3-codex", + "modelKey": "gpt-5-3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-02-15", + "openWeights": false, + "releaseDate": "2026-02-15" + } + } + ] + }, + { + "id": "openai/gpt-5-4", + "provider": "openai", + "model": "gpt-5-4", + "displayName": "GPT-5.4", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "neon" + ], + "aliases": [ + "neon/gpt-5-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1050000, + "inputTokens": 922000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "neon", + "model": "gpt-5-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 5, + "output": 22.5, + "cache_read": 0.5 + }, + "tiers": [ + { + "input": 5, + "output": 22.5, + "cache_read": 0.5, + "tier": { + "size": 272000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.4" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-05", + "lastUpdated": "2026-03-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "gpt-5-4", + "modelKey": "gpt-5-4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "openai/gpt-5-4-mini", + "provider": "openai", + "model": "gpt-5-4-mini", + "displayName": "GPT-5.4 Mini", + "family": "gpt-mini", + "sources": [ + "models.dev" + ], + "providers": [ + "frogbot", + "neon" + ], + "aliases": [ + "frogbot/gpt-5-4-mini", + "neon/gpt-5-4-mini" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "frogbot", + "model": "gpt-5-4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "neon", + "model": "gpt-5-4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.4 Mini", + "GPT-5.4 mini" + ], + "families": [ + "gpt-mini" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-17", + "lastUpdated": "2026-03-17", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "gpt-5-4-mini", + "modelKey": "gpt-5-4-mini", + "displayName": "GPT-5.4 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "gpt-5-4-mini", + "modelKey": "gpt-5-4-mini", + "displayName": "GPT-5.4 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "openai/gpt-5-4-nano", + "provider": "openai", + "model": "gpt-5-4-nano", + "displayName": "GPT-5.4 Nano", + "family": "gpt-nano", + "sources": [ + "models.dev" + ], + "providers": [ + "frogbot", + "neon" + ], + "aliases": [ + "frogbot/gpt-5-4-nano", + "neon/gpt-5-4-nano" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "frogbot", + "model": "gpt-5-4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "neon", + "model": "gpt-5-4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.4 Nano", + "GPT-5.4 nano" + ], + "families": [ + "gpt-nano" + ], + "knowledgeCutoff": "2024-05-30", + "releaseDate": "2025-08-07", + "lastUpdated": "2025-08-07", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "gpt-5-4-nano", + "modelKey": "gpt-5-4-nano", + "displayName": "GPT-5.4 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "gpt-5-4-nano", + "modelKey": "gpt-5-4-nano", + "displayName": "GPT-5.4 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "openai/gpt-5-5", + "provider": "openai", + "model": "gpt-5-5", + "displayName": "GPT-5.5", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "frogbot", + "neon" + ], + "aliases": [ + "frogbot/gpt-5-5", + "neon/gpt-5-5" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1050000, + "inputTokens": 922000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "frogbot", + "model": "gpt-5-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "neon", + "model": "gpt-5-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 45, + "cache_read": 1 + }, + "tiers": [ + { + "input": 10, + "output": 45, + "cache_read": 1, + "tier": { + "size": 272000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.5" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-05", + "lastUpdated": "2026-03-05", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "gpt-5-5", + "modelKey": "gpt-5-5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "gpt-5-5", + "modelKey": "gpt-5-5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "openai/gpt-5-chat", + "provider": "openai", + "model": "gpt-5-chat", + "displayName": "GPT-5 Chat", + "family": "gpt-codex", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "kilo", + "openai", + "openrouter", + "poe", + "requesty", + "vercel" + ], + "aliases": [ + "azure-cognitive-services/gpt-5-chat", + "azure/gpt-5-chat", + "kilo/openai/gpt-5-chat", + "openai/gpt-5-chat", + "openrouter/openai/gpt-5-chat", + "poe/openai/gpt-5-chat", + "requesty/openai/gpt-5-chat", + "vercel/openai/gpt-5-chat" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 400000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": true, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "xhighReasoningEffort": false, + "supports1MContext": false, + "attachments": true, + "openWeights": false, + "temperature": true, + "toolCalling": true, + "structuredOutput": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 1.1, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5-chat", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5 Chat", + "GPT-5 Chat (latest)", + "GPT-5-Chat", + "OpenAI: GPT-5 Chat" + ], + "families": [ + "gpt", + "gpt-codex" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10-24", + "releaseDate": "2025-08-07", + "lastUpdated": "2025-08-07", + "supportedParameters": [ + "max_tokens", + "response_format", + "seed", + "structured_outputs" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5-chat", + "modelKey": "gpt-5-chat", + "displayName": "GPT-5 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-10-24", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5-chat", + "modelKey": "gpt-5-chat", + "displayName": "GPT-5 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-10-24", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5-chat", + "modelKey": "openai/gpt-5-chat", + "displayName": "OpenAI: GPT-5 Chat", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5-chat", + "modelKey": "openai/gpt-5-chat", + "displayName": "GPT-5 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5-chat", + "modelKey": "openai/gpt-5-chat", + "displayName": "GPT-5-Chat", + "family": "gpt-codex", + "metadata": { + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5-chat", + "modelKey": "openai/gpt-5-chat", + "displayName": "GPT-5 Chat (latest)", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5-chat", + "modelKey": "openai/gpt-5-chat", + "displayName": "GPT-5 Chat", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5-chat", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/blog/gpt-5-in-azure-ai-foundry-the-future-of-ai-apps-and-agents-starts-here/", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5-chat", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5-chat", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5-chat", + "displayName": "OpenAI: GPT-5 Chat", + "metadata": { + "canonicalSlug": "openai/gpt-5-chat-2025-08-07", + "createdAt": "2025-08-07T17:30:37.000Z", + "knowledgeCutoff": "2024-09-30", + "links": { + "details": "/api/v1/models/openai/gpt-5-chat-2025-08-07/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "response_format", + "seed", + "structured_outputs" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5-chat-latest", + "provider": "openai", + "model": "gpt-5-chat-latest", + "displayName": "GPT-5 Chat (latest)", + "family": "gpt-codex", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "helicone", + "jiekou", + "llmgateway", + "merge-gateway", + "openai", + "orcarouter" + ], + "aliases": [ + "azure/gpt-5-chat-latest", + "helicone/gpt-5-chat-latest", + "jiekou/gpt-5-chat-latest", + "llmgateway/gpt-5-chat-latest", + "merge-gateway/openai/gpt-5-chat-latest", + "openai/gpt-5-chat-latest", + "orcarouter/openai/gpt-5-chat-latest" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "maxTokens": 16384, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-5-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12500000000000003, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "gpt-5-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.125, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-5-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5-chat-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5-chat-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5 Chat (latest)", + "OpenAI GPT-5 Chat Latest", + "gpt-5-chat-latest" + ], + "families": [ + "gpt", + "gpt-codex" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-09", + "releaseDate": "2024-09-30", + "lastUpdated": "2024-09-30", + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-5-chat-latest", + "modelKey": "gpt-5-chat-latest", + "displayName": "OpenAI GPT-5 Chat Latest", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2024-09-30", + "openWeights": false, + "releaseDate": "2024-09-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gpt-5-chat-latest", + "modelKey": "gpt-5-chat-latest", + "displayName": "gpt-5-chat-latest", + "family": "gpt", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5-chat-latest", + "modelKey": "gpt-5-chat-latest", + "displayName": "GPT-5 Chat (latest)", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-5-chat-latest", + "modelKey": "openai/gpt-5-chat-latest", + "displayName": "GPT-5 Chat (latest)", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5-chat-latest", + "modelKey": "gpt-5-chat-latest", + "displayName": "GPT-5 Chat (latest)", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5-chat-latest", + "modelKey": "openai/gpt-5-chat-latest", + "displayName": "GPT-5 Chat (latest)", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5-chat-latest", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5-chat-latest", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5-codex", + "provider": "openai", + "model": "gpt-5-codex", + "displayName": "GPT-5-Codex", + "family": "gpt-codex", + "mode": "responses", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "azure", + "azure-cognitive-services", + "helicone", + "jiekou", + "kilo", + "nano-gpt", + "openai", + "opencode", + "openrouter", + "orcarouter", + "poe", + "requesty", + "vercel", + "zenmux" + ], + "aliases": [ + "abacus/gpt-5-codex", + "azure-cognitive-services/gpt-5-codex", + "azure/gpt-5-codex", + "helicone/gpt-5-codex", + "jiekou/gpt-5-codex", + "kilo/openai/gpt-5-codex", + "nano-gpt/openai/gpt-5-codex", + "openai/gpt-5-codex", + "opencode/gpt-5-codex", + "openrouter/openai/gpt-5-codex", + "orcarouter/openai/gpt-5-codex", + "poe/openai/gpt-5-codex", + "requesty/openai/gpt-5-codex", + "vercel/openai/gpt-5-codex", + "zenmux/openai/gpt-5-codex" + ], + "mergedProviderModelRecords": 15, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-5-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-5-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12500000000000003, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "gpt-5-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.125, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 9.996, + "output": 19.992 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gpt-5-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.107, + "input": 1.07, + "output": 8.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.1, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5-codex", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5-codex", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5-codex", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5-codex", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5 Codex", + "GPT-5-Codex", + "OpenAI: GPT-5 Codex", + "gpt-5-codex" + ], + "families": [ + "gpt", + "gpt-codex" + ], + "modes": [ + "chat", + "responses" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2025-09-15", + "lastUpdated": "2025-09-15", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/responses" + ], + "providerModelRecordCount": 15 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-5-codex", + "modelKey": "gpt-5-codex", + "displayName": "GPT-5 Codex", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-09-15", + "openWeights": false, + "releaseDate": "2025-09-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5-codex", + "modelKey": "gpt-5-codex", + "displayName": "GPT-5-Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-09-15", + "openWeights": false, + "releaseDate": "2025-09-15", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5-codex", + "modelKey": "gpt-5-codex", + "displayName": "GPT-5-Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-09-15", + "openWeights": false, + "releaseDate": "2025-09-15", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-5-codex", + "modelKey": "gpt-5-codex", + "displayName": "OpenAI: GPT-5 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gpt-5-codex", + "modelKey": "gpt-5-codex", + "displayName": "gpt-5-codex", + "family": "gpt-codex", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5-codex", + "modelKey": "openai/gpt-5-codex", + "displayName": "OpenAI: GPT-5 Codex", + "metadata": { + "lastUpdated": "2025-09-15", + "openWeights": false, + "releaseDate": "2025-09-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5-codex", + "modelKey": "openai/gpt-5-codex", + "displayName": "GPT-5 Codex", + "family": "gpt-codex", + "metadata": { + "lastUpdated": "2025-09-15", + "openWeights": false, + "releaseDate": "2025-09-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5-codex", + "modelKey": "gpt-5-codex", + "displayName": "GPT-5-Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-09-15", + "openWeights": false, + "releaseDate": "2025-09-15", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gpt-5-codex", + "modelKey": "gpt-5-codex", + "displayName": "GPT-5 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-09-15", + "openWeights": false, + "releaseDate": "2025-09-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5-codex", + "modelKey": "openai/gpt-5-codex", + "displayName": "GPT-5-Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-09-15", + "openWeights": false, + "releaseDate": "2025-09-15", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5-codex", + "modelKey": "openai/gpt-5-codex", + "displayName": "GPT-5-Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-09-15", + "openWeights": false, + "releaseDate": "2025-09-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5-codex", + "modelKey": "openai/gpt-5-codex", + "displayName": "GPT-5-Codex", + "family": "gpt-codex", + "metadata": { + "lastUpdated": "2025-09-23", + "openWeights": false, + "releaseDate": "2025-09-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5-codex", + "modelKey": "openai/gpt-5-codex", + "displayName": "GPT-5 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-10-01", + "lastUpdated": "2025-09-15", + "openWeights": false, + "releaseDate": "2025-09-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5-codex", + "modelKey": "openai/gpt-5-codex", + "displayName": "GPT-5-Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-09-15", + "openWeights": false, + "releaseDate": "2025-09-15", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5-codex", + "modelKey": "openai/gpt-5-codex", + "displayName": "GPT-5 Codex", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-09-23", + "openWeights": false, + "releaseDate": "2025-09-23", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5-codex", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5-codex", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5-codex", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5-codex", + "displayName": "OpenAI: GPT-5 Codex", + "metadata": { + "canonicalSlug": "openai/gpt-5-codex", + "createdAt": "2025-09-23T16:03:23.000Z", + "knowledgeCutoff": "2024-09-30", + "links": { + "details": "/api/v1/models/openai/gpt-5-codex/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5-image", + "provider": "openai", + "model": "gpt-5-image", + "displayName": "OpenAI: GPT-5 Image", + "family": "gpt", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter", + "requesty" + ], + "aliases": [ + "kilo/openai/gpt-5-image", + "openrouter/openai/gpt-5-image", + "requesty/openai/gpt-5-image" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5-image", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 10, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5-image", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 10, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5-image", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "output": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5-image", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 10, + "output": 10 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5 Image", + "OpenAI: GPT-5 Image" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2024-10-01", + "releaseDate": "2025-10-14", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5-image", + "modelKey": "openai/gpt-5-image", + "displayName": "OpenAI: GPT-5 Image", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-10-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5-image", + "modelKey": "openai/gpt-5-image", + "displayName": "GPT-5 Image", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-10-01", + "lastUpdated": "2025-10-14", + "openWeights": false, + "releaseDate": "2025-10-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5-image", + "modelKey": "openai/gpt-5-image", + "displayName": "GPT-5 Image", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-10-01", + "lastUpdated": "2025-10-14", + "openWeights": false, + "releaseDate": "2025-10-14" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5-image", + "displayName": "OpenAI: GPT-5 Image", + "metadata": { + "canonicalSlug": "openai/gpt-5-image", + "createdAt": "2025-10-14T13:19:46.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-5-image/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_logprobs", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5-image-mini", + "provider": "openai", + "model": "gpt-5-image-mini", + "displayName": "OpenAI: GPT-5 Image Mini", + "family": "gpt", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/openai/gpt-5-image-mini", + "openrouter/openai/gpt-5-image-mini" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5-image-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5-image-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5-image-mini", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 2 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5 Image Mini", + "OpenAI: GPT-5 Image Mini" + ], + "families": [ + "gpt" + ], + "releaseDate": "2025-10-16", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5-image-mini", + "modelKey": "openai/gpt-5-image-mini", + "displayName": "OpenAI: GPT-5 Image Mini", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-10-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5-image-mini", + "modelKey": "openai/gpt-5-image-mini", + "displayName": "GPT-5 Image Mini", + "family": "gpt", + "metadata": { + "lastUpdated": "2025-10-16", + "openWeights": false, + "releaseDate": "2025-10-16" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5-image-mini", + "displayName": "OpenAI: GPT-5 Image Mini", + "metadata": { + "canonicalSlug": "openai/gpt-5-image-mini", + "createdAt": "2025-10-16T14:23:03.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-5-image-mini/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_logprobs", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5-mini", + "provider": "openai", + "model": "gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "abacus", + "anyapi", + "azure", + "azure-cognitive-services", + "fastrouter", + "github-copilot", + "github_copilot", + "helicone", + "jiekou", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "neon", + "openai", + "openrouter", + "orcarouter", + "perplexity-agent", + "poe", + "qihang-ai", + "replicate", + "requesty", + "sap-ai-core", + "vercel", + "vivgrid" + ], + "aliases": [ + "302ai/gpt-5-mini", + "abacus/gpt-5-mini", + "anyapi/openai/gpt-5-mini", + "azure-cognitive-services/gpt-5-mini", + "azure/gpt-5-mini", + "fastrouter/openai/gpt-5-mini", + "github-copilot/gpt-5-mini", + "github_copilot/gpt-5-mini", + "helicone/gpt-5-mini", + "jiekou/gpt-5-mini", + "kilo/openai/gpt-5-mini", + "llmgateway/gpt-5-mini", + "merge-gateway/openai/gpt-5-mini", + "nano-gpt/openai/gpt-5-mini", + "nearai/openai/gpt-5-mini", + "neon/gpt-5-mini", + "openai/gpt-5-mini", + "openrouter/openai/gpt-5-mini", + "orcarouter/openai/gpt-5-mini", + "perplexity-agent/openai/gpt-5-mini", + "poe/openai/gpt-5-mini", + "qihang-ai/gpt-5-mini", + "replicate/openai/gpt-5-mini", + "requesty/openai/gpt-5-mini", + "sap-ai-core/gpt-5-mini", + "vercel/openai/gpt-5-mini", + "vivgrid/gpt-5-mini" + ], + "mergedProviderModelRecords": 27, + "limits": { + "contextTokens": 400000, + "inputTokens": 400000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "openai/gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "github-copilot", + "model": "gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.024999999999999998, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.225, + "output": 1.8 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "openai/gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "neon", + "model": "gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "openai/gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.022, + "input": 0.22, + "output": 1.8 + } + }, + { + "source": "models.dev", + "provider": "qihang-ai", + "model": "gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.29 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "vivgrid", + "model": "gpt-5-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.25, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-5-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + }, + "extra": { + "cache_read_input_token_cost_flex": 1.25e-8, + "cache_read_input_token_cost_priority": 4.5e-8, + "input_cost_per_token_flex": 1.25e-7, + "input_cost_per_token_priority": 4.5e-7, + "output_cost_per_token_flex": 0.000001, + "output_cost_per_token_priority": 0.0000036, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/openai/gpt-5-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5-mini", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5 Mini", + "GPT-5 Mini", + "GPT-5-Mini", + "GPT-5-mini", + "OpenAI GPT-5 Mini", + "OpenAI: GPT-5 Mini", + "gpt-5-mini" + ], + "families": [ + "gpt-mini" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-05-30", + "releaseDate": "2025-08-08", + "lastUpdated": "2025-08-08", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 27 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-5-mini", + "modelKey": "gpt-5-mini", + "displayName": "gpt-5-mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-08", + "openWeights": false, + "releaseDate": "2025-08-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-5-mini", + "modelKey": "gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "openai/gpt-5-mini", + "modelKey": "openai/gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5-mini", + "modelKey": "gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5-mini", + "modelKey": "gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "openai/gpt-5-mini", + "modelKey": "openai/gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-10-01", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "gpt-5-mini", + "modelKey": "gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-5-mini", + "modelKey": "gpt-5-mini", + "displayName": "OpenAI GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gpt-5-mini", + "modelKey": "gpt-5-mini", + "displayName": "gpt-5-mini", + "family": "gpt-mini", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5-mini", + "modelKey": "openai/gpt-5-mini", + "displayName": "OpenAI: GPT-5 Mini", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5-mini", + "modelKey": "gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-5-mini", + "modelKey": "openai/gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5-mini", + "modelKey": "openai/gpt-5-mini", + "displayName": "GPT 5 Mini", + "family": "gpt-mini", + "metadata": { + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "openai/gpt-5-mini", + "modelKey": "openai/gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "gpt-5-mini", + "modelKey": "gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5-mini", + "modelKey": "gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5-mini", + "modelKey": "openai/gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5-mini", + "modelKey": "openai/gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "openai/gpt-5-mini", + "modelKey": "openai/gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5-mini", + "modelKey": "openai/gpt-5-mini", + "displayName": "GPT-5-mini", + "family": "gpt-mini", + "metadata": { + "lastUpdated": "2025-06-25", + "openWeights": false, + "releaseDate": "2025-06-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qihang-ai", + "providerName": "QiHang", + "providerApi": "https://api.qhaigc.net/v1", + "providerDoc": "https://www.qhaigc.net/docs", + "model": "gpt-5-mini", + "modelKey": "gpt-5-mini", + "displayName": "GPT-5-Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-09-15", + "openWeights": false, + "releaseDate": "2025-09-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5-mini", + "modelKey": "openai/gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "gpt-5-mini", + "modelKey": "gpt-5-mini", + "displayName": "gpt-5-mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5-mini", + "modelKey": "openai/gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vivgrid", + "providerName": "Vivgrid", + "providerApi": "https://api.vivgrid.com/v1", + "providerDoc": "https://docs.vivgrid.com/models", + "model": "gpt-5-mini", + "modelKey": "gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5-mini", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-5-mini", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5-mini", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5-mini", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/openai/gpt-5-mini", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5-mini", + "displayName": "OpenAI: GPT-5 Mini", + "metadata": { + "canonicalSlug": "openai/gpt-5-mini-2025-08-07", + "createdAt": "2025-08-07T17:23:27.000Z", + "knowledgeCutoff": "2024-05-31", + "links": { + "details": "/api/v1/models/openai/gpt-5-mini-2025-08-07/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "high", + "medium", + "low", + "minimal" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5-mini-2025-08-07", + "provider": "openai", + "model": "gpt-5-mini-2025-08-07", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/eu/gpt-5-mini-2025-08-07", + "azure/gpt-5-mini-2025-08-07", + "azure/us/gpt-5-mini-2025-08-07", + "openai/gpt-5-mini-2025-08-07" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 272000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/eu/gpt-5-mini-2025-08-07", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.0275, + "input": 0.275, + "output": 2.2 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5-mini-2025-08-07", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/gpt-5-mini-2025-08-07", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.0275, + "input": 0.275, + "output": 2.2 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5-mini-2025-08-07", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + }, + "extra": { + "cache_read_input_token_cost_flex": 1.25e-8, + "cache_read_input_token_cost_priority": 4.5e-8, + "input_cost_per_token_flex": 1.25e-7, + "input_cost_per_token_priority": 4.5e-7, + "output_cost_per_token_flex": 0.000001, + "output_cost_per_token_priority": 0.0000036 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/eu/gpt-5-mini-2025-08-07", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5-mini-2025-08-07", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/gpt-5-mini-2025-08-07", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5-mini-2025-08-07", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5-nano", + "provider": "openai", + "model": "gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "azure", + "azure-cognitive-services", + "fastrouter", + "helicone", + "jiekou", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "neon", + "openai", + "opencode", + "openrouter", + "orcarouter", + "poe", + "replicate", + "requesty", + "sap-ai-core", + "vercel" + ], + "aliases": [ + "abacus/gpt-5-nano", + "azure-cognitive-services/gpt-5-nano", + "azure/gpt-5-nano", + "fastrouter/openai/gpt-5-nano", + "helicone/gpt-5-nano", + "jiekou/gpt-5-nano", + "kilo/openai/gpt-5-nano", + "llmgateway/gpt-5-nano", + "merge-gateway/openai/gpt-5-nano", + "nano-gpt/openai/gpt-5-nano", + "nearai/openai/gpt-5-nano", + "neon/gpt-5-nano", + "openai/gpt-5-nano", + "opencode/gpt-5-nano", + "openrouter/openai/gpt-5-nano", + "orcarouter/openai/gpt-5-nano", + "poe/openai/gpt-5-nano", + "replicate/openai/gpt-5-nano", + "requesty/openai/gpt-5-nano", + "sap-ai-core/gpt-5-nano", + "vercel/openai/gpt-5-nano" + ], + "mergedProviderModelRecords": 21, + "limits": { + "contextTokens": 400000, + "inputTokens": 400000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "openai/gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.049999999999999996, + "output": 0.39999999999999997 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.045, + "output": 0.36 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "openai/gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "neon", + "model": "gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0045, + "input": 0.045, + "output": 0.36 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5-nano", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5-nano", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + }, + "extra": { + "cache_read_input_token_cost_flex": 2.5e-9, + "input_cost_per_token_flex": 2.5e-8, + "input_cost_per_token_priority": 0.0000025, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, + "output_cost_per_token_flex": 2e-7 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5-nano", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/openai/gpt-5-nano", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5-nano", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.05, + "output": 0.4 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5 Nano", + "GPT-5 Nano", + "GPT-5-nano", + "OpenAI GPT-5 Nano", + "OpenAI: GPT-5 Nano", + "gpt-5-nano" + ], + "families": [ + "gpt-nano" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-05-30", + "releaseDate": "2025-08-07", + "lastUpdated": "2025-08-07", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 21 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-5-nano", + "modelKey": "gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5-nano", + "modelKey": "gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5-nano", + "modelKey": "gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "openai/gpt-5-nano", + "modelKey": "openai/gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-10-01", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-5-nano", + "modelKey": "gpt-5-nano", + "displayName": "OpenAI GPT-5 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gpt-5-nano", + "modelKey": "gpt-5-nano", + "displayName": "gpt-5-nano", + "family": "gpt-nano", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5-nano", + "modelKey": "openai/gpt-5-nano", + "displayName": "OpenAI: GPT-5 Nano", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5-nano", + "modelKey": "gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-5-nano", + "modelKey": "openai/gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5-nano", + "modelKey": "openai/gpt-5-nano", + "displayName": "GPT 5 Nano", + "family": "gpt-nano", + "metadata": { + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "openai/gpt-5-nano", + "modelKey": "openai/gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "gpt-5-nano", + "modelKey": "gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5-nano", + "modelKey": "gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gpt-5-nano", + "modelKey": "gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5-nano", + "modelKey": "openai/gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5-nano", + "modelKey": "openai/gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5-nano", + "modelKey": "openai/gpt-5-nano", + "displayName": "GPT-5-nano", + "family": "gpt-nano", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5-nano", + "modelKey": "openai/gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "gpt-5-nano", + "modelKey": "gpt-5-nano", + "displayName": "gpt-5-nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5-nano", + "modelKey": "openai/gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5-nano", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5-nano", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5-nano", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/openai/gpt-5-nano", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5-nano", + "displayName": "OpenAI: GPT-5 Nano", + "metadata": { + "canonicalSlug": "openai/gpt-5-nano-2025-08-07", + "createdAt": "2025-08-07T17:23:22.000Z", + "knowledgeCutoff": "2024-05-31", + "links": { + "details": "/api/v1/models/openai/gpt-5-nano-2025-08-07/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "high", + "medium", + "low", + "minimal" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openai/gpt-5-nano-2025-08-07", + "provider": "openai", + "model": "gpt-5-nano-2025-08-07", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/eu/gpt-5-nano-2025-08-07", + "azure/gpt-5-nano-2025-08-07", + "azure/us/gpt-5-nano-2025-08-07", + "openai/gpt-5-nano-2025-08-07" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 272000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/eu/gpt-5-nano-2025-08-07", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.0055, + "input": 0.055, + "output": 0.44 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5-nano-2025-08-07", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/gpt-5-nano-2025-08-07", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.0055, + "input": 0.055, + "output": 0.44 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5-nano-2025-08-07", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.005, + "input": 0.05, + "output": 0.4 + }, + "extra": { + "cache_read_input_token_cost_flex": 2.5e-9, + "input_cost_per_token_flex": 2.5e-8, + "output_cost_per_token_flex": 2e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/eu/gpt-5-nano-2025-08-07", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5-nano-2025-08-07", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/gpt-5-nano-2025-08-07", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5-nano-2025-08-07", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5-pro", + "provider": "openai", + "model": "gpt-5-pro", + "displayName": "GPT-5 Pro", + "family": "gpt-pro", + "mode": "responses", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "azure", + "azure-cognitive-services", + "helicone", + "jiekou", + "kilo", + "llmgateway", + "nano-gpt", + "openai", + "openrouter", + "orcarouter", + "poe", + "requesty", + "vercel" + ], + "aliases": [ + "302ai/gpt-5-pro", + "azure-cognitive-services/gpt-5-pro", + "azure/gpt-5-pro", + "helicone/gpt-5-pro", + "jiekou/gpt-5-pro", + "kilo/openai/gpt-5-pro", + "llmgateway/gpt-5-pro", + "nano-gpt/openai/gpt-5-pro", + "openai/gpt-5-pro", + "openrouter/openai/gpt-5-pro", + "orcarouter/openai/gpt-5-pro", + "poe/openai/gpt-5-pro", + "requesty/openai/gpt-5-pro", + "vercel/openai/gpt-5-pro" + ], + "mergedProviderModelRecords": 14, + "limits": { + "contextTokens": 400000, + "inputTokens": 400000, + "maxTokens": 272000, + "outputTokens": 272000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": false, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 120 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 120 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 120 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 120 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "gpt-5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 13.5, + "output": 108 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 120 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 120 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 120 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 120 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 120 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 120 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14, + "output": 110 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 120 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 120 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 15, + "output": 120 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 15, + "output": 120 + }, + "extra": { + "input_cost_per_token_batches": 0.0000075, + "output_cost_per_token_batches": 0.00006, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5-pro", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 15, + "output": 120 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5 Pro", + "GPT-5 Pro", + "GPT-5 pro", + "GPT-5-Pro", + "OpenAI: GPT-5 Pro", + "gpt-5-pro" + ], + "families": [ + "gpt", + "gpt-pro" + ], + "modes": [ + "responses" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2025-10-08", + "lastUpdated": "2025-10-08", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ], + "providerModelRecordCount": 14 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-5-pro", + "modelKey": "gpt-5-pro", + "displayName": "gpt-5-pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-10-08", + "openWeights": false, + "releaseDate": "2025-10-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5-pro", + "modelKey": "gpt-5-pro", + "displayName": "GPT-5 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-10-06", + "openWeights": false, + "releaseDate": "2025-10-06", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5-pro", + "modelKey": "gpt-5-pro", + "displayName": "GPT-5 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-10-06", + "openWeights": false, + "releaseDate": "2025-10-06", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-5-pro", + "modelKey": "gpt-5-pro", + "displayName": "OpenAI: GPT-5 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gpt-5-pro", + "modelKey": "gpt-5-pro", + "displayName": "gpt-5-pro", + "family": "gpt-pro", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5-pro", + "modelKey": "openai/gpt-5-pro", + "displayName": "OpenAI: GPT-5 Pro", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-10-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5-pro", + "modelKey": "gpt-5-pro", + "displayName": "GPT-5 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-10-06", + "openWeights": false, + "releaseDate": "2025-10-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5-pro", + "modelKey": "openai/gpt-5-pro", + "displayName": "GPT 5 Pro", + "family": "gpt-pro", + "metadata": { + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5-pro", + "modelKey": "gpt-5-pro", + "displayName": "GPT-5 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-10-06", + "openWeights": false, + "releaseDate": "2025-10-06", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5-pro", + "modelKey": "openai/gpt-5-pro", + "displayName": "GPT-5 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-10-06", + "openWeights": false, + "releaseDate": "2025-10-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5-pro", + "modelKey": "openai/gpt-5-pro", + "displayName": "GPT-5 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-10-06", + "openWeights": false, + "releaseDate": "2025-10-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5-pro", + "modelKey": "openai/gpt-5-pro", + "displayName": "GPT-5-Pro", + "family": "gpt-pro", + "metadata": { + "lastUpdated": "2025-10-06", + "openWeights": false, + "releaseDate": "2025-10-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5-pro", + "modelKey": "openai/gpt-5-pro", + "displayName": "GPT-5 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-10-06", + "openWeights": false, + "releaseDate": "2025-10-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5-pro", + "modelKey": "openai/gpt-5-pro", + "displayName": "GPT-5 pro", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-10-06", + "openWeights": false, + "releaseDate": "2025-08-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5-pro", + "mode": "responses", + "metadata": { + "source": "https://learn.microsoft.com/en-us/azure/ai-foundry/foundry-models/concepts/models-sold-directly-by-azure?pivots=azure-openai&tabs=global-standard-aoai%2Cstandard-chat-completions%2Cglobal-standard#gpt-5", + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5-pro", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5-pro", + "displayName": "OpenAI: GPT-5 Pro", + "metadata": { + "canonicalSlug": "openai/gpt-5-pro-2025-10-06", + "createdAt": "2025-10-06T18:51:03.000Z", + "knowledgeCutoff": "2024-09-30", + "links": { + "details": "/api/v1/models/openai/gpt-5-pro-2025-10-06/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "high" + ], + "default_effort": "high" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5-pro-2025-10-06", + "provider": "openai", + "model": "gpt-5-pro-2025-10-06", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-5-pro-2025-10-06" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 272000, + "outputTokens": 272000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": false, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5-pro-2025-10-06", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 15, + "output": 120 + }, + "extra": { + "input_cost_per_token_batches": 0.0000075, + "output_cost_per_token_batches": 0.00006 + } + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5-pro-2025-10-06", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5-search-api", + "provider": "openai", + "model": "gpt-5-search-api", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-5-search-api" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 272000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "minimalReasoningEffort": true, + "moderation": false, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5-search-api", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5-search-api", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-5-search-api-2025-10-14", + "provider": "openai", + "model": "gpt-5-search-api-2025-10-14", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-5-search-api-2025-10-14" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 272000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5-search-api-2025-10-14", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5-search-api-2025-10-14", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-5-thinking", + "provider": "openai", + "model": "gpt-5-thinking", + "displayName": "gpt-5-thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai" + ], + "aliases": [ + "302ai/gpt-5-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-5-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gpt-5-thinking" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-08-08", + "lastUpdated": "2025-08-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-5-thinking", + "modelKey": "gpt-5-thinking", + "displayName": "gpt-5-thinking", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-08-08", + "openWeights": false, + "releaseDate": "2025-08-08" + } + } + ] + }, + { + "id": "openai/gpt-5.1", + "provider": "openai", + "model": "gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "abacus", + "aihubmix", + "anyapi", + "azure", + "azure-cognitive-services", + "cloudflare-ai-gateway", + "github_copilot", + "gmi", + "helicone", + "jiekou", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "openai", + "opencode", + "openrouter", + "orcarouter", + "perplexity-agent", + "poe", + "requesty", + "zenmux" + ], + "aliases": [ + "302ai/gpt-5.1", + "abacus/gpt-5.1", + "aihubmix/gpt-5.1", + "anyapi/openai/gpt-5.1", + "azure-cognitive-services/gpt-5.1", + "azure/eu/gpt-5.1", + "azure/global/gpt-5.1", + "azure/gpt-5.1", + "azure/us/gpt-5.1", + "cloudflare-ai-gateway/openai/gpt-5.1", + "github_copilot/gpt-5.1", + "gmi/openai/gpt-5.1", + "helicone/gpt-5.1", + "jiekou/gpt-5.1", + "kilo/openai/gpt-5.1", + "llmgateway/gpt-5.1", + "merge-gateway/openai/gpt-5.1", + "nano-gpt/openai/gpt-5.1", + "nearai/openai/gpt-5.1", + "openai/gpt-5.1", + "opencode/gpt-5.1", + "openrouter/openai/gpt-5.1", + "orcarouter/openai/gpt-5.1", + "perplexity-agent/openai/gpt-5.1", + "poe/openai/gpt-5.1", + "requesty/openai/gpt-5.1", + "zenmux/openai/gpt-5.1" + ], + "mergedProviderModelRecords": 27, + "limits": { + "contextTokens": 409600, + "inputTokens": 409600, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text" + ], + "output": [ + "audio", + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "aihubmix", + "model": "gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "openai/gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12500000000000003, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.125, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "openai/gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.107, + "input": 1.07, + "output": 8.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "openai/gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 1.1, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/eu/gpt-5.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.14, + "input": 1.38, + "output": 11 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/global/gpt-5.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/gpt-5.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.14, + "input": 1.38, + "output": 11 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-5.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "gmi", + "model": "gmi/openai/gpt-5.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "extra": { + "cache_read_input_token_cost_priority": 2.5e-7, + "input_cost_per_token_priority": 0.0000025, + "output_cost_per_token_priority": 0.00002 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.13, + "input": 1.25, + "output": 10 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5.1", + "GPT-5.1", + "OpenAI GPT-5.1", + "OpenAI: GPT-5.1", + "gpt-5.1" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2025-11-14", + "lastUpdated": "2025-11-14", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 27 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-5.1", + "modelKey": "gpt-5.1", + "displayName": "gpt-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-5.1", + "modelKey": "gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "gpt-5.1", + "modelKey": "gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "openai/gpt-5.1", + "modelKey": "openai/gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.1", + "modelKey": "gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.1", + "modelKey": "gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "openai/gpt-5.1", + "modelKey": "openai/gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-5.1", + "modelKey": "gpt-5.1", + "displayName": "OpenAI GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gpt-5.1", + "modelKey": "gpt-5.1", + "displayName": "gpt-5.1", + "family": "gpt", + "metadata": { + "lastUpdated": "2026-02", + "openWeights": false, + "releaseDate": "2026-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.1", + "modelKey": "openai/gpt-5.1", + "displayName": "OpenAI: GPT-5.1", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5.1", + "modelKey": "gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-5.1", + "modelKey": "openai/gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5.1", + "modelKey": "openai/gpt-5.1", + "displayName": "GPT 5.1", + "family": "gpt", + "metadata": { + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "openai/gpt-5.1", + "modelKey": "openai/gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.1", + "modelKey": "gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gpt-5.1", + "modelKey": "gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.1", + "modelKey": "openai/gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5.1", + "modelKey": "openai/gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "openai/gpt-5.1", + "modelKey": "openai/gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.1", + "modelKey": "openai/gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "lastUpdated": "2025-11-12", + "openWeights": false, + "releaseDate": "2025-11-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5.1", + "modelKey": "openai/gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5.1", + "modelKey": "openai/gpt-5.1", + "displayName": "GPT-5.1", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/eu/gpt-5.1", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/global/gpt-5.1", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.1", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/gpt-5.1", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-5.1", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gmi", + "model": "gmi/openai/gpt-5.1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.1", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.1", + "displayName": "OpenAI: GPT-5.1", + "metadata": { + "canonicalSlug": "openai/gpt-5.1-20251113", + "createdAt": "2025-11-13T18:58:25.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-5.1-20251113/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true, + "supported_efforts": [ + "high", + "medium", + "low", + "none" + ], + "default_effort": "none" + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openai/gpt-5.1-2025-11-13", + "provider": "openai", + "model": "gpt-5.1-2025-11-13", + "displayName": "GPT-5.1 (2025-11-13)", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "nano-gpt", + "openai" + ], + "aliases": [ + "azure/gpt-5.1-2025-11-13", + "nano-gpt/openai/gpt-5.1-2025-11-13", + "openai/gpt-5.1-2025-11-13" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": true, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": true, + "attachments": false, + "openWeights": false, + "structuredOutput": false, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5.1-2025-11-13", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.1-2025-11-13", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "extra": { + "cache_read_input_token_cost_priority": 2.5e-7, + "input_cost_per_token_priority": 0.0000025, + "output_cost_per_token_priority": 0.00002 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.1-2025-11-13", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "extra": { + "cache_read_input_token_cost_priority": 2.5e-7, + "input_cost_per_token_priority": 0.0000025, + "output_cost_per_token_priority": 0.00002 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.1 (2025-11-13)" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-11-13", + "lastUpdated": "2025-11-13", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5.1-2025-11-13", + "modelKey": "openai/gpt-5.1-2025-11-13", + "displayName": "GPT-5.1 (2025-11-13)", + "family": "gpt", + "metadata": { + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.1-2025-11-13", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.1-2025-11-13", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5.1-chat", + "provider": "openai", + "model": "gpt-5.1-chat", + "displayName": "GPT-5.1 Chat", + "family": "gpt-codex", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "kilo", + "openrouter", + "requesty", + "zenmux" + ], + "aliases": [ + "azure-cognitive-services/gpt-5.1-chat", + "azure/eu/gpt-5.1-chat", + "azure/global/gpt-5.1-chat", + "azure/gpt-5.1-chat", + "azure/us/gpt-5.1-chat", + "kilo/openai/gpt-5.1-chat", + "openrouter/openai/gpt-5.1-chat", + "requesty/openai/gpt-5.1-chat", + "zenmux/openai/gpt-5.1-chat" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text" + ], + "output": [ + "audio", + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5.1-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5.1-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.1-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.1-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5.1-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5.1-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/eu/gpt-5.1-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.14, + "input": 1.38, + "output": 11 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/global/gpt-5.1-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.1-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/gpt-5.1-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.14, + "input": 1.38, + "output": 11 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.1-chat", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.13, + "input": 1.25, + "output": 10 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.1 Chat", + "OpenAI: GPT-5.1 Chat" + ], + "families": [ + "gpt-codex" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2025-11-14", + "lastUpdated": "2025-11-14", + "supportedParameters": [ + "max_completion_tokens", + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.1-chat", + "modelKey": "gpt-5.1-chat", + "displayName": "GPT-5.1 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.1-chat", + "modelKey": "gpt-5.1-chat", + "displayName": "GPT-5.1 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.1-chat", + "modelKey": "openai/gpt-5.1-chat", + "displayName": "OpenAI: GPT-5.1 Chat", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.1-chat", + "modelKey": "openai/gpt-5.1-chat", + "displayName": "GPT-5.1 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5.1-chat", + "modelKey": "openai/gpt-5.1-chat", + "displayName": "GPT-5.1 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5.1-chat", + "modelKey": "openai/gpt-5.1-chat", + "displayName": "GPT-5.1 Chat", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/eu/gpt-5.1-chat", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/global/gpt-5.1-chat", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.1-chat", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/gpt-5.1-chat", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.1-chat", + "displayName": "OpenAI: GPT-5.1 Chat", + "metadata": { + "canonicalSlug": "openai/gpt-5.1-chat-20251113", + "createdAt": "2025-11-13T18:58:22.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-5.1-chat-20251113/endpoints" + }, + "supportedParameters": [ + "max_completion_tokens", + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 32000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openai/gpt-5.1-chat-2025-11-13", + "provider": "openai", + "model": "gpt-5.1-chat-2025-11-13", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/gpt-5.1-chat-2025-11-13" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": true, + "parallelFunctionCalling": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.1-chat-2025-11-13", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "extra": { + "cache_read_input_token_cost_priority": 2.5e-7, + "input_cost_per_token_priority": 0.0000025, + "output_cost_per_token_priority": 0.00002 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.1-chat-2025-11-13", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5.1-chat-latest", + "provider": "openai", + "model": "gpt-5.1-chat-latest", + "displayName": "GPT-5.1 Chat", + "family": "gpt-codex", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "abacus", + "helicone", + "merge-gateway", + "openai", + "orcarouter" + ], + "aliases": [ + "302ai/gpt-5.1-chat-latest", + "abacus/gpt-5.1-chat-latest", + "helicone/gpt-5.1-chat-latest", + "merge-gateway/openai/gpt-5.1-chat-latest", + "openai/gpt-5.1-chat-latest", + "orcarouter/openai/gpt-5.1-chat-latest" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 400000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": true, + "parallelFunctionCalling": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": false, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-5.1-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-5.1-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-5.1-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12500000000000003, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-5.1-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.1-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5.1-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.1-chat-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "extra": { + "cache_read_input_token_cost_priority": 2.5e-7, + "input_cost_per_token_priority": 0.0000025, + "output_cost_per_token_priority": 0.00002 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.1 Chat", + "GPT-5.1 Chat Latest", + "OpenAI GPT-5.1 Chat", + "gpt-5.1-chat-latest" + ], + "families": [ + "gpt", + "gpt-codex" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2025-11-14", + "lastUpdated": "2025-11-14", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-5.1-chat-latest", + "modelKey": "gpt-5.1-chat-latest", + "displayName": "gpt-5.1-chat-latest", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-5.1-chat-latest", + "modelKey": "gpt-5.1-chat-latest", + "displayName": "GPT-5.1 Chat Latest", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-5.1-chat-latest", + "modelKey": "gpt-5.1-chat-latest", + "displayName": "OpenAI GPT-5.1 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-5.1-chat-latest", + "modelKey": "openai/gpt-5.1-chat-latest", + "displayName": "GPT-5.1 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.1-chat-latest", + "modelKey": "gpt-5.1-chat-latest", + "displayName": "GPT-5.1 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5.1-chat-latest", + "modelKey": "openai/gpt-5.1-chat-latest", + "displayName": "GPT-5.1 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.1-chat-latest", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5.1-codex", + "provider": "openai", + "model": "gpt-5.1-codex", + "displayName": "GPT-5.1 Codex", + "family": "gpt-codex", + "mode": "responses", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "aihubmix", + "azure", + "azure-cognitive-services", + "cloudflare-ai-gateway", + "helicone", + "jiekou", + "kilo", + "llmgateway", + "nano-gpt", + "openai", + "opencode", + "openrouter", + "orcarouter", + "poe", + "requesty", + "vercel", + "vivgrid", + "zenmux" + ], + "aliases": [ + "abacus/gpt-5.1-codex", + "aihubmix/gpt-5.1-codex", + "azure-cognitive-services/gpt-5.1-codex", + "azure/eu/gpt-5.1-codex", + "azure/global/gpt-5.1-codex", + "azure/gpt-5.1-codex", + "azure/us/gpt-5.1-codex", + "cloudflare-ai-gateway/openai/gpt-5.1-codex", + "helicone/gpt-5.1-codex", + "jiekou/gpt-5.1-codex", + "kilo/openai/gpt-5.1-codex", + "llmgateway/gpt-5.1-codex", + "nano-gpt/openai/gpt-5.1-codex", + "openai/gpt-5.1-codex", + "opencode/gpt-5.1-codex", + "openrouter/openai/gpt-5.1-codex", + "orcarouter/openai/gpt-5.1-codex", + "poe/openai/gpt-5.1-codex", + "requesty/openai/gpt-5.1-codex", + "vercel/openai/gpt-5.1-codex", + "vivgrid/gpt-5.1-codex", + "zenmux/openai/gpt-5.1-codex" + ], + "mergedProviderModelRecords": 22, + "limits": { + "contextTokens": 400000, + "inputTokens": 400000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text" + ], + "output": [ + "audio", + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": true, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "aihubmix", + "model": "gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "openai/gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12500000000000003, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.125, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.107, + "input": 1.07, + "output": 8.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.13, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 1.1, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "vivgrid", + "model": "gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5.1-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/eu/gpt-5.1-codex", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.14, + "input": 1.38, + "output": 11 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/global/gpt-5.1-codex", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.1-codex", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/gpt-5.1-codex", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.14, + "input": 1.38, + "output": 11 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.1-codex", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "extra": { + "cache_read_input_token_cost_priority": 2.5e-7, + "input_cost_per_token_priority": 0.0000025, + "output_cost_per_token_priority": 0.00002 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.1-codex", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.13, + "input": 1.25, + "output": 10 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5.1 Codex", + "GPT-5.1 Codex", + "GPT-5.1-Codex", + "OpenAI: GPT-5.1 Codex", + "OpenAI: GPT-5.1-Codex", + "gpt-5.1-codex" + ], + "families": [ + "gpt", + "gpt-codex" + ], + "modes": [ + "responses" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2025-11-13", + "lastUpdated": "2025-11-13", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/responses" + ], + "providerModelRecordCount": 22 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-5.1-codex", + "modelKey": "gpt-5.1-codex", + "displayName": "GPT-5.1 Codex", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "gpt-5.1-codex", + "modelKey": "gpt-5.1-codex", + "displayName": "GPT-5.1 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.1-codex", + "modelKey": "gpt-5.1-codex", + "displayName": "GPT-5.1 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.1-codex", + "modelKey": "gpt-5.1-codex", + "displayName": "GPT-5.1 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "openai/gpt-5.1-codex", + "modelKey": "openai/gpt-5.1-codex", + "displayName": "GPT-5.1 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-5.1-codex", + "modelKey": "gpt-5.1-codex", + "displayName": "OpenAI: GPT-5.1 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gpt-5.1-codex", + "modelKey": "gpt-5.1-codex", + "displayName": "gpt-5.1-codex", + "family": "gpt-codex", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.1-codex", + "modelKey": "openai/gpt-5.1-codex", + "displayName": "OpenAI: GPT-5.1-Codex", + "metadata": { + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5.1-codex", + "modelKey": "gpt-5.1-codex", + "displayName": "GPT-5.1 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5.1-codex", + "modelKey": "openai/gpt-5.1-codex", + "displayName": "GPT 5.1 Codex", + "family": "gpt-codex", + "metadata": { + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.1-codex", + "modelKey": "gpt-5.1-codex", + "displayName": "GPT-5.1 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gpt-5.1-codex", + "modelKey": "gpt-5.1-codex", + "displayName": "GPT-5.1 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.1-codex", + "modelKey": "openai/gpt-5.1-codex", + "displayName": "GPT-5.1 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5.1-codex", + "modelKey": "openai/gpt-5.1-codex", + "displayName": "GPT-5.1 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.1-codex", + "modelKey": "openai/gpt-5.1-codex", + "displayName": "GPT-5.1-Codex", + "family": "gpt-codex", + "metadata": { + "lastUpdated": "2025-11-12", + "openWeights": false, + "releaseDate": "2025-11-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5.1-codex", + "modelKey": "openai/gpt-5.1-codex", + "displayName": "GPT-5.1-Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5.1-codex", + "modelKey": "openai/gpt-5.1-codex", + "displayName": "GPT-5.1-Codex", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-12", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vivgrid", + "providerName": "Vivgrid", + "providerApi": "https://api.vivgrid.com/v1", + "providerDoc": "https://docs.vivgrid.com/models", + "model": "gpt-5.1-codex", + "modelKey": "gpt-5.1-codex", + "displayName": "GPT-5.1 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5.1-codex", + "modelKey": "openai/gpt-5.1-codex", + "displayName": "GPT-5.1-Codex", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/eu/gpt-5.1-codex", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/global/gpt-5.1-codex", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.1-codex", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/gpt-5.1-codex", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.1-codex", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.1-codex", + "displayName": "OpenAI: GPT-5.1-Codex", + "metadata": { + "canonicalSlug": "openai/gpt-5.1-codex-20251113", + "createdAt": "2025-11-13T18:58:18.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-5.1-codex-20251113/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "high", + "medium", + "low" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openai/gpt-5.1-codex-2025-11-13", + "provider": "openai", + "model": "gpt-5.1-codex-2025-11-13", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/gpt-5.1-codex-2025-11-13" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 272000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.1-codex-2025-11-13", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "extra": { + "cache_read_input_token_cost_priority": 2.5e-7, + "input_cost_per_token_priority": 0.0000025, + "output_cost_per_token_priority": 0.00002 + } + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "supportedEndpoints": [ + "/v1/responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.1-codex-2025-11-13", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5.1-codex-max", + "provider": "openai", + "model": "gpt-5.1-codex-max", + "displayName": "GPT-5.1 Codex Max", + "family": "gpt-codex", + "mode": "responses", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "azure", + "chatgpt", + "github_copilot", + "jiekou", + "kilo", + "nano-gpt", + "openai", + "opencode", + "openrouter", + "orcarouter", + "poe", + "requesty", + "vercel", + "vivgrid" + ], + "aliases": [ + "abacus/gpt-5.1-codex-max", + "azure/gpt-5.1-codex-max", + "chatgpt/gpt-5.1-codex-max", + "github_copilot/gpt-5.1-codex-max", + "jiekou/gpt-5.1-codex-max", + "kilo/openai/gpt-5.1-codex-max", + "nano-gpt/openai/gpt-5.1-codex-max", + "openai/gpt-5.1-codex-max", + "opencode/gpt-5.1-codex-max", + "openrouter/openai/gpt-5.1-codex-max", + "orcarouter/openai/gpt-5.1-codex-max", + "poe/openai/gpt-5.1-codex-max", + "requesty/openai/gpt-5.1-codex-max", + "vercel/openai/gpt-5.1-codex-max", + "vivgrid/gpt-5.1-codex-max" + ], + "mergedProviderModelRecords": 15, + "limits": { + "contextTokens": 400000, + "inputTokens": 400000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-5.1-codex-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5.1-codex-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "gpt-5.1-codex-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.125, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.1-codex-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5.1-codex-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 20 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.1-codex-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gpt-5.1-codex-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.1-codex-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5.1-codex-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.1-codex-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 1.1, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5.1-codex-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 1.1, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5.1-codex-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "vivgrid", + "model": "gpt-5.1-codex-max", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.1-codex-max", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.1-codex-max", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-5.1-codex-max", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.1-codex-max", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5.1-codex-max", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.1-codex-max", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5.1 Codex Max", + "GPT-5.1 Codex Max", + "GPT-5.1-Codex-Max", + "OpenAI: GPT-5.1-Codex-Max", + "gpt-5.1-codex-max" + ], + "families": [ + "gpt", + "gpt-codex" + ], + "modes": [ + "chat", + "responses" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2025-11-13", + "lastUpdated": "2025-11-13", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/responses" + ], + "providerModelRecordCount": 15 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-5.1-codex-max", + "modelKey": "gpt-5.1-codex-max", + "displayName": "GPT-5.1 Codex Max", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.1-codex-max", + "modelKey": "gpt-5.1-codex-max", + "displayName": "GPT-5.1 Codex Max", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gpt-5.1-codex-max", + "modelKey": "gpt-5.1-codex-max", + "displayName": "gpt-5.1-codex-max", + "family": "gpt-codex", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.1-codex-max", + "modelKey": "openai/gpt-5.1-codex-max", + "displayName": "OpenAI: GPT-5.1-Codex-Max", + "metadata": { + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5.1-codex-max", + "modelKey": "openai/gpt-5.1-codex-max", + "displayName": "GPT 5.1 Codex Max", + "family": "gpt-codex", + "metadata": { + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.1-codex-max", + "modelKey": "gpt-5.1-codex-max", + "displayName": "GPT-5.1 Codex Max", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gpt-5.1-codex-max", + "modelKey": "gpt-5.1-codex-max", + "displayName": "GPT-5.1 Codex Max", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.1-codex-max", + "modelKey": "openai/gpt-5.1-codex-max", + "displayName": "GPT-5.1 Codex Max", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5.1-codex-max", + "modelKey": "openai/gpt-5.1-codex-max", + "displayName": "GPT-5.1 Codex Max", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.1-codex-max", + "modelKey": "openai/gpt-5.1-codex-max", + "displayName": "GPT-5.1-Codex-Max", + "metadata": { + "lastUpdated": "2025-12-08", + "openWeights": false, + "releaseDate": "2025-12-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5.1-codex-max", + "modelKey": "openai/gpt-5.1-codex-max", + "displayName": "GPT-5.1-Codex-Max", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5.1-codex-max", + "modelKey": "openai/gpt-5.1-codex-max", + "displayName": "GPT 5.1 Codex Max", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vivgrid", + "providerName": "Vivgrid", + "providerApi": "https://api.vivgrid.com/v1", + "providerDoc": "https://docs.vivgrid.com/models", + "model": "gpt-5.1-codex-max", + "modelKey": "gpt-5.1-codex-max", + "displayName": "GPT-5.1 Codex Max", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.1-codex-max", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.1-codex-max", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-5.1-codex-max", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.1-codex-max", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5.1-codex-max", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/openai/gpt-5.1-codex-max" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.1-codex-max", + "displayName": "OpenAI: GPT-5.1-Codex-Max", + "metadata": { + "canonicalSlug": "openai/gpt-5.1-codex-max-20251204", + "createdAt": "2025-12-04T20:08:54.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-5.1-codex-max-20251204/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "xhigh", + "high", + "medium", + "low" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5.1-codex-mini", + "provider": "openai", + "model": "gpt-5.1-codex-mini", + "displayName": "GPT-5.1 Codex mini", + "family": "gpt-codex", + "mode": "responses", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "aihubmix", + "azure", + "azure-cognitive-services", + "chatgpt", + "helicone", + "jiekou", + "kilo", + "llmgateway", + "nano-gpt", + "openai", + "opencode", + "openrouter", + "orcarouter", + "poe", + "requesty", + "vercel", + "zenmux" + ], + "aliases": [ + "aihubmix/gpt-5.1-codex-mini", + "azure-cognitive-services/gpt-5.1-codex-mini", + "azure/eu/gpt-5.1-codex-mini", + "azure/global/gpt-5.1-codex-mini", + "azure/gpt-5.1-codex-mini", + "azure/us/gpt-5.1-codex-mini", + "chatgpt/gpt-5.1-codex-mini", + "helicone/gpt-5.1-codex-mini", + "jiekou/gpt-5.1-codex-mini", + "kilo/openai/gpt-5.1-codex-mini", + "llmgateway/gpt-5.1-codex-mini", + "nano-gpt/openai/gpt-5.1-codex-mini", + "openai/gpt-5.1-codex-mini", + "opencode/gpt-5.1-codex-mini", + "openrouter/openai/gpt-5.1-codex-mini", + "orcarouter/openai/gpt-5.1-codex-mini", + "poe/openai/gpt-5.1-codex-mini", + "requesty/openai/gpt-5.1-codex-mini", + "vercel/openai/gpt-5.1-codex-mini", + "zenmux/openai/gpt-5.1-codex-mini" + ], + "mergedProviderModelRecords": 20, + "limits": { + "contextTokens": 400000, + "inputTokens": 400000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "gpt-5.1-codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5.1-codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5.1-codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-5.1-codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.024999999999999998, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "gpt-5.1-codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.225, + "output": 1.8 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.1-codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5.1-codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5.1-codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.1-codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gpt-5.1-codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.1-codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5.1-codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.1-codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.022, + "input": 0.22, + "output": 1.8 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5.1-codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5.1-codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5.1-codex-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.25, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/eu/gpt-5.1-codex-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.275, + "output": 2.2 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/global/gpt-5.1-codex-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.1-codex-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/gpt-5.1-codex-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.028, + "input": 0.275, + "output": 2.2 + } + }, + { + "source": "litellm", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.1-codex-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.1-codex-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + }, + "extra": { + "cache_read_input_token_cost_priority": 4.5e-8, + "input_cost_per_token_priority": 4.5e-7, + "output_cost_per_token_priority": 0.0000036 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.1-codex-mini", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5.1 Codex Mini", + "GPT-5.1 Codex Mini", + "GPT-5.1 Codex mini", + "GPT-5.1-Codex-Mini", + "OpenAI: GPT-5.1 Codex Mini", + "OpenAI: GPT-5.1-Codex-Mini", + "gpt-5.1-codex-mini" + ], + "families": [ + "gpt", + "gpt-codex", + "gpt-codex-mini" + ], + "modes": [ + "responses" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2025-11-13", + "lastUpdated": "2025-11-13", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/responses" + ], + "providerModelRecordCount": 20 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "gpt-5.1-codex-mini", + "modelKey": "gpt-5.1-codex-mini", + "displayName": "GPT-5.1 Codex mini", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.1-codex-mini", + "modelKey": "gpt-5.1-codex-mini", + "displayName": "GPT-5.1 Codex Mini", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.1-codex-mini", + "modelKey": "gpt-5.1-codex-mini", + "displayName": "GPT-5.1 Codex Mini", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-14", + "openWeights": false, + "releaseDate": "2025-11-14", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-5.1-codex-mini", + "modelKey": "gpt-5.1-codex-mini", + "displayName": "OpenAI: GPT-5.1 Codex Mini", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gpt-5.1-codex-mini", + "modelKey": "gpt-5.1-codex-mini", + "displayName": "gpt-5.1-codex-mini", + "family": "gpt-codex", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.1-codex-mini", + "modelKey": "openai/gpt-5.1-codex-mini", + "displayName": "OpenAI: GPT-5.1-Codex-Mini", + "metadata": { + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5.1-codex-mini", + "modelKey": "gpt-5.1-codex-mini", + "displayName": "GPT-5.1 Codex mini", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5.1-codex-mini", + "modelKey": "openai/gpt-5.1-codex-mini", + "displayName": "GPT 5.1 Codex Mini", + "family": "gpt-codex-mini", + "metadata": { + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.1-codex-mini", + "modelKey": "gpt-5.1-codex-mini", + "displayName": "GPT-5.1 Codex mini", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gpt-5.1-codex-mini", + "modelKey": "gpt-5.1-codex-mini", + "displayName": "GPT-5.1 Codex Mini", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.1-codex-mini", + "modelKey": "openai/gpt-5.1-codex-mini", + "displayName": "GPT-5.1 Codex mini", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5.1-codex-mini", + "modelKey": "openai/gpt-5.1-codex-mini", + "displayName": "GPT-5.1 Codex mini", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.1-codex-mini", + "modelKey": "openai/gpt-5.1-codex-mini", + "displayName": "GPT-5.1-Codex-Mini", + "family": "gpt-codex", + "metadata": { + "lastUpdated": "2025-11-12", + "openWeights": false, + "releaseDate": "2025-11-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5.1-codex-mini", + "modelKey": "openai/gpt-5.1-codex-mini", + "displayName": "GPT-5.1-Codex-Mini", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5.1-codex-mini", + "modelKey": "openai/gpt-5.1-codex-mini", + "displayName": "GPT-5.1 Codex mini", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-12", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5.1-codex-mini", + "modelKey": "openai/gpt-5.1-codex-mini", + "displayName": "GPT-5.1-Codex-Mini", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/eu/gpt-5.1-codex-mini", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/global/gpt-5.1-codex-mini", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.1-codex-mini", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/gpt-5.1-codex-mini", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.1-codex-mini", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.1-codex-mini", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.1-codex-mini", + "displayName": "OpenAI: GPT-5.1-Codex-Mini", + "metadata": { + "canonicalSlug": "openai/gpt-5.1-codex-mini-20251113", + "createdAt": "2025-11-13T18:17:00.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-5.1-codex-mini-20251113/endpoints" + }, + "reasoning": { + "mandatory": false, + "supported_efforts": [ + "high", + "medium", + "low" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 100000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5.1-codex-mini-2025-11-13", + "provider": "openai", + "model": "gpt-5.1-codex-mini-2025-11-13", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/gpt-5.1-codex-mini-2025-11-13" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 272000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.1-codex-mini-2025-11-13", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 2 + }, + "extra": { + "cache_read_input_token_cost_priority": 4.5e-8, + "input_cost_per_token_priority": 4.5e-7, + "output_cost_per_token_priority": 0.0000036 + } + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "supportedEndpoints": [ + "/v1/responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.1-codex-mini-2025-11-13", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5.1-instant", + "provider": "openai", + "model": "gpt-5.1-instant", + "displayName": "GPT-5.1-Instant", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "poe", + "vercel" + ], + "aliases": [ + "poe/openai/gpt-5.1-instant", + "vercel/openai/gpt-5.1-instant" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 111616, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.1-instant", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 1.1, + "output": 9 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5.1-instant", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.1 Instant", + "GPT-5.1-Instant" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-11-12", + "lastUpdated": "2025-11-12", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.1-instant", + "modelKey": "openai/gpt-5.1-instant", + "displayName": "GPT-5.1-Instant", + "family": "gpt", + "metadata": { + "lastUpdated": "2025-11-12", + "openWeights": false, + "releaseDate": "2025-11-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5.1-instant", + "modelKey": "openai/gpt-5.1-instant", + "displayName": "GPT-5.1 Instant", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-11-12", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium" + ] + } + ] + } + } + ] + }, + { + "id": "openai/gpt-5.1-thinking", + "provider": "openai", + "model": "gpt-5.1-thinking", + "displayName": "GPT 5.1 Thinking", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/openai/gpt-5.1-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5.1-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5.1 Thinking" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-11-12", + "lastUpdated": "2025-08-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5.1-thinking", + "modelKey": "openai/gpt-5.1-thinking", + "displayName": "GPT 5.1 Thinking", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-11-12", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "openai/gpt-5.2", + "provider": "openai", + "model": "gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "abacus", + "aihubmix", + "anyapi", + "azure", + "azure-cognitive-services", + "chatgpt", + "cloudflare-ai-gateway", + "github-copilot", + "github_copilot", + "gmi", + "jiekou", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "openai", + "opencode", + "openrouter", + "orcarouter", + "perplexity-agent", + "poe", + "qihang-ai", + "qiniu-ai", + "requesty", + "vercel", + "zenmux" + ], + "aliases": [ + "302ai/gpt-5.2", + "abacus/gpt-5.2", + "aihubmix/gpt-5.2", + "anyapi/openai/gpt-5.2", + "azure-cognitive-services/gpt-5.2", + "azure/gpt-5.2", + "chatgpt/gpt-5.2", + "cloudflare-ai-gateway/openai/gpt-5.2", + "github-copilot/gpt-5.2", + "github_copilot/gpt-5.2", + "gmi/openai/gpt-5.2", + "jiekou/gpt-5.2", + "kilo/openai/gpt-5.2", + "llmgateway/gpt-5.2", + "merge-gateway/openai/gpt-5.2", + "nano-gpt/openai/gpt-5.2", + "nearai/openai/gpt-5.2", + "openai/gpt-5.2", + "opencode/gpt-5.2", + "openrouter/openai/gpt-5.2", + "orcarouter/openai/gpt-5.2", + "perplexity-agent/openai/gpt-5.2", + "poe/openai/gpt-5.2", + "qihang-ai/gpt-5.2", + "qiniu-ai/openai/gpt-5.2", + "requesty/openai/gpt-5.2", + "vercel/openai/gpt-5.2", + "zenmux/openai/gpt-5.2" + ], + "mergedProviderModelRecords": 28, + "limits": { + "contextTokens": 409600, + "inputTokens": 409600, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "aihubmix", + "model": "gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "openai/gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "github-copilot", + "model": "gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.575, + "output": 12.6 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "openai/gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.18, + "input": 1.8, + "output": 15.5 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "openai/gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 1.6, + "output": 13 + } + }, + { + "source": "models.dev", + "provider": "qihang-ai", + "model": "gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.17, + "input": 1.75, + "output": 14 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "litellm", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-5.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "gmi", + "model": "gmi/openai/gpt-5.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.75, + "output": 14 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + }, + "extra": { + "cache_read_input_token_cost_priority": 3.5e-7, + "input_cost_per_token_priority": 0.0000035, + "output_cost_per_token_priority": 0.000028 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + }, + "perImage": { + "input": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.2", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5.2", + "GPT-5.2", + "OpenAI/GPT-5.2", + "OpenAI: GPT-5.2", + "gpt-5.2" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat", + "responses" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2025-12-12", + "lastUpdated": "2025-12-12", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 28 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-5.2", + "modelKey": "gpt-5.2", + "displayName": "gpt-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-12", + "openWeights": false, + "releaseDate": "2025-12-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-5.2", + "modelKey": "gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "gpt-5.2", + "modelKey": "gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "openai/gpt-5.2", + "modelKey": "openai/gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.2", + "modelKey": "gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.2", + "modelKey": "gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "openai/gpt-5.2", + "modelKey": "openai/gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "gpt-5.2", + "modelKey": "gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gpt-5.2", + "modelKey": "gpt-5.2", + "displayName": "gpt-5.2", + "family": "gpt", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.2", + "modelKey": "openai/gpt-5.2", + "displayName": "OpenAI: GPT-5.2", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5.2", + "modelKey": "gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-5.2", + "modelKey": "openai/gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5.2", + "modelKey": "openai/gpt-5.2", + "displayName": "GPT 5.2", + "family": "gpt", + "metadata": { + "lastUpdated": "2026-01-01", + "openWeights": false, + "releaseDate": "2026-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "openai/gpt-5.2", + "modelKey": "openai/gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.2", + "modelKey": "gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gpt-5.2", + "modelKey": "gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.2", + "modelKey": "openai/gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5.2", + "modelKey": "openai/gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "openai/gpt-5.2", + "modelKey": "openai/gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.2", + "modelKey": "openai/gpt-5.2", + "displayName": "GPT-5.2", + "metadata": { + "lastUpdated": "2025-12-08", + "openWeights": false, + "releaseDate": "2025-12-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qihang-ai", + "providerName": "QiHang", + "providerApi": "https://api.qhaigc.net/v1", + "providerDoc": "https://www.qhaigc.net/docs", + "model": "gpt-5.2", + "modelKey": "gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "openai/gpt-5.2", + "modelKey": "openai/gpt-5.2", + "displayName": "OpenAI/GPT-5.2", + "metadata": { + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5.2", + "modelKey": "openai/gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5.2", + "modelKey": "openai/gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5.2", + "modelKey": "openai/gpt-5.2", + "displayName": "GPT-5.2", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.2", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.2", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-5.2", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gmi", + "model": "gmi/openai/gpt-5.2", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.2", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5.2", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.2", + "displayName": "OpenAI: GPT-5.2", + "metadata": { + "canonicalSlug": "openai/gpt-5.2-20251211", + "createdAt": "2025-12-10T18:02:55.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-5.2-20251211/endpoints" + }, + "reasoning": { + "mandatory": false, + "supported_efforts": [ + "xhigh", + "high", + "medium", + "low", + "none" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5.2-2025-12-11", + "provider": "openai", + "model": "gpt-5.2-2025-12-11", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-5.2-2025-12-11", + "openai/gpt-5.2-2025-12-11" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 272000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": true, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.2-2025-12-11", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + }, + "extra": { + "cache_read_input_token_cost_priority": 3.5e-7, + "input_cost_per_token_priority": 0.0000035, + "output_cost_per_token_priority": 0.000028 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.2-2025-12-11", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + }, + "extra": { + "cache_read_input_token_cost_priority": 3.5e-7, + "input_cost_per_token_priority": 0.0000035, + "output_cost_per_token_priority": 0.000028 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.2-2025-12-11", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.2-2025-12-11", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5.2-chat", + "provider": "openai", + "model": "gpt-5.2-chat", + "displayName": "GPT-5.2 Chat", + "family": "gpt-codex", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "kilo", + "openrouter", + "requesty", + "vercel" + ], + "aliases": [ + "azure-cognitive-services/gpt-5.2-chat", + "azure/gpt-5.2-chat", + "kilo/openai/gpt-5.2-chat", + "openrouter/openai/gpt-5.2-chat", + "requesty/openai/gpt-5.2-chat", + "vercel/openai/gpt-5.2-chat" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5.2-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5.2-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.2-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.2-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5.2-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5.2-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.2-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + }, + "extra": { + "cache_read_input_token_cost_priority": 3.5e-7, + "input_cost_per_token_priority": 0.0000035, + "output_cost_per_token_priority": 0.000028 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5.2-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + }, + "perImage": { + "input": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.2-chat", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.2 Chat", + "OpenAI: GPT-5.2 Chat" + ], + "families": [ + "gpt", + "gpt-codex" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2025-12-11", + "lastUpdated": "2025-12-11", + "supportedParameters": [ + "max_completion_tokens", + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.2-chat", + "modelKey": "gpt-5.2-chat", + "displayName": "GPT-5.2 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.2-chat", + "modelKey": "gpt-5.2-chat", + "displayName": "GPT-5.2 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.2-chat", + "modelKey": "openai/gpt-5.2-chat", + "displayName": "OpenAI: GPT-5.2 Chat", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.2-chat", + "modelKey": "openai/gpt-5.2-chat", + "displayName": "GPT-5.2 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-10", + "openWeights": false, + "releaseDate": "2025-12-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5.2-chat", + "modelKey": "openai/gpt-5.2-chat", + "displayName": "GPT-5.2 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5.2-chat", + "modelKey": "openai/gpt-5.2-chat", + "displayName": "GPT-5.2 Chat", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.2-chat", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5.2-chat", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.2-chat", + "displayName": "OpenAI: GPT-5.2 Chat", + "metadata": { + "canonicalSlug": "openai/gpt-5.2-chat-20251211", + "createdAt": "2025-12-10T18:03:03.000Z", + "expirationDate": "2026-08-10", + "links": { + "details": "/api/v1/models/openai/gpt-5.2-chat-20251211/endpoints" + }, + "supportedParameters": [ + "max_completion_tokens", + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5.2-chat-2025-12-11", + "provider": "openai", + "model": "gpt-5.2-chat-2025-12-11", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/gpt-5.2-chat-2025-12-11" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.2-chat-2025-12-11", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + }, + "extra": { + "cache_read_input_token_cost_priority": 3.5e-7, + "input_cost_per_token_priority": 0.0000035, + "output_cost_per_token_priority": 0.000028 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.2-chat-2025-12-11", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5.2-chat-latest", + "provider": "openai", + "model": "gpt-5.2-chat-latest", + "displayName": "GPT-5.2 Chat", + "family": "gpt-codex", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "abacus", + "llmgateway", + "merge-gateway", + "openai", + "orcarouter" + ], + "aliases": [ + "302ai/gpt-5.2-chat-latest", + "abacus/gpt-5.2-chat-latest", + "llmgateway/gpt-5.2-chat-latest", + "merge-gateway/openai/gpt-5.2-chat-latest", + "openai/gpt-5.2-chat-latest", + "orcarouter/openai/gpt-5.2-chat-latest" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 400000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-5.2-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-5.2-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5.2-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-5.2-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.2-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5.2-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.2-chat-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + }, + "extra": { + "cache_read_input_token_cost_priority": 3.5e-7, + "input_cost_per_token_priority": 0.0000035, + "output_cost_per_token_priority": 0.000028 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.2 Chat", + "GPT-5.2 Chat Latest", + "gpt-5.2-chat-latest" + ], + "families": [ + "gpt", + "gpt-codex" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2025-12-12", + "lastUpdated": "2025-12-12", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-5.2-chat-latest", + "modelKey": "gpt-5.2-chat-latest", + "displayName": "gpt-5.2-chat-latest", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-12", + "openWeights": false, + "releaseDate": "2025-12-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-5.2-chat-latest", + "modelKey": "gpt-5.2-chat-latest", + "displayName": "GPT-5.2 Chat Latest", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2026-01-01", + "openWeights": false, + "releaseDate": "2026-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5.2-chat-latest", + "modelKey": "gpt-5.2-chat-latest", + "displayName": "GPT-5.2 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-5.2-chat-latest", + "modelKey": "openai/gpt-5.2-chat-latest", + "displayName": "GPT-5.2 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.2-chat-latest", + "modelKey": "gpt-5.2-chat-latest", + "displayName": "GPT-5.2 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5.2-chat-latest", + "modelKey": "openai/gpt-5.2-chat-latest", + "displayName": "GPT-5.2 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.2-chat-latest", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5.2-codex", + "provider": "openai", + "model": "gpt-5.2-codex", + "displayName": "GPT-5.2 Codex", + "family": "gpt-codex", + "mode": "responses", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "aihubmix", + "azure", + "azure-cognitive-services", + "chatgpt", + "cloudflare-ai-gateway", + "github-copilot", + "jiekou", + "kilo", + "llmgateway", + "nano-gpt", + "openai", + "opencode", + "openrouter", + "orcarouter", + "poe", + "qihang-ai", + "requesty", + "vercel", + "vivgrid", + "zenmux" + ], + "aliases": [ + "abacus/gpt-5.2-codex", + "aihubmix/gpt-5.2-codex", + "azure-cognitive-services/gpt-5.2-codex", + "azure/gpt-5.2-codex", + "chatgpt/gpt-5.2-codex", + "cloudflare-ai-gateway/openai/gpt-5.2-codex", + "github-copilot/gpt-5.2-codex", + "jiekou/gpt-5.2-codex", + "kilo/openai/gpt-5.2-codex", + "llmgateway/gpt-5.2-codex", + "nano-gpt/openai/gpt-5.2-codex", + "openai/gpt-5.2-codex", + "opencode/gpt-5.2-codex", + "openrouter/openai/gpt-5.2-codex", + "orcarouter/openai/gpt-5.2-codex", + "poe/openai/gpt-5.2-codex", + "qihang-ai/gpt-5.2-codex", + "requesty/openai/gpt-5.2-codex", + "vercel/openai/gpt-5.2-codex", + "vivgrid/gpt-5.2-codex", + "zenmux/openai/gpt-5.2-codex" + ], + "mergedProviderModelRecords": 21, + "limits": { + "contextTokens": 400000, + "inputTokens": 400000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "aihubmix", + "model": "gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "openai/gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "github-copilot", + "model": "gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 1.6, + "output": 13 + } + }, + { + "source": "models.dev", + "provider": "qihang-ai", + "model": "gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 1.14 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "vivgrid", + "model": "gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5.2-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.17, + "input": 1.75, + "output": 14 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.2-codex", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "litellm", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.2-codex", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.2-codex", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + }, + "extra": { + "cache_read_input_token_cost_priority": 3.5e-7, + "input_cost_per_token_priority": 0.0000035, + "output_cost_per_token_priority": 0.000028 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5.2-codex", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.2-codex", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5.2 Codex", + "GPT-5.2 Codex", + "GPT-5.2-Codex", + "OpenAI: GPT-5.2-Codex", + "gpt-5.2-codex" + ], + "families": [ + "gpt", + "gpt-codex" + ], + "modes": [ + "chat", + "responses" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2025-12-11", + "lastUpdated": "2025-12-11", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/responses" + ], + "providerModelRecordCount": 21 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-5.2-codex", + "modelKey": "gpt-5.2-codex", + "displayName": "GPT-5.2 Codex", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "gpt-5.2-codex", + "modelKey": "gpt-5.2-codex", + "displayName": "GPT-5.2 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.2-codex", + "modelKey": "gpt-5.2-codex", + "displayName": "GPT-5.2 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-01-14", + "openWeights": false, + "releaseDate": "2026-01-14", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.2-codex", + "modelKey": "gpt-5.2-codex", + "displayName": "GPT-5.2 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-01-14", + "openWeights": false, + "releaseDate": "2026-01-14", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "openai/gpt-5.2-codex", + "modelKey": "openai/gpt-5.2-codex", + "displayName": "GPT-5.2 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "gpt-5.2-codex", + "modelKey": "gpt-5.2-codex", + "displayName": "GPT-5.2 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gpt-5.2-codex", + "modelKey": "gpt-5.2-codex", + "displayName": "gpt-5.2-codex", + "family": "gpt-codex", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.2-codex", + "modelKey": "openai/gpt-5.2-codex", + "displayName": "OpenAI: GPT-5.2-Codex", + "metadata": { + "lastUpdated": "2026-01-14", + "openWeights": false, + "releaseDate": "2026-01-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5.2-codex", + "modelKey": "gpt-5.2-codex", + "displayName": "GPT-5.2 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5.2-codex", + "modelKey": "openai/gpt-5.2-codex", + "displayName": "GPT 5.2 Codex", + "family": "gpt-codex", + "metadata": { + "lastUpdated": "2026-01-14", + "openWeights": false, + "releaseDate": "2026-01-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.2-codex", + "modelKey": "gpt-5.2-codex", + "displayName": "GPT-5.2 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gpt-5.2-codex", + "modelKey": "gpt-5.2-codex", + "displayName": "GPT-5.2 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-01-14", + "openWeights": false, + "releaseDate": "2026-01-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.2-codex", + "modelKey": "openai/gpt-5.2-codex", + "displayName": "GPT-5.2 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5.2-codex", + "modelKey": "openai/gpt-5.2-codex", + "displayName": "GPT-5.2 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.2-codex", + "modelKey": "openai/gpt-5.2-codex", + "displayName": "GPT-5.2-Codex", + "metadata": { + "lastUpdated": "2026-01-14", + "openWeights": false, + "releaseDate": "2026-01-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qihang-ai", + "providerName": "QiHang", + "providerApi": "https://api.qhaigc.net/v1", + "providerDoc": "https://www.qhaigc.net/docs", + "model": "gpt-5.2-codex", + "modelKey": "gpt-5.2-codex", + "displayName": "GPT-5.2 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5.2-codex", + "modelKey": "openai/gpt-5.2-codex", + "displayName": "GPT-5.2-Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-01-14", + "openWeights": false, + "releaseDate": "2026-01-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5.2-codex", + "modelKey": "openai/gpt-5.2-codex", + "displayName": "GPT-5.2-Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-18", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vivgrid", + "providerName": "Vivgrid", + "providerApi": "https://api.vivgrid.com/v1", + "providerDoc": "https://docs.vivgrid.com/models", + "model": "gpt-5.2-codex", + "modelKey": "gpt-5.2-codex", + "displayName": "GPT-5.2 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-01-14", + "openWeights": false, + "releaseDate": "2026-01-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5.2-codex", + "modelKey": "openai/gpt-5.2-codex", + "displayName": "GPT-5.2-Codex", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-01-15", + "openWeights": false, + "releaseDate": "2026-01-15", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.2-codex", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.2-codex", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.2-codex", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5.2-codex", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.2-codex", + "displayName": "OpenAI: GPT-5.2-Codex", + "metadata": { + "canonicalSlug": "openai/gpt-5.2-codex-20260114", + "createdAt": "2026-01-14T16:48:35.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-5.2-codex-20260114/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "xhigh", + "high", + "medium", + "low" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5.2-instant", + "provider": "openai", + "model": "gpt-5.2-instant", + "displayName": "GPT-5.2-Instant", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/openai/gpt-5.2-instant" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.2-instant", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 1.6, + "output": 13 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.2-Instant" + ], + "releaseDate": "2025-12-11", + "lastUpdated": "2025-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.2-instant", + "modelKey": "openai/gpt-5.2-instant", + "displayName": "GPT-5.2-Instant", + "metadata": { + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + } + ] + }, + { + "id": "openai/gpt-5.2-pro", + "provider": "openai", + "model": "gpt-5.2-pro", + "displayName": "GPT-5.2 Pro", + "family": "gpt-pro", + "mode": "responses", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "jiekou", + "kilo", + "llmgateway", + "nano-gpt", + "openai", + "openrouter", + "orcarouter", + "poe", + "requesty", + "vercel", + "zenmux" + ], + "aliases": [ + "azure/gpt-5.2-pro", + "jiekou/gpt-5.2-pro", + "kilo/openai/gpt-5.2-pro", + "llmgateway/gpt-5.2-pro", + "nano-gpt/openai/gpt-5.2-pro", + "openai/gpt-5.2-pro", + "openrouter/openai/gpt-5.2-pro", + "orcarouter/openai/gpt-5.2-pro", + "poe/openai/gpt-5.2-pro", + "requesty/openai/gpt-5.2-pro", + "vercel/openai/gpt-5.2-pro", + "zenmux/openai/gpt-5.2-pro" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 400000, + "inputTokens": 400000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "jiekou", + "model": "gpt-5.2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 18.9, + "output": 151.2 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 21, + "output": 168 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5.2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 21, + "output": 168 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5.2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 21, + "output": 168 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 21, + "output": 168 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 21, + "output": 168 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5.2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 21, + "output": 168 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 19, + "output": 150 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5.2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 21, + "output": 168 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5.2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 21, + "output": 168 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5.2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 21, + "output": 168 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.2-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 21, + "output": 168 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.2-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 21, + "output": 168 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5.2-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 21, + "output": 168 + }, + "perImage": { + "input": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.2-pro", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 21, + "output": 168 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5.2", + "GPT 5.2 Pro", + "GPT-5.2 Pro", + "GPT-5.2-Pro", + "OpenAI: GPT-5.2 Pro", + "gpt-5.2-pro" + ], + "families": [ + "gpt", + "gpt-pro" + ], + "modes": [ + "chat", + "responses" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-01", + "lastUpdated": "2026-01", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ], + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "gpt-5.2-pro", + "modelKey": "gpt-5.2-pro", + "displayName": "gpt-5.2-pro", + "family": "gpt-pro", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.2-pro", + "modelKey": "openai/gpt-5.2-pro", + "displayName": "OpenAI: GPT-5.2 Pro", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5.2-pro", + "modelKey": "gpt-5.2-pro", + "displayName": "GPT-5.2 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5.2-pro", + "modelKey": "openai/gpt-5.2-pro", + "displayName": "GPT 5.2 Pro", + "family": "gpt-pro", + "metadata": { + "lastUpdated": "2026-01-01", + "openWeights": false, + "releaseDate": "2026-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.2-pro", + "modelKey": "gpt-5.2-pro", + "displayName": "GPT-5.2 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.2-pro", + "modelKey": "openai/gpt-5.2-pro", + "displayName": "GPT-5.2 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5.2-pro", + "modelKey": "openai/gpt-5.2-pro", + "displayName": "GPT-5.2 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.2-pro", + "modelKey": "openai/gpt-5.2-pro", + "displayName": "GPT-5.2-Pro", + "metadata": { + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5.2-pro", + "modelKey": "openai/gpt-5.2-pro", + "displayName": "GPT-5.2 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5.2-pro", + "modelKey": "openai/gpt-5.2-pro", + "displayName": "GPT 5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5.2-pro", + "modelKey": "openai/gpt-5.2-pro", + "displayName": "GPT-5.2-Pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.2-pro", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.2-pro", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-5.2-pro", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.2-pro", + "displayName": "OpenAI: GPT-5.2 Pro", + "metadata": { + "canonicalSlug": "openai/gpt-5.2-pro-20251211", + "createdAt": "2025-12-10T18:03:00.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-5.2-pro-20251211/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "xhigh", + "high", + "medium" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5.2-pro-2025-12-11", + "provider": "openai", + "model": "gpt-5.2-pro-2025-12-11", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-5.2-pro-2025-12-11", + "openai/gpt-5.2-pro-2025-12-11" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 272000, + "inputTokens": 272000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.2-pro-2025-12-11", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 21, + "output": 168 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.2-pro-2025-12-11", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 21, + "output": 168 + } + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.2-pro-2025-12-11", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.2-pro-2025-12-11", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5.3-chat", + "provider": "openai", + "model": "gpt-5.3-chat", + "displayName": "GPT-5.3 Chat", + "family": "gpt-codex", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "kilo", + "openrouter", + "vercel", + "zenmux" + ], + "aliases": [ + "azure/gpt-5.3-chat", + "kilo/openai/gpt-5.3-chat", + "openrouter/openai/gpt-5.3-chat", + "vercel/openai/gpt-5.3-chat", + "zenmux/openai/gpt-5.3-chat" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5.3-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.3-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.3-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5.3-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5.3-chat", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.75, + "output": 14 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.3-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + }, + "extra": { + "cache_read_input_token_cost_priority": 3.5e-7, + "input_cost_per_token_priority": 0.0000035, + "output_cost_per_token_priority": 0.000028 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.3-chat", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.3 Chat", + "OpenAI: GPT-5.3 Chat" + ], + "families": [ + "gpt", + "gpt-codex" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-03", + "lastUpdated": "2026-03-03", + "supportedParameters": [ + "max_completion_tokens", + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.3-chat", + "modelKey": "gpt-5.3-chat", + "displayName": "GPT-5.3 Chat", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.3-chat", + "modelKey": "openai/gpt-5.3-chat", + "displayName": "OpenAI: GPT-5.3 Chat", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-03-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.3-chat", + "modelKey": "openai/gpt-5.3-chat", + "displayName": "GPT-5.3 Chat", + "family": "gpt", + "metadata": { + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5.3-chat", + "modelKey": "openai/gpt-5.3-chat", + "displayName": "GPT-5.3 Chat", + "family": "gpt", + "metadata": { + "lastUpdated": "2026-03-06", + "openWeights": false, + "releaseDate": "2026-03-03", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5.3-chat", + "modelKey": "openai/gpt-5.3-chat", + "displayName": "GPT-5.3 Chat", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-20", + "openWeights": false, + "releaseDate": "2026-03-20" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.3-chat", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.3-chat", + "displayName": "OpenAI: GPT-5.3 Chat", + "metadata": { + "canonicalSlug": "openai/gpt-5.3-chat-20260303", + "createdAt": "2026-03-03T18:54:21.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-5.3-chat-20260303/endpoints" + }, + "supportedParameters": [ + "max_completion_tokens", + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openai/gpt-5.3-chat-latest", + "provider": "openai", + "model": "gpt-5.3-chat-latest", + "displayName": "GPT-5.3 Chat (latest)", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "abacus", + "chatgpt", + "llmgateway", + "merge-gateway", + "openai", + "orcarouter" + ], + "aliases": [ + "abacus/gpt-5.3-chat-latest", + "chatgpt/gpt-5.3-chat-latest", + "llmgateway/gpt-5.3-chat-latest", + "merge-gateway/openai/gpt-5.3-chat-latest", + "openai/gpt-5.3-chat-latest", + "orcarouter/openai/gpt-5.3-chat-latest" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 400000, + "inputTokens": 128000, + "maxTokens": 64000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-5.3-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5.3-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-5.3-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.3-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5.3-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "litellm", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.3-chat-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.3-chat-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + }, + "extra": { + "cache_read_input_token_cost_priority": 3.5e-7, + "input_cost_per_token_priority": 0.0000035, + "output_cost_per_token_priority": 0.000028 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.3 Chat (latest)", + "GPT-5.3 Chat Latest" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat", + "responses" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-01", + "lastUpdated": "2026-03-01", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-5.3-chat-latest", + "modelKey": "gpt-5.3-chat-latest", + "displayName": "GPT-5.3 Chat Latest", + "family": "gpt", + "metadata": { + "lastUpdated": "2026-03-01", + "openWeights": false, + "releaseDate": "2026-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5.3-chat-latest", + "modelKey": "gpt-5.3-chat-latest", + "displayName": "GPT-5.3 Chat (latest)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-5.3-chat-latest", + "modelKey": "openai/gpt-5.3-chat-latest", + "displayName": "GPT-5.3 Chat (latest)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.3-chat-latest", + "modelKey": "gpt-5.3-chat-latest", + "displayName": "GPT-5.3 Chat (latest)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5.3-chat-latest", + "modelKey": "openai/gpt-5.3-chat-latest", + "displayName": "GPT-5.3 Chat (latest)", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.3-chat-latest", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.3-chat-latest", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5.3-codex", + "provider": "openai", + "model": "gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt-codex", + "mode": "responses", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "aihubmix", + "azure", + "azure-cognitive-services", + "chatgpt", + "cloudflare-ai-gateway", + "fastrouter", + "freemodel", + "github-copilot", + "github_copilot", + "kilo", + "llmgateway", + "nano-gpt", + "openai", + "opencode", + "openrouter", + "orcarouter", + "poe", + "requesty", + "vercel", + "vivgrid", + "zenmux" + ], + "aliases": [ + "abacus/gpt-5.3-codex", + "aihubmix/gpt-5.3-codex", + "azure-cognitive-services/gpt-5.3-codex", + "azure/gpt-5.3-codex", + "chatgpt/gpt-5.3-codex", + "cloudflare-ai-gateway/openai/gpt-5.3-codex", + "fastrouter/openai/gpt-5.3-codex", + "freemodel/gpt-5.3-codex", + "github-copilot/gpt-5.3-codex", + "github_copilot/gpt-5.3-codex", + "kilo/openai/gpt-5.3-codex", + "llmgateway/gpt-5.3-codex", + "nano-gpt/openai/gpt-5.3-codex", + "openai/gpt-5.3-codex", + "opencode/gpt-5.3-codex", + "openrouter/openai/gpt-5.3-codex", + "orcarouter/openai/gpt-5.3-codex", + "poe/openai/gpt-5.3-codex", + "requesty/openai/gpt-5.3-codex", + "vercel/openai/gpt-5.3-codex", + "vivgrid/gpt-5.3-codex", + "zenmux/openai/gpt-5.3-codex" + ], + "mergedProviderModelRecords": 22, + "limits": { + "contextTokens": 400000, + "inputTokens": 400000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "aihubmix", + "model": "gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "openai/gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "openai/gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "freemodel", + "model": "gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "cacheWrite": 1.75, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "github-copilot", + "model": "gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 1.6, + "output": 13 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "vivgrid", + "model": "gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5.3-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.75, + "output": 14 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.3-codex", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "litellm", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.3-codex", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/gpt-5.3-codex", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.3-codex", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + }, + "extra": { + "cache_read_input_token_cost_priority": 3.5e-7, + "input_cost_per_token_priority": 0.0000035, + "output_cost_per_token_priority": 0.000028 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.3-codex", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5.3 Codex", + "GPT-5.3 Codex", + "GPT-5.3-Codex", + "OpenAI: GPT-5.3-Codex" + ], + "families": [ + "gpt", + "gpt-codex" + ], + "modes": [ + "responses" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-02-05", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/responses" + ], + "providerModelRecordCount": 22 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-5.3-codex", + "modelKey": "gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "gpt-5.3-codex", + "modelKey": "gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.3-codex", + "modelKey": "gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-24", + "openWeights": false, + "releaseDate": "2026-02-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.3-codex", + "modelKey": "gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-24", + "openWeights": false, + "releaseDate": "2026-02-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "openai/gpt-5.3-codex", + "modelKey": "openai/gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "openai/gpt-5.3-codex", + "modelKey": "openai/gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "freemodel", + "providerName": "FreeModel", + "providerApi": "https://cc.freemodel.dev/v1", + "providerDoc": "https://freemodel.dev", + "model": "gpt-5.3-codex", + "modelKey": "gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "gpt-5.3-codex", + "modelKey": "gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.3-codex", + "modelKey": "openai/gpt-5.3-codex", + "displayName": "OpenAI: GPT-5.3-Codex", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-02-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5.3-codex", + "modelKey": "gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5.3-codex", + "modelKey": "openai/gpt-5.3-codex", + "displayName": "GPT 5.3 Codex", + "metadata": { + "lastUpdated": "2026-02-24", + "openWeights": false, + "releaseDate": "2026-02-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.3-codex", + "modelKey": "gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gpt-5.3-codex", + "modelKey": "gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-24", + "openWeights": false, + "releaseDate": "2026-02-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.3-codex", + "modelKey": "openai/gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5.3-codex", + "modelKey": "openai/gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.3-codex", + "modelKey": "openai/gpt-5.3-codex", + "displayName": "GPT-5.3-Codex", + "metadata": { + "lastUpdated": "2026-02-10", + "openWeights": false, + "releaseDate": "2026-02-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5.3-codex", + "modelKey": "openai/gpt-5.3-codex", + "displayName": "GPT-5.3-Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-24", + "openWeights": false, + "releaseDate": "2026-02-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5.3-codex", + "modelKey": "openai/gpt-5.3-codex", + "displayName": "GPT 5.3 Codex", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vivgrid", + "providerName": "Vivgrid", + "providerApi": "https://api.vivgrid.com/v1", + "providerDoc": "https://docs.vivgrid.com/models", + "model": "gpt-5.3-codex", + "modelKey": "gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt-codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-24", + "openWeights": false, + "releaseDate": "2026-02-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5.3-codex", + "modelKey": "openai/gpt-5.3-codex", + "displayName": "GPT-5.3 Codex", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-20", + "openWeights": false, + "releaseDate": "2026-03-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.3-codex", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.3-codex", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/gpt-5.3-codex", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.3-codex", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.3-codex", + "displayName": "OpenAI: GPT-5.3-Codex", + "metadata": { + "canonicalSlug": "openai/gpt-5.3-codex-20260224", + "createdAt": "2026-02-24T18:52:44.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-5.3-codex-20260224/endpoints" + }, + "reasoning": { + "mandatory": false, + "supported_efforts": [ + "xhigh", + "high", + "medium", + "low", + "none" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5.3-codex-spark", + "provider": "openai", + "model": "gpt-5.3-codex-spark", + "displayName": "GPT-5.3 Codex Spark", + "family": "gpt-codex-spark", + "mode": "responses", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "chatgpt", + "openai", + "opencode", + "poe" + ], + "aliases": [ + "chatgpt/gpt-5.3-codex-spark", + "openai/gpt-5.3-codex-spark", + "opencode/gpt-5.3-codex-spark", + "poe/openai/gpt-5.3-codex-spark" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.3-codex-spark", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gpt-5.3-codex-spark", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 1.75, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.3-codex-spark", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.3-codex-spark", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.3 Codex Spark", + "GPT-5.3-Codex-Spark" + ], + "families": [ + "gpt-codex-spark" + ], + "modes": [ + "responses" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-02-05", + "supportedEndpoints": [ + "/v1/responses" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.3-codex-spark", + "modelKey": "gpt-5.3-codex-spark", + "displayName": "GPT-5.3 Codex Spark", + "family": "gpt-codex-spark", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gpt-5.3-codex-spark", + "modelKey": "gpt-5.3-codex-spark", + "displayName": "GPT-5.3 Codex Spark", + "family": "gpt-codex-spark", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-12", + "openWeights": false, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.3-codex-spark", + "modelKey": "openai/gpt-5.3-codex-spark", + "displayName": "GPT-5.3-Codex-Spark", + "metadata": { + "lastUpdated": "2026-03-04", + "openWeights": false, + "releaseDate": "2026-03-04" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.3-codex-spark", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5.3-codex-xhigh", + "provider": "openai", + "model": "gpt-5.3-codex-xhigh", + "displayName": "GPT-5.3 Codex XHigh", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "abacus" + ], + "aliases": [ + "abacus/gpt-5.3-codex-xhigh" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-5.3-codex-xhigh", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.75, + "output": 14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.3 Codex XHigh" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-02-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-5.3-codex-xhigh", + "modelKey": "gpt-5.3-codex-xhigh", + "displayName": "GPT-5.3 Codex XHigh", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + } + ] + }, + { + "id": "openai/gpt-5.3-instant", + "provider": "openai", + "model": "gpt-5.3-instant", + "displayName": "GPT-5.3-Instant", + "mode": "responses", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "chatgpt", + "poe" + ], + "aliases": [ + "chatgpt/gpt-5.3-instant", + "poe/openai/gpt-5.3-instant" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 64000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.3-instant", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.16, + "input": 1.6, + "output": 13 + } + }, + { + "source": "litellm", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.3-instant", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.3-Instant" + ], + "modes": [ + "responses" + ], + "releaseDate": "2026-03-03", + "lastUpdated": "2026-03-03", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.3-instant", + "modelKey": "openai/gpt-5.3-instant", + "displayName": "GPT-5.3-Instant", + "metadata": { + "lastUpdated": "2026-03-03", + "openWeights": false, + "releaseDate": "2026-03-03" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.3-instant", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5.4", + "provider": "openai", + "model": "gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "abacus", + "aihubmix", + "anyapi", + "azure", + "azure-cognitive-services", + "azure_ai", + "chatgpt", + "cloudflare-ai-gateway", + "cortecs", + "freemodel", + "github-copilot", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "openai", + "opencode", + "openrouter", + "orcarouter", + "perplexity-agent", + "poe", + "requesty", + "sap-ai-core", + "vercel", + "vivgrid", + "zenmux" + ], + "aliases": [ + "302ai/gpt-5.4", + "abacus/gpt-5.4", + "aihubmix/gpt-5.4", + "anyapi/openai/gpt-5.4", + "azure-cognitive-services/gpt-5.4", + "azure/gpt-5.4", + "azure_ai/gpt-5.4", + "chatgpt/gpt-5.4", + "cloudflare-ai-gateway/openai/gpt-5.4", + "cortecs/gpt-5.4", + "freemodel/gpt-5.4", + "github-copilot/gpt-5.4", + "kilo/openai/gpt-5.4", + "llmgateway/gpt-5.4", + "merge-gateway/openai/gpt-5.4", + "nano-gpt/openai/gpt-5.4", + "nearai/openai/gpt-5.4", + "openai/gpt-5.4", + "opencode/gpt-5.4", + "openrouter/openai/gpt-5.4", + "orcarouter/openai/gpt-5.4", + "perplexity-agent/openai/gpt-5.4", + "poe/openai/gpt-5.4", + "requesty/openai/gpt-5.4", + "sap-ai-core/gpt-5.4", + "vercel/openai/gpt-5.4", + "vivgrid/gpt-5.4", + "zenmux/openai/gpt-5.4" + ], + "mergedProviderModelRecords": 28, + "limits": { + "contextTokens": 1050000, + "inputTokens": 1050000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "xhighReasoningEffort": true, + "supports1MContext": true, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "cacheWrite": 0, + "input": 2.5, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 5, + "output": 22.5 + }, + "tiers": [ + { + "input": 5, + "output": 22.5, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "aihubmix", + "model": "gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 5, + "output": 22.5, + "cache_read": 0.5 + }, + "tiers": [ + { + "input": 5, + "output": 22.5, + "cache_read": 0.5, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 5, + "output": 22.5, + "cache_read": 0.5 + }, + "tiers": [ + { + "input": 5, + "output": 22.5, + "cache_read": 0.5, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 5, + "output": 22.5, + "cache_read": 0.5 + }, + "tiers": [ + { + "input": 5, + "output": 22.5, + "cache_read": 0.5, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "openai/gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 3, + "output": 16.13 + } + }, + { + "source": "models.dev", + "provider": "freemodel", + "model": "gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "cacheWrite": 2.5, + "input": 2.5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "github-copilot", + "model": "gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 5, + "output": 22.5, + "cache_read": 0.5 + }, + "tiers": [ + { + "input": 5, + "output": 22.5, + "cache_read": 0.5, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 5, + "output": 22.5, + "cache_read": 0.5 + }, + "tiers": [ + { + "input": 5, + "output": 22.5, + "cache_read": 0.5, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "openai/gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 5, + "output": 22.5, + "cache_read": 0.5 + }, + "tiers": [ + { + "input": 5, + "output": 22.5, + "cache_read": 0.5, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 5, + "output": 22.5, + "cache_read": 0.5 + }, + "tiers": [ + { + "input": 5, + "output": 22.5, + "cache_read": 0.5, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 5, + "output": 22.5, + "cache_read": 0.5 + }, + "tiers": [ + { + "input": 5, + "output": 22.5, + "cache_read": 0.5, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 5, + "output": 22.5 + }, + "tiered": { + "contextOver200K": { + "input": 5, + "output": 22.5, + "cache_read": 0.5 + }, + "tiers": [ + { + "input": 5, + "output": 22.5, + "cache_read": 0.5, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "openai/gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.22, + "input": 2.2, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "tiered": { + "contextOver200K": { + "input": 5, + "output": 22.5, + "cache_read": 0.5 + }, + "tiers": [ + { + "input": 5, + "output": 22.5, + "cache_read": 0.5, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "vivgrid", + "model": "gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5.4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3.75, + "output": 18.75 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/gpt-5.4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 5e-7, + "cache_read_input_token_cost_priority": 5e-7, + "cache_read_input_token_cost_above_272k_tokens_priority": 0.000001, + "input_cost_per_token_above_272k_tokens": 0.000005, + "input_cost_per_token_priority": 0.000005, + "input_cost_per_token_above_272k_tokens_priority": 0.00001, + "output_cost_per_token_above_272k_tokens": 0.0000225, + "output_cost_per_token_priority": 0.00003, + "output_cost_per_token_above_272k_tokens_priority": 0.000045 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 5e-7, + "cache_read_input_token_cost_priority": 5e-7, + "cache_read_input_token_cost_above_272k_tokens_priority": 0.000001, + "input_cost_per_token_above_272k_tokens": 0.000005, + "input_cost_per_token_priority": 0.000005, + "input_cost_per_token_above_272k_tokens_priority": 0.00001, + "output_cost_per_token_above_272k_tokens": 0.0000225, + "output_cost_per_token_priority": 0.00003, + "output_cost_per_token_above_272k_tokens_priority": 0.000045 + } + }, + { + "source": "litellm", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 5e-7, + "cache_read_input_token_cost_flex": 1.3e-7, + "cache_read_input_token_cost_priority": 5e-7, + "input_cost_per_token_above_272k_tokens": 0.000005, + "input_cost_per_token_flex": 0.00000125, + "input_cost_per_token_batches": 0.00000125, + "input_cost_per_token_priority": 0.000005, + "output_cost_per_token_above_272k_tokens": 0.0000225, + "output_cost_per_token_flex": 0.0000075, + "output_cost_per_token_batches": 0.0000075, + "output_cost_per_token_priority": 0.00003 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.4", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5.4", + "GPT-5.4", + "OpenAI: GPT-5.4", + "gpt-5.4" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat", + "responses" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-05", + "lastUpdated": "2026-03-05", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 28 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-5.4", + "modelKey": "gpt-5.4", + "displayName": "gpt-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "gpt-5.4", + "modelKey": "gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "gpt-5.4", + "modelKey": "gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "openai/gpt-5.4", + "modelKey": "openai/gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.4", + "modelKey": "gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.4", + "modelKey": "gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "openai/gpt-5.4", + "modelKey": "openai/gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "gpt-5.4", + "modelKey": "gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "freemodel", + "providerName": "FreeModel", + "providerApi": "https://cc.freemodel.dev/v1", + "providerDoc": "https://freemodel.dev", + "model": "gpt-5.4", + "modelKey": "gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "gpt-5.4", + "modelKey": "gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.4", + "modelKey": "openai/gpt-5.4", + "displayName": "OpenAI: GPT-5.4", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-03-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5.4", + "modelKey": "gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-5.4", + "modelKey": "openai/gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5.4", + "modelKey": "openai/gpt-5.4", + "displayName": "GPT 5.4", + "metadata": { + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "openai/gpt-5.4", + "modelKey": "openai/gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.4", + "modelKey": "gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gpt-5.4", + "modelKey": "gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.4", + "modelKey": "openai/gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5.4", + "modelKey": "openai/gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "openai/gpt-5.4", + "modelKey": "openai/gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.4", + "modelKey": "openai/gpt-5.4", + "displayName": "GPT-5.4", + "metadata": { + "lastUpdated": "2026-02-26", + "openWeights": false, + "releaseDate": "2026-02-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5.4", + "modelKey": "openai/gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "gpt-5.4", + "modelKey": "gpt-5.4", + "displayName": "gpt-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5.4", + "modelKey": "openai/gpt-5.4", + "displayName": "GPT 5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vivgrid", + "providerName": "Vivgrid", + "providerApi": "https://api.vivgrid.com/v1", + "providerDoc": "https://docs.vivgrid.com/models", + "model": "gpt-5.4", + "modelKey": "gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5.4", + "modelKey": "openai/gpt-5.4", + "displayName": "GPT-5.4", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-20", + "openWeights": false, + "releaseDate": "2026-03-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/gpt-5.4", + "mode": "chat", + "metadata": { + "source": "https://ai.azure.com/catalog/models/gpt-5.4", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.4", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.4", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.4", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.4", + "displayName": "OpenAI: GPT-5.4", + "metadata": { + "canonicalSlug": "openai/gpt-5.4-20260305", + "createdAt": "2026-03-05T18:12:32.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-5.4-20260305/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": false, + "supported_efforts": [ + "xhigh", + "high", + "medium", + "low", + "none" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 1050000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5.4-2026-03-05", + "provider": "openai", + "model": "gpt-5.4-2026-03-05", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "azure_ai", + "openai" + ], + "aliases": [ + "azure/gpt-5.4-2026-03-05", + "azure_ai/gpt-5.4-2026-03-05", + "openai/gpt-5.4-2026-03-05" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1050000, + "inputTokens": 1050000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": true, + "minimalReasoningEffort": true, + "noneReasoningEffort": true, + "webSearch": true, + "xhighReasoningEffort": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/gpt-5.4-2026-03-05", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 5e-7, + "cache_read_input_token_cost_priority": 5e-7, + "cache_read_input_token_cost_above_272k_tokens_priority": 0.000001, + "input_cost_per_token_above_272k_tokens": 0.000005, + "input_cost_per_token_priority": 0.000005, + "input_cost_per_token_above_272k_tokens_priority": 0.00001, + "output_cost_per_token_above_272k_tokens": 0.0000225, + "output_cost_per_token_priority": 0.00003, + "output_cost_per_token_above_272k_tokens_priority": 0.000045 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.4-2026-03-05", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 5e-7, + "cache_read_input_token_cost_priority": 5e-7, + "cache_read_input_token_cost_above_272k_tokens_priority": 0.000001, + "input_cost_per_token_above_272k_tokens": 0.000005, + "input_cost_per_token_priority": 0.000005, + "input_cost_per_token_above_272k_tokens_priority": 0.00001, + "output_cost_per_token_above_272k_tokens": 0.0000225, + "output_cost_per_token_priority": 0.00003, + "output_cost_per_token_above_272k_tokens_priority": 0.000045 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.4-2026-03-05", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.25, + "input": 2.5, + "output": 15 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 5e-7, + "cache_read_input_token_cost_flex": 1.3e-7, + "cache_read_input_token_cost_priority": 5e-7, + "input_cost_per_token_above_272k_tokens": 0.000005, + "input_cost_per_token_flex": 0.00000125, + "input_cost_per_token_batches": 0.00000125, + "input_cost_per_token_priority": 0.000005, + "output_cost_per_token_above_272k_tokens": 0.0000225, + "output_cost_per_token_flex": 0.0000075, + "output_cost_per_token_batches": 0.0000075, + "output_cost_per_token_priority": 0.00003 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/gpt-5.4-2026-03-05", + "mode": "chat", + "metadata": { + "source": "https://ai.azure.com/catalog/models/gpt-5.4", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.4-2026-03-05", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.4-2026-03-05", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5.4-image-2", + "provider": "openai", + "model": "gpt-5.4-image-2", + "displayName": "OpenAI: GPT-5.4 Image 2", + "family": "gpt", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/openai/gpt-5.4-image-2", + "openrouter/openai/gpt-5.4-image-2" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.4-image-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 2, + "input": 8, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.4-image-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 2, + "input": 8, + "output": 15 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.4-image-2", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 2, + "input": 8, + "output": 15 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.4 Image 2", + "OpenAI: GPT-5.4 Image 2" + ], + "families": [ + "gpt" + ], + "releaseDate": "2026-04-21", + "lastUpdated": "2026-05-01", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "top_logprobs" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.4-image-2", + "modelKey": "openai/gpt-5.4-image-2", + "displayName": "OpenAI: GPT-5.4 Image 2", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.4-image-2", + "modelKey": "openai/gpt-5.4-image-2", + "displayName": "GPT-5.4 Image 2", + "family": "gpt", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": false, + "releaseDate": "2026-04-21" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.4-image-2", + "displayName": "OpenAI: GPT-5.4 Image 2", + "metadata": { + "canonicalSlug": "openai/gpt-5.4-image-2-20260421", + "createdAt": "2026-04-21T18:52:08.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-5.4-image-2-20260421/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": false, + "supported_efforts": [ + "xhigh", + "high", + "medium", + "low", + "none" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "top_logprobs" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 272000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5.4-mini", + "provider": "openai", + "model": "gpt-5.4-mini", + "displayName": "GPT-5.4 mini", + "family": "gpt-mini", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "aihubmix", + "azure", + "azure-cognitive-services", + "azure_ai", + "fastrouter", + "freemodel", + "github-copilot", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "openai", + "opencode", + "openrouter", + "orcarouter", + "poe", + "vercel", + "vivgrid", + "zenmux" + ], + "aliases": [ + "302ai/gpt-5.4-mini", + "aihubmix/gpt-5.4-mini", + "azure-cognitive-services/gpt-5.4-mini", + "azure/gpt-5.4-mini", + "azure_ai/gpt-5.4-mini", + "fastrouter/openai/gpt-5.4-mini", + "freemodel/gpt-5.4-mini", + "github-copilot/gpt-5.4-mini", + "kilo/openai/gpt-5.4-mini", + "llmgateway/gpt-5.4-mini", + "merge-gateway/openai/gpt-5.4-mini", + "nano-gpt/openai/gpt-5.4-mini", + "nearai/openai/gpt-5.4-mini", + "openai/gpt-5.4-mini", + "opencode/gpt-5.4-mini", + "openrouter/openai/gpt-5.4-mini", + "orcarouter/openai/gpt-5.4-mini", + "poe/openai/gpt-5.4-mini", + "vercel/openai/gpt-5.4-mini", + "vivgrid/gpt-5.4-mini", + "zenmux/openai/gpt-5.4-mini" + ], + "mergedProviderModelRecords": 21, + "limits": { + "contextTokens": 1050000, + "inputTokens": 1050000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": false, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "aihubmix", + "model": "gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "openai/gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "freemodel", + "model": "gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "cacheWrite": 0.75, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "github-copilot", + "model": "gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "openai/gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.068, + "input": 0.68, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "vivgrid", + "model": "gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5.4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/gpt-5.4-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 1.5e-7, + "cache_read_input_token_cost_priority": 1.5e-7, + "cache_read_input_token_cost_above_272k_tokens_priority": 3e-7, + "input_cost_per_token_above_272k_tokens": 0.0000015, + "input_cost_per_token_priority": 0.0000015, + "input_cost_per_token_above_272k_tokens_priority": 0.000003, + "output_cost_per_token_above_272k_tokens": 0.00000675, + "output_cost_per_token_priority": 0.000009, + "output_cost_per_token_above_272k_tokens_priority": 0.0000135 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.4-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.4-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + }, + "extra": { + "cache_read_input_token_cost_flex": 3.75e-8, + "cache_read_input_token_cost_batches": 3.75e-8, + "cache_read_input_token_cost_priority": 1.5e-7, + "input_cost_per_token_flex": 3.75e-7, + "input_cost_per_token_batches": 3.75e-7, + "input_cost_per_token_priority": 0.0000015, + "output_cost_per_token_flex": 0.00000225, + "output_cost_per_token_batches": 0.00000225, + "output_cost_per_token_priority": 0.000009 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.4-mini", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5.4 Mini", + "GPT-5.4 Mini", + "GPT-5.4 mini", + "GPT-5.4-Mini", + "OpenAI: GPT-5.4 Mini", + "gpt-5.4-mini" + ], + "families": [ + "gpt", + "gpt-mini" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-19", + "lastUpdated": "2026-03-19", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 21 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-5.4-mini", + "modelKey": "gpt-5.4-mini", + "displayName": "gpt-5.4-mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-19", + "openWeights": false, + "releaseDate": "2026-03-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "gpt-5.4-mini", + "modelKey": "gpt-5.4-mini", + "displayName": "GPT-5.4 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.4-mini", + "modelKey": "gpt-5.4-mini", + "displayName": "GPT-5.4 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.4-mini", + "modelKey": "gpt-5.4-mini", + "displayName": "GPT-5.4 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "openai/gpt-5.4-mini", + "modelKey": "openai/gpt-5.4-mini", + "displayName": "GPT-5.4 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "freemodel", + "providerName": "FreeModel", + "providerApi": "https://cc.freemodel.dev/v1", + "providerDoc": "https://freemodel.dev", + "model": "gpt-5.4-mini", + "modelKey": "gpt-5.4-mini", + "displayName": "GPT-5.4 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "gpt-5.4-mini", + "modelKey": "gpt-5.4-mini", + "displayName": "GPT-5.4 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.4-mini", + "modelKey": "openai/gpt-5.4-mini", + "displayName": "OpenAI: GPT-5.4 Mini", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5.4-mini", + "modelKey": "gpt-5.4-mini", + "displayName": "GPT-5.4 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-5.4-mini", + "modelKey": "openai/gpt-5.4-mini", + "displayName": "GPT-5.4 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5.4-mini", + "modelKey": "openai/gpt-5.4-mini", + "displayName": "GPT 5.4 Mini", + "metadata": { + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "openai/gpt-5.4-mini", + "modelKey": "openai/gpt-5.4-mini", + "displayName": "GPT-5.4 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.4-mini", + "modelKey": "gpt-5.4-mini", + "displayName": "GPT-5.4 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gpt-5.4-mini", + "modelKey": "gpt-5.4-mini", + "displayName": "GPT-5.4 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.4-mini", + "modelKey": "openai/gpt-5.4-mini", + "displayName": "GPT-5.4 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5.4-mini", + "modelKey": "openai/gpt-5.4-mini", + "displayName": "GPT-5.4 mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.4-mini", + "modelKey": "openai/gpt-5.4-mini", + "displayName": "GPT-5.4-Mini", + "metadata": { + "lastUpdated": "2026-03-12", + "openWeights": false, + "releaseDate": "2026-03-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5.4-mini", + "modelKey": "openai/gpt-5.4-mini", + "displayName": "GPT 5.4 Mini", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vivgrid", + "providerName": "Vivgrid", + "providerApi": "https://api.vivgrid.com/v1", + "providerDoc": "https://docs.vivgrid.com/models", + "model": "gpt-5.4-mini", + "modelKey": "gpt-5.4-mini", + "displayName": "GPT-5.4 Mini", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5.4-mini", + "modelKey": "openai/gpt-5.4-mini", + "displayName": "GPT-5.4 Mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-20", + "openWeights": false, + "releaseDate": "2026-03-20" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/gpt-5.4-mini", + "mode": "chat", + "metadata": { + "source": "https://ai.azure.com/catalog/models/gpt-5.4-mini", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.4-mini", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.4-mini", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.4-mini", + "displayName": "OpenAI: GPT-5.4 Mini", + "metadata": { + "canonicalSlug": "openai/gpt-5.4-mini-20260317", + "createdAt": "2026-03-17T11:49:38.000Z", + "knowledgeCutoff": "2025-08-31", + "links": { + "details": "/api/v1/models/openai/gpt-5.4-mini-20260317/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": false, + "supported_efforts": [ + "xhigh", + "high", + "medium", + "low", + "none" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5.4-mini-2026-03-17", + "provider": "openai", + "model": "gpt-5.4-mini-2026-03-17", + "displayName": "gpt-5.4-mini-2026-03-17", + "family": "gpt-mini", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "azure", + "azure_ai", + "openai" + ], + "aliases": [ + "302ai/gpt-5.4-mini-2026-03-17", + "azure/gpt-5.4-mini-2026-03-17", + "azure_ai/gpt-5.4-mini-2026-03-17", + "openai/gpt-5.4-mini-2026-03-17" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 1050000, + "inputTokens": 1050000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "minimalReasoningEffort": false, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": true, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": true, + "supports1MContext": true, + "attachments": true, + "openWeights": false, + "structuredOutput": true, + "temperature": false, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-5.4-mini-2026-03-17", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/gpt-5.4-mini-2026-03-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 1.5e-7, + "cache_read_input_token_cost_priority": 1.5e-7, + "cache_read_input_token_cost_above_272k_tokens_priority": 3e-7, + "input_cost_per_token_above_272k_tokens": 0.0000015, + "input_cost_per_token_priority": 0.0000015, + "input_cost_per_token_above_272k_tokens_priority": 0.000003, + "output_cost_per_token_above_272k_tokens": 0.00000675, + "output_cost_per_token_priority": 0.000009, + "output_cost_per_token_above_272k_tokens_priority": 0.0000135 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.4-mini-2026-03-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.4-mini-2026-03-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + }, + "extra": { + "cache_read_input_token_cost_flex": 3.75e-8, + "cache_read_input_token_cost_batches": 3.75e-8, + "cache_read_input_token_cost_priority": 1.5e-7, + "input_cost_per_token_flex": 3.75e-7, + "input_cost_per_token_batches": 3.75e-7, + "input_cost_per_token_priority": 0.0000015, + "output_cost_per_token_flex": 0.00000225, + "output_cost_per_token_batches": 0.00000225, + "output_cost_per_token_priority": 0.000009 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gpt-5.4-mini-2026-03-17" + ], + "families": [ + "gpt-mini" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-19", + "lastUpdated": "2026-03-19", + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-5.4-mini-2026-03-17", + "modelKey": "gpt-5.4-mini-2026-03-17", + "displayName": "gpt-5.4-mini-2026-03-17", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-19", + "openWeights": false, + "releaseDate": "2026-03-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/gpt-5.4-mini-2026-03-17", + "mode": "chat", + "metadata": { + "source": "https://ai.azure.com/catalog/models/gpt-5.4-mini", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.4-mini-2026-03-17", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.4-mini-2026-03-17", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5.4-nano", + "provider": "openai", + "model": "gpt-5.4-nano", + "displayName": "GPT-5.4 nano", + "family": "gpt-nano", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "azure", + "azure-cognitive-services", + "azure_ai", + "fastrouter", + "github-copilot", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "openai", + "opencode", + "openrouter", + "orcarouter", + "poe", + "vercel", + "vivgrid", + "zenmux" + ], + "aliases": [ + "302ai/gpt-5.4-nano", + "azure-cognitive-services/gpt-5.4-nano", + "azure/gpt-5.4-nano", + "azure_ai/gpt-5.4-nano", + "fastrouter/openai/gpt-5.4-nano", + "github-copilot/gpt-5.4-nano", + "kilo/openai/gpt-5.4-nano", + "llmgateway/gpt-5.4-nano", + "merge-gateway/openai/gpt-5.4-nano", + "nano-gpt/openai/gpt-5.4-nano", + "nearai/openai/gpt-5.4-nano", + "openai/gpt-5.4-nano", + "opencode/gpt-5.4-nano", + "openrouter/openai/gpt-5.4-nano", + "orcarouter/openai/gpt-5.4-nano", + "poe/openai/gpt-5.4-nano", + "vercel/openai/gpt-5.4-nano", + "vivgrid/gpt-5.4-nano", + "zenmux/openai/gpt-5.4-nano" + ], + "mergedProviderModelRecords": 19, + "limits": { + "contextTokens": 1050000, + "inputTokens": 1050000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": false, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "openai/gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "github-copilot", + "model": "gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "openai/gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.018, + "input": 0.18, + "output": 1.1 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "vivgrid", + "model": "gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5.4-nano", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/gpt-5.4-nano", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 4e-8, + "cache_read_input_token_cost_priority": 4e-8, + "cache_read_input_token_cost_above_272k_tokens_priority": 8e-8, + "input_cost_per_token_above_272k_tokens": 4e-7, + "input_cost_per_token_priority": 4e-7, + "input_cost_per_token_above_272k_tokens_priority": 8e-7, + "output_cost_per_token_above_272k_tokens": 0.000001875, + "output_cost_per_token_priority": 0.0000025, + "output_cost_per_token_above_272k_tokens_priority": 0.00000375 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.4-nano", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.4-nano", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + }, + "extra": { + "cache_read_input_token_cost_flex": 1e-8, + "cache_read_input_token_cost_batches": 1e-8, + "input_cost_per_token_flex": 1e-7, + "input_cost_per_token_batches": 1e-7, + "output_cost_per_token_flex": 6.25e-7, + "output_cost_per_token_batches": 6.25e-7 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.4-nano", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5.4 Nano", + "GPT-5.4 Nano", + "GPT-5.4 nano", + "GPT-5.4-Nano", + "OpenAI: GPT-5.4 Nano", + "gpt-5.4-nano" + ], + "families": [ + "gpt", + "gpt-nano" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-19", + "lastUpdated": "2026-03-19", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 19 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-5.4-nano", + "modelKey": "gpt-5.4-nano", + "displayName": "gpt-5.4-nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-19", + "openWeights": false, + "releaseDate": "2026-03-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.4-nano", + "modelKey": "gpt-5.4-nano", + "displayName": "GPT-5.4 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.4-nano", + "modelKey": "gpt-5.4-nano", + "displayName": "GPT-5.4 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "openai/gpt-5.4-nano", + "modelKey": "openai/gpt-5.4-nano", + "displayName": "GPT-5.4 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "gpt-5.4-nano", + "modelKey": "gpt-5.4-nano", + "displayName": "GPT-5.4 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.4-nano", + "modelKey": "openai/gpt-5.4-nano", + "displayName": "OpenAI: GPT-5.4 Nano", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5.4-nano", + "modelKey": "gpt-5.4-nano", + "displayName": "GPT-5.4 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-5.4-nano", + "modelKey": "openai/gpt-5.4-nano", + "displayName": "GPT-5.4 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5.4-nano", + "modelKey": "openai/gpt-5.4-nano", + "displayName": "GPT 5.4 Nano", + "metadata": { + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "openai/gpt-5.4-nano", + "modelKey": "openai/gpt-5.4-nano", + "displayName": "GPT-5.4 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.4-nano", + "modelKey": "gpt-5.4-nano", + "displayName": "GPT-5.4 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gpt-5.4-nano", + "modelKey": "gpt-5.4-nano", + "displayName": "GPT-5.4 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.4-nano", + "modelKey": "openai/gpt-5.4-nano", + "displayName": "GPT-5.4 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5.4-nano", + "modelKey": "openai/gpt-5.4-nano", + "displayName": "GPT-5.4 nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.4-nano", + "modelKey": "openai/gpt-5.4-nano", + "displayName": "GPT-5.4-Nano", + "metadata": { + "lastUpdated": "2026-03-11", + "openWeights": false, + "releaseDate": "2026-03-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5.4-nano", + "modelKey": "openai/gpt-5.4-nano", + "displayName": "GPT 5.4 Nano", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vivgrid", + "providerName": "Vivgrid", + "providerApi": "https://api.vivgrid.com/v1", + "providerDoc": "https://docs.vivgrid.com/models", + "model": "gpt-5.4-nano", + "modelKey": "gpt-5.4-nano", + "displayName": "GPT-5.4 Nano", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2026-03-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5.4-nano", + "modelKey": "openai/gpt-5.4-nano", + "displayName": "GPT-5.4 Nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-20", + "openWeights": false, + "releaseDate": "2026-03-20" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/gpt-5.4-nano", + "mode": "chat", + "metadata": { + "source": "https://ai.azure.com/catalog/models/gpt-5.4-nano", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.4-nano", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.4-nano", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.4-nano", + "displayName": "OpenAI: GPT-5.4 Nano", + "metadata": { + "canonicalSlug": "openai/gpt-5.4-nano-20260317", + "createdAt": "2026-03-17T11:49:47.000Z", + "knowledgeCutoff": "2025-08-31", + "links": { + "details": "/api/v1/models/openai/gpt-5.4-nano-20260317/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": false, + "supported_efforts": [ + "xhigh", + "high", + "medium", + "low", + "none" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openai/gpt-5.4-nano-2026-03-17", + "provider": "openai", + "model": "gpt-5.4-nano-2026-03-17", + "displayName": "gpt-5.4-nano-2026-03-17", + "family": "gpt-nano", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "azure", + "azure_ai", + "openai" + ], + "aliases": [ + "302ai/gpt-5.4-nano-2026-03-17", + "azure/gpt-5.4-nano-2026-03-17", + "azure_ai/gpt-5.4-nano-2026-03-17", + "openai/gpt-5.4-nano-2026-03-17" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 1050000, + "inputTokens": 1050000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "minimalReasoningEffort": false, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": true, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": true, + "supports1MContext": true, + "attachments": true, + "openWeights": false, + "structuredOutput": true, + "temperature": false, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-5.4-nano-2026-03-17", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/gpt-5.4-nano-2026-03-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 4e-8, + "cache_read_input_token_cost_priority": 4e-8, + "cache_read_input_token_cost_above_272k_tokens_priority": 8e-8, + "input_cost_per_token_above_272k_tokens": 4e-7, + "input_cost_per_token_priority": 4e-7, + "input_cost_per_token_above_272k_tokens_priority": 8e-7, + "output_cost_per_token_above_272k_tokens": 0.000001875, + "output_cost_per_token_priority": 0.0000025, + "output_cost_per_token_above_272k_tokens_priority": 0.00000375 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.4-nano-2026-03-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.4-nano-2026-03-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.25 + }, + "extra": { + "cache_read_input_token_cost_flex": 1e-8, + "cache_read_input_token_cost_batches": 1e-8, + "input_cost_per_token_flex": 1e-7, + "input_cost_per_token_batches": 1e-7, + "output_cost_per_token_flex": 6.25e-7, + "output_cost_per_token_batches": 6.25e-7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gpt-5.4-nano-2026-03-17" + ], + "families": [ + "gpt-nano" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-19", + "lastUpdated": "2026-03-19", + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-5.4-nano-2026-03-17", + "modelKey": "gpt-5.4-nano-2026-03-17", + "displayName": "gpt-5.4-nano-2026-03-17", + "family": "gpt-nano", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-19", + "openWeights": false, + "releaseDate": "2026-03-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/gpt-5.4-nano-2026-03-17", + "mode": "chat", + "metadata": { + "source": "https://ai.azure.com/catalog/models/gpt-5.4-nano", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.4-nano-2026-03-17", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.4-nano-2026-03-17", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5.4-pro", + "provider": "openai", + "model": "gpt-5.4-pro", + "displayName": "GPT-5.4 Pro", + "family": "gpt-pro", + "mode": "responses", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "azure", + "azure-cognitive-services", + "azure_ai", + "chatgpt", + "kilo", + "llmgateway", + "nano-gpt", + "openai", + "opencode", + "openrouter", + "orcarouter", + "poe", + "requesty", + "vercel", + "zenmux" + ], + "aliases": [ + "302ai/gpt-5.4-pro", + "azure-cognitive-services/gpt-5.4-pro", + "azure/gpt-5.4-pro", + "azure_ai/gpt-5.4-pro", + "chatgpt/gpt-5.4-pro", + "kilo/openai/gpt-5.4-pro", + "llmgateway/gpt-5.4-pro", + "nano-gpt/openai/gpt-5.4-pro", + "openai/gpt-5.4-pro", + "opencode/gpt-5.4-pro", + "openrouter/openai/gpt-5.4-pro", + "orcarouter/openai/gpt-5.4-pro", + "poe/openai/gpt-5.4-pro", + "requesty/openai/gpt-5.4-pro", + "vercel/openai/gpt-5.4-pro", + "zenmux/openai/gpt-5.4-pro" + ], + "mergedProviderModelRecords": 16, + "limits": { + "contextTokens": 1050000, + "inputTokens": 1050000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "gpt-5.4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 30, + "output": 180 + }, + "tiered": { + "contextOver200K": { + "input": 60, + "output": 270 + }, + "tiers": [ + { + "input": 60, + "output": 270, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5.4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 180 + }, + "tiered": { + "contextOver200K": { + "input": 60, + "output": 270 + }, + "tiers": [ + { + "input": 60, + "output": 270, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5.4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 180 + }, + "tiered": { + "contextOver200K": { + "input": 60, + "output": 270 + }, + "tiers": [ + { + "input": 60, + "output": 270, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 180 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5.4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 180 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5.4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 3, + "input": 30, + "output": 180 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 180 + }, + "tiered": { + "contextOver200K": { + "input": 60, + "output": 270 + }, + "tiers": [ + { + "input": 60, + "output": 270, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gpt-5.4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 30, + "input": 30, + "output": 180 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 180 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5.4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 60, + "output": 270 + }, + "tiered": { + "contextOver200K": { + "input": 60, + "output": 270 + }, + "tiers": [ + { + "input": 60, + "output": 270, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 27, + "output": 160 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/gpt-5.4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 30, + "input": 30, + "output": 180 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5.4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 180 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5.4-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 45, + "output": 225 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/gpt-5.4-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 3, + "input": 30, + "output": 180 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 0.000006, + "cache_read_input_token_cost_priority": 0.000006, + "cache_read_input_token_cost_above_272k_tokens_priority": 0.000012, + "input_cost_per_token_above_272k_tokens": 0.00006, + "input_cost_per_token_priority": 0.00006, + "input_cost_per_token_above_272k_tokens_priority": 0.00012, + "output_cost_per_token_above_272k_tokens": 0.00027, + "output_cost_per_token_priority": 0.00036, + "output_cost_per_token_above_272k_tokens_priority": 0.00054 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.4-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 3, + "input": 30, + "output": 180 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 0.000006, + "input_cost_per_token_above_272k_tokens": 0.00006, + "output_cost_per_token_above_272k_tokens": 0.00027 + } + }, + { + "source": "litellm", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.4-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.4-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 3, + "input": 30, + "output": 180 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 0.000006, + "input_cost_per_token_above_272k_tokens": 0.00006, + "input_cost_per_token_flex": 0.000015, + "input_cost_per_token_batches": 0.000015, + "output_cost_per_token_above_272k_tokens": 0.00027, + "output_cost_per_token_flex": 0.00009, + "output_cost_per_token_batches": 0.00009 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.4-pro", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 30, + "output": 180 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5.4 Pro", + "GPT-5.4 Pro", + "GPT-5.4-Pro", + "OpenAI: GPT-5.4 Pro", + "gpt-5.4-pro" + ], + "families": [ + "gpt", + "gpt-pro" + ], + "modes": [ + "responses" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-05", + "lastUpdated": "2026-03-05", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ], + "providerModelRecordCount": 16 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "gpt-5.4-pro", + "modelKey": "gpt-5.4-pro", + "displayName": "gpt-5.4-pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.4-pro", + "modelKey": "gpt-5.4-pro", + "displayName": "GPT-5.4 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.4-pro", + "modelKey": "gpt-5.4-pro", + "displayName": "GPT-5.4 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.4-pro", + "modelKey": "openai/gpt-5.4-pro", + "displayName": "OpenAI: GPT-5.4 Pro", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-03-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5.4-pro", + "modelKey": "gpt-5.4-pro", + "displayName": "GPT-5.4 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5.4-pro", + "modelKey": "openai/gpt-5.4-pro", + "displayName": "GPT 5.4 Pro", + "metadata": { + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.4-pro", + "modelKey": "gpt-5.4-pro", + "displayName": "GPT-5.4 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gpt-5.4-pro", + "modelKey": "gpt-5.4-pro", + "displayName": "GPT-5.4 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.4-pro", + "modelKey": "openai/gpt-5.4-pro", + "displayName": "GPT-5.4 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5.4-pro", + "modelKey": "openai/gpt-5.4-pro", + "displayName": "GPT-5.4 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.4-pro", + "modelKey": "openai/gpt-5.4-pro", + "displayName": "GPT-5.4-Pro", + "metadata": { + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/gpt-5.4-pro", + "modelKey": "openai/gpt-5.4-pro", + "displayName": "GPT-5.4 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5.4-pro", + "modelKey": "openai/gpt-5.4-pro", + "displayName": "GPT 5.4 Pro", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5.4-pro", + "modelKey": "openai/gpt-5.4-pro", + "displayName": "GPT-5.4 Pro", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-20", + "openWeights": false, + "releaseDate": "2026-03-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/gpt-5.4-pro", + "mode": "responses", + "metadata": { + "source": "https://ai.azure.com/catalog/models/gpt-5.4-pro", + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.4-pro", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "chatgpt", + "model": "chatgpt/gpt-5.4-pro", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.4-pro", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses", + "/v1/batch" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.4-pro", + "displayName": "OpenAI: GPT-5.4 Pro", + "metadata": { + "canonicalSlug": "openai/gpt-5.4-pro-20260305", + "createdAt": "2026-03-05T18:12:46.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-5.4-pro-20260305/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "xhigh", + "high", + "medium" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 1050000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5.4-pro-2026-03-05", + "provider": "openai", + "model": "gpt-5.4-pro-2026-03-05", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "azure_ai", + "openai" + ], + "aliases": [ + "azure/gpt-5.4-pro-2026-03-05", + "azure_ai/gpt-5.4-pro-2026-03-05", + "openai/gpt-5.4-pro-2026-03-05" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1050000, + "inputTokens": 1050000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "minimalReasoningEffort": true, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": false, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/gpt-5.4-pro-2026-03-05", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 3, + "input": 30, + "output": 180 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 0.000006, + "cache_read_input_token_cost_priority": 0.000006, + "cache_read_input_token_cost_above_272k_tokens_priority": 0.000012, + "input_cost_per_token_above_272k_tokens": 0.00006, + "input_cost_per_token_priority": 0.00006, + "input_cost_per_token_above_272k_tokens_priority": 0.00012, + "output_cost_per_token_above_272k_tokens": 0.00027, + "output_cost_per_token_priority": 0.00036, + "output_cost_per_token_above_272k_tokens_priority": 0.00054 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.4-pro-2026-03-05", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 3, + "input": 30, + "output": 180 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 0.000006, + "input_cost_per_token_above_272k_tokens": 0.00006, + "output_cost_per_token_above_272k_tokens": 0.00027 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.4-pro-2026-03-05", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 3, + "input": 30, + "output": 180 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 0.000006, + "input_cost_per_token_above_272k_tokens": 0.00006, + "input_cost_per_token_flex": 0.000015, + "input_cost_per_token_batches": 0.000015, + "output_cost_per_token_above_272k_tokens": 0.00027, + "output_cost_per_token_flex": 0.00009, + "output_cost_per_token_batches": 0.00009 + } + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/gpt-5.4-pro-2026-03-05", + "mode": "responses", + "metadata": { + "source": "https://ai.azure.com/catalog/models/gpt-5.4-pro", + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.4-pro-2026-03-05", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.4-pro-2026-03-05", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses", + "/v1/batch" + ] + } + } + ] + }, + { + "id": "openai/gpt-5.5", + "provider": "openai", + "model": "gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "aihubmix", + "azure", + "azure-cognitive-services", + "cloudflare-ai-gateway", + "fastrouter", + "freemodel", + "github-copilot", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "openai", + "opencode", + "openrouter", + "orcarouter", + "perplexity-agent", + "poe", + "sap-ai-core", + "vercel", + "vivgrid", + "zenmux" + ], + "aliases": [ + "aihubmix/gpt-5.5", + "azure-cognitive-services/gpt-5.5", + "azure/gpt-5.5", + "cloudflare-ai-gateway/openai/gpt-5.5", + "fastrouter/openai/gpt-5.5", + "freemodel/gpt-5.5", + "github-copilot/gpt-5.5", + "kilo/openai/gpt-5.5", + "llmgateway/gpt-5.5", + "merge-gateway/openai/gpt-5.5", + "nano-gpt/openai/gpt-5.5", + "nearai/openai/gpt-5.5", + "openai/gpt-5.5", + "opencode/gpt-5.5", + "openrouter/openai/gpt-5.5", + "orcarouter/openai/gpt-5.5", + "perplexity-agent/openai/gpt-5.5", + "poe/openai/gpt-5.5", + "sap-ai-core/gpt-5.5", + "vercel/openai/gpt-5.5", + "vivgrid/gpt-5.5", + "zenmux/openai/gpt-5.5" + ], + "mergedProviderModelRecords": 22, + "limits": { + "contextTokens": 1050000, + "inputTokens": 1050000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "minimalReasoningEffort": false, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 45, + "cache_read": 1 + }, + "tiers": [ + { + "input": 10, + "output": 45, + "cache_read": 1, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 45, + "cache_read": 1 + }, + "tiers": [ + { + "input": 10, + "output": 45, + "cache_read": 1, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 45, + "cache_read": 1 + }, + "tiers": [ + { + "input": 10, + "output": 45, + "cache_read": 1, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "openai/gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 45, + "cache_read": 1 + }, + "tiers": [ + { + "input": 10, + "output": 45, + "cache_read": 1, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "openai/gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 5, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "freemodel", + "model": "gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 5, + "input": 5, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "github-copilot", + "model": "gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 45, + "cache_read": 1 + }, + "tiers": [ + { + "input": 10, + "output": 45, + "cache_read": 1, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 45, + "cache_read": 1 + }, + "tiers": [ + { + "input": 10, + "output": 45, + "cache_read": 1, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 45, + "cache_read": 1 + }, + "tiers": [ + { + "input": 10, + "output": 45, + "cache_read": 1, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "openai/gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 45, + "cache_read": 1 + }, + "tiers": [ + { + "input": 10, + "output": 45, + "cache_read": 1, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 45, + "cache_read": 1 + }, + "tiers": [ + { + "input": 10, + "output": 45, + "cache_read": 1, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 45, + "cache_read": 1 + }, + "tiers": [ + { + "input": 10, + "output": 45, + "cache_read": 1, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 45, + "cache_read": 1 + }, + "tiers": [ + { + "input": 10, + "output": 45, + "cache_read": 1, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "openai/gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.4545, + "input": 4.5455, + "output": 27.2727 + } + }, + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "vivgrid", + "model": "gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 45, + "cache_read": 1 + }, + "tiers": [ + { + "input": 10, + "output": 45, + "cache_read": 1, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "tiered": { + "contextOver200K": { + "input": 10, + "output": 45, + "cache_read": 1 + }, + "tiers": [ + { + "input": 10, + "output": 45, + "cache_read": 1, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 0.000001, + "cache_read_input_token_cost_priority": 0.000001, + "cache_read_input_token_cost_above_272k_tokens_priority": 0.000002, + "input_cost_per_token_above_272k_tokens": 0.00001, + "input_cost_per_token_priority": 0.00001, + "input_cost_per_token_above_272k_tokens_priority": 0.00002, + "output_cost_per_token_above_272k_tokens": 0.000045, + "output_cost_per_token_priority": 0.00006, + "output_cost_per_token_above_272k_tokens_priority": 0.00009 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 0.000001, + "cache_read_input_token_cost_flex": 2.5e-7, + "cache_read_input_token_cost_priority": 0.000001, + "input_cost_per_token_above_272k_tokens": 0.00001, + "input_cost_per_token_flex": 0.0000025, + "input_cost_per_token_batches": 0.0000025, + "input_cost_per_token_priority": 0.00001, + "output_cost_per_token_above_272k_tokens": 0.000045, + "output_cost_per_token_flex": 0.000015, + "output_cost_per_token_batches": 0.000015, + "output_cost_per_token_priority": 0.00006 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.5", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5.5", + "GPT-5.5", + "OpenAI: GPT-5.5", + "gpt-5.5" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-12-01", + "releaseDate": "2026-04-23", + "lastUpdated": "2026-04-23", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 22 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "gpt-5.5", + "modelKey": "gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.5", + "modelKey": "gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-24", + "openWeights": false, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-5.5", + "modelKey": "gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-24", + "openWeights": false, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "openai/gpt-5.5", + "modelKey": "openai/gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "openai/gpt-5.5", + "modelKey": "openai/gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "freemodel", + "providerName": "FreeModel", + "providerApi": "https://cc.freemodel.dev/v1", + "providerDoc": "https://freemodel.dev", + "model": "gpt-5.5", + "modelKey": "gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-copilot", + "providerName": "GitHub Copilot", + "providerApi": "https://api.githubcopilot.com", + "providerDoc": "https://docs.github.com/en/copilot", + "model": "gpt-5.5", + "modelKey": "gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.5", + "modelKey": "openai/gpt-5.5", + "displayName": "OpenAI: GPT-5.5", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5.5", + "modelKey": "gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/gpt-5.5", + "modelKey": "openai/gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-5.5", + "modelKey": "openai/gpt-5.5", + "displayName": "GPT 5.5", + "metadata": { + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "openai/gpt-5.5", + "modelKey": "openai/gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.5", + "modelKey": "gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gpt-5.5", + "modelKey": "gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.5", + "modelKey": "openai/gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5.5", + "modelKey": "openai/gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "openai/gpt-5.5", + "modelKey": "openai/gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.5", + "modelKey": "openai/gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-08", + "openWeights": false, + "releaseDate": "2026-04-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "gpt-5.5", + "modelKey": "gpt-5.5", + "displayName": "gpt-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5.5", + "modelKey": "openai/gpt-5.5", + "displayName": "GPT 5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vivgrid", + "providerName": "Vivgrid", + "providerApi": "https://api.vivgrid.com/v1", + "providerDoc": "https://docs.vivgrid.com/models", + "model": "gpt-5.5", + "modelKey": "gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5.5", + "modelKey": "openai/gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.5", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.5", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.5", + "displayName": "OpenAI: GPT-5.5", + "metadata": { + "canonicalSlug": "openai/gpt-5.5-20260423", + "createdAt": "2026-04-24T17:31:33.000Z", + "knowledgeCutoff": "2025-12-01", + "links": { + "details": "/api/v1/models/openai/gpt-5.5-20260423/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true, + "supported_efforts": [ + "xhigh", + "high", + "medium", + "low", + "none" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 1050000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5.5-2026-04-23", + "provider": "openai", + "model": "gpt-5.5-2026-04-23", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-5.5-2026-04-23", + "openai/gpt-5.5-2026-04-23" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1050000, + "inputTokens": 1050000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "minimalReasoningEffort": false, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": true, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.5-2026-04-23", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 0.000001, + "cache_read_input_token_cost_priority": 0.000001, + "cache_read_input_token_cost_above_272k_tokens_priority": 0.000002, + "input_cost_per_token_above_272k_tokens": 0.00001, + "input_cost_per_token_priority": 0.00001, + "input_cost_per_token_above_272k_tokens_priority": 0.00002, + "output_cost_per_token_above_272k_tokens": 0.000045, + "output_cost_per_token_priority": 0.00006, + "output_cost_per_token_above_272k_tokens_priority": 0.00009 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.5-2026-04-23", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 0.000001, + "cache_read_input_token_cost_flex": 2.5e-7, + "cache_read_input_token_cost_priority": 0.000001, + "input_cost_per_token_above_272k_tokens": 0.00001, + "input_cost_per_token_flex": 0.0000025, + "input_cost_per_token_batches": 0.0000025, + "input_cost_per_token_priority": 0.00001, + "output_cost_per_token_above_272k_tokens": 0.000045, + "output_cost_per_token_flex": 0.000015, + "output_cost_per_token_batches": 0.000015, + "output_cost_per_token_priority": 0.00006 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.5-2026-04-23", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.5-2026-04-23", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/gpt-5.5-instant", + "provider": "openai", + "model": "gpt-5.5-instant", + "displayName": "GPT-5.5 Instant", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/openai/gpt-5.5-instant" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5.5-instant", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.5 Instant" + ], + "knowledgeCutoff": "2025-12-01", + "releaseDate": "2026-05-05", + "lastUpdated": "2026-05-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5.5-instant", + "modelKey": "openai/gpt-5.5-instant", + "displayName": "GPT-5.5 Instant", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-05-28", + "openWeights": false, + "releaseDate": "2026-05-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "openai/gpt-5.5-pro", + "provider": "openai", + "model": "gpt-5.5-pro", + "displayName": "GPT-5.5 Pro", + "family": "gpt-pro", + "mode": "responses", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "fastrouter", + "kilo", + "llmgateway", + "openai", + "opencode", + "openrouter", + "orcarouter", + "poe", + "vercel", + "zenmux" + ], + "aliases": [ + "azure/gpt-5.5-pro", + "fastrouter/openai/gpt-5.5-pro", + "kilo/openai/gpt-5.5-pro", + "llmgateway/gpt-5.5-pro", + "openai/gpt-5.5-pro", + "opencode/gpt-5.5-pro", + "openrouter/openai/gpt-5.5-pro", + "orcarouter/openai/gpt-5.5-pro", + "poe/openai/gpt-5.5-pro", + "vercel/openai/gpt-5.5-pro", + "zenmux/openai/gpt-5.5-pro" + ], + "mergedProviderModelRecords": 11, + "limits": { + "contextTokens": 1050000, + "inputTokens": 1050000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "lowReasoningEffort": false, + "minimalReasoningEffort": false, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fastrouter", + "model": "openai/gpt-5.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 180 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-5.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 180 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-5.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 180 + }, + "tiered": { + "contextOver200K": { + "input": 60, + "output": 270 + }, + "tiers": [ + { + "input": 60, + "output": 270, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-5.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 180 + }, + "tiered": { + "contextOver200K": { + "input": 60, + "output": 270 + }, + "tiers": [ + { + "input": 60, + "output": 270, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "gpt-5.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 30, + "input": 30, + "output": 180 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-5.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 180 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "openai/gpt-5.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 180 + }, + "tiered": { + "contextOver200K": { + "input": 60, + "output": 270 + }, + "tiers": [ + { + "input": 60, + "output": 270, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-5.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 27.2727, + "output": 163.6364 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-5.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 180 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "openai/gpt-5.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 30, + "output": 180 + }, + "tiered": { + "contextOver200K": { + "input": 60, + "output": 270 + }, + "tiers": [ + { + "input": 60, + "output": 270, + "tier": { + "size": 272000 + } + } + ] + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.5-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 3, + "input": 30, + "output": 180 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 0.000006, + "input_cost_per_token_above_272k_tokens": 0.00006, + "output_cost_per_token_above_272k_tokens": 0.00027 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.5-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 3, + "input": 30, + "output": 180 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 0.000006, + "input_cost_per_token_above_272k_tokens": 0.00006, + "input_cost_per_token_flex": 0.000015, + "input_cost_per_token_batches": 0.000015, + "output_cost_per_token_above_272k_tokens": 0.00027, + "output_cost_per_token_flex": 0.00009, + "output_cost_per_token_batches": 0.00009 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-5.5-pro", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 30, + "output": 180 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT 5.5 Pro", + "GPT-5.5 Pro", + "GPT-5.5-Pro", + "OpenAI: GPT-5.5 Pro" + ], + "families": [ + "gpt", + "gpt-pro" + ], + "modes": [ + "responses" + ], + "knowledgeCutoff": "2025-12-01", + "releaseDate": "2026-04-23", + "lastUpdated": "2026-04-23", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ], + "providerModelRecordCount": 11 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "openai/gpt-5.5-pro", + "modelKey": "openai/gpt-5.5-pro", + "displayName": "GPT-5.5 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-5.5-pro", + "modelKey": "openai/gpt-5.5-pro", + "displayName": "OpenAI: GPT-5.5 Pro", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-5.5-pro", + "modelKey": "gpt-5.5-pro", + "displayName": "GPT-5.5 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-5.5-pro", + "modelKey": "gpt-5.5-pro", + "displayName": "GPT-5.5 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "gpt-5.5-pro", + "modelKey": "gpt-5.5-pro", + "displayName": "GPT-5.5 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-24", + "openWeights": false, + "releaseDate": "2026-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-5.5-pro", + "modelKey": "openai/gpt-5.5-pro", + "displayName": "GPT-5.5 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "openai/gpt-5.5-pro", + "modelKey": "openai/gpt-5.5-pro", + "displayName": "GPT-5.5 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-5.5-pro", + "modelKey": "openai/gpt-5.5-pro", + "displayName": "GPT-5.5-Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-08", + "openWeights": false, + "releaseDate": "2026-04-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-5.5-pro", + "modelKey": "openai/gpt-5.5-pro", + "displayName": "GPT 5.5 Pro", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "openai/gpt-5.5-pro", + "modelKey": "openai/gpt-5.5-pro", + "displayName": "GPT-5.5 Pro", + "family": "gpt-pro", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.5-pro", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.5-pro", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses", + "/v1/batch" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-5.5-pro", + "displayName": "OpenAI: GPT-5.5 Pro", + "metadata": { + "canonicalSlug": "openai/gpt-5.5-pro-20260423", + "createdAt": "2026-04-24T17:31:36.000Z", + "knowledgeCutoff": "2025-12-01", + "links": { + "details": "/api/v1/models/openai/gpt-5.5-pro-20260423/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "xhigh", + "high", + "medium" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 1050000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-5.5-pro-2026-04-23", + "provider": "openai", + "model": "gpt-5.5-pro-2026-04-23", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-5.5-pro-2026-04-23", + "openai/gpt-5.5-pro-2026-04-23" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1050000, + "inputTokens": 1050000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "lowReasoningEffort": false, + "minimalReasoningEffort": false, + "moderation": false, + "nativeStreaming": true, + "noneReasoningEffort": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": false, + "serviceTier": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "xhighReasoningEffort": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-5.5-pro-2026-04-23", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 3, + "input": 30, + "output": 180 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 0.000006, + "input_cost_per_token_above_272k_tokens": 0.00006, + "output_cost_per_token_above_272k_tokens": 0.00027 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-5.5-pro-2026-04-23", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 3, + "input": 30, + "output": 180 + }, + "extra": { + "cache_read_input_token_cost_above_272k_tokens": 0.000006, + "input_cost_per_token_above_272k_tokens": 0.00006, + "input_cost_per_token_flex": 0.000015, + "input_cost_per_token_batches": 0.000015, + "output_cost_per_token_above_272k_tokens": 0.00027, + "output_cost_per_token_flex": 0.00009, + "output_cost_per_token_batches": 0.00009 + } + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-5.5-pro-2026-04-23", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-5.5-pro-2026-04-23", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses", + "/v1/batch" + ] + } + } + ] + }, + { + "id": "openai/gpt-audio", + "provider": "openai", + "model": "gpt-audio", + "displayName": "OpenAI: GPT Audio", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openai", + "openrouter" + ], + "aliases": [ + "kilo/openai/gpt-audio", + "openai/gpt-audio", + "openrouter/openai/gpt-audio" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": false, + "reasoning": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false, + "attachments": true, + "openWeights": false, + "temperature": true, + "toolCalling": true, + "structuredOutput": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-audio", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-audio", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-audio", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "inputAudio": 32, + "output": 10, + "outputAudio": 64 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-audio", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + }, + "other": { + "audio": 0.000032 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT Audio", + "OpenAI: GPT Audio" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-01-20", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/realtime", + "/v1/responses" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-audio", + "modelKey": "openai/gpt-audio", + "displayName": "OpenAI: GPT Audio", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-audio", + "modelKey": "openai/gpt-audio", + "displayName": "GPT Audio", + "family": "gpt", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": false, + "releaseDate": "2026-01-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-audio", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses", + "/v1/realtime", + "/v1/batch" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-audio", + "displayName": "OpenAI: GPT Audio", + "metadata": { + "canonicalSlug": "openai/gpt-audio", + "createdAt": "2026-01-19T22:42:49.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-audio/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-audio-1.5", + "provider": "openai", + "model": "gpt-audio-1.5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-audio-1.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": false, + "reasoning": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-audio-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "inputAudio": 32, + "output": 10, + "outputAudio": 64 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-audio-1.5", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + } + ] + }, + { + "id": "openai/gpt-audio-1.5-2026-02-23", + "provider": "openai", + "model": "gpt-audio-1.5-2026-02-23", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/gpt-audio-1.5-2026-02-23" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": false, + "reasoning": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-audio-1.5-2026-02-23", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "inputAudio": 40, + "output": 10, + "outputAudio": 80 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/chat/completions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-audio-1.5-2026-02-23", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + } + ] + }, + { + "id": "openai/gpt-audio-2025-08-28", + "provider": "openai", + "model": "gpt-audio-2025-08-28", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-audio-2025-08-28", + "openai/gpt-audio-2025-08-28" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": false, + "reasoning": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-audio-2025-08-28", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "inputAudio": 40, + "output": 10, + "outputAudio": 80 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-audio-2025-08-28", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "inputAudio": 32, + "output": 10, + "outputAudio": 64 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/realtime", + "/v1/responses" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-audio-2025-08-28", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-audio-2025-08-28", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses", + "/v1/realtime", + "/v1/batch" + ] + } + } + ] + }, + { + "id": "openai/gpt-audio-mini", + "provider": "openai", + "model": "gpt-audio-mini", + "displayName": "OpenAI: GPT Audio Mini", + "family": "o-mini", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openai", + "openrouter" + ], + "aliases": [ + "kilo/openai/gpt-audio-mini", + "openai/gpt-audio-mini", + "openrouter/openai/gpt-audio-mini" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": false, + "reasoning": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false, + "attachments": true, + "openWeights": false, + "temperature": true, + "toolCalling": true, + "structuredOutput": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-audio-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-audio-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.4 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-audio-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "inputAudio": 10, + "output": 2.4, + "outputAudio": 20 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-audio-mini", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.4 + }, + "other": { + "audio": 6e-7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT Audio Mini", + "OpenAI: GPT Audio Mini" + ], + "families": [ + "o-mini" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-01-20", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/realtime", + "/v1/responses" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-audio-mini", + "modelKey": "openai/gpt-audio-mini", + "displayName": "OpenAI: GPT Audio Mini", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-audio-mini", + "modelKey": "openai/gpt-audio-mini", + "displayName": "GPT Audio Mini", + "family": "o-mini", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": false, + "releaseDate": "2026-01-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-audio-mini", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses", + "/v1/realtime", + "/v1/batch" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-audio-mini", + "displayName": "OpenAI: GPT Audio Mini", + "metadata": { + "canonicalSlug": "openai/gpt-audio-mini", + "createdAt": "2026-01-19T21:50:19.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-audio-mini/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-audio-mini-2025-10-06", + "provider": "openai", + "model": "gpt-audio-mini-2025-10-06", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-audio-mini-2025-10-06", + "openai/gpt-audio-mini-2025-10-06" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": false, + "reasoning": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-audio-mini-2025-10-06", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "inputAudio": 10, + "output": 2.4, + "outputAudio": 20 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-audio-mini-2025-10-06", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "inputAudio": 10, + "output": 2.4, + "outputAudio": 20 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/realtime", + "/v1/responses" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-audio-mini-2025-10-06", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-audio-mini-2025-10-06", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses", + "/v1/realtime", + "/v1/batch" + ] + } + } + ] + }, + { + "id": "openai/gpt-audio-mini-2025-12-15", + "provider": "openai", + "model": "gpt-audio-mini-2025-12-15", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-audio-mini-2025-12-15" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": false, + "reasoning": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-audio-mini-2025-12-15", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "inputAudio": 10, + "output": 2.4, + "outputAudio": 20 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/realtime", + "/v1/responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-audio-mini-2025-12-15", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/responses", + "/v1/realtime", + "/v1/batch" + ] + } + } + ] + }, + { + "id": "openai/gpt-chat-latest", + "provider": "openai", + "model": "gpt-chat-latest", + "displayName": "OpenAI: GPT Chat Latest", + "family": "gpt", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "kilo/openai/gpt-chat-latest", + "nano-gpt/openai/gpt-chat-latest", + "openrouter/openai/gpt-chat-latest" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 400000, + "inputTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-chat-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-chat-latest", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT Chat Latest", + "OpenAI: GPT Chat Latest" + ], + "families": [ + "gpt" + ], + "releaseDate": "2026-05-05", + "lastUpdated": "2026-05-07", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "tool_choice", + "tools", + "top_logprobs" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-chat-latest", + "modelKey": "openai/gpt-chat-latest", + "displayName": "OpenAI: GPT Chat Latest", + "metadata": { + "lastUpdated": "2026-05-07", + "openWeights": false, + "releaseDate": "2026-05-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-chat-latest", + "modelKey": "openai/gpt-chat-latest", + "displayName": "GPT Chat Latest", + "metadata": { + "lastUpdated": "2026-05-03", + "openWeights": false, + "releaseDate": "2026-05-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-chat-latest", + "modelKey": "openai/gpt-chat-latest", + "displayName": "GPT Chat Latest", + "family": "gpt", + "metadata": { + "lastUpdated": "2026-05-05", + "openWeights": false, + "releaseDate": "2026-05-05" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-chat-latest", + "displayName": "OpenAI: GPT Chat Latest", + "metadata": { + "canonicalSlug": "openai/gpt-chat-latest-20260505", + "createdAt": "2026-05-05T16:56:52.000Z", + "links": { + "details": "/api/v1/models/openai/gpt-chat-latest-20260505/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "tool_choice", + "tools", + "top_logprobs" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-image-1", + "provider": "openai", + "model": "gpt-image-1", + "displayName": "gpt-image-1", + "family": "gpt-image", + "mode": "image_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "openai", + "poe", + "vercel" + ], + "aliases": [ + "azure/gpt-image-1", + "azure/high/1024-x-1024/gpt-image-1", + "azure/high/1024-x-1536/gpt-image-1", + "azure/high/1536-x-1024/gpt-image-1", + "azure/low/1024-x-1024/gpt-image-1", + "azure/low/1024-x-1536/gpt-image-1", + "azure/low/1536-x-1024/gpt-image-1", + "azure/medium/1024-x-1024/gpt-image-1", + "azure/medium/1024-x-1536/gpt-image-1", + "azure/medium/1536-x-1024/gpt-image-1", + "openai/gpt-image-1", + "openai/high/1024-x-1024/gpt-image-1", + "openai/high/1024-x-1536/gpt-image-1", + "openai/high/1536-x-1024/gpt-image-1", + "openai/low/1024-x-1024/gpt-image-1", + "openai/low/1024-x-1536/gpt-image-1", + "openai/low/1536-x-1024/gpt-image-1", + "openai/medium/1024-x-1024/gpt-image-1", + "openai/medium/1024-x-1536/gpt-image-1", + "openai/medium/1536-x-1024/gpt-image-1", + "poe/openai/gpt-image-1", + "vercel/openai/gpt-image-1" + ], + "mergedProviderModelRecords": 22, + "limits": { + "contextTokens": 128000, + "inputTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": true, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-image-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "output": 40 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-image-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "output": 40 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "inputImage": 10, + "outputImage": 40 + }, + "extra": { + "cache_read_input_image_token_cost": 0.0000025 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/high/1024-x-1024/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 1.59263611e-7, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/high/1024-x-1536/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 1.58945719e-7, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/high/1536-x-1024/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 1.58945719e-7, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/low/1024-x-1024/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 1.0490417e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/low/1024-x-1536/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 1.0172526e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/low/1536-x-1024/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 1.0172526e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/medium/1024-x-1024/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 4.0054321e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/medium/1024-x-1536/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 4.0054321e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/medium/1536-x-1024/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 4.0054321e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "inputImage": 10, + "outputImage": 40 + }, + "extra": { + "cache_read_input_image_token_cost": 0.0000025 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "high/1024-x-1024/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.167 + }, + "perPixel": { + "input": 1.59263611e-7, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "high/1024-x-1536/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.25 + }, + "perPixel": { + "input": 1.58945719e-7, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "high/1536-x-1024/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.25 + }, + "perPixel": { + "input": 1.58945719e-7, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "low/1024-x-1024/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.011 + }, + "perPixel": { + "input": 1.0490417e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "low/1024-x-1536/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.016 + }, + "perPixel": { + "input": 1.0172526e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "low/1536-x-1024/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.016 + }, + "perPixel": { + "input": 1.0172526e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "medium/1024-x-1024/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.042 + }, + "perPixel": { + "input": 4.0054321e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "medium/1024-x-1536/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.063 + }, + "perPixel": { + "input": 4.0054321e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "medium/1536-x-1024/gpt-image-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.063 + }, + "perPixel": { + "input": 4.0054321e-8, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT Image 1", + "GPT-Image-1", + "gpt-image-1" + ], + "families": [ + "gpt", + "gpt-image" + ], + "modes": [ + "image_generation" + ], + "releaseDate": "2025-04-24", + "lastUpdated": "2025-04-24", + "supportedEndpoints": [ + "/v1/images/edits", + "/v1/images/generations" + ], + "providerModelRecordCount": 22 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-image-1", + "modelKey": "gpt-image-1", + "displayName": "GPT-Image-1", + "family": "gpt-image", + "metadata": { + "lastUpdated": "2025-04-24", + "openWeights": false, + "releaseDate": "2025-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-image-1", + "modelKey": "gpt-image-1", + "displayName": "gpt-image-1", + "family": "gpt-image", + "metadata": { + "lastUpdated": "2025-04-24", + "openWeights": false, + "releaseDate": "2025-04-24" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-image-1", + "modelKey": "openai/gpt-image-1", + "displayName": "GPT-Image-1", + "family": "gpt", + "metadata": { + "lastUpdated": "2025-03-31", + "openWeights": false, + "releaseDate": "2025-03-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-image-1", + "modelKey": "openai/gpt-image-1", + "displayName": "GPT Image 1", + "family": "gpt-image", + "metadata": { + "lastUpdated": "2025-04-24", + "openWeights": false, + "releaseDate": "2025-03-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/high/1024-x-1024/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/high/1024-x-1536/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/high/1536-x-1024/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/low/1024-x-1024/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/low/1024-x-1536/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/low/1536-x-1024/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/medium/1024-x-1024/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/medium/1024-x-1536/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/medium/1536-x-1024/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "high/1024-x-1024/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "high/1024-x-1536/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "high/1536-x-1024/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "low/1024-x-1024/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "low/1024-x-1536/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "low/1536-x-1024/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "medium/1024-x-1024/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "medium/1024-x-1536/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "medium/1536-x-1024/gpt-image-1", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "openai/gpt-image-1-mini", + "provider": "openai", + "model": "gpt-image-1-mini", + "displayName": "gpt-image-1-mini", + "family": "gpt-image", + "mode": "image_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "openai", + "poe", + "vercel" + ], + "aliases": [ + "azure/gpt-image-1-mini", + "azure/high/1024-x-1024/gpt-image-1-mini", + "azure/high/1024-x-1536/gpt-image-1-mini", + "azure/high/1536-x-1024/gpt-image-1-mini", + "azure/low/1024-x-1024/gpt-image-1-mini", + "azure/low/1024-x-1536/gpt-image-1-mini", + "azure/low/1536-x-1024/gpt-image-1-mini", + "azure/medium/1024-x-1024/gpt-image-1-mini", + "azure/medium/1024-x-1536/gpt-image-1-mini", + "azure/medium/1536-x-1024/gpt-image-1-mini", + "openai/gpt-image-1-mini", + "openai/low/1024-x-1024/gpt-image-1-mini", + "openai/low/1024-x-1536/gpt-image-1-mini", + "openai/low/1536-x-1024/gpt-image-1-mini", + "openai/medium/1024-x-1024/gpt-image-1-mini", + "openai/medium/1024-x-1536/gpt-image-1-mini", + "openai/medium/1536-x-1024/gpt-image-1-mini", + "poe/openai/gpt-image-1-mini", + "vercel/openai/gpt-image-1-mini" + ], + "mergedProviderModelRecords": 19, + "limits": { + "contextTokens": 0, + "inputTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": true, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-image-1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 8 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-image-1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "inputImage": 2.5, + "outputImage": 8 + }, + "extra": { + "cache_read_input_image_token_cost": 2.5e-7 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/high/1024-x-1024/gpt-image-1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 3.173828125e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/high/1024-x-1536/gpt-image-1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 3.173828125e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/high/1536-x-1024/gpt-image-1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 3.1575520833e-8, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/low/1024-x-1024/gpt-image-1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 2.0751953125e-9, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/low/1024-x-1536/gpt-image-1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 2.0751953125e-9, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/low/1536-x-1024/gpt-image-1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 2.0345052083e-9, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/medium/1024-x-1024/gpt-image-1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 8.056640625e-9, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/medium/1024-x-1536/gpt-image-1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 8.056640625e-9, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/medium/1536-x-1024/gpt-image-1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perPixel": { + "input": 7.9752604167e-9, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-image-1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "inputImage": 2.5, + "outputImage": 8 + }, + "extra": { + "cache_read_input_image_token_cost": 2.5e-7 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "low/1024-x-1024/gpt-image-1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.005 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "low/1024-x-1536/gpt-image-1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.006 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "low/1536-x-1024/gpt-image-1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.006 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "medium/1024-x-1024/gpt-image-1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.011 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "medium/1024-x-1536/gpt-image-1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.015 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "medium/1536-x-1024/gpt-image-1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.015 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT Image 1 Mini", + "GPT-Image-1-Mini", + "gpt-image-1-mini" + ], + "families": [ + "gpt", + "gpt-image" + ], + "modes": [ + "image_generation" + ], + "releaseDate": "2025-09-26", + "lastUpdated": "2025-09-26", + "supportedEndpoints": [ + "/v1/images/edits", + "/v1/images/generations" + ], + "providerModelRecordCount": 19 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-image-1-mini", + "modelKey": "gpt-image-1-mini", + "displayName": "gpt-image-1-mini", + "family": "gpt-image", + "metadata": { + "lastUpdated": "2025-09-26", + "openWeights": false, + "releaseDate": "2025-09-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-image-1-mini", + "modelKey": "openai/gpt-image-1-mini", + "displayName": "GPT-Image-1-Mini", + "family": "gpt", + "metadata": { + "lastUpdated": "2025-08-26", + "openWeights": false, + "releaseDate": "2025-08-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-image-1-mini", + "modelKey": "openai/gpt-image-1-mini", + "displayName": "GPT Image 1 Mini", + "family": "gpt-image", + "metadata": { + "lastUpdated": "2025-10-06", + "openWeights": false, + "releaseDate": "2025-10-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-image-1-mini", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/high/1024-x-1024/gpt-image-1-mini", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/high/1024-x-1536/gpt-image-1-mini", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/high/1536-x-1024/gpt-image-1-mini", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/low/1024-x-1024/gpt-image-1-mini", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/low/1024-x-1536/gpt-image-1-mini", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/low/1536-x-1024/gpt-image-1-mini", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/medium/1024-x-1024/gpt-image-1-mini", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/medium/1024-x-1536/gpt-image-1-mini", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/medium/1536-x-1024/gpt-image-1-mini", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-image-1-mini", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "low/1024-x-1024/gpt-image-1-mini", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "low/1024-x-1536/gpt-image-1-mini", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "low/1536-x-1024/gpt-image-1-mini", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "medium/1024-x-1024/gpt-image-1-mini", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "medium/1024-x-1536/gpt-image-1-mini", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "medium/1536-x-1024/gpt-image-1-mini", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "openai/gpt-image-1.5", + "provider": "openai", + "model": "gpt-image-1.5", + "displayName": "gpt-image-1.5", + "family": "gpt-image", + "mode": "image_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "openai", + "poe", + "vercel" + ], + "aliases": [ + "azure/gpt-image-1.5", + "openai/1024-x-1024/gpt-image-1.5", + "openai/1024-x-1536/gpt-image-1.5", + "openai/1536-x-1024/gpt-image-1.5", + "openai/gpt-image-1.5", + "openai/high/1024-x-1024/gpt-image-1.5", + "openai/high/1024-x-1536/gpt-image-1.5", + "openai/high/1536-x-1024/gpt-image-1.5", + "openai/low/1024-x-1024/gpt-image-1.5", + "openai/low/1024-x-1536/gpt-image-1.5", + "openai/low/1536-x-1024/gpt-image-1.5", + "openai/medium/1024-x-1024/gpt-image-1.5", + "openai/medium/1024-x-1536/gpt-image-1.5", + "openai/medium/1536-x-1024/gpt-image-1.5", + "openai/standard/1024-x-1024/gpt-image-1.5", + "openai/standard/1024-x-1536/gpt-image-1.5", + "openai/standard/1536-x-1024/gpt-image-1.5", + "poe/openai/gpt-image-1.5", + "vercel/openai/gpt-image-1.5" + ], + "mergedProviderModelRecords": 19, + "limits": { + "contextTokens": 128000, + "inputTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "embedding": false, + "imageGeneration": true, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-image-1.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "output": 32 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-image-1.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "output": 32 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-image-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "inputImage": 8, + "outputImage": 32 + }, + "extra": { + "cache_read_input_image_token_cost": 0.000002 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "1024-x-1024/gpt-image-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.009 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "1024-x-1536/gpt-image-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.013 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "1536-x-1024/gpt-image-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.013 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-image-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "inputImage": 8, + "output": 10, + "outputImage": 32 + }, + "extra": { + "cache_read_input_image_token_cost": 0.000002 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "high/1024-x-1024/gpt-image-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.133 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "high/1024-x-1536/gpt-image-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.2 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "high/1536-x-1024/gpt-image-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.2 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "low/1024-x-1024/gpt-image-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.009 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "low/1024-x-1536/gpt-image-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.013 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "low/1536-x-1024/gpt-image-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.013 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "medium/1024-x-1024/gpt-image-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.034 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "medium/1024-x-1536/gpt-image-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.05 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "medium/1536-x-1024/gpt-image-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.05 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "standard/1024-x-1024/gpt-image-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.009 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "standard/1024-x-1536/gpt-image-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.013 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "standard/1536-x-1024/gpt-image-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.013 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT Image 1.5", + "GPT-Image-1.5", + "gpt-image-1.5" + ], + "families": [ + "gpt-image" + ], + "modes": [ + "image_generation" + ], + "releaseDate": "2025-11-25", + "lastUpdated": "2025-11-25", + "supportedEndpoints": [ + "/v1/images/edits", + "/v1/images/generations" + ], + "providerModelRecordCount": 19 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-image-1.5", + "modelKey": "gpt-image-1.5", + "displayName": "GPT-Image-1.5", + "family": "gpt-image", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-11-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-image-1.5", + "modelKey": "gpt-image-1.5", + "displayName": "gpt-image-1.5", + "family": "gpt-image", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-11-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-image-1.5", + "modelKey": "openai/gpt-image-1.5", + "displayName": "gpt-image-1.5", + "metadata": { + "lastUpdated": "2025-12-16", + "openWeights": false, + "releaseDate": "2025-12-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-image-1.5", + "modelKey": "openai/gpt-image-1.5", + "displayName": "GPT Image 1.5", + "family": "gpt-image", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-12-16" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-image-1.5", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "1024-x-1024/gpt-image-1.5", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "1024-x-1536/gpt-image-1.5", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "1536-x-1024/gpt-image-1.5", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-image-1.5", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "high/1024-x-1024/gpt-image-1.5", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "high/1024-x-1536/gpt-image-1.5", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "high/1536-x-1024/gpt-image-1.5", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "low/1024-x-1024/gpt-image-1.5", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "low/1024-x-1536/gpt-image-1.5", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "low/1536-x-1024/gpt-image-1.5", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "medium/1024-x-1024/gpt-image-1.5", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "medium/1024-x-1536/gpt-image-1.5", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "medium/1536-x-1024/gpt-image-1.5", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "standard/1024-x-1024/gpt-image-1.5", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "standard/1024-x-1536/gpt-image-1.5", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "standard/1536-x-1024/gpt-image-1.5", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "openai/gpt-image-1.5-2025-12-16", + "provider": "openai", + "model": "gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-image-1.5-2025-12-16", + "openai/1024-x-1024/gpt-image-1.5-2025-12-16", + "openai/1024-x-1536/gpt-image-1.5-2025-12-16", + "openai/1536-x-1024/gpt-image-1.5-2025-12-16", + "openai/gpt-image-1.5-2025-12-16", + "openai/high/1024-x-1024/gpt-image-1.5-2025-12-16", + "openai/high/1024-x-1536/gpt-image-1.5-2025-12-16", + "openai/high/1536-x-1024/gpt-image-1.5-2025-12-16", + "openai/low/1024-x-1024/gpt-image-1.5-2025-12-16", + "openai/low/1024-x-1536/gpt-image-1.5-2025-12-16", + "openai/low/1536-x-1024/gpt-image-1.5-2025-12-16", + "openai/medium/1024-x-1024/gpt-image-1.5-2025-12-16", + "openai/medium/1024-x-1536/gpt-image-1.5-2025-12-16", + "openai/medium/1536-x-1024/gpt-image-1.5-2025-12-16", + "openai/standard/1024-x-1024/gpt-image-1.5-2025-12-16", + "openai/standard/1024-x-1536/gpt-image-1.5-2025-12-16", + "openai/standard/1536-x-1024/gpt-image-1.5-2025-12-16" + ], + "mergedProviderModelRecords": 17, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": true, + "imageOutput": true, + "moderation": false, + "pdfInput": true, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-image-1.5-2025-12-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "inputImage": 8, + "outputImage": 32 + }, + "extra": { + "cache_read_input_image_token_cost": 0.000002 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "1024-x-1024/gpt-image-1.5-2025-12-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.009 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "1024-x-1536/gpt-image-1.5-2025-12-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.013 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "1536-x-1024/gpt-image-1.5-2025-12-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.013 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-image-1.5-2025-12-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "inputImage": 8, + "output": 10, + "outputImage": 32 + }, + "extra": { + "cache_read_input_image_token_cost": 0.000002 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "high/1024-x-1024/gpt-image-1.5-2025-12-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.133 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "high/1024-x-1536/gpt-image-1.5-2025-12-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.2 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "high/1536-x-1024/gpt-image-1.5-2025-12-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.2 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "low/1024-x-1024/gpt-image-1.5-2025-12-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.009 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "low/1024-x-1536/gpt-image-1.5-2025-12-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.013 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "low/1536-x-1024/gpt-image-1.5-2025-12-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.013 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "medium/1024-x-1024/gpt-image-1.5-2025-12-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.034 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "medium/1024-x-1536/gpt-image-1.5-2025-12-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.05 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "medium/1536-x-1024/gpt-image-1.5-2025-12-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.05 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "standard/1024-x-1024/gpt-image-1.5-2025-12-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.009 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "standard/1024-x-1536/gpt-image-1.5-2025-12-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.013 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "standard/1536-x-1024/gpt-image-1.5-2025-12-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.013 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/edits", + "/v1/images/generations" + ], + "providerModelRecordCount": 17 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "1024-x-1024/gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "1024-x-1536/gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "1536-x-1024/gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "high/1024-x-1024/gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "high/1024-x-1536/gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "high/1536-x-1024/gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "low/1024-x-1024/gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "low/1024-x-1536/gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "low/1536-x-1024/gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "medium/1024-x-1024/gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "medium/1024-x-1536/gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "medium/1536-x-1024/gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "standard/1024-x-1024/gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "standard/1024-x-1536/gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "standard/1536-x-1024/gpt-image-1.5-2025-12-16", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "openai/gpt-image-2", + "provider": "openai", + "model": "gpt-image-2", + "displayName": "gpt-image-2", + "family": "gpt-image", + "mode": "image_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "fastrouter", + "openai", + "poe", + "vercel" + ], + "aliases": [ + "azure/gpt-image-2", + "fastrouter/openai/gpt-image-2", + "openai/gpt-image-2", + "poe/openai/gpt-image-2", + "vercel/openai/gpt-image-2" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 128000, + "inputTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "embedding": false, + "imageGeneration": true, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "gpt-image-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "gpt-image-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/gpt-image-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.2626, + "input": 5.0505, + "output": 32.3232 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-image-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "output": 30 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-image-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "inputImage": 8, + "output": 10, + "outputImage": 30 + }, + "extra": { + "cache_read_input_image_token_cost": 0.000002 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-image-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "inputImage": 8, + "output": 10, + "outputImage": 30 + }, + "extra": { + "cache_read_input_image_token_cost": 0.000002 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT Image 2", + "GPT-Image-2", + "gpt-image-2" + ], + "families": [ + "gpt-image" + ], + "modes": [ + "image_generation" + ], + "releaseDate": "2026-04-21", + "lastUpdated": "2026-04-21", + "supportedEndpoints": [ + "/v1/images/edits", + "/v1/images/generations" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "gpt-image-2", + "modelKey": "gpt-image-2", + "displayName": "GPT-Image-2", + "family": "gpt-image", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": false, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "openai/gpt-image-2", + "modelKey": "openai/gpt-image-2", + "displayName": "GPT Image 2", + "family": "gpt-image", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": false, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "gpt-image-2", + "modelKey": "gpt-image-2", + "displayName": "gpt-image-2", + "family": "gpt-image", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": false, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/gpt-image-2", + "modelKey": "openai/gpt-image-2", + "displayName": "GPT-Image-2", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": false, + "releaseDate": "2026-04-21" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-image-2", + "modelKey": "openai/gpt-image-2", + "displayName": "GPT Image 2", + "family": "gpt-image", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": false, + "releaseDate": "2026-04-21" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-image-2", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-image-2", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "openai/gpt-image-2-2026-04-21", + "provider": "openai", + "model": "gpt-image-2-2026-04-21", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-image-2-2026-04-21", + "openai/gpt-image-2-2026-04-21" + ], + "mergedProviderModelRecords": 2, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": true, + "imageOutput": true, + "moderation": false, + "pdfInput": true, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-image-2-2026-04-21", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "inputImage": 8, + "output": 10, + "outputImage": 30 + }, + "extra": { + "cache_read_input_image_token_cost": 0.000002 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-image-2-2026-04-21", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "inputImage": 8, + "output": 10, + "outputImage": 30 + }, + "extra": { + "cache_read_input_image_token_cost": 0.000002 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/edits", + "/v1/images/generations" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-image-2-2026-04-21", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-image-2-2026-04-21", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations", + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "openai/gpt-latest", + "provider": "openai", + "model": "gpt-latest", + "displayName": "OpenAI: GPT Latest", + "family": "gpt", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "kilo/~openai/gpt-latest", + "nano-gpt/openai/gpt-latest", + "openrouter/~openai/gpt-latest" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1050000, + "inputTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "~openai/gpt-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "~openai/gpt-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "~openai/gpt-latest", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 5, + "output": 30 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT Latest", + "OpenAI GPT Latest", + "OpenAI: GPT Latest" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-12-01", + "releaseDate": "2026-04-27", + "lastUpdated": "2026-05-01", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "~openai/gpt-latest", + "modelKey": "~openai/gpt-latest", + "displayName": "OpenAI: GPT Latest", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-latest", + "modelKey": "openai/gpt-latest", + "displayName": "GPT Latest", + "metadata": { + "lastUpdated": "2026-03-29", + "openWeights": false, + "releaseDate": "2026-03-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "~openai/gpt-latest", + "modelKey": "~openai/gpt-latest", + "displayName": "OpenAI GPT Latest", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-27", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "~openai/gpt-latest", + "displayName": "OpenAI GPT Latest", + "metadata": { + "canonicalSlug": "~openai/gpt-latest", + "createdAt": "2026-04-27T19:32:14.000Z", + "knowledgeCutoff": "2025-12-01", + "links": { + "details": "/api/v1/models/~openai/gpt-latest/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true, + "supported_efforts": [ + "xhigh", + "high", + "medium", + "low", + "none" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "Router", + "topProvider": { + "context_length": 1050000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-mini-latest", + "provider": "openai", + "model": "gpt-mini-latest", + "displayName": "OpenAI: GPT Mini Latest", + "family": "gpt-mini", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/~openai/gpt-mini-latest", + "openrouter/~openai/gpt-mini-latest" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 400000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "~openai/gpt-mini-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "~openai/gpt-mini-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "~openai/gpt-mini-latest", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.75, + "output": 4.5 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI GPT Mini Latest", + "OpenAI: GPT Mini Latest" + ], + "families": [ + "gpt-mini" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-04-27", + "lastUpdated": "2026-05-01", + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "~openai/gpt-mini-latest", + "modelKey": "~openai/gpt-mini-latest", + "displayName": "OpenAI: GPT Mini Latest", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "~openai/gpt-mini-latest", + "modelKey": "~openai/gpt-mini-latest", + "displayName": "OpenAI GPT Mini Latest", + "family": "gpt-mini", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-04-27", + "openWeights": false, + "releaseDate": "2026-04-27", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "~openai/gpt-mini-latest", + "displayName": "OpenAI GPT Mini Latest", + "metadata": { + "canonicalSlug": "~openai/gpt-mini-latest", + "createdAt": "2026-04-27T19:34:31.000Z", + "knowledgeCutoff": "2025-08-31", + "links": { + "details": "/api/v1/models/~openai/gpt-mini-latest/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": false, + "supported_efforts": [ + "xhigh", + "high", + "medium", + "low", + "none" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "Router", + "topProvider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-oss-120b", + "provider": "openai", + "model": "gpt-oss-120b", + "displayName": "OpenAI GPT 120B", + "family": "gpt-oss", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "azure_ai", + "baseten", + "berget", + "cerebras", + "cloudferro-sherlock", + "cloudflare-ai-gateway", + "cloudflare-workers-ai", + "cortecs", + "crusoe", + "deepinfra", + "dinference", + "evroc", + "fastrouter", + "fireworks-ai", + "fireworks_ai", + "frogbot", + "groq", + "helicone", + "io-net", + "kilo", + "llmgateway", + "nano-gpt", + "nearai", + "nebius", + "neon", + "novita", + "novita-ai", + "nvidia", + "openrouter", + "ovhcloud", + "privatemode-ai", + "qiniu-ai", + "regolo-ai", + "replicate", + "sambanova", + "scaleway", + "siliconflow", + "stackit", + "submodel", + "synthetic", + "together_ai", + "togetherai", + "vercel", + "wandb", + "watsonx" + ], + "aliases": [ + "abacus/openai/gpt-oss-120b", + "azure_ai/gpt-oss-120b", + "baseten/openai/gpt-oss-120b", + "berget/openai/gpt-oss-120b", + "cerebras/gpt-oss-120b", + "cloudferro-sherlock/openai/gpt-oss-120b", + "cloudflare-ai-gateway/workers-ai/@cf/openai/gpt-oss-120b", + "cloudflare-workers-ai/@cf/openai/gpt-oss-120b", + "cortecs/gpt-oss-120b", + "crusoe/openai/gpt-oss-120b", + "deepinfra/openai/gpt-oss-120b", + "dinference/gpt-oss-120b", + "evroc/openai/gpt-oss-120b", + "fastrouter/openai/gpt-oss-120b", + "fireworks-ai/accounts/fireworks/models/gpt-oss-120b", + "fireworks_ai/accounts/fireworks/models/gpt-oss-120b", + "frogbot/gpt-oss-120b", + "groq/openai/gpt-oss-120b", + "helicone/gpt-oss-120b", + "io-net/openai/gpt-oss-120b", + "kilo/openai/gpt-oss-120b", + "llmgateway/gpt-oss-120b", + "nano-gpt/TEE/gpt-oss-120b", + "nano-gpt/openai/gpt-oss-120b", + "nearai/openai/gpt-oss-120b", + "nebius/openai/gpt-oss-120b", + "neon/gpt-oss-120b", + "novita-ai/openai/gpt-oss-120b", + "novita/openai/gpt-oss-120b", + "nvidia/openai/gpt-oss-120b", + "openrouter/openai/gpt-oss-120b", + "ovhcloud/gpt-oss-120b", + "privatemode-ai/gpt-oss-120b", + "qiniu-ai/gpt-oss-120b", + "regolo-ai/gpt-oss-120b", + "replicate/openai/gpt-oss-120b", + "sambanova/gpt-oss-120b", + "scaleway/gpt-oss-120b", + "siliconflow/openai/gpt-oss-120b", + "stackit/openai/gpt-oss-120b", + "submodel/openai/gpt-oss-120b", + "synthetic/hf:openai/gpt-oss-120b", + "together_ai/openai/gpt-oss-120b", + "togetherai/openai/gpt-oss-120b", + "vercel/openai/gpt-oss-120b", + "wandb/openai/gpt-oss-120b", + "watsonx/openai/gpt-oss-120b" + ], + "mergedProviderModelRecords": 47, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false, + "functionCalling": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": true, + "systemMessages": true, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "output": 0.44 + } + }, + { + "source": "models.dev", + "provider": "baseten", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "berget", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.44, + "output": 0.99 + } + }, + { + "source": "models.dev", + "provider": "cerebras", + "model": "gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.35, + "output": 0.75 + } + }, + { + "source": "models.dev", + "provider": "cloudferro-sherlock", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.92, + "output": 2.92 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.35, + "output": 0.75 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.35, + "output": 0.75 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.039, + "output": 0.19 + } + }, + { + "source": "models.dev", + "provider": "dinference", + "model": "gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0675, + "output": 0.27 + } + }, + { + "source": "models.dev", + "provider": "evroc", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.24, + "output": 0.94 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "fireworks-ai", + "model": "accounts/fireworks/models/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "frogbot", + "model": "gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "groq", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.16 + } + }, + { + "source": "models.dev", + "provider": "io-net", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "cacheWrite": 0.08, + "input": 0.04, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.039, + "output": 0.19 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.25 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.25 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.55 + } + }, + { + "source": "models.dev", + "provider": "nebius", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "cacheWrite": 0.18, + "input": 0.15, + "output": 0.6, + "reasoningOutput": 0.6 + } + }, + { + "source": "models.dev", + "provider": "neon", + "model": "gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.072, + "output": 0.28 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.25 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.039, + "output": 0.18 + } + }, + { + "source": "models.dev", + "provider": "ovhcloud", + "model": "gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.47 + } + }, + { + "source": "models.dev", + "provider": "privatemode-ai", + "model": "gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "regolo-ai", + "model": "gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 4.2 + } + }, + { + "source": "models.dev", + "provider": "scaleway", + "model": "gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.45 + } + }, + { + "source": "models.dev", + "provider": "stackit", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.49, + "output": 0.71 + } + }, + { + "source": "models.dev", + "provider": "submodel", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 0.35, + "output": 0.75 + } + }, + { + "source": "models.dev", + "provider": "wandb", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/gpt-oss-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "baseten", + "model": "baseten/openai/gpt-oss-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "cerebras", + "model": "cerebras/gpt-oss-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.35, + "output": 0.75 + } + }, + { + "source": "litellm", + "provider": "crusoe", + "model": "crusoe/openai/gpt-oss-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 0.8 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/openai/gpt-oss-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.45 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gpt-oss-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "groq", + "model": "groq/openai/gpt-oss-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/openai/gpt-oss-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.25 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-oss-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.18, + "output": 0.8 + } + }, + { + "source": "litellm", + "provider": "ovhcloud", + "model": "ovhcloud/gpt-oss-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.08, + "output": 0.4 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/openai/gpt-oss-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.18, + "output": 0.72 + } + }, + { + "source": "litellm", + "provider": "sambanova", + "model": "sambanova/gpt-oss-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 4.5 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/openai/gpt-oss-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "litellm", + "provider": "wandb", + "model": "wandb/openai/gpt-oss-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 15000, + "output": 60000 + } + }, + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/openai/gpt-oss-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-oss-120b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.039, + "output": 0.18 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT OSS 120B", + "GPT Oss 120b", + "GPT-OSS 120B", + "GPT-OSS 120B TEE", + "GPT-OSS-120B", + "OpenAI GPT 120B", + "OpenAI GPT OSS 120B", + "OpenAI GPT-OSS 120b", + "OpenAI: gpt-oss-120b", + "gpt-oss-120b", + "openai/gpt-oss-120b" + ], + "families": [ + "gpt", + "gpt-oss" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-08", + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 47 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "GPT-OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "baseten", + "providerName": "Baseten", + "providerApi": "https://inference.baseten.co/v1", + "providerDoc": "https://docs.baseten.co/inference/model-apis/overview", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "OpenAI GPT 120B", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2025-08", + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "berget", + "providerName": "Berget.AI", + "providerApi": "https://api.berget.ai/v1", + "providerDoc": "https://api.berget.ai", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "GPT-OSS-120B", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2025-08", + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cerebras", + "providerName": "Cerebras", + "providerDoc": "https://inference-docs.cerebras.ai/models/overview", + "model": "gpt-oss-120b", + "modelKey": "gpt-oss-120b", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2026-06-10", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudferro-sherlock", + "providerName": "CloudFerro Sherlock", + "providerApi": "https://api-sherlock.cloudferro.com/openai/v1/", + "providerDoc": "https://docs.sherlock.cloudferro.com/", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "OpenAI GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-28", + "openWeights": true, + "releaseDate": "2025-08-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/openai/gpt-oss-120b", + "modelKey": "workers-ai/@cf/openai/gpt-oss-120b", + "displayName": "GPT OSS 120B", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/openai/gpt-oss-120b", + "modelKey": "@cf/openai/gpt-oss-120b", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "gpt-oss-120b", + "modelKey": "gpt-oss-120b", + "displayName": "GPT Oss 120b", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2024-01", + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "dinference", + "providerName": "DInference", + "providerApi": "https://api.dinference.com/v1", + "providerDoc": "https://dinference.com", + "model": "gpt-oss-120b", + "modelKey": "gpt-oss-120b", + "displayName": "GPT OSS 120B", + "metadata": { + "lastUpdated": "2025-08", + "openWeights": true, + "releaseDate": "2025-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "evroc", + "providerName": "evroc", + "providerApi": "https://models.think.evroc.com/v1", + "providerDoc": "https://docs.evroc.com/products/think/overview.html", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fireworks-ai", + "providerName": "Fireworks AI", + "providerApi": "https://api.fireworks.ai/inference/v1/", + "providerDoc": "https://fireworks.ai/docs/", + "model": "accounts/fireworks/models/gpt-oss-120b", + "modelKey": "accounts/fireworks/models/gpt-oss-120b", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2026-06-16", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "gpt-oss-120b", + "modelKey": "gpt-oss-120b", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "1970-01-01", + "openWeights": true, + "releaseDate": "1970-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "groq", + "providerName": "Groq", + "providerDoc": "https://console.groq.com/docs/models", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-10-21", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-oss-120b", + "modelKey": "gpt-oss-120b", + "displayName": "OpenAI GPT-OSS 120b", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2024-06-01", + "openWeights": false, + "releaseDate": "2024-06-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "io-net", + "providerName": "IO.NET", + "providerApi": "https://api.intelligence.io.solutions/api/v1", + "providerDoc": "https://io.net/docs/guides/intelligence/io-intelligence", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "GPT-OSS 120B", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-12-01", + "openWeights": true, + "releaseDate": "2024-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "OpenAI: gpt-oss-120b", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-oss-120b", + "modelKey": "gpt-oss-120b", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/gpt-oss-120b", + "modelKey": "TEE/gpt-oss-120b", + "displayName": "GPT-OSS 120B TEE", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "GPT-OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "gpt-oss-120b", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2026-01-10", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "gpt-oss-120b", + "modelKey": "gpt-oss-120b", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "OpenAI GPT OSS 120B", + "metadata": { + "lastUpdated": "2025-08-06", + "openWeights": true, + "releaseDate": "2025-08-06", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "GPT-OSS-120B", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2025-08", + "lastUpdated": "2025-08-14", + "openWeights": true, + "releaseDate": "2025-08-04", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "gpt-oss-120b", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2024-06-30", + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ovhcloud", + "providerName": "OVHcloud AI Endpoints", + "providerApi": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", + "providerDoc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", + "model": "gpt-oss-120b", + "modelKey": "gpt-oss-120b", + "displayName": "gpt-oss-120b", + "metadata": { + "lastUpdated": "2025-08-28", + "openWeights": true, + "releaseDate": "2025-08-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "privatemode-ai", + "providerName": "Privatemode AI", + "providerApi": "http://localhost:8080/v1", + "providerDoc": "https://docs.privatemode.ai/api/overview", + "model": "gpt-oss-120b", + "modelKey": "gpt-oss-120b", + "displayName": "gpt-oss-120b", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2025-08", + "lastUpdated": "2025-08-14", + "openWeights": true, + "releaseDate": "2025-08-04", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "gpt-oss-120b", + "modelKey": "gpt-oss-120b", + "displayName": "gpt-oss-120b", + "metadata": { + "lastUpdated": "2025-08-06", + "openWeights": false, + "releaseDate": "2025-08-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "regolo-ai", + "providerName": "Regolo AI", + "providerApi": "https://api.regolo.ai/v1", + "providerDoc": "https://docs.regolo.ai/", + "model": "gpt-oss-120b", + "modelKey": "gpt-oss-120b", + "displayName": "GPT-OSS-120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "scaleway", + "providerName": "Scaleway", + "providerApi": "https://api.scaleway.ai/v1", + "providerDoc": "https://www.scaleway.com/en/docs/generative-apis/", + "model": "gpt-oss-120b", + "modelKey": "gpt-oss-120b", + "displayName": "GPT-OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2026-03-17", + "openWeights": true, + "releaseDate": "2024-01-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "openai/gpt-oss-120b", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-08-13", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 128, + "max": 32768 + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "stackit", + "providerName": "STACKIT", + "providerApi": "https://api.openai-compat.model-serving.eu01.onstackit.cloud/v1", + "providerDoc": "https://docs.stackit.cloud/products/data-and-ai/ai-model-serving/basics/available-shared-models", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "GPT-OSS 120B", + "family": "gpt", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "submodel", + "providerName": "submodel", + "providerApi": "https://llm.submodel.ai/v1", + "providerDoc": "https://submodel.gitbook.io", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-23", + "openWeights": true, + "releaseDate": "2025-08-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:openai/gpt-oss-120b", + "modelKey": "hf:openai/gpt-oss-120b", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2025-08", + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "openai/gpt-oss-120b", + "modelKey": "openai/gpt-oss-120b", + "displayName": "gpt-oss-120b", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2026-03-12", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/gpt-oss-120b", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/cognitive-services/openai-service/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "baseten", + "model": "baseten/openai/gpt-oss-120b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "cerebras", + "model": "cerebras/gpt-oss-120b", + "mode": "chat", + "metadata": { + "source": "https://www.cerebras.ai/blog/openai-gpt-oss-120b-runs-fastest-on-cerebras" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "crusoe", + "model": "crusoe/openai/gpt-oss-120b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/openai/gpt-oss-120b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gpt-oss-120b", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "groq", + "model": "groq/openai/gpt-oss-120b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/openai/gpt-oss-120b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-oss-120b", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/openai/gpt-oss-120b" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ovhcloud", + "model": "ovhcloud/gpt-oss-120b", + "mode": "chat", + "metadata": { + "source": "https://endpoints.ai.cloud.ovh.net/models/gpt-oss-120b" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/openai/gpt-oss-120b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sambanova", + "model": "sambanova/gpt-oss-120b", + "mode": "chat", + "metadata": { + "source": "https://cloud.sambanova.ai/plans/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/openai/gpt-oss-120b", + "mode": "chat", + "metadata": { + "source": "https://www.together.ai/models/gpt-oss-120b" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "wandb", + "model": "wandb/openai/gpt-oss-120b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/openai/gpt-oss-120b", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-oss-120b", + "displayName": "OpenAI: gpt-oss-120b", + "metadata": { + "canonicalSlug": "openai/gpt-oss-120b", + "createdAt": "2025-08-05T17:17:11.000Z", + "huggingFaceId": "openai/gpt-oss-120b", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/openai/gpt-oss-120b/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "high", + "medium", + "low" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openai/gpt-oss-120b-cs", + "provider": "openai", + "model": "gpt-oss-120b-cs", + "displayName": "GPT-OSS-120B-CS", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/cerebras/gpt-oss-120b-cs" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poe", + "model": "cerebras/gpt-oss-120b-cs", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.35, + "output": 0.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-OSS-120B-CS" + ], + "releaseDate": "2025-08-06", + "lastUpdated": "2025-08-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "cerebras/gpt-oss-120b-cs", + "modelKey": "cerebras/gpt-oss-120b-cs", + "displayName": "GPT-OSS-120B-CS", + "metadata": { + "lastUpdated": "2025-08-06", + "openWeights": false, + "releaseDate": "2025-08-06", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "openai/gpt-oss-120b-fast", + "provider": "openai", + "model": "gpt-oss-120b-fast", + "displayName": "gpt-oss-120b-fast", + "sources": [ + "models.dev" + ], + "providers": [ + "nebius" + ], + "aliases": [ + "nebius/openai/gpt-oss-120b-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 7000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nebius", + "model": "openai/gpt-oss-120b-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0.125, + "input": 0.1, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gpt-oss-120b-fast" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2025-06-10", + "lastUpdated": "2026-05-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "openai/gpt-oss-120b-fast", + "modelKey": "openai/gpt-oss-120b-fast", + "displayName": "gpt-oss-120b-fast", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-05-07", + "openWeights": true, + "releaseDate": "2025-06-10", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "openai/gpt-oss-120b-high-throughput", + "provider": "openai", + "model": "gpt-oss-120b-high-throughput", + "displayName": "GPT OSS 120B High Throughput", + "family": "gpt-oss", + "sources": [ + "models.dev" + ], + "providers": [ + "clarifai" + ], + "aliases": [ + "clarifai/openai/chat-completion/models/gpt-oss-120b-high-throughput" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "clarifai", + "model": "openai/chat-completion/models/gpt-oss-120b-high-throughput", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.36 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT OSS 120B High Throughput" + ], + "families": [ + "gpt-oss" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2026-02-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "clarifai", + "providerName": "Clarifai", + "providerApi": "https://api.clarifai.com/v2/ext/openai/v1", + "providerDoc": "https://docs.clarifai.com/compute/inference/", + "model": "openai/chat-completion/models/gpt-oss-120b-high-throughput", + "modelKey": "openai/chat-completion/models/gpt-oss-120b-high-throughput", + "displayName": "GPT OSS 120B High Throughput", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2026-02-25", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "openai/gpt-oss-120b-maas", + "provider": "openai", + "model": "gpt-oss-120b-maas", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "vertex_ai-openai_models" + ], + "aliases": [ + "google-vertex/openai/gpt-oss-120b-maas", + "vertex_ai-openai_models/vertex_ai/openai/gpt-oss-120b-maas" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex", + "model": "openai/gpt-oss-120b-maas", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.36 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-openai_models", + "model": "vertex_ai/openai/gpt-oss-120b-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT OSS 120B" + ], + "families": [ + "gpt-oss" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "openai/gpt-oss-120b-maas", + "modelKey": "openai/gpt-oss-120b-maas", + "displayName": "GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-openai_models", + "model": "vertex_ai/openai/gpt-oss-120b-maas", + "mode": "chat", + "metadata": { + "source": "https://console.cloud.google.com/vertex-ai/publishers/openai/model-garden/gpt-oss-120b-maas" + } + } + ] + }, + { + "id": "openai/gpt-oss-120b-mxfp-gguf", + "provider": "openai", + "model": "gpt-oss-120b-mxfp-gguf", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lemonade" + ], + "aliases": [ + "lemonade/gpt-oss-120b-mxfp-GGUF" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lemonade", + "model": "lemonade/gpt-oss-120b-mxfp-GGUF", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lemonade", + "model": "lemonade/gpt-oss-120b-mxfp-GGUF", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-oss-120b-tee", + "provider": "openai", + "model": "gpt-oss-120b-tee", + "displayName": "gpt oss 120b TEE", + "family": "gpt-oss", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/openai/gpt-oss-120b-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "openai/gpt-oss-120b-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.045, + "input": 0.09, + "output": 0.36 + } + } + ] + }, + "metadata": { + "displayNames": [ + "gpt oss 120b TEE" + ], + "families": [ + "gpt-oss" + ], + "releaseDate": "2025-12-29", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "openai/gpt-oss-120b-TEE", + "modelKey": "openai/gpt-oss-120b-TEE", + "displayName": "gpt oss 120b TEE", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "openai/gpt-oss-120b:free", + "provider": "openai", + "model": "gpt-oss-120b:free", + "displayName": "gpt-oss-120b (free)", + "family": "gpt-oss", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/openai/gpt-oss-120b:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-oss-120b:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-oss-120b:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI: gpt-oss-120b (free)", + "gpt-oss-120b (free)" + ], + "families": [ + "gpt-oss" + ], + "knowledgeCutoff": "2024-06-30", + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "min_p", + "reasoning", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_a", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-oss-120b:free", + "modelKey": "openai/gpt-oss-120b:free", + "displayName": "gpt-oss-120b (free)", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2024-06-30", + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-oss-120b:free", + "displayName": "OpenAI: gpt-oss-120b (free)", + "metadata": { + "canonicalSlug": "openai/gpt-oss-120b", + "createdAt": "2025-08-05T17:17:11.000Z", + "huggingFaceId": "openai/gpt-oss-120b", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/openai/gpt-oss-120b/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "high", + "medium", + "low" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "min_p", + "reasoning", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_a", + "top_k", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 131072, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/gpt-oss-20b", + "provider": "openai", + "model": "gpt-oss-20b", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "clarifai", + "cloudflare-ai-gateway", + "cloudflare-workers-ai", + "deepinfra", + "fastrouter", + "fireworks-ai", + "fireworks_ai", + "frogbot", + "groq", + "helicone", + "io-net", + "kilo", + "llmgateway", + "lmstudio", + "nano-gpt", + "neon", + "novita", + "novita-ai", + "nvidia", + "openrouter", + "ovhcloud", + "qiniu-ai", + "regolo-ai", + "replicate", + "siliconflow", + "together_ai", + "togetherai", + "vercel", + "wandb" + ], + "aliases": [ + "clarifai/openai/chat-completion/models/gpt-oss-20b", + "cloudflare-ai-gateway/workers-ai/@cf/openai/gpt-oss-20b", + "cloudflare-workers-ai/@cf/openai/gpt-oss-20b", + "deepinfra/openai/gpt-oss-20b", + "fastrouter/openai/gpt-oss-20b", + "fireworks-ai/accounts/fireworks/models/gpt-oss-20b", + "fireworks_ai/accounts/fireworks/models/gpt-oss-20b", + "frogbot/gpt-oss-20b", + "groq/openai/gpt-oss-20b", + "helicone/gpt-oss-20b", + "io-net/openai/gpt-oss-20b", + "kilo/openai/gpt-oss-20b", + "llmgateway/gpt-oss-20b", + "lmstudio/openai/gpt-oss-20b", + "nano-gpt/TEE/gpt-oss-20b", + "nano-gpt/openai/gpt-oss-20b", + "neon/gpt-oss-20b", + "novita-ai/openai/gpt-oss-20b", + "novita/openai/gpt-oss-20b", + "nvidia/openai/gpt-oss-20b", + "openrouter/openai/gpt-oss-20b", + "ovhcloud/gpt-oss-20b", + "qiniu-ai/gpt-oss-20b", + "regolo-ai/gpt-oss-20b", + "replicate/replicateopenai/gpt-oss-20b", + "siliconflow/openai/gpt-oss-20b", + "together_ai/openai/gpt-oss-20b", + "togetherai/openai/gpt-oss-20b", + "vercel/openai/gpt-oss-20b", + "wandb/openai/gpt-oss-20b" + ], + "mergedProviderModelRecords": 30, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": true, + "systemMessages": true, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "clarifai", + "model": "openai/chat-completion/models/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.045, + "output": 0.18 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/openai/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/openai/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "openai/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.03, + "output": 0.14 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "openai/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.2 + } + }, + { + "source": "models.dev", + "provider": "fireworks-ai", + "model": "accounts/fireworks/models/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.035, + "input": 0.07, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "frogbot", + "model": "gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.2 + } + }, + { + "source": "models.dev", + "provider": "groq", + "model": "openai/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0375, + "input": 0.075, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.049999999999999996, + "output": 0.19999999999999998 + } + }, + { + "source": "models.dev", + "provider": "io-net", + "model": "openai/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "cacheWrite": 0.06, + "input": 0.03, + "output": 0.14 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.03, + "output": 0.14 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "lmstudio", + "model": "openai/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "neon", + "model": "gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.2 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "openai/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.15 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "openai/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.029, + "output": 0.14 + } + }, + { + "source": "models.dev", + "provider": "ovhcloud", + "model": "gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.18 + } + }, + { + "source": "models.dev", + "provider": "regolo-ai", + "model": "gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.8 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "openai/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.18 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "openai/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.2 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.2 + } + }, + { + "source": "models.dev", + "provider": "wandb", + "model": "openai/gpt-oss-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/openai/gpt-oss-20b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gpt-oss-20b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "groq", + "model": "groq/openai/gpt-oss-20b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.0375, + "input": 0.075, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/openai/gpt-oss-20b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/gpt-oss-20b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "ovhcloud", + "model": "ovhcloud/gpt-oss-20b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.15 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicateopenai/gpt-oss-20b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.09, + "output": 0.36 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/openai/gpt-oss-20b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "wandb", + "model": "wandb/openai/gpt-oss-20b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5000, + "output": 20000 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-oss-20b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.029, + "output": 0.14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT OSS 20B", + "GPT-OSS 20B", + "GPT-OSS 20B TEE", + "GPT-OSS-20B", + "OpenAI GPT-OSS 20b", + "OpenAI: GPT OSS 20B", + "OpenAI: gpt-oss-20b", + "gpt-oss-20b", + "openai/gpt-oss-20b" + ], + "families": [ + "gpt-oss" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-06", + "releaseDate": "2025-08-05", + "lastUpdated": "2025-12-12", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 30 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "clarifai", + "providerName": "Clarifai", + "providerApi": "https://api.clarifai.com/v2/ext/openai/v1", + "providerDoc": "https://docs.clarifai.com/compute/inference/", + "model": "openai/chat-completion/models/gpt-oss-20b", + "modelKey": "openai/chat-completion/models/gpt-oss-20b", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-12-12", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/openai/gpt-oss-20b", + "modelKey": "workers-ai/@cf/openai/gpt-oss-20b", + "displayName": "GPT OSS 20B", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/openai/gpt-oss-20b", + "modelKey": "@cf/openai/gpt-oss-20b", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "openai/gpt-oss-20b", + "modelKey": "openai/gpt-oss-20b", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "openai/gpt-oss-20b", + "modelKey": "openai/gpt-oss-20b", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fireworks-ai", + "providerName": "Fireworks AI", + "providerApi": "https://api.fireworks.ai/inference/v1/", + "providerDoc": "https://fireworks.ai/docs/", + "model": "accounts/fireworks/models/gpt-oss-20b", + "modelKey": "accounts/fireworks/models/gpt-oss-20b", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "gpt-oss-20b", + "modelKey": "gpt-oss-20b", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "1970-01-01", + "openWeights": true, + "releaseDate": "1970-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "groq", + "providerName": "Groq", + "providerDoc": "https://console.groq.com/docs/models", + "model": "openai/gpt-oss-20b", + "modelKey": "openai/gpt-oss-20b", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-09-25", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "gpt-oss-20b", + "modelKey": "gpt-oss-20b", + "displayName": "OpenAI GPT-OSS 20b", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2024-06-01", + "openWeights": false, + "releaseDate": "2024-06-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "io-net", + "providerName": "IO.NET", + "providerApi": "https://api.intelligence.io.solutions/api/v1", + "providerDoc": "https://io.net/docs/guides/intelligence/io-intelligence", + "model": "openai/gpt-oss-20b", + "modelKey": "openai/gpt-oss-20b", + "displayName": "GPT-OSS 20B", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-12-01", + "openWeights": true, + "releaseDate": "2024-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-oss-20b", + "modelKey": "openai/gpt-oss-20b", + "displayName": "OpenAI: gpt-oss-20b", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "gpt-oss-20b", + "modelKey": "gpt-oss-20b", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "lmstudio", + "providerName": "LMStudio", + "providerApi": "http://127.0.0.1:1234/v1", + "providerDoc": "https://lmstudio.ai/models", + "model": "openai/gpt-oss-20b", + "modelKey": "openai/gpt-oss-20b", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-oss-20b", + "modelKey": "openai/gpt-oss-20b", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/gpt-oss-20b", + "modelKey": "TEE/gpt-oss-20b", + "displayName": "GPT-OSS 20B TEE", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neon", + "providerName": "Neon", + "providerApi": "${NEON_AI_GATEWAY_BASE_URL}/ai-gateway/mlflow/v1", + "providerDoc": "https://neon.com/docs", + "model": "gpt-oss-20b", + "modelKey": "gpt-oss-20b", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "openai/gpt-oss-20b", + "modelKey": "openai/gpt-oss-20b", + "displayName": "OpenAI: GPT OSS 20B", + "metadata": { + "lastUpdated": "2025-08-06", + "openWeights": true, + "releaseDate": "2025-08-06", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "openai/gpt-oss-20b", + "modelKey": "openai/gpt-oss-20b", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-oss-20b", + "modelKey": "openai/gpt-oss-20b", + "displayName": "gpt-oss-20b", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2024-06-30", + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ovhcloud", + "providerName": "OVHcloud AI Endpoints", + "providerApi": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", + "providerDoc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", + "model": "gpt-oss-20b", + "modelKey": "gpt-oss-20b", + "displayName": "gpt-oss-20b", + "metadata": { + "lastUpdated": "2025-08-28", + "openWeights": true, + "releaseDate": "2025-08-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "gpt-oss-20b", + "modelKey": "gpt-oss-20b", + "displayName": "gpt-oss-20b", + "metadata": { + "lastUpdated": "2025-08-06", + "openWeights": false, + "releaseDate": "2025-08-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "regolo-ai", + "providerName": "Regolo AI", + "providerApi": "https://api.regolo.ai/v1", + "providerDoc": "https://docs.regolo.ai/", + "model": "gpt-oss-20b", + "modelKey": "gpt-oss-20b", + "displayName": "GPT-OSS-20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2026-03-01", + "openWeights": true, + "releaseDate": "2026-03-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "openai/gpt-oss-20b", + "modelKey": "openai/gpt-oss-20b", + "displayName": "openai/gpt-oss-20b", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-08-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "openai/gpt-oss-20b", + "modelKey": "openai/gpt-oss-20b", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-oss-20b", + "modelKey": "openai/gpt-oss-20b", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "openai/gpt-oss-20b", + "modelKey": "openai/gpt-oss-20b", + "displayName": "gpt-oss-20b", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2026-03-12", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/openai/gpt-oss-20b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gpt-oss-20b", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "groq", + "model": "groq/openai/gpt-oss-20b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/openai/gpt-oss-20b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/gpt-oss-20b", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/openai/gpt-oss-20b" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ovhcloud", + "model": "ovhcloud/gpt-oss-20b", + "mode": "chat", + "metadata": { + "source": "https://endpoints.ai.cloud.ovh.net/models/gpt-oss-20b" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicateopenai/gpt-oss-20b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/openai/gpt-oss-20b", + "mode": "chat", + "metadata": { + "source": "https://www.together.ai/models/gpt-oss-20b" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "wandb", + "model": "wandb/openai/gpt-oss-20b", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-oss-20b", + "displayName": "OpenAI: gpt-oss-20b", + "metadata": { + "canonicalSlug": "openai/gpt-oss-20b", + "createdAt": "2025-08-05T17:17:09.000Z", + "huggingFaceId": "openai/gpt-oss-20b", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/openai/gpt-oss-20b/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "high", + "medium", + "low" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openai/gpt-oss-20b-maas", + "provider": "openai", + "model": "gpt-oss-20b-maas", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "vertex_ai-openai_models" + ], + "aliases": [ + "google-vertex/openai/gpt-oss-20b-maas", + "vertex_ai-openai_models/vertex_ai/openai/gpt-oss-20b-maas" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex", + "model": "openai/gpt-oss-20b-maas", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.25 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-openai_models", + "model": "vertex_ai/openai/gpt-oss-20b-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT OSS 20B" + ], + "families": [ + "gpt-oss" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "openai/gpt-oss-20b-maas", + "modelKey": "openai/gpt-oss-20b-maas", + "displayName": "GPT OSS 20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-openai_models", + "model": "vertex_ai/openai/gpt-oss-20b-maas", + "mode": "chat", + "metadata": { + "source": "https://console.cloud.google.com/vertex-ai/publishers/openai/model-garden/gpt-oss-120b-maas" + } + } + ] + }, + { + "id": "openai/gpt-oss-20b-mxfp4-gguf", + "provider": "openai", + "model": "gpt-oss-20b-mxfp4-gguf", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "lemonade" + ], + "aliases": [ + "lemonade/gpt-oss-20b-mxfp4-GGUF" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "lemonade", + "model": "lemonade/gpt-oss-20b-mxfp4-GGUF", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "lemonade", + "model": "lemonade/gpt-oss-20b-mxfp4-GGUF", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-oss-20b:free", + "provider": "openai", + "model": "gpt-oss-20b:free", + "displayName": "gpt-oss-20b (free)", + "family": "gpt-oss", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/openai/gpt-oss-20b:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-oss-20b:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-oss-20b:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI: gpt-oss-20b (free)", + "gpt-oss-20b (free)" + ], + "families": [ + "gpt-oss" + ], + "knowledgeCutoff": "2024-06-30", + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_a", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-oss-20b:free", + "modelKey": "openai/gpt-oss-20b:free", + "displayName": "gpt-oss-20b (free)", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2024-06-30", + "lastUpdated": "2025-08-05", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-oss-20b:free", + "displayName": "OpenAI: gpt-oss-20b (free)", + "metadata": { + "canonicalSlug": "openai/gpt-oss-20b", + "createdAt": "2025-08-05T17:17:09.000Z", + "huggingFaceId": "openai/gpt-oss-20b", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/openai/gpt-oss-20b/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "high", + "medium", + "low" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_a", + "top_k", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openai/gpt-oss-safeguard-120b", + "provider": "openai", + "model": "gpt-oss-safeguard-120b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/gpt-oss-safeguard-120b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gpt-oss-safeguard-120b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.2, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gpt-oss-safeguard-120b", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-oss-safeguard-20b", + "provider": "openai", + "model": "gpt-oss-safeguard-20b", + "displayName": "Safety GPT OSS 20B", + "family": "gpt-oss", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "fireworks_ai", + "groq", + "kilo", + "nano-gpt", + "openrouter", + "vercel" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/gpt-oss-safeguard-20b", + "groq/openai/gpt-oss-safeguard-20b", + "kilo/openai/gpt-oss-safeguard-20b", + "nano-gpt/openai/gpt-oss-safeguard-20b", + "openrouter/openai/gpt-oss-safeguard-20b", + "vercel/openai/gpt-oss-safeguard-20b" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "webSearch": true, + "supports1MContext": false, + "parallelFunctionCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "groq", + "model": "openai/gpt-oss-safeguard-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.037, + "input": 0.075, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/gpt-oss-safeguard-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.037, + "input": 0.075, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/gpt-oss-safeguard-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/gpt-oss-safeguard-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0375, + "input": 0.075, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/gpt-oss-safeguard-20b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.037, + "input": 0.075, + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gpt-oss-safeguard-20b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "groq", + "model": "groq/openai/gpt-oss-safeguard-20b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.037, + "input": 0.075, + "output": 0.3 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/gpt-oss-safeguard-20b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.0375, + "input": 0.075, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT OSS Safeguard 20B", + "OpenAI: gpt-oss-safeguard-20b", + "Safety GPT OSS 20B", + "gpt-oss-safeguard-20b" + ], + "families": [ + "gpt-oss" + ], + "modes": [ + "chat" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-10-29", + "lastUpdated": "2025-10-29", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "groq", + "providerName": "Groq", + "providerDoc": "https://console.groq.com/docs/models", + "model": "openai/gpt-oss-safeguard-20b", + "modelKey": "openai/gpt-oss-safeguard-20b", + "displayName": "Safety GPT OSS 20B", + "family": "gpt-oss", + "status": "beta", + "metadata": { + "lastUpdated": "2025-10-29", + "openWeights": true, + "releaseDate": "2025-10-29", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/gpt-oss-safeguard-20b", + "modelKey": "openai/gpt-oss-safeguard-20b", + "displayName": "OpenAI: gpt-oss-safeguard-20b", + "metadata": { + "lastUpdated": "2025-10-29", + "openWeights": false, + "releaseDate": "2025-10-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/gpt-oss-safeguard-20b", + "modelKey": "openai/gpt-oss-safeguard-20b", + "displayName": "GPT OSS Safeguard 20B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-10-29", + "openWeights": false, + "releaseDate": "2025-10-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/gpt-oss-safeguard-20b", + "modelKey": "openai/gpt-oss-safeguard-20b", + "displayName": "gpt-oss-safeguard-20b", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2025-10-29", + "openWeights": true, + "releaseDate": "2025-10-29", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/gpt-oss-safeguard-20b", + "modelKey": "openai/gpt-oss-safeguard-20b", + "displayName": "gpt-oss-safeguard-20b", + "family": "gpt-oss", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-12-01", + "openWeights": false, + "releaseDate": "2024-12-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/gpt-oss-safeguard-20b", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "groq", + "model": "groq/openai/gpt-oss-safeguard-20b", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/gpt-oss-safeguard-20b", + "displayName": "OpenAI: gpt-oss-safeguard-20b", + "metadata": { + "canonicalSlug": "openai/gpt-oss-safeguard-20b", + "createdAt": "2025-10-29T15:47:16.000Z", + "huggingFaceId": "openai/gpt-oss-safeguard-20b", + "links": { + "details": "/api/v1/models/openai/gpt-oss-safeguard-20b/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openai/gpt-oss:120b", + "provider": "openai", + "model": "gpt-oss:120b", + "displayName": "gpt-oss:120b", + "family": "gpt-oss", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/gpt-oss:120b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "gpt-oss:120b" + ], + "families": [ + "gpt-oss" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "gpt-oss:120b", + "modelKey": "gpt-oss:120b", + "displayName": "gpt-oss:120b", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "openai/gpt-oss:120b-cloud", + "provider": "openai", + "model": "gpt-oss:120b-cloud", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/gpt-oss:120b-cloud" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/gpt-oss:120b-cloud", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/gpt-oss:120b-cloud", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-oss:20b", + "provider": "openai", + "model": "gpt-oss:20b", + "displayName": "gpt-oss:20b", + "family": "gpt-oss", + "sources": [ + "models.dev" + ], + "providers": [ + "ollama-cloud" + ], + "aliases": [ + "ollama-cloud/gpt-oss:20b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "gpt-oss:20b" + ], + "families": [ + "gpt-oss" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "gpt-oss:20b", + "modelKey": "gpt-oss:20b", + "displayName": "gpt-oss:20b", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-08-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "openai/gpt-oss:20b-cloud", + "provider": "openai", + "model": "gpt-oss:20b-cloud", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ollama" + ], + "aliases": [ + "ollama/gpt-oss:20b-cloud" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ollama", + "model": "ollama/gpt-oss:20b-cloud", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ollama", + "model": "ollama/gpt-oss:20b-cloud", + "mode": "chat" + } + ] + }, + { + "id": "openai/gpt-realtime", + "provider": "openai", + "model": "gpt-realtime", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-realtime" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-realtime", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.4, + "input": 4, + "inputAudio": 32, + "output": 16, + "outputAudio": 64 + }, + "perImage": { + "input": 0.000005 + }, + "extra": { + "cache_creation_input_audio_token_cost": 4e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/realtime" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-realtime", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/realtime" + ] + } + } + ] + }, + { + "id": "openai/gpt-realtime-1.5", + "provider": "openai", + "model": "gpt-realtime-1.5", + "displayName": "GPT Realtime 1.5", + "family": "gpt", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "fastrouter", + "openai" + ], + "aliases": [ + "fastrouter/openai/gpt-realtime-1.5", + "openai/gpt-realtime-1.5" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": true, + "openWeights": false, + "reasoning": false, + "temperature": true, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fastrouter", + "model": "openai/gpt-realtime-1.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4, + "output": 16 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-realtime-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.4, + "input": 4, + "inputAudio": 32, + "output": 16, + "outputAudio": 64 + }, + "perImage": { + "input": 0.000005 + }, + "extra": { + "cache_creation_input_audio_token_cost": 4e-7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT Realtime 1.5" + ], + "families": [ + "gpt" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-06-01", + "lastUpdated": "2025-06-01", + "supportedEndpoints": [ + "/v1/realtime" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "openai/gpt-realtime-1.5", + "modelKey": "openai/gpt-realtime-1.5", + "displayName": "GPT Realtime 1.5", + "family": "gpt", + "metadata": { + "lastUpdated": "2025-06-01", + "openWeights": false, + "releaseDate": "2025-06-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-realtime-1.5", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/realtime" + ] + } + } + ] + }, + { + "id": "openai/gpt-realtime-1.5-2026-02-23", + "provider": "openai", + "model": "gpt-realtime-1.5-2026-02-23", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/gpt-realtime-1.5-2026-02-23" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-realtime-1.5-2026-02-23", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 4, + "input": 4, + "inputAudio": 32, + "output": 16, + "outputAudio": 64 + }, + "perImage": { + "input": 0.000005 + }, + "extra": { + "cache_creation_input_audio_token_cost": 0.000004 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/realtime" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-realtime-1.5-2026-02-23", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/realtime" + ] + } + } + ] + }, + { + "id": "openai/gpt-realtime-2", + "provider": "openai", + "model": "gpt-realtime-2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-realtime-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-realtime-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.4, + "input": 4, + "inputAudio": 32, + "output": 16, + "outputAudio": 64 + }, + "perImage": { + "input": 0.000005 + }, + "extra": { + "cache_creation_input_audio_token_cost": 4e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/realtime" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-realtime-2", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/realtime" + ] + } + } + ] + }, + { + "id": "openai/gpt-realtime-2025-08-28", + "provider": "openai", + "model": "gpt-realtime-2025-08-28", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-realtime-2025-08-28", + "openai/gpt-realtime-2025-08-28" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-realtime-2025-08-28", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 4, + "input": 4, + "inputAudio": 32, + "output": 16, + "outputAudio": 64 + }, + "perImage": { + "input": 0.000005 + }, + "extra": { + "cache_creation_input_audio_token_cost": 0.000004 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-realtime-2025-08-28", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.4, + "input": 4, + "inputAudio": 32, + "output": 16, + "outputAudio": 64 + }, + "perImage": { + "input": 0.000005 + }, + "extra": { + "cache_creation_input_audio_token_cost": 4e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/realtime" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-realtime-2025-08-28", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/realtime" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-realtime-2025-08-28", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/realtime" + ] + } + } + ] + }, + { + "id": "openai/gpt-realtime-mini", + "provider": "openai", + "model": "gpt-realtime-mini", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-realtime-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-realtime-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "inputAudio": 10, + "output": 2.4, + "outputAudio": 20 + }, + "extra": { + "cache_creation_input_audio_token_cost": 3e-7, + "cache_read_input_audio_token_cost": 3e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/realtime" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-realtime-mini", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/realtime" + ] + } + } + ] + }, + { + "id": "openai/gpt-realtime-mini-2025-10-06", + "provider": "openai", + "model": "gpt-realtime-mini-2025-10-06", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/gpt-realtime-mini-2025-10-06", + "openai/gpt-realtime-mini-2025-10-06" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/gpt-realtime-mini-2025-10-06", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.6, + "inputAudio": 10, + "output": 2.4, + "outputAudio": 20 + }, + "perImage": { + "input": 8e-7 + }, + "extra": { + "cache_creation_input_audio_token_cost": 3e-7 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "gpt-realtime-mini-2025-10-06", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.6, + "inputAudio": 10, + "output": 2.4, + "outputAudio": 20 + }, + "perImage": { + "input": 8e-7 + }, + "extra": { + "cache_creation_input_audio_token_cost": 3e-7, + "cache_read_input_audio_token_cost": 3e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/realtime" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/gpt-realtime-mini-2025-10-06", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/realtime" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-realtime-mini-2025-10-06", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/realtime" + ] + } + } + ] + }, + { + "id": "openai/gpt-realtime-mini-2025-12-15", + "provider": "openai", + "model": "gpt-realtime-mini-2025-12-15", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/gpt-realtime-mini-2025-12-15" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "audio", + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "gpt-realtime-mini-2025-12-15", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.6, + "inputAudio": 10, + "output": 2.4, + "outputAudio": 20 + }, + "perImage": { + "input": 8e-7 + }, + "extra": { + "cache_creation_input_audio_token_cost": 3e-7, + "cache_read_input_audio_token_cost": 3e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "supportedEndpoints": [ + "/v1/realtime" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "gpt-realtime-mini-2025-12-15", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/realtime" + ] + } + } + ] + }, + { + "id": "openai/o1", + "provider": "openai", + "model": "o1", + "displayName": "o1", + "family": "o", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "cloudflare-ai-gateway", + "github-models", + "kilo", + "merge-gateway", + "nano-gpt", + "openai", + "openrouter", + "poe", + "replicate", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "cloudflare-ai-gateway/openai/o1", + "github-models/openai/o1", + "kilo/openai/o1", + "merge-gateway/openai/o1", + "nano-gpt/openai/o1", + "openai/o1", + "openrouter/openai/o1", + "poe/openai/o1", + "replicate/openai/o1", + "vercel/openai/o1", + "vercel_ai_gateway/openai/o1" + ], + "mergedProviderModelRecords": 11, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "openai/o1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "openai/o1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/o1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/o1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/o1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14.993999999999998, + "output": 59.993 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "o1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/o1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/o1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14, + "output": 54 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/o1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "o1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/o1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/openai/o1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 15, + "output": 60, + "reasoningOutput": 60 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/o1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 7.5, + "cacheWrite": 0, + "input": 15, + "output": 60 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/o1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI o1", + "OpenAI: o1", + "o1" + ], + "families": [ + "o" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-09", + "releaseDate": "2024-12-05", + "lastUpdated": "2024-12-05", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "providerModelRecordCount": 11 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "openai/o1", + "modelKey": "openai/o1", + "displayName": "o1", + "family": "o", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-12-05", + "openWeights": false, + "releaseDate": "2024-12-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "openai/o1", + "modelKey": "openai/o1", + "displayName": "OpenAI o1", + "family": "o", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-17", + "openWeights": false, + "releaseDate": "2024-09-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/o1", + "modelKey": "openai/o1", + "displayName": "OpenAI: o1", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-12-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/o1", + "modelKey": "openai/o1", + "displayName": "o1", + "family": "o", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-12-05", + "openWeights": false, + "releaseDate": "2024-12-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/o1", + "modelKey": "openai/o1", + "displayName": "OpenAI o1", + "family": "o", + "metadata": { + "lastUpdated": "2024-12-17", + "openWeights": false, + "releaseDate": "2024-12-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "o1", + "modelKey": "o1", + "displayName": "o1", + "family": "o", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-12-05", + "openWeights": false, + "releaseDate": "2024-12-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/o1", + "modelKey": "openai/o1", + "displayName": "o1", + "family": "o", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-12-05", + "openWeights": false, + "releaseDate": "2024-12-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/o1", + "modelKey": "openai/o1", + "displayName": "o1", + "family": "o", + "metadata": { + "lastUpdated": "2024-12-18", + "openWeights": false, + "releaseDate": "2024-12-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/o1", + "modelKey": "openai/o1", + "displayName": "o1", + "family": "o", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-12-05", + "openWeights": false, + "releaseDate": "2024-12-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "o1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/o1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/openai/o1", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/o1", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/o1", + "displayName": "OpenAI: o1", + "metadata": { + "canonicalSlug": "openai/o1-2024-12-17", + "createdAt": "2024-12-17T18:26:39.000Z", + "knowledgeCutoff": "2023-10-31", + "links": { + "details": "/api/v1/models/openai/o1-2024-12-17/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/o1-2024-12-17", + "provider": "openai", + "model": "o1-2024-12-17", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/eu/o1-2024-12-17", + "azure/o1-2024-12-17", + "azure/us/o1-2024-12-17", + "openai/o1-2024-12-17" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/eu/o1-2024-12-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 8.25, + "input": 16.5, + "output": 66 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/o1-2024-12-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/o1-2024-12-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 8.25, + "input": 16.5, + "output": 66 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "o1-2024-12-17", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/eu/o1-2024-12-17", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/o1-2024-12-17", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/o1-2024-12-17", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "o1-2024-12-17", + "mode": "chat" + } + ] + }, + { + "id": "openai/o1-mini", + "provider": "openai", + "model": "o1-mini", + "displayName": "o1-mini", + "family": "o-mini", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "github-models", + "helicone", + "replicate" + ], + "aliases": [ + "azure-cognitive-services/o1-mini", + "azure/o1-mini", + "github-models/openai/o1-mini", + "helicone/o1-mini", + "replicate/openai/o1-mini" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "speech": false, + "transcription": false, + "vision": false, + "supports1MContext": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "o1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "o1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "openai/o1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "o1-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/o1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.605, + "input": 1.21, + "output": 4.84 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/openai/o1-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.1, + "output": 4.4, + "reasoningOutput": 4.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI o1-mini", + "OpenAI: o1-mini", + "o1-mini" + ], + "families": [ + "o-mini" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-09", + "releaseDate": "2024-09-12", + "lastUpdated": "2024-09-12", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "o1-mini", + "modelKey": "o1-mini", + "displayName": "o1-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-09-12", + "openWeights": false, + "releaseDate": "2024-09-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "o1-mini", + "modelKey": "o1-mini", + "displayName": "o1-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2024-09-12", + "openWeights": false, + "releaseDate": "2024-09-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "openai/o1-mini", + "modelKey": "openai/o1-mini", + "displayName": "OpenAI o1-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-12-17", + "openWeights": false, + "releaseDate": "2024-09-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "o1-mini", + "modelKey": "o1-mini", + "displayName": "OpenAI: o1-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/o1-mini", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/openai/o1-mini", + "mode": "chat" + } + ] + }, + { + "id": "openai/o1-mini-2024-09-12", + "provider": "openai", + "model": "o1-mini-2024-09-12", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/eu/o1-mini-2024-09-12", + "azure/o1-mini-2024-09-12", + "azure/us/o1-mini-2024-09-12" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false, + "reasoning": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/eu/o1-mini-2024-09-12", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.605, + "input": 1.21, + "output": 4.84 + }, + "extra": { + "input_cost_per_token_batches": 6.05e-7, + "output_cost_per_token_batches": 0.00000242 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/o1-mini-2024-09-12", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/o1-mini-2024-09-12", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.605, + "input": 1.21, + "output": 4.84 + }, + "extra": { + "input_cost_per_token_batches": 6.05e-7, + "output_cost_per_token_batches": 0.00000242 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/eu/o1-mini-2024-09-12", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/o1-mini-2024-09-12", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/o1-mini-2024-09-12", + "mode": "chat" + } + ] + }, + { + "id": "openai/o1-preview", + "provider": "openai", + "model": "o1-preview", + "displayName": "OpenAI o1-preview", + "family": "o", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "github-models", + "nano-gpt" + ], + "aliases": [ + "azure/o1-preview", + "github-models/openai/o1-preview", + "nano-gpt/openai/o1-preview" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "speech": false, + "transcription": false, + "vision": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "openai/o1-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/o1-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14.993999999999998, + "output": 59.993 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/o1-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI o1-preview" + ], + "families": [ + "o" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-09-12", + "lastUpdated": "2024-09-12", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "openai/o1-preview", + "modelKey": "openai/o1-preview", + "displayName": "OpenAI o1-preview", + "family": "o", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2024-09-12", + "openWeights": false, + "releaseDate": "2024-09-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/o1-preview", + "modelKey": "openai/o1-preview", + "displayName": "OpenAI o1-preview", + "family": "o", + "metadata": { + "lastUpdated": "2024-09-12", + "openWeights": false, + "releaseDate": "2024-09-12" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/o1-preview", + "mode": "chat" + } + ] + }, + { + "id": "openai/o1-preview-2024-09-12", + "provider": "openai", + "model": "o1-preview-2024-09-12", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure" + ], + "aliases": [ + "azure/eu/o1-preview-2024-09-12", + "azure/o1-preview-2024-09-12", + "azure/us/o1-preview-2024-09-12" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false, + "reasoning": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/eu/o1-preview-2024-09-12", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 8.25, + "input": 16.5, + "output": 66 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/o1-preview-2024-09-12", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 7.5, + "input": 15, + "output": 60 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/o1-preview-2024-09-12", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 8.25, + "input": 16.5, + "output": 66 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/eu/o1-preview-2024-09-12", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/o1-preview-2024-09-12", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/o1-preview-2024-09-12", + "mode": "chat" + } + ] + }, + { + "id": "openai/o1-pro", + "provider": "openai", + "model": "o1-pro", + "displayName": "o1-pro", + "family": "o-pro", + "mode": "responses", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openai", + "openrouter", + "poe" + ], + "aliases": [ + "kilo/openai/o1-pro", + "nano-gpt/openai/o1-pro", + "openai/o1-pro", + "openrouter/openai/o1-pro", + "poe/openai/o1-pro" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStreaming": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/o1-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 150, + "output": 600 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/o1-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 150, + "output": 600 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "o1-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 150, + "output": 600 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/o1-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 150, + "output": 600 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/o1-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 140, + "output": 540 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "o1-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 150, + "output": 600 + }, + "extra": { + "input_cost_per_token_batches": 0.000075, + "output_cost_per_token_batches": 0.0003 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/o1-pro", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 150, + "output": 600 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI o1 Pro", + "OpenAI: o1-pro", + "o1-pro" + ], + "families": [ + "o-pro" + ], + "modes": [ + "responses" + ], + "knowledgeCutoff": "2023-09", + "releaseDate": "2025-03-19", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/o1-pro", + "modelKey": "openai/o1-pro", + "displayName": "OpenAI: o1-pro", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-03-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/o1-pro", + "modelKey": "openai/o1-pro", + "displayName": "OpenAI o1 Pro", + "family": "o-pro", + "metadata": { + "lastUpdated": "2025-01-25", + "openWeights": false, + "releaseDate": "2025-01-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "o1-pro", + "modelKey": "o1-pro", + "displayName": "o1-pro", + "family": "o-pro", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2025-03-19", + "openWeights": false, + "releaseDate": "2025-03-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/o1-pro", + "modelKey": "openai/o1-pro", + "displayName": "o1-pro", + "family": "o-pro", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2025-03-19", + "openWeights": false, + "releaseDate": "2025-03-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/o1-pro", + "modelKey": "openai/o1-pro", + "displayName": "o1-pro", + "family": "o-pro", + "metadata": { + "lastUpdated": "2025-03-19", + "openWeights": false, + "releaseDate": "2025-03-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "o1-pro", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses", + "/v1/batch" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/o1-pro", + "displayName": "OpenAI: o1-pro", + "metadata": { + "canonicalSlug": "openai/o1-pro", + "createdAt": "2025-03-19T22:26:51.000Z", + "knowledgeCutoff": "2023-10-31", + "links": { + "details": "/api/v1/models/openai/o1-pro/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/o1-pro-2025-03-19", + "provider": "openai", + "model": "o1-pro-2025-03-19", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/o1-pro-2025-03-19" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": false, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "o1-pro-2025-03-19", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 150, + "output": 600 + }, + "extra": { + "input_cost_per_token_batches": 0.000075, + "output_cost_per_token_batches": 0.0003 + } + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "o1-pro-2025-03-19", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses", + "/v1/batch" + ] + } + } + ] + }, + { + "id": "openai/o3", + "provider": "openai", + "model": "o3", + "displayName": "o3", + "family": "o", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "anyapi", + "cloudflare-ai-gateway", + "github-models", + "kilo", + "merge-gateway", + "nano-gpt", + "nearai", + "openai", + "openrouter", + "poe", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "anyapi/openai/o3", + "cloudflare-ai-gateway/openai/o3", + "github-models/openai/o3", + "kilo/openai/o3", + "merge-gateway/openai/o3", + "nano-gpt/openai/o3", + "nearai/openai/o3", + "openai/o3", + "openrouter/openai/o3", + "poe/openai/o3", + "vercel/openai/o3", + "vercel_ai_gateway/openai/o3" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "openai/o3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "openai/o3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/o3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/o3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/o3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "openai/o3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "o3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/o3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/o3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.45, + "input": 1.8, + "output": 7.2 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/o3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "o3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + }, + "extra": { + "cache_read_input_token_cost_flex": 2.5e-7, + "cache_read_input_token_cost_priority": 8.75e-7, + "input_cost_per_token_flex": 0.000001, + "input_cost_per_token_priority": 0.0000035, + "output_cost_per_token_flex": 0.000004, + "output_cost_per_token_priority": 0.000014 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/o3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 0, + "input": 2, + "output": 8 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/o3", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI o3", + "OpenAI: o3", + "o3" + ], + "families": [ + "o" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-05", + "releaseDate": "2025-04-16", + "lastUpdated": "2025-04-16", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions", + "/v1/responses" + ], + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "openai/o3", + "modelKey": "openai/o3", + "displayName": "o3", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "openai/o3", + "modelKey": "openai/o3", + "displayName": "o3", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "openai/o3", + "modelKey": "openai/o3", + "displayName": "OpenAI o3", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-01-31", + "openWeights": false, + "releaseDate": "2025-01-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/o3", + "modelKey": "openai/o3", + "displayName": "OpenAI: o3", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/o3", + "modelKey": "openai/o3", + "displayName": "o3", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/o3", + "modelKey": "openai/o3", + "displayName": "OpenAI o3", + "family": "o", + "metadata": { + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "openai/o3", + "modelKey": "openai/o3", + "displayName": "o3", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "o3", + "modelKey": "o3", + "displayName": "o3", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/o3", + "modelKey": "openai/o3", + "displayName": "o3", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/o3", + "modelKey": "openai/o3", + "displayName": "o3", + "family": "o", + "metadata": { + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/o3", + "modelKey": "openai/o3", + "displayName": "o3", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "o3", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/responses", + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/o3", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/o3", + "displayName": "OpenAI: o3", + "metadata": { + "canonicalSlug": "openai/o3-2025-04-16", + "createdAt": "2025-04-16T17:10:57.000Z", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/openai/o3-2025-04-16/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/o3-2025-04-16", + "provider": "openai", + "model": "o3-2025-04-16", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/o3-2025-04-16", + "azure/us/o3-2025-04-16", + "openai/o3-2025-04-16" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/o3-2025-04-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/o3-2025-04-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "input": 2.2, + "output": 8.8 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "o3-2025-04-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2026-04-16", + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions", + "/v1/responses" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/o3-2025-04-16", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-04-16", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/o3-2025-04-16", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-04-16", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "o3-2025-04-16", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/responses", + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + } + ] + }, + { + "id": "openai/o3-deep-research", + "provider": "openai", + "model": "o3-deep-research", + "displayName": "o3-deep-research", + "family": "o", + "mode": "responses", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "azure", + "kilo", + "nano-gpt", + "openai", + "openrouter", + "poe", + "vercel" + ], + "aliases": [ + "azure/o3-deep-research", + "kilo/openai/o3-deep-research", + "nano-gpt/openai/o3-deep-research", + "openai/o3-deep-research", + "openrouter/openai/o3-deep-research", + "poe/openai/o3-deep-research", + "vercel/openai/o3-deep-research" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "supports1MContext": false, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/o3-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 2.5, + "input": 10, + "output": 40 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/o3-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 9.996, + "output": 19.992 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "o3-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 2.5, + "input": 10, + "output": 40 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/o3-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 2.5, + "input": 10, + "output": 40 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/o3-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 2.2, + "input": 9, + "output": 36 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/o3-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 2.5, + "input": 10, + "output": 40 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/o3-deep-research", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 2.5, + "input": 10, + "output": 40 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "o3-deep-research", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 2.5, + "input": 10, + "output": 40 + }, + "extra": { + "input_cost_per_token_batches": 0.000005, + "output_cost_per_token_batches": 0.00002 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/o3-deep-research", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 2.5, + "input": 10, + "output": 40 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI o3 Deep Research", + "OpenAI: o3 Deep Research", + "o3-deep-research" + ], + "families": [ + "o" + ], + "modes": [ + "responses" + ], + "knowledgeCutoff": "2024-05", + "releaseDate": "2024-06-26", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/o3-deep-research", + "modelKey": "openai/o3-deep-research", + "displayName": "OpenAI: o3 Deep Research", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-06-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/o3-deep-research", + "modelKey": "openai/o3-deep-research", + "displayName": "OpenAI o3 Deep Research", + "family": "o", + "metadata": { + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "o3-deep-research", + "modelKey": "o3-deep-research", + "displayName": "o3-deep-research", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2024-06-26", + "openWeights": false, + "releaseDate": "2024-06-26", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/o3-deep-research", + "modelKey": "openai/o3-deep-research", + "displayName": "o3-deep-research", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2024-06-26", + "openWeights": false, + "releaseDate": "2024-06-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/o3-deep-research", + "modelKey": "openai/o3-deep-research", + "displayName": "o3-deep-research", + "family": "o", + "metadata": { + "lastUpdated": "2025-06-27", + "openWeights": false, + "releaseDate": "2025-06-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/o3-deep-research", + "modelKey": "openai/o3-deep-research", + "displayName": "o3-deep-research", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-06-26", + "openWeights": false, + "releaseDate": "2024-06-26", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/o3-deep-research", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "o3-deep-research", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/o3-deep-research", + "displayName": "OpenAI: o3 Deep Research", + "metadata": { + "canonicalSlug": "openai/o3-deep-research-2025-06-26", + "createdAt": "2025-10-10T20:54:21.000Z", + "links": { + "details": "/api/v1/models/openai/o3-deep-research-2025-06-26/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/o3-deep-research-2025-06-26", + "provider": "openai", + "model": "o3-deep-research-2025-06-26", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/o3-deep-research-2025-06-26" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "o3-deep-research-2025-06-26", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 2.5, + "input": 10, + "output": 40 + }, + "extra": { + "input_cost_per_token_batches": 0.000005, + "output_cost_per_token_batches": 0.00002 + } + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "o3-deep-research-2025-06-26", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/o3-mini", + "provider": "openai", + "model": "o3-mini", + "displayName": "o3-mini", + "family": "o-mini", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "anyapi", + "azure", + "azure-cognitive-services", + "cloudflare-ai-gateway", + "github-models", + "helicone", + "jiekou", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "openai", + "openrouter", + "poe", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "abacus/o3-mini", + "anyapi/openai/o3-mini", + "azure-cognitive-services/o3-mini", + "azure/o3-mini", + "cloudflare-ai-gateway/openai/o3-mini", + "github-models/openai/o3-mini", + "helicone/o3-mini", + "jiekou/o3-mini", + "kilo/openai/o3-mini", + "llmgateway/o3-mini", + "merge-gateway/openai/o3-mini", + "nano-gpt/openai/o3-mini", + "nearai/openai/o3-mini", + "openai/o3-mini", + "openrouter/openai/o3-mini", + "poe/openai/o3-mini", + "vercel/openai/o3-mini", + "vercel_ai_gateway/openai/o3-mini" + ], + "mergedProviderModelRecords": 18, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": false, + "supports1MContext": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "openai/o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "openai/o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "openai/o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.99, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/o3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/o3-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "o3-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/o3-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/o3-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "cacheWrite": 0, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/o3-mini", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI o3 Mini", + "OpenAI o3-mini", + "OpenAI: o3 Mini", + "o3-mini" + ], + "families": [ + "o", + "o-mini" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-05", + "releaseDate": "2024-12-20", + "lastUpdated": "2025-01-29", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "providerModelRecordCount": 18 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "o3-mini", + "modelKey": "o3-mini", + "displayName": "o3-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-01-29", + "openWeights": false, + "releaseDate": "2024-12-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "openai/o3-mini", + "modelKey": "openai/o3-mini", + "displayName": "o3-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-01-29", + "openWeights": false, + "releaseDate": "2024-12-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "o3-mini", + "modelKey": "o3-mini", + "displayName": "o3-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-01-29", + "openWeights": false, + "releaseDate": "2024-12-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "o3-mini", + "modelKey": "o3-mini", + "displayName": "o3-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-01-29", + "openWeights": false, + "releaseDate": "2024-12-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "openai/o3-mini", + "modelKey": "openai/o3-mini", + "displayName": "o3-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-01-29", + "openWeights": false, + "releaseDate": "2024-12-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "openai/o3-mini", + "modelKey": "openai/o3-mini", + "displayName": "OpenAI o3-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-01-31", + "openWeights": false, + "releaseDate": "2025-01-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "o3-mini", + "modelKey": "o3-mini", + "displayName": "OpenAI o3 Mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2023-10-01", + "openWeights": false, + "releaseDate": "2023-10-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "o3-mini", + "modelKey": "o3-mini", + "displayName": "o3-mini", + "family": "o", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/o3-mini", + "modelKey": "openai/o3-mini", + "displayName": "OpenAI: o3 Mini", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-12-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "o3-mini", + "modelKey": "o3-mini", + "displayName": "o3-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-01-29", + "openWeights": false, + "releaseDate": "2024-12-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/o3-mini", + "modelKey": "openai/o3-mini", + "displayName": "o3-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-01-29", + "openWeights": false, + "releaseDate": "2024-12-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/o3-mini", + "modelKey": "openai/o3-mini", + "displayName": "OpenAI o3-mini", + "family": "o-mini", + "metadata": { + "lastUpdated": "2025-01-31", + "openWeights": false, + "releaseDate": "2025-01-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "openai/o3-mini", + "modelKey": "openai/o3-mini", + "displayName": "o3-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-01-29", + "openWeights": false, + "releaseDate": "2024-12-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "o3-mini", + "modelKey": "o3-mini", + "displayName": "o3-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-01-29", + "openWeights": false, + "releaseDate": "2024-12-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/o3-mini", + "modelKey": "openai/o3-mini", + "displayName": "o3-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-01-29", + "openWeights": false, + "releaseDate": "2024-12-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/o3-mini", + "modelKey": "openai/o3-mini", + "displayName": "o3-mini", + "family": "o-mini", + "metadata": { + "lastUpdated": "2025-01-31", + "openWeights": false, + "releaseDate": "2025-01-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/o3-mini", + "modelKey": "openai/o3-mini", + "displayName": "o3-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-01-29", + "openWeights": false, + "releaseDate": "2024-12-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/o3-mini", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "o3-mini", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/o3-mini", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/o3-mini", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/o3-mini", + "displayName": "OpenAI: o3 Mini", + "metadata": { + "canonicalSlug": "openai/o3-mini-2025-01-31", + "createdAt": "2025-01-31T19:28:41.000Z", + "knowledgeCutoff": "2023-10-31", + "links": { + "details": "/api/v1/models/openai/o3-mini-2025-01-31/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/o3-mini-2025-01-31", + "provider": "openai", + "model": "o3-mini-2025-01-31", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/eu/o3-mini-2025-01-31", + "azure/o3-mini-2025-01-31", + "azure/us/o3-mini-2025-01-31", + "openai/o3-mini-2025-01-31" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/eu/o3-mini-2025-01-31", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.605, + "input": 1.21, + "output": 4.84 + }, + "extra": { + "input_cost_per_token_batches": 6.05e-7, + "output_cost_per_token_batches": 0.00000242 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/o3-mini-2025-01-31", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/o3-mini-2025-01-31", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.605, + "input": 1.21, + "output": 4.84 + }, + "extra": { + "input_cost_per_token_batches": 6.05e-7, + "output_cost_per_token_batches": 0.00000242 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "o3-mini-2025-01-31", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/eu/o3-mini-2025-01-31", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/o3-mini-2025-01-31", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/o3-mini-2025-01-31", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "o3-mini-2025-01-31", + "mode": "chat" + } + ] + }, + { + "id": "openai/o3-mini-high", + "provider": "openai", + "model": "o3-mini-high", + "displayName": "o3 Mini High", + "family": "o", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openrouter", + "poe" + ], + "aliases": [ + "kilo/openai/o3-mini-high", + "nano-gpt/openai/o3-mini-high", + "openrouter/openai/o3-mini-high", + "poe/openai/o3-mini-high" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 65536, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/o3-mini-high", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/o3-mini-high", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.64, + "output": 2.588 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/o3-mini-high", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/o3-mini-high", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.99, + "output": 4 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openai/o3-mini-high", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/o3-mini-high", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.55, + "input": 1.1, + "output": 4.4 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI o3-mini (High)", + "OpenAI: o3 Mini High", + "o3 Mini High", + "o3-mini-high" + ], + "families": [ + "o", + "o-mini" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-10-31", + "releaseDate": "2025-01-31", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/o3-mini-high", + "modelKey": "openai/o3-mini-high", + "displayName": "OpenAI: o3 Mini High", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-01-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/o3-mini-high", + "modelKey": "openai/o3-mini-high", + "displayName": "OpenAI o3-mini (High)", + "family": "o-mini", + "metadata": { + "lastUpdated": "2025-01-31", + "openWeights": false, + "releaseDate": "2025-01-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/o3-mini-high", + "modelKey": "openai/o3-mini-high", + "displayName": "o3 Mini High", + "family": "o", + "metadata": { + "knowledgeCutoff": "2023-10-31", + "lastUpdated": "2025-02-12", + "openWeights": false, + "releaseDate": "2025-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/o3-mini-high", + "modelKey": "openai/o3-mini-high", + "displayName": "o3-mini-high", + "family": "o-mini", + "metadata": { + "lastUpdated": "2025-01-31", + "openWeights": false, + "releaseDate": "2025-01-31" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openai/o3-mini-high", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/o3-mini-high", + "displayName": "OpenAI: o3 Mini High", + "metadata": { + "canonicalSlug": "openai/o3-mini-high-2025-01-31", + "createdAt": "2025-02-12T15:03:31.000Z", + "knowledgeCutoff": "2023-10-31", + "links": { + "details": "/api/v1/models/openai/o3-mini-high-2025-01-31/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "high" + ], + "default_effort": "high" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/o3-mini-low", + "provider": "openai", + "model": "o3-mini-low", + "displayName": "OpenAI o3-mini (Low)", + "family": "o-mini", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/openai/o3-mini-low" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/o3-mini-low", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 9.996, + "output": 19.992 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI o3-mini (Low)" + ], + "families": [ + "o-mini" + ], + "releaseDate": "2025-01-31", + "lastUpdated": "2025-01-31", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/o3-mini-low", + "modelKey": "openai/o3-mini-low", + "displayName": "OpenAI o3-mini (Low)", + "family": "o-mini", + "metadata": { + "lastUpdated": "2025-01-31", + "openWeights": false, + "releaseDate": "2025-01-31" + } + } + ] + }, + { + "id": "openai/o3-pro", + "provider": "openai", + "model": "o3-pro", + "displayName": "o3-pro", + "family": "o-pro", + "mode": "responses", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "azure", + "cloudflare-ai-gateway", + "helicone", + "kilo", + "openai", + "openrouter", + "poe", + "vercel" + ], + "aliases": [ + "abacus/o3-pro", + "azure/o3-pro", + "cloudflare-ai-gateway/openai/o3-pro", + "helicone/o3-pro", + "kilo/openai/o3-pro", + "openai/o3-pro", + "openrouter/openai/o3-pro", + "poe/openai/o3-pro", + "vercel/openai/o3-pro" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "o3-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 20, + "output": 40 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "openai/o3-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 20, + "output": 80 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "o3-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 20, + "output": 80 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/o3-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 20, + "output": 80 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "o3-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 20, + "output": 80 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/o3-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 20, + "output": 80 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/o3-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 18, + "output": 72 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/o3-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 20, + "output": 80 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/o3-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 20, + "output": 80 + }, + "extra": { + "input_cost_per_token_batches": 0.00001, + "output_cost_per_token_batches": 0.00004 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "o3-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 20, + "output": 80 + }, + "extra": { + "input_cost_per_token_batches": 0.00001, + "output_cost_per_token_batches": 0.00004 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/o3-pro", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 20, + "output": 80 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI o3 Pro", + "OpenAI: o3 Pro", + "o3 Pro", + "o3-pro" + ], + "families": [ + "o-pro" + ], + "modes": [ + "responses" + ], + "knowledgeCutoff": "2024-05", + "releaseDate": "2025-06-10", + "lastUpdated": "2025-06-10", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "o3-pro", + "modelKey": "o3-pro", + "displayName": "o3-pro", + "family": "o-pro", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-06-10", + "openWeights": false, + "releaseDate": "2025-06-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "openai/o3-pro", + "modelKey": "openai/o3-pro", + "displayName": "o3-pro", + "family": "o-pro", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-06-10", + "openWeights": false, + "releaseDate": "2025-06-10", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "o3-pro", + "modelKey": "o3-pro", + "displayName": "OpenAI o3 Pro", + "family": "o-pro", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2024-06-01", + "openWeights": false, + "releaseDate": "2024-06-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/o3-pro", + "modelKey": "openai/o3-pro", + "displayName": "OpenAI: o3 Pro", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "o3-pro", + "modelKey": "o3-pro", + "displayName": "o3-pro", + "family": "o-pro", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-06-10", + "openWeights": false, + "releaseDate": "2025-06-10", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/o3-pro", + "modelKey": "openai/o3-pro", + "displayName": "o3-pro", + "family": "o-pro", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-06-10", + "openWeights": false, + "releaseDate": "2025-06-10", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/o3-pro", + "modelKey": "openai/o3-pro", + "displayName": "o3-pro", + "family": "o-pro", + "metadata": { + "lastUpdated": "2025-06-10", + "openWeights": false, + "releaseDate": "2025-06-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/o3-pro", + "modelKey": "openai/o3-pro", + "displayName": "o3 Pro", + "family": "o-pro", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-06-10", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/o3-pro", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "o3-pro", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses", + "/v1/batch" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/o3-pro", + "displayName": "OpenAI: o3 Pro", + "metadata": { + "canonicalSlug": "openai/o3-pro-2025-06-10", + "createdAt": "2025-06-10T23:32:32.000Z", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/openai/o3-pro-2025-06-10/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/o3-pro-2025-06-10", + "provider": "openai", + "model": "o3-pro-2025-06-10", + "displayName": "OpenAI o3-pro (2025-06-10)", + "family": "o-pro", + "mode": "responses", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "nano-gpt", + "openai" + ], + "aliases": [ + "azure/o3-pro-2025-06-10", + "nano-gpt/openai/o3-pro-2025-06-10", + "openai/o3-pro-2025-06-10" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "structuredOutput": true, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/o3-pro-2025-06-10", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 9.996, + "output": 19.992 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/o3-pro-2025-06-10", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 20, + "output": 80 + }, + "extra": { + "input_cost_per_token_batches": 0.00001, + "output_cost_per_token_batches": 0.00004 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "o3-pro-2025-06-10", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 20, + "output": 80 + }, + "extra": { + "input_cost_per_token_batches": 0.00001, + "output_cost_per_token_batches": 0.00004 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI o3-pro (2025-06-10)" + ], + "families": [ + "o-pro" + ], + "modes": [ + "responses" + ], + "releaseDate": "2025-06-10", + "lastUpdated": "2025-06-10", + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/o3-pro-2025-06-10", + "modelKey": "openai/o3-pro-2025-06-10", + "displayName": "OpenAI o3-pro (2025-06-10)", + "family": "o-pro", + "metadata": { + "lastUpdated": "2025-06-10", + "openWeights": false, + "releaseDate": "2025-06-10" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/o3-pro-2025-06-10", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "o3-pro-2025-06-10", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/responses", + "/v1/batch" + ] + } + } + ] + }, + { + "id": "openai/o4-mini", + "provider": "openai", + "model": "o4-mini", + "displayName": "o4-mini", + "family": "o-mini", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "abacus", + "anyapi", + "azure", + "azure-cognitive-services", + "cloudflare-ai-gateway", + "github-models", + "helicone", + "jiekou", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "nearai", + "openai", + "openrouter", + "poe", + "replicate", + "requesty", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "abacus/o4-mini", + "anyapi/openai/o4-mini", + "azure-cognitive-services/o4-mini", + "azure/o4-mini", + "cloudflare-ai-gateway/openai/o4-mini", + "github-models/openai/o4-mini", + "helicone/o4-mini", + "jiekou/o4-mini", + "kilo/openai/o4-mini", + "llmgateway/o4-mini", + "merge-gateway/openai/o4-mini", + "nano-gpt/openai/o4-mini", + "nearai/openai/o4-mini", + "openai/o4-mini", + "openrouter/openai/o4-mini", + "poe/openai/o4-mini", + "replicate/openai/o4-mini", + "requesty/openai/o4-mini", + "vercel/openai/o4-mini", + "vercel_ai_gateway/openai/o4-mini" + ], + "mergedProviderModelRecords": 20, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "supports1MContext": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "o4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "o4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.275, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "o4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.275, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "openai/o4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.28, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "github-models", + "model": "openai/o4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "o4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.275, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "o4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/o4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.275, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "o4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.275, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "openai/o4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.275, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/o4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "openai/o4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.275, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "o4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.275, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/o4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.275, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/o4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 0.99, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "openai/o4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.28, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "openai/o4-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.275, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/o4-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.275, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "o4-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.275, + "input": 1.1, + "output": 4.4 + }, + "extra": { + "cache_read_input_token_cost_flex": 1.375e-7, + "cache_read_input_token_cost_priority": 5e-7, + "input_cost_per_token_flex": 5.5e-7, + "input_cost_per_token_priority": 0.000002, + "output_cost_per_token_flex": 0.0000022, + "output_cost_per_token_priority": 0.000008 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/openai/o4-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 4, + "reasoningOutput": 4 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/o4-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.275, + "cacheWrite": 0, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/o4-mini", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.275, + "input": 1.1, + "output": 4.4 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI o4 Mini", + "OpenAI o4-mini", + "OpenAI: o4 Mini", + "o4 Mini", + "o4-mini" + ], + "families": [ + "o", + "o-mini" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-05", + "releaseDate": "2025-04-16", + "lastUpdated": "2025-04-16", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 20 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "o4-mini", + "modelKey": "o4-mini", + "displayName": "o4-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "openai/o4-mini", + "modelKey": "openai/o4-mini", + "displayName": "o4-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "o4-mini", + "modelKey": "o4-mini", + "displayName": "o4-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "o4-mini", + "modelKey": "o4-mini", + "displayName": "o4-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "openai/o4-mini", + "modelKey": "openai/o4-mini", + "displayName": "o4-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "openai/o4-mini", + "modelKey": "openai/o4-mini", + "displayName": "OpenAI o4-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-01-31", + "openWeights": false, + "releaseDate": "2025-01-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "o4-mini", + "modelKey": "o4-mini", + "displayName": "OpenAI o4 Mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2024-06-01", + "openWeights": false, + "releaseDate": "2024-06-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "o4-mini", + "modelKey": "o4-mini", + "displayName": "o4-mini", + "family": "o", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/o4-mini", + "modelKey": "openai/o4-mini", + "displayName": "OpenAI: o4 Mini", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "o4-mini", + "modelKey": "o4-mini", + "displayName": "o4-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "openai/o4-mini", + "modelKey": "openai/o4-mini", + "displayName": "o4-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/o4-mini", + "modelKey": "openai/o4-mini", + "displayName": "OpenAI o4-mini", + "family": "o-mini", + "metadata": { + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "openai/o4-mini", + "modelKey": "openai/o4-mini", + "displayName": "o4-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "o4-mini", + "modelKey": "o4-mini", + "displayName": "o4-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/o4-mini", + "modelKey": "openai/o4-mini", + "displayName": "o4-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/o4-mini", + "modelKey": "openai/o4-mini", + "displayName": "o4-mini", + "family": "o-mini", + "metadata": { + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "openai/o4-mini", + "modelKey": "openai/o4-mini", + "displayName": "o4 Mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/o4-mini", + "modelKey": "openai/o4-mini", + "displayName": "o4-mini", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/o4-mini", + "mode": "chat", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "o4-mini", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/openai/o4-mini", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/o4-mini", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/o4-mini", + "displayName": "OpenAI: o4 Mini", + "metadata": { + "canonicalSlug": "openai/o4-mini-2025-04-16", + "createdAt": "2025-04-16T16:29:02.000Z", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/openai/o4-mini-2025-04-16/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/o4-mini-2025-04-16", + "provider": "openai", + "model": "o4-mini-2025-04-16", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/o4-mini-2025-04-16", + "azure/us/o4-mini-2025-04-16", + "openai/o4-mini-2025-04-16" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": true, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "serviceTier": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/o4-mini-2025-04-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.275, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/us/o4-mini-2025-04-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.31, + "input": 1.21, + "output": 4.84 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "o4-mini-2025-04-16", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.275, + "input": 1.1, + "output": 4.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/o4-mini-2025-04-16", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/us/o4-mini-2025-04-16", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "o4-mini-2025-04-16", + "mode": "chat" + } + ] + }, + { + "id": "openai/o4-mini-deep-research", + "provider": "openai", + "model": "o4-mini-deep-research", + "displayName": "o4-mini-deep-research", + "family": "o-mini", + "mode": "responses", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openai", + "openrouter", + "poe" + ], + "aliases": [ + "kilo/openai/o4-mini-deep-research", + "nano-gpt/openai/o4-mini-deep-research", + "openai/o4-mini-deep-research", + "openrouter/openai/o4-mini-deep-research", + "poe/openai/o4-mini-deep-research" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "supports1MContext": false, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/o4-mini-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/o4-mini-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 9.996, + "output": 19.992 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "o4-mini-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/o4-mini-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "openai/o4-mini-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.45, + "input": 1.8, + "output": 7.2 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "o4-mini-deep-research", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + }, + "extra": { + "input_cost_per_token_batches": 0.000001, + "output_cost_per_token_batches": 0.000004 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/o4-mini-deep-research", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI o4-mini Deep Research", + "OpenAI: o4 Mini Deep Research", + "o4-mini-deep-research" + ], + "families": [ + "o-mini" + ], + "modes": [ + "responses" + ], + "knowledgeCutoff": "2024-05", + "releaseDate": "2024-06-26", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/o4-mini-deep-research", + "modelKey": "openai/o4-mini-deep-research", + "displayName": "OpenAI: o4 Mini Deep Research", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2024-06-26", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/o4-mini-deep-research", + "modelKey": "openai/o4-mini-deep-research", + "displayName": "OpenAI o4-mini Deep Research", + "family": "o-mini", + "metadata": { + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "o4-mini-deep-research", + "modelKey": "o4-mini-deep-research", + "displayName": "o4-mini-deep-research", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2024-06-26", + "openWeights": false, + "releaseDate": "2024-06-26", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "medium" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/o4-mini-deep-research", + "modelKey": "openai/o4-mini-deep-research", + "displayName": "o4-mini-deep-research", + "family": "o-mini", + "metadata": { + "knowledgeCutoff": "2024-05", + "lastUpdated": "2024-06-26", + "openWeights": false, + "releaseDate": "2024-06-26" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/o4-mini-deep-research", + "modelKey": "openai/o4-mini-deep-research", + "displayName": "o4-mini-deep-research", + "family": "o-mini", + "metadata": { + "lastUpdated": "2025-06-27", + "openWeights": false, + "releaseDate": "2025-06-27" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "o4-mini-deep-research", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/o4-mini-deep-research", + "displayName": "OpenAI: o4 Mini Deep Research", + "metadata": { + "canonicalSlug": "openai/o4-mini-deep-research-2025-06-26", + "createdAt": "2025-10-10T20:54:02.000Z", + "links": { + "details": "/api/v1/models/openai/o4-mini-deep-research-2025-06-26/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/o4-mini-deep-research-2025-06-26", + "provider": "openai", + "model": "o4-mini-deep-research-2025-06-26", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/o4-mini-deep-research-2025-06-26" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 100000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "nativeStreaming": true, + "parallelFunctionCalling": true, + "pdfInput": true, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "o4-mini-deep-research-2025-06-26", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + }, + "extra": { + "input_cost_per_token_batches": 0.000001, + "output_cost_per_token_batches": 0.000004 + } + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "o4-mini-deep-research-2025-06-26", + "mode": "responses", + "metadata": { + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ] + } + } + ] + }, + { + "id": "openai/o4-mini-high", + "provider": "openai", + "model": "o4-mini-high", + "displayName": "OpenAI: o4 Mini High", + "family": "o-mini", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "kilo/openai/o4-mini-high", + "nano-gpt/openai/o4-mini-high", + "openrouter/openai/o4-mini-high" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "temperature": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "openai/o4-mini-high", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "openai/o4-mini-high", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "openai/o4-mini-high", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.275, + "input": 1.1, + "output": 4.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openai/o4-mini-high", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.275, + "input": 1.1, + "output": 4.4 + }, + "other": { + "webSearch": 0.01 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI o4-mini high", + "OpenAI: o4 Mini High", + "o4 Mini High" + ], + "families": [ + "o", + "o-mini" + ], + "knowledgeCutoff": "2024-06-30", + "releaseDate": "2025-04-17", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "openai/o4-mini-high", + "modelKey": "openai/o4-mini-high", + "displayName": "OpenAI: o4 Mini High", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-04-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "openai/o4-mini-high", + "modelKey": "openai/o4-mini-high", + "displayName": "OpenAI o4-mini high", + "family": "o-mini", + "metadata": { + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openai/o4-mini-high", + "modelKey": "openai/o4-mini-high", + "displayName": "o4 Mini High", + "family": "o", + "metadata": { + "knowledgeCutoff": "2024-06-30", + "lastUpdated": "2025-04-16", + "openWeights": false, + "releaseDate": "2025-04-16" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openai/o4-mini-high", + "displayName": "OpenAI: o4 Mini High", + "metadata": { + "canonicalSlug": "openai/o4-mini-high-2025-04-16", + "createdAt": "2025-04-16T17:23:32.000Z", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/openai/o4-mini-high-2025-04-16/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "high" + ], + "default_effort": "high" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ], + "tokenizer": "GPT", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openai/omni-moderation-2024-09-26", + "provider": "openai", + "model": "omni-moderation-2024-09-26", + "mode": "moderation", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/omni-moderation-2024-09-26" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "omni-moderation-2024-09-26", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "moderation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "omni-moderation-2024-09-26", + "mode": "moderation" + } + ] + }, + { + "id": "openai/omni-moderation-latest", + "provider": "openai", + "model": "omni-moderation-latest", + "mode": "moderation", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/omni-moderation-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "omni-moderation-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "moderation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "omni-moderation-latest", + "mode": "moderation" + } + ] + }, + { + "id": "openai/sora-2", + "provider": "openai", + "model": "sora-2", + "displayName": "Sora-2", + "family": "sora", + "mode": "video_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "openai", + "poe" + ], + "aliases": [ + "openai/sora-2", + "poe/openai/sora-2" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text", + "video" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": true, + "openWeights": false, + "reasoning": false, + "temperature": false, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "openai/sora-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perVideoSecond": { + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "sora-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perVideoSecond": { + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Sora-2" + ], + "families": [ + "sora" + ], + "modes": [ + "video_generation" + ], + "releaseDate": "2025-10-06", + "lastUpdated": "2025-10-06", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/sora-2", + "modelKey": "openai/sora-2", + "displayName": "Sora-2", + "family": "sora", + "metadata": { + "lastUpdated": "2025-10-06", + "openWeights": false, + "releaseDate": "2025-10-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "openai/sora-2", + "mode": "video_generation", + "metadata": { + "source": "https://platform.openai.com/docs/api-reference/videos" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "sora-2", + "mode": "video_generation", + "metadata": { + "source": "https://platform.openai.com/docs/api-reference/videos" + } + } + ] + }, + { + "id": "openai/sora-2-pro", + "provider": "openai", + "model": "sora-2-pro", + "displayName": "Sora-2-Pro", + "family": "sora", + "mode": "video_generation", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "openai", + "poe" + ], + "aliases": [ + "openai/sora-2-pro", + "poe/openai/sora-2-pro" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text", + "video" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "attachments": true, + "openWeights": false, + "reasoning": false, + "temperature": false, + "toolCalling": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "openai/sora-2-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perVideoSecond": { + "output": 0.3 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "sora-2-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perVideoSecond": { + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Sora-2-Pro" + ], + "families": [ + "sora" + ], + "modes": [ + "video_generation" + ], + "releaseDate": "2025-10-06", + "lastUpdated": "2025-10-06", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "openai/sora-2-pro", + "modelKey": "openai/sora-2-pro", + "displayName": "Sora-2-Pro", + "family": "sora", + "metadata": { + "lastUpdated": "2025-10-06", + "openWeights": false, + "releaseDate": "2025-10-06" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "openai/sora-2-pro", + "mode": "video_generation", + "metadata": { + "source": "https://platform.openai.com/docs/api-reference/videos" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "sora-2-pro", + "mode": "video_generation", + "metadata": { + "source": "https://platform.openai.com/docs/api-reference/videos" + } + } + ] + }, + { + "id": "openai/sora-2-pro-high-res", + "provider": "openai", + "model": "sora-2-pro-high-res", + "mode": "video_generation", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/sora-2-pro-high-res" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "openai/sora-2-pro-high-res", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perVideoSecond": { + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "sora-2-pro-high-res", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perVideoSecond": { + "output": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "video_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "openai/sora-2-pro-high-res", + "mode": "video_generation", + "metadata": { + "source": "https://platform.openai.com/docs/api-reference/videos" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "sora-2-pro-high-res", + "mode": "video_generation", + "metadata": { + "source": "https://platform.openai.com/docs/api-reference/videos" + } + } + ] + }, + { + "id": "openai/text-embedding-004", + "provider": "openai", + "model": "text-embedding-004", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-embedding-models" + ], + "aliases": [ + "vertex_ai-embedding-models/text-embedding-004" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2048, + "inputTokens": 2048, + "maxTokens": 2048, + "outputTokens": 2048, + "outputVectorSize": 768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-embedding-models", + "model": "text-embedding-004", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + }, + "perCharacter": { + "input": 2.5e-8 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "deprecationDate": "2026-01-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-embedding-models", + "model": "text-embedding-004", + "mode": "embedding", + "metadata": { + "deprecationDate": "2026-01-14", + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models" + } + } + ] + }, + { + "id": "openai/text-embedding-005", + "provider": "openai", + "model": "text-embedding-005", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-embedding-models" + ], + "aliases": [ + "vertex_ai-embedding-models/text-embedding-005" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2048, + "inputTokens": 2048, + "maxTokens": 2048, + "outputTokens": 2048, + "outputVectorSize": 768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-embedding-models", + "model": "text-embedding-005", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + }, + "perCharacter": { + "input": 2.5e-8 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-embedding-models", + "model": "text-embedding-005", + "mode": "embedding", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models" + } + } + ] + }, + { + "id": "openai/text-embedding-3-large", + "provider": "openai", + "model": "text-embedding-3-large", + "displayName": "text-embedding-3-large", + "family": "text-embedding", + "mode": "embedding", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "openai", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "azure-cognitive-services/text-embedding-3-large", + "azure/text-embedding-3-large", + "openai/text-embedding-3-large", + "vercel/openai/text-embedding-3-large", + "vercel_ai_gateway/openai/text-embedding-3-large" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 8192, + "inputTokens": 8191, + "maxTokens": 8191, + "outputTokens": 8191, + "outputVectorSize": 3072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding", + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "embedding": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "text-embedding-3-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "text-embedding-3-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "text-embedding-3-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/text-embedding-3-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "text-embedding-3-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0 + }, + "extra": { + "input_cost_per_token_batches": 6.5e-8, + "output_cost_per_token_batches": 0 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/text-embedding-3-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "text-embedding-3-large" + ], + "families": [ + "text-embedding" + ], + "modes": [ + "embedding" + ], + "knowledgeCutoff": "2024-01", + "releaseDate": "2024-01-25", + "lastUpdated": "2024-01-25", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "text-embedding-3-large", + "modelKey": "text-embedding-3-large", + "displayName": "text-embedding-3-large", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2024-01-25", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "text-embedding-3-large", + "modelKey": "text-embedding-3-large", + "displayName": "text-embedding-3-large", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2024-01-25", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "text-embedding-3-large", + "modelKey": "text-embedding-3-large", + "displayName": "text-embedding-3-large", + "family": "text-embedding", + "metadata": { + "knowledgeCutoff": "2024-01", + "lastUpdated": "2024-01-25", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/text-embedding-3-large", + "modelKey": "openai/text-embedding-3-large", + "displayName": "text-embedding-3-large", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2024-01-25", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/text-embedding-3-large", + "mode": "embedding" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "text-embedding-3-large", + "mode": "embedding" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/text-embedding-3-large", + "mode": "embedding" + } + ] + }, + { + "id": "openai/text-embedding-3-small", + "provider": "openai", + "model": "text-embedding-3-small", + "displayName": "text-embedding-3-small", + "family": "text-embedding", + "mode": "embedding", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "github_copilot", + "openai", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "azure-cognitive-services/text-embedding-3-small", + "azure/text-embedding-3-small", + "github_copilot/text-embedding-3-small", + "openai/text-embedding-3-small", + "vercel/openai/text-embedding-3-small", + "vercel_ai_gateway/openai/text-embedding-3-small" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 8192, + "inputTokens": 8191, + "maxTokens": 8191, + "outputTokens": 8191, + "outputVectorSize": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding", + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "embedding": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "text-embedding-3-small", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "text-embedding-3-small", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "text-embedding-3-small", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/text-embedding-3-small", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/text-embedding-3-small", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "text-embedding-3-small", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0 + }, + "extra": { + "input_cost_per_token_batches": 1e-8, + "output_cost_per_token_batches": 0 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/text-embedding-3-small", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "text-embedding-3-small" + ], + "families": [ + "text-embedding" + ], + "modes": [ + "embedding" + ], + "knowledgeCutoff": "2024-01", + "releaseDate": "2024-01-25", + "lastUpdated": "2024-01-25", + "deprecationDate": "2026-04-30", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "text-embedding-3-small", + "modelKey": "text-embedding-3-small", + "displayName": "text-embedding-3-small", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2024-01-25", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "text-embedding-3-small", + "modelKey": "text-embedding-3-small", + "displayName": "text-embedding-3-small", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2024-01-25", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "text-embedding-3-small", + "modelKey": "text-embedding-3-small", + "displayName": "text-embedding-3-small", + "family": "text-embedding", + "metadata": { + "knowledgeCutoff": "2024-01", + "lastUpdated": "2024-01-25", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/text-embedding-3-small", + "modelKey": "openai/text-embedding-3-small", + "displayName": "text-embedding-3-small", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2024-01-25", + "openWeights": false, + "releaseDate": "2024-01-25" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/text-embedding-3-small", + "mode": "embedding", + "metadata": { + "deprecationDate": "2026-04-30" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/text-embedding-3-small", + "mode": "embedding" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "text-embedding-3-small", + "mode": "embedding" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/text-embedding-3-small", + "mode": "embedding" + } + ] + }, + { + "id": "openai/text-embedding-3-small-inference", + "provider": "openai", + "model": "text-embedding-3-small-inference", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "github_copilot" + ], + "aliases": [ + "github_copilot/text-embedding-3-small-inference" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8191, + "inputTokens": 8191, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/text-embedding-3-small-inference", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/text-embedding-3-small-inference", + "mode": "embedding" + } + ] + }, + { + "id": "openai/text-embedding-ada-002", + "provider": "openai", + "model": "text-embedding-ada-002", + "displayName": "text-embedding-ada-002", + "family": "text-embedding", + "mode": "embedding", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure", + "azure-cognitive-services", + "github_copilot", + "openai", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "azure-cognitive-services/text-embedding-ada-002", + "azure/text-embedding-ada-002", + "github_copilot/text-embedding-ada-002", + "openai/text-embedding-ada-002", + "vercel/openai/text-embedding-ada-002", + "vercel_ai_gateway/openai/text-embedding-ada-002" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 8192, + "inputTokens": 8191, + "maxTokens": 8191, + "outputTokens": 8191, + "outputVectorSize": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding", + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "embedding": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "text-embedding-ada-002", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "text-embedding-ada-002", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "openai", + "model": "text-embedding-ada-002", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "azure", + "model": "azure/text-embedding-ada-002", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "github_copilot", + "model": "github_copilot/text-embedding-ada-002", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "openai", + "model": "text-embedding-ada-002", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/text-embedding-ada-002", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "text-embedding-ada-002" + ], + "families": [ + "text-embedding" + ], + "modes": [ + "embedding" + ], + "knowledgeCutoff": "2022-12", + "releaseDate": "2022-12-15", + "lastUpdated": "2022-12-15", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "text-embedding-ada-002", + "modelKey": "text-embedding-ada-002", + "displayName": "text-embedding-ada-002", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2022-12-15", + "openWeights": false, + "releaseDate": "2022-12-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "text-embedding-ada-002", + "modelKey": "text-embedding-ada-002", + "displayName": "text-embedding-ada-002", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2022-12-15", + "openWeights": false, + "releaseDate": "2022-12-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openai", + "providerName": "OpenAI", + "providerDoc": "https://platform.openai.com/docs/models", + "model": "text-embedding-ada-002", + "modelKey": "text-embedding-ada-002", + "displayName": "text-embedding-ada-002", + "family": "text-embedding", + "metadata": { + "knowledgeCutoff": "2022-12", + "lastUpdated": "2022-12-15", + "openWeights": false, + "releaseDate": "2022-12-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "openai/text-embedding-ada-002", + "modelKey": "openai/text-embedding-ada-002", + "displayName": "text-embedding-ada-002", + "family": "text-embedding", + "metadata": { + "lastUpdated": "2022-12-15", + "openWeights": false, + "releaseDate": "2022-12-15" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/text-embedding-ada-002", + "mode": "embedding" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "github_copilot", + "model": "github_copilot/text-embedding-ada-002", + "mode": "embedding" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "text-embedding-ada-002", + "mode": "embedding" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/openai/text-embedding-ada-002", + "mode": "embedding" + } + ] + }, + { + "id": "openai/text-embedding-ada-002-v2", + "provider": "openai", + "model": "text-embedding-ada-002-v2", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/text-embedding-ada-002-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8191, + "inputTokens": 8191, + "maxTokens": 8191, + "outputTokens": 8191, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "text-embedding-ada-002-v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + }, + "extra": { + "input_cost_per_token_batches": 5e-8, + "output_cost_per_token_batches": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "text-embedding-ada-002-v2", + "mode": "embedding" + } + ] + }, + { + "id": "openai/text-embedding-large-exp-03-07", + "provider": "openai", + "model": "text-embedding-large-exp-03-07", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-embedding-models" + ], + "aliases": [ + "vertex_ai-embedding-models/text-embedding-large-exp-03-07" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "outputVectorSize": 3072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-embedding-models", + "model": "text-embedding-large-exp-03-07", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + }, + "perCharacter": { + "input": 2.5e-8 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-embedding-models", + "model": "text-embedding-large-exp-03-07", + "mode": "embedding", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models" + } + } + ] + }, + { + "id": "openai/text-embedding-preview-0409", + "provider": "openai", + "model": "text-embedding-preview-0409", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-embedding-models" + ], + "aliases": [ + "vertex_ai-embedding-models/text-embedding-preview-0409" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 3072, + "inputTokens": 3072, + "maxTokens": 3072, + "outputTokens": 3072, + "outputVectorSize": 768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-embedding-models", + "model": "text-embedding-preview-0409", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.00625, + "output": 0 + }, + "extra": { + "input_cost_per_token_batch_requests": 5e-9 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-embedding-models", + "model": "text-embedding-preview-0409", + "mode": "embedding", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + } + ] + }, + { + "id": "openai/text-moderation-007", + "provider": "openai", + "model": "text-moderation-007", + "mode": "moderation", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/text-moderation-007" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "text-moderation-007", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "moderation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "text-moderation-007", + "mode": "moderation" + } + ] + }, + { + "id": "openai/text-moderation-latest", + "provider": "openai", + "model": "text-moderation-latest", + "mode": "moderation", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/text-moderation-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "text-moderation-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "moderation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "text-moderation-latest", + "mode": "moderation" + } + ] + }, + { + "id": "openai/text-moderation-stable", + "provider": "openai", + "model": "text-moderation-stable", + "mode": "moderation", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/text-moderation-stable" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "text-moderation-stable", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "moderation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "text-moderation-stable", + "mode": "moderation" + } + ] + }, + { + "id": "openai/tts-1", + "provider": "openai", + "model": "tts-1", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/tts-1", + "openai/tts-1" + ], + "mergedProviderModelRecords": 2, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/tts-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.000015 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "tts-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.000015 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/tts-1", + "mode": "audio_speech" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "tts-1", + "mode": "audio_speech", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "openai/tts-1-1106", + "provider": "openai", + "model": "tts-1-1106", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/tts-1-1106" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "tts-1-1106", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.000015 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "tts-1-1106", + "mode": "audio_speech", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "openai/tts-1-hd", + "provider": "openai", + "model": "tts-1-hd", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/tts-1-hd", + "openai/tts-1-hd" + ], + "mergedProviderModelRecords": 2, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/tts-1-hd", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.00003 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "tts-1-hd", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.00003 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/tts-1-hd", + "mode": "audio_speech" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "tts-1-hd", + "mode": "audio_speech", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "openai/tts-1-hd-1106", + "provider": "openai", + "model": "tts-1-hd-1106", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "openai" + ], + "aliases": [ + "openai/tts-1-hd-1106" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openai", + "model": "tts-1-hd-1106", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.00003 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "tts-1-hd-1106", + "mode": "audio_speech", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "openai/whisper-1", + "provider": "openai", + "model": "whisper-1", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "azure", + "openai" + ], + "aliases": [ + "azure/whisper-1", + "openai/whisper-1" + ], + "mergedProviderModelRecords": 2, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "azure", + "model": "azure/whisper-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.0001 + }, + "extra": { + "input_cost_per_second": 0.0001 + } + }, + { + "source": "litellm", + "provider": "openai", + "model": "whisper-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.0001 + }, + "extra": { + "input_cost_per_second": 0.0001 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure", + "model": "azure/whisper-1", + "mode": "audio_transcription" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openai", + "model": "whisper-1", + "mode": "audio_transcription", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "openai/whisper-base", + "provider": "openai", + "model": "whisper-base", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/whisper-base" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/whisper-base", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.0001 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/whisper-base", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "notes": "Deepgram's hosted OpenAI Whisper models - pricing may differ from native Deepgram models" + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "openai/whisper-large", + "provider": "openai", + "model": "whisper-large", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/whisper-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/whisper-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.0001 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/whisper-large", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "notes": "Deepgram's hosted OpenAI Whisper models - pricing may differ from native Deepgram models" + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "openai/whisper-large-v3", + "provider": "openai", + "model": "whisper-large-v3", + "displayName": "Whisper", + "family": "whisper", + "mode": "audio_transcription", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "evroc", + "groq", + "nearai", + "nvidia", + "privatemode-ai", + "scaleway" + ], + "aliases": [ + "evroc/openai/whisper-large-v3", + "groq/whisper-large-v3", + "nearai/openai/whisper-large-v3", + "nvidia/openai/whisper-large-v3", + "privatemode-ai/whisper-large-v3", + "scaleway/whisper-large-v3" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 448, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": true, + "supports1MContext": false, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "evroc", + "model": "openai/whisper-large-v3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.00236, + "output": 0.00236, + "outputAudio": 2.36 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "openai/whisper-large-v3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.01, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "openai/whisper-large-v3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "privatemode-ai", + "model": "whisper-large-v3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "scaleway", + "model": "whisper-large-v3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.003, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "groq", + "model": "groq/whisper-large-v3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00003083 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Whisper", + "Whisper 3 Large", + "Whisper Large v3", + "Whisper large-v3" + ], + "families": [ + "whisper" + ], + "modes": [ + "audio_transcription" + ], + "knowledgeCutoff": "2023-09", + "releaseDate": "2024-10-01", + "lastUpdated": "2024-10-01", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "evroc", + "providerName": "evroc", + "providerApi": "https://models.think.evroc.com/v1", + "providerDoc": "https://docs.evroc.com/products/think/overview.html", + "model": "openai/whisper-large-v3", + "modelKey": "openai/whisper-large-v3", + "displayName": "Whisper 3 Large", + "family": "whisper", + "metadata": { + "lastUpdated": "2024-10-01", + "openWeights": true, + "releaseDate": "2024-10-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "groq", + "providerName": "Groq", + "providerDoc": "https://console.groq.com/docs/models", + "model": "whisper-large-v3", + "modelKey": "whisper-large-v3", + "displayName": "Whisper", + "family": "whisper", + "metadata": { + "lastUpdated": "2025-09-05", + "openWeights": true, + "releaseDate": "2023-09-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "openai/whisper-large-v3", + "modelKey": "openai/whisper-large-v3", + "displayName": "Whisper Large v3", + "family": "whisper", + "metadata": { + "lastUpdated": "2023-11-06", + "openWeights": true, + "releaseDate": "2023-11-06" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "openai/whisper-large-v3", + "modelKey": "openai/whisper-large-v3", + "displayName": "Whisper Large v3", + "family": "whisper", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2025-09-05", + "openWeights": true, + "releaseDate": "2023-09-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "privatemode-ai", + "providerName": "Privatemode AI", + "providerApi": "http://localhost:8080/v1", + "providerDoc": "https://docs.privatemode.ai/api/overview", + "model": "whisper-large-v3", + "modelKey": "whisper-large-v3", + "displayName": "Whisper large-v3", + "family": "whisper", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2023-09-01", + "openWeights": true, + "releaseDate": "2023-09-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "scaleway", + "providerName": "Scaleway", + "providerApi": "https://api.scaleway.ai/v1", + "providerDoc": "https://www.scaleway.com/en/docs/generative-apis/", + "model": "whisper-large-v3", + "modelKey": "whisper-large-v3", + "displayName": "Whisper Large v3", + "family": "whisper", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2026-03-17", + "openWeights": true, + "releaseDate": "2023-09-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "groq", + "model": "groq/whisper-large-v3", + "mode": "audio_transcription" + } + ] + }, + { + "id": "openai/whisper-large-v3-turbo", + "provider": "openai", + "model": "whisper-large-v3-turbo", + "displayName": "Whisper Large V3 Turbo", + "family": "whisper", + "mode": "audio_transcription", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "groq", + "watsonx" + ], + "aliases": [ + "groq/whisper-large-v3-turbo", + "watsonx/whisper-large-v3-turbo" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": true, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "groq", + "model": "groq/whisper-large-v3-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.00001111 + } + }, + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/whisper-large-v3-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.0001 + }, + "extra": { + "input_cost_per_second": 0.0001 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Whisper Large V3 Turbo" + ], + "families": [ + "whisper" + ], + "modes": [ + "audio_transcription" + ], + "releaseDate": "2024-10-01", + "lastUpdated": "2024-10-01", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "groq", + "providerName": "Groq", + "providerDoc": "https://console.groq.com/docs/models", + "model": "whisper-large-v3-turbo", + "modelKey": "whisper-large-v3-turbo", + "displayName": "Whisper Large V3 Turbo", + "family": "whisper", + "metadata": { + "lastUpdated": "2024-10-01", + "openWeights": true, + "releaseDate": "2024-10-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "groq", + "model": "groq/whisper-large-v3-turbo", + "mode": "audio_transcription" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/whisper-large-v3-turbo", + "mode": "audio_transcription", + "metadata": { + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "openai/whisper-medium", + "provider": "openai", + "model": "whisper-medium", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/whisper-medium" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/whisper-medium", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.0001 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/whisper-medium", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "notes": "Deepgram's hosted OpenAI Whisper models - pricing may differ from native Deepgram models" + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "openai/whisper-small", + "provider": "openai", + "model": "whisper-small", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/whisper-small" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/whisper-small", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.0001 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/whisper-small", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "notes": "Deepgram's hosted OpenAI Whisper models - pricing may differ from native Deepgram models" + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "openai/whisper-tiny", + "provider": "openai", + "model": "whisper-tiny", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "deepgram" + ], + "aliases": [ + "deepgram/whisper-tiny" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "deepgram", + "model": "deepgram/whisper-tiny", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0 + }, + "extra": { + "input_cost_per_second": 0.0001 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepgram", + "model": "deepgram/whisper-tiny", + "mode": "audio_transcription", + "metadata": { + "metadata": { + "notes": "Deepgram's hosted OpenAI Whisper models - pricing may differ from native Deepgram models" + }, + "source": "https://deepgram.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "openai/whisper-v3", + "provider": "openai", + "model": "whisper-v3", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/whisper-v3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/whisper-v3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/whisper-v3", + "mode": "audio_transcription" + } + ] + }, + { + "id": "openai/whisper-v3-turbo", + "provider": "openai", + "model": "whisper-v3-turbo", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/whisper-v3-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/whisper-v3-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/whisper-v3-turbo", + "mode": "audio_transcription" + } + ] + }, + { + "id": "opencode-go/mimo-v2-omni", + "provider": "opencode-go", + "model": "mimo-v2-omni", + "displayName": "MiMo V2 Omni", + "family": "mimo-v2-omni", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode-go" + ], + "aliases": [ + "opencode-go/mimo-v2-omni" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode-go", + "model": "mimo-v2-omni", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2 Omni" + ], + "families": [ + "mimo-v2-omni" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "mimo-v2-omni", + "modelKey": "mimo-v2-omni", + "displayName": "MiMo V2 Omni", + "family": "mimo-v2-omni", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "opencode-go/mimo-v2-pro", + "provider": "opencode-go", + "model": "mimo-v2-pro", + "displayName": "MiMo V2 Pro", + "family": "mimo-v2-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode-go" + ], + "aliases": [ + "opencode-go/mimo-v2-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode-go", + "model": "mimo-v2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.4, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2 Pro" + ], + "families": [ + "mimo-v2-pro" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "mimo-v2-pro", + "modelKey": "mimo-v2-pro", + "displayName": "MiMo V2 Pro", + "family": "mimo-v2-pro", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "opencode-go/mimo-v2.5", + "provider": "opencode-go", + "model": "mimo-v2.5", + "displayName": "MiMo V2.5", + "family": "mimo-v2.5", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode-go" + ], + "aliases": [ + "opencode-go/mimo-v2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode-go", + "model": "mimo-v2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.14, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2.5" + ], + "families": [ + "mimo-v2.5" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "mimo-v2.5", + "modelKey": "mimo-v2.5", + "displayName": "MiMo V2.5", + "family": "mimo-v2.5", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "opencode-go/mimo-v2.5-pro", + "provider": "opencode-go", + "model": "mimo-v2.5-pro", + "displayName": "MiMo V2.5 Pro", + "family": "mimo-v2.5-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode-go" + ], + "aliases": [ + "opencode-go/mimo-v2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode-go", + "model": "mimo-v2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0145, + "input": 1.74, + "output": 3.48 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2.5 Pro" + ], + "families": [ + "mimo-v2.5-pro" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "mimo-v2.5-pro", + "modelKey": "mimo-v2.5-pro", + "displayName": "MiMo V2.5 Pro", + "family": "mimo-v2.5-pro", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "opencode/big-pickle", + "provider": "opencode", + "model": "big-pickle", + "displayName": "Big Pickle", + "family": "big-pickle", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/big-pickle" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 160000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "big-pickle", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Big Pickle" + ], + "families": [ + "big-pickle" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-10-17", + "lastUpdated": "2025-10-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "big-pickle", + "modelKey": "big-pickle", + "displayName": "Big Pickle", + "family": "big-pickle", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-10-17", + "openWeights": false, + "releaseDate": "2025-10-17" + } + } + ] + }, + { + "id": "opencode/hy3-preview-free", + "provider": "opencode", + "model": "hy3-preview-free", + "displayName": "Hy3 preview Free", + "family": "hy3-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/hy3-preview-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "hy3-preview-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hy3 preview Free" + ], + "families": [ + "hy3-free" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2026-04-20", + "lastUpdated": "2026-04-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "hy3-preview-free", + "modelKey": "hy3-preview-free", + "displayName": "Hy3 preview Free", + "family": "hy3-free", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-04-20", + "openWeights": true, + "releaseDate": "2026-04-20" + } + } + ] + }, + { + "id": "opencode/ling-2.6-flash-free", + "provider": "opencode", + "model": "ling-2.6-flash-free", + "displayName": "Ling 2.6 Flash Free", + "family": "ling-flash-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/ling-2.6-flash-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262100, + "outputTokens": 32800, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "ling-2.6-flash-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ling 2.6 Flash Free" + ], + "families": [ + "ling-flash-free" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2026-04-21", + "lastUpdated": "2026-04-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "ling-2.6-flash-free", + "modelKey": "ling-2.6-flash-free", + "displayName": "Ling 2.6 Flash Free", + "family": "ling-flash-free", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-04-21", + "openWeights": true, + "releaseDate": "2026-04-21" + } + } + ] + }, + { + "id": "opencode/mimo-v2-flash-free", + "provider": "opencode", + "model": "mimo-v2-flash-free", + "displayName": "MiMo V2 Flash Free", + "family": "mimo-flash-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/mimo-v2-flash-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "mimo-v2-flash-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2 Flash Free" + ], + "families": [ + "mimo-flash-free" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2025-12-16", + "lastUpdated": "2025-12-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "mimo-v2-flash-free", + "modelKey": "mimo-v2-flash-free", + "displayName": "MiMo V2 Flash Free", + "family": "mimo-flash-free", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2025-12-16", + "openWeights": true, + "releaseDate": "2025-12-16" + } + } + ] + }, + { + "id": "opencode/mimo-v2-omni-free", + "provider": "opencode", + "model": "mimo-v2-omni-free", + "displayName": "MiMo V2 Omni Free", + "family": "mimo-omni-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/mimo-v2-omni-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "mimo-v2-omni-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2 Omni Free" + ], + "families": [ + "mimo-omni-free" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "mimo-v2-omni-free", + "modelKey": "mimo-v2-omni-free", + "displayName": "MiMo V2 Omni Free", + "family": "mimo-omni-free", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "opencode/mimo-v2-pro-free", + "provider": "opencode", + "model": "mimo-v2-pro-free", + "displayName": "MiMo V2 Pro Free", + "family": "mimo-pro-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/mimo-v2-pro-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "mimo-v2-pro-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2 Pro Free" + ], + "families": [ + "mimo-pro-free" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "mimo-v2-pro-free", + "modelKey": "mimo-v2-pro-free", + "displayName": "MiMo V2 Pro Free", + "family": "mimo-pro-free", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "opencode/mimo-v2.5-free", + "provider": "opencode", + "model": "mimo-v2.5-free", + "displayName": "MiMo V2.5 Free", + "family": "mimo-v2.5-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/mimo-v2.5-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "mimo-v2.5-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2.5 Free" + ], + "families": [ + "mimo-v2.5-free" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-24", + "lastUpdated": "2026-04-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "mimo-v2.5-free", + "modelKey": "mimo-v2.5-free", + "displayName": "MiMo V2.5 Free", + "family": "mimo-v2.5-free", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-24", + "openWeights": true, + "releaseDate": "2026-04-24" + } + } + ] + }, + { + "id": "opencode/nemotron-3-super-free", + "provider": "opencode", + "model": "nemotron-3-super-free", + "displayName": "Nemotron 3 Super Free", + "family": "nemotron-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/nemotron-3-super-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "nemotron-3-super-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron 3 Super Free" + ], + "families": [ + "nemotron-free" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2026-02", + "releaseDate": "2026-03-11", + "lastUpdated": "2026-03-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "nemotron-3-super-free", + "modelKey": "nemotron-3-super-free", + "displayName": "Nemotron 3 Super Free", + "family": "nemotron-free", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2026-02", + "lastUpdated": "2026-03-11", + "openWeights": true, + "releaseDate": "2026-03-11" + } + } + ] + }, + { + "id": "opencode/nemotron-3-ultra-free", + "provider": "opencode", + "model": "nemotron-3-ultra-free", + "displayName": "Nemotron 3 Ultra Free", + "family": "nemotron-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/nemotron-3-ultra-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "nemotron-3-ultra-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron 3 Ultra Free" + ], + "families": [ + "nemotron-free" + ], + "knowledgeCutoff": "2026-02", + "releaseDate": "2026-06-04", + "lastUpdated": "2026-06-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "nemotron-3-ultra-free", + "modelKey": "nemotron-3-ultra-free", + "displayName": "Nemotron 3 Ultra Free", + "family": "nemotron-free", + "metadata": { + "knowledgeCutoff": "2026-02", + "lastUpdated": "2026-06-04", + "openWeights": true, + "releaseDate": "2026-06-04" + } + } + ] + }, + { + "id": "opencode/north-mini-code-free", + "provider": "opencode", + "model": "north-mini-code-free", + "displayName": "North Mini Code Free", + "family": "north-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/north-mini-code-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "north-mini-code-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "North Mini Code Free" + ], + "families": [ + "north-free" + ], + "knowledgeCutoff": "2025-09-23", + "releaseDate": "2026-06-09", + "lastUpdated": "2026-06-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "north-mini-code-free", + "modelKey": "north-mini-code-free", + "displayName": "North Mini Code Free", + "family": "north-free", + "metadata": { + "knowledgeCutoff": "2025-09-23", + "lastUpdated": "2026-06-09", + "openWeights": true, + "releaseDate": "2026-06-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "opencode/ring-2.6-1t-free", + "provider": "opencode", + "model": "ring-2.6-1t-free", + "displayName": "Ring 2.6 1T Free", + "family": "ring-1t-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/ring-2.6-1t-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262000, + "outputTokens": 66000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "ring-2.6-1t-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ring 2.6 1T Free" + ], + "families": [ + "ring-1t-free" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2026-05-08", + "lastUpdated": "2026-05-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "ring-2.6-1t-free", + "modelKey": "ring-2.6-1t-free", + "displayName": "Ring 2.6 1T Free", + "family": "ring-1t-free", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-05-08", + "openWeights": true, + "releaseDate": "2026-05-08" + } + } + ] + }, + { + "id": "opencode/trinity-large-preview-free", + "provider": "opencode", + "model": "trinity-large-preview-free", + "displayName": "Trinity Large Preview", + "family": "trinity", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/trinity-large-preview-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "trinity-large-preview-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Trinity Large Preview" + ], + "families": [ + "trinity" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2026-01-28", + "lastUpdated": "2026-01-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "trinity-large-preview-free", + "modelKey": "trinity-large-preview-free", + "displayName": "Trinity Large Preview", + "family": "trinity", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-01-28", + "openWeights": true, + "releaseDate": "2026-01-28" + } + } + ] + }, + { + "id": "openrouter/aion-1.0", + "provider": "openrouter", + "model": "aion-1.0", + "displayName": "Aion-1.0", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/aion-labs/aion-1.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "aion-labs/aion-1.0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 4, + "output": 8 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "aion-labs/aion-1.0", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 4, + "output": 8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Aion-1.0", + "AionLabs: Aion-1.0" + ], + "releaseDate": "2025-02-04", + "lastUpdated": "2025-02-04", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "temperature", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "aion-labs/aion-1.0", + "modelKey": "aion-labs/aion-1.0", + "displayName": "Aion-1.0", + "metadata": { + "lastUpdated": "2025-02-04", + "openWeights": false, + "releaseDate": "2025-02-04" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "aion-labs/aion-1.0", + "displayName": "AionLabs: Aion-1.0", + "metadata": { + "canonicalSlug": "aion-labs/aion-1.0", + "createdAt": "2025-02-04T19:32:37.000Z", + "links": { + "details": "/api/v1/models/aion-labs/aion-1.0/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "temperature", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/aion-1.0-mini", + "provider": "openrouter", + "model": "aion-1.0-mini", + "displayName": "Aion-1.0-Mini", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/aion-labs/aion-1.0-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "aion-labs/aion-1.0-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 1.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "aion-labs/aion-1.0-mini", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.7, + "output": 1.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Aion-1.0-Mini", + "AionLabs: Aion-1.0-Mini" + ], + "releaseDate": "2025-02-04", + "lastUpdated": "2025-02-04", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "temperature", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "aion-labs/aion-1.0-mini", + "modelKey": "aion-labs/aion-1.0-mini", + "displayName": "Aion-1.0-Mini", + "metadata": { + "lastUpdated": "2025-02-04", + "openWeights": true, + "releaseDate": "2025-02-04" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "aion-labs/aion-1.0-mini", + "displayName": "AionLabs: Aion-1.0-Mini", + "metadata": { + "canonicalSlug": "aion-labs/aion-1.0-mini", + "createdAt": "2025-02-04T19:25:07.000Z", + "huggingFaceId": "FuseAI/FuseO1-DeepSeekR1-QwQ-SkyT1-32B-Preview", + "links": { + "details": "/api/v1/models/aion-labs/aion-1.0-mini/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "temperature", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/aion-2.0", + "provider": "openrouter", + "model": "aion-2.0", + "displayName": "Aion-2.0", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/aion-labs/aion-2.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "aion-labs/aion-2.0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.8, + "output": 1.6 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "aion-labs/aion-2.0", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.8, + "output": 1.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Aion-2.0", + "AionLabs: Aion-2.0" + ], + "releaseDate": "2026-02-23", + "lastUpdated": "2026-02-23", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "temperature", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "aion-labs/aion-2.0", + "modelKey": "aion-labs/aion-2.0", + "displayName": "Aion-2.0", + "metadata": { + "lastUpdated": "2026-02-23", + "openWeights": false, + "releaseDate": "2026-02-23" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "aion-labs/aion-2.0", + "displayName": "AionLabs: Aion-2.0", + "metadata": { + "canonicalSlug": "aion-labs/aion-2.0-20260223", + "createdAt": "2026-02-23T21:15:06.000Z", + "links": { + "details": "/api/v1/models/aion-labs/aion-2.0-20260223/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "temperature", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/aion-rp-llama-3.1-8b", + "provider": "openrouter", + "model": "aion-rp-llama-3.1-8b", + "displayName": "Aion-RP 1.0 (8B)", + "family": "llama", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/aion-labs/aion-rp-llama-3.1-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "aion-labs/aion-rp-llama-3.1-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 1.6 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "aion-labs/aion-rp-llama-3.1-8b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 1.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Aion-RP 1.0 (8B)", + "AionLabs: Aion-RP 1.0 (8B)" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12-31", + "releaseDate": "2025-02-04", + "lastUpdated": "2025-02-04", + "supportedParameters": [ + "max_tokens", + "temperature", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "aion-labs/aion-rp-llama-3.1-8b", + "modelKey": "aion-labs/aion-rp-llama-3.1-8b", + "displayName": "Aion-RP 1.0 (8B)", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12-31", + "lastUpdated": "2025-02-04", + "openWeights": false, + "releaseDate": "2025-02-04" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "aion-labs/aion-rp-llama-3.1-8b", + "displayName": "AionLabs: Aion-RP 1.0 (8B)", + "metadata": { + "canonicalSlug": "aion-labs/aion-rp-llama-3.1-8b", + "createdAt": "2025-02-04T19:18:38.000Z", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/aion-labs/aion-rp-llama-3.1-8b/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "temperature", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/auto", + "provider": "openrouter", + "model": "auto", + "displayName": "Auto Router", + "family": "auto", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/auto", + "openrouter/openrouter/auto" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "maxTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "file", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": true, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openrouter/auto", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openrouter/auto", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "Auto Router" + ], + "families": [ + "auto" + ], + "modes": [ + "chat" + ], + "releaseDate": "2023-11-08", + "lastUpdated": "2023-11-08", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_completion_tokens", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_a", + "top_k", + "top_logprobs", + "top_p", + "web_search_options" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openrouter/auto", + "modelKey": "openrouter/auto", + "displayName": "Auto Router", + "family": "auto", + "metadata": { + "lastUpdated": "2023-11-08", + "openWeights": false, + "releaseDate": "2023-11-08" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openrouter/auto", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openrouter/auto", + "displayName": "Auto Router", + "metadata": { + "canonicalSlug": "openrouter/auto", + "createdAt": "2023-11-08T00:00:00.000Z", + "links": { + "details": "/api/v1/models/openrouter/auto/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_completion_tokens", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_a", + "top_k", + "top_logprobs", + "top_p", + "web_search_options" + ], + "tokenizer": "Router", + "topProvider": { + "context_length": null, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/bodybuilder", + "provider": "openrouter", + "model": "bodybuilder", + "displayName": "Body Builder (beta)", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/bodybuilder", + "openrouter/openrouter/bodybuilder" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openrouter/bodybuilder", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openrouter/bodybuilder", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "Body Builder (beta)" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-12-05", + "lastUpdated": "2025-12-05", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openrouter/bodybuilder", + "modelKey": "openrouter/bodybuilder", + "displayName": "Body Builder (beta)", + "metadata": { + "lastUpdated": "2025-12-05", + "openWeights": false, + "releaseDate": "2025-12-05" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openrouter/bodybuilder", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openrouter/bodybuilder", + "displayName": "Body Builder (beta)", + "metadata": { + "canonicalSlug": "openrouter/bodybuilder", + "createdAt": "2025-12-05T03:00:53.000Z", + "links": { + "details": "/api/v1/models/openrouter/bodybuilder/endpoints" + }, + "tokenizer": "Router", + "topProvider": { + "context_length": null, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/coder-large", + "provider": "openrouter", + "model": "coder-large", + "displayName": "Coder Large", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/arcee-ai/coder-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "arcee-ai/coder-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 0.8 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "arcee-ai/coder-large", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.5, + "output": 0.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Arcee AI: Coder Large", + "Coder Large" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-05-05", + "lastUpdated": "2025-05-05", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "stop", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "arcee-ai/coder-large", + "modelKey": "arcee-ai/coder-large", + "displayName": "Coder Large", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-05", + "openWeights": false, + "releaseDate": "2025-05-05" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "arcee-ai/coder-large", + "displayName": "Arcee AI: Coder Large", + "metadata": { + "canonicalSlug": "arcee-ai/coder-large", + "createdAt": "2025-05-05T20:57:43.000Z", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/arcee-ai/coder-large/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "stop", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/cogito-v2.1-671b", + "provider": "openrouter", + "model": "cogito-v2.1-671b", + "displayName": "Cogito v2.1 671B", + "family": "cogito", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/deepcogito/cogito-v2.1-671b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "deepcogito/cogito-v2.1-671b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 1.25 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "deepcogito/cogito-v2.1-671b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.25, + "output": 1.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cogito v2.1 671B", + "Deep Cogito: Cogito v2.1 671B" + ], + "families": [ + "cogito" + ], + "releaseDate": "2025-11-13", + "lastUpdated": "2025-11-13", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "deepcogito/cogito-v2.1-671b", + "modelKey": "deepcogito/cogito-v2.1-671b", + "displayName": "Cogito v2.1 671B", + "family": "cogito", + "metadata": { + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "deepcogito/cogito-v2.1-671b", + "displayName": "Deep Cogito: Cogito v2.1 671B", + "metadata": { + "canonicalSlug": "deepcogito/cogito-v2.1-671b-20251118", + "createdAt": "2025-11-13T22:00:33.000Z", + "links": { + "details": "/api/v1/models/deepcogito/cogito-v2.1-671b-20251118/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/cydonia-24b-v4.1", + "provider": "openrouter", + "model": "cydonia-24b-v4.1", + "displayName": "Cydonia 24B V4.1", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/thedrummer/cydonia-24b-v4.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "thedrummer/cydonia-24b-v4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.3, + "output": 0.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "thedrummer/cydonia-24b-v4.1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.3, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cydonia 24B V4.1", + "TheDrummer: Cydonia 24B V4.1" + ], + "knowledgeCutoff": "2024-04-30", + "releaseDate": "2025-09-27", + "lastUpdated": "2025-09-27", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "thedrummer/cydonia-24b-v4.1", + "modelKey": "thedrummer/cydonia-24b-v4.1", + "displayName": "Cydonia 24B V4.1", + "metadata": { + "knowledgeCutoff": "2024-04-30", + "lastUpdated": "2025-09-27", + "openWeights": true, + "releaseDate": "2025-09-27" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "thedrummer/cydonia-24b-v4.1", + "displayName": "TheDrummer: Cydonia 24B V4.1", + "metadata": { + "canonicalSlug": "thedrummer/cydonia-24b-v4.1", + "createdAt": "2025-09-27T00:11:18.000Z", + "huggingFaceId": "thedrummer/cydonia-24b-v4.1", + "knowledgeCutoff": "2024-04-30", + "links": { + "details": "/api/v1/models/thedrummer/cydonia-24b-v4.1/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 131072, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/dolphin-mistral-24b-venice-edition:free", + "provider": "openrouter", + "model": "dolphin-mistral-24b-venice-edition:free", + "displayName": "Uncensored (free)", + "family": "mistral", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/cognitivecomputations/dolphin-mistral-24b-venice-edition:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "cognitivecomputations/dolphin-mistral-24b-venice-edition:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "cognitivecomputations/dolphin-mistral-24b-venice-edition:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Uncensored (free)", + "Venice: Uncensored (free)" + ], + "families": [ + "mistral" + ], + "knowledgeCutoff": "2024-04-30", + "releaseDate": "2025-07-09", + "lastUpdated": "2025-07-09", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "cognitivecomputations/dolphin-mistral-24b-venice-edition:free", + "modelKey": "cognitivecomputations/dolphin-mistral-24b-venice-edition:free", + "displayName": "Uncensored (free)", + "family": "mistral", + "metadata": { + "knowledgeCutoff": "2024-04-30", + "lastUpdated": "2025-07-09", + "openWeights": true, + "releaseDate": "2025-07-09" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "cognitivecomputations/dolphin-mistral-24b-venice-edition:free", + "displayName": "Venice: Uncensored (free)", + "metadata": { + "canonicalSlug": "venice/uncensored", + "createdAt": "2025-07-09T21:02:46.000Z", + "huggingFaceId": "cognitivecomputations/Dolphin-Mistral-24B-Venice-Edition", + "knowledgeCutoff": "2024-04-30", + "links": { + "details": "/api/v1/models/venice/uncensored/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/ernie-4.5-vl-424b-a47b", + "provider": "openrouter", + "model": "ernie-4.5-vl-424b-a47b", + "displayName": "ERNIE 4.5 VL 424B A47B", + "family": "ernie", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/baidu/ernie-4.5-vl-424b-a47b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "baidu/ernie-4.5-vl-424b-a47b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.42, + "output": 1.25 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "baidu/ernie-4.5-vl-424b-a47b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.42, + "output": 1.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Baidu: ERNIE 4.5 VL 424B A47B", + "ERNIE 4.5 VL 424B A47B" + ], + "families": [ + "ernie" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-06-30", + "lastUpdated": "2025-06-30", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "seed", + "stop", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "baidu/ernie-4.5-vl-424b-a47b", + "modelKey": "baidu/ernie-4.5-vl-424b-a47b", + "displayName": "ERNIE 4.5 VL 424B A47B", + "family": "ernie", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-06-30", + "openWeights": true, + "releaseDate": "2025-06-30" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "baidu/ernie-4.5-vl-424b-a47b", + "displayName": "Baidu: ERNIE 4.5 VL 424B A47B", + "metadata": { + "canonicalSlug": "baidu/ernie-4.5-vl-424b-a47b", + "createdAt": "2025-06-30T16:28:23.000Z", + "huggingFaceId": "baidu/ERNIE-4.5-VL-424B-A47B-PT", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/baidu/ernie-4.5-vl-424b-a47b/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "seed", + "stop", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 123000, + "max_completion_tokens": 16000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/free", + "provider": "openrouter", + "model": "free", + "displayName": "Free Models Router", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/free", + "openrouter/openrouter/free" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 200000, + "outputTokens": 200000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "openrouter/free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/openrouter/free", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openrouter/free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Free Models Router" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-02-01", + "lastUpdated": "2026-02-01", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_a", + "top_k", + "top_p" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openrouter/free", + "modelKey": "openrouter/free", + "displayName": "Free Models Router", + "metadata": { + "lastUpdated": "2026-02-01", + "openWeights": false, + "releaseDate": "2026-02-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/openrouter/free", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openrouter/free", + "displayName": "Free Models Router", + "metadata": { + "canonicalSlug": "openrouter/free", + "createdAt": "2026-02-01T03:43:47.000Z", + "links": { + "details": "/api/v1/models/openrouter/free/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_a", + "top_k", + "top_p" + ], + "tokenizer": "Router", + "topProvider": { + "context_length": null, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/fusion", + "provider": "openrouter", + "model": "fusion", + "displayName": "Fusion", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/fusion" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "openrouter", + "provider": "openrouter", + "model": "openrouter/fusion", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "Fusion", + "OpenRouter: Fusion" + ], + "releaseDate": "2026-06-13", + "lastUpdated": "2026-06-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openrouter/fusion", + "modelKey": "openrouter/fusion", + "displayName": "Fusion", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": false, + "releaseDate": "2026-06-13" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openrouter/fusion", + "displayName": "OpenRouter: Fusion", + "metadata": { + "canonicalSlug": "openrouter/fusion", + "createdAt": "2026-06-13T17:27:27.000Z", + "links": { + "details": "/api/v1/models/openrouter/fusion/endpoints" + }, + "tokenizer": "Router", + "topProvider": { + "context_length": null, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/granite-4.0-h-micro", + "provider": "openrouter", + "model": "granite-4.0-h-micro", + "displayName": "Granite 4.0 Micro", + "family": "granite", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/ibm-granite/granite-4.0-h-micro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131000, + "outputTokens": 131000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "ibm-granite/granite-4.0-h-micro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.017, + "output": 0.112 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "ibm-granite/granite-4.0-h-micro", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.017, + "output": 0.112 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Granite 4.0 Micro", + "IBM: Granite 4.0 Micro" + ], + "families": [ + "granite" + ], + "releaseDate": "2025-10-20", + "lastUpdated": "2025-10-20", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "ibm-granite/granite-4.0-h-micro", + "modelKey": "ibm-granite/granite-4.0-h-micro", + "displayName": "Granite 4.0 Micro", + "family": "granite", + "metadata": { + "lastUpdated": "2025-10-20", + "openWeights": true, + "releaseDate": "2025-10-20" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "ibm-granite/granite-4.0-h-micro", + "displayName": "IBM: Granite 4.0 Micro", + "metadata": { + "canonicalSlug": "ibm-granite/granite-4.0-h-micro", + "createdAt": "2025-10-20T02:34:55.000Z", + "huggingFaceId": "ibm-granite/granite-4.0-h-micro", + "links": { + "details": "/api/v1/models/ibm-granite/granite-4.0-h-micro/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 131000, + "max_completion_tokens": 131000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/granite-4.1-8b", + "provider": "openrouter", + "model": "granite-4.1-8b", + "displayName": "Granite 4.1 8B", + "family": "granite", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/ibm-granite/granite-4.1-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "ibm-granite/granite-4.1-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.05, + "output": 0.1 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "ibm-granite/granite-4.1-8b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.05, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Granite 4.1 8B", + "IBM: Granite 4.1 8B" + ], + "families": [ + "granite" + ], + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "ibm-granite/granite-4.1-8b", + "modelKey": "ibm-granite/granite-4.1-8b", + "displayName": "Granite 4.1 8B", + "family": "granite", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": true, + "releaseDate": "2026-04-30" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "ibm-granite/granite-4.1-8b", + "displayName": "IBM: Granite 4.1 8B", + "metadata": { + "canonicalSlug": "ibm-granite/granite-4.1-8b-20260429", + "createdAt": "2026-04-30T19:24:31.000Z", + "huggingFaceId": "ibm-granite/granite-4.1-8b", + "links": { + "details": "/api/v1/models/ibm-granite/granite-4.1-8b-20260429/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 131072, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/hermes-3-llama-3.1-405b", + "provider": "openrouter", + "model": "hermes-3-llama-3.1-405b", + "displayName": "Hermes 3 405B Instruct", + "family": "nousresearch", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/nousresearch/hermes-3-llama-3.1-405b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "nousresearch/hermes-3-llama-3.1-405b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 1 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "nousresearch/hermes-3-llama-3.1-405b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes 3 405B Instruct", + "Nous: Hermes 3 405B Instruct" + ], + "families": [ + "nousresearch" + ], + "knowledgeCutoff": "2023-12-31", + "releaseDate": "2024-08-16", + "lastUpdated": "2024-08-16", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "nousresearch/hermes-3-llama-3.1-405b", + "modelKey": "nousresearch/hermes-3-llama-3.1-405b", + "displayName": "Hermes 3 405B Instruct", + "family": "nousresearch", + "metadata": { + "knowledgeCutoff": "2023-12-31", + "lastUpdated": "2024-08-16", + "openWeights": true, + "releaseDate": "2024-08-16" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "nousresearch/hermes-3-llama-3.1-405b", + "displayName": "Nous: Hermes 3 405B Instruct", + "metadata": { + "canonicalSlug": "nousresearch/hermes-3-llama-3.1-405b", + "createdAt": "2024-08-16T00:00:00.000Z", + "huggingFaceId": "NousResearch/Hermes-3-Llama-3.1-405B", + "instructType": "chatml", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/nousresearch/hermes-3-llama-3.1-405b/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/hermes-3-llama-3.1-405b:free", + "provider": "openrouter", + "model": "hermes-3-llama-3.1-405b:free", + "displayName": "Hermes 3 405B Instruct (free)", + "family": "hermes", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/nousresearch/hermes-3-llama-3.1-405b:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "nousresearch/hermes-3-llama-3.1-405b:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "nousresearch/hermes-3-llama-3.1-405b:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes 3 405B Instruct (free)", + "Nous: Hermes 3 405B Instruct (free)" + ], + "families": [ + "hermes" + ], + "knowledgeCutoff": "2023-12-31", + "releaseDate": "2024-08-16", + "lastUpdated": "2024-08-16", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "stop", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "nousresearch/hermes-3-llama-3.1-405b:free", + "modelKey": "nousresearch/hermes-3-llama-3.1-405b:free", + "displayName": "Hermes 3 405B Instruct (free)", + "family": "hermes", + "metadata": { + "knowledgeCutoff": "2023-12-31", + "lastUpdated": "2024-08-16", + "openWeights": true, + "releaseDate": "2024-08-16" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "nousresearch/hermes-3-llama-3.1-405b:free", + "displayName": "Nous: Hermes 3 405B Instruct (free)", + "metadata": { + "canonicalSlug": "nousresearch/hermes-3-llama-3.1-405b", + "createdAt": "2024-08-16T00:00:00.000Z", + "huggingFaceId": "NousResearch/Hermes-3-Llama-3.1-405B", + "instructType": "chatml", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/nousresearch/hermes-3-llama-3.1-405b/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "stop", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/hermes-3-llama-3.1-70b", + "provider": "openrouter", + "model": "hermes-3-llama-3.1-70b", + "displayName": "Hermes 3 70B Instruct", + "family": "nousresearch", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/nousresearch/hermes-3-llama-3.1-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "nousresearch/hermes-3-llama-3.1-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 0.7 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "nousresearch/hermes-3-llama-3.1-70b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.7, + "output": 0.7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes 3 70B Instruct", + "Nous: Hermes 3 70B Instruct" + ], + "families": [ + "nousresearch" + ], + "knowledgeCutoff": "2023-12-31", + "releaseDate": "2024-08-18", + "lastUpdated": "2024-08-18", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "nousresearch/hermes-3-llama-3.1-70b", + "modelKey": "nousresearch/hermes-3-llama-3.1-70b", + "displayName": "Hermes 3 70B Instruct", + "family": "nousresearch", + "metadata": { + "knowledgeCutoff": "2023-12-31", + "lastUpdated": "2024-08-18", + "openWeights": true, + "releaseDate": "2024-08-18" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "nousresearch/hermes-3-llama-3.1-70b", + "displayName": "Nous: Hermes 3 70B Instruct", + "metadata": { + "canonicalSlug": "nousresearch/hermes-3-llama-3.1-70b", + "createdAt": "2024-08-18T00:00:00.000Z", + "huggingFaceId": "NousResearch/Hermes-3-Llama-3.1-70B", + "instructType": "chatml", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/nousresearch/hermes-3-llama-3.1-70b/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/hermes-4-405b", + "provider": "openrouter", + "model": "hermes-4-405b", + "displayName": "Hermes 4 405B", + "family": "hermes", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/nousresearch/hermes-4-405b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "nousresearch/hermes-4-405b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 3 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "nousresearch/hermes-4-405b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes 4 405B", + "Nous: Hermes 4 405B" + ], + "families": [ + "hermes" + ], + "knowledgeCutoff": "2024-08-31", + "releaseDate": "2025-08-26", + "lastUpdated": "2025-08-26", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "nousresearch/hermes-4-405b", + "modelKey": "nousresearch/hermes-4-405b", + "displayName": "Hermes 4 405B", + "family": "hermes", + "metadata": { + "knowledgeCutoff": "2024-08-31", + "lastUpdated": "2025-08-26", + "openWeights": true, + "releaseDate": "2025-08-26", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "nousresearch/hermes-4-405b", + "displayName": "Nous: Hermes 4 405B", + "metadata": { + "canonicalSlug": "nousresearch/hermes-4-405b", + "createdAt": "2025-08-26T19:11:03.000Z", + "huggingFaceId": "NousResearch/Hermes-4-405B", + "knowledgeCutoff": "2024-08-31", + "links": { + "details": "/api/v1/models/nousresearch/hermes-4-405b/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/hermes-4-70b", + "provider": "openrouter", + "model": "hermes-4-70b", + "displayName": "Hermes 4 70B", + "family": "hermes", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/nousresearch/hermes-4-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "nousresearch/hermes-4-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "nousresearch/hermes-4-70b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes 4 70B", + "Nous: Hermes 4 70B" + ], + "families": [ + "hermes" + ], + "knowledgeCutoff": "2024-08-31", + "releaseDate": "2025-08-26", + "lastUpdated": "2025-08-26", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "nousresearch/hermes-4-70b", + "modelKey": "nousresearch/hermes-4-70b", + "displayName": "Hermes 4 70B", + "family": "hermes", + "metadata": { + "knowledgeCutoff": "2024-08-31", + "lastUpdated": "2025-08-26", + "openWeights": true, + "releaseDate": "2025-08-26", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "nousresearch/hermes-4-70b", + "displayName": "Nous: Hermes 4 70B", + "metadata": { + "canonicalSlug": "nousresearch/hermes-4-70b", + "createdAt": "2025-08-26T19:23:02.000Z", + "huggingFaceId": "NousResearch/Hermes-4-70B", + "knowledgeCutoff": "2024-08-31", + "links": { + "details": "/api/v1/models/nousresearch/hermes-4-70b/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/hunyuan-a13b-instruct", + "provider": "openrouter", + "model": "hunyuan-a13b-instruct", + "displayName": "Hunyuan A13B Instruct", + "family": "hunyuan", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/tencent/hunyuan-a13b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "tencent/hunyuan-a13b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.57 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "tencent/hunyuan-a13b-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.14, + "output": 0.57 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hunyuan A13B Instruct", + "Tencent: Hunyuan A13B Instruct" + ], + "families": [ + "hunyuan" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-07-08", + "lastUpdated": "2025-07-08", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "tencent/hunyuan-a13b-instruct", + "modelKey": "tencent/hunyuan-a13b-instruct", + "displayName": "Hunyuan A13B Instruct", + "family": "hunyuan", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-07-08", + "openWeights": true, + "releaseDate": "2025-07-08" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "tencent/hunyuan-a13b-instruct", + "displayName": "Tencent: Hunyuan A13B Instruct", + "metadata": { + "canonicalSlug": "tencent/hunyuan-a13b-instruct", + "createdAt": "2025-07-08T15:14:24.000Z", + "huggingFaceId": "tencent/Hunyuan-A13B-Instruct", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/tencent/hunyuan-a13b-instruct/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 131072, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/hy3-preview", + "provider": "openrouter", + "model": "hy3-preview", + "displayName": "Hy3 preview", + "family": "Hy", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/tencent/hy3-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "tencent/hy3-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.029, + "input": 0.066, + "output": 0.26 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "tencent/hy3-preview", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.021, + "input": 0.063, + "output": 0.21 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hy3 preview", + "Tencent: Hy3 preview" + ], + "families": [ + "Hy" + ], + "releaseDate": "2026-04-20", + "lastUpdated": "2026-04-20", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "tencent/hy3-preview", + "modelKey": "tencent/hy3-preview", + "displayName": "Hy3 preview", + "family": "Hy", + "metadata": { + "lastUpdated": "2026-04-20", + "openWeights": true, + "releaseDate": "2026-04-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "high" + ] + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "tencent/hy3-preview", + "displayName": "Tencent: Hy3 preview", + "metadata": { + "canonicalSlug": "tencent/hy3-preview-20260421", + "createdAt": "2026-04-22T17:15:50.000Z", + "huggingFaceId": "tencent/Hy3-preview", + "links": { + "details": "/api/v1/models/tencent/hy3-preview-20260421/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true, + "supported_efforts": [ + "high", + "low", + "none" + ], + "default_effort": "high" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/inflection-3-pi", + "provider": "openrouter", + "model": "inflection-3-pi", + "displayName": "Inflection 3 Pi", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/inflection/inflection-3-pi" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "inflection/inflection-3-pi", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "inflection/inflection-3-pi", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Inflection 3 Pi", + "Inflection: Inflection 3 Pi" + ], + "knowledgeCutoff": "2024-10-31", + "releaseDate": "2024-10-11", + "lastUpdated": "2024-10-11", + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "inflection/inflection-3-pi", + "modelKey": "inflection/inflection-3-pi", + "displayName": "Inflection 3 Pi", + "metadata": { + "knowledgeCutoff": "2024-10-31", + "lastUpdated": "2024-10-11", + "openWeights": false, + "releaseDate": "2024-10-11" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "inflection/inflection-3-pi", + "displayName": "Inflection: Inflection 3 Pi", + "metadata": { + "canonicalSlug": "inflection/inflection-3-pi", + "createdAt": "2024-10-11T00:00:00.000Z", + "knowledgeCutoff": "2024-10-31", + "links": { + "details": "/api/v1/models/inflection/inflection-3-pi/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 8000, + "max_completion_tokens": 1024, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/inflection-3-productivity", + "provider": "openrouter", + "model": "inflection-3-productivity", + "displayName": "Inflection 3 Productivity", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/inflection/inflection-3-productivity" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "inflection/inflection-3-productivity", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "inflection/inflection-3-productivity", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.5, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Inflection 3 Productivity", + "Inflection: Inflection 3 Productivity" + ], + "knowledgeCutoff": "2024-10-31", + "releaseDate": "2024-10-11", + "lastUpdated": "2024-10-11", + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "inflection/inflection-3-productivity", + "modelKey": "inflection/inflection-3-productivity", + "displayName": "Inflection 3 Productivity", + "metadata": { + "knowledgeCutoff": "2024-10-31", + "lastUpdated": "2024-10-11", + "openWeights": false, + "releaseDate": "2024-10-11" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "inflection/inflection-3-productivity", + "displayName": "Inflection: Inflection 3 Productivity", + "metadata": { + "canonicalSlug": "inflection/inflection-3-productivity", + "createdAt": "2024-10-11T00:00:00.000Z", + "knowledgeCutoff": "2024-10-31", + "links": { + "details": "/api/v1/models/inflection/inflection-3-productivity/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 8000, + "max_completion_tokens": 1024, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/intellect-3", + "provider": "openrouter", + "model": "intellect-3", + "displayName": "INTELLECT-3", + "family": "glm", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/prime-intellect/intellect-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "prime-intellect/intellect-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.1 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "prime-intellect/intellect-3", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 1.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "INTELLECT-3", + "Prime Intellect: INTELLECT-3" + ], + "families": [ + "glm" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-11-27", + "lastUpdated": "2025-11-27", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "prime-intellect/intellect-3", + "modelKey": "prime-intellect/intellect-3", + "displayName": "INTELLECT-3", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-11-27", + "openWeights": true, + "releaseDate": "2025-11-27" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "prime-intellect/intellect-3", + "displayName": "Prime Intellect: INTELLECT-3", + "metadata": { + "canonicalSlug": "prime-intellect/intellect-3-20251126", + "createdAt": "2025-11-27T03:02:14.000Z", + "huggingFaceId": "PrimeIntellect/INTELLECT-3-FP8", + "links": { + "details": "/api/v1/models/prime-intellect/intellect-3-20251126/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 131072, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/kat-coder-pro-v2", + "provider": "openrouter", + "model": "kat-coder-pro-v2", + "displayName": "KAT-Coder-Pro V2", + "family": "kat-coder", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/kwaipilot/kat-coder-pro-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 80000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "kwaipilot/kat-coder-pro-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "kwaipilot/kat-coder-pro-v2", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "KAT-Coder-Pro V2", + "Kwaipilot: KAT-Coder-Pro V2" + ], + "families": [ + "kat-coder" + ], + "releaseDate": "2026-03-27", + "lastUpdated": "2026-03-27", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "kwaipilot/kat-coder-pro-v2", + "modelKey": "kwaipilot/kat-coder-pro-v2", + "displayName": "KAT-Coder-Pro V2", + "family": "kat-coder", + "metadata": { + "lastUpdated": "2026-03-27", + "openWeights": false, + "releaseDate": "2026-03-27" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "kwaipilot/kat-coder-pro-v2", + "displayName": "Kwaipilot: KAT-Coder-Pro V2", + "metadata": { + "canonicalSlug": "kwaipilot/kat-coder-pro-v2-20260327", + "createdAt": "2026-03-27T22:08:30.000Z", + "links": { + "details": "/api/v1/models/kwaipilot/kat-coder-pro-v2-20260327/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 256000, + "max_completion_tokens": 80000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/l3-lunaris-8b", + "provider": "openrouter", + "model": "l3-lunaris-8b", + "displayName": "Llama 3 8B Lunaris", + "family": "llama", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/sao10k/l3-lunaris-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "sao10k/l3-lunaris-8b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.04, + "output": 0.05 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "sao10k/l3-lunaris-8b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.04, + "output": 0.05 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3 8B Lunaris", + "Sao10K: Llama 3 8B Lunaris" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12-31", + "releaseDate": "2024-08-13", + "lastUpdated": "2024-08-13", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "sao10k/l3-lunaris-8b", + "modelKey": "sao10k/l3-lunaris-8b", + "displayName": "Llama 3 8B Lunaris", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12-31", + "lastUpdated": "2024-08-13", + "openWeights": true, + "releaseDate": "2024-08-13" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "sao10k/l3-lunaris-8b", + "displayName": "Sao10K: Llama 3 8B Lunaris", + "metadata": { + "canonicalSlug": "sao10k/l3-lunaris-8b", + "createdAt": "2024-08-13T00:00:00.000Z", + "huggingFaceId": "Sao10K/L3-8B-Lunaris-v1", + "instructType": "llama3", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/sao10k/l3-lunaris-8b/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 8192, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/l3.1-70b-hanami-x1", + "provider": "openrouter", + "model": "l3.1-70b-hanami-x1", + "displayName": "Llama 3.1 70B Hanami x1", + "family": "llama", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/sao10k/l3.1-70b-hanami-x1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "sao10k/l3.1-70b-hanami-x1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 3 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "sao10k/l3.1-70b-hanami-x1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 70B Hanami x1", + "Sao10K: Llama 3.1 70B Hanami x1" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12-31", + "releaseDate": "2025-01-08", + "lastUpdated": "2025-01-08", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "sao10k/l3.1-70b-hanami-x1", + "modelKey": "sao10k/l3.1-70b-hanami-x1", + "displayName": "Llama 3.1 70B Hanami x1", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12-31", + "lastUpdated": "2025-01-08", + "openWeights": true, + "releaseDate": "2025-01-08" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "sao10k/l3.1-70b-hanami-x1", + "displayName": "Sao10K: Llama 3.1 70B Hanami x1", + "metadata": { + "canonicalSlug": "sao10k/l3.1-70b-hanami-x1", + "createdAt": "2025-01-08T02:20:54.000Z", + "huggingFaceId": "Sao10K/L3.1-70B-Hanami-x1", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/sao10k/l3.1-70b-hanami-x1/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 16000, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/l3.1-euryale-70b", + "provider": "openrouter", + "model": "l3.1-euryale-70b", + "displayName": "Llama 3.1 Euryale 70B v2.2", + "family": "llama", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/sao10k/l3.1-euryale-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "sao10k/l3.1-euryale-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.85, + "output": 0.85 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "sao10k/l3.1-euryale-70b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.85, + "output": 0.85 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.1 Euryale 70B v2.2", + "Sao10K: Llama 3.1 Euryale 70B v2.2" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12-31", + "releaseDate": "2024-08-28", + "lastUpdated": "2024-08-28", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "sao10k/l3.1-euryale-70b", + "modelKey": "sao10k/l3.1-euryale-70b", + "displayName": "Llama 3.1 Euryale 70B v2.2", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12-31", + "lastUpdated": "2024-08-28", + "openWeights": true, + "releaseDate": "2024-08-28" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "sao10k/l3.1-euryale-70b", + "displayName": "Sao10K: Llama 3.1 Euryale 70B v2.2", + "metadata": { + "canonicalSlug": "sao10k/l3.1-euryale-70b", + "createdAt": "2024-08-28T00:00:00.000Z", + "huggingFaceId": "Sao10K/L3.1-70B-Euryale-v2.2", + "instructType": "llama3", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/sao10k/l3.1-euryale-70b/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/l3.3-euryale-70b", + "provider": "openrouter", + "model": "l3.3-euryale-70b", + "displayName": "Llama 3.3 Euryale 70B", + "family": "llama", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/sao10k/l3.3-euryale-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "sao10k/l3.3-euryale-70b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.65, + "output": 0.75 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "sao10k/l3.3-euryale-70b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.65, + "output": 0.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Llama 3.3 Euryale 70B", + "Sao10K: Llama 3.3 Euryale 70B" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12-31", + "releaseDate": "2024-12-18", + "lastUpdated": "2024-12-18", + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "sao10k/l3.3-euryale-70b", + "modelKey": "sao10k/l3.3-euryale-70b", + "displayName": "Llama 3.3 Euryale 70B", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12-31", + "lastUpdated": "2024-12-18", + "openWeights": true, + "releaseDate": "2024-12-18" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "sao10k/l3.3-euryale-70b", + "displayName": "Sao10K: Llama 3.3 Euryale 70B", + "metadata": { + "canonicalSlug": "sao10k/l3.3-euryale-70b-v2.3", + "createdAt": "2024-12-18T15:32:08.000Z", + "huggingFaceId": "Sao10K/L3.3-70B-Euryale-v2.3", + "instructType": "llama3", + "knowledgeCutoff": "2023-12-31", + "links": { + "details": "/api/v1/models/sao10k/l3.3-euryale-70b-v2.3/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_logprobs", + "top_p" + ], + "tokenizer": "Llama3", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/laguna-m.1", + "provider": "openrouter", + "model": "laguna-m.1", + "displayName": "Laguna M.1", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/poolside/laguna-m.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "poolside/laguna-m.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.2, + "output": 0.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "poolside/laguna-m.1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.2, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Laguna M.1", + "Poolside: Laguna M.1" + ], + "releaseDate": "2026-04-28", + "lastUpdated": "2026-04-28", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "temperature", + "tool_choice", + "tools" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "poolside/laguna-m.1", + "modelKey": "poolside/laguna-m.1", + "displayName": "Laguna M.1", + "metadata": { + "lastUpdated": "2026-04-28", + "openWeights": true, + "releaseDate": "2026-04-28" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "poolside/laguna-m.1", + "displayName": "Poolside: Laguna M.1", + "metadata": { + "canonicalSlug": "poolside/laguna-m.1-20260312", + "createdAt": "2026-04-28T15:01:44.000Z", + "huggingFaceId": "poolside/Laguna-M.1", + "links": { + "details": "/api/v1/models/poolside/laguna-m.1-20260312/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "temperature", + "tool_choice", + "tools" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/laguna-m.1:free", + "provider": "openrouter", + "model": "laguna-m.1:free", + "displayName": "Laguna M.1 (free)", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/poolside/laguna-m.1:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "poolside/laguna-m.1:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "poolside/laguna-m.1:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Laguna M.1 (free)", + "Poolside: Laguna M.1 (free)" + ], + "releaseDate": "2026-04-28", + "lastUpdated": "2026-04-28", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "temperature", + "tool_choice", + "tools" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "poolside/laguna-m.1:free", + "modelKey": "poolside/laguna-m.1:free", + "displayName": "Laguna M.1 (free)", + "metadata": { + "lastUpdated": "2026-04-28", + "openWeights": true, + "releaseDate": "2026-04-28" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "poolside/laguna-m.1:free", + "displayName": "Poolside: Laguna M.1 (free)", + "metadata": { + "canonicalSlug": "poolside/laguna-m.1-20260312", + "createdAt": "2026-04-28T15:01:44.000Z", + "huggingFaceId": "poolside/Laguna-M.1", + "links": { + "details": "/api/v1/models/poolside/laguna-m.1-20260312/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "temperature", + "tool_choice", + "tools" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/laguna-xs.2", + "provider": "openrouter", + "model": "laguna-xs.2", + "displayName": "Laguna XS.2", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/poolside/laguna-xs.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "poolside/laguna-xs.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.1, + "output": 0.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "poolside/laguna-xs.2", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.1, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Laguna XS.2", + "Poolside: Laguna XS.2" + ], + "releaseDate": "2026-04-28", + "lastUpdated": "2026-04-28", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "temperature", + "tool_choice", + "tools" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "poolside/laguna-xs.2", + "modelKey": "poolside/laguna-xs.2", + "displayName": "Laguna XS.2", + "metadata": { + "lastUpdated": "2026-04-28", + "openWeights": true, + "releaseDate": "2026-04-28" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "poolside/laguna-xs.2", + "displayName": "Poolside: Laguna XS.2", + "metadata": { + "canonicalSlug": "poolside/laguna-xs.2-20260421", + "createdAt": "2026-04-28T15:20:04.000Z", + "huggingFaceId": "poolside/Laguna-XS.2", + "links": { + "details": "/api/v1/models/poolside/laguna-xs.2-20260421/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "temperature", + "tool_choice", + "tools" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/laguna-xs.2:free", + "provider": "openrouter", + "model": "laguna-xs.2:free", + "displayName": "Laguna XS.2 (free)", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/poolside/laguna-xs.2:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "poolside/laguna-xs.2:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "poolside/laguna-xs.2:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Laguna XS.2 (free)", + "Poolside: Laguna XS.2 (free)" + ], + "releaseDate": "2026-04-28", + "lastUpdated": "2026-04-28", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "temperature", + "tool_choice", + "tools" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "poolside/laguna-xs.2:free", + "modelKey": "poolside/laguna-xs.2:free", + "displayName": "Laguna XS.2 (free)", + "metadata": { + "lastUpdated": "2026-04-28", + "openWeights": true, + "releaseDate": "2026-04-28" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "poolside/laguna-xs.2:free", + "displayName": "Poolside: Laguna XS.2 (free)", + "metadata": { + "canonicalSlug": "poolside/laguna-xs.2-20260421", + "createdAt": "2026-04-28T15:20:04.000Z", + "huggingFaceId": "poolside/Laguna-XS.2", + "links": { + "details": "/api/v1/models/poolside/laguna-xs.2-20260421/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "temperature", + "tool_choice", + "tools" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/lfm-2-24b-a2b", + "provider": "openrouter", + "model": "lfm-2-24b-a2b", + "displayName": "LFM2-24B-A2B", + "family": "liquid", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/liquid/lfm-2-24b-a2b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "liquid/lfm-2-24b-a2b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.03, + "output": 0.12 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "liquid/lfm-2-24b-a2b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.03, + "output": 0.12 + } + } + ] + }, + "metadata": { + "displayNames": [ + "LFM2-24B-A2B", + "LiquidAI: LFM2-24B-A2B" + ], + "families": [ + "liquid" + ], + "releaseDate": "2026-02-25", + "lastUpdated": "2026-02-25", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "stop", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "liquid/lfm-2-24b-a2b", + "modelKey": "liquid/lfm-2-24b-a2b", + "displayName": "LFM2-24B-A2B", + "family": "liquid", + "metadata": { + "lastUpdated": "2026-02-25", + "openWeights": true, + "releaseDate": "2026-02-25" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "liquid/lfm-2-24b-a2b", + "displayName": "LiquidAI: LFM2-24B-A2B", + "metadata": { + "canonicalSlug": "liquid/lfm-2-24b-a2b-20260224", + "createdAt": "2026-02-25T19:45:11.000Z", + "huggingFaceId": "LiquidAI/LFM2-24B-A2B", + "links": { + "details": "/api/v1/models/liquid/lfm-2-24b-a2b-20260224/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "stop", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/lfm-2.5-1.2b-instruct:free", + "provider": "openrouter", + "model": "lfm-2.5-1.2b-instruct:free", + "displayName": "LFM2.5-1.2B-Instruct (free)", + "family": "liquid", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/liquid/lfm-2.5-1.2b-instruct:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "liquid/lfm-2.5-1.2b-instruct:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "liquid/lfm-2.5-1.2b-instruct:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "LFM2.5-1.2B-Instruct (free)", + "LiquidAI: LFM2.5-1.2B-Instruct (free)" + ], + "families": [ + "liquid" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2026-01-20", + "lastUpdated": "2026-01-20", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "liquid/lfm-2.5-1.2b-instruct:free", + "modelKey": "liquid/lfm-2.5-1.2b-instruct:free", + "displayName": "LFM2.5-1.2B-Instruct (free)", + "family": "liquid", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-01-20", + "openWeights": true, + "releaseDate": "2026-01-20" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "liquid/lfm-2.5-1.2b-instruct:free", + "displayName": "LiquidAI: LFM2.5-1.2B-Instruct (free)", + "metadata": { + "canonicalSlug": "liquid/lfm-2.5-1.2b-instruct-20260120", + "createdAt": "2026-01-20T16:45:21.000Z", + "huggingFaceId": "LiquidAI/LFM2.5-1.2B-Instruct", + "links": { + "details": "/api/v1/models/liquid/lfm-2.5-1.2b-instruct-20260120/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/lfm-2.5-1.2b-thinking:free", + "provider": "openrouter", + "model": "lfm-2.5-1.2b-thinking:free", + "displayName": "LFM2.5-1.2B-Thinking (free)", + "family": "liquid", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/liquid/lfm-2.5-1.2b-thinking:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "liquid/lfm-2.5-1.2b-thinking:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "liquid/lfm-2.5-1.2b-thinking:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "LFM2.5-1.2B-Thinking (free)", + "LiquidAI: LFM2.5-1.2B-Thinking (free)" + ], + "families": [ + "liquid" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2026-01-20", + "lastUpdated": "2026-01-20", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "liquid/lfm-2.5-1.2b-thinking:free", + "modelKey": "liquid/lfm-2.5-1.2b-thinking:free", + "displayName": "LFM2.5-1.2B-Thinking (free)", + "family": "liquid", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2026-01-20", + "openWeights": true, + "releaseDate": "2026-01-20" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "liquid/lfm-2.5-1.2b-thinking:free", + "displayName": "LiquidAI: LFM2.5-1.2B-Thinking (free)", + "metadata": { + "canonicalSlug": "liquid/lfm-2.5-1.2b-thinking-20260120", + "createdAt": "2026-01-20T16:45:27.000Z", + "huggingFaceId": "LiquidAI/LFM2.5-1.2B-Thinking", + "links": { + "details": "/api/v1/models/liquid/lfm-2.5-1.2b-thinking-20260120/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/ling-2.6-1t", + "provider": "openrouter", + "model": "ling-2.6-1t", + "displayName": "Ling-2.6-1T", + "family": "ling", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/inclusionai/ling-2.6-1t" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "inclusionai/ling-2.6-1t", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.075, + "output": 0.625 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "inclusionai/ling-2.6-1t", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.075, + "output": 0.625 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ling-2.6-1T", + "inclusionAI: Ling-2.6-1T" + ], + "families": [ + "ling" + ], + "releaseDate": "2026-04-23", + "lastUpdated": "2026-04-23", + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "inclusionai/ling-2.6-1t", + "modelKey": "inclusionai/ling-2.6-1t", + "displayName": "Ling-2.6-1T", + "family": "ling", + "metadata": { + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "inclusionai/ling-2.6-1t", + "displayName": "inclusionAI: Ling-2.6-1T", + "metadata": { + "canonicalSlug": "inclusionai/ling-2.6-1t-20260423", + "createdAt": "2026-04-23T12:43:58.000Z", + "links": { + "details": "/api/v1/models/inclusionai/ling-2.6-1t-20260423/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/ling-2.6-flash", + "provider": "openrouter", + "model": "ling-2.6-flash", + "displayName": "Ling-2.6-flash", + "family": "ling", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/inclusionai/ling-2.6-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "inclusionai/ling-2.6-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.002, + "input": 0.01, + "output": 0.03 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "inclusionai/ling-2.6-flash", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.002, + "input": 0.01, + "output": 0.03 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ling-2.6-flash", + "inclusionAI: Ling-2.6-flash" + ], + "families": [ + "ling" + ], + "releaseDate": "2026-04-21", + "lastUpdated": "2026-04-21", + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "inclusionai/ling-2.6-flash", + "modelKey": "inclusionai/ling-2.6-flash", + "displayName": "Ling-2.6-flash", + "family": "ling", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": false, + "releaseDate": "2026-04-21" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "inclusionai/ling-2.6-flash", + "displayName": "inclusionAI: Ling-2.6-flash", + "metadata": { + "canonicalSlug": "inclusionai/ling-2.6-flash-20260421", + "createdAt": "2026-04-21T18:24:46.000Z", + "links": { + "details": "/api/v1/models/inclusionai/ling-2.6-flash-20260421/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/magnum-v4-72b", + "provider": "openrouter", + "model": "magnum-v4-72b", + "displayName": "Magnum v4 72B", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/anthracite-org/magnum-v4-72b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "anthracite-org/magnum-v4-72b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "anthracite-org/magnum-v4-72b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Magnum v4 72B" + ], + "knowledgeCutoff": "2024-06-30", + "releaseDate": "2024-10-22", + "lastUpdated": "2024-10-22", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_a", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "anthracite-org/magnum-v4-72b", + "modelKey": "anthracite-org/magnum-v4-72b", + "displayName": "Magnum v4 72B", + "metadata": { + "knowledgeCutoff": "2024-06-30", + "lastUpdated": "2024-10-22", + "openWeights": true, + "releaseDate": "2024-10-22" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "anthracite-org/magnum-v4-72b", + "displayName": "Magnum v4 72B", + "metadata": { + "canonicalSlug": "anthracite-org/magnum-v4-72b", + "createdAt": "2024-10-22T00:00:00.000Z", + "huggingFaceId": "anthracite-org/magnum-v4-72b", + "instructType": "chatml", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/anthracite-org/magnum-v4-72b/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_a", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen", + "topProvider": { + "context_length": 16384, + "max_completion_tokens": 2048, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/mercury-2", + "provider": "openrouter", + "model": "mercury-2", + "displayName": "Mercury 2", + "family": "mercury", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/inception/mercury-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 50000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "inception/mercury-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 0.75 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "inception/mercury-2", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 0.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Inception: Mercury 2", + "Mercury 2" + ], + "families": [ + "mercury" + ], + "releaseDate": "2026-03-04", + "lastUpdated": "2026-03-04", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "inception/mercury-2", + "modelKey": "inception/mercury-2", + "displayName": "Mercury 2", + "family": "mercury", + "metadata": { + "lastUpdated": "2026-03-04", + "openWeights": false, + "releaseDate": "2026-03-04" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "inception/mercury-2", + "displayName": "Inception: Mercury 2", + "metadata": { + "canonicalSlug": "inception/mercury-2-20260304", + "createdAt": "2026-03-04T14:57:55.000Z", + "links": { + "details": "/api/v1/models/inception/mercury-2-20260304/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true, + "supported_efforts": [ + "high", + "medium", + "low", + "none" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 50000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/mimo-v2-flash", + "provider": "openrouter", + "model": "mimo-v2-flash", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/xiaomi/mimo-v2-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 262144, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/xiaomi/mimo-v2-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0, + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/xiaomi/mimo-v2-flash", + "mode": "chat" + } + ] + }, + { + "id": "openrouter/mimo-v2.5", + "provider": "openrouter", + "model": "mimo-v2.5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/xiaomi/mimo-v2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": false, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "xiaomi/mimo-v2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.14, + "output": 0.28 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/xiaomi/mimo-v2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 0, + "input": 0.4, + "output": 2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "xiaomi/mimo-v2.5", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.14, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5", + "Xiaomi: MiMo-V2.5" + ], + "families": [ + "mimo" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "xiaomi/mimo-v2.5", + "modelKey": "xiaomi/mimo-v2.5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/xiaomi/mimo-v2.5", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "xiaomi/mimo-v2.5", + "displayName": "Xiaomi: MiMo-V2.5", + "metadata": { + "canonicalSlug": "xiaomi/mimo-v2.5-20260422", + "createdAt": "2026-04-22T16:11:09.000Z", + "huggingFaceId": "XiaomiMiMo/MiMo-V2.5", + "links": { + "details": "/api/v1/models/xiaomi/mimo-v2.5-20260422/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 131072, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/mimo-v2.5-pro", + "provider": "openrouter", + "model": "mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/xiaomi/mimo-v2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "inputTokens": 1048576, + "maxTokens": 16384, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": false, + "parallelFunctionCalling": false, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "xiaomi/mimo-v2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0036, + "input": 0.435, + "output": 0.87 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/xiaomi/mimo-v2.5-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0, + "input": 1, + "output": 3 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "xiaomi/mimo-v2.5-pro", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.0036, + "input": 0.435, + "output": 0.87 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-Pro", + "Xiaomi: MiMo-V2.5-Pro" + ], + "families": [ + "mimo" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "xiaomi/mimo-v2.5-pro", + "modelKey": "xiaomi/mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/xiaomi/mimo-v2.5-pro", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "xiaomi/mimo-v2.5-pro", + "displayName": "Xiaomi: MiMo-V2.5-Pro", + "metadata": { + "canonicalSlug": "xiaomi/mimo-v2.5-pro-20260422", + "createdAt": "2026-04-22T16:11:13.000Z", + "huggingFaceId": "XiaomiMiMo/MiMo-V2.5-Pro", + "links": { + "details": "/api/v1/models/xiaomi/mimo-v2.5-pro-20260422/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 131072, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/morph-v3-fast", + "provider": "openrouter", + "model": "morph-v3-fast", + "displayName": "Morph V3 Fast", + "family": "morph", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/morph/morph-v3-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 81920, + "outputTokens": 38000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "morph/morph-v3-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 1.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "morph/morph-v3-fast", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Morph V3 Fast", + "Morph: Morph V3 Fast" + ], + "families": [ + "morph" + ], + "releaseDate": "2025-07-07", + "lastUpdated": "2025-07-07", + "supportedParameters": [ + "max_tokens", + "stop", + "temperature" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "morph/morph-v3-fast", + "modelKey": "morph/morph-v3-fast", + "displayName": "Morph V3 Fast", + "family": "morph", + "metadata": { + "lastUpdated": "2025-07-07", + "openWeights": false, + "releaseDate": "2025-07-07" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "morph/morph-v3-fast", + "displayName": "Morph: Morph V3 Fast", + "metadata": { + "canonicalSlug": "morph/morph-v3-fast", + "createdAt": "2025-07-07T17:40:02.000Z", + "links": { + "details": "/api/v1/models/morph/morph-v3-fast/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "stop", + "temperature" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 81920, + "max_completion_tokens": 38000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/morph-v3-large", + "provider": "openrouter", + "model": "morph-v3-large", + "displayName": "Morph V3 Large", + "family": "morph", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/morph/morph-v3-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "morph/morph-v3-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.9, + "output": 1.9 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "morph/morph-v3-large", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 1.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Morph V3 Large", + "Morph: Morph V3 Large" + ], + "families": [ + "morph" + ], + "releaseDate": "2025-07-07", + "lastUpdated": "2025-07-07", + "supportedParameters": [ + "logprobs", + "max_tokens", + "response_format", + "stop", + "structured_outputs", + "temperature", + "top_logprobs" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "morph/morph-v3-large", + "modelKey": "morph/morph-v3-large", + "displayName": "Morph V3 Large", + "family": "morph", + "metadata": { + "lastUpdated": "2025-07-07", + "openWeights": false, + "releaseDate": "2025-07-07" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "morph/morph-v3-large", + "displayName": "Morph: Morph V3 Large", + "metadata": { + "canonicalSlug": "morph/morph-v3-large", + "createdAt": "2025-07-07T17:54:18.000Z", + "links": { + "details": "/api/v1/models/morph/morph-v3-large/endpoints" + }, + "supportedParameters": [ + "logprobs", + "max_tokens", + "response_format", + "stop", + "structured_outputs", + "temperature", + "top_logprobs" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 131072, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/mythomax-l2-13b", + "provider": "openrouter", + "model": "mythomax-l2-13b", + "displayName": "MythoMax 13B", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/gryphe/mythomax-l2-13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "gryphe/mythomax-l2-13b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.06, + "output": 0.06 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/gryphe/mythomax-l2-13b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.875, + "output": 1.875 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "gryphe/mythomax-l2-13b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.06 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MythoMax 13B" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-06-30", + "releaseDate": "2023-07-02", + "lastUpdated": "2023-07-02", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_a", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "gryphe/mythomax-l2-13b", + "modelKey": "gryphe/mythomax-l2-13b", + "displayName": "MythoMax 13B", + "metadata": { + "knowledgeCutoff": "2023-06-30", + "lastUpdated": "2023-07-02", + "openWeights": true, + "releaseDate": "2023-07-02" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/gryphe/mythomax-l2-13b", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "gryphe/mythomax-l2-13b", + "displayName": "MythoMax 13B", + "metadata": { + "canonicalSlug": "gryphe/mythomax-l2-13b", + "createdAt": "2023-07-02T00:00:00.000Z", + "huggingFaceId": "Gryphe/MythoMax-L2-13b", + "instructType": "alpaca", + "knowledgeCutoff": "2023-06-30", + "links": { + "details": "/api/v1/models/gryphe/mythomax-l2-13b/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_a", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Llama2", + "topProvider": { + "context_length": 4096, + "max_completion_tokens": 4096, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/nemotron-3-nano-30b-a3b", + "provider": "openrouter", + "model": "nemotron-3-nano-30b-a3b", + "displayName": "Nemotron 3 Nano 30B A3B", + "family": "nemotron", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/nvidia/nemotron-3-nano-30b-a3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 228000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "nvidia/nemotron-3-nano-30b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "nvidia/nemotron-3-nano-30b-a3b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA: Nemotron 3 Nano 30B A3B", + "Nemotron 3 Nano 30B A3B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2025-12-15", + "lastUpdated": "2025-12-15", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "nvidia/nemotron-3-nano-30b-a3b", + "modelKey": "nvidia/nemotron-3-nano-30b-a3b", + "displayName": "Nemotron 3 Nano 30B A3B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2025-12-15", + "openWeights": true, + "releaseDate": "2025-12-15" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "nvidia/nemotron-3-nano-30b-a3b", + "displayName": "NVIDIA: Nemotron 3 Nano 30B A3B", + "metadata": { + "canonicalSlug": "nvidia/nemotron-3-nano-30b-a3b", + "createdAt": "2025-12-14T16:54:35.000Z", + "huggingFaceId": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16", + "links": { + "details": "/api/v1/models/nvidia/nemotron-3-nano-30b-a3b/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 228000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/nemotron-3-nano-30b-a3b:free", + "provider": "openrouter", + "model": "nemotron-3-nano-30b-a3b:free", + "displayName": "Nemotron 3 Nano 30B A3B (free)", + "family": "nemotron", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/nvidia/nemotron-3-nano-30b-a3b:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "nvidia/nemotron-3-nano-30b-a3b:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "nvidia/nemotron-3-nano-30b-a3b:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA: Nemotron 3 Nano 30B A3B (free)", + "Nemotron 3 Nano 30B A3B (free)" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2025-12-15", + "lastUpdated": "2025-12-15", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "seed", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "nvidia/nemotron-3-nano-30b-a3b:free", + "modelKey": "nvidia/nemotron-3-nano-30b-a3b:free", + "displayName": "Nemotron 3 Nano 30B A3B (free)", + "family": "nemotron", + "metadata": { + "lastUpdated": "2025-12-15", + "openWeights": true, + "releaseDate": "2025-12-15" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "nvidia/nemotron-3-nano-30b-a3b:free", + "displayName": "NVIDIA: Nemotron 3 Nano 30B A3B (free)", + "metadata": { + "canonicalSlug": "nvidia/nemotron-3-nano-30b-a3b", + "createdAt": "2025-12-14T16:54:35.000Z", + "huggingFaceId": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16", + "links": { + "details": "/api/v1/models/nvidia/nemotron-3-nano-30b-a3b/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "seed", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 256000, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/nemotron-3-nano-omni-30b-a3b-reasoning:free", + "provider": "openrouter", + "model": "nemotron-3-nano-omni-30b-a3b-reasoning:free", + "displayName": "Nemotron 3 Nano Omni (free)", + "family": "nemotron", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA: Nemotron 3 Nano Omni (free)", + "Nemotron 3 Nano Omni (free)" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-04-28", + "lastUpdated": "2026-04-28", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "seed", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", + "modelKey": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", + "displayName": "Nemotron 3 Nano Omni (free)", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-04-28", + "openWeights": true, + "releaseDate": "2026-04-28" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", + "displayName": "NVIDIA: Nemotron 3 Nano Omni (free)", + "metadata": { + "canonicalSlug": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning-20260428", + "createdAt": "2026-04-28T16:18:15.000Z", + "huggingFaceId": "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16", + "links": { + "details": "/api/v1/models/nvidia/nemotron-3-nano-omni-30b-a3b-reasoning-20260428/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true, + "supports_max_tokens": true + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "seed", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 256000, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/nemotron-3-super-120b-a12b", + "provider": "openrouter", + "model": "nemotron-3-super-120b-a12b", + "displayName": "Nemotron 3 Super 120B A12B", + "family": "nemotron", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/nvidia/nemotron-3-super-120b-a12b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 262144, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "nvidia/nemotron-3-super-120b-a12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.45 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "nvidia/nemotron-3-super-120b-a12b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.09, + "output": 0.45 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA: Nemotron 3 Super", + "Nemotron 3 Super 120B A12B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-03-11", + "lastUpdated": "2026-03-11", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "nvidia/nemotron-3-super-120b-a12b", + "modelKey": "nvidia/nemotron-3-super-120b-a12b", + "displayName": "Nemotron 3 Super 120B A12B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-03-11", + "openWeights": true, + "releaseDate": "2026-03-11" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "nvidia/nemotron-3-super-120b-a12b", + "displayName": "NVIDIA: Nemotron 3 Super", + "metadata": { + "canonicalSlug": "nvidia/nemotron-3-super-120b-a12b-20230311", + "createdAt": "2026-03-11T16:07:19.000Z", + "huggingFaceId": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8", + "links": { + "details": "/api/v1/models/nvidia/nemotron-3-super-120b-a12b-20230311/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true, + "supports_max_tokens": true, + "supported_efforts": [ + "medium", + "low" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/nemotron-3-super-120b-a12b:free", + "provider": "openrouter", + "model": "nemotron-3-super-120b-a12b:free", + "displayName": "Nemotron 3 Super (free)", + "family": "nemotron", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/nvidia/nemotron-3-super-120b-a12b:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 262144, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "nvidia/nemotron-3-super-120b-a12b:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "nvidia/nemotron-3-super-120b-a12b:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA: Nemotron 3 Super (free)", + "Nemotron 3 Super (free)" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-03-11", + "lastUpdated": "2026-03-11", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "nvidia/nemotron-3-super-120b-a12b:free", + "modelKey": "nvidia/nemotron-3-super-120b-a12b:free", + "displayName": "Nemotron 3 Super (free)", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-03-11", + "openWeights": true, + "releaseDate": "2026-03-11" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "nvidia/nemotron-3-super-120b-a12b:free", + "displayName": "NVIDIA: Nemotron 3 Super (free)", + "metadata": { + "canonicalSlug": "nvidia/nemotron-3-super-120b-a12b-20230311", + "createdAt": "2026-03-11T16:07:19.000Z", + "huggingFaceId": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8", + "links": { + "details": "/api/v1/models/nvidia/nemotron-3-super-120b-a12b-20230311/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true, + "supports_max_tokens": true, + "supported_efforts": [ + "medium", + "low" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 262144, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/nemotron-3-ultra-550b-a55b", + "provider": "openrouter", + "model": "nemotron-3-ultra-550b-a55b", + "displayName": "Nemotron 3 Ultra 550B A55B", + "family": "nemotron", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/nvidia/nemotron-3-ultra-550b-a55b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 16384, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "nvidia/nemotron-3-ultra-550b-a55b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.5, + "output": 2.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "nvidia/nemotron-3-ultra-550b-a55b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.5, + "output": 2.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA: Nemotron 3 Ultra", + "Nemotron 3 Ultra 550B A55B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-06-04", + "lastUpdated": "2026-06-04", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "nvidia/nemotron-3-ultra-550b-a55b", + "modelKey": "nvidia/nemotron-3-ultra-550b-a55b", + "displayName": "Nemotron 3 Ultra 550B A55B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-06-04", + "openWeights": true, + "releaseDate": "2026-06-04" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "nvidia/nemotron-3-ultra-550b-a55b", + "displayName": "NVIDIA: Nemotron 3 Ultra", + "metadata": { + "canonicalSlug": "nvidia/nemotron-3-ultra-550b-a55b-20260604", + "createdAt": "2026-06-04T05:33:28.000Z", + "huggingFaceId": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-BF16", + "links": { + "details": "/api/v1/models/nvidia/nemotron-3-ultra-550b-a55b-20260604/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true, + "supports_max_tokens": true, + "supported_efforts": [ + "high", + "medium" + ], + "default_effort": "high" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/nemotron-3-ultra-550b-a55b:free", + "provider": "openrouter", + "model": "nemotron-3-ultra-550b-a55b:free", + "displayName": "Nemotron 3 Ultra (free)", + "family": "nemotron", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/nvidia/nemotron-3-ultra-550b-a55b:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "nvidia/nemotron-3-ultra-550b-a55b:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "nvidia/nemotron-3-ultra-550b-a55b:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA: Nemotron 3 Ultra (free)", + "Nemotron 3 Ultra (free)" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-06-04", + "lastUpdated": "2026-06-04", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "seed", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "nvidia/nemotron-3-ultra-550b-a55b:free", + "modelKey": "nvidia/nemotron-3-ultra-550b-a55b:free", + "displayName": "Nemotron 3 Ultra (free)", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-06-04", + "openWeights": true, + "releaseDate": "2026-06-04" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "nvidia/nemotron-3-ultra-550b-a55b:free", + "displayName": "NVIDIA: Nemotron 3 Ultra (free)", + "metadata": { + "canonicalSlug": "nvidia/nemotron-3-ultra-550b-a55b-20260604", + "createdAt": "2026-06-04T05:33:28.000Z", + "huggingFaceId": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-BF16", + "links": { + "details": "/api/v1/models/nvidia/nemotron-3-ultra-550b-a55b-20260604/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true, + "supports_max_tokens": true, + "supported_efforts": [ + "high", + "medium" + ], + "default_effort": "high" + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "seed", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/nemotron-3.5-content-safety:free", + "provider": "openrouter", + "model": "nemotron-3.5-content-safety:free", + "displayName": "Nemotron 3.5 Content Safety (free)", + "family": "nemotron", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/nvidia/nemotron-3.5-content-safety:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "nvidia/nemotron-3.5-content-safety:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "nvidia/nemotron-3.5-content-safety:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA: Nemotron 3.5 Content Safety (free)", + "Nemotron 3.5 Content Safety (free)" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-06-04", + "lastUpdated": "2026-06-04", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "seed", + "temperature", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "nvidia/nemotron-3.5-content-safety:free", + "modelKey": "nvidia/nemotron-3.5-content-safety:free", + "displayName": "Nemotron 3.5 Content Safety (free)", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-06-04", + "openWeights": true, + "releaseDate": "2026-06-04" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "nvidia/nemotron-3.5-content-safety:free", + "displayName": "NVIDIA: Nemotron 3.5 Content Safety (free)", + "metadata": { + "canonicalSlug": "nvidia/nemotron-3.5-content-safety-20260604", + "createdAt": "2026-06-04T14:04:24.000Z", + "huggingFaceId": "nvidia/Nemotron-3.5-Content-Safety", + "links": { + "details": "/api/v1/models/nvidia/nemotron-3.5-content-safety-20260604/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "seed", + "temperature", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 8192, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/nemotron-nano-12b-v2-vl:free", + "provider": "openrouter", + "model": "nemotron-nano-12b-v2-vl:free", + "displayName": "Nemotron Nano 12B 2 VL (free)", + "family": "nemotron", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/nvidia/nemotron-nano-12b-v2-vl:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "nvidia/nemotron-nano-12b-v2-vl:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "nvidia/nemotron-nano-12b-v2-vl:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA: Nemotron Nano 12B 2 VL (free)", + "Nemotron Nano 12B 2 VL (free)" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2025-10-28", + "lastUpdated": "2025-10-28", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "seed", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "nvidia/nemotron-nano-12b-v2-vl:free", + "modelKey": "nvidia/nemotron-nano-12b-v2-vl:free", + "displayName": "Nemotron Nano 12B 2 VL (free)", + "family": "nemotron", + "metadata": { + "lastUpdated": "2025-10-28", + "openWeights": true, + "releaseDate": "2025-10-28" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "nvidia/nemotron-nano-12b-v2-vl:free", + "displayName": "NVIDIA: Nemotron Nano 12B 2 VL (free)", + "metadata": { + "canonicalSlug": "nvidia/nemotron-nano-12b-v2-vl", + "createdAt": "2025-10-28T18:19:25.000Z", + "huggingFaceId": "nvidia/NVIDIA-Nemotron-Nano-12B-v2-VL-BF16", + "links": { + "details": "/api/v1/models/nvidia/nemotron-nano-12b-v2-vl/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "seed", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 128000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/nemotron-nano-9b-v2:free", + "provider": "openrouter", + "model": "nemotron-nano-9b-v2:free", + "displayName": "Nemotron Nano 9B V2 (free)", + "family": "nemotron", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/nvidia/nemotron-nano-9b-v2:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "nvidia/nemotron-nano-9b-v2:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "nvidia/nemotron-nano-9b-v2:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA: Nemotron Nano 9B V2 (free)", + "Nemotron Nano 9B V2 (free)" + ], + "families": [ + "nemotron" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-08-18", + "lastUpdated": "2025-08-18", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "nvidia/nemotron-nano-9b-v2:free", + "modelKey": "nvidia/nemotron-nano-9b-v2:free", + "displayName": "Nemotron Nano 9B V2 (free)", + "family": "nemotron", + "metadata": { + "lastUpdated": "2025-08-18", + "openWeights": true, + "releaseDate": "2025-08-18" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "nvidia/nemotron-nano-9b-v2:free", + "displayName": "NVIDIA: Nemotron Nano 9B V2 (free)", + "metadata": { + "canonicalSlug": "nvidia/nemotron-nano-9b-v2", + "createdAt": "2025-09-05T21:13:27.000Z", + "huggingFaceId": "nvidia/NVIDIA-Nemotron-Nano-9B-v2", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/nvidia/nemotron-nano-9b-v2/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/nex-n2-pro:free", + "provider": "openrouter", + "model": "nex-n2-pro:free", + "displayName": "Nex-N2-Pro (free)", + "family": "agi", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/nex-agi/nex-n2-pro:free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "nex-agi/nex-n2-pro:free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "nex-agi/nex-n2-pro:free", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nex AGI: Nex-N2-Pro (free)", + "Nex-N2-Pro (free)" + ], + "families": [ + "agi" + ], + "releaseDate": "2026-06-08", + "lastUpdated": "2026-06-08", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logprobs", + "max_tokens", + "reasoning", + "response_format", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "nex-agi/nex-n2-pro:free", + "modelKey": "nex-agi/nex-n2-pro:free", + "displayName": "Nex-N2-Pro (free)", + "family": "agi", + "metadata": { + "lastUpdated": "2026-06-08", + "openWeights": true, + "releaseDate": "2026-06-08" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "nex-agi/nex-n2-pro:free", + "displayName": "Nex AGI: Nex-N2-Pro (free)", + "metadata": { + "canonicalSlug": "nex-agi/nex-n2-pro", + "createdAt": "2026-06-08T16:45:40.000Z", + "expirationDate": "2026-06-22", + "huggingFaceId": "nex-agi/Nex-N2-Pro", + "links": { + "details": "/api/v1/models/nex-agi/nex-n2-pro/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logprobs", + "max_tokens", + "reasoning", + "response_format", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Qwen3", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 262144, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/olmo-3-32b-think", + "provider": "openrouter", + "model": "olmo-3-32b-think", + "displayName": "Olmo 3 32B Think", + "family": "allenai", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/allenai/olmo-3-32b-think" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "allenai/olmo-3-32b-think", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "allenai/olmo-3-32b-think", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "AllenAI: Olmo 3 32B Think", + "Olmo 3 32B Think" + ], + "families": [ + "allenai" + ], + "releaseDate": "2025-11-21", + "lastUpdated": "2025-11-21", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "allenai/olmo-3-32b-think", + "modelKey": "allenai/olmo-3-32b-think", + "displayName": "Olmo 3 32B Think", + "family": "allenai", + "metadata": { + "lastUpdated": "2025-11-21", + "openWeights": true, + "releaseDate": "2025-11-21" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "allenai/olmo-3-32b-think", + "displayName": "AllenAI: Olmo 3 32B Think", + "metadata": { + "canonicalSlug": "allenai/olmo-3-32b-think-20251121", + "createdAt": "2025-11-21T20:51:16.000Z", + "huggingFaceId": "allenai/Olmo-3-32B-Think", + "links": { + "details": "/api/v1/models/allenai/olmo-3-32b-think-20251121/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 65536, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/owl-alpha", + "provider": "openrouter", + "model": "owl-alpha", + "displayName": "Owl Alpha", + "family": "alpha", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/owl-alpha" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048756, + "outputTokens": 262144, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "openrouter/owl-alpha", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "openrouter/owl-alpha", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Owl Alpha" + ], + "families": [ + "alpha" + ], + "statuses": [ + "alpha" + ], + "releaseDate": "2026-04-28", + "lastUpdated": "2026-04-28", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openrouter/owl-alpha", + "modelKey": "openrouter/owl-alpha", + "displayName": "Owl Alpha", + "family": "alpha", + "status": "alpha", + "metadata": { + "lastUpdated": "2026-04-28", + "openWeights": false, + "releaseDate": "2026-04-28" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openrouter/owl-alpha", + "displayName": "Owl Alpha", + "metadata": { + "canonicalSlug": "openrouter/owl-alpha", + "createdAt": "2026-04-28T17:49:49.000Z", + "links": { + "details": "/api/v1/models/openrouter/owl-alpha/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 1048756, + "max_completion_tokens": 262144, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/palmyra-x5", + "provider": "openrouter", + "model": "palmyra-x5", + "displayName": "Palmyra X5", + "family": "palmyra", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/writer/palmyra-x5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1040000, + "outputTokens": 8192, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "writer/palmyra-x5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 6 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "writer/palmyra-x5", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Palmyra X5", + "Writer: Palmyra X5" + ], + "families": [ + "palmyra" + ], + "releaseDate": "2026-01-21", + "lastUpdated": "2026-01-21", + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "writer/palmyra-x5", + "modelKey": "writer/palmyra-x5", + "displayName": "Palmyra X5", + "family": "palmyra", + "metadata": { + "lastUpdated": "2026-01-21", + "openWeights": false, + "releaseDate": "2026-01-21" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "writer/palmyra-x5", + "displayName": "Writer: Palmyra X5", + "metadata": { + "canonicalSlug": "writer/palmyra-x5-20250428", + "createdAt": "2026-01-21T13:57:03.000Z", + "links": { + "details": "/api/v1/models/writer/palmyra-x5-20250428/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "stop", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 1040000, + "max_completion_tokens": 8192, + "is_moderated": true + } + } + } + ] + }, + { + "id": "openrouter/pareto-code", + "provider": "openrouter", + "model": "pareto-code", + "displayName": "Pareto Code Router", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/pareto-code" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2000000, + "outputTokens": 200000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "openrouter", + "provider": "openrouter", + "model": "openrouter/pareto-code", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "displayNames": [ + "Pareto Code Router" + ], + "releaseDate": "2026-04-21", + "lastUpdated": "2026-04-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "openrouter/pareto-code", + "modelKey": "openrouter/pareto-code", + "displayName": "Pareto Code Router", + "metadata": { + "lastUpdated": "2026-04-21", + "openWeights": false, + "releaseDate": "2026-04-21" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "openrouter/pareto-code", + "displayName": "Pareto Code Router", + "metadata": { + "canonicalSlug": "openrouter/pareto-code", + "createdAt": "2026-04-21T05:05:00.000Z", + "links": { + "details": "/api/v1/models/openrouter/pareto-code/endpoints" + }, + "tokenizer": "Router", + "topProvider": { + "context_length": null, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/perceptron-mk1", + "provider": "openrouter", + "model": "perceptron-mk1", + "displayName": "Perceptron Mk1", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/perceptron/perceptron-mk1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": true, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "perceptron/perceptron-mk1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 1.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "perceptron/perceptron-mk1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Perceptron Mk1", + "Perceptron: Perceptron Mk1" + ], + "releaseDate": "2026-05-12", + "lastUpdated": "2026-05-12", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "perceptron/perceptron-mk1", + "modelKey": "perceptron/perceptron-mk1", + "displayName": "Perceptron Mk1", + "metadata": { + "lastUpdated": "2026-05-12", + "openWeights": false, + "releaseDate": "2026-05-12" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "perceptron/perceptron-mk1", + "displayName": "Perceptron: Perceptron Mk1", + "metadata": { + "canonicalSlug": "perceptron/perceptron-mk1-20260512", + "createdAt": "2026-05-12T14:43:49.000Z", + "links": { + "details": "/api/v1/models/perceptron/perceptron-mk1-20260512/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": 8192, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/phi-4", + "provider": "openrouter", + "model": "phi-4", + "displayName": "Phi 4", + "family": "phi", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/microsoft/phi-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "microsoft/phi-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.065, + "output": 0.14 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "microsoft/phi-4", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.065, + "output": 0.14 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Microsoft: Phi 4", + "Phi 4" + ], + "families": [ + "phi" + ], + "knowledgeCutoff": "2024-06-30", + "releaseDate": "2025-01-10", + "lastUpdated": "2025-01-10", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "microsoft/phi-4", + "modelKey": "microsoft/phi-4", + "displayName": "Phi 4", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2024-06-30", + "lastUpdated": "2025-01-10", + "openWeights": true, + "releaseDate": "2025-01-10" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "microsoft/phi-4", + "displayName": "Microsoft: Phi 4", + "metadata": { + "canonicalSlug": "microsoft/phi-4", + "createdAt": "2025-01-10T06:17:52.000Z", + "huggingFaceId": "microsoft/phi-4", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/microsoft/phi-4/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 16384, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/phi-4-mini-instruct", + "provider": "openrouter", + "model": "phi-4-mini-instruct", + "displayName": "Phi 4 Mini Instruct", + "family": "phi", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/microsoft/phi-4-mini-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "microsoft/phi-4-mini-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.08, + "output": 0.35 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "microsoft/phi-4-mini-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.08, + "output": 0.35 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Microsoft: Phi 4 Mini Instruct", + "Phi 4 Mini Instruct" + ], + "families": [ + "phi" + ], + "releaseDate": "2025-10-17", + "lastUpdated": "2025-10-17", + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "microsoft/phi-4-mini-instruct", + "modelKey": "microsoft/phi-4-mini-instruct", + "displayName": "Phi 4 Mini Instruct", + "family": "phi", + "metadata": { + "lastUpdated": "2025-10-17", + "openWeights": true, + "releaseDate": "2025-10-17" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "microsoft/phi-4-mini-instruct", + "displayName": "Microsoft: Phi 4 Mini Instruct", + "metadata": { + "canonicalSlug": "microsoft/phi-4-mini-instruct", + "createdAt": "2025-10-17T18:34:09.000Z", + "huggingFaceId": "microsoft/Phi-4-mini-instruct", + "links": { + "details": "/api/v1/models/microsoft/phi-4-mini-instruct/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 128000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/reka-edge", + "provider": "openrouter", + "model": "reka-edge", + "displayName": "Reka Edge", + "family": "reka", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/rekaai/reka-edge" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "rekaai/reka-edge", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "rekaai/reka-edge", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Reka Edge" + ], + "families": [ + "reka" + ], + "releaseDate": "2026-03-20", + "lastUpdated": "2026-03-20", + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "rekaai/reka-edge", + "modelKey": "rekaai/reka-edge", + "displayName": "Reka Edge", + "family": "reka", + "metadata": { + "lastUpdated": "2026-03-20", + "openWeights": true, + "releaseDate": "2026-03-20" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "rekaai/reka-edge", + "displayName": "Reka Edge", + "metadata": { + "canonicalSlug": "rekaai/reka-edge-2603", + "createdAt": "2026-03-20T17:16:05.000Z", + "huggingFaceId": "RekaAI/reka-edge-2603", + "links": { + "details": "/api/v1/models/rekaai/reka-edge-2603/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 16384, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/reka-flash-3", + "provider": "openrouter", + "model": "reka-flash-3", + "displayName": "Reka Flash 3", + "family": "reka", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/rekaai/reka-flash-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "rekaai/reka-flash-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "rekaai/reka-flash-3", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Reka Flash 3" + ], + "families": [ + "reka" + ], + "knowledgeCutoff": "2025-01-31", + "releaseDate": "2025-03-12", + "lastUpdated": "2025-03-12", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "rekaai/reka-flash-3", + "modelKey": "rekaai/reka-flash-3", + "displayName": "Reka Flash 3", + "family": "reka", + "metadata": { + "knowledgeCutoff": "2025-01-31", + "lastUpdated": "2025-03-12", + "openWeights": true, + "releaseDate": "2025-03-12" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "rekaai/reka-flash-3", + "displayName": "Reka Flash 3", + "metadata": { + "canonicalSlug": "rekaai/reka-flash-3", + "createdAt": "2025-03-12T20:53:33.000Z", + "huggingFaceId": "RekaAI/reka-flash-3", + "knowledgeCutoff": "2025-01-31", + "links": { + "details": "/api/v1/models/rekaai/reka-flash-3/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 65536, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/relace-apply-3", + "provider": "openrouter", + "model": "relace-apply-3", + "displayName": "Relace Apply 3", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/relace/relace-apply-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "relace/relace-apply-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.85, + "output": 1.25 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "relace/relace-apply-3", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.85, + "output": 1.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Relace Apply 3", + "Relace: Relace Apply 3" + ], + "releaseDate": "2025-09-26", + "lastUpdated": "2025-09-26", + "supportedParameters": [ + "max_tokens", + "seed", + "stop" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "relace/relace-apply-3", + "modelKey": "relace/relace-apply-3", + "displayName": "Relace Apply 3", + "metadata": { + "lastUpdated": "2025-09-26", + "openWeights": false, + "releaseDate": "2025-09-26" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "relace/relace-apply-3", + "displayName": "Relace: Relace Apply 3", + "metadata": { + "canonicalSlug": "relace/relace-apply-3", + "createdAt": "2025-09-26T12:59:32.000Z", + "links": { + "details": "/api/v1/models/relace/relace-apply-3/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "seed", + "stop" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 256000, + "max_completion_tokens": 128000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/relace-search", + "provider": "openrouter", + "model": "relace-search", + "displayName": "Relace Search", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/relace/relace-search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "relace/relace-search", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 3 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "relace/relace-search", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Relace Search", + "Relace: Relace Search" + ], + "releaseDate": "2025-12-08", + "lastUpdated": "2025-12-08", + "supportedParameters": [ + "max_tokens", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "relace/relace-search", + "modelKey": "relace/relace-search", + "displayName": "Relace Search", + "metadata": { + "lastUpdated": "2025-12-08", + "openWeights": false, + "releaseDate": "2025-12-08" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "relace/relace-search", + "displayName": "Relace: Relace Search", + "metadata": { + "canonicalSlug": "relace/relace-search-20251208", + "createdAt": "2025-12-08T17:06:00.000Z", + "links": { + "details": "/api/v1/models/relace/relace-search-20251208/endpoints" + }, + "supportedParameters": [ + "max_tokens", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 256000, + "max_completion_tokens": 128000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/remm-slerp-l2-13b", + "provider": "openrouter", + "model": "remm-slerp-l2-13b", + "displayName": "ReMM SLERP 13B", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/undi95/remm-slerp-l2-13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 6144, + "inputTokens": 6144, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "undi95/remm-slerp-l2-13b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 0.65 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/undi95/remm-slerp-l2-13b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.875, + "output": 1.875 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "undi95/remm-slerp-l2-13b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.45, + "output": 0.65 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ReMM SLERP 13B" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-06-30", + "releaseDate": "2023-07-22", + "lastUpdated": "2023-07-22", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_a", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "undi95/remm-slerp-l2-13b", + "modelKey": "undi95/remm-slerp-l2-13b", + "displayName": "ReMM SLERP 13B", + "metadata": { + "knowledgeCutoff": "2023-06-30", + "lastUpdated": "2023-07-22", + "openWeights": true, + "releaseDate": "2023-07-22" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/undi95/remm-slerp-l2-13b", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "undi95/remm-slerp-l2-13b", + "displayName": "ReMM SLERP 13B", + "metadata": { + "canonicalSlug": "undi95/remm-slerp-l2-13b", + "createdAt": "2023-07-22T00:00:00.000Z", + "huggingFaceId": "Undi95/ReMM-SLERP-L2-13B", + "instructType": "alpaca", + "knowledgeCutoff": "2023-06-30", + "links": { + "details": "/api/v1/models/undi95/remm-slerp-l2-13b/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_a", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Llama2", + "topProvider": { + "context_length": 6144, + "max_completion_tokens": 4096, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/ring-2.6-1t", + "provider": "openrouter", + "model": "ring-2.6-1t", + "displayName": "Ring-2.6-1T", + "family": "ring", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/inclusionai/ring-2.6-1t" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "inclusionai/ring-2.6-1t", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.075, + "output": 0.625 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "inclusionai/ring-2.6-1t", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.075, + "output": 0.625 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ring-2.6-1T", + "inclusionAI: Ring-2.6-1T" + ], + "families": [ + "ring" + ], + "releaseDate": "2026-05-08", + "lastUpdated": "2026-05-08", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "inclusionai/ring-2.6-1t", + "modelKey": "inclusionai/ring-2.6-1t", + "displayName": "Ring-2.6-1T", + "family": "ring", + "metadata": { + "lastUpdated": "2026-05-08", + "openWeights": false, + "releaseDate": "2026-05-08" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "inclusionai/ring-2.6-1t", + "displayName": "inclusionAI: Ring-2.6-1T", + "metadata": { + "canonicalSlug": "inclusionai/ring-2.6-1t-20260508", + "createdAt": "2026-05-08T13:37:20.000Z", + "links": { + "details": "/api/v1/models/inclusionai/ring-2.6-1t-20260508/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "xhigh", + "high" + ], + "default_effort": "high" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 65536, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/rnj-1-instruct", + "provider": "openrouter", + "model": "rnj-1-instruct", + "displayName": "Rnj 1 Instruct", + "family": "rnj", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/essentialai/rnj-1-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "essentialai/rnj-1-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "essentialai/rnj-1-instruct", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "EssentialAI: Rnj 1 Instruct", + "Rnj 1 Instruct" + ], + "families": [ + "rnj" + ], + "releaseDate": "2025-12-07", + "lastUpdated": "2025-12-07", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "essentialai/rnj-1-instruct", + "modelKey": "essentialai/rnj-1-instruct", + "displayName": "Rnj 1 Instruct", + "family": "rnj", + "metadata": { + "lastUpdated": "2025-12-07", + "openWeights": true, + "releaseDate": "2025-12-07" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "essentialai/rnj-1-instruct", + "displayName": "EssentialAI: Rnj 1 Instruct", + "metadata": { + "canonicalSlug": "essentialai/rnj-1-instruct", + "createdAt": "2025-12-07T08:07:27.000Z", + "huggingFaceId": "EssentialAI/rnj-1-instruct", + "links": { + "details": "/api/v1/models/essentialai/rnj-1-instruct/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/rocinante-12b", + "provider": "openrouter", + "model": "rocinante-12b", + "displayName": "Rocinante 12B", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/thedrummer/rocinante-12b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "thedrummer/rocinante-12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.17, + "output": 0.43 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "thedrummer/rocinante-12b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.17, + "output": 0.43 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Rocinante 12B", + "TheDrummer: Rocinante 12B" + ], + "knowledgeCutoff": "2024-04-30", + "releaseDate": "2024-09-30", + "lastUpdated": "2024-09-30", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "thedrummer/rocinante-12b", + "modelKey": "thedrummer/rocinante-12b", + "displayName": "Rocinante 12B", + "metadata": { + "knowledgeCutoff": "2024-04-30", + "lastUpdated": "2024-09-30", + "openWeights": true, + "releaseDate": "2024-09-30" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "thedrummer/rocinante-12b", + "displayName": "TheDrummer: Rocinante 12B", + "metadata": { + "canonicalSlug": "thedrummer/rocinante-12b", + "createdAt": "2024-09-30T00:00:00.000Z", + "huggingFaceId": "TheDrummer/Rocinante-12B-v1.1", + "instructType": "chatml", + "knowledgeCutoff": "2024-04-30", + "links": { + "details": "/api/v1/models/thedrummer/rocinante-12b/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Qwen", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/router", + "provider": "openrouter", + "model": "router", + "displayName": "Switchpoint Router", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/switchpoint/router" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "switchpoint/router", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.85, + "output": 3.4 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/switchpoint/router", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.85, + "output": 3.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "switchpoint/router", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.85, + "output": 3.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Switchpoint Router" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-07-11", + "lastUpdated": "2025-07-11", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "switchpoint/router", + "modelKey": "switchpoint/router", + "displayName": "Switchpoint Router", + "metadata": { + "lastUpdated": "2025-07-11", + "openWeights": false, + "releaseDate": "2025-07-11" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/switchpoint/router", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/switchpoint/router" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "switchpoint/router", + "displayName": "Switchpoint Router", + "metadata": { + "canonicalSlug": "switchpoint/router", + "createdAt": "2025-07-11T22:28:19.000Z", + "links": { + "details": "/api/v1/models/switchpoint/router/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/seed-1.6", + "provider": "openrouter", + "model": "seed-1.6", + "displayName": "Seed 1.6", + "family": "seed", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/bytedance-seed/seed-1.6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "bytedance-seed/seed-1.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "bytedance-seed/seed-1.6", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ByteDance Seed: Seed 1.6", + "Seed 1.6" + ], + "families": [ + "seed" + ], + "releaseDate": "2025-12-23", + "lastUpdated": "2025-12-23", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "bytedance-seed/seed-1.6", + "modelKey": "bytedance-seed/seed-1.6", + "displayName": "Seed 1.6", + "family": "seed", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": false, + "releaseDate": "2025-12-23" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "bytedance-seed/seed-1.6", + "displayName": "ByteDance Seed: Seed 1.6", + "metadata": { + "canonicalSlug": "bytedance-seed/seed-1.6-20250625", + "createdAt": "2025-12-23T15:49:57.000Z", + "links": { + "details": "/api/v1/models/bytedance-seed/seed-1.6-20250625/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/seed-1.6-flash", + "provider": "openrouter", + "model": "seed-1.6-flash", + "displayName": "Seed 1.6 Flash", + "family": "seed", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/bytedance-seed/seed-1.6-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "bytedance-seed/seed-1.6-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "bytedance-seed/seed-1.6-flash", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ByteDance Seed: Seed 1.6 Flash", + "Seed 1.6 Flash" + ], + "families": [ + "seed" + ], + "releaseDate": "2025-12-23", + "lastUpdated": "2025-12-23", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "bytedance-seed/seed-1.6-flash", + "modelKey": "bytedance-seed/seed-1.6-flash", + "displayName": "Seed 1.6 Flash", + "family": "seed", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": false, + "releaseDate": "2025-12-23" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "bytedance-seed/seed-1.6-flash", + "displayName": "ByteDance Seed: Seed 1.6 Flash", + "metadata": { + "canonicalSlug": "bytedance-seed/seed-1.6-flash-20250625", + "createdAt": "2025-12-23T15:50:11.000Z", + "links": { + "details": "/api/v1/models/bytedance-seed/seed-1.6-flash-20250625/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/seed-2.0-lite", + "provider": "openrouter", + "model": "seed-2.0-lite", + "displayName": "Seed-2.0-Lite", + "family": "seed", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/bytedance-seed/seed-2.0-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "bytedance-seed/seed-2.0-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "bytedance-seed/seed-2.0-lite", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ByteDance Seed: Seed-2.0-Lite", + "Seed-2.0-Lite" + ], + "families": [ + "seed" + ], + "releaseDate": "2026-03-10", + "lastUpdated": "2026-03-10", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "bytedance-seed/seed-2.0-lite", + "modelKey": "bytedance-seed/seed-2.0-lite", + "displayName": "Seed-2.0-Lite", + "family": "seed", + "metadata": { + "lastUpdated": "2026-03-10", + "openWeights": false, + "releaseDate": "2026-03-10" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "bytedance-seed/seed-2.0-lite", + "displayName": "ByteDance Seed: Seed-2.0-Lite", + "metadata": { + "canonicalSlug": "bytedance-seed/seed-2.0-lite-20260309", + "createdAt": "2026-03-10T15:40:31.000Z", + "links": { + "details": "/api/v1/models/bytedance-seed/seed-2.0-lite-20260309/endpoints" + }, + "reasoning": { + "mandatory": false, + "supported_efforts": [ + "high", + "medium", + "low", + "minimal" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 131072, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/seed-2.0-mini", + "provider": "openrouter", + "model": "seed-2.0-mini", + "displayName": "Seed-2.0-Mini", + "family": "seed", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/bytedance-seed/seed-2.0-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "bytedance-seed/seed-2.0-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "bytedance-seed/seed-2.0-mini", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ByteDance Seed: Seed-2.0-Mini", + "Seed-2.0-Mini" + ], + "families": [ + "seed" + ], + "releaseDate": "2026-02-26", + "lastUpdated": "2026-02-26", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "bytedance-seed/seed-2.0-mini", + "modelKey": "bytedance-seed/seed-2.0-mini", + "displayName": "Seed-2.0-Mini", + "family": "seed", + "metadata": { + "lastUpdated": "2026-02-26", + "openWeights": false, + "releaseDate": "2026-02-26", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "bytedance-seed/seed-2.0-mini", + "displayName": "ByteDance Seed: Seed-2.0-Mini", + "metadata": { + "canonicalSlug": "bytedance-seed/seed-2.0-mini-20260224", + "createdAt": "2026-02-26T18:38:27.000Z", + "links": { + "details": "/api/v1/models/bytedance-seed/seed-2.0-mini-20260224/endpoints" + }, + "reasoning": { + "mandatory": false, + "supported_efforts": [ + "high", + "medium", + "low", + "minimal" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 131072, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/skyfall-36b-v2", + "provider": "openrouter", + "model": "skyfall-36b-v2", + "displayName": "Skyfall 36B V2", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/thedrummer/skyfall-36b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "thedrummer/skyfall-36b-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 0.55, + "output": 0.8 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "thedrummer/skyfall-36b-v2", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.25, + "input": 0.55, + "output": 0.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Skyfall 36B V2", + "TheDrummer: Skyfall 36B V2" + ], + "knowledgeCutoff": "2024-06-30", + "releaseDate": "2025-03-10", + "lastUpdated": "2025-03-10", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "thedrummer/skyfall-36b-v2", + "modelKey": "thedrummer/skyfall-36b-v2", + "displayName": "Skyfall 36B V2", + "metadata": { + "knowledgeCutoff": "2024-06-30", + "lastUpdated": "2025-03-10", + "openWeights": true, + "releaseDate": "2025-03-10" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "thedrummer/skyfall-36b-v2", + "displayName": "TheDrummer: Skyfall 36B V2", + "metadata": { + "canonicalSlug": "thedrummer/skyfall-36b-v2", + "createdAt": "2025-03-10T19:56:06.000Z", + "huggingFaceId": "TheDrummer/Skyfall-36B-v2", + "knowledgeCutoff": "2024-06-30", + "links": { + "details": "/api/v1/models/thedrummer/skyfall-36b-v2/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/solar-pro-3", + "provider": "openrouter", + "model": "solar-pro-3", + "displayName": "Solar Pro 3", + "family": "solar-pro", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/upstage/solar-pro-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "upstage/solar-pro-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.15, + "output": 0.6 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "upstage/solar-pro-3", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.015, + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Solar Pro 3", + "Upstage: Solar Pro 3" + ], + "families": [ + "solar-pro" + ], + "releaseDate": "2026-01-27", + "lastUpdated": "2026-01-27", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "structured_outputs", + "temperature", + "tool_choice", + "tools" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "upstage/solar-pro-3", + "modelKey": "upstage/solar-pro-3", + "displayName": "Solar Pro 3", + "family": "solar-pro", + "metadata": { + "lastUpdated": "2026-01-27", + "openWeights": false, + "releaseDate": "2026-01-27" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "upstage/solar-pro-3", + "displayName": "Upstage: Solar Pro 3", + "metadata": { + "canonicalSlug": "upstage/solar-pro-3", + "createdAt": "2026-01-27T02:33:20.000Z", + "links": { + "details": "/api/v1/models/upstage/solar-pro-3/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "structured_outputs", + "temperature", + "tool_choice", + "tools" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/step-3.5-flash", + "provider": "openrouter", + "model": "step-3.5-flash", + "displayName": "Step 3.5 Flash", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/stepfun/step-3.5-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "stepfun/step-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.09, + "output": 0.3 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "stepfun/step-3.5-flash", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.09, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 3.5 Flash", + "StepFun: Step 3.5 Flash" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-01-29", + "lastUpdated": "2026-02-13", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "stepfun/step-3.5-flash", + "modelKey": "stepfun/step-3.5-flash", + "displayName": "Step 3.5 Flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-13", + "openWeights": true, + "releaseDate": "2026-01-29" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "stepfun/step-3.5-flash", + "displayName": "StepFun: Step 3.5 Flash", + "metadata": { + "canonicalSlug": "stepfun/step-3.5-flash", + "createdAt": "2026-01-29T23:12:17.000Z", + "huggingFaceId": "stepfun-ai/Step-3.5-Flash", + "links": { + "details": "/api/v1/models/stepfun/step-3.5-flash/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/step-3.7-flash", + "provider": "openrouter", + "model": "step-3.7-flash", + "displayName": "Step 3.7 Flash", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/stepfun/step-3.7-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "stepfun/step-3.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.2, + "output": 1.15 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "stepfun/step-3.7-flash", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.2, + "output": 1.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 3.7 Flash", + "StepFun: Step 3.7 Flash" + ], + "knowledgeCutoff": "2026-01-01", + "releaseDate": "2026-05-29", + "lastUpdated": "2026-05-29", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "stepfun/step-3.7-flash", + "modelKey": "stepfun/step-3.7-flash", + "displayName": "Step 3.7 Flash", + "metadata": { + "knowledgeCutoff": "2026-01-01", + "lastUpdated": "2026-05-29", + "openWeights": true, + "releaseDate": "2026-05-29", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "stepfun/step-3.7-flash", + "displayName": "StepFun: Step 3.7 Flash", + "metadata": { + "canonicalSlug": "stepfun/step-3.7-flash-20260528", + "createdAt": "2026-05-28T16:17:49.000Z", + "huggingFaceId": "stepfun-ai/Step-3.7-Flash", + "links": { + "details": "/api/v1/models/stepfun/step-3.7-flash-20260528/endpoints" + }, + "reasoning": { + "mandatory": true, + "supported_efforts": [ + "high", + "medium", + "low" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 256000, + "max_completion_tokens": 256000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/trinity-large-thinking", + "provider": "openrouter", + "model": "trinity-large-thinking", + "displayName": "Trinity Large Thinking", + "family": "trinity", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/arcee-ai/trinity-large-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "arcee-ai/trinity-large-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.22, + "output": 0.85 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "arcee-ai/trinity-large-thinking", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.22, + "output": 0.85 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Arcee AI: Trinity Large Thinking", + "Trinity Large Thinking" + ], + "families": [ + "trinity" + ], + "releaseDate": "2026-04-01", + "lastUpdated": "2026-04-01", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "arcee-ai/trinity-large-thinking", + "modelKey": "arcee-ai/trinity-large-thinking", + "displayName": "Trinity Large Thinking", + "family": "trinity", + "metadata": { + "lastUpdated": "2026-04-01", + "openWeights": true, + "releaseDate": "2026-04-01" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "arcee-ai/trinity-large-thinking", + "displayName": "Arcee AI: Trinity Large Thinking", + "metadata": { + "canonicalSlug": "arcee-ai/trinity-large-thinking", + "createdAt": "2026-04-01T15:45:18.000Z", + "huggingFaceId": "arcee-ai/Trinity-Large-Thinking", + "links": { + "details": "/api/v1/models/arcee-ai/trinity-large-thinking/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 262144, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/trinity-mini", + "provider": "openrouter", + "model": "trinity-mini", + "displayName": "Trinity Mini", + "family": "trinity-mini", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/arcee-ai/trinity-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "arcee-ai/trinity-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.045, + "output": 0.15 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "arcee-ai/trinity-mini", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.045, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Arcee AI: Trinity Mini", + "Trinity Mini" + ], + "families": [ + "trinity-mini" + ], + "releaseDate": "2025-12-01", + "lastUpdated": "2025-12-01", + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "arcee-ai/trinity-mini", + "modelKey": "arcee-ai/trinity-mini", + "displayName": "Trinity Mini", + "family": "trinity-mini", + "metadata": { + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "arcee-ai/trinity-mini", + "displayName": "Arcee AI: Trinity Mini", + "metadata": { + "canonicalSlug": "arcee-ai/trinity-mini-20251201", + "createdAt": "2025-12-01T15:08:40.000Z", + "huggingFaceId": "arcee-ai/Trinity-Mini", + "links": { + "details": "/api/v1/models/arcee-ai/trinity-mini-20251201/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_completion_tokens", + "max_tokens", + "reasoning", + "response_format", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 131072, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/ui-tars-1.5-7b", + "provider": "openrouter", + "model": "ui-tars-1.5-7b", + "displayName": "UI-TARS 7B", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/bytedance/ui-tars-1.5-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 2048, + "outputTokens": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "bytedance/ui-tars-1.5-7b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.1, + "output": 0.2 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/bytedance/ui-tars-1.5-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "bytedance/ui-tars-1.5-7b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.1, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ByteDance: UI-TARS 7B", + "UI-TARS 7B" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01-31", + "releaseDate": "2025-07-22", + "lastUpdated": "2025-07-22", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "bytedance/ui-tars-1.5-7b", + "modelKey": "bytedance/ui-tars-1.5-7b", + "displayName": "UI-TARS 7B", + "metadata": { + "knowledgeCutoff": "2025-01-31", + "lastUpdated": "2025-07-22", + "openWeights": true, + "releaseDate": "2025-07-22" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/bytedance/ui-tars-1.5-7b", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/api/v1/models/bytedance/ui-tars-1.5-7b" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "bytedance/ui-tars-1.5-7b", + "displayName": "ByteDance: UI-TARS 7B", + "metadata": { + "canonicalSlug": "bytedance/ui-tars-1.5-7b", + "createdAt": "2025-07-22T17:24:16.000Z", + "huggingFaceId": "ByteDance-Seed/UI-TARS-1.5-7B", + "knowledgeCutoff": "2025-01-31", + "links": { + "details": "/api/v1/models/bytedance/ui-tars-1.5-7b/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": 2048, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/unslopnemo-12b", + "provider": "openrouter", + "model": "unslopnemo-12b", + "displayName": "UnslopNemo 12B", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/thedrummer/unslopnemo-12b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "thedrummer/unslopnemo-12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 0.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "thedrummer/unslopnemo-12b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "TheDrummer: UnslopNemo 12B", + "UnslopNemo 12B" + ], + "knowledgeCutoff": "2024-04-30", + "releaseDate": "2024-11-08", + "lastUpdated": "2024-11-08", + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "thedrummer/unslopnemo-12b", + "modelKey": "thedrummer/unslopnemo-12b", + "displayName": "UnslopNemo 12B", + "metadata": { + "knowledgeCutoff": "2024-04-30", + "lastUpdated": "2024-11-08", + "openWeights": true, + "releaseDate": "2024-11-08" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "thedrummer/unslopnemo-12b", + "displayName": "TheDrummer: UnslopNemo 12B", + "metadata": { + "canonicalSlug": "thedrummer/unslopnemo-12b", + "createdAt": "2024-11-08T22:04:08.000Z", + "huggingFaceId": "TheDrummer/UnslopNemo-12B-v4.1", + "instructType": "mistral", + "knowledgeCutoff": "2024-04-30", + "links": { + "details": "/api/v1/models/thedrummer/unslopnemo-12b/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logprobs", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 32768, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/virtuoso-large", + "provider": "openrouter", + "model": "virtuoso-large", + "displayName": "Virtuoso Large", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/arcee-ai/virtuoso-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "arcee-ai/virtuoso-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.75, + "output": 1.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "arcee-ai/virtuoso-large", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.75, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Arcee AI: Virtuoso Large", + "Virtuoso Large" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-05-05", + "lastUpdated": "2025-05-05", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "arcee-ai/virtuoso-large", + "modelKey": "arcee-ai/virtuoso-large", + "displayName": "Virtuoso Large", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-05", + "openWeights": false, + "releaseDate": "2025-05-05" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "arcee-ai/virtuoso-large", + "displayName": "Arcee AI: Virtuoso Large", + "metadata": { + "canonicalSlug": "arcee-ai/virtuoso-large", + "createdAt": "2025-05-05T21:01:25.000Z", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/arcee-ai/virtuoso-large/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 64000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/weaver", + "provider": "openrouter", + "model": "weaver", + "displayName": "Weaver (alpha)", + "family": "alpha", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/mancer/weaver" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 8000, + "maxTokens": 2000, + "outputTokens": 2000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "mancer/weaver", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.75, + "output": 1 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/mancer/weaver", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5.625, + "output": 5.625 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "mancer/weaver", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.75, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mancer: Weaver (alpha)", + "Weaver (alpha)" + ], + "families": [ + "alpha" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-06-30", + "releaseDate": "2023-08-02", + "lastUpdated": "2023-08-02", + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_a", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "mancer/weaver", + "modelKey": "mancer/weaver", + "displayName": "Weaver (alpha)", + "family": "alpha", + "metadata": { + "knowledgeCutoff": "2023-06-30", + "lastUpdated": "2023-08-02", + "openWeights": false, + "releaseDate": "2023-08-02" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/mancer/weaver", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "mancer/weaver", + "displayName": "Mancer: Weaver (alpha)", + "metadata": { + "canonicalSlug": "mancer/weaver", + "createdAt": "2023-08-02T00:00:00.000Z", + "instructType": "alpaca", + "knowledgeCutoff": "2023-06-30", + "links": { + "details": "/api/v1/models/mancer/weaver/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_a", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Llama2", + "topProvider": { + "context_length": 8000, + "max_completion_tokens": 2000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "openrouter/wizardlm-2-8x22b", + "provider": "openrouter", + "model": "wizardlm-2-8x22b", + "displayName": "WizardLM-2 8x22B", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/microsoft/wizardlm-2-8x22b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "openrouter", + "model": "microsoft/wizardlm-2-8x22b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.62, + "output": 0.62 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "microsoft/wizardlm-2-8x22b", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.62, + "output": 0.62 + } + } + ] + }, + "metadata": { + "displayNames": [ + "WizardLM-2 8x22B" + ], + "knowledgeCutoff": "2024-04-30", + "releaseDate": "2024-04-16", + "lastUpdated": "2024-04-16", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "top_k", + "top_p" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "microsoft/wizardlm-2-8x22b", + "modelKey": "microsoft/wizardlm-2-8x22b", + "displayName": "WizardLM-2 8x22B", + "metadata": { + "knowledgeCutoff": "2024-04-30", + "lastUpdated": "2024-04-16", + "openWeights": true, + "releaseDate": "2024-04-16" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "microsoft/wizardlm-2-8x22b", + "displayName": "WizardLM-2 8x22B", + "metadata": { + "canonicalSlug": "microsoft/wizardlm-2-8x22b", + "createdAt": "2024-04-16T00:00:00.000Z", + "huggingFaceId": "microsoft/WizardLM-2-8x22B", + "instructType": "vicuna", + "knowledgeCutoff": "2024-04-30", + "links": { + "details": "/api/v1/models/microsoft/wizardlm-2-8x22b/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "top_k", + "top_p" + ], + "tokenizer": "Mistral", + "topProvider": { + "context_length": 65535, + "max_completion_tokens": 8000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "orcarouter/auto", + "provider": "orcarouter", + "model": "auto", + "displayName": "OrcaRouter Auto", + "family": "auto", + "sources": [ + "models.dev" + ], + "providers": [ + "orcarouter" + ], + "aliases": [ + "orcarouter/auto" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "orcarouter", + "model": "orcarouter/auto", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OrcaRouter Auto" + ], + "families": [ + "auto" + ], + "releaseDate": "2025-01-01", + "lastUpdated": "2026-05-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "orcarouter/auto", + "modelKey": "orcarouter/auto", + "displayName": "OrcaRouter Auto", + "family": "auto", + "metadata": { + "lastUpdated": "2026-05-14", + "openWeights": false, + "releaseDate": "2025-01-01" + } + } + ] + }, + { + "id": "ovhcloud/llava-v1.6-mistral-7b-hf", + "provider": "ovhcloud", + "model": "llava-v1.6-mistral-7b-hf", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ovhcloud" + ], + "aliases": [ + "ovhcloud/llava-v1.6-mistral-7b-hf" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ovhcloud", + "model": "ovhcloud/llava-v1.6-mistral-7b-hf", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.29, + "output": 0.29 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ovhcloud", + "model": "ovhcloud/llava-v1.6-mistral-7b-hf", + "mode": "chat", + "metadata": { + "source": "https://endpoints.ai.cloud.ovh.net/models/llava-next-mistral-7b" + } + } + ] + }, + { + "id": "ovhcloud/mamba-codestral-7b-v0.1", + "provider": "ovhcloud", + "model": "mamba-codestral-7b-v0.1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "ovhcloud" + ], + "aliases": [ + "ovhcloud/mamba-codestral-7B-v0.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "ovhcloud", + "model": "ovhcloud/mamba-codestral-7B-v0.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.19, + "output": 0.19 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "ovhcloud", + "model": "ovhcloud/mamba-codestral-7B-v0.1", + "mode": "chat", + "metadata": { + "source": "https://endpoints.ai.cloud.ovh.net/models/mamba-codestral-7b-v0-1" + } + } + ] + }, + { + "id": "palm/chat-bison", + "provider": "palm", + "model": "chat-bison", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "palm" + ], + "aliases": [ + "palm/chat-bison" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "palm", + "model": "palm/chat-bison", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.125, + "output": 0.125 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "palm", + "model": "palm/chat-bison", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models" + } + } + ] + }, + { + "id": "palm/chat-bison-001", + "provider": "palm", + "model": "chat-bison-001", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "palm" + ], + "aliases": [ + "palm/chat-bison-001" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "palm", + "model": "palm/chat-bison-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.125, + "output": 0.125 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "palm", + "model": "palm/chat-bison-001", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models" + } + } + ] + }, + { + "id": "palm/text-bison", + "provider": "palm", + "model": "text-bison", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "palm" + ], + "aliases": [ + "palm/text-bison" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "palm", + "model": "palm/text-bison", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.125, + "output": 0.125 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "palm", + "model": "palm/text-bison", + "mode": "completion", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models" + } + } + ] + }, + { + "id": "palm/text-bison-001", + "provider": "palm", + "model": "text-bison-001", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "palm" + ], + "aliases": [ + "palm/text-bison-001" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "palm", + "model": "palm/text-bison-001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.125, + "output": 0.125 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "palm", + "model": "palm/text-bison-001", + "mode": "completion", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models" + } + } + ] + }, + { + "id": "palm/text-bison-safety-off", + "provider": "palm", + "model": "text-bison-safety-off", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "palm" + ], + "aliases": [ + "palm/text-bison-safety-off" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "palm", + "model": "palm/text-bison-safety-off", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.125, + "output": 0.125 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "palm", + "model": "palm/text-bison-safety-off", + "mode": "completion", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models" + } + } + ] + }, + { + "id": "palm/text-bison-safety-recitation-off", + "provider": "palm", + "model": "text-bison-safety-recitation-off", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "palm" + ], + "aliases": [ + "palm/text-bison-safety-recitation-off" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "palm", + "model": "palm/text-bison-safety-recitation-off", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.125, + "output": 0.125 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "palm", + "model": "palm/text-bison-safety-recitation-off", + "mode": "completion", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models" + } + } + ] + }, + { + "id": "parallel-ai/search", + "provider": "parallel-ai", + "model": "search", + "mode": "search", + "sources": [ + "litellm" + ], + "providers": [ + "parallel_ai" + ], + "aliases": [ + "parallel_ai/search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "parallel_ai", + "model": "parallel_ai/search", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perQuery": { + "input": 0.004 + } + } + ] + }, + "metadata": { + "modes": [ + "search" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "parallel_ai", + "model": "parallel_ai/search", + "mode": "search" + } + ] + }, + { + "id": "parallel-ai/search-pro", + "provider": "parallel-ai", + "model": "search-pro", + "mode": "search", + "sources": [ + "litellm" + ], + "providers": [ + "parallel_ai" + ], + "aliases": [ + "parallel_ai/search-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "parallel_ai", + "model": "parallel_ai/search-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perQuery": { + "input": 0.009 + } + } + ] + }, + "metadata": { + "modes": [ + "search" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "parallel_ai", + "model": "parallel_ai/search-pro", + "mode": "search" + } + ] + }, + { + "id": "perplexity-agent/nemotron-3-super-120b-a12b", + "provider": "perplexity-agent", + "model": "nemotron-3-super-120b-a12b", + "displayName": "Nemotron 3 Super 120B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "perplexity-agent" + ], + "aliases": [ + "perplexity-agent/nvidia/nemotron-3-super-120b-a12b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 32000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "nvidia/nemotron-3-super-120b-a12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron 3 Super 120B" + ], + "families": [ + "nemotron" + ], + "knowledgeCutoff": "2026-02", + "releaseDate": "2026-03-11", + "lastUpdated": "2026-03-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "nvidia/nemotron-3-super-120b-a12b", + "modelKey": "nvidia/nemotron-3-super-120b-a12b", + "displayName": "Nemotron 3 Super 120B", + "family": "nemotron", + "metadata": { + "knowledgeCutoff": "2026-02", + "lastUpdated": "2026-03-11", + "openWeights": true, + "releaseDate": "2026-03-11" + } + } + ] + }, + { + "id": "perplexity/advanced-deep-research", + "provider": "perplexity", + "model": "advanced-deep-research", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/preset/advanced-deep-research" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/preset/advanced-deep-research", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/preset/advanced-deep-research", + "mode": "responses" + } + ] + }, + { + "id": "perplexity/claude-haiku-4-5", + "provider": "perplexity", + "model": "claude-haiku-4-5", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/anthropic/claude-haiku-4-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/anthropic/claude-haiku-4-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/anthropic/claude-haiku-4-5", + "mode": "responses" + } + ] + }, + { + "id": "perplexity/claude-opus-4-5", + "provider": "perplexity", + "model": "claude-opus-4-5", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/anthropic/claude-opus-4-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/anthropic/claude-opus-4-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/anthropic/claude-opus-4-5", + "mode": "responses" + } + ] + }, + { + "id": "perplexity/claude-opus-4-6", + "provider": "perplexity", + "model": "claude-opus-4-6", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/anthropic/claude-opus-4-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/anthropic/claude-opus-4-6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/anthropic/claude-opus-4-6", + "mode": "responses" + } + ] + }, + { + "id": "perplexity/claude-opus-4-7", + "provider": "perplexity", + "model": "claude-opus-4-7", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/anthropic/claude-opus-4-7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/anthropic/claude-opus-4-7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/anthropic/claude-opus-4-7", + "mode": "responses" + } + ] + }, + { + "id": "perplexity/claude-sonnet-4-5", + "provider": "perplexity", + "model": "claude-sonnet-4-5", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/anthropic/claude-sonnet-4-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/anthropic/claude-sonnet-4-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/anthropic/claude-sonnet-4-5", + "mode": "responses" + } + ] + }, + { + "id": "perplexity/codellama-34b-instruct", + "provider": "perplexity", + "model": "codellama-34b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/codellama-34b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/codellama-34b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.35, + "output": 1.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/codellama-34b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "perplexity/codellama-70b-instruct", + "provider": "perplexity", + "model": "codellama-70b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/codellama-70b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/codellama-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.7, + "output": 2.8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/codellama-70b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "perplexity/deep-research", + "provider": "perplexity", + "model": "deep-research", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/preset/deep-research" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/preset/deep-research", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/preset/deep-research", + "mode": "responses" + } + ] + }, + { + "id": "perplexity/fast-search", + "provider": "perplexity", + "model": "fast-search", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/preset/fast-search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/preset/fast-search", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/preset/fast-search", + "mode": "responses" + } + ] + }, + { + "id": "perplexity/gemini-2.5-flash", + "provider": "perplexity", + "model": "gemini-2.5-flash", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/google/gemini-2.5-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/google/gemini-2.5-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/google/gemini-2.5-flash", + "mode": "responses" + } + ] + }, + { + "id": "perplexity/gemini-2.5-pro", + "provider": "perplexity", + "model": "gemini-2.5-pro", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/google/gemini-2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/google/gemini-2.5-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/google/gemini-2.5-pro", + "mode": "responses" + } + ] + }, + { + "id": "perplexity/gemini-3-flash-preview", + "provider": "perplexity", + "model": "gemini-3-flash-preview", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/google/gemini-3-flash-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/google/gemini-3-flash-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/google/gemini-3-flash-preview", + "mode": "responses" + } + ] + }, + { + "id": "perplexity/gemini-3-pro-preview", + "provider": "perplexity", + "model": "gemini-3-pro-preview", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/google/gemini-3-pro-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/google/gemini-3-pro-preview", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/google/gemini-3-pro-preview", + "mode": "responses" + } + ] + }, + { + "id": "perplexity/gpt-5-mini", + "provider": "perplexity", + "model": "gpt-5-mini", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/openai/gpt-5-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/openai/gpt-5-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/openai/gpt-5-mini", + "mode": "responses" + } + ] + }, + { + "id": "perplexity/gpt-5.1", + "provider": "perplexity", + "model": "gpt-5.1", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/openai/gpt-5.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/openai/gpt-5.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/openai/gpt-5.1", + "mode": "responses" + } + ] + }, + { + "id": "perplexity/gpt-5.2", + "provider": "perplexity", + "model": "gpt-5.2", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/openai/gpt-5.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/openai/gpt-5.2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/openai/gpt-5.2", + "mode": "responses" + } + ] + }, + { + "id": "perplexity/grok-4-1-fast-non-reasoning", + "provider": "perplexity", + "model": "grok-4-1-fast-non-reasoning", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/xai/grok-4-1-fast-non-reasoning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/xai/grok-4-1-fast-non-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/xai/grok-4-1-fast-non-reasoning", + "mode": "responses" + } + ] + }, + { + "id": "perplexity/llama-2-70b-chat", + "provider": "perplexity", + "model": "llama-2-70b-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/llama-2-70b-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/llama-2-70b-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.7, + "output": 2.8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/llama-2-70b-chat", + "mode": "chat" + } + ] + }, + { + "id": "perplexity/llama-3.1-70b-instruct", + "provider": "perplexity", + "model": "llama-3.1-70b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/llama-3.1-70b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/llama-3.1-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/llama-3.1-70b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "perplexity/llama-3.1-8b-instruct", + "provider": "perplexity", + "model": "llama-3.1-8b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/llama-3.1-8b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/llama-3.1-8b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/llama-3.1-8b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "perplexity/mistral-7b-instruct", + "provider": "perplexity", + "model": "mistral-7b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/mistral-7b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/mistral-7b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0.28 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/mistral-7b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "perplexity/mixtral-8x7b-instruct", + "provider": "perplexity", + "model": "mixtral-8x7b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/mixtral-8x7b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/mixtral-8x7b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0.28 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/mixtral-8x7b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "perplexity/pplx-70b-chat", + "provider": "perplexity", + "model": "pplx-70b-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/pplx-70b-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/pplx-70b-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.7, + "output": 2.8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/pplx-70b-chat", + "mode": "chat" + } + ] + }, + { + "id": "perplexity/pplx-70b-online", + "provider": "perplexity", + "model": "pplx-70b-online", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/pplx-70b-online" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/pplx-70b-online", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 2.8 + }, + "perRequest": { + "input": 0.005 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/pplx-70b-online", + "mode": "chat" + } + ] + }, + { + "id": "perplexity/pplx-7b-chat", + "provider": "perplexity", + "model": "pplx-7b-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/pplx-7b-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/pplx-7b-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0.28 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/pplx-7b-chat", + "mode": "chat" + } + ] + }, + { + "id": "perplexity/pplx-7b-online", + "provider": "perplexity", + "model": "pplx-7b-online", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/pplx-7b-online" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/pplx-7b-online", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0.28 + }, + "perRequest": { + "input": 0.005 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/pplx-7b-online", + "mode": "chat" + } + ] + }, + { + "id": "perplexity/pplx-embed-v1-0.6b", + "provider": "perplexity", + "model": "pplx-embed-v1-0.6b", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/pplx-embed-v1-0.6b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "outputVectorSize": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/pplx-embed-v1-0.6b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.004, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/pplx-embed-v1-0.6b", + "mode": "embedding", + "metadata": { + "source": "https://docs.perplexity.ai/docs/embeddings/quickstart" + } + } + ] + }, + { + "id": "perplexity/pplx-embed-v1-4b", + "provider": "perplexity", + "model": "pplx-embed-v1-4b", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/pplx-embed-v1-4b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "outputVectorSize": 2560, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/pplx-embed-v1-4b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.03, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/pplx-embed-v1-4b", + "mode": "embedding", + "metadata": { + "source": "https://docs.perplexity.ai/docs/embeddings/quickstart" + } + } + ] + }, + { + "id": "perplexity/pro-search", + "provider": "perplexity", + "model": "pro-search", + "mode": "responses", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/preset/pro-search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/preset/pro-search", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "responses" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/preset/pro-search", + "mode": "responses" + } + ] + }, + { + "id": "perplexity/search", + "provider": "perplexity", + "model": "search", + "mode": "search", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/search", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perQuery": { + "input": 0.005 + } + } + ] + }, + "metadata": { + "modes": [ + "search" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/search", + "mode": "search" + } + ] + }, + { + "id": "perplexity/sonar", + "provider": "perplexity", + "model": "sonar", + "displayName": "Sonar", + "family": "sonar", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter", + "perplexity", + "perplexity-agent", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "kilo/perplexity/sonar", + "openrouter/perplexity/sonar", + "perplexity-agent/perplexity/sonar", + "perplexity/perplexity/sonar", + "perplexity/sonar", + "vercel/perplexity/sonar", + "vercel_ai_gateway/perplexity/sonar" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "webSearch": true, + "supports1MContext": false, + "functionCalling": true, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "perplexity/sonar", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "perplexity/sonar", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 1 + } + }, + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "perplexity/sonar", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0625, + "input": 0.25, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "perplexity", + "model": "sonar", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 1 + } + }, + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/perplexity/sonar", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + }, + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/sonar", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 1 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.012, + "search_context_size_low": 0.005, + "search_context_size_medium": 0.008 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/perplexity/sonar", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 1 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "perplexity/sonar", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 1 + }, + "other": { + "webSearch": 0.005 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Perplexity: Sonar", + "Sonar" + ], + "families": [ + "sonar" + ], + "modes": [ + "chat", + "responses" + ], + "knowledgeCutoff": "2025-09-01", + "releaseDate": "2024-01-01", + "lastUpdated": "2025-09-01", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "temperature", + "top_k", + "top_p", + "web_search_options" + ], + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "perplexity/sonar", + "modelKey": "perplexity/sonar", + "displayName": "Perplexity: Sonar", + "metadata": { + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "perplexity/sonar", + "modelKey": "perplexity/sonar", + "displayName": "Sonar", + "family": "sonar", + "metadata": { + "lastUpdated": "2025-01-27", + "openWeights": false, + "releaseDate": "2025-01-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "perplexity/sonar", + "modelKey": "perplexity/sonar", + "displayName": "Sonar", + "family": "sonar", + "metadata": { + "knowledgeCutoff": "2025-09-01", + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity", + "providerName": "Perplexity", + "providerDoc": "https://docs.perplexity.ai", + "model": "sonar", + "modelKey": "sonar", + "displayName": "Sonar", + "family": "sonar", + "metadata": { + "knowledgeCutoff": "2025-09-01", + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "perplexity/sonar", + "modelKey": "perplexity/sonar", + "displayName": "Sonar", + "family": "sonar", + "metadata": { + "knowledgeCutoff": "2025-02", + "lastUpdated": "2025-02-19", + "openWeights": false, + "releaseDate": "2025-02-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/perplexity/sonar", + "mode": "responses" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/sonar", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/perplexity/sonar", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "perplexity/sonar", + "displayName": "Perplexity: Sonar", + "metadata": { + "canonicalSlug": "perplexity/sonar", + "createdAt": "2025-01-27T21:36:48.000Z", + "links": { + "details": "/api/v1/models/perplexity/sonar/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "temperature", + "top_k", + "top_p", + "web_search_options" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 127072, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "perplexity/sonar-deep-research", + "provider": "perplexity", + "model": "sonar-deep-research", + "displayName": "Perplexity Sonar Deep Research", + "family": "sonar-deep-research", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "helicone", + "kilo", + "nano-gpt", + "openrouter", + "perplexity", + "sap-ai-core" + ], + "aliases": [ + "helicone/sonar-deep-research", + "kilo/perplexity/sonar-deep-research", + "nano-gpt/sonar-deep-research", + "openrouter/perplexity/sonar-deep-research", + "perplexity/sonar-deep-research", + "sap-ai-core/sonar-deep-research" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "webSearch": true, + "supports1MContext": false, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "sonar-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "perplexity/sonar-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "sonar-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3.4, + "output": 13.6 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "perplexity/sonar-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 8, + "reasoningOutput": 3 + } + }, + { + "source": "models.dev", + "provider": "perplexity", + "model": "sonar-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 8, + "reasoningOutput": 3 + } + }, + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "sonar-deep-research", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 8, + "reasoningOutput": 3 + } + }, + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/sonar-deep-research", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 8, + "reasoningOutput": 3 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.005, + "search_context_size_low": 0.005, + "search_context_size_medium": 0.005 + }, + "extra": { + "citation_cost_per_token": 0.000002 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "perplexity/sonar-deep-research", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "internalReasoning": 3, + "output": 8 + }, + "other": { + "webSearch": 0.005 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Perplexity Deep Research", + "Perplexity Sonar Deep Research", + "Perplexity: Sonar Deep Research", + "Sonar Deep Research", + "sonar-deep-research" + ], + "families": [ + "sonar-deep-research" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-01-27", + "lastUpdated": "2025-01-27", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "temperature", + "top_k", + "top_p", + "web_search_options" + ], + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "sonar-deep-research", + "modelKey": "sonar-deep-research", + "displayName": "Perplexity Sonar Deep Research", + "family": "sonar-deep-research", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-27", + "openWeights": false, + "releaseDate": "2025-01-27", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "perplexity/sonar-deep-research", + "modelKey": "perplexity/sonar-deep-research", + "displayName": "Perplexity: Sonar Deep Research", + "metadata": { + "lastUpdated": "2025-01-27", + "openWeights": false, + "releaseDate": "2025-01-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "sonar-deep-research", + "modelKey": "sonar-deep-research", + "displayName": "Perplexity Deep Research", + "metadata": { + "lastUpdated": "2025-02-25", + "openWeights": false, + "releaseDate": "2025-02-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "perplexity/sonar-deep-research", + "modelKey": "perplexity/sonar-deep-research", + "displayName": "Sonar Deep Research", + "family": "sonar-deep-research", + "metadata": { + "lastUpdated": "2025-03-07", + "openWeights": false, + "releaseDate": "2025-03-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity", + "providerName": "Perplexity", + "providerDoc": "https://docs.perplexity.ai", + "model": "sonar-deep-research", + "modelKey": "sonar-deep-research", + "displayName": "Perplexity Sonar Deep Research", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2025-02-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "sonar-deep-research", + "modelKey": "sonar-deep-research", + "displayName": "sonar-deep-research", + "family": "sonar-deep-research", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2025-02-01" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/sonar-deep-research", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "perplexity/sonar-deep-research", + "displayName": "Perplexity: Sonar Deep Research", + "metadata": { + "canonicalSlug": "perplexity/sonar-deep-research", + "createdAt": "2025-03-07T01:34:06.000Z", + "instructType": "deepseek-r1", + "links": { + "details": "/api/v1/models/perplexity/sonar-deep-research/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "temperature", + "top_k", + "top_p", + "web_search_options" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "perplexity/sonar-medium-chat", + "provider": "perplexity", + "model": "sonar-medium-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/sonar-medium-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/sonar-medium-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 1.8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/sonar-medium-chat", + "mode": "chat" + } + ] + }, + { + "id": "perplexity/sonar-medium-online", + "provider": "perplexity", + "model": "sonar-medium-online", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/sonar-medium-online" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 12000, + "inputTokens": 12000, + "maxTokens": 12000, + "outputTokens": 12000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/sonar-medium-online", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 1.8 + }, + "perRequest": { + "input": 0.005 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/sonar-medium-online", + "mode": "chat" + } + ] + }, + { + "id": "perplexity/sonar-pro", + "provider": "perplexity", + "model": "sonar-pro", + "displayName": "Sonar Pro", + "family": "sonar-pro", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "anyapi", + "helicone", + "kilo", + "llmgateway", + "nano-gpt", + "openrouter", + "perplexity", + "sap-ai-core", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "anyapi/perplexity/sonar-pro", + "helicone/sonar-pro", + "kilo/perplexity/sonar-pro", + "llmgateway/sonar-pro", + "nano-gpt/sonar-pro", + "openrouter/perplexity/sonar-pro", + "perplexity/sonar-pro", + "sap-ai-core/sonar-pro", + "vercel/perplexity/sonar-pro", + "vercel_ai_gateway/perplexity/sonar-pro" + ], + "mergedProviderModelRecords": 10, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 8000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "webSearch": true, + "supports1MContext": false, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "sonar-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "perplexity/sonar-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "sonar-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "sonar-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.992, + "output": 14.994 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "perplexity/sonar-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "perplexity", + "model": "sonar-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "sonar-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/sonar-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.014, + "search_context_size_low": 0.006, + "search_context_size_medium": 0.01 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/perplexity/sonar-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "perplexity/sonar-pro", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + }, + "other": { + "webSearch": 0.005 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Perplexity Pro", + "Perplexity Sonar Pro", + "Perplexity: Sonar Pro", + "Sonar Pro", + "sonar-pro" + ], + "families": [ + "sonar-pro" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-09-01", + "releaseDate": "2024-01-01", + "lastUpdated": "2025-09-01", + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "temperature", + "top_k", + "top_p", + "web_search_options" + ], + "providerModelRecordCount": 10 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "perplexity/sonar-pro", + "modelKey": "perplexity/sonar-pro", + "displayName": "Sonar Pro", + "family": "sonar-pro", + "metadata": { + "knowledgeCutoff": "2025-09-01", + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "sonar-pro", + "modelKey": "sonar-pro", + "displayName": "Perplexity Sonar Pro", + "family": "sonar-pro", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-27", + "openWeights": false, + "releaseDate": "2025-01-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "perplexity/sonar-pro", + "modelKey": "perplexity/sonar-pro", + "displayName": "Perplexity: Sonar Pro", + "metadata": { + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "sonar-pro", + "modelKey": "sonar-pro", + "displayName": "Sonar Pro", + "family": "sonar-pro", + "metadata": { + "knowledgeCutoff": "2025-09-01", + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "sonar-pro", + "modelKey": "sonar-pro", + "displayName": "Perplexity Pro", + "metadata": { + "lastUpdated": "2025-02-19", + "openWeights": false, + "releaseDate": "2025-02-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "perplexity/sonar-pro", + "modelKey": "perplexity/sonar-pro", + "displayName": "Sonar Pro", + "family": "sonar-pro", + "metadata": { + "lastUpdated": "2025-03-07", + "openWeights": false, + "releaseDate": "2025-03-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity", + "providerName": "Perplexity", + "providerDoc": "https://docs.perplexity.ai", + "model": "sonar-pro", + "modelKey": "sonar-pro", + "displayName": "Sonar Pro", + "family": "sonar-pro", + "metadata": { + "knowledgeCutoff": "2025-09-01", + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "sonar-pro", + "modelKey": "sonar-pro", + "displayName": "sonar-pro", + "family": "sonar-pro", + "metadata": { + "knowledgeCutoff": "2025-09-01", + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "perplexity/sonar-pro", + "modelKey": "perplexity/sonar-pro", + "displayName": "Sonar Pro", + "family": "sonar-pro", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2025-02-19", + "openWeights": false, + "releaseDate": "2025-02-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/sonar-pro", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/perplexity/sonar-pro", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "perplexity/sonar-pro", + "displayName": "Perplexity: Sonar Pro", + "metadata": { + "canonicalSlug": "perplexity/sonar-pro", + "createdAt": "2025-03-07T01:53:43.000Z", + "links": { + "details": "/api/v1/models/perplexity/sonar-pro/endpoints" + }, + "supportedParameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "temperature", + "top_k", + "top_p", + "web_search_options" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 8000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "perplexity/sonar-pro-search", + "provider": "perplexity", + "model": "sonar-pro-search", + "displayName": "Perplexity: Sonar Pro Search", + "family": "sonar-pro", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "openrouter" + ], + "aliases": [ + "kilo/perplexity/sonar-pro-search", + "openrouter/perplexity/sonar-pro-search" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 200000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "perplexity/sonar-pro-search", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "perplexity/sonar-pro-search", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "perplexity/sonar-pro-search", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + }, + "other": { + "webSearch": 0.018 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Perplexity: Sonar Pro Search", + "Sonar Pro Search" + ], + "families": [ + "sonar-pro" + ], + "releaseDate": "2025-10-31", + "lastUpdated": "2026-03-15", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "structured_outputs", + "temperature", + "top_k", + "top_p", + "web_search_options" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "perplexity/sonar-pro-search", + "modelKey": "perplexity/sonar-pro-search", + "displayName": "Perplexity: Sonar Pro Search", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2025-10-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "perplexity/sonar-pro-search", + "modelKey": "perplexity/sonar-pro-search", + "displayName": "Sonar Pro Search", + "family": "sonar-pro", + "metadata": { + "lastUpdated": "2025-10-30", + "openWeights": false, + "releaseDate": "2025-10-30" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "perplexity/sonar-pro-search", + "displayName": "Perplexity: Sonar Pro Search", + "metadata": { + "canonicalSlug": "perplexity/sonar-pro-search", + "createdAt": "2025-10-30T19:59:26.000Z", + "links": { + "details": "/api/v1/models/perplexity/sonar-pro-search/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "structured_outputs", + "temperature", + "top_k", + "top_p", + "web_search_options" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 200000, + "max_completion_tokens": 8000, + "is_moderated": false + } + } + } + ] + }, + { + "id": "perplexity/sonar-reasoning", + "provider": "perplexity", + "model": "sonar-reasoning", + "displayName": "Perplexity Sonar Reasoning", + "family": "sonar-reasoning", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "helicone", + "perplexity", + "vercel_ai_gateway" + ], + "aliases": [ + "helicone/sonar-reasoning", + "perplexity/sonar-reasoning", + "vercel_ai_gateway/perplexity/sonar-reasoning" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false, + "attachments": false, + "openWeights": false, + "temperature": true, + "toolCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "sonar-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 5 + } + }, + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/sonar-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 5 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.014, + "search_context_size_low": 0.005, + "search_context_size_medium": 0.008 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/perplexity/sonar-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Perplexity Sonar Reasoning" + ], + "families": [ + "sonar-reasoning" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-01-27", + "lastUpdated": "2025-01-27", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "sonar-reasoning", + "modelKey": "sonar-reasoning", + "displayName": "Perplexity Sonar Reasoning", + "family": "sonar-reasoning", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-27", + "openWeights": false, + "releaseDate": "2025-01-27" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/sonar-reasoning", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/perplexity/sonar-reasoning", + "mode": "chat" + } + ] + }, + { + "id": "perplexity/sonar-reasoning-pro", + "provider": "perplexity", + "model": "sonar-reasoning-pro", + "displayName": "Sonar Reasoning Pro", + "family": "sonar-reasoning", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "anyapi", + "helicone", + "kilo", + "llmgateway", + "nano-gpt", + "openrouter", + "perplexity", + "vercel", + "vercel_ai_gateway" + ], + "aliases": [ + "anyapi/perplexity/sonar-reasoning-pro", + "helicone/sonar-reasoning-pro", + "kilo/perplexity/sonar-reasoning-pro", + "llmgateway/sonar-reasoning-pro", + "nano-gpt/sonar-reasoning-pro", + "openrouter/perplexity/sonar-reasoning-pro", + "perplexity/sonar-reasoning-pro", + "vercel/perplexity/sonar-reasoning-pro", + "vercel_ai_gateway/perplexity/sonar-reasoning-pro" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "webSearch": true, + "supports1MContext": false, + "structuredOutput": false, + "parallelFunctionCalling": false, + "responseSchema": false, + "toolChoice": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "helicone", + "model": "sonar-reasoning-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "perplexity/sonar-reasoning-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "sonar-reasoning-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "sonar-reasoning-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.006, + "output": 7.9985 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "perplexity/sonar-reasoning-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 8 + } + }, + { + "source": "models.dev", + "provider": "perplexity", + "model": "sonar-reasoning-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 8 + } + }, + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/sonar-reasoning-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 8 + }, + "searchContextPerQuery": { + "search_context_size_high": 0.014, + "search_context_size_low": 0.006, + "search_context_size_medium": 0.01 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/perplexity/sonar-reasoning-pro", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 8 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "perplexity/sonar-reasoning-pro", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 8 + }, + "other": { + "webSearch": 0.005 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Perplexity Reasoning Pro", + "Perplexity Sonar Reasoning Pro", + "Perplexity: Sonar Reasoning Pro", + "Sonar Reasoning Pro" + ], + "families": [ + "sonar-reasoning" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-09-01", + "releaseDate": "2024-01-01", + "lastUpdated": "2025-09-01", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "temperature", + "top_k", + "top_p", + "web_search_options" + ], + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "perplexity/sonar-reasoning-pro", + "modelKey": "perplexity/sonar-reasoning-pro", + "displayName": "Sonar Reasoning Pro", + "family": "sonar-reasoning", + "metadata": { + "knowledgeCutoff": "2025-09-01", + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "sonar-reasoning-pro", + "modelKey": "sonar-reasoning-pro", + "displayName": "Perplexity Sonar Reasoning Pro", + "family": "sonar-reasoning", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-01-27", + "openWeights": false, + "releaseDate": "2025-01-27", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "perplexity/sonar-reasoning-pro", + "modelKey": "perplexity/sonar-reasoning-pro", + "displayName": "Perplexity: Sonar Reasoning Pro", + "metadata": { + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "sonar-reasoning-pro", + "modelKey": "sonar-reasoning-pro", + "displayName": "Sonar Reasoning Pro", + "family": "sonar-reasoning", + "metadata": { + "knowledgeCutoff": "2025-09-01", + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2024-01-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "sonar-reasoning-pro", + "modelKey": "sonar-reasoning-pro", + "displayName": "Perplexity Reasoning Pro", + "metadata": { + "lastUpdated": "2025-02-19", + "openWeights": false, + "releaseDate": "2025-02-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "perplexity/sonar-reasoning-pro", + "modelKey": "perplexity/sonar-reasoning-pro", + "displayName": "Sonar Reasoning Pro", + "family": "sonar-reasoning", + "metadata": { + "lastUpdated": "2025-03-07", + "openWeights": false, + "releaseDate": "2025-03-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity", + "providerName": "Perplexity", + "providerDoc": "https://docs.perplexity.ai", + "model": "sonar-reasoning-pro", + "modelKey": "sonar-reasoning-pro", + "displayName": "Sonar Reasoning Pro", + "family": "sonar-reasoning", + "metadata": { + "knowledgeCutoff": "2025-09-01", + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2024-01-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "perplexity/sonar-reasoning-pro", + "modelKey": "perplexity/sonar-reasoning-pro", + "displayName": "Sonar Reasoning Pro", + "family": "sonar-reasoning", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2025-02-19", + "openWeights": false, + "releaseDate": "2025-02-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/sonar-reasoning-pro", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/perplexity/sonar-reasoning-pro", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "perplexity/sonar-reasoning-pro", + "displayName": "Perplexity: Sonar Reasoning Pro", + "metadata": { + "canonicalSlug": "perplexity/sonar-reasoning-pro", + "createdAt": "2025-03-07T02:08:28.000Z", + "instructType": "deepseek-r1", + "links": { + "details": "/api/v1/models/perplexity/sonar-reasoning-pro/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "temperature", + "top_k", + "top_p", + "web_search_options" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 128000, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "perplexity/sonar-small-chat", + "provider": "perplexity", + "model": "sonar-small-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/sonar-small-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/sonar-small-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0.28 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/sonar-small-chat", + "mode": "chat" + } + ] + }, + { + "id": "perplexity/sonar-small-online", + "provider": "perplexity", + "model": "sonar-small-online", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "perplexity" + ], + "aliases": [ + "perplexity/sonar-small-online" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 12000, + "inputTokens": 12000, + "maxTokens": 12000, + "outputTokens": 12000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "perplexity", + "model": "perplexity/sonar-small-online", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0.28 + }, + "perRequest": { + "input": 0.005 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "perplexity", + "model": "perplexity/sonar-small-online", + "mode": "chat" + } + ] + }, + { + "id": "poe/elevenlabs-music", + "provider": "poe", + "model": "elevenlabs-music", + "displayName": "ElevenLabs-Music", + "family": "elevenlabs", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/elevenlabs/elevenlabs-music" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2000, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "ElevenLabs-Music" + ], + "families": [ + "elevenlabs" + ], + "releaseDate": "2025-08-29", + "lastUpdated": "2025-08-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "elevenlabs/elevenlabs-music", + "modelKey": "elevenlabs/elevenlabs-music", + "displayName": "ElevenLabs-Music", + "family": "elevenlabs", + "metadata": { + "lastUpdated": "2025-08-29", + "openWeights": false, + "releaseDate": "2025-08-29" + } + } + ] + }, + { + "id": "poe/elevenlabs-v2.5-turbo", + "provider": "poe", + "model": "elevenlabs-v2.5-turbo", + "displayName": "ElevenLabs-v2.5-Turbo", + "family": "elevenlabs", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/elevenlabs/elevenlabs-v2.5-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "ElevenLabs-v2.5-Turbo" + ], + "families": [ + "elevenlabs" + ], + "releaseDate": "2024-10-28", + "lastUpdated": "2024-10-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "elevenlabs/elevenlabs-v2.5-turbo", + "modelKey": "elevenlabs/elevenlabs-v2.5-turbo", + "displayName": "ElevenLabs-v2.5-Turbo", + "family": "elevenlabs", + "metadata": { + "lastUpdated": "2024-10-28", + "openWeights": false, + "releaseDate": "2024-10-28" + } + } + ] + }, + { + "id": "poe/elevenlabs-v3", + "provider": "poe", + "model": "elevenlabs-v3", + "displayName": "ElevenLabs-v3", + "family": "elevenlabs", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/elevenlabs/elevenlabs-v3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "ElevenLabs-v3" + ], + "families": [ + "elevenlabs" + ], + "releaseDate": "2025-06-05", + "lastUpdated": "2025-06-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "elevenlabs/elevenlabs-v3", + "modelKey": "elevenlabs/elevenlabs-v3", + "displayName": "ElevenLabs-v3", + "family": "elevenlabs", + "metadata": { + "lastUpdated": "2025-06-05", + "openWeights": false, + "releaseDate": "2025-06-05" + } + } + ] + }, + { + "id": "poe/ideogram", + "provider": "poe", + "model": "ideogram", + "displayName": "Ideogram", + "family": "ideogram", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/ideogramai/ideogram" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 150, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Ideogram" + ], + "families": [ + "ideogram" + ], + "releaseDate": "2024-04-03", + "lastUpdated": "2024-04-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "ideogramai/ideogram", + "modelKey": "ideogramai/ideogram", + "displayName": "Ideogram", + "family": "ideogram", + "metadata": { + "lastUpdated": "2024-04-03", + "openWeights": false, + "releaseDate": "2024-04-03" + } + } + ] + }, + { + "id": "poe/ideogram-v2", + "provider": "poe", + "model": "ideogram-v2", + "displayName": "Ideogram-v2", + "family": "ideogram", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/ideogramai/ideogram-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 150, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Ideogram-v2" + ], + "families": [ + "ideogram" + ], + "releaseDate": "2024-08-21", + "lastUpdated": "2024-08-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "ideogramai/ideogram-v2", + "modelKey": "ideogramai/ideogram-v2", + "displayName": "Ideogram-v2", + "family": "ideogram", + "metadata": { + "lastUpdated": "2024-08-21", + "openWeights": false, + "releaseDate": "2024-08-21" + } + } + ] + }, + { + "id": "poe/ideogram-v2a", + "provider": "poe", + "model": "ideogram-v2a", + "displayName": "Ideogram-v2a", + "family": "ideogram", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/ideogramai/ideogram-v2a" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 150, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Ideogram-v2a" + ], + "families": [ + "ideogram" + ], + "releaseDate": "2025-02-27", + "lastUpdated": "2025-02-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "ideogramai/ideogram-v2a", + "modelKey": "ideogramai/ideogram-v2a", + "displayName": "Ideogram-v2a", + "family": "ideogram", + "metadata": { + "lastUpdated": "2025-02-27", + "openWeights": false, + "releaseDate": "2025-02-27" + } + } + ] + }, + { + "id": "poe/ideogram-v2a-turbo", + "provider": "poe", + "model": "ideogram-v2a-turbo", + "displayName": "Ideogram-v2a-Turbo", + "family": "ideogram", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/ideogramai/ideogram-v2a-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 150, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Ideogram-v2a-Turbo" + ], + "families": [ + "ideogram" + ], + "releaseDate": "2025-02-27", + "lastUpdated": "2025-02-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "ideogramai/ideogram-v2a-turbo", + "modelKey": "ideogramai/ideogram-v2a-turbo", + "displayName": "Ideogram-v2a-Turbo", + "family": "ideogram", + "metadata": { + "lastUpdated": "2025-02-27", + "openWeights": false, + "releaseDate": "2025-02-27" + } + } + ] + }, + { + "id": "poe/ray2", + "provider": "poe", + "model": "ray2", + "displayName": "Ray2", + "family": "ray", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/lumalabs/ray2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 5000, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Ray2" + ], + "families": [ + "ray" + ], + "releaseDate": "2025-02-20", + "lastUpdated": "2025-02-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "lumalabs/ray2", + "modelKey": "lumalabs/ray2", + "displayName": "Ray2", + "family": "ray", + "metadata": { + "lastUpdated": "2025-02-20", + "openWeights": false, + "releaseDate": "2025-02-20" + } + } + ] + }, + { + "id": "poe/runway", + "provider": "poe", + "model": "runway", + "displayName": "Runway", + "family": "runway", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/runwayml/runway" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Runway" + ], + "families": [ + "runway" + ], + "releaseDate": "2024-10-11", + "lastUpdated": "2024-10-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "runwayml/runway", + "modelKey": "runwayml/runway", + "displayName": "Runway", + "family": "runway", + "metadata": { + "lastUpdated": "2024-10-11", + "openWeights": false, + "releaseDate": "2024-10-11" + } + } + ] + }, + { + "id": "poe/runway-gen-4-turbo", + "provider": "poe", + "model": "runway-gen-4-turbo", + "displayName": "Runway-Gen-4-Turbo", + "family": "runway", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/runwayml/runway-gen-4-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Runway-Gen-4-Turbo" + ], + "families": [ + "runway" + ], + "releaseDate": "2025-05-09", + "lastUpdated": "2025-05-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "runwayml/runway-gen-4-turbo", + "modelKey": "runwayml/runway-gen-4-turbo", + "displayName": "Runway-Gen-4-Turbo", + "family": "runway", + "metadata": { + "lastUpdated": "2025-05-09", + "openWeights": false, + "releaseDate": "2025-05-09" + } + } + ] + }, + { + "id": "poe/stablediffusionxl", + "provider": "poe", + "model": "stablediffusionxl", + "displayName": "StableDiffusionXL", + "family": "stable-diffusion", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/stabilityai/stablediffusionxl" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "StableDiffusionXL" + ], + "families": [ + "stable-diffusion" + ], + "releaseDate": "2023-07-09", + "lastUpdated": "2023-07-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "stabilityai/stablediffusionxl", + "modelKey": "stabilityai/stablediffusionxl", + "displayName": "StableDiffusionXL", + "family": "stable-diffusion", + "metadata": { + "lastUpdated": "2023-07-09", + "openWeights": false, + "releaseDate": "2023-07-09" + } + } + ] + }, + { + "id": "poe/tako", + "provider": "poe", + "model": "tako", + "displayName": "Tako", + "family": "tako", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/trytako/tako" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2048, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Tako" + ], + "families": [ + "tako" + ], + "releaseDate": "2024-08-15", + "lastUpdated": "2024-08-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "trytako/tako", + "modelKey": "trytako/tako", + "displayName": "Tako", + "family": "tako", + "metadata": { + "lastUpdated": "2024-08-15", + "openWeights": false, + "releaseDate": "2024-08-15" + } + } + ] + }, + { + "id": "poe/topazlabs", + "provider": "poe", + "model": "topazlabs", + "displayName": "TopazLabs", + "family": "topazlabs", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/topazlabs-co/topazlabs" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "TopazLabs" + ], + "families": [ + "topazlabs" + ], + "releaseDate": "2024-12-03", + "lastUpdated": "2024-12-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "topazlabs-co/topazlabs", + "modelKey": "topazlabs-co/topazlabs", + "displayName": "TopazLabs", + "family": "topazlabs", + "metadata": { + "lastUpdated": "2024-12-03", + "openWeights": false, + "releaseDate": "2024-12-03" + } + } + ] + }, + { + "id": "poolside/laguna-m.1", + "provider": "poolside", + "model": "laguna-m.1", + "displayName": "Laguna M.1", + "sources": [ + "models.dev" + ], + "providers": [ + "poolside" + ], + "aliases": [ + "poolside/laguna-m.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poolside", + "model": "poolside/laguna-m.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Laguna M.1" + ], + "releaseDate": "2026-04-28", + "lastUpdated": "2026-06-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poolside", + "providerName": "Poolside", + "providerApi": "https://inference.poolside.ai/v1", + "providerDoc": "https://platform.poolside.ai", + "model": "poolside/laguna-m.1", + "modelKey": "poolside/laguna-m.1", + "displayName": "Laguna M.1", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": false, + "releaseDate": "2026-04-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "poolside/laguna-xs.2", + "provider": "poolside", + "model": "laguna-xs.2", + "displayName": "Laguna XS.2", + "sources": [ + "models.dev" + ], + "providers": [ + "poolside" + ], + "aliases": [ + "poolside/laguna-xs.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "poolside", + "model": "poolside/laguna-xs.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Laguna XS.2" + ], + "releaseDate": "2026-04-28", + "lastUpdated": "2026-06-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poolside", + "providerName": "Poolside", + "providerApi": "https://inference.poolside.ai/v1", + "providerDoc": "https://platform.poolside.ai", + "model": "poolside/laguna-xs.2", + "modelKey": "poolside/laguna-xs.2", + "displayName": "Laguna XS.2", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-04-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "privatemode-ai/gemma-3-27b", + "provider": "privatemode-ai", + "model": "gemma-3-27b", + "displayName": "Gemma 3 27B", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "privatemode-ai" + ], + "aliases": [ + "privatemode-ai/gemma-3-27b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "privatemode-ai", + "model": "gemma-3-27b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 3 27B" + ], + "families": [ + "gemma" + ], + "knowledgeCutoff": "2024-08", + "releaseDate": "2025-03-12", + "lastUpdated": "2025-03-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "privatemode-ai", + "providerName": "Privatemode AI", + "providerApi": "http://localhost:8080/v1", + "providerDoc": "https://docs.privatemode.ai/api/overview", + "model": "gemma-3-27b", + "modelKey": "gemma-3-27b", + "displayName": "Gemma 3 27B", + "family": "gemma", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2025-03-12", + "openWeights": true, + "releaseDate": "2025-03-12" + } + } + ] + }, + { + "id": "publicai/alia-40b-instruct-q8-0", + "provider": "publicai", + "model": "alia-40b-instruct-q8-0", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "publicai" + ], + "aliases": [ + "publicai/BSC-LT/ALIA-40b-instruct_Q8_0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "publicai", + "model": "publicai/BSC-LT/ALIA-40b-instruct_Q8_0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "publicai", + "model": "publicai/BSC-LT/ALIA-40b-instruct_Q8_0", + "mode": "chat", + "metadata": { + "source": "https://platform.publicai.co/docs" + } + } + ] + }, + { + "id": "publicai/apertus-70b-instruct", + "provider": "publicai", + "model": "apertus-70b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "publicai" + ], + "aliases": [ + "publicai/swiss-ai/apertus-70b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "publicai", + "model": "publicai/swiss-ai/apertus-70b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "publicai", + "model": "publicai/swiss-ai/apertus-70b-instruct", + "mode": "chat", + "metadata": { + "source": "https://platform.publicai.co/docs" + } + } + ] + }, + { + "id": "publicai/apertus-8b-instruct", + "provider": "publicai", + "model": "apertus-8b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "publicai" + ], + "aliases": [ + "publicai/swiss-ai/apertus-8b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "publicai", + "model": "publicai/swiss-ai/apertus-8b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "publicai", + "model": "publicai/swiss-ai/apertus-8b-instruct", + "mode": "chat", + "metadata": { + "source": "https://platform.publicai.co/docs" + } + } + ] + }, + { + "id": "publicai/gemma-sea-lion-v4-27b-it", + "provider": "publicai", + "model": "gemma-sea-lion-v4-27b-it", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "publicai" + ], + "aliases": [ + "publicai/aisingapore/Gemma-SEA-LION-v4-27B-IT" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "publicai", + "model": "publicai/aisingapore/Gemma-SEA-LION-v4-27B-IT", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "publicai", + "model": "publicai/aisingapore/Gemma-SEA-LION-v4-27B-IT", + "mode": "chat", + "metadata": { + "source": "https://platform.publicai.co/docs" + } + } + ] + }, + { + "id": "publicai/olmo-3-32b-think", + "provider": "publicai", + "model": "olmo-3-32b-think", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "publicai" + ], + "aliases": [ + "publicai/allenai/Olmo-3-32B-Think" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "publicai", + "model": "publicai/allenai/Olmo-3-32B-Think", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "publicai", + "model": "publicai/allenai/Olmo-3-32B-Think", + "mode": "chat", + "metadata": { + "source": "https://platform.publicai.co/docs" + } + } + ] + }, + { + "id": "publicai/olmo-3-7b-instruct", + "provider": "publicai", + "model": "olmo-3-7b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "publicai" + ], + "aliases": [ + "publicai/allenai/Olmo-3-7B-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "publicai", + "model": "publicai/allenai/Olmo-3-7B-Instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "publicai", + "model": "publicai/allenai/Olmo-3-7B-Instruct", + "mode": "chat", + "metadata": { + "source": "https://platform.publicai.co/docs" + } + } + ] + }, + { + "id": "publicai/olmo-3-7b-think", + "provider": "publicai", + "model": "olmo-3-7b-think", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "publicai" + ], + "aliases": [ + "publicai/allenai/Olmo-3-7B-Think" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "publicai", + "model": "publicai/allenai/Olmo-3-7B-Think", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "publicai", + "model": "publicai/allenai/Olmo-3-7B-Think", + "mode": "chat", + "metadata": { + "source": "https://platform.publicai.co/docs" + } + } + ] + }, + { + "id": "publicai/salamandra-7b-instruct-tools-16k", + "provider": "publicai", + "model": "salamandra-7b-instruct-tools-16k", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "publicai" + ], + "aliases": [ + "publicai/BSC-LT/salamandra-7b-instruct-tools-16k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "publicai", + "model": "publicai/BSC-LT/salamandra-7b-instruct-tools-16k", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "publicai", + "model": "publicai/BSC-LT/salamandra-7b-instruct-tools-16k", + "mode": "chat", + "metadata": { + "source": "https://platform.publicai.co/docs" + } + } + ] + }, + { + "id": "qiniu-ai/doubao-1.5-pro-32k", + "provider": "qiniu-ai", + "model": "doubao-1.5-pro-32k", + "displayName": "Doubao 1.5 Pro 32k", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/doubao-1.5-pro-32k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 12000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Doubao 1.5 Pro 32k" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "doubao-1.5-pro-32k", + "modelKey": "doubao-1.5-pro-32k", + "displayName": "Doubao 1.5 Pro 32k", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + } + ] + }, + { + "id": "qiniu-ai/doubao-1.5-thinking-pro", + "provider": "qiniu-ai", + "model": "doubao-1.5-thinking-pro", + "displayName": "Doubao 1.5 Thinking Pro", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/doubao-1.5-thinking-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Doubao 1.5 Thinking Pro" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "doubao-1.5-thinking-pro", + "modelKey": "doubao-1.5-thinking-pro", + "displayName": "Doubao 1.5 Thinking Pro", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + } + ] + }, + { + "id": "qiniu-ai/doubao-1.5-vision-pro", + "provider": "qiniu-ai", + "model": "doubao-1.5-vision-pro", + "displayName": "Doubao 1.5 Vision Pro", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/doubao-1.5-vision-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Doubao 1.5 Vision Pro" + ], + "releaseDate": "2025-08-05", + "lastUpdated": "2025-08-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "doubao-1.5-vision-pro", + "modelKey": "doubao-1.5-vision-pro", + "displayName": "Doubao 1.5 Vision Pro", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + } + ] + }, + { + "id": "qiniu-ai/doubao-seed-1.6", + "provider": "qiniu-ai", + "model": "doubao-seed-1.6", + "displayName": "Doubao-Seed 1.6", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/doubao-seed-1.6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Doubao-Seed 1.6" + ], + "releaseDate": "2025-08-15", + "lastUpdated": "2025-08-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "doubao-seed-1.6", + "modelKey": "doubao-seed-1.6", + "displayName": "Doubao-Seed 1.6", + "metadata": { + "lastUpdated": "2025-08-15", + "openWeights": false, + "releaseDate": "2025-08-15" + } + } + ] + }, + { + "id": "qiniu-ai/doubao-seed-1.6-flash", + "provider": "qiniu-ai", + "model": "doubao-seed-1.6-flash", + "displayName": "Doubao-Seed 1.6 Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/doubao-seed-1.6-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Doubao-Seed 1.6 Flash" + ], + "releaseDate": "2025-08-15", + "lastUpdated": "2025-08-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "doubao-seed-1.6-flash", + "modelKey": "doubao-seed-1.6-flash", + "displayName": "Doubao-Seed 1.6 Flash", + "metadata": { + "lastUpdated": "2025-08-15", + "openWeights": false, + "releaseDate": "2025-08-15" + } + } + ] + }, + { + "id": "qiniu-ai/doubao-seed-1.6-thinking", + "provider": "qiniu-ai", + "model": "doubao-seed-1.6-thinking", + "displayName": "Doubao-Seed 1.6 Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/doubao-seed-1.6-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Doubao-Seed 1.6 Thinking" + ], + "releaseDate": "2025-08-15", + "lastUpdated": "2025-08-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "doubao-seed-1.6-thinking", + "modelKey": "doubao-seed-1.6-thinking", + "displayName": "Doubao-Seed 1.6 Thinking", + "metadata": { + "lastUpdated": "2025-08-15", + "openWeights": false, + "releaseDate": "2025-08-15" + } + } + ] + }, + { + "id": "qiniu-ai/doubao-seed-2.0-code", + "provider": "qiniu-ai", + "model": "doubao-seed-2.0-code", + "displayName": "Doubao Seed 2.0 Code", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/doubao-seed-2.0-code" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Doubao Seed 2.0 Code" + ], + "releaseDate": "2026-02-14", + "lastUpdated": "2026-02-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "doubao-seed-2.0-code", + "modelKey": "doubao-seed-2.0-code", + "displayName": "Doubao Seed 2.0 Code", + "metadata": { + "lastUpdated": "2026-02-14", + "openWeights": false, + "releaseDate": "2026-02-14" + } + } + ] + }, + { + "id": "qiniu-ai/doubao-seed-2.0-lite", + "provider": "qiniu-ai", + "model": "doubao-seed-2.0-lite", + "displayName": "Doubao Seed 2.0 Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/doubao-seed-2.0-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Doubao Seed 2.0 Lite" + ], + "releaseDate": "2026-02-14", + "lastUpdated": "2026-02-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "doubao-seed-2.0-lite", + "modelKey": "doubao-seed-2.0-lite", + "displayName": "Doubao Seed 2.0 Lite", + "metadata": { + "lastUpdated": "2026-02-14", + "openWeights": false, + "releaseDate": "2026-02-14" + } + } + ] + }, + { + "id": "qiniu-ai/doubao-seed-2.0-mini", + "provider": "qiniu-ai", + "model": "doubao-seed-2.0-mini", + "displayName": "Doubao Seed 2.0 Mini", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/doubao-seed-2.0-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Doubao Seed 2.0 Mini" + ], + "releaseDate": "2026-02-14", + "lastUpdated": "2026-02-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "doubao-seed-2.0-mini", + "modelKey": "doubao-seed-2.0-mini", + "displayName": "Doubao Seed 2.0 Mini", + "metadata": { + "lastUpdated": "2026-02-14", + "openWeights": false, + "releaseDate": "2026-02-14" + } + } + ] + }, + { + "id": "qiniu-ai/doubao-seed-2.0-pro", + "provider": "qiniu-ai", + "model": "doubao-seed-2.0-pro", + "displayName": "Doubao Seed 2.0 Pro", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/doubao-seed-2.0-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Doubao Seed 2.0 Pro" + ], + "releaseDate": "2026-02-14", + "lastUpdated": "2026-02-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "doubao-seed-2.0-pro", + "modelKey": "doubao-seed-2.0-pro", + "displayName": "Doubao Seed 2.0 Pro", + "metadata": { + "lastUpdated": "2026-02-14", + "openWeights": false, + "releaseDate": "2026-02-14" + } + } + ] + }, + { + "id": "qiniu-ai/gelab-zero-4b-preview", + "provider": "qiniu-ai", + "model": "gelab-zero-4b-preview", + "displayName": "Stepfun-Ai/Gelab Zero 4b Preview", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/stepfun-ai/gelab-zero-4b-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Stepfun-Ai/Gelab Zero 4b Preview" + ], + "releaseDate": "2025-12-23", + "lastUpdated": "2025-12-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "stepfun-ai/gelab-zero-4b-preview", + "modelKey": "stepfun-ai/gelab-zero-4b-preview", + "displayName": "Stepfun-Ai/Gelab Zero 4b Preview", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": false, + "releaseDate": "2025-12-23" + } + } + ] + }, + { + "id": "qiniu-ai/kling-v2-6", + "provider": "qiniu-ai", + "model": "kling-v2-6", + "displayName": "Kling-V2 6", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/kling-v2-6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 99999999, + "outputTokens": 99999999, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": true, + "supports1MContext": true + }, + "metadata": { + "displayNames": [ + "Kling-V2 6" + ], + "releaseDate": "2026-01-13", + "lastUpdated": "2026-01-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "kling-v2-6", + "modelKey": "kling-v2-6", + "displayName": "Kling-V2 6", + "metadata": { + "lastUpdated": "2026-01-13", + "openWeights": false, + "releaseDate": "2026-01-13" + } + } + ] + }, + { + "id": "qiniu-ai/longcat-flash-chat", + "provider": "qiniu-ai", + "model": "longcat-flash-chat", + "displayName": "Meituan/Longcat-Flash-Chat", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/meituan/longcat-flash-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Meituan/Longcat-Flash-Chat" + ], + "releaseDate": "2025-11-05", + "lastUpdated": "2025-11-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "meituan/longcat-flash-chat", + "modelKey": "meituan/longcat-flash-chat", + "displayName": "Meituan/Longcat-Flash-Chat", + "metadata": { + "lastUpdated": "2025-11-05", + "openWeights": false, + "releaseDate": "2025-11-05" + } + } + ] + }, + { + "id": "qiniu-ai/longcat-flash-lite", + "provider": "qiniu-ai", + "model": "longcat-flash-lite", + "displayName": "Meituan/Longcat-Flash-Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/meituan/longcat-flash-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 320000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Meituan/Longcat-Flash-Lite" + ], + "releaseDate": "2026-02-06", + "lastUpdated": "2026-02-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "meituan/longcat-flash-lite", + "modelKey": "meituan/longcat-flash-lite", + "displayName": "Meituan/Longcat-Flash-Lite", + "metadata": { + "lastUpdated": "2026-02-06", + "openWeights": false, + "releaseDate": "2026-02-06" + } + } + ] + }, + { + "id": "qiniu-ai/mimo-v2-flash", + "provider": "qiniu-ai", + "model": "mimo-v2-flash", + "displayName": "Mimo-V2-Flash", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/mimo-v2-flash", + "qiniu-ai/xiaomi/mimo-v2-flash" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "qiniu-ai", + "model": "mimo-v2-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "qiniu-ai", + "model": "xiaomi/mimo-v2-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mimo-V2-Flash", + "Xiaomi/Mimo-V2-Flash" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12-01", + "releaseDate": "2025-12-16", + "lastUpdated": "2026-02-04", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "mimo-v2-flash", + "modelKey": "mimo-v2-flash", + "displayName": "Mimo-V2-Flash", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12-01", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2025-12-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "xiaomi/mimo-v2-flash", + "modelKey": "xiaomi/mimo-v2-flash", + "displayName": "Xiaomi/Mimo-V2-Flash", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12-01", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2025-12-16" + } + } + ] + }, + { + "id": "qiniu-ai/step-3.5-flash", + "provider": "qiniu-ai", + "model": "step-3.5-flash", + "displayName": "Stepfun/Step-3.5 Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/stepfun/step-3.5-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 64000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Stepfun/Step-3.5 Flash" + ], + "releaseDate": "2026-02-02", + "lastUpdated": "2026-02-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "stepfun/step-3.5-flash", + "modelKey": "stepfun/step-3.5-flash", + "displayName": "Stepfun/Step-3.5 Flash", + "metadata": { + "lastUpdated": "2026-02-02", + "openWeights": false, + "releaseDate": "2026-02-02" + } + } + ] + }, + { + "id": "recraft/recraftv2", + "provider": "recraft", + "model": "recraftv2", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "recraft" + ], + "aliases": [ + "recraft/recraftv2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "recraft", + "model": "recraft/recraftv2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.022 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "recraft", + "model": "recraft/recraftv2", + "mode": "image_generation", + "metadata": { + "source": "https://www.recraft.ai/docs#pricing", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "recraft/recraftv3", + "provider": "recraft", + "model": "recraftv3", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "recraft" + ], + "aliases": [ + "recraft/recraftv3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "recraft", + "model": "recraft/recraftv3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "recraft", + "model": "recraft/recraftv3", + "mode": "image_generation", + "metadata": { + "source": "https://www.recraft.ai/docs#pricing", + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "reducto/parse-legacy", + "provider": "reducto", + "model": "parse-legacy", + "mode": "ocr", + "sources": [ + "litellm" + ], + "providers": [ + "reducto" + ], + "aliases": [ + "reducto/parse-legacy" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "reducto", + "model": "reducto/parse-legacy", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCredit": { + "ocr": 0.015 + } + } + ] + }, + "metadata": { + "modes": [ + "ocr" + ], + "supportedEndpoints": [ + "/v1/ocr" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "reducto", + "model": "reducto/parse-legacy", + "mode": "ocr", + "metadata": { + "source": "https://reducto.ai/pricing", + "supportedEndpoints": [ + "/v1/ocr" + ] + } + } + ] + }, + { + "id": "reducto/parse-v3", + "provider": "reducto", + "model": "parse-v3", + "mode": "ocr", + "sources": [ + "litellm" + ], + "providers": [ + "reducto" + ], + "aliases": [ + "reducto/parse-v3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "reducto", + "model": "reducto/parse-v3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCredit": { + "ocr": 0.015 + } + } + ] + }, + "metadata": { + "modes": [ + "ocr" + ], + "supportedEndpoints": [ + "/v1/ocr" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "reducto", + "model": "reducto/parse-v3", + "mode": "ocr", + "metadata": { + "source": "https://reducto.ai/pricing", + "supportedEndpoints": [ + "/v1/ocr" + ] + } + } + ] + }, + { + "id": "replicate/granite-3.3-8b-instruct", + "provider": "replicate", + "model": "granite-3.3-8b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "replicate" + ], + "aliases": [ + "replicate/ibm-granite/granite-3.3-8b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/ibm-granite/granite-3.3-8b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.03, + "output": 0.25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/ibm-granite/granite-3.3-8b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "routing-run/gemma-4-31b-it", + "provider": "routing-run", + "model": "gemma-4-31b-it", + "displayName": "Gemma 4 31B IT", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "routing-run" + ], + "aliases": [ + "routing-run/route/gemma-4-31b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/gemma-4-31b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 31B IT" + ], + "families": [ + "gemma" + ], + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/gemma-4-31b-it", + "modelKey": "route/gemma-4-31b-it", + "displayName": "Gemma 4 31B IT", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02" + } + } + ] + }, + { + "id": "routing-run/mimo-v2.5", + "provider": "routing-run", + "model": "mimo-v2.5", + "displayName": "MiMo V2.5", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "routing-run" + ], + "aliases": [ + "routing-run/route/mimo-v2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 262144, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/mimo-v2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.45, + "output": 1.35 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.4, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2.5" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/mimo-v2.5", + "modelKey": "route/mimo-v2.5", + "displayName": "MiMo V2.5", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "routing-run/mimo-v2.5-pro", + "provider": "routing-run", + "model": "mimo-v2.5-pro", + "displayName": "MiMo V2.5 Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "routing-run" + ], + "aliases": [ + "routing-run/route/mimo-v2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 262144, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/mimo-v2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.45, + "output": 1.35 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.4, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2.5 Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/mimo-v2.5-pro", + "modelKey": "route/mimo-v2.5-pro", + "displayName": "MiMo V2.5 Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "routing-run/mimo-v2.5-pro-6bit", + "provider": "routing-run", + "model": "mimo-v2.5-pro-6bit", + "displayName": "MiMo V2.5 Pro 6bit", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "routing-run" + ], + "aliases": [ + "routing-run/route/mimo-v2.5-pro-6bit" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 262144, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/mimo-v2.5-pro-6bit", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.45, + "output": 1.35 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.4, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2.5 Pro 6bit" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/mimo-v2.5-pro-6bit", + "modelKey": "route/mimo-v2.5-pro-6bit", + "displayName": "MiMo V2.5 Pro 6bit", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "routing-run/step-3.5-flash", + "provider": "routing-run", + "model": "step-3.5-flash", + "displayName": "Step 3.5 Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "routing-run" + ], + "aliases": [ + "routing-run/route/step-3.5-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 256000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/step-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.019, + "input": 0.096, + "output": 0.288 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 3.5 Flash" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-01-29", + "lastUpdated": "2026-02-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/step-3.5-flash", + "modelKey": "route/step-3.5-flash", + "displayName": "Step 3.5 Flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-13", + "openWeights": true, + "releaseDate": "2026-01-29" + } + } + ] + }, + { + "id": "routing-run/step-3.5-flash-2603", + "provider": "routing-run", + "model": "step-3.5-flash-2603", + "displayName": "Step 3.5 Flash 2603", + "sources": [ + "models.dev" + ], + "providers": [ + "routing-run" + ], + "aliases": [ + "routing-run/route/step-3.5-flash-2603" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 256000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/step-3.5-flash-2603", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 3.5 Flash 2603" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/step-3.5-flash-2603", + "modelKey": "route/step-3.5-flash-2603", + "displayName": "Step 3.5 Flash 2603", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02" + } + } + ] + }, + { + "id": "routing-run/stepfun-3.5-flash", + "provider": "routing-run", + "model": "stepfun-3.5-flash", + "displayName": "StepFun 3.5 Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "routing-run" + ], + "aliases": [ + "routing-run/route/stepfun-3.5-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "inputTokens": 256000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/stepfun-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.019, + "input": 0.096, + "output": 0.288 + } + } + ] + }, + "metadata": { + "displayNames": [ + "StepFun 3.5 Flash" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-01-29", + "lastUpdated": "2026-02-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/stepfun-3.5-flash", + "modelKey": "route/stepfun-3.5-flash", + "displayName": "StepFun 3.5 Flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-13", + "openWeights": true, + "releaseDate": "2026-01-29" + } + } + ] + }, + { + "id": "runwayml/eleven-multilingual-v2", + "provider": "runwayml", + "model": "eleven-multilingual-v2", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "runwayml" + ], + "aliases": [ + "runwayml/eleven_multilingual_v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "runwayml", + "model": "runwayml/eleven_multilingual_v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 3e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "runwayml", + "model": "runwayml/eleven_multilingual_v2", + "mode": "audio_speech", + "metadata": { + "metadata": { + "comment": "Estimated cost based on standard TTS pricing. RunwayML uses ElevenLabs models." + }, + "source": "https://docs.dev.runwayml.com/guides/pricing/" + } + } + ] + }, + { + "id": "runwayml/gen3a-turbo", + "provider": "runwayml", + "model": "gen3a-turbo", + "mode": "video_generation", + "sources": [ + "litellm" + ], + "providers": [ + "runwayml" + ], + "aliases": [ + "runwayml/gen3a_turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "runwayml", + "model": "runwayml/gen3a_turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perVideoSecond": { + "output": 0.05 + } + } + ] + }, + "metadata": { + "modes": [ + "video_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "runwayml", + "model": "runwayml/gen3a_turbo", + "mode": "video_generation", + "metadata": { + "metadata": { + "comment": "5 credits per second @ $0.01 per credit = $0.05 per second" + }, + "source": "https://docs.dev.runwayml.com/guides/pricing/" + } + } + ] + }, + { + "id": "runwayml/gen4-aleph", + "provider": "runwayml", + "model": "gen4-aleph", + "mode": "video_generation", + "sources": [ + "litellm" + ], + "providers": [ + "runwayml" + ], + "aliases": [ + "runwayml/gen4_aleph" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "runwayml", + "model": "runwayml/gen4_aleph", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perVideoSecond": { + "output": 0.15 + } + } + ] + }, + "metadata": { + "modes": [ + "video_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "runwayml", + "model": "runwayml/gen4_aleph", + "mode": "video_generation", + "metadata": { + "metadata": { + "comment": "15 credits per second @ $0.01 per credit = $0.15 per second" + }, + "source": "https://docs.dev.runwayml.com/guides/pricing/" + } + } + ] + }, + { + "id": "runwayml/gen4-image", + "provider": "runwayml", + "model": "gen4-image", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "runwayml" + ], + "aliases": [ + "runwayml/gen4_image" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": true, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "runwayml", + "model": "runwayml/gen4_image", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.05, + "output": 0.05 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "runwayml", + "model": "runwayml/gen4_image", + "mode": "image_generation", + "metadata": { + "metadata": { + "comment": "5 credits per 720p image or 8 credits per 1080p image @ $0.01 per credit. Using 5 credits ($0.05) as base cost" + }, + "source": "https://docs.dev.runwayml.com/guides/pricing/" + } + } + ] + }, + { + "id": "runwayml/gen4-image-turbo", + "provider": "runwayml", + "model": "gen4-image-turbo", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "runwayml" + ], + "aliases": [ + "runwayml/gen4_image_turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": true, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "runwayml", + "model": "runwayml/gen4_image_turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "input": 0.02, + "output": 0.02 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "runwayml", + "model": "runwayml/gen4_image_turbo", + "mode": "image_generation", + "metadata": { + "metadata": { + "comment": "2 credits per image (any resolution) @ $0.01 per credit = $0.02 per image" + }, + "source": "https://docs.dev.runwayml.com/guides/pricing/" + } + } + ] + }, + { + "id": "runwayml/gen4-turbo", + "provider": "runwayml", + "model": "gen4-turbo", + "mode": "video_generation", + "sources": [ + "litellm" + ], + "providers": [ + "runwayml" + ], + "aliases": [ + "runwayml/gen4_turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "runwayml", + "model": "runwayml/gen4_turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perVideoSecond": { + "output": 0.05 + } + } + ] + }, + "metadata": { + "modes": [ + "video_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "runwayml", + "model": "runwayml/gen4_turbo", + "mode": "video_generation", + "metadata": { + "metadata": { + "comment": "5 credits per second @ $0.01 per credit = $0.05 per second" + }, + "source": "https://docs.dev.runwayml.com/guides/pricing/" + } + } + ] + }, + { + "id": "sagemaker/meta-textgeneration-llama-2-13b", + "provider": "sagemaker", + "model": "meta-textgeneration-llama-2-13b", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "sagemaker" + ], + "aliases": [ + "sagemaker/meta-textgeneration-llama-2-13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "sagemaker", + "model": "sagemaker/meta-textgeneration-llama-2-13b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sagemaker", + "model": "sagemaker/meta-textgeneration-llama-2-13b", + "mode": "completion" + } + ] + }, + { + "id": "sagemaker/meta-textgeneration-llama-2-13b-f", + "provider": "sagemaker", + "model": "meta-textgeneration-llama-2-13b-f", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "sagemaker" + ], + "aliases": [ + "sagemaker/meta-textgeneration-llama-2-13b-f" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "sagemaker", + "model": "sagemaker/meta-textgeneration-llama-2-13b-f", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sagemaker", + "model": "sagemaker/meta-textgeneration-llama-2-13b-f", + "mode": "chat" + } + ] + }, + { + "id": "sagemaker/meta-textgeneration-llama-2-70b", + "provider": "sagemaker", + "model": "meta-textgeneration-llama-2-70b", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "sagemaker" + ], + "aliases": [ + "sagemaker/meta-textgeneration-llama-2-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "sagemaker", + "model": "sagemaker/meta-textgeneration-llama-2-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sagemaker", + "model": "sagemaker/meta-textgeneration-llama-2-70b", + "mode": "completion" + } + ] + }, + { + "id": "sagemaker/meta-textgeneration-llama-2-70b-b-f", + "provider": "sagemaker", + "model": "meta-textgeneration-llama-2-70b-b-f", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "sagemaker" + ], + "aliases": [ + "sagemaker/meta-textgeneration-llama-2-70b-b-f" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "sagemaker", + "model": "sagemaker/meta-textgeneration-llama-2-70b-b-f", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sagemaker", + "model": "sagemaker/meta-textgeneration-llama-2-70b-b-f", + "mode": "chat" + } + ] + }, + { + "id": "sagemaker/meta-textgeneration-llama-2-7b", + "provider": "sagemaker", + "model": "meta-textgeneration-llama-2-7b", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "sagemaker" + ], + "aliases": [ + "sagemaker/meta-textgeneration-llama-2-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "sagemaker", + "model": "sagemaker/meta-textgeneration-llama-2-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sagemaker", + "model": "sagemaker/meta-textgeneration-llama-2-7b", + "mode": "completion" + } + ] + }, + { + "id": "sagemaker/meta-textgeneration-llama-2-7b-f", + "provider": "sagemaker", + "model": "meta-textgeneration-llama-2-7b-f", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "sagemaker" + ], + "aliases": [ + "sagemaker/meta-textgeneration-llama-2-7b-f" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "sagemaker", + "model": "sagemaker/meta-textgeneration-llama-2-7b-f", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sagemaker", + "model": "sagemaker/meta-textgeneration-llama-2-7b-f", + "mode": "chat" + } + ] + }, + { + "id": "sap-ai-core/anthropic-claude-3-haiku", + "provider": "sap-ai-core", + "model": "anthropic-claude-3-haiku", + "displayName": "anthropic--claude-3-haiku", + "family": "claude-haiku", + "sources": [ + "models.dev" + ], + "providers": [ + "sap-ai-core" + ], + "aliases": [ + "sap-ai-core/anthropic--claude-3-haiku" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "anthropic--claude-3-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0.3, + "input": 0.25, + "output": 1.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "anthropic--claude-3-haiku" + ], + "families": [ + "claude-haiku" + ], + "knowledgeCutoff": "2023-08-31", + "releaseDate": "2024-03-13", + "lastUpdated": "2024-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "anthropic--claude-3-haiku", + "modelKey": "anthropic--claude-3-haiku", + "displayName": "anthropic--claude-3-haiku", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2023-08-31", + "lastUpdated": "2024-03-13", + "openWeights": false, + "releaseDate": "2024-03-13" + } + } + ] + }, + { + "id": "sap-ai-core/anthropic-claude-3-opus", + "provider": "sap-ai-core", + "model": "anthropic-claude-3-opus", + "displayName": "anthropic--claude-3-opus", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "sap-ai-core" + ], + "aliases": [ + "sap-ai-core/anthropic--claude-3-opus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "anthropic--claude-3-opus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "anthropic--claude-3-opus" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2023-08-31", + "releaseDate": "2024-02-29", + "lastUpdated": "2024-02-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "anthropic--claude-3-opus", + "modelKey": "anthropic--claude-3-opus", + "displayName": "anthropic--claude-3-opus", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2023-08-31", + "lastUpdated": "2024-02-29", + "openWeights": false, + "releaseDate": "2024-02-29" + } + } + ] + }, + { + "id": "sap-ai-core/anthropic-claude-3-sonnet", + "provider": "sap-ai-core", + "model": "anthropic-claude-3-sonnet", + "displayName": "anthropic--claude-3-sonnet", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "sap-ai-core" + ], + "aliases": [ + "sap-ai-core/anthropic--claude-3-sonnet" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "anthropic--claude-3-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "anthropic--claude-3-sonnet" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2023-08-31", + "releaseDate": "2024-03-04", + "lastUpdated": "2024-03-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "anthropic--claude-3-sonnet", + "modelKey": "anthropic--claude-3-sonnet", + "displayName": "anthropic--claude-3-sonnet", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2023-08-31", + "lastUpdated": "2024-03-04", + "openWeights": false, + "releaseDate": "2024-03-04" + } + } + ] + }, + { + "id": "sap-ai-core/anthropic-claude-3.5-sonnet", + "provider": "sap-ai-core", + "model": "anthropic-claude-3.5-sonnet", + "displayName": "anthropic--claude-3.5-sonnet", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "sap-ai-core" + ], + "aliases": [ + "sap-ai-core/anthropic--claude-3.5-sonnet" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "anthropic--claude-3.5-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "anthropic--claude-3.5-sonnet" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2024-04-30", + "releaseDate": "2024-10-22", + "lastUpdated": "2024-10-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "anthropic--claude-3.5-sonnet", + "modelKey": "anthropic--claude-3.5-sonnet", + "displayName": "anthropic--claude-3.5-sonnet", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2024-04-30", + "lastUpdated": "2024-10-22", + "openWeights": false, + "releaseDate": "2024-10-22" + } + } + ] + }, + { + "id": "sap-ai-core/anthropic-claude-3.7-sonnet", + "provider": "sap-ai-core", + "model": "anthropic-claude-3.7-sonnet", + "displayName": "anthropic--claude-3.7-sonnet", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "sap-ai-core" + ], + "aliases": [ + "sap-ai-core/anthropic--claude-3.7-sonnet" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "anthropic--claude-3.7-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "anthropic--claude-3.7-sonnet" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2024-10-31", + "releaseDate": "2025-02-24", + "lastUpdated": "2025-02-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "anthropic--claude-3.7-sonnet", + "modelKey": "anthropic--claude-3.7-sonnet", + "displayName": "anthropic--claude-3.7-sonnet", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2024-10-31", + "lastUpdated": "2025-02-24", + "openWeights": false, + "releaseDate": "2025-02-24" + } + } + ] + }, + { + "id": "sap-ai-core/anthropic-claude-4-opus", + "provider": "sap-ai-core", + "model": "anthropic-claude-4-opus", + "displayName": "anthropic--claude-4-opus", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "sap-ai-core" + ], + "aliases": [ + "sap-ai-core/anthropic--claude-4-opus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "anthropic--claude-4-opus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.5, + "cacheWrite": 18.75, + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "anthropic--claude-4-opus" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "anthropic--claude-4-opus", + "modelKey": "anthropic--claude-4-opus", + "displayName": "anthropic--claude-4-opus", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + } + ] + }, + { + "id": "sap-ai-core/anthropic-claude-4-sonnet", + "provider": "sap-ai-core", + "model": "anthropic-claude-4-sonnet", + "displayName": "anthropic--claude-4-sonnet", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "sap-ai-core" + ], + "aliases": [ + "sap-ai-core/anthropic--claude-4-sonnet" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "anthropic--claude-4-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "anthropic--claude-4-sonnet" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-03-31", + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "anthropic--claude-4-sonnet", + "modelKey": "anthropic--claude-4-sonnet", + "displayName": "anthropic--claude-4-sonnet", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-03-31", + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + } + ] + }, + { + "id": "sap-ai-core/anthropic-claude-4.5-haiku", + "provider": "sap-ai-core", + "model": "anthropic-claude-4.5-haiku", + "displayName": "anthropic--claude-4.5-haiku", + "family": "claude-haiku", + "sources": [ + "models.dev" + ], + "providers": [ + "sap-ai-core" + ], + "aliases": [ + "sap-ai-core/anthropic--claude-4.5-haiku" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "anthropic--claude-4.5-haiku", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1.25, + "input": 1, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "anthropic--claude-4.5-haiku" + ], + "families": [ + "claude-haiku" + ], + "knowledgeCutoff": "2025-02-28", + "releaseDate": "2025-10-15", + "lastUpdated": "2025-10-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "anthropic--claude-4.5-haiku", + "modelKey": "anthropic--claude-4.5-haiku", + "displayName": "anthropic--claude-4.5-haiku", + "family": "claude-haiku", + "metadata": { + "knowledgeCutoff": "2025-02-28", + "lastUpdated": "2025-10-15", + "openWeights": false, + "releaseDate": "2025-10-15" + } + } + ] + }, + { + "id": "sap-ai-core/anthropic-claude-4.5-opus", + "provider": "sap-ai-core", + "model": "anthropic-claude-4.5-opus", + "displayName": "anthropic--claude-4.5-opus", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "sap-ai-core" + ], + "aliases": [ + "sap-ai-core/anthropic--claude-4.5-opus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "anthropic--claude-4.5-opus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "anthropic--claude-4.5-opus" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2025-11-24", + "lastUpdated": "2025-11-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "anthropic--claude-4.5-opus", + "modelKey": "anthropic--claude-4.5-opus", + "displayName": "anthropic--claude-4.5-opus", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2025-11-24", + "openWeights": false, + "releaseDate": "2025-11-24" + } + } + ] + }, + { + "id": "sap-ai-core/anthropic-claude-4.5-sonnet", + "provider": "sap-ai-core", + "model": "anthropic-claude-4.5-sonnet", + "displayName": "anthropic--claude-4.5-sonnet", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "sap-ai-core" + ], + "aliases": [ + "sap-ai-core/anthropic--claude-4.5-sonnet" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "anthropic--claude-4.5-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "anthropic--claude-4.5-sonnet" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-07-31", + "releaseDate": "2025-09-29", + "lastUpdated": "2025-09-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "anthropic--claude-4.5-sonnet", + "modelKey": "anthropic--claude-4.5-sonnet", + "displayName": "anthropic--claude-4.5-sonnet", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-07-31", + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + } + ] + }, + { + "id": "sap-ai-core/anthropic-claude-4.6-opus", + "provider": "sap-ai-core", + "model": "anthropic-claude-4.6-opus", + "displayName": "anthropic--claude-4.6-opus", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "sap-ai-core" + ], + "aliases": [ + "sap-ai-core/anthropic--claude-4.6-opus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "anthropic--claude-4.6-opus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "anthropic--claude-4.6-opus" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2026-02-05", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "anthropic--claude-4.6-opus", + "modelKey": "anthropic--claude-4.6-opus", + "displayName": "anthropic--claude-4.6-opus", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-05" + } + } + ] + }, + { + "id": "sap-ai-core/anthropic-claude-4.6-sonnet", + "provider": "sap-ai-core", + "model": "anthropic-claude-4.6-sonnet", + "displayName": "anthropic--claude-4.6-sonnet", + "family": "claude-sonnet", + "sources": [ + "models.dev" + ], + "providers": [ + "sap-ai-core" + ], + "aliases": [ + "sap-ai-core/anthropic--claude-4.6-sonnet" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 64000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "anthropic--claude-4.6-sonnet", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 3.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "anthropic--claude-4.6-sonnet" + ], + "families": [ + "claude-sonnet" + ], + "knowledgeCutoff": "2025-08", + "releaseDate": "2026-02-17", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "anthropic--claude-4.6-sonnet", + "modelKey": "anthropic--claude-4.6-sonnet", + "displayName": "anthropic--claude-4.6-sonnet", + "family": "claude-sonnet", + "metadata": { + "knowledgeCutoff": "2025-08", + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-02-17" + } + } + ] + }, + { + "id": "sap-ai-core/anthropic-claude-4.7-opus", + "provider": "sap-ai-core", + "model": "anthropic-claude-4.7-opus", + "displayName": "anthropic--claude-4.7-opus", + "family": "claude-opus", + "sources": [ + "models.dev" + ], + "providers": [ + "sap-ai-core" + ], + "aliases": [ + "sap-ai-core/anthropic--claude-4.7-opus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "anthropic--claude-4.7-opus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "cacheWrite": 6.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "anthropic--claude-4.7-opus" + ], + "families": [ + "claude-opus" + ], + "knowledgeCutoff": "2026-01-31", + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "anthropic--claude-4.7-opus", + "modelKey": "anthropic--claude-4.7-opus", + "displayName": "anthropic--claude-4.7-opus", + "family": "claude-opus", + "metadata": { + "knowledgeCutoff": "2026-01-31", + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + } + ] + }, + { + "id": "sap-ai-core/sonar", + "provider": "sap-ai-core", + "model": "sonar", + "displayName": "sonar", + "family": "sonar", + "sources": [ + "models.dev" + ], + "providers": [ + "sap-ai-core" + ], + "aliases": [ + "sap-ai-core/sonar" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "sap-ai-core", + "model": "sonar", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "sonar" + ], + "families": [ + "sonar" + ], + "knowledgeCutoff": "2025-09-01", + "releaseDate": "2024-01-01", + "lastUpdated": "2025-09-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sap-ai-core", + "providerName": "SAP AI Core", + "providerDoc": "https://help.sap.com/docs/sap-ai-core", + "model": "sonar", + "modelKey": "sonar", + "displayName": "sonar", + "family": "sonar", + "metadata": { + "knowledgeCutoff": "2025-09-01", + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + } + ] + }, + { + "id": "sarvam/sarvam-105b", + "provider": "sarvam", + "model": "sarvam-105b", + "displayName": "Sarvam-105B", + "family": "sarvam", + "sources": [ + "models.dev" + ], + "providers": [ + "sarvam" + ], + "aliases": [ + "sarvam/sarvam-105b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Sarvam-105B" + ], + "families": [ + "sarvam" + ], + "releaseDate": "2026-02-18", + "lastUpdated": "2026-03-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sarvam", + "providerName": "Sarvam AI", + "providerApi": "https://api.sarvam.ai/v1", + "providerDoc": "https://docs.sarvam.ai/api-reference-docs/getting-started/models", + "model": "sarvam-105b", + "modelKey": "sarvam-105b", + "displayName": "Sarvam-105B", + "family": "sarvam", + "metadata": { + "lastUpdated": "2026-03-06", + "openWeights": true, + "releaseDate": "2026-02-18", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + null, + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "sarvam/sarvam-30b", + "provider": "sarvam", + "model": "sarvam-30b", + "displayName": "Sarvam-30B", + "family": "sarvam", + "sources": [ + "models.dev" + ], + "providers": [ + "sarvam" + ], + "aliases": [ + "sarvam/sarvam-30b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Sarvam-30B" + ], + "families": [ + "sarvam" + ], + "releaseDate": "2026-02-18", + "lastUpdated": "2026-03-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "sarvam", + "providerName": "Sarvam AI", + "providerApi": "https://api.sarvam.ai/v1", + "providerDoc": "https://docs.sarvam.ai/api-reference-docs/getting-started/models", + "model": "sarvam-30b", + "modelKey": "sarvam-30b", + "displayName": "Sarvam-30B", + "family": "sarvam", + "metadata": { + "lastUpdated": "2026-03-06", + "openWeights": true, + "releaseDate": "2026-02-18", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + null, + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "sarvam/sarvam-m", + "provider": "sarvam", + "model": "sarvam-m", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "sarvam" + ], + "aliases": [ + "sarvam/sarvam-m" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "sarvam", + "model": "sarvam/sarvam-m", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + }, + "extra": { + "cache_creation_input_token_cost_above_1hr": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "sarvam", + "model": "sarvam/sarvam-m", + "mode": "chat" + } + ] + }, + { + "id": "scaleway/bge-multilingual-gemma2", + "provider": "scaleway", + "model": "bge-multilingual-gemma2", + "displayName": "BGE Multilingual Gemma2", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "scaleway" + ], + "aliases": [ + "scaleway/bge-multilingual-gemma2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8191, + "outputTokens": 3072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "scaleway", + "model": "bge-multilingual-gemma2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "BGE Multilingual Gemma2" + ], + "families": [ + "gemma" + ], + "releaseDate": "2024-07-26", + "lastUpdated": "2025-06-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "scaleway", + "providerName": "Scaleway", + "providerApi": "https://api.scaleway.ai/v1", + "providerDoc": "https://www.scaleway.com/en/docs/generative-apis/", + "model": "bge-multilingual-gemma2", + "modelKey": "bge-multilingual-gemma2", + "displayName": "BGE Multilingual Gemma2", + "family": "gemma", + "metadata": { + "lastUpdated": "2025-06-15", + "openWeights": false, + "releaseDate": "2024-07-26" + } + } + ] + }, + { + "id": "scaleway/gemma-3-27b-it", + "provider": "scaleway", + "model": "gemma-3-27b-it", + "displayName": "Gemma-3-27B-IT", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "scaleway" + ], + "aliases": [ + "scaleway/gemma-3-27b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 40000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "scaleway", + "model": "gemma-3-27b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma-3-27B-IT" + ], + "families": [ + "gemma" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2024-12-01", + "lastUpdated": "2026-03-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "scaleway", + "providerName": "Scaleway", + "providerApi": "https://api.scaleway.ai/v1", + "providerDoc": "https://www.scaleway.com/en/docs/generative-apis/", + "model": "gemma-3-27b-it", + "modelKey": "gemma-3-27b-it", + "displayName": "Gemma-3-27B-IT", + "family": "gemma", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-17", + "openWeights": false, + "releaseDate": "2024-12-01" + } + } + ] + }, + { + "id": "scaleway/gemma-4-26b-a4b-it", + "provider": "scaleway", + "model": "gemma-4-26b-a4b-it", + "displayName": "Gemma 4 26B A4B IT", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "scaleway" + ], + "aliases": [ + "scaleway/gemma-4-26b-a4b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "scaleway", + "model": "gemma-4-26b-a4b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 26B A4B IT" + ], + "families": [ + "gemma" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-04-01", + "lastUpdated": "2026-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "scaleway", + "providerName": "Scaleway", + "providerApi": "https://api.scaleway.ai/v1", + "providerDoc": "https://www.scaleway.com/en/docs/generative-apis/", + "model": "gemma-4-26b-a4b-it", + "modelKey": "gemma-4-26b-a4b-it", + "displayName": "Gemma 4 26B A4B IT", + "family": "gemma", + "status": "beta", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-05-22", + "openWeights": true, + "releaseDate": "2026-04-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "searxng/search", + "provider": "searxng", + "model": "search", + "mode": "search", + "sources": [ + "litellm" + ], + "providers": [ + "searxng" + ], + "aliases": [ + "searxng/search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "searxng", + "model": "searxng/search", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perQuery": { + "input": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "search" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "searxng", + "model": "searxng/search", + "mode": "search", + "metadata": { + "metadata": { + "notes": "SearXNG is an open-source metasearch engine. Free to use when self-hosted or using public instances." + } + } + } + ] + }, + { + "id": "serper/search", + "provider": "serper", + "model": "search", + "mode": "search", + "sources": [ + "litellm" + ], + "providers": [ + "serper" + ], + "aliases": [ + "serper/search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "serper", + "model": "serper/search", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perQuery": { + "input": 0.001 + } + } + ] + }, + "metadata": { + "modes": [ + "search" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "serper", + "model": "serper/search", + "mode": "search", + "metadata": { + "metadata": { + "notes": "Serper Google Search API. Pricing: $1.00/1k queries (Starter), $0.75/1k (Standard), $0.50/1k (Scale), $0.30/1k (Ultimate)." + } + } + } + ] + }, + { + "id": "siliconflow-cn/ernie-4.5-300b-a47b", + "provider": "siliconflow-cn", + "model": "ernie-4.5-300b-a47b", + "displayName": "baidu/ERNIE-4.5-300B-A47B", + "family": "ernie", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow-cn" + ], + "aliases": [ + "siliconflow-cn/baidu/ERNIE-4.5-300B-A47B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131000, + "outputTokens": 131000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "baidu/ERNIE-4.5-300B-A47B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.28, + "output": 1.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "baidu/ERNIE-4.5-300B-A47B" + ], + "families": [ + "ernie" + ], + "releaseDate": "2025-07-02", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "baidu/ERNIE-4.5-300B-A47B", + "modelKey": "baidu/ERNIE-4.5-300B-A47B", + "displayName": "baidu/ERNIE-4.5-300B-A47B", + "family": "ernie", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-07-02" + } + } + ] + }, + { + "id": "siliconflow-cn/hunyuan-a13b-instruct", + "provider": "siliconflow-cn", + "model": "hunyuan-a13b-instruct", + "displayName": "tencent/Hunyuan-A13B-Instruct", + "family": "hunyuan", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow-cn" + ], + "aliases": [ + "siliconflow-cn/tencent/Hunyuan-A13B-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131000, + "outputTokens": 131000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "tencent/Hunyuan-A13B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.57 + } + } + ] + }, + "metadata": { + "displayNames": [ + "tencent/Hunyuan-A13B-Instruct" + ], + "families": [ + "hunyuan" + ], + "releaseDate": "2025-06-30", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "tencent/Hunyuan-A13B-Instruct", + "modelKey": "tencent/Hunyuan-A13B-Instruct", + "displayName": "tencent/Hunyuan-A13B-Instruct", + "family": "hunyuan", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-06-30", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "siliconflow-cn/kat-dev", + "provider": "siliconflow-cn", + "model": "kat-dev", + "displayName": "Kwaipilot/KAT-Dev", + "family": "kat-coder", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow-cn" + ], + "aliases": [ + "siliconflow-cn/Kwaipilot/KAT-Dev" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Kwaipilot/KAT-Dev", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kwaipilot/KAT-Dev" + ], + "families": [ + "kat-coder" + ], + "releaseDate": "2025-09-27", + "lastUpdated": "2026-01-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Kwaipilot/KAT-Dev", + "modelKey": "Kwaipilot/KAT-Dev", + "displayName": "Kwaipilot/KAT-Dev", + "family": "kat-coder", + "metadata": { + "lastUpdated": "2026-01-16", + "openWeights": false, + "releaseDate": "2025-09-27" + } + } + ] + }, + { + "id": "siliconflow-cn/ling-flash-2.0", + "provider": "siliconflow-cn", + "model": "ling-flash-2.0", + "displayName": "inclusionAI/Ling-flash-2.0", + "family": "ling", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow-cn" + ], + "aliases": [ + "siliconflow-cn/inclusionAI/Ling-flash-2.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131000, + "outputTokens": 131000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "inclusionAI/Ling-flash-2.0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.57 + } + } + ] + }, + "metadata": { + "displayNames": [ + "inclusionAI/Ling-flash-2.0" + ], + "families": [ + "ling" + ], + "releaseDate": "2025-09-18", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "inclusionAI/Ling-flash-2.0", + "modelKey": "inclusionAI/Ling-flash-2.0", + "displayName": "inclusionAI/Ling-flash-2.0", + "family": "ling", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-09-18" + } + } + ] + }, + { + "id": "siliconflow-cn/paddleocr-vl-1.5", + "provider": "siliconflow-cn", + "model": "paddleocr-vl-1.5", + "displayName": "PaddlePaddle/PaddleOCR-VL-1.5", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow-cn" + ], + "aliases": [ + "siliconflow-cn/PaddlePaddle/PaddleOCR-VL-1.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "PaddlePaddle/PaddleOCR-VL-1.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "PaddlePaddle/PaddleOCR-VL-1.5" + ], + "releaseDate": "2026-01-29", + "lastUpdated": "2026-01-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "PaddlePaddle/PaddleOCR-VL-1.5", + "modelKey": "PaddlePaddle/PaddleOCR-VL-1.5", + "displayName": "PaddlePaddle/PaddleOCR-VL-1.5", + "metadata": { + "lastUpdated": "2026-01-29", + "openWeights": true, + "releaseDate": "2026-01-29" + } + } + ] + }, + { + "id": "siliconflow-cn/seed-oss-36b-instruct", + "provider": "siliconflow-cn", + "model": "seed-oss-36b-instruct", + "displayName": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow-cn" + ], + "aliases": [ + "siliconflow-cn/ByteDance-Seed/Seed-OSS-36B-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262000, + "outputTokens": 262000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.21, + "output": 0.57 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ByteDance-Seed/Seed-OSS-36B-Instruct" + ], + "families": [ + "seed" + ], + "releaseDate": "2025-09-04", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "modelKey": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "displayName": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "family": "seed", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-09-04" + } + } + ] + }, + { + "id": "siliconflow-cn/step-3.5-flash", + "provider": "siliconflow-cn", + "model": "step-3.5-flash", + "displayName": "stepfun-ai/Step-3.5-Flash", + "family": "step", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow-cn" + ], + "aliases": [ + "siliconflow-cn/stepfun-ai/Step-3.5-Flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262000, + "outputTokens": 262000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "stepfun-ai/Step-3.5-Flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "stepfun-ai/Step-3.5-Flash" + ], + "families": [ + "step" + ], + "releaseDate": "2026-02-11", + "lastUpdated": "2026-02-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "stepfun-ai/Step-3.5-Flash", + "modelKey": "stepfun-ai/Step-3.5-Flash", + "displayName": "stepfun-ai/Step-3.5-Flash", + "family": "step", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": false, + "releaseDate": "2026-02-11" + } + } + ] + }, + { + "id": "siliconflow/ernie-4.5-300b-a47b", + "provider": "siliconflow", + "model": "ernie-4.5-300b-a47b", + "displayName": "baidu/ERNIE-4.5-300B-A47B", + "family": "ernie", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow" + ], + "aliases": [ + "siliconflow/baidu/ERNIE-4.5-300B-A47B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131000, + "outputTokens": 131000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow", + "model": "baidu/ERNIE-4.5-300B-A47B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.28, + "output": 1.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "baidu/ERNIE-4.5-300B-A47B" + ], + "families": [ + "ernie" + ], + "releaseDate": "2025-07-02", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "baidu/ERNIE-4.5-300B-A47B", + "modelKey": "baidu/ERNIE-4.5-300B-A47B", + "displayName": "baidu/ERNIE-4.5-300B-A47B", + "family": "ernie", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-07-02" + } + } + ] + }, + { + "id": "siliconflow/hunyuan-a13b-instruct", + "provider": "siliconflow", + "model": "hunyuan-a13b-instruct", + "displayName": "tencent/Hunyuan-A13B-Instruct", + "family": "hunyuan", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow" + ], + "aliases": [ + "siliconflow/tencent/Hunyuan-A13B-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131000, + "outputTokens": 131000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow", + "model": "tencent/Hunyuan-A13B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.57 + } + } + ] + }, + "metadata": { + "displayNames": [ + "tencent/Hunyuan-A13B-Instruct" + ], + "families": [ + "hunyuan" + ], + "releaseDate": "2025-06-30", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "tencent/Hunyuan-A13B-Instruct", + "modelKey": "tencent/Hunyuan-A13B-Instruct", + "displayName": "tencent/Hunyuan-A13B-Instruct", + "family": "hunyuan", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-06-30", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "budget_tokens", + "min": 128, + "max": 32768 + } + ] + } + } + ] + }, + { + "id": "siliconflow/hy3-preview", + "provider": "siliconflow", + "model": "hy3-preview", + "displayName": "Hy3 preview", + "family": "Hy", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow" + ], + "aliases": [ + "siliconflow/tencent/Hy3-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow", + "model": "tencent/Hy3-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.029, + "input": 0.066, + "output": 0.26 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hy3 preview" + ], + "families": [ + "Hy" + ], + "releaseDate": "2026-04-20", + "lastUpdated": "2026-04-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "tencent/Hy3-preview", + "modelKey": "tencent/Hy3-preview", + "displayName": "Hy3 preview", + "family": "Hy", + "metadata": { + "lastUpdated": "2026-04-20", + "openWeights": false, + "releaseDate": "2026-04-20", + "reasoningOptions": [ + { + "type": "budget_tokens", + "min": 128, + "max": 32768 + } + ] + } + } + ] + }, + { + "id": "siliconflow/ling-flash-2.0", + "provider": "siliconflow", + "model": "ling-flash-2.0", + "displayName": "inclusionAI/Ling-flash-2.0", + "family": "ling", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow" + ], + "aliases": [ + "siliconflow/inclusionAI/Ling-flash-2.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131000, + "outputTokens": 131000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow", + "model": "inclusionAI/Ling-flash-2.0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.57 + } + } + ] + }, + "metadata": { + "displayNames": [ + "inclusionAI/Ling-flash-2.0" + ], + "families": [ + "ling" + ], + "releaseDate": "2025-09-18", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "inclusionAI/Ling-flash-2.0", + "modelKey": "inclusionAI/Ling-flash-2.0", + "displayName": "inclusionAI/Ling-flash-2.0", + "family": "ling", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-09-18" + } + } + ] + }, + { + "id": "siliconflow/seed-oss-36b-instruct", + "provider": "siliconflow", + "model": "seed-oss-36b-instruct", + "displayName": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow" + ], + "aliases": [ + "siliconflow/ByteDance-Seed/Seed-OSS-36B-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262000, + "outputTokens": 262000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow", + "model": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.21, + "output": 0.57 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ByteDance-Seed/Seed-OSS-36B-Instruct" + ], + "families": [ + "seed" + ], + "releaseDate": "2025-09-04", + "lastUpdated": "2025-11-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "modelKey": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "displayName": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "family": "seed", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-09-04" + } + } + ] + }, + { + "id": "siliconflow/step-3.5-flash", + "provider": "siliconflow", + "model": "step-3.5-flash", + "displayName": "stepfun-ai/Step-3.5-Flash", + "family": "step", + "sources": [ + "models.dev" + ], + "providers": [ + "siliconflow" + ], + "aliases": [ + "siliconflow/stepfun-ai/Step-3.5-Flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262000, + "outputTokens": 262000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "siliconflow", + "model": "stepfun-ai/Step-3.5-Flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "stepfun-ai/Step-3.5-Flash" + ], + "families": [ + "step" + ], + "releaseDate": "2026-02-11", + "lastUpdated": "2026-02-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "stepfun-ai/Step-3.5-Flash", + "modelKey": "stepfun-ai/Step-3.5-Flash", + "displayName": "stepfun-ai/Step-3.5-Flash", + "family": "step", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": false, + "releaseDate": "2026-02-11" + } + } + ] + }, + { + "id": "snowflake-cortex/openai-gpt-4.1", + "provider": "snowflake-cortex", + "model": "openai-gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "snowflake-cortex" + ], + "aliases": [ + "snowflake-cortex/openai-gpt-4.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1047576, + "outputTokens": 32768, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "metadata": { + "displayNames": [ + "GPT-4.1" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2025-04-14", + "lastUpdated": "2025-04-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "openai-gpt-4.1", + "modelKey": "openai-gpt-4.1", + "displayName": "GPT-4.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + } + ] + }, + { + "id": "snowflake-cortex/openai-gpt-5", + "provider": "snowflake-cortex", + "model": "openai-gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "snowflake-cortex" + ], + "aliases": [ + "snowflake-cortex/openai-gpt-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "GPT-5" + ], + "families": [ + "gpt" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2025-08-07", + "lastUpdated": "2025-08-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "openai-gpt-5", + "modelKey": "openai-gpt-5", + "displayName": "GPT-5", + "family": "gpt", + "status": "beta", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + } + ] + }, + { + "id": "snowflake-cortex/openai-gpt-5-mini", + "provider": "snowflake-cortex", + "model": "openai-gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "sources": [ + "models.dev" + ], + "providers": [ + "snowflake-cortex" + ], + "aliases": [ + "snowflake-cortex/openai-gpt-5-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 272000, + "inputTokens": 272000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "GPT-5 Mini" + ], + "families": [ + "gpt-mini" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2024-05-30", + "releaseDate": "2025-08-07", + "lastUpdated": "2025-08-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "openai-gpt-5-mini", + "modelKey": "openai-gpt-5-mini", + "displayName": "GPT-5 Mini", + "family": "gpt-mini", + "status": "beta", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + } + ] + }, + { + "id": "snowflake-cortex/openai-gpt-5-nano", + "provider": "snowflake-cortex", + "model": "openai-gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "sources": [ + "models.dev" + ], + "providers": [ + "snowflake-cortex" + ], + "aliases": [ + "snowflake-cortex/openai-gpt-5-nano" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "GPT-5 Nano" + ], + "families": [ + "gpt-nano" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2024-05-30", + "releaseDate": "2025-08-07", + "lastUpdated": "2025-08-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "openai-gpt-5-nano", + "modelKey": "openai-gpt-5-nano", + "displayName": "GPT-5 Nano", + "family": "gpt-nano", + "status": "beta", + "metadata": { + "knowledgeCutoff": "2024-05-30", + "lastUpdated": "2025-08-07", + "openWeights": false, + "releaseDate": "2025-08-07" + } + } + ] + }, + { + "id": "snowflake-cortex/openai-gpt-5.1", + "provider": "snowflake-cortex", + "model": "openai-gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "snowflake-cortex" + ], + "aliases": [ + "snowflake-cortex/openai-gpt-5.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "GPT-5.1" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2024-09-30", + "releaseDate": "2025-11-13", + "lastUpdated": "2025-11-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "openai-gpt-5.1", + "modelKey": "openai-gpt-5.1", + "displayName": "GPT-5.1", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2024-09-30", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13" + } + } + ] + }, + { + "id": "snowflake-cortex/openai-gpt-5.2", + "provider": "snowflake-cortex", + "model": "openai-gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "snowflake-cortex" + ], + "aliases": [ + "snowflake-cortex/openai-gpt-5.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "GPT-5.2" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2025-12-11", + "lastUpdated": "2025-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "openai-gpt-5.2", + "modelKey": "openai-gpt-5.2", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + } + ] + }, + { + "id": "snowflake-cortex/openai-gpt-5.4", + "provider": "snowflake-cortex", + "model": "openai-gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "snowflake-cortex" + ], + "aliases": [ + "snowflake-cortex/openai-gpt-5.4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1050000, + "inputTokens": 922000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "metadata": { + "displayNames": [ + "GPT-5.4" + ], + "families": [ + "gpt" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-05", + "lastUpdated": "2026-03-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "openai-gpt-5.4", + "modelKey": "openai-gpt-5.4", + "displayName": "GPT-5.4", + "family": "gpt", + "status": "beta", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-05", + "openWeights": false, + "releaseDate": "2026-03-05" + } + } + ] + }, + { + "id": "snowflake-cortex/openai-gpt-5.5", + "provider": "snowflake-cortex", + "model": "openai-gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "snowflake-cortex" + ], + "aliases": [ + "snowflake-cortex/openai-gpt-5.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1050000, + "inputTokens": 922000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "metadata": { + "displayNames": [ + "GPT-5.5" + ], + "families": [ + "gpt" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2025-12-01", + "releaseDate": "2026-04-23", + "lastUpdated": "2026-04-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "openai-gpt-5.5", + "modelKey": "openai-gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "status": "beta", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-04-23", + "openWeights": false, + "releaseDate": "2026-04-23" + } + } + ] + }, + { + "id": "snowflake-cortex/snowflake-llama3.3-70b", + "provider": "snowflake-cortex", + "model": "snowflake-llama3.3-70b", + "displayName": "Llama-3.3-70B-Instruct", + "family": "llama", + "sources": [ + "models.dev" + ], + "providers": [ + "snowflake-cortex" + ], + "aliases": [ + "snowflake-cortex/snowflake-llama3.3-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Llama-3.3-70B-Instruct" + ], + "families": [ + "llama" + ], + "knowledgeCutoff": "2023-12", + "releaseDate": "2024-12-06", + "lastUpdated": "2024-12-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "snowflake-cortex", + "providerName": "Snowflake Cortex", + "providerApi": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "providerDoc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "model": "snowflake-llama3.3-70b", + "modelKey": "snowflake-llama3.3-70b", + "displayName": "Llama-3.3-70B-Instruct", + "family": "llama", + "metadata": { + "knowledgeCutoff": "2023-12", + "lastUpdated": "2024-12-06", + "openWeights": true, + "releaseDate": "2024-12-06" + } + } + ] + }, + { + "id": "snowflake/gemma-7b", + "provider": "snowflake", + "model": "gemma-7b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/gemma-7b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 8000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/gemma-7b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/gemma-7b", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/jamba-1.5-large", + "provider": "snowflake", + "model": "jamba-1.5-large", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/jamba-1.5-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/jamba-1.5-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/jamba-1.5-large", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/jamba-1.5-mini", + "provider": "snowflake", + "model": "jamba-1.5-mini", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/jamba-1.5-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/jamba-1.5-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/jamba-1.5-mini", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/jamba-instruct", + "provider": "snowflake", + "model": "jamba-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/jamba-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/jamba-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/jamba-instruct", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/llama2-70b-chat", + "provider": "snowflake", + "model": "llama2-70b-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/llama2-70b-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/llama2-70b-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/llama2-70b-chat", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/llama3-70b", + "provider": "snowflake", + "model": "llama3-70b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/llama3-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 8000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/llama3-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/llama3-70b", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/llama3-8b", + "provider": "snowflake", + "model": "llama3-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/llama3-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 8000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/llama3-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/llama3-8b", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/llama3.1-405b", + "provider": "snowflake", + "model": "llama3.1-405b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/llama3.1-405b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/llama3.1-405b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.2, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/llama3.1-405b", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/llama3.1-70b", + "provider": "snowflake", + "model": "llama3.1-70b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/llama3.1-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/llama3.1-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/llama3.1-70b", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/llama3.1-8b", + "provider": "snowflake", + "model": "llama3.1-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/llama3.1-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/llama3.1-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.24, + "output": 0.24 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/llama3.1-8b", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/llama3.2-1b", + "provider": "snowflake", + "model": "llama3.2-1b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/llama3.2-1b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/llama3.2-1b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/llama3.2-1b", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/llama3.2-3b", + "provider": "snowflake", + "model": "llama3.2-3b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/llama3.2-3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/llama3.2-3b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/llama3.2-3b", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/llama3.3-70b", + "provider": "snowflake", + "model": "llama3.3-70b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/llama3.3-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/llama3.3-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/llama3.3-70b", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/llama4-maverick", + "provider": "snowflake", + "model": "llama4-maverick", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/llama4-maverick" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/llama4-maverick", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.24, + "output": 0.97 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/llama4-maverick", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/openai-gpt-4.1", + "provider": "snowflake", + "model": "openai-gpt-4.1", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/openai-gpt-4.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 300000, + "inputTokens": 300000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/openai-gpt-4.1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.5, + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/openai-gpt-4.1", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/openai-gpt-5", + "provider": "snowflake", + "model": "openai-gpt-5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/openai-gpt-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 300000, + "inputTokens": 300000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/openai-gpt-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.125, + "input": 1.25, + "output": 10 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/openai-gpt-5", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/openai-gpt-5-mini", + "provider": "snowflake", + "model": "openai-gpt-5-mini", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/openai-gpt-5-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/openai-gpt-5-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/openai-gpt-5-mini", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/openai-gpt-5-nano", + "provider": "snowflake", + "model": "openai-gpt-5-nano", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/openai-gpt-5-nano" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 5000000, + "inputTokens": 5000000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/openai-gpt-5-nano", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/openai-gpt-5-nano", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/reka-core", + "provider": "snowflake", + "model": "reka-core", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/reka-core" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/reka-core", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/reka-core", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/reka-flash", + "provider": "snowflake", + "model": "reka-flash", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/reka-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 100000, + "inputTokens": 100000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/reka-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/reka-flash", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/snowflake-arctic", + "provider": "snowflake", + "model": "snowflake-arctic", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/snowflake-arctic" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/snowflake-arctic", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/snowflake-arctic", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/snowflake-arctic-embed-l-v2.0", + "provider": "snowflake", + "model": "snowflake-arctic-embed-l-v2.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/snowflake-arctic-embed-l-v2.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/snowflake-arctic-embed-l-v2.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/snowflake-arctic-embed-l-v2.0", + "mode": "embedding" + } + ] + }, + { + "id": "snowflake/snowflake-arctic-embed-m-v2.0", + "provider": "snowflake", + "model": "snowflake-arctic-embed-m-v2.0", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/snowflake-arctic-embed-m-v2.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/snowflake-arctic-embed-m-v2.0", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.07, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/snowflake-arctic-embed-m-v2.0", + "mode": "embedding" + } + ] + }, + { + "id": "snowflake/snowflake-llama-3.1-405b", + "provider": "snowflake", + "model": "snowflake-llama-3.1-405b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/snowflake-llama-3.1-405b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 8000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/snowflake-llama-3.1-405b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/snowflake-llama-3.1-405b", + "mode": "chat" + } + ] + }, + { + "id": "snowflake/snowflake-llama-3.3-70b", + "provider": "snowflake", + "model": "snowflake-llama-3.3-70b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "snowflake" + ], + "aliases": [ + "snowflake/snowflake-llama-3.3-70b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "snowflake", + "model": "snowflake/snowflake-llama-3.3-70b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.72, + "output": 0.72 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "snowflake", + "model": "snowflake/snowflake-llama-3.3-70b", + "mode": "chat" + } + ] + }, + { + "id": "soniox/stt-async-v4", + "provider": "soniox", + "model": "stt-async-v4", + "mode": "audio_transcription", + "sources": [ + "litellm" + ], + "providers": [ + "soniox" + ], + "aliases": [ + "soniox/stt-async-v4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "maxTokens": 8000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "soniox", + "model": "soniox/stt-async-v4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perAudioSecond": { + "output": 0.0000277778 + }, + "extra": { + "input_cost_per_second": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_transcription" + ], + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "soniox", + "model": "soniox/stt-async-v4", + "mode": "audio_transcription", + "metadata": { + "source": "https://soniox.com/pricing", + "supportedEndpoints": [ + "/v1/audio/transcriptions" + ] + } + } + ] + }, + { + "id": "stability/conservative", + "provider": "stability", + "model": "conservative", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/conservative" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/conservative", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/conservative", + "mode": "image_edit", + "metadata": { + "supportedEndpoints": [ + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "stability/creative", + "provider": "stability", + "model": "creative", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/creative" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/creative", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.06 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/creative", + "mode": "image_edit", + "metadata": { + "supportedEndpoints": [ + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "stability/erase", + "provider": "stability", + "model": "erase", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/erase" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/erase", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.005 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/erase", + "mode": "image_edit", + "metadata": { + "supportedEndpoints": [ + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "stability/fast", + "provider": "stability", + "model": "fast", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/fast", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.002 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/fast", + "mode": "image_edit", + "metadata": { + "supportedEndpoints": [ + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "stability/inpaint", + "provider": "stability", + "model": "inpaint", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/inpaint" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/inpaint", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.005 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/inpaint", + "mode": "image_edit", + "metadata": { + "supportedEndpoints": [ + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "stability/outpaint", + "provider": "stability", + "model": "outpaint", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/outpaint" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/outpaint", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.004 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/outpaint", + "mode": "image_edit", + "metadata": { + "supportedEndpoints": [ + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "stability/remove-background", + "provider": "stability", + "model": "remove-background", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/remove-background" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/remove-background", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.005 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/remove-background", + "mode": "image_edit", + "metadata": { + "supportedEndpoints": [ + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "stability/replace-background-and-relight", + "provider": "stability", + "model": "replace-background-and-relight", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/replace-background-and-relight" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/replace-background-and-relight", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.008 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/replace-background-and-relight", + "mode": "image_edit", + "metadata": { + "supportedEndpoints": [ + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "stability/sd3", + "provider": "stability", + "model": "sd3", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/sd3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/sd3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.065 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/sd3", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "stability/sd3-large", + "provider": "stability", + "model": "sd3-large", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/sd3-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/sd3-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.065 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/sd3-large", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "stability/sd3-large-turbo", + "provider": "stability", + "model": "sd3-large-turbo", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/sd3-large-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/sd3-large-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/sd3-large-turbo", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "stability/sd3-medium", + "provider": "stability", + "model": "sd3-medium", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/sd3-medium" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/sd3-medium", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.035 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/sd3-medium", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "stability/sd3.5-large", + "provider": "stability", + "model": "sd3.5-large", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/sd3.5-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/sd3.5-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.065 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/sd3.5-large", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "stability/sd3.5-large-turbo", + "provider": "stability", + "model": "sd3.5-large-turbo", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/sd3.5-large-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/sd3.5-large-turbo", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.04 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/sd3.5-large-turbo", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "stability/sd3.5-medium", + "provider": "stability", + "model": "sd3.5-medium", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/sd3.5-medium" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/sd3.5-medium", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.035 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/sd3.5-medium", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "stability/search-and-recolor", + "provider": "stability", + "model": "search-and-recolor", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/search-and-recolor" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/search-and-recolor", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.005 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/search-and-recolor", + "mode": "image_edit", + "metadata": { + "supportedEndpoints": [ + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "stability/search-and-replace", + "provider": "stability", + "model": "search-and-replace", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/search-and-replace" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/search-and-replace", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.005 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/search-and-replace", + "mode": "image_edit", + "metadata": { + "supportedEndpoints": [ + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "stability/sketch", + "provider": "stability", + "model": "sketch", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/sketch" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/sketch", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.005 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/sketch", + "mode": "image_edit", + "metadata": { + "supportedEndpoints": [ + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "stability/stable-image-core", + "provider": "stability", + "model": "stable-image-core", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/stable-image-core" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/stable-image-core", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.03 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/stable-image-core", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "stability/stable-image-ultra", + "provider": "stability", + "model": "stable-image-ultra", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/stable-image-ultra" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/stable-image-ultra", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.08 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/images/generations" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/stable-image-ultra", + "mode": "image_generation", + "metadata": { + "supportedEndpoints": [ + "/v1/images/generations" + ] + } + } + ] + }, + { + "id": "stability/structure", + "provider": "stability", + "model": "structure", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/structure" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/structure", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.005 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/structure", + "mode": "image_edit", + "metadata": { + "supportedEndpoints": [ + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "stability/style", + "provider": "stability", + "model": "style", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/style" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/style", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.005 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/style", + "mode": "image_edit", + "metadata": { + "supportedEndpoints": [ + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "stability/style-transfer", + "provider": "stability", + "model": "style-transfer", + "mode": "image_edit", + "sources": [ + "litellm" + ], + "providers": [ + "stability" + ], + "aliases": [ + "stability/style-transfer" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "stability", + "model": "stability/style-transfer", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.008 + } + } + ] + }, + "metadata": { + "modes": [ + "image_edit" + ], + "supportedEndpoints": [ + "/v1/images/edits" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "stability", + "model": "stability/style-transfer", + "mode": "image_edit", + "metadata": { + "supportedEndpoints": [ + "/v1/images/edits" + ] + } + } + ] + }, + { + "id": "stackit/e5-mistral-7b-instruct", + "provider": "stackit", + "model": "e5-mistral-7b-instruct", + "displayName": "E5 Mistral 7B", + "family": "mistral", + "sources": [ + "models.dev" + ], + "providers": [ + "stackit" + ], + "aliases": [ + "stackit/intfloat/e5-mistral-7b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "stackit", + "model": "intfloat/e5-mistral-7b-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.02, + "output": 0.02 + } + } + ] + }, + "metadata": { + "displayNames": [ + "E5 Mistral 7B" + ], + "families": [ + "mistral" + ], + "releaseDate": "2023-12-11", + "lastUpdated": "2023-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "stackit", + "providerName": "STACKIT", + "providerApi": "https://api.openai-compat.model-serving.eu01.onstackit.cloud/v1", + "providerDoc": "https://docs.stackit.cloud/products/data-and-ai/ai-model-serving/basics/available-shared-models", + "model": "intfloat/e5-mistral-7b-instruct", + "modelKey": "intfloat/e5-mistral-7b-instruct", + "displayName": "E5 Mistral 7B", + "family": "mistral", + "metadata": { + "lastUpdated": "2023-12-11", + "openWeights": true, + "releaseDate": "2023-12-11" + } + } + ] + }, + { + "id": "stepfun-ai/step-3.5-flash", + "provider": "stepfun-ai", + "model": "step-3.5-flash", + "displayName": "Step 3.5 Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "stepfun-ai" + ], + "aliases": [ + "stepfun-ai/step-3.5-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "stepfun-ai", + "model": "step-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 3.5 Flash" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-01-29", + "lastUpdated": "2026-06-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "stepfun-ai", + "providerName": "StepFun AI", + "providerApi": "https://api.stepfun.ai/step_plan/v1", + "providerDoc": "https://platform.stepfun.ai/docs/en/step-plan/integrations/open-code", + "model": "step-3.5-flash", + "modelKey": "step-3.5-flash", + "displayName": "Step 3.5 Flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-15", + "openWeights": true, + "releaseDate": "2026-01-29" + } + } + ] + }, + { + "id": "stepfun-ai/step-3.5-flash-2603", + "provider": "stepfun-ai", + "model": "step-3.5-flash-2603", + "displayName": "Step 3.5 Flash 2603", + "sources": [ + "models.dev" + ], + "providers": [ + "stepfun-ai" + ], + "aliases": [ + "stepfun-ai/step-3.5-flash-2603" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "stepfun-ai", + "model": "step-3.5-flash-2603", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 3.5 Flash 2603" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "stepfun-ai", + "providerName": "StepFun AI", + "providerApi": "https://api.stepfun.ai/step_plan/v1", + "providerDoc": "https://platform.stepfun.ai/docs/en/step-plan/integrations/open-code", + "model": "step-3.5-flash-2603", + "modelKey": "step-3.5-flash-2603", + "displayName": "Step 3.5 Flash 2603", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "stepfun/step-1-32k", + "provider": "stepfun", + "model": "step-1-32k", + "displayName": "Step 1 (32K)", + "sources": [ + "models.dev" + ], + "providers": [ + "stepfun" + ], + "aliases": [ + "stepfun/step-1-32k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "stepfun", + "model": "step-1-32k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.41, + "input": 2.05, + "output": 9.59 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 1 (32K)" + ], + "knowledgeCutoff": "2024-06", + "releaseDate": "2025-01-01", + "lastUpdated": "2026-02-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "stepfun", + "providerName": "StepFun", + "providerApi": "https://api.stepfun.com/v1", + "providerDoc": "https://platform.stepfun.com/docs/zh/overview/concept", + "model": "step-1-32k", + "modelKey": "step-1-32k", + "displayName": "Step 1 (32K)", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2026-02-13", + "openWeights": false, + "releaseDate": "2025-01-01" + } + } + ] + }, + { + "id": "stepfun/step-2-16k", + "provider": "stepfun", + "model": "step-2-16k", + "displayName": "Step 2 (16K)", + "sources": [ + "models.dev" + ], + "providers": [ + "stepfun" + ], + "aliases": [ + "stepfun/step-2-16k" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "stepfun", + "model": "step-2-16k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.04, + "input": 5.21, + "output": 16.44 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 2 (16K)" + ], + "knowledgeCutoff": "2024-06", + "releaseDate": "2025-01-01", + "lastUpdated": "2026-02-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "stepfun", + "providerName": "StepFun", + "providerApi": "https://api.stepfun.com/v1", + "providerDoc": "https://platform.stepfun.com/docs/zh/overview/concept", + "model": "step-2-16k", + "modelKey": "step-2-16k", + "displayName": "Step 2 (16K)", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2026-02-13", + "openWeights": false, + "releaseDate": "2025-01-01" + } + } + ] + }, + { + "id": "stepfun/step-3.5-flash", + "provider": "stepfun", + "model": "step-3.5-flash", + "displayName": "Step 3.5 Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "stepfun" + ], + "aliases": [ + "stepfun/step-3.5-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "stepfun", + "model": "step-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 3.5 Flash" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-01-29", + "lastUpdated": "2026-06-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "stepfun", + "providerName": "StepFun", + "providerApi": "https://api.stepfun.com/v1", + "providerDoc": "https://platform.stepfun.com/docs/zh/overview/concept", + "model": "step-3.5-flash", + "modelKey": "step-3.5-flash", + "displayName": "Step 3.5 Flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-15", + "openWeights": true, + "releaseDate": "2026-01-29" + } + } + ] + }, + { + "id": "stepfun/step-3.5-flash-2603", + "provider": "stepfun", + "model": "step-3.5-flash-2603", + "displayName": "Step 3.5 Flash 2603", + "sources": [ + "models.dev" + ], + "providers": [ + "stepfun" + ], + "aliases": [ + "stepfun/step-3.5-flash-2603" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "stepfun", + "model": "step-3.5-flash-2603", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 3.5 Flash 2603" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "stepfun", + "providerName": "StepFun", + "providerApi": "https://api.stepfun.com/v1", + "providerDoc": "https://platform.stepfun.com/docs/zh/overview/concept", + "model": "step-3.5-flash-2603", + "modelKey": "step-3.5-flash-2603", + "displayName": "Step 3.5 Flash 2603", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-02", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "synthetic/nvidia-nemotron-3-super-120b-a12b-nvfp4", + "provider": "synthetic", + "model": "nvidia-nemotron-3-super-120b-a12b-nvfp4", + "displayName": "Nemotron 3 Super 120B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "synthetic" + ], + "aliases": [ + "synthetic/hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "input": 0.3, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron 3 Super 120B" + ], + "families": [ + "nemotron" + ], + "knowledgeCutoff": "2024-04", + "releaseDate": "2026-03-11", + "lastUpdated": "2026-04-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4", + "modelKey": "hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4", + "displayName": "Nemotron 3 Super 120B", + "family": "nemotron", + "metadata": { + "knowledgeCutoff": "2024-04", + "lastUpdated": "2026-04-03", + "openWeights": true, + "releaseDate": "2026-03-11" + } + } + ] + }, + { + "id": "tavily/search", + "provider": "tavily", + "model": "search", + "mode": "search", + "sources": [ + "litellm" + ], + "providers": [ + "tavily" + ], + "aliases": [ + "tavily/search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "tavily", + "model": "tavily/search", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perQuery": { + "input": 0.008 + } + } + ] + }, + "metadata": { + "modes": [ + "search" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "tavily", + "model": "tavily/search", + "mode": "search" + } + ] + }, + { + "id": "tavily/search-advanced", + "provider": "tavily", + "model": "search-advanced", + "mode": "search", + "sources": [ + "litellm" + ], + "providers": [ + "tavily" + ], + "aliases": [ + "tavily/search-advanced" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "tavily", + "model": "tavily/search-advanced", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perQuery": { + "input": 0.016 + } + } + ] + }, + "metadata": { + "modes": [ + "search" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "tavily", + "model": "tavily/search-advanced", + "mode": "search" + } + ] + }, + { + "id": "tencent-coding-plan/hunyuan-2.0-instruct", + "provider": "tencent-coding-plan", + "model": "hunyuan-2.0-instruct", + "displayName": "Tencent HY 2.0 Instruct", + "family": "hunyuan", + "sources": [ + "models.dev" + ], + "providers": [ + "tencent-coding-plan" + ], + "aliases": [ + "tencent-coding-plan/hunyuan-2.0-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "tencent-coding-plan", + "model": "hunyuan-2.0-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Tencent HY 2.0 Instruct" + ], + "families": [ + "hunyuan" + ], + "releaseDate": "2026-03-08", + "lastUpdated": "2026-03-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "tencent-coding-plan", + "providerName": "Tencent Coding Plan (China)", + "providerApi": "https://api.lkeap.cloud.tencent.com/coding/v3", + "providerDoc": "https://cloud.tencent.com/document/product/1772/128947", + "model": "hunyuan-2.0-instruct", + "modelKey": "hunyuan-2.0-instruct", + "displayName": "Tencent HY 2.0 Instruct", + "family": "hunyuan", + "metadata": { + "lastUpdated": "2026-03-08", + "openWeights": false, + "releaseDate": "2026-03-08" + } + } + ] + }, + { + "id": "tencent-coding-plan/hunyuan-2.0-thinking", + "provider": "tencent-coding-plan", + "model": "hunyuan-2.0-thinking", + "displayName": "Tencent HY 2.0 Think", + "family": "hunyuan", + "sources": [ + "models.dev" + ], + "providers": [ + "tencent-coding-plan" + ], + "aliases": [ + "tencent-coding-plan/hunyuan-2.0-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "tencent-coding-plan", + "model": "hunyuan-2.0-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Tencent HY 2.0 Think" + ], + "families": [ + "hunyuan" + ], + "releaseDate": "2026-03-08", + "lastUpdated": "2026-03-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "tencent-coding-plan", + "providerName": "Tencent Coding Plan (China)", + "providerApi": "https://api.lkeap.cloud.tencent.com/coding/v3", + "providerDoc": "https://cloud.tencent.com/document/product/1772/128947", + "model": "hunyuan-2.0-thinking", + "modelKey": "hunyuan-2.0-thinking", + "displayName": "Tencent HY 2.0 Think", + "family": "hunyuan", + "metadata": { + "lastUpdated": "2026-03-08", + "openWeights": false, + "releaseDate": "2026-03-08" + } + } + ] + }, + { + "id": "tencent-coding-plan/hunyuan-t1", + "provider": "tencent-coding-plan", + "model": "hunyuan-t1", + "displayName": "Hunyuan-T1", + "family": "hunyuan", + "sources": [ + "models.dev" + ], + "providers": [ + "tencent-coding-plan" + ], + "aliases": [ + "tencent-coding-plan/hunyuan-t1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "tencent-coding-plan", + "model": "hunyuan-t1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hunyuan-T1" + ], + "families": [ + "hunyuan" + ], + "releaseDate": "2026-03-08", + "lastUpdated": "2026-03-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "tencent-coding-plan", + "providerName": "Tencent Coding Plan (China)", + "providerApi": "https://api.lkeap.cloud.tencent.com/coding/v3", + "providerDoc": "https://cloud.tencent.com/document/product/1772/128947", + "model": "hunyuan-t1", + "modelKey": "hunyuan-t1", + "displayName": "Hunyuan-T1", + "family": "hunyuan", + "metadata": { + "lastUpdated": "2026-03-08", + "openWeights": false, + "releaseDate": "2026-03-08" + } + } + ] + }, + { + "id": "tencent-coding-plan/hunyuan-turbos", + "provider": "tencent-coding-plan", + "model": "hunyuan-turbos", + "displayName": "Hunyuan-TurboS", + "family": "hunyuan", + "sources": [ + "models.dev" + ], + "providers": [ + "tencent-coding-plan" + ], + "aliases": [ + "tencent-coding-plan/hunyuan-turbos" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "tencent-coding-plan", + "model": "hunyuan-turbos", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hunyuan-TurboS" + ], + "families": [ + "hunyuan" + ], + "releaseDate": "2026-03-08", + "lastUpdated": "2026-03-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "tencent-coding-plan", + "providerName": "Tencent Coding Plan (China)", + "providerApi": "https://api.lkeap.cloud.tencent.com/coding/v3", + "providerDoc": "https://cloud.tencent.com/document/product/1772/128947", + "model": "hunyuan-turbos", + "modelKey": "hunyuan-turbos", + "displayName": "Hunyuan-TurboS", + "family": "hunyuan", + "metadata": { + "lastUpdated": "2026-03-08", + "openWeights": false, + "releaseDate": "2026-03-08" + } + } + ] + }, + { + "id": "tencent-coding-plan/tc-code-latest", + "provider": "tencent-coding-plan", + "model": "tc-code-latest", + "displayName": "Auto", + "family": "auto", + "sources": [ + "models.dev" + ], + "providers": [ + "tencent-coding-plan" + ], + "aliases": [ + "tencent-coding-plan/tc-code-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "tencent-coding-plan", + "model": "tc-code-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Auto" + ], + "families": [ + "auto" + ], + "releaseDate": "2026-03-08", + "lastUpdated": "2026-03-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "tencent-coding-plan", + "providerName": "Tencent Coding Plan (China)", + "providerApi": "https://api.lkeap.cloud.tencent.com/coding/v3", + "providerDoc": "https://cloud.tencent.com/document/product/1772/128947", + "model": "tc-code-latest", + "modelKey": "tc-code-latest", + "displayName": "Auto", + "family": "auto", + "metadata": { + "lastUpdated": "2026-03-08", + "openWeights": false, + "releaseDate": "2026-03-08" + } + } + ] + }, + { + "id": "tencent-tokenhub/hy3-preview", + "provider": "tencent-tokenhub", + "model": "hy3-preview", + "displayName": "Hy3 preview", + "family": "Hy", + "sources": [ + "models.dev" + ], + "providers": [ + "tencent-tokenhub" + ], + "aliases": [ + "tencent-tokenhub/hy3-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "tencent-tokenhub", + "model": "hy3-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hy3 preview" + ], + "families": [ + "Hy" + ], + "releaseDate": "2026-04-20", + "lastUpdated": "2026-04-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "tencent-tokenhub", + "providerName": "Tencent TokenHub", + "providerApi": "https://tokenhub.tencentmaas.com/v1", + "providerDoc": "https://cloud.tencent.com/document/product/1823/130050", + "model": "hy3-preview", + "modelKey": "hy3-preview", + "displayName": "Hy3 preview", + "family": "Hy", + "metadata": { + "lastUpdated": "2026-04-20", + "openWeights": true, + "releaseDate": "2026-04-20" + } + } + ] + }, + { + "id": "text-completion-inception/mercury-edit-2", + "provider": "text-completion-inception", + "model": "mercury-edit-2", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "text-completion-inception" + ], + "aliases": [ + "text-completion-inception/mercury-edit-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "text-completion-inception", + "model": "text-completion-inception/mercury-edit-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.25, + "output": 0.75 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "text-completion-inception", + "model": "text-completion-inception/mercury-edit-2", + "mode": "completion" + } + ] + }, + { + "id": "text-completion-openai/babbage-002", + "provider": "text-completion-openai", + "model": "babbage-002", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "text-completion-openai" + ], + "aliases": [ + "text-completion-openai/babbage-002" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "text-completion-openai", + "model": "babbage-002", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 0.4 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "text-completion-openai", + "model": "babbage-002", + "mode": "completion" + } + ] + }, + { + "id": "text-completion-openai/davinci-002", + "provider": "text-completion-openai", + "model": "davinci-002", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "text-completion-openai" + ], + "aliases": [ + "text-completion-openai/davinci-002" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "text-completion-openai", + "model": "davinci-002", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 2 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "text-completion-openai", + "model": "davinci-002", + "mode": "completion" + } + ] + }, + { + "id": "text-completion-openai/ft:babbage-002", + "provider": "text-completion-openai", + "model": "ft:babbage-002", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "text-completion-openai" + ], + "aliases": [ + "text-completion-openai/ft:babbage-002" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "text-completion-openai", + "model": "ft:babbage-002", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.6, + "output": 1.6 + }, + "extra": { + "input_cost_per_token_batches": 2e-7, + "output_cost_per_token_batches": 2e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "text-completion-openai", + "model": "ft:babbage-002", + "mode": "completion" + } + ] + }, + { + "id": "text-completion-openai/ft:davinci-002", + "provider": "text-completion-openai", + "model": "ft:davinci-002", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "text-completion-openai" + ], + "aliases": [ + "text-completion-openai/ft:davinci-002" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16384, + "inputTokens": 16384, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "text-completion-openai", + "model": "ft:davinci-002", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 12, + "output": 12 + }, + "extra": { + "input_cost_per_token_batches": 0.000001, + "output_cost_per_token_batches": 0.000001 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "text-completion-openai", + "model": "ft:davinci-002", + "mode": "completion" + } + ] + }, + { + "id": "the-grid-ai/agent-max", + "provider": "the-grid-ai", + "model": "agent-max", + "displayName": "Agent Max", + "sources": [ + "models.dev" + ], + "providers": [ + "the-grid-ai" + ], + "aliases": [ + "the-grid-ai/agent-max" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "metadata": { + "displayNames": [ + "Agent Max" + ], + "statuses": [ + "beta" + ], + "releaseDate": "2026-05-04", + "lastUpdated": "2026-05-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "the-grid-ai", + "providerName": "The Grid AI", + "providerApi": "https://api.thegrid.ai/v1", + "providerDoc": "https://thegrid.ai/docs", + "model": "agent-max", + "modelKey": "agent-max", + "displayName": "Agent Max", + "status": "beta", + "metadata": { + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-04" + } + } + ] + }, + { + "id": "the-grid-ai/agent-prime", + "provider": "the-grid-ai", + "model": "agent-prime", + "displayName": "Agent Prime", + "sources": [ + "models.dev" + ], + "providers": [ + "the-grid-ai" + ], + "aliases": [ + "the-grid-ai/agent-prime" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Agent Prime" + ], + "statuses": [ + "beta" + ], + "releaseDate": "2026-05-04", + "lastUpdated": "2026-05-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "the-grid-ai", + "providerName": "The Grid AI", + "providerApi": "https://api.thegrid.ai/v1", + "providerDoc": "https://thegrid.ai/docs", + "model": "agent-prime", + "modelKey": "agent-prime", + "displayName": "Agent Prime", + "status": "beta", + "metadata": { + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-04" + } + } + ] + }, + { + "id": "the-grid-ai/agent-standard", + "provider": "the-grid-ai", + "model": "agent-standard", + "displayName": "Agent Standard", + "sources": [ + "models.dev" + ], + "providers": [ + "the-grid-ai" + ], + "aliases": [ + "the-grid-ai/agent-standard" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Agent Standard" + ], + "statuses": [ + "beta" + ], + "releaseDate": "2026-05-04", + "lastUpdated": "2026-05-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "the-grid-ai", + "providerName": "The Grid AI", + "providerApi": "https://api.thegrid.ai/v1", + "providerDoc": "https://thegrid.ai/docs", + "model": "agent-standard", + "modelKey": "agent-standard", + "displayName": "Agent Standard", + "status": "beta", + "metadata": { + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-04" + } + } + ] + }, + { + "id": "the-grid-ai/code-max", + "provider": "the-grid-ai", + "model": "code-max", + "displayName": "Code Max", + "sources": [ + "models.dev" + ], + "providers": [ + "the-grid-ai" + ], + "aliases": [ + "the-grid-ai/code-max" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "metadata": { + "displayNames": [ + "Code Max" + ], + "statuses": [ + "beta" + ], + "releaseDate": "2026-05-04", + "lastUpdated": "2026-05-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "the-grid-ai", + "providerName": "The Grid AI", + "providerApi": "https://api.thegrid.ai/v1", + "providerDoc": "https://thegrid.ai/docs", + "model": "code-max", + "modelKey": "code-max", + "displayName": "Code Max", + "status": "beta", + "metadata": { + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-04" + } + } + ] + }, + { + "id": "the-grid-ai/code-prime", + "provider": "the-grid-ai", + "model": "code-prime", + "displayName": "Code Prime", + "sources": [ + "models.dev" + ], + "providers": [ + "the-grid-ai" + ], + "aliases": [ + "the-grid-ai/code-prime" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Code Prime" + ], + "statuses": [ + "beta" + ], + "releaseDate": "2026-05-04", + "lastUpdated": "2026-05-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "the-grid-ai", + "providerName": "The Grid AI", + "providerApi": "https://api.thegrid.ai/v1", + "providerDoc": "https://thegrid.ai/docs", + "model": "code-prime", + "modelKey": "code-prime", + "displayName": "Code Prime", + "status": "beta", + "metadata": { + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-04" + } + } + ] + }, + { + "id": "the-grid-ai/code-standard", + "provider": "the-grid-ai", + "model": "code-standard", + "displayName": "Code Standard", + "sources": [ + "models.dev" + ], + "providers": [ + "the-grid-ai" + ], + "aliases": [ + "the-grid-ai/code-standard" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Code Standard" + ], + "statuses": [ + "beta" + ], + "releaseDate": "2026-05-04", + "lastUpdated": "2026-05-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "the-grid-ai", + "providerName": "The Grid AI", + "providerApi": "https://api.thegrid.ai/v1", + "providerDoc": "https://thegrid.ai/docs", + "model": "code-standard", + "modelKey": "code-standard", + "displayName": "Code Standard", + "status": "beta", + "metadata": { + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-05-04" + } + } + ] + }, + { + "id": "the-grid-ai/text-max", + "provider": "the-grid-ai", + "model": "text-max", + "displayName": "Text Max", + "sources": [ + "models.dev" + ], + "providers": [ + "the-grid-ai" + ], + "aliases": [ + "the-grid-ai/text-max" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "metadata": { + "displayNames": [ + "Text Max" + ], + "releaseDate": "2026-03-24", + "lastUpdated": "2026-05-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "the-grid-ai", + "providerName": "The Grid AI", + "providerApi": "https://api.thegrid.ai/v1", + "providerDoc": "https://thegrid.ai/docs", + "model": "text-max", + "modelKey": "text-max", + "displayName": "Text Max", + "metadata": { + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-03-24" + } + } + ] + }, + { + "id": "the-grid-ai/text-prime", + "provider": "the-grid-ai", + "model": "text-prime", + "displayName": "Text Prime", + "sources": [ + "models.dev" + ], + "providers": [ + "the-grid-ai" + ], + "aliases": [ + "the-grid-ai/text-prime" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 30000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Text Prime" + ], + "releaseDate": "2026-02-26", + "lastUpdated": "2026-05-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "the-grid-ai", + "providerName": "The Grid AI", + "providerApi": "https://api.thegrid.ai/v1", + "providerDoc": "https://thegrid.ai/docs", + "model": "text-prime", + "modelKey": "text-prime", + "displayName": "Text Prime", + "metadata": { + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-02-26" + } + } + ] + }, + { + "id": "the-grid-ai/text-standard", + "provider": "the-grid-ai", + "model": "text-standard", + "displayName": "Text Standard", + "sources": [ + "models.dev" + ], + "providers": [ + "the-grid-ai" + ], + "aliases": [ + "the-grid-ai/text-standard" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Text Standard" + ], + "releaseDate": "2026-02-26", + "lastUpdated": "2026-05-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "the-grid-ai", + "providerName": "The Grid AI", + "providerApi": "https://api.thegrid.ai/v1", + "providerDoc": "https://thegrid.ai/docs", + "model": "text-standard", + "modelKey": "text-standard", + "displayName": "Text Standard", + "metadata": { + "lastUpdated": "2026-05-19", + "openWeights": false, + "releaseDate": "2026-02-26" + } + } + ] + }, + { + "id": "together-ai/bge-base-en-v1.5", + "provider": "together-ai", + "model": "bge-base-en-v1.5", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "together_ai" + ], + "aliases": [ + "together_ai/BAAI/bge-base-en-v1.5", + "together_ai/baai/bge-base-en-v1.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "outputVectorSize": 768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/baai/bge-base-en-v1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.008, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/BAAI/bge-base-en-v1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.008, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/baai/bge-base-en-v1.5", + "mode": "embedding" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/BAAI/bge-base-en-v1.5", + "mode": "embedding" + } + ] + }, + { + "id": "together-ai/together-ai-21.1b-41b", + "provider": "together-ai", + "model": "together-ai-21.1b-41b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "together_ai" + ], + "aliases": [ + "together_ai/together-ai-21.1b-41b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "together_ai", + "model": "together-ai-21.1b-41b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 0.8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together-ai-21.1b-41b", + "mode": "chat" + } + ] + }, + { + "id": "together-ai/together-ai-4.1b-8b", + "provider": "together-ai", + "model": "together-ai-4.1b-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "together_ai" + ], + "aliases": [ + "together_ai/together-ai-4.1b-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "together_ai", + "model": "together-ai-4.1b-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together-ai-4.1b-8b", + "mode": "chat" + } + ] + }, + { + "id": "together-ai/together-ai-41.1b-80b", + "provider": "together-ai", + "model": "together-ai-41.1b-80b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "together_ai" + ], + "aliases": [ + "together_ai/together-ai-41.1b-80b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "together_ai", + "model": "together-ai-41.1b-80b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 0.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together-ai-41.1b-80b", + "mode": "chat" + } + ] + }, + { + "id": "together-ai/together-ai-8.1b-21b", + "provider": "together-ai", + "model": "together-ai-8.1b-21b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "together_ai" + ], + "aliases": [ + "together_ai/together-ai-8.1b-21b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000, + "maxTokens": 1000, + "outputTokens": 1000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "together_ai", + "model": "together-ai-8.1b-21b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.3 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together-ai-8.1b-21b", + "mode": "chat" + } + ] + }, + { + "id": "together-ai/together-ai-81.1b-110b", + "provider": "together-ai", + "model": "together-ai-81.1b-110b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "together_ai" + ], + "aliases": [ + "together_ai/together-ai-81.1b-110b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "together_ai", + "model": "together-ai-81.1b-110b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.8, + "output": 1.8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together-ai-81.1b-110b", + "mode": "chat" + } + ] + }, + { + "id": "together-ai/together-ai-embedding-151m-to-350m", + "provider": "together-ai", + "model": "together-ai-embedding-151m-to-350m", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "together_ai" + ], + "aliases": [ + "together_ai/together-ai-embedding-151m-to-350m" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "together_ai", + "model": "together-ai-embedding-151m-to-350m", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.016, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together-ai-embedding-151m-to-350m", + "mode": "embedding" + } + ] + }, + { + "id": "together-ai/together-ai-embedding-up-to-150m", + "provider": "together-ai", + "model": "together-ai-embedding-up-to-150m", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "together_ai" + ], + "aliases": [ + "together_ai/together-ai-embedding-up-to-150m" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "together_ai", + "model": "together-ai-embedding-up-to-150m", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.008, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together-ai-embedding-up-to-150m", + "mode": "embedding" + } + ] + }, + { + "id": "together-ai/together-ai-up-to-4b", + "provider": "together-ai", + "model": "together-ai-up-to-4b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "together_ai" + ], + "aliases": [ + "together_ai/together-ai-up-to-4b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "together_ai", + "model": "together-ai-up-to-4b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together-ai-up-to-4b", + "mode": "chat" + } + ] + }, + { + "id": "togetherai/cogito-v2-1-671b", + "provider": "togetherai", + "model": "cogito-v2-1-671b", + "displayName": "Cogito v2.1 671B", + "family": "cogito", + "sources": [ + "models.dev" + ], + "providers": [ + "togetherai" + ], + "aliases": [ + "togetherai/deepcogito/cogito-v2-1-671b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 163840, + "outputTokens": 163840, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "togetherai", + "model": "deepcogito/cogito-v2-1-671b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 1.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Cogito v2.1 671B" + ], + "families": [ + "cogito" + ], + "releaseDate": "2025-11-13", + "lastUpdated": "2025-11-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "deepcogito/cogito-v2-1-671b", + "modelKey": "deepcogito/cogito-v2-1-671b", + "displayName": "Cogito v2.1 671B", + "family": "cogito", + "metadata": { + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2025-11-13", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "togetherai/gemma-4-31b-it", + "provider": "togetherai", + "model": "gemma-4-31b-it", + "displayName": "Pearl AI Gemma 4 31B Instruct", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "togetherai" + ], + "aliases": [ + "togetherai/pearl-ai/gemma-4-31b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "togetherai", + "model": "pearl-ai/gemma-4-31b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.28, + "output": 0.86 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Pearl AI Gemma 4 31B Instruct" + ], + "families": [ + "gemma" + ], + "releaseDate": "2026-04-07", + "lastUpdated": "2026-04-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "pearl-ai/gemma-4-31b-it", + "modelKey": "pearl-ai/gemma-4-31b-it", + "displayName": "Pearl AI Gemma 4 31B Instruct", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": false, + "releaseDate": "2026-04-07" + } + } + ] + }, + { + "id": "togetherai/lfm2-24b-a2b", + "provider": "togetherai", + "model": "lfm2-24b-a2b", + "displayName": "LFM2-24B-A2B", + "family": "liquid", + "sources": [ + "models.dev" + ], + "providers": [ + "togetherai" + ], + "aliases": [ + "togetherai/LiquidAI/LFM2-24B-A2B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "togetherai", + "model": "LiquidAI/LFM2-24B-A2B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.03, + "output": 0.12 + } + } + ] + }, + "metadata": { + "displayNames": [ + "LFM2-24B-A2B" + ], + "families": [ + "liquid" + ], + "releaseDate": "2026-02-25", + "lastUpdated": "2026-02-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "LiquidAI/LFM2-24B-A2B", + "modelKey": "LiquidAI/LFM2-24B-A2B", + "displayName": "LFM2-24B-A2B", + "family": "liquid", + "metadata": { + "lastUpdated": "2026-02-25", + "openWeights": true, + "releaseDate": "2026-02-25" + } + } + ] + }, + { + "id": "togetherai/nemotron-3-ultra-550b-a55b", + "provider": "togetherai", + "model": "nemotron-3-ultra-550b-a55b", + "displayName": "Nemotron 3 Ultra 550B A55B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "togetherai" + ], + "aliases": [ + "togetherai/nvidia/nemotron-3-ultra-550b-a55b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512300, + "outputTokens": 512300, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "togetherai", + "model": "nvidia/nemotron-3-ultra-550b-a55b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.6, + "output": 3.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron 3 Ultra 550B A55B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-06-04", + "lastUpdated": "2026-06-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "nvidia/nemotron-3-ultra-550b-a55b", + "modelKey": "nvidia/nemotron-3-ultra-550b-a55b", + "displayName": "Nemotron 3 Ultra 550B A55B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-06-04", + "openWeights": true, + "releaseDate": "2026-06-04", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "togetherai/rnj-1-instruct", + "provider": "togetherai", + "model": "rnj-1-instruct", + "displayName": "Rnj-1 Instruct", + "family": "rnj", + "sources": [ + "models.dev" + ], + "providers": [ + "togetherai" + ], + "aliases": [ + "togetherai/essentialai/Rnj-1-Instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "togetherai", + "model": "essentialai/Rnj-1-Instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Rnj-1 Instruct" + ], + "families": [ + "rnj" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-12-05", + "lastUpdated": "2025-12-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "essentialai/Rnj-1-Instruct", + "modelKey": "essentialai/Rnj-1-Instruct", + "displayName": "Rnj-1 Instruct", + "family": "rnj", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-12-05", + "openWeights": true, + "releaseDate": "2025-12-05" + } + } + ] + }, + { + "id": "umans-ai-coding-plan/umans-coder", + "provider": "umans-ai-coding-plan", + "model": "umans-coder", + "displayName": "Umans Coder", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "umans-ai-coding-plan" + ], + "aliases": [ + "umans-ai-coding-plan/umans-coder" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "umans-ai-coding-plan", + "model": "umans-coder", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Umans Coder" + ], + "families": [ + "kimi-k2" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-06-12", + "lastUpdated": "2026-06-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "umans-ai-coding-plan", + "providerName": "Umans AI Coding Plan", + "providerApi": "https://api.code.umans.ai/v1", + "providerDoc": "https://app.umans.ai/offers/code/docs", + "model": "umans-coder", + "modelKey": "umans-coder", + "displayName": "Umans Coder", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + } + ] + }, + { + "id": "umans-ai-coding-plan/umans-flash", + "provider": "umans-ai-coding-plan", + "model": "umans-flash", + "displayName": "Umans Flash", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "umans-ai-coding-plan" + ], + "aliases": [ + "umans-ai-coding-plan/umans-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "umans-ai-coding-plan", + "model": "umans-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Umans Flash" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-04-17", + "lastUpdated": "2026-04-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "umans-ai-coding-plan", + "providerName": "Umans AI Coding Plan", + "providerApi": "https://api.code.umans.ai/v1", + "providerDoc": "https://app.umans.ai/offers/code/docs", + "model": "umans-flash", + "modelKey": "umans-flash", + "displayName": "Umans Flash", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": true, + "releaseDate": "2026-04-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "umans-ai-coding-plan/umans-glm-5.1", + "provider": "umans-ai-coding-plan", + "model": "umans-glm-5.1", + "displayName": "GLM 5.1", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "umans-ai-coding-plan" + ], + "aliases": [ + "umans-ai-coding-plan/umans-glm-5.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "umans-ai-coding-plan", + "model": "umans-glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5.1" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-04-07", + "lastUpdated": "2026-04-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "umans-ai-coding-plan", + "providerName": "Umans AI Coding Plan", + "providerApi": "https://api.code.umans.ai/v1", + "providerDoc": "https://app.umans.ai/offers/code/docs", + "model": "umans-glm-5.1", + "modelKey": "umans-glm-5.1", + "displayName": "GLM 5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "umans-ai-coding-plan/umans-glm-5.2", + "provider": "umans-ai-coding-plan", + "model": "umans-glm-5.2", + "displayName": "GLM 5.2", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "umans-ai-coding-plan" + ], + "aliases": [ + "umans-ai-coding-plan/umans-glm-5.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 405504, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "umans-ai-coding-plan", + "model": "umans-glm-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5.2" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-06-13", + "lastUpdated": "2026-06-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "umans-ai-coding-plan", + "providerName": "Umans AI Coding Plan", + "providerApi": "https://api.code.umans.ai/v1", + "providerDoc": "https://app.umans.ai/offers/code/docs", + "model": "umans-glm-5.2", + "modelKey": "umans-glm-5.2", + "displayName": "GLM 5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-06-13", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "umans-ai-coding-plan/umans-kimi-k2.7", + "provider": "umans-ai-coding-plan", + "model": "umans-kimi-k2.7", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "umans-ai-coding-plan" + ], + "aliases": [ + "umans-ai-coding-plan/umans-kimi-k2.7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "umans-ai-coding-plan", + "model": "umans-kimi-k2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.7 Code" + ], + "families": [ + "kimi-k2" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-06-12", + "lastUpdated": "2026-06-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "umans-ai-coding-plan", + "providerName": "Umans AI Coding Plan", + "providerApi": "https://api.code.umans.ai/v1", + "providerDoc": "https://app.umans.ai/offers/code/docs", + "model": "umans-kimi-k2.7", + "modelKey": "umans-kimi-k2.7", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + } + ] + }, + { + "id": "umans-ai-coding-plan/umans-qwen3.6-35b-a3b", + "provider": "umans-ai-coding-plan", + "model": "umans-qwen3.6-35b-a3b", + "displayName": "Qwen3.6 35B A3B", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "umans-ai-coding-plan" + ], + "aliases": [ + "umans-ai-coding-plan/umans-qwen3.6-35b-a3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "umans-ai-coding-plan", + "model": "umans-qwen3.6-35b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Qwen3.6 35B A3B" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-04-17", + "lastUpdated": "2026-04-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "umans-ai-coding-plan", + "providerName": "Umans AI Coding Plan", + "providerApi": "https://api.code.umans.ai/v1", + "providerDoc": "https://app.umans.ai/offers/code/docs", + "model": "umans-qwen3.6-35b-a3b", + "modelKey": "umans-qwen3.6-35b-a3b", + "displayName": "Qwen3.6 35B A3B", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": true, + "releaseDate": "2026-04-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "umans-ai/umans-coder", + "provider": "umans-ai", + "model": "umans-coder", + "displayName": "Umans Coder", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "umans-ai" + ], + "aliases": [ + "umans-ai/umans-coder" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "umans-ai", + "model": "umans-coder", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.19, + "input": 0.95, + "output": 4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Umans Coder" + ], + "families": [ + "kimi-k2" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-06-12", + "lastUpdated": "2026-06-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "umans-ai", + "providerName": "Umans AI", + "providerApi": "https://api.code.umans.ai/v1", + "providerDoc": "https://app.umans.ai/offers/code/docs/orgs", + "model": "umans-coder", + "modelKey": "umans-coder", + "displayName": "Umans Coder", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + } + ] + }, + { + "id": "umans-ai/umans-flash", + "provider": "umans-ai", + "model": "umans-flash", + "displayName": "Umans Flash", + "family": "qwen", + "sources": [ + "models.dev" + ], + "providers": [ + "umans-ai" + ], + "aliases": [ + "umans-ai/umans-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "umans-ai", + "model": "umans-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.15, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Umans Flash" + ], + "families": [ + "qwen" + ], + "releaseDate": "2026-04-17", + "lastUpdated": "2026-04-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "umans-ai", + "providerName": "Umans AI", + "providerApi": "https://api.code.umans.ai/v1", + "providerDoc": "https://app.umans.ai/offers/code/docs/orgs", + "model": "umans-flash", + "modelKey": "umans-flash", + "displayName": "Umans Flash", + "family": "qwen", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": true, + "releaseDate": "2026-04-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "umans-ai/umans-glm-5.1", + "provider": "umans-ai", + "model": "umans-glm-5.1", + "displayName": "GLM 5.1", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "umans-ai" + ], + "aliases": [ + "umans-ai/umans-glm-5.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "umans-ai", + "model": "umans-glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.29, + "input": 1.4, + "output": 4.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5.1" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-04-07", + "lastUpdated": "2026-04-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "umans-ai", + "providerName": "Umans AI", + "providerApi": "https://api.code.umans.ai/v1", + "providerDoc": "https://app.umans.ai/offers/code/docs/orgs", + "model": "umans-glm-5.1", + "modelKey": "umans-glm-5.1", + "displayName": "GLM 5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "umans-ai/umans-glm-5.2", + "provider": "umans-ai", + "model": "umans-glm-5.2", + "displayName": "GLM 5.2", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "umans-ai" + ], + "aliases": [ + "umans-ai/umans-glm-5.2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 405504, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "umans-ai", + "model": "umans-glm-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "input": 1.4, + "output": 4.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5.2" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-06-13", + "lastUpdated": "2026-06-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "umans-ai", + "providerName": "Umans AI", + "providerApi": "https://api.code.umans.ai/v1", + "providerDoc": "https://app.umans.ai/offers/code/docs/orgs", + "model": "umans-glm-5.2", + "modelKey": "umans-glm-5.2", + "displayName": "GLM 5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-06-13", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "umans-ai/umans-kimi-k2.7", + "provider": "umans-ai", + "model": "umans-kimi-k2.7", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "sources": [ + "models.dev" + ], + "providers": [ + "umans-ai" + ], + "aliases": [ + "umans-ai/umans-kimi-k2.7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "umans-ai", + "model": "umans-kimi-k2.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.19, + "input": 0.95, + "output": 4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kimi K2.7 Code" + ], + "families": [ + "kimi-k2" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-06-12", + "lastUpdated": "2026-06-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "umans-ai", + "providerName": "Umans AI", + "providerApi": "https://api.code.umans.ai/v1", + "providerDoc": "https://app.umans.ai/offers/code/docs/orgs", + "model": "umans-kimi-k2.7", + "modelKey": "umans-kimi-k2.7", + "displayName": "Kimi K2.7 Code", + "family": "kimi-k2", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-06-12", + "openWeights": true, + "releaseDate": "2026-06-12" + } + } + ] + }, + { + "id": "upstage/solar-mini", + "provider": "upstage", + "model": "solar-mini", + "displayName": "solar-mini", + "family": "solar-mini", + "sources": [ + "models.dev" + ], + "providers": [ + "upstage" + ], + "aliases": [ + "upstage/solar-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "upstage", + "model": "solar-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "solar-mini" + ], + "families": [ + "solar-mini" + ], + "knowledgeCutoff": "2024-09", + "releaseDate": "2024-06-12", + "lastUpdated": "2025-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "upstage", + "providerName": "Upstage", + "providerApi": "https://api.upstage.ai/v1/solar", + "providerDoc": "https://developers.upstage.ai/docs/apis/chat", + "model": "solar-mini", + "modelKey": "solar-mini", + "displayName": "solar-mini", + "family": "solar-mini", + "metadata": { + "knowledgeCutoff": "2024-09", + "lastUpdated": "2025-04-22", + "openWeights": false, + "releaseDate": "2024-06-12" + } + } + ] + }, + { + "id": "upstage/solar-pro2", + "provider": "upstage", + "model": "solar-pro2", + "displayName": "solar-pro2", + "family": "solar-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "upstage" + ], + "aliases": [ + "upstage/solar-pro2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "upstage", + "model": "solar-pro2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 0.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "solar-pro2" + ], + "families": [ + "solar-pro" + ], + "knowledgeCutoff": "2025-03", + "releaseDate": "2025-05-20", + "lastUpdated": "2025-05-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "upstage", + "providerName": "Upstage", + "providerApi": "https://api.upstage.ai/v1/solar", + "providerDoc": "https://developers.upstage.ai/docs/apis/chat", + "model": "solar-pro2", + "modelKey": "solar-pro2", + "displayName": "solar-pro2", + "family": "solar-pro", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2025-05-20", + "openWeights": false, + "releaseDate": "2025-05-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "upstage/solar-pro3", + "provider": "upstage", + "model": "solar-pro3", + "displayName": "solar-pro3", + "family": "solar-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "upstage" + ], + "aliases": [ + "upstage/solar-pro3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "upstage", + "model": "solar-pro3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 0.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "solar-pro3" + ], + "families": [ + "solar-pro" + ], + "knowledgeCutoff": "2025-03", + "releaseDate": "2026-01", + "lastUpdated": "2026-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "upstage", + "providerName": "Upstage", + "providerApi": "https://api.upstage.ai/v1/solar", + "providerDoc": "https://developers.upstage.ai/docs/apis/chat", + "model": "solar-pro3", + "modelKey": "solar-pro3", + "displayName": "solar-pro3", + "family": "solar-pro", + "metadata": { + "knowledgeCutoff": "2025-03", + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "v0/v0-1.0-md", + "provider": "v0", + "model": "v0-1.0-md", + "displayName": "v0-1.0-md", + "family": "v0", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "v0" + ], + "aliases": [ + "v0/v0-1.0-md" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "v0", + "model": "v0-1.0-md", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "v0", + "model": "v0/v0-1.0-md", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "v0-1.0-md" + ], + "families": [ + "v0" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-05-22", + "lastUpdated": "2025-05-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "v0", + "providerName": "v0", + "providerDoc": "https://sdk.vercel.ai/providers/ai-sdk-providers/vercel", + "model": "v0-1.0-md", + "modelKey": "v0-1.0-md", + "displayName": "v0-1.0-md", + "family": "v0", + "metadata": { + "lastUpdated": "2025-05-22", + "openWeights": false, + "releaseDate": "2025-05-22" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "v0", + "model": "v0/v0-1.0-md", + "mode": "chat" + } + ] + }, + { + "id": "v0/v0-1.5-lg", + "provider": "v0", + "model": "v0-1.5-lg", + "displayName": "v0-1.5-lg", + "family": "v0", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "v0" + ], + "aliases": [ + "v0/v0-1.5-lg" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512000, + "inputTokens": 512000, + "maxTokens": 512000, + "outputTokens": 512000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "v0", + "model": "v0-1.5-lg", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 15, + "output": 75 + } + }, + { + "source": "litellm", + "provider": "v0", + "model": "v0/v0-1.5-lg", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 15, + "output": 75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "v0-1.5-lg" + ], + "families": [ + "v0" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-06-09", + "lastUpdated": "2025-06-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "v0", + "providerName": "v0", + "providerDoc": "https://sdk.vercel.ai/providers/ai-sdk-providers/vercel", + "model": "v0-1.5-lg", + "modelKey": "v0-1.5-lg", + "displayName": "v0-1.5-lg", + "family": "v0", + "metadata": { + "lastUpdated": "2025-06-09", + "openWeights": false, + "releaseDate": "2025-06-09" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "v0", + "model": "v0/v0-1.5-lg", + "mode": "chat" + } + ] + }, + { + "id": "v0/v0-1.5-md", + "provider": "v0", + "model": "v0-1.5-md", + "displayName": "v0-1.5-md", + "family": "v0", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "v0" + ], + "aliases": [ + "v0/v0-1.5-md" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "parallelFunctionCalling": true, + "rerank": false, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "v0", + "model": "v0-1.5-md", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "v0", + "model": "v0/v0-1.5-md", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "v0-1.5-md" + ], + "families": [ + "v0" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-06-09", + "lastUpdated": "2025-06-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "v0", + "providerName": "v0", + "providerDoc": "https://sdk.vercel.ai/providers/ai-sdk-providers/vercel", + "model": "v0-1.5-md", + "modelKey": "v0-1.5-md", + "displayName": "v0-1.5-md", + "family": "v0", + "metadata": { + "lastUpdated": "2025-06-09", + "openWeights": false, + "releaseDate": "2025-06-09" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "v0", + "model": "v0/v0-1.5-md", + "mode": "chat" + } + ] + }, + { + "id": "venice/aion-labs-aion-2-0", + "provider": "venice", + "model": "aion-labs-aion-2-0", + "displayName": "Aion 2.0", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/aion-labs-aion-2-0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "aion-labs-aion-2-0", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.25, + "input": 1, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Aion 2.0" + ], + "releaseDate": "2026-03-24", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "aion-labs-aion-2-0", + "modelKey": "aion-labs-aion-2-0", + "displayName": "Aion 2.0", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-03-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/arcee-trinity-large-thinking", + "provider": "venice", + "model": "arcee-trinity-large-thinking", + "displayName": "Trinity Large Thinking", + "family": "trinity", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/arcee-trinity-large-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "arcee-trinity-large-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3125, + "output": 1.125 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Trinity Large Thinking" + ], + "families": [ + "trinity" + ], + "releaseDate": "2026-04-02", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "arcee-trinity-large-thinking", + "modelKey": "arcee-trinity-large-thinking", + "displayName": "Trinity Large Thinking", + "family": "trinity", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/gemma-4-uncensored", + "provider": "venice", + "model": "gemma-4-uncensored", + "displayName": "Gemma 4 Uncensored", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/gemma-4-uncensored" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "gemma-4-uncensored", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1625, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Gemma 4 Uncensored" + ], + "families": [ + "gemma" + ], + "releaseDate": "2026-04-13", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "gemma-4-uncensored", + "modelKey": "gemma-4-uncensored", + "displayName": "Gemma 4 Uncensored", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-04-13" + } + } + ] + }, + { + "id": "venice/google-gemma-3-27b-it", + "provider": "venice", + "model": "google-gemma-3-27b-it", + "displayName": "Google Gemma 3 27B Instruct", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/google-gemma-3-27b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 198000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "google-gemma-3-27b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Google Gemma 3 27B Instruct" + ], + "families": [ + "gemma" + ], + "releaseDate": "2025-11-04", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "google-gemma-3-27b-it", + "modelKey": "google-gemma-3-27b-it", + "displayName": "Google Gemma 3 27B Instruct", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2025-11-04" + } + } + ] + }, + { + "id": "venice/google-gemma-4-26b-a4b-it", + "provider": "venice", + "model": "google-gemma-4-26b-a4b-it", + "displayName": "Google Gemma 4 26B A4B Instruct", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/google-gemma-4-26b-a4b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "google-gemma-4-26b-a4b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1625, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Google Gemma 4 26B A4B Instruct" + ], + "families": [ + "gemma" + ], + "releaseDate": "2026-04-02", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "google-gemma-4-26b-a4b-it", + "modelKey": "google-gemma-4-26b-a4b-it", + "displayName": "Google Gemma 4 26B A4B Instruct", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-04-02", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/google-gemma-4-31b-it", + "provider": "venice", + "model": "google-gemma-4-31b-it", + "displayName": "Google Gemma 4 31B Instruct", + "family": "gemma", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/google-gemma-4-31b-it" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "google-gemma-4-31b-it", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.09, + "input": 0.12, + "output": 0.36 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Google Gemma 4 31B Instruct" + ], + "families": [ + "gemma" + ], + "releaseDate": "2026-04-03", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "google-gemma-4-31b-it", + "modelKey": "google-gemma-4-31b-it", + "displayName": "Google Gemma 4 31B Instruct", + "family": "gemma", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-04-03", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/hermes-3-llama-3.1-405b", + "provider": "venice", + "model": "hermes-3-llama-3.1-405b", + "displayName": "Hermes 3 Llama 3.1 405b", + "family": "hermes", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/hermes-3-llama-3.1-405b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "hermes-3-llama-3.1-405b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.1, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hermes 3 Llama 3.1 405b" + ], + "families": [ + "hermes" + ], + "releaseDate": "2025-09-25", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "hermes-3-llama-3.1-405b", + "modelKey": "hermes-3-llama-3.1-405b", + "displayName": "Hermes 3 Llama 3.1 405b", + "family": "hermes", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2025-09-25" + } + } + ] + }, + { + "id": "venice/mercury-2", + "provider": "venice", + "model": "mercury-2", + "displayName": "Mercury 2", + "family": "mercury", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/mercury-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 50000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "mercury-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03125, + "input": 0.3125, + "output": 0.9375 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mercury 2" + ], + "families": [ + "mercury" + ], + "releaseDate": "2026-02-20", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "mercury-2", + "modelKey": "mercury-2", + "displayName": "Mercury 2", + "family": "mercury", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-02-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/nvidia-nemotron-3-nano-30b-a3b", + "provider": "venice", + "model": "nvidia-nemotron-3-nano-30b-a3b", + "displayName": "NVIDIA Nemotron 3 Nano 30B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/nvidia-nemotron-3-nano-30b-a3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "nvidia-nemotron-3-nano-30b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.075, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA Nemotron 3 Nano 30B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-01-27", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "nvidia-nemotron-3-nano-30b-a3b", + "modelKey": "nvidia-nemotron-3-nano-30b-a3b", + "displayName": "NVIDIA Nemotron 3 Nano 30B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-01-27" + } + } + ] + }, + { + "id": "venice/nvidia-nemotron-3-ultra-550b-a55b", + "provider": "venice", + "model": "nvidia-nemotron-3-ultra-550b-a55b", + "displayName": "NVIDIA Nemotron 3 Ultra", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/nvidia-nemotron-3-ultra-550b-a55b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "nvidia-nemotron-3-ultra-550b-a55b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1875, + "input": 0.625, + "output": 3.125 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA Nemotron 3 Ultra" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-06-04", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "nvidia-nemotron-3-ultra-550b-a55b", + "modelKey": "nvidia-nemotron-3-ultra-550b-a55b", + "displayName": "NVIDIA Nemotron 3 Ultra", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-06-04", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/nvidia-nemotron-cascade-2-30b-a3b", + "provider": "venice", + "model": "nvidia-nemotron-cascade-2-30b-a3b", + "displayName": "Nemotron Cascade 2 30B A3B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/nvidia-nemotron-cascade-2-30b-a3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "nvidia-nemotron-cascade-2-30b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron Cascade 2 30B A3B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-03-24", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "nvidia-nemotron-cascade-2-30b-a3b", + "modelKey": "nvidia-nemotron-cascade-2-30b-a3b", + "displayName": "Nemotron Cascade 2 30B A3B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-03-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/olafangensan-glm-4.7-flash-heretic", + "provider": "venice", + "model": "olafangensan-glm-4.7-flash-heretic", + "displayName": "GLM 4.7 Flash Heretic", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/olafangensan-glm-4.7-flash-heretic" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 24000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "olafangensan-glm-4.7-flash-heretic", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.7 Flash Heretic" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-02-04", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "olafangensan-glm-4.7-flash-heretic", + "modelKey": "olafangensan-glm-4.7-flash-heretic", + "displayName": "GLM 4.7 Flash Heretic", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-02-04", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/openai-gpt-4o-2024-11-20", + "provider": "venice", + "model": "openai-gpt-4o-2024-11-20", + "displayName": "GPT-4o", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/openai-gpt-4o-2024-11-20" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "openai-gpt-4o-2024-11-20", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3.125, + "output": 12.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4o" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2023-09", + "releaseDate": "2026-02-28", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "openai-gpt-4o-2024-11-20", + "modelKey": "openai-gpt-4o-2024-11-20", + "displayName": "GPT-4o", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-02-28" + } + } + ] + }, + { + "id": "venice/openai-gpt-4o-mini-2024-07-18", + "provider": "venice", + "model": "openai-gpt-4o-mini-2024-07-18", + "displayName": "GPT-4o Mini", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/openai-gpt-4o-mini-2024-07-18" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "openai-gpt-4o-mini-2024-07-18", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.09375, + "input": 0.1875, + "output": 0.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-4o Mini" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2023-09", + "releaseDate": "2026-02-28", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "openai-gpt-4o-mini-2024-07-18", + "modelKey": "openai-gpt-4o-mini-2024-07-18", + "displayName": "GPT-4o Mini", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2023-09", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-02-28" + } + } + ] + }, + { + "id": "venice/openai-gpt-52", + "provider": "venice", + "model": "openai-gpt-52", + "displayName": "GPT-5.2", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/openai-gpt-52" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 272000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "openai-gpt-52", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.219, + "input": 2.19, + "output": 17.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.2" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2025-12-13", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "openai-gpt-52", + "modelKey": "openai-gpt-52", + "displayName": "GPT-5.2", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2025-12-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/openai-gpt-52-codex", + "provider": "venice", + "model": "openai-gpt-52-codex", + "displayName": "GPT-5.2 Codex", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/openai-gpt-52-codex" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 272000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "openai-gpt-52-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.219, + "input": 2.19, + "output": 17.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.2 Codex" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08", + "releaseDate": "2025-01-15", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "openai-gpt-52-codex", + "modelKey": "openai-gpt-52-codex", + "displayName": "GPT-5.2 Codex", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2025-01-15", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/openai-gpt-53-codex", + "provider": "venice", + "model": "openai-gpt-53-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/openai-gpt-53-codex" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "openai-gpt-53-codex", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.219, + "input": 2.19, + "output": 17.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.3 Codex" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-02-24", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "openai-gpt-53-codex", + "modelKey": "openai-gpt-53-codex", + "displayName": "GPT-5.3 Codex", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-02-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/openai-gpt-54", + "provider": "venice", + "model": "openai-gpt-54", + "displayName": "GPT-5.4", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/openai-gpt-54" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 922000, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "openai-gpt-54", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.313, + "input": 3.13, + "output": 18.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.4" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-05", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "openai-gpt-54", + "modelKey": "openai-gpt-54", + "displayName": "GPT-5.4", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/openai-gpt-54-mini", + "provider": "venice", + "model": "openai-gpt-54-mini", + "displayName": "GPT-5.4 Mini", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/openai-gpt-54-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 400000, + "inputTokens": 272000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "openai-gpt-54-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.09375, + "input": 0.9375, + "output": 5.625 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.4 Mini" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-27", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "openai-gpt-54-mini", + "modelKey": "openai-gpt-54-mini", + "displayName": "GPT-5.4 Mini", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-03-27", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/openai-gpt-54-pro", + "provider": "venice", + "model": "openai-gpt-54-pro", + "displayName": "GPT-5.4 Pro", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/openai-gpt-54-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 922000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "openai-gpt-54-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 37.5, + "output": 225 + }, + "tiered": { + "contextOver200K": { + "input": 75, + "output": 337.5 + }, + "tiers": [ + { + "input": 75, + "output": 337.5, + "tier": { + "size": 272000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.4 Pro" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-05", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "openai-gpt-54-pro", + "modelKey": "openai-gpt-54-pro", + "displayName": "GPT-5.4 Pro", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-03-05", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/openai-gpt-55", + "provider": "venice", + "model": "openai-gpt-55", + "displayName": "GPT-5.5", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/openai-gpt-55" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 922000, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "openai-gpt-55", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.625, + "input": 6.25, + "output": 37.5 + }, + "tiered": { + "contextOver200K": { + "input": 12.5, + "output": 56.25, + "cache_read": 1.25 + }, + "tiers": [ + { + "input": 12.5, + "output": 56.25, + "cache_read": 1.25, + "tier": { + "size": 272000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.5" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-12-01", + "releaseDate": "2026-04-23", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "openai-gpt-55", + "modelKey": "openai-gpt-55", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-04-23", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/openai-gpt-55-pro", + "provider": "venice", + "model": "openai-gpt-55-pro", + "displayName": "GPT-5.5 Pro", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/openai-gpt-55-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 922000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "openai-gpt-55-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 37.5, + "output": 225 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.5 Pro" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-12-01", + "releaseDate": "2026-04-24", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "openai-gpt-55-pro", + "modelKey": "openai-gpt-55-pro", + "displayName": "GPT-5.5 Pro", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-01", + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-04-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/openai-gpt-oss-120b", + "provider": "venice", + "model": "openai-gpt-oss-120b", + "displayName": "OpenAI GPT OSS 120B", + "family": "gpt-oss", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/openai-gpt-oss-120b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "openai-gpt-oss-120b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "OpenAI GPT OSS 120B" + ], + "families": [ + "gpt-oss" + ], + "releaseDate": "2025-11-06", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "openai-gpt-oss-120b", + "modelKey": "openai-gpt-oss-120b", + "displayName": "OpenAI GPT OSS 120B", + "family": "gpt-oss", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2025-11-06", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/venice-uncensored-1-2", + "provider": "venice", + "model": "venice-uncensored-1-2", + "displayName": "Venice Uncensored 1.2", + "family": "venice", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/venice-uncensored-1-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "venice-uncensored-1-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Venice Uncensored 1.2" + ], + "families": [ + "venice" + ], + "releaseDate": "2026-04-01", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "venice-uncensored-1-2", + "modelKey": "venice-uncensored-1-2", + "displayName": "Venice Uncensored 1.2", + "family": "venice", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-04-01" + } + } + ] + }, + { + "id": "venice/venice-uncensored-role-play", + "provider": "venice", + "model": "venice-uncensored-role-play", + "displayName": "Venice Role Play Uncensored", + "family": "venice", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/venice-uncensored-role-play" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "venice-uncensored-role-play", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Venice Role Play Uncensored" + ], + "families": [ + "venice" + ], + "releaseDate": "2026-02-20", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "venice-uncensored-role-play", + "modelKey": "venice-uncensored-role-play", + "displayName": "Venice Role Play Uncensored", + "family": "venice", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-02-20" + } + } + ] + }, + { + "id": "venice/xiaomi-mimo-v2-5", + "provider": "venice", + "model": "xiaomi-mimo-v2-5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/xiaomi-mimo-v2-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 65536, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "xiaomi-mimo-v2-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0625, + "input": 0.175, + "output": 0.35 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-06-11", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "xiaomi-mimo-v2-5", + "modelKey": "xiaomi-mimo-v2-5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-06-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/z-ai-glm-5-turbo", + "provider": "venice", + "model": "z-ai-glm-5-turbo", + "displayName": "GLM 5 Turbo", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/z-ai-glm-5-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "z-ai-glm-5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "input": 1.2, + "output": 4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5 Turbo" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-03-15", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "z-ai-glm-5-turbo", + "modelKey": "z-ai-glm-5-turbo", + "displayName": "GLM 5 Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-03-15", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/z-ai-glm-5v-turbo", + "provider": "venice", + "model": "z-ai-glm-5v-turbo", + "displayName": "GLM 5V Turbo", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/z-ai-glm-5v-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "z-ai-glm-5v-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "input": 1.5, + "output": 5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5V Turbo" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-04-01", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "z-ai-glm-5v-turbo", + "modelKey": "z-ai-glm-5v-turbo", + "displayName": "GLM 5V Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-04-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/zai-org-glm-4.6", + "provider": "venice", + "model": "zai-org-glm-4.6", + "displayName": "GLM 4.6", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/zai-org-glm-4.6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 198000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "zai-org-glm-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "input": 0.85, + "output": 2.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.6" + ], + "families": [ + "glm" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2024-04-01", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "zai-org-glm-4.6", + "modelKey": "zai-org-glm-4.6", + "displayName": "GLM 4.6", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2024-04-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/zai-org-glm-4.7", + "provider": "venice", + "model": "zai-org-glm-4.7", + "displayName": "GLM 4.7", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/zai-org-glm-4.7" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 198000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "zai-org-glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.55, + "output": 2.65 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.7" + ], + "families": [ + "glm" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-12-24", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "zai-org-glm-4.7", + "modelKey": "zai-org-glm-4.7", + "displayName": "GLM 4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2025-12-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/zai-org-glm-4.7-flash", + "provider": "venice", + "model": "zai-org-glm-4.7-flash", + "displayName": "GLM 4.7 Flash", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/zai-org-glm-4.7-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "zai-org-glm-4.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.125, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.7 Flash" + ], + "families": [ + "glm" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-01-29", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "zai-org-glm-4.7-flash", + "modelKey": "zai-org-glm-4.7-flash", + "displayName": "GLM 4.7 Flash", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-01-29", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/zai-org-glm-5", + "provider": "venice", + "model": "zai-org-glm-5", + "displayName": "GLM 5", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/zai-org-glm-5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 198000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "zai-org-glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-02-11", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "zai-org-glm-5", + "modelKey": "zai-org-glm-5", + "displayName": "GLM 5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-02-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/zai-org-glm-5-1", + "provider": "venice", + "model": "zai-org-glm-5-1", + "displayName": "GLM 5.1", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/zai-org-glm-5-1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 24000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "zai-org-glm-5-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.325, + "input": 1.75, + "output": 5.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5.1" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-04-07", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "zai-org-glm-5-1", + "modelKey": "zai-org-glm-5-1", + "displayName": "GLM 5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": true, + "releaseDate": "2026-04-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "venice/zai-org-glm-5-2", + "provider": "venice", + "model": "zai-org-glm-5-2", + "displayName": "GLM 5.2", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/zai-org-glm-5-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "zai-org-glm-5-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "input": 1.4, + "output": 4.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5.2" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-06-16", + "lastUpdated": "2026-06-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "zai-org-glm-5-2", + "modelKey": "zai-org-glm-5-2", + "displayName": "GLM 5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-16", + "openWeights": true, + "releaseDate": "2026-06-16" + } + } + ] + }, + { + "id": "vercel-ai-gateway/mercury-coder-small", + "provider": "vercel-ai-gateway", + "model": "mercury-coder-small", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vercel_ai_gateway" + ], + "aliases": [ + "vercel_ai_gateway/inception/mercury-coder-small" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/inception/mercury-coder-small", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/inception/mercury-coder-small", + "mode": "chat" + } + ] + }, + { + "id": "vercel-ai-gateway/morph-v3-fast", + "provider": "vercel-ai-gateway", + "model": "morph-v3-fast", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vercel_ai_gateway" + ], + "aliases": [ + "vercel_ai_gateway/morph/morph-v3-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/morph/morph-v3-fast", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/morph/morph-v3-fast", + "mode": "chat" + } + ] + }, + { + "id": "vercel-ai-gateway/morph-v3-large", + "provider": "vercel-ai-gateway", + "model": "morph-v3-large", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vercel_ai_gateway" + ], + "aliases": [ + "vercel_ai_gateway/morph/morph-v3-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 16384, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/morph/morph-v3-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.9, + "output": 1.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/morph/morph-v3-large", + "mode": "chat" + } + ] + }, + { + "id": "vercel-ai-gateway/v0-1.0-md", + "provider": "vercel-ai-gateway", + "model": "v0-1.0-md", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vercel_ai_gateway" + ], + "aliases": [ + "vercel_ai_gateway/vercel/v0-1.0-md" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/vercel/v0-1.0-md", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/vercel/v0-1.0-md", + "mode": "chat" + } + ] + }, + { + "id": "vercel-ai-gateway/v0-1.5-md", + "provider": "vercel-ai-gateway", + "model": "v0-1.5-md", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vercel_ai_gateway" + ], + "aliases": [ + "vercel_ai_gateway/vercel/v0-1.5-md" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/vercel/v0-1.5-md", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/vercel/v0-1.5-md", + "mode": "chat" + } + ] + }, + { + "id": "vercel/flux-2-flex", + "provider": "vercel", + "model": "flux-2-flex", + "displayName": "FLUX.2 [flex]", + "family": "flux", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bfl/flux-2-flex" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "FLUX.2 [flex]" + ], + "families": [ + "flux" + ], + "releaseDate": "2026-06-08", + "lastUpdated": "2026-06-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bfl/flux-2-flex", + "modelKey": "bfl/flux-2-flex", + "displayName": "FLUX.2 [flex]", + "family": "flux", + "metadata": { + "lastUpdated": "2026-06-08", + "openWeights": false, + "releaseDate": "2026-06-08" + } + } + ] + }, + { + "id": "vercel/flux-2-klein-4b", + "provider": "vercel", + "model": "flux-2-klein-4b", + "displayName": "FLUX.2 [klein] 4B", + "family": "flux", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bfl/flux-2-klein-4b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "FLUX.2 [klein] 4B" + ], + "families": [ + "flux" + ], + "releaseDate": "2026-06-08", + "lastUpdated": "2026-06-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bfl/flux-2-klein-4b", + "modelKey": "bfl/flux-2-klein-4b", + "displayName": "FLUX.2 [klein] 4B", + "family": "flux", + "metadata": { + "lastUpdated": "2026-06-08", + "openWeights": false, + "releaseDate": "2026-06-08" + } + } + ] + }, + { + "id": "vercel/flux-2-klein-9b", + "provider": "vercel", + "model": "flux-2-klein-9b", + "displayName": "FLUX.2 [klein] 9B", + "family": "flux", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bfl/flux-2-klein-9b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "FLUX.2 [klein] 9B" + ], + "families": [ + "flux" + ], + "releaseDate": "2026-06-08", + "lastUpdated": "2026-06-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bfl/flux-2-klein-9b", + "modelKey": "bfl/flux-2-klein-9b", + "displayName": "FLUX.2 [klein] 9B", + "family": "flux", + "metadata": { + "lastUpdated": "2026-06-08", + "openWeights": false, + "releaseDate": "2026-06-08" + } + } + ] + }, + { + "id": "vercel/flux-2-max", + "provider": "vercel", + "model": "flux-2-max", + "displayName": "FLUX.2 [max]", + "family": "flux", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bfl/flux-2-max" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 67300, + "outputTokens": 67300, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "FLUX.2 [max]" + ], + "families": [ + "flux" + ], + "releaseDate": "2026-06-08", + "lastUpdated": "2026-06-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bfl/flux-2-max", + "modelKey": "bfl/flux-2-max", + "displayName": "FLUX.2 [max]", + "family": "flux", + "metadata": { + "lastUpdated": "2026-06-08", + "openWeights": false, + "releaseDate": "2026-06-08" + } + } + ] + }, + { + "id": "vercel/flux-2-pro", + "provider": "vercel", + "model": "flux-2-pro", + "displayName": "FLUX.2 [pro]", + "family": "flux", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bfl/flux-2-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 67300, + "outputTokens": 67300, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "FLUX.2 [pro]" + ], + "families": [ + "flux" + ], + "releaseDate": "2026-06-08", + "lastUpdated": "2026-06-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bfl/flux-2-pro", + "modelKey": "bfl/flux-2-pro", + "displayName": "FLUX.2 [pro]", + "family": "flux", + "metadata": { + "lastUpdated": "2026-06-08", + "openWeights": false, + "releaseDate": "2026-06-08" + } + } + ] + }, + { + "id": "vercel/flux-fast-schnell", + "provider": "vercel", + "model": "flux-fast-schnell", + "displayName": "Flux Schnell", + "family": "flux", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/prodia/flux-fast-schnell" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Flux Schnell" + ], + "families": [ + "flux" + ], + "releaseDate": "2026-06-08", + "lastUpdated": "2026-06-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "prodia/flux-fast-schnell", + "modelKey": "prodia/flux-fast-schnell", + "displayName": "Flux Schnell", + "family": "flux", + "metadata": { + "lastUpdated": "2026-06-08", + "openWeights": false, + "releaseDate": "2026-06-08" + } + } + ] + }, + { + "id": "vercel/flux-kontext-max", + "provider": "vercel", + "model": "flux-kontext-max", + "displayName": "FLUX.1 Kontext Max", + "family": "flux", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bfl/flux-kontext-max" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "FLUX.1 Kontext Max" + ], + "families": [ + "flux" + ], + "releaseDate": "2025-06-01", + "lastUpdated": "2025-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bfl/flux-kontext-max", + "modelKey": "bfl/flux-kontext-max", + "displayName": "FLUX.1 Kontext Max", + "family": "flux", + "metadata": { + "lastUpdated": "2025-06", + "openWeights": false, + "releaseDate": "2025-06-01" + } + } + ] + }, + { + "id": "vercel/flux-kontext-pro", + "provider": "vercel", + "model": "flux-kontext-pro", + "displayName": "FLUX.1 Kontext Pro", + "family": "flux", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bfl/flux-kontext-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "FLUX.1 Kontext Pro" + ], + "families": [ + "flux" + ], + "releaseDate": "2025-06-01", + "lastUpdated": "2025-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bfl/flux-kontext-pro", + "modelKey": "bfl/flux-kontext-pro", + "displayName": "FLUX.1 Kontext Pro", + "family": "flux", + "metadata": { + "lastUpdated": "2025-06", + "openWeights": false, + "releaseDate": "2025-06-01" + } + } + ] + }, + { + "id": "vercel/flux-pro-1.0-fill", + "provider": "vercel", + "model": "flux-pro-1.0-fill", + "displayName": "FLUX.1 Fill [pro]", + "family": "flux", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bfl/flux-pro-1.0-fill" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "FLUX.1 Fill [pro]" + ], + "families": [ + "flux" + ], + "releaseDate": "2024-10-01", + "lastUpdated": "2024-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bfl/flux-pro-1.0-fill", + "modelKey": "bfl/flux-pro-1.0-fill", + "displayName": "FLUX.1 Fill [pro]", + "family": "flux", + "metadata": { + "lastUpdated": "2024-10", + "openWeights": false, + "releaseDate": "2024-10-01" + } + } + ] + }, + { + "id": "vercel/flux-pro-1.1", + "provider": "vercel", + "model": "flux-pro-1.1", + "displayName": "FLUX1.1 [pro]", + "family": "flux", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bfl/flux-pro-1.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "FLUX1.1 [pro]" + ], + "families": [ + "flux" + ], + "releaseDate": "2024-10-01", + "lastUpdated": "2024-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bfl/flux-pro-1.1", + "modelKey": "bfl/flux-pro-1.1", + "displayName": "FLUX1.1 [pro]", + "family": "flux", + "metadata": { + "lastUpdated": "2024-10", + "openWeights": false, + "releaseDate": "2024-10-01" + } + } + ] + }, + { + "id": "vercel/flux-pro-1.1-ultra", + "provider": "vercel", + "model": "flux-pro-1.1-ultra", + "displayName": "FLUX1.1 [pro] Ultra", + "family": "flux", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bfl/flux-pro-1.1-ultra" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "FLUX1.1 [pro] Ultra" + ], + "families": [ + "flux" + ], + "releaseDate": "2024-11-01", + "lastUpdated": "2024-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bfl/flux-pro-1.1-ultra", + "modelKey": "bfl/flux-pro-1.1-ultra", + "displayName": "FLUX1.1 [pro] Ultra", + "family": "flux", + "metadata": { + "lastUpdated": "2024-11", + "openWeights": false, + "releaseDate": "2024-11-01" + } + } + ] + }, + { + "id": "vercel/interfaze-beta", + "provider": "vercel", + "model": "interfaze-beta", + "displayName": "Interfaze Beta", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/interfaze/interfaze-beta" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 32000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "interfaze/interfaze-beta", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.5, + "output": 3.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Interfaze Beta" + ], + "releaseDate": "2025-10-07", + "lastUpdated": "2026-04-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "interfaze/interfaze-beta", + "modelKey": "interfaze/interfaze-beta", + "displayName": "Interfaze Beta", + "metadata": { + "lastUpdated": "2026-04-29", + "openWeights": false, + "releaseDate": "2025-10-07" + } + } + ] + }, + { + "id": "vercel/kat-coder-pro-v1", + "provider": "vercel", + "model": "kat-coder-pro-v1", + "displayName": "KAT-Coder-Pro V1", + "family": "kat-coder", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/kwaipilot/kat-coder-pro-v1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "kwaipilot/kat-coder-pro-v1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "KAT-Coder-Pro V1" + ], + "families": [ + "kat-coder" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-10-24", + "lastUpdated": "2025-10-24", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "kwaipilot/kat-coder-pro-v1", + "modelKey": "kwaipilot/kat-coder-pro-v1", + "displayName": "KAT-Coder-Pro V1", + "family": "kat-coder", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-10-24", + "openWeights": false, + "releaseDate": "2025-10-24" + } + } + ] + }, + { + "id": "vercel/kat-coder-pro-v2", + "provider": "vercel", + "model": "kat-coder-pro-v2", + "displayName": "Kat Coder Pro V2", + "family": "kat-coder", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/kwaipilot/kat-coder-pro-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "kwaipilot/kat-coder-pro-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Kat Coder Pro V2" + ], + "families": [ + "kat-coder" + ], + "releaseDate": "2026-03-27", + "lastUpdated": "2026-03-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "kwaipilot/kat-coder-pro-v2", + "modelKey": "kwaipilot/kat-coder-pro-v2", + "displayName": "Kat Coder Pro V2", + "family": "kat-coder", + "metadata": { + "lastUpdated": "2026-03-30", + "openWeights": false, + "releaseDate": "2026-03-27" + } + } + ] + }, + { + "id": "vercel/kling-v2.5-turbo-i2v", + "provider": "vercel", + "model": "kling-v2.5-turbo-i2v", + "displayName": "Kling v2.5 Turbo Image-to-Video", + "family": "ling", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/klingai/kling-v2.5-turbo-i2v" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Kling v2.5 Turbo Image-to-Video" + ], + "families": [ + "ling" + ], + "releaseDate": "2025-09-23", + "lastUpdated": "2025-09-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "klingai/kling-v2.5-turbo-i2v", + "modelKey": "klingai/kling-v2.5-turbo-i2v", + "displayName": "Kling v2.5 Turbo Image-to-Video", + "family": "ling", + "metadata": { + "lastUpdated": "2025-09-23", + "openWeights": false, + "releaseDate": "2025-09-23" + } + } + ] + }, + { + "id": "vercel/kling-v2.5-turbo-t2v", + "provider": "vercel", + "model": "kling-v2.5-turbo-t2v", + "displayName": "Kling v2.5 Turbo Text-to-Video", + "family": "ling", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/klingai/kling-v2.5-turbo-t2v" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Kling v2.5 Turbo Text-to-Video" + ], + "families": [ + "ling" + ], + "releaseDate": "2025-09-23", + "lastUpdated": "2025-09-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "klingai/kling-v2.5-turbo-t2v", + "modelKey": "klingai/kling-v2.5-turbo-t2v", + "displayName": "Kling v2.5 Turbo Text-to-Video", + "family": "ling", + "metadata": { + "lastUpdated": "2025-09-23", + "openWeights": false, + "releaseDate": "2025-09-23" + } + } + ] + }, + { + "id": "vercel/kling-v2.6-i2v", + "provider": "vercel", + "model": "kling-v2.6-i2v", + "displayName": "Kling v2.6 Image-to-Video", + "family": "ling", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/klingai/kling-v2.6-i2v" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Kling v2.6 Image-to-Video" + ], + "families": [ + "ling" + ], + "releaseDate": "2025-12-21", + "lastUpdated": "2025-12-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "klingai/kling-v2.6-i2v", + "modelKey": "klingai/kling-v2.6-i2v", + "displayName": "Kling v2.6 Image-to-Video", + "family": "ling", + "metadata": { + "lastUpdated": "2025-12-21", + "openWeights": false, + "releaseDate": "2025-12-21" + } + } + ] + }, + { + "id": "vercel/kling-v2.6-motion-control", + "provider": "vercel", + "model": "kling-v2.6-motion-control", + "displayName": "Kling v2.6 Motion Control", + "family": "ling", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/klingai/kling-v2.6-motion-control" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Kling v2.6 Motion Control" + ], + "families": [ + "ling" + ], + "releaseDate": "2025-12-21", + "lastUpdated": "2025-12-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "klingai/kling-v2.6-motion-control", + "modelKey": "klingai/kling-v2.6-motion-control", + "displayName": "Kling v2.6 Motion Control", + "family": "ling", + "metadata": { + "lastUpdated": "2025-12-21", + "openWeights": false, + "releaseDate": "2025-12-21" + } + } + ] + }, + { + "id": "vercel/kling-v2.6-t2v", + "provider": "vercel", + "model": "kling-v2.6-t2v", + "displayName": "Kling v2.6 Text-to-Video", + "family": "ling", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/klingai/kling-v2.6-t2v" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Kling v2.6 Text-to-Video" + ], + "families": [ + "ling" + ], + "releaseDate": "2025-12-21", + "lastUpdated": "2025-12-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "klingai/kling-v2.6-t2v", + "modelKey": "klingai/kling-v2.6-t2v", + "displayName": "Kling v2.6 Text-to-Video", + "family": "ling", + "metadata": { + "lastUpdated": "2025-12-21", + "openWeights": false, + "releaseDate": "2025-12-21" + } + } + ] + }, + { + "id": "vercel/kling-v3.0-i2v", + "provider": "vercel", + "model": "kling-v3.0-i2v", + "displayName": "Kling v3.0 Image-to-Video", + "family": "ling", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/klingai/kling-v3.0-i2v" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Kling v3.0 Image-to-Video" + ], + "families": [ + "ling" + ], + "releaseDate": "2026-02-05", + "lastUpdated": "2026-02-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "klingai/kling-v3.0-i2v", + "modelKey": "klingai/kling-v3.0-i2v", + "displayName": "Kling v3.0 Image-to-Video", + "family": "ling", + "metadata": { + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + } + ] + }, + { + "id": "vercel/kling-v3.0-motion-control", + "provider": "vercel", + "model": "kling-v3.0-motion-control", + "displayName": "Kling v3.0 Motion Control", + "family": "ling", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/klingai/kling-v3.0-motion-control" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Kling v3.0 Motion Control" + ], + "families": [ + "ling" + ], + "releaseDate": "2026-03-04", + "lastUpdated": "2026-03-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "klingai/kling-v3.0-motion-control", + "modelKey": "klingai/kling-v3.0-motion-control", + "displayName": "Kling v3.0 Motion Control", + "family": "ling", + "metadata": { + "lastUpdated": "2026-03-04", + "openWeights": false, + "releaseDate": "2026-03-04" + } + } + ] + }, + { + "id": "vercel/kling-v3.0-t2v", + "provider": "vercel", + "model": "kling-v3.0-t2v", + "displayName": "Kling v3.0 Text-to-Video", + "family": "ling", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/klingai/kling-v3.0-t2v" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Kling v3.0 Text-to-Video" + ], + "families": [ + "ling" + ], + "releaseDate": "2026-02-05", + "lastUpdated": "2026-02-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "klingai/kling-v3.0-t2v", + "modelKey": "klingai/kling-v3.0-t2v", + "displayName": "Kling v3.0 Text-to-Video", + "family": "ling", + "metadata": { + "lastUpdated": "2026-02-05", + "openWeights": false, + "releaseDate": "2026-02-05" + } + } + ] + }, + { + "id": "vercel/longcat-flash-chat", + "provider": "vercel", + "model": "longcat-flash-chat", + "displayName": "LongCat Flash Chat", + "family": "longcat", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/meituan/longcat-flash-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 100000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "LongCat Flash Chat" + ], + "families": [ + "longcat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-08-30", + "lastUpdated": "2025-08-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "meituan/longcat-flash-chat", + "modelKey": "meituan/longcat-flash-chat", + "displayName": "LongCat Flash Chat", + "family": "longcat", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-08-30", + "openWeights": false, + "releaseDate": "2025-08-30" + } + } + ] + }, + { + "id": "vercel/longcat-flash-thinking-2601", + "provider": "vercel", + "model": "longcat-flash-thinking-2601", + "displayName": "LongCat Flash Thinking 2601", + "family": "longcat", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/meituan/longcat-flash-thinking-2601" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "LongCat Flash Thinking 2601" + ], + "families": [ + "longcat" + ], + "releaseDate": "2026-03-13", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "meituan/longcat-flash-thinking-2601", + "modelKey": "meituan/longcat-flash-thinking-2601", + "displayName": "LongCat Flash Thinking 2601", + "family": "longcat", + "metadata": { + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-03-13" + } + } + ] + }, + { + "id": "vercel/mercury-2", + "provider": "vercel", + "model": "mercury-2", + "displayName": "Mercury 2", + "family": "mercury", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/inception/mercury-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "inception/mercury-2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.024999999999999998, + "input": 0.25, + "output": 0.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mercury 2" + ], + "families": [ + "mercury" + ], + "releaseDate": "2026-02-24", + "lastUpdated": "2026-03-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "inception/mercury-2", + "modelKey": "inception/mercury-2", + "displayName": "Mercury 2", + "family": "mercury", + "metadata": { + "lastUpdated": "2026-03-06", + "openWeights": false, + "releaseDate": "2026-02-24", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "vercel/mercury-coder-small", + "provider": "vercel", + "model": "mercury-coder-small", + "displayName": "Mercury Coder Small Beta", + "family": "mercury", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/inception/mercury-coder-small" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "inception/mercury-coder-small", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Mercury Coder Small Beta" + ], + "families": [ + "mercury" + ], + "releaseDate": "2025-02-26", + "lastUpdated": "2025-02-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "inception/mercury-coder-small", + "modelKey": "inception/mercury-coder-small", + "displayName": "Mercury Coder Small Beta", + "family": "mercury", + "metadata": { + "lastUpdated": "2025-02-26", + "openWeights": false, + "releaseDate": "2025-02-26" + } + } + ] + }, + { + "id": "vercel/mimo-v2-flash", + "provider": "vercel", + "model": "mimo-v2-flash", + "displayName": "MiMo V2 Flash", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/xiaomi/mimo-v2-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "xiaomi/mimo-v2-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2 Flash" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-12-17", + "lastUpdated": "2026-02-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "xiaomi/mimo-v2-flash", + "modelKey": "xiaomi/mimo-v2-flash", + "displayName": "MiMo V2 Flash", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2026-02-04", + "openWeights": false, + "releaseDate": "2025-12-17", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "vercel/mimo-v2-pro", + "provider": "vercel", + "model": "mimo-v2-pro", + "displayName": "MiMo V2 Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/xiaomi/mimo-v2-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "xiaomi/mimo-v2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2 Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "xiaomi/mimo-v2-pro", + "modelKey": "xiaomi/mimo-v2-pro", + "displayName": "MiMo V2 Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "vercel/mimo-v2.5", + "provider": "vercel", + "model": "mimo-v2.5", + "displayName": "MiMo M2.5", + "family": "mimo-v2.5", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/xiaomi/mimo-v2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1050000, + "outputTokens": 131100, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "xiaomi/mimo-v2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0028, + "input": 0.14, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo M2.5" + ], + "families": [ + "mimo-v2.5" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "xiaomi/mimo-v2.5", + "modelKey": "xiaomi/mimo-v2.5", + "displayName": "MiMo M2.5", + "family": "mimo-v2.5", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": false, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "vercel/mimo-v2.5-pro", + "provider": "vercel", + "model": "mimo-v2.5-pro", + "displayName": "MiMo V2.5 Pro", + "family": "mimo-v2.5-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/xiaomi/mimo-v2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1050000, + "outputTokens": 131000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "xiaomi/mimo-v2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0036, + "input": 0.435, + "output": 0.87 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2.5 Pro" + ], + "families": [ + "mimo-v2.5-pro" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "xiaomi/mimo-v2.5-pro", + "modelKey": "xiaomi/mimo-v2.5-pro", + "displayName": "MiMo V2.5 Pro", + "family": "mimo-v2.5-pro", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": false, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "vercel/morph-v3-fast", + "provider": "vercel", + "model": "morph-v3-fast", + "displayName": "Morph v3 Fast", + "family": "morph", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/morph/morph-v3-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "morph/morph-v3-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Morph v3 Fast" + ], + "families": [ + "morph" + ], + "releaseDate": "2024-08-15", + "lastUpdated": "2024-08-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "morph/morph-v3-fast", + "modelKey": "morph/morph-v3-fast", + "displayName": "Morph v3 Fast", + "family": "morph", + "metadata": { + "lastUpdated": "2024-08-15", + "openWeights": false, + "releaseDate": "2024-08-15" + } + } + ] + }, + { + "id": "vercel/morph-v3-large", + "provider": "vercel", + "model": "morph-v3-large", + "displayName": "Morph v3 Large", + "family": "morph", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/morph/morph-v3-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "morph/morph-v3-large", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.9, + "output": 1.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Morph v3 Large" + ], + "families": [ + "morph" + ], + "releaseDate": "2024-08-15", + "lastUpdated": "2024-08-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "morph/morph-v3-large", + "modelKey": "morph/morph-v3-large", + "displayName": "Morph v3 Large", + "family": "morph", + "metadata": { + "lastUpdated": "2024-08-15", + "openWeights": false, + "releaseDate": "2024-08-15" + } + } + ] + }, + { + "id": "vercel/nemotron-3-nano-30b-a3b", + "provider": "vercel", + "model": "nemotron-3-nano-30b-a3b", + "displayName": "Nemotron 3 Nano 30B A3B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/nvidia/nemotron-3-nano-30b-a3b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "nvidia/nemotron-3-nano-30b-a3b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.05, + "output": 0.24 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron 3 Nano 30B A3B" + ], + "families": [ + "nemotron" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-12-01", + "lastUpdated": "2025-12-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "nvidia/nemotron-3-nano-30b-a3b", + "modelKey": "nvidia/nemotron-3-nano-30b-a3b", + "displayName": "Nemotron 3 Nano 30B A3B", + "family": "nemotron", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-12-15", + "openWeights": false, + "releaseDate": "2024-12-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "vercel/nemotron-3-super-120b-a12b", + "provider": "vercel", + "model": "nemotron-3-super-120b-a12b", + "displayName": "NVIDIA Nemotron 3 Super 120B A12B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/nvidia/nemotron-3-super-120b-a12b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "nvidia/nemotron-3-super-120b-a12b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.65 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA Nemotron 3 Super 120B A12B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "nvidia/nemotron-3-super-120b-a12b", + "modelKey": "nvidia/nemotron-3-super-120b-a12b", + "displayName": "NVIDIA Nemotron 3 Super 120B A12B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-03-11", + "openWeights": false, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "vercel/nemotron-3-ultra-550b-a55b", + "provider": "vercel", + "model": "nemotron-3-ultra-550b-a55b", + "displayName": "Nemotron 3 Ultra", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/nvidia/nemotron-3-ultra-550b-a55b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 65000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "nvidia/nemotron-3-ultra-550b-a55b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12, + "input": 0.6, + "output": 2.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nemotron 3 Ultra" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-06-04", + "lastUpdated": "2026-06-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "nvidia/nemotron-3-ultra-550b-a55b", + "modelKey": "nvidia/nemotron-3-ultra-550b-a55b", + "displayName": "Nemotron 3 Ultra", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-06-04", + "openWeights": false, + "releaseDate": "2026-06-04", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "vercel/nemotron-nano-12b-v2-vl", + "provider": "vercel", + "model": "nemotron-nano-12b-v2-vl", + "displayName": "Nvidia Nemotron Nano 12B V2 VL", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/nvidia/nemotron-nano-12b-v2-vl" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "nvidia/nemotron-nano-12b-v2-vl", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nvidia Nemotron Nano 12B V2 VL" + ], + "families": [ + "nemotron" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-12-01", + "lastUpdated": "2025-10-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "nvidia/nemotron-nano-12b-v2-vl", + "modelKey": "nvidia/nemotron-nano-12b-v2-vl", + "displayName": "Nvidia Nemotron Nano 12B V2 VL", + "family": "nemotron", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-10-28", + "openWeights": false, + "releaseDate": "2024-12-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "vercel/nemotron-nano-9b-v2", + "provider": "vercel", + "model": "nemotron-nano-9b-v2", + "displayName": "Nvidia Nemotron Nano 9B V2", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/nvidia/nemotron-nano-9b-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "nvidia/nemotron-nano-9b-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.06, + "output": 0.23 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Nvidia Nemotron Nano 9B V2" + ], + "families": [ + "nemotron" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-08-18", + "lastUpdated": "2025-08-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "nvidia/nemotron-nano-9b-v2", + "modelKey": "nvidia/nemotron-nano-9b-v2", + "displayName": "Nvidia Nemotron Nano 9B V2", + "family": "nemotron", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-08-18", + "openWeights": false, + "releaseDate": "2025-08-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "vercel/recraft-v2", + "provider": "vercel", + "model": "recraft-v2", + "displayName": "Recraft V2", + "family": "recraft", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/recraft/recraft-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Recraft V2" + ], + "families": [ + "recraft" + ], + "releaseDate": "2024-03-01", + "lastUpdated": "2024-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "recraft/recraft-v2", + "modelKey": "recraft/recraft-v2", + "displayName": "Recraft V2", + "family": "recraft", + "metadata": { + "lastUpdated": "2024-03", + "openWeights": false, + "releaseDate": "2024-03-01" + } + } + ] + }, + { + "id": "vercel/recraft-v3", + "provider": "vercel", + "model": "recraft-v3", + "displayName": "Recraft V3", + "family": "recraft", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/recraft/recraft-v3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Recraft V3" + ], + "families": [ + "recraft" + ], + "releaseDate": "2024-10-01", + "lastUpdated": "2024-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "recraft/recraft-v3", + "modelKey": "recraft/recraft-v3", + "displayName": "Recraft V3", + "family": "recraft", + "metadata": { + "lastUpdated": "2024-10", + "openWeights": false, + "releaseDate": "2024-10-01" + } + } + ] + }, + { + "id": "vercel/recraft-v4", + "provider": "vercel", + "model": "recraft-v4", + "displayName": "Recraft V4", + "family": "recraft", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/recraft/recraft-v4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Recraft V4" + ], + "families": [ + "recraft" + ], + "releaseDate": "2026-02-17", + "lastUpdated": "2026-02-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "recraft/recraft-v4", + "modelKey": "recraft/recraft-v4", + "displayName": "Recraft V4", + "family": "recraft", + "metadata": { + "lastUpdated": "2026-02-17", + "openWeights": false, + "releaseDate": "2026-02-17" + } + } + ] + }, + { + "id": "vercel/recraft-v4-pro", + "provider": "vercel", + "model": "recraft-v4-pro", + "displayName": "Recraft V4 Pro", + "family": "recraft", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/recraft/recraft-v4-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Recraft V4 Pro" + ], + "families": [ + "recraft" + ], + "releaseDate": "2026-02-17", + "lastUpdated": "2026-02-17", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "recraft/recraft-v4-pro", + "modelKey": "recraft/recraft-v4-pro", + "displayName": "Recraft V4 Pro", + "family": "recraft", + "metadata": { + "lastUpdated": "2026-02-17", + "openWeights": false, + "releaseDate": "2026-02-17" + } + } + ] + }, + { + "id": "vercel/recraft-v4.1", + "provider": "vercel", + "model": "recraft-v4.1", + "displayName": "Recraft V4.1", + "family": "recraft", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/recraft/recraft-v4.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Recraft V4.1" + ], + "families": [ + "recraft" + ], + "releaseDate": "2026-05-14", + "lastUpdated": "2026-05-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "recraft/recraft-v4.1", + "modelKey": "recraft/recraft-v4.1", + "displayName": "Recraft V4.1", + "family": "recraft", + "metadata": { + "lastUpdated": "2026-05-14", + "openWeights": false, + "releaseDate": "2026-05-14" + } + } + ] + }, + { + "id": "vercel/recraft-v4.1-pro", + "provider": "vercel", + "model": "recraft-v4.1-pro", + "displayName": "Recraft V4.1 Pro", + "family": "recraft", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/recraft/recraft-v4.1-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Recraft V4.1 Pro" + ], + "families": [ + "recraft" + ], + "releaseDate": "2026-05-14", + "lastUpdated": "2026-05-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "recraft/recraft-v4.1-pro", + "modelKey": "recraft/recraft-v4.1-pro", + "displayName": "Recraft V4.1 Pro", + "family": "recraft", + "metadata": { + "lastUpdated": "2026-05-14", + "openWeights": false, + "releaseDate": "2026-05-14" + } + } + ] + }, + { + "id": "vercel/recraft-v4.1-utility", + "provider": "vercel", + "model": "recraft-v4.1-utility", + "displayName": "Recraft V4.1 Utility", + "family": "recraft", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/recraft/recraft-v4.1-utility" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Recraft V4.1 Utility" + ], + "families": [ + "recraft" + ], + "releaseDate": "2026-05-14", + "lastUpdated": "2026-05-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "recraft/recraft-v4.1-utility", + "modelKey": "recraft/recraft-v4.1-utility", + "displayName": "Recraft V4.1 Utility", + "family": "recraft", + "metadata": { + "lastUpdated": "2026-05-14", + "openWeights": false, + "releaseDate": "2026-05-14" + } + } + ] + }, + { + "id": "vercel/recraft-v4.1-utility-pro", + "provider": "vercel", + "model": "recraft-v4.1-utility-pro", + "displayName": "Recraft V4.1 Utility Pro", + "family": "recraft", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/recraft/recraft-v4.1-utility-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Recraft V4.1 Utility Pro" + ], + "families": [ + "recraft" + ], + "releaseDate": "2026-05-14", + "lastUpdated": "2026-05-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "recraft/recraft-v4.1-utility-pro", + "modelKey": "recraft/recraft-v4.1-utility-pro", + "displayName": "Recraft V4.1 Utility Pro", + "family": "recraft", + "metadata": { + "lastUpdated": "2026-05-14", + "openWeights": false, + "releaseDate": "2026-05-14" + } + } + ] + }, + { + "id": "vercel/rerank-2.5", + "provider": "vercel", + "model": "rerank-2.5", + "displayName": "Voyage Rerank 2.5", + "family": "voyage", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/voyage/rerank-2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Voyage Rerank 2.5" + ], + "families": [ + "voyage" + ], + "releaseDate": "2025-08-11", + "lastUpdated": "2025-08-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "voyage/rerank-2.5", + "modelKey": "voyage/rerank-2.5", + "displayName": "Voyage Rerank 2.5", + "family": "voyage", + "metadata": { + "lastUpdated": "2025-08-11", + "openWeights": false, + "releaseDate": "2025-08-11" + } + } + ] + }, + { + "id": "vercel/rerank-2.5-lite", + "provider": "vercel", + "model": "rerank-2.5-lite", + "displayName": "Voyage Rerank 2.5 Lite", + "family": "voyage", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/voyage/rerank-2.5-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Voyage Rerank 2.5 Lite" + ], + "families": [ + "voyage" + ], + "releaseDate": "2025-08-11", + "lastUpdated": "2025-08-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "voyage/rerank-2.5-lite", + "modelKey": "voyage/rerank-2.5-lite", + "displayName": "Voyage Rerank 2.5 Lite", + "family": "voyage", + "metadata": { + "lastUpdated": "2025-08-11", + "openWeights": false, + "releaseDate": "2025-08-11" + } + } + ] + }, + { + "id": "vercel/seed-1.6", + "provider": "vercel", + "model": "seed-1.6", + "displayName": "Seed 1.6", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bytedance/seed-1.6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "bytedance/seed-1.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.25, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Seed 1.6" + ], + "families": [ + "seed" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-09-01", + "lastUpdated": "2025-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bytedance/seed-1.6", + "modelKey": "bytedance/seed-1.6", + "displayName": "Seed 1.6", + "family": "seed", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-09", + "openWeights": false, + "releaseDate": "2025-09-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "vercel/seed-1.8", + "provider": "vercel", + "model": "seed-1.8", + "displayName": "Seed 1.8", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bytedance/seed-1.8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "bytedance/seed-1.8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.25, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Seed 1.8" + ], + "families": [ + "seed" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-09-01", + "lastUpdated": "2025-10", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bytedance/seed-1.8", + "modelKey": "bytedance/seed-1.8", + "displayName": "Seed 1.8", + "family": "seed", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-10", + "openWeights": false, + "releaseDate": "2025-09-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "vercel/seedance-2.0", + "provider": "vercel", + "model": "seedance-2.0", + "displayName": "Seedance 2.0", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bytedance/seedance-2.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Seedance 2.0" + ], + "families": [ + "seed" + ], + "releaseDate": "2026-04-14", + "lastUpdated": "2026-04-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bytedance/seedance-2.0", + "modelKey": "bytedance/seedance-2.0", + "displayName": "Seedance 2.0", + "family": "seed", + "metadata": { + "lastUpdated": "2026-04-14", + "openWeights": false, + "releaseDate": "2026-04-14" + } + } + ] + }, + { + "id": "vercel/seedance-2.0-fast", + "provider": "vercel", + "model": "seedance-2.0-fast", + "displayName": "Seedance 2.0 Fast", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bytedance/seedance-2.0-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Seedance 2.0 Fast" + ], + "families": [ + "seed" + ], + "releaseDate": "2026-04-14", + "lastUpdated": "2026-04-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bytedance/seedance-2.0-fast", + "modelKey": "bytedance/seedance-2.0-fast", + "displayName": "Seedance 2.0 Fast", + "family": "seed", + "metadata": { + "lastUpdated": "2026-04-14", + "openWeights": false, + "releaseDate": "2026-04-14" + } + } + ] + }, + { + "id": "vercel/seedance-v1.0-lite-i2v", + "provider": "vercel", + "model": "seedance-v1.0-lite-i2v", + "displayName": "Seedance v1.0 Lite Image-to-Video", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bytedance/seedance-v1.0-lite-i2v" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Seedance v1.0 Lite Image-to-Video" + ], + "families": [ + "seed" + ], + "releaseDate": "2025-06-01", + "lastUpdated": "2025-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bytedance/seedance-v1.0-lite-i2v", + "modelKey": "bytedance/seedance-v1.0-lite-i2v", + "displayName": "Seedance v1.0 Lite Image-to-Video", + "family": "seed", + "metadata": { + "lastUpdated": "2025-06-01", + "openWeights": false, + "releaseDate": "2025-06-01" + } + } + ] + }, + { + "id": "vercel/seedance-v1.0-lite-t2v", + "provider": "vercel", + "model": "seedance-v1.0-lite-t2v", + "displayName": "Seedance v1.0 Lite Text-to-Video", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bytedance/seedance-v1.0-lite-t2v" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Seedance v1.0 Lite Text-to-Video" + ], + "families": [ + "seed" + ], + "releaseDate": "2025-06-01", + "lastUpdated": "2025-06-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bytedance/seedance-v1.0-lite-t2v", + "modelKey": "bytedance/seedance-v1.0-lite-t2v", + "displayName": "Seedance v1.0 Lite Text-to-Video", + "family": "seed", + "metadata": { + "lastUpdated": "2025-06-01", + "openWeights": false, + "releaseDate": "2025-06-01" + } + } + ] + }, + { + "id": "vercel/seedance-v1.0-pro", + "provider": "vercel", + "model": "seedance-v1.0-pro", + "displayName": "Seedance v1.0 Pro", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bytedance/seedance-v1.0-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Seedance v1.0 Pro" + ], + "families": [ + "seed" + ], + "releaseDate": "2025-06-11", + "lastUpdated": "2025-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bytedance/seedance-v1.0-pro", + "modelKey": "bytedance/seedance-v1.0-pro", + "displayName": "Seedance v1.0 Pro", + "family": "seed", + "metadata": { + "lastUpdated": "2025-06-11", + "openWeights": false, + "releaseDate": "2025-06-11" + } + } + ] + }, + { + "id": "vercel/seedance-v1.0-pro-fast", + "provider": "vercel", + "model": "seedance-v1.0-pro-fast", + "displayName": "Seedance v1.0 Pro Fast", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bytedance/seedance-v1.0-pro-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Seedance v1.0 Pro Fast" + ], + "families": [ + "seed" + ], + "releaseDate": "2025-10-31", + "lastUpdated": "2025-10-31", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bytedance/seedance-v1.0-pro-fast", + "modelKey": "bytedance/seedance-v1.0-pro-fast", + "displayName": "Seedance v1.0 Pro Fast", + "family": "seed", + "metadata": { + "lastUpdated": "2025-10-31", + "openWeights": false, + "releaseDate": "2025-10-31" + } + } + ] + }, + { + "id": "vercel/seedance-v1.5-pro", + "provider": "vercel", + "model": "seedance-v1.5-pro", + "displayName": "Seedance v1.5 Pro", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bytedance/seedance-v1.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Seedance v1.5 Pro" + ], + "families": [ + "seed" + ], + "releaseDate": "2025-12-16", + "lastUpdated": "2025-12-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bytedance/seedance-v1.5-pro", + "modelKey": "bytedance/seedance-v1.5-pro", + "displayName": "Seedance v1.5 Pro", + "family": "seed", + "metadata": { + "lastUpdated": "2025-12-16", + "openWeights": false, + "releaseDate": "2025-12-16" + } + } + ] + }, + { + "id": "vercel/seedream-4.0", + "provider": "vercel", + "model": "seedream-4.0", + "displayName": "Seedream 4.0", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bytedance/seedream-4.0" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Seedream 4.0" + ], + "families": [ + "seed" + ], + "releaseDate": "2025-08-28", + "lastUpdated": "2025-08-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bytedance/seedream-4.0", + "modelKey": "bytedance/seedream-4.0", + "displayName": "Seedream 4.0", + "family": "seed", + "metadata": { + "lastUpdated": "2025-08-28", + "openWeights": false, + "releaseDate": "2025-08-28" + } + } + ] + }, + { + "id": "vercel/seedream-4.5", + "provider": "vercel", + "model": "seedream-4.5", + "displayName": "Seedream 4.5", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bytedance/seedream-4.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Seedream 4.5" + ], + "families": [ + "seed" + ], + "releaseDate": "2025-11-28", + "lastUpdated": "2025-11-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bytedance/seedream-4.5", + "modelKey": "bytedance/seedream-4.5", + "displayName": "Seedream 4.5", + "family": "seed", + "metadata": { + "lastUpdated": "2025-11-28", + "openWeights": false, + "releaseDate": "2025-11-28" + } + } + ] + }, + { + "id": "vercel/seedream-5.0-lite", + "provider": "vercel", + "model": "seedream-5.0-lite", + "displayName": "Seedream 5.0 Lite", + "family": "seed", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/bytedance/seedream-5.0-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Seedream 5.0 Lite" + ], + "families": [ + "seed" + ], + "releaseDate": "2026-01-28", + "lastUpdated": "2026-01-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "bytedance/seedream-5.0-lite", + "modelKey": "bytedance/seedream-5.0-lite", + "displayName": "Seedream 5.0 Lite", + "family": "seed", + "metadata": { + "lastUpdated": "2026-01-28", + "openWeights": false, + "releaseDate": "2026-01-28" + } + } + ] + }, + { + "id": "vercel/step-3.5-flash", + "provider": "vercel", + "model": "step-3.5-flash", + "displayName": "StepFun 3.5 Flash", + "family": "step", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/stepfun/step-3.5-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262114, + "outputTokens": 262114, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "stepfun/step-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.09, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "StepFun 3.5 Flash" + ], + "families": [ + "step" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-01-29", + "lastUpdated": "2026-02-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "stepfun/step-3.5-flash", + "modelKey": "stepfun/step-3.5-flash", + "displayName": "StepFun 3.5 Flash", + "family": "step", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-02-13", + "openWeights": false, + "releaseDate": "2026-01-29", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "vercel/step-3.7-flash", + "provider": "vercel", + "model": "step-3.7-flash", + "displayName": "Step 3.7 Flash", + "family": "step", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/stepfun/step-3.7-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "stepfun/step-3.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.04, + "input": 0.2, + "output": 1.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 3.7 Flash" + ], + "families": [ + "step" + ], + "knowledgeCutoff": "2026-01-01", + "releaseDate": "2026-05-28", + "lastUpdated": "2026-05-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "stepfun/step-3.7-flash", + "modelKey": "stepfun/step-3.7-flash", + "displayName": "Step 3.7 Flash", + "family": "step", + "metadata": { + "knowledgeCutoff": "2026-01-01", + "lastUpdated": "2026-05-29", + "openWeights": false, + "releaseDate": "2026-05-28", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "vercel/trinity-large-preview", + "provider": "vercel", + "model": "trinity-large-preview", + "displayName": "Trinity Large Preview", + "family": "trinity", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/arcee-ai/trinity-large-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131000, + "outputTokens": 131000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "arcee-ai/trinity-large-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Trinity Large Preview" + ], + "families": [ + "trinity" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-01-01", + "lastUpdated": "2025-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "arcee-ai/trinity-large-preview", + "modelKey": "arcee-ai/trinity-large-preview", + "displayName": "Trinity Large Preview", + "family": "trinity", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-01", + "openWeights": false, + "releaseDate": "2025-01-01" + } + } + ] + }, + { + "id": "vercel/trinity-large-thinking", + "provider": "vercel", + "model": "trinity-large-thinking", + "displayName": "Trinity Large Thinking", + "family": "trinity", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/arcee-ai/trinity-large-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262100, + "outputTokens": 80000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "arcee-ai/trinity-large-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.25, + "output": 0.8999999999999999 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Trinity Large Thinking" + ], + "families": [ + "trinity" + ], + "releaseDate": "2026-04-01", + "lastUpdated": "2026-04-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "arcee-ai/trinity-large-thinking", + "modelKey": "arcee-ai/trinity-large-thinking", + "displayName": "Trinity Large Thinking", + "family": "trinity", + "metadata": { + "lastUpdated": "2026-04-03", + "openWeights": true, + "releaseDate": "2026-04-01" + } + } + ] + }, + { + "id": "vercel/trinity-mini", + "provider": "vercel", + "model": "trinity-mini", + "displayName": "Trinity Mini", + "family": "trinity", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/arcee-ai/trinity-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "arcee-ai/trinity-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.045, + "output": 0.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Trinity Mini" + ], + "families": [ + "trinity" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-12-01", + "lastUpdated": "2025-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "arcee-ai/trinity-mini", + "modelKey": "arcee-ai/trinity-mini", + "displayName": "Trinity Mini", + "family": "trinity", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-12", + "openWeights": false, + "releaseDate": "2025-12-01" + } + } + ] + }, + { + "id": "vercel/voyage-3-large", + "provider": "vercel", + "model": "voyage-3-large", + "displayName": "voyage-3-large", + "family": "voyage", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/voyage/voyage-3-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "voyage-3-large" + ], + "families": [ + "voyage" + ], + "releaseDate": "2024-09-01", + "lastUpdated": "2024-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "voyage/voyage-3-large", + "modelKey": "voyage/voyage-3-large", + "displayName": "voyage-3-large", + "family": "voyage", + "metadata": { + "lastUpdated": "2024-09", + "openWeights": false, + "releaseDate": "2024-09-01" + } + } + ] + }, + { + "id": "vercel/voyage-3.5", + "provider": "vercel", + "model": "voyage-3.5", + "displayName": "voyage-3.5", + "family": "voyage", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/voyage/voyage-3.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "voyage-3.5" + ], + "families": [ + "voyage" + ], + "releaseDate": "2025-05-20", + "lastUpdated": "2025-05-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "voyage/voyage-3.5", + "modelKey": "voyage/voyage-3.5", + "displayName": "voyage-3.5", + "family": "voyage", + "metadata": { + "lastUpdated": "2025-05-20", + "openWeights": false, + "releaseDate": "2025-05-20" + } + } + ] + }, + { + "id": "vercel/voyage-3.5-lite", + "provider": "vercel", + "model": "voyage-3.5-lite", + "displayName": "voyage-3.5-lite", + "family": "voyage", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/voyage/voyage-3.5-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "voyage-3.5-lite" + ], + "families": [ + "voyage" + ], + "releaseDate": "2025-05-20", + "lastUpdated": "2025-05-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "voyage/voyage-3.5-lite", + "modelKey": "voyage/voyage-3.5-lite", + "displayName": "voyage-3.5-lite", + "family": "voyage", + "metadata": { + "lastUpdated": "2025-05-20", + "openWeights": false, + "releaseDate": "2025-05-20" + } + } + ] + }, + { + "id": "vercel/voyage-4", + "provider": "vercel", + "model": "voyage-4", + "displayName": "voyage-4", + "family": "voyage", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/voyage/voyage-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "voyage-4" + ], + "families": [ + "voyage" + ], + "releaseDate": "2026-03-06", + "lastUpdated": "2026-03-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "voyage/voyage-4", + "modelKey": "voyage/voyage-4", + "displayName": "voyage-4", + "family": "voyage", + "metadata": { + "lastUpdated": "2026-03-06", + "openWeights": false, + "releaseDate": "2026-03-06" + } + } + ] + }, + { + "id": "vercel/voyage-4-large", + "provider": "vercel", + "model": "voyage-4-large", + "displayName": "voyage-4-large", + "family": "voyage", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/voyage/voyage-4-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "voyage-4-large" + ], + "families": [ + "voyage" + ], + "releaseDate": "2026-03-06", + "lastUpdated": "2026-03-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "voyage/voyage-4-large", + "modelKey": "voyage/voyage-4-large", + "displayName": "voyage-4-large", + "family": "voyage", + "metadata": { + "lastUpdated": "2026-03-06", + "openWeights": false, + "releaseDate": "2026-03-06" + } + } + ] + }, + { + "id": "vercel/voyage-4-lite", + "provider": "vercel", + "model": "voyage-4-lite", + "displayName": "voyage-4-lite", + "family": "voyage", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/voyage/voyage-4-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "voyage-4-lite" + ], + "families": [ + "voyage" + ], + "releaseDate": "2026-03-06", + "lastUpdated": "2026-03-06", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "voyage/voyage-4-lite", + "modelKey": "voyage/voyage-4-lite", + "displayName": "voyage-4-lite", + "family": "voyage", + "metadata": { + "lastUpdated": "2026-03-06", + "openWeights": false, + "releaseDate": "2026-03-06" + } + } + ] + }, + { + "id": "vercel/voyage-code-2", + "provider": "vercel", + "model": "voyage-code-2", + "displayName": "voyage-code-2", + "family": "voyage", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/voyage/voyage-code-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "voyage-code-2" + ], + "families": [ + "voyage" + ], + "releaseDate": "2024-01-01", + "lastUpdated": "2024-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "voyage/voyage-code-2", + "modelKey": "voyage/voyage-code-2", + "displayName": "voyage-code-2", + "family": "voyage", + "metadata": { + "lastUpdated": "2024-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + } + ] + }, + { + "id": "vercel/voyage-code-3", + "provider": "vercel", + "model": "voyage-code-3", + "displayName": "voyage-code-3", + "family": "voyage", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/voyage/voyage-code-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "voyage-code-3" + ], + "families": [ + "voyage" + ], + "releaseDate": "2024-09-01", + "lastUpdated": "2024-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "voyage/voyage-code-3", + "modelKey": "voyage/voyage-code-3", + "displayName": "voyage-code-3", + "family": "voyage", + "metadata": { + "lastUpdated": "2024-09", + "openWeights": false, + "releaseDate": "2024-09-01" + } + } + ] + }, + { + "id": "vercel/voyage-finance-2", + "provider": "vercel", + "model": "voyage-finance-2", + "displayName": "voyage-finance-2", + "family": "voyage", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/voyage/voyage-finance-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "voyage-finance-2" + ], + "families": [ + "voyage" + ], + "releaseDate": "2024-03-01", + "lastUpdated": "2024-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "voyage/voyage-finance-2", + "modelKey": "voyage/voyage-finance-2", + "displayName": "voyage-finance-2", + "family": "voyage", + "metadata": { + "lastUpdated": "2024-03", + "openWeights": false, + "releaseDate": "2024-03-01" + } + } + ] + }, + { + "id": "vercel/voyage-law-2", + "provider": "vercel", + "model": "voyage-law-2", + "displayName": "voyage-law-2", + "family": "voyage", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/voyage/voyage-law-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 1536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "voyage-law-2" + ], + "families": [ + "voyage" + ], + "releaseDate": "2024-03-01", + "lastUpdated": "2024-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "voyage/voyage-law-2", + "modelKey": "voyage/voyage-law-2", + "displayName": "voyage-law-2", + "family": "voyage", + "metadata": { + "lastUpdated": "2024-03", + "openWeights": false, + "releaseDate": "2024-03-01" + } + } + ] + }, + { + "id": "vertex-ai-ai21-models/jamba-1.5", + "provider": "vertex-ai-ai21-models", + "model": "jamba-1.5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-ai21_models" + ], + "aliases": [ + "vertex_ai-ai21_models/vertex_ai/jamba-1.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-ai21_models", + "model": "vertex_ai/jamba-1.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-ai21_models", + "model": "vertex_ai/jamba-1.5", + "mode": "chat" + } + ] + }, + { + "id": "vertex-ai-ai21-models/jamba-1.5-large", + "provider": "vertex-ai-ai21-models", + "model": "jamba-1.5-large", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-ai21_models" + ], + "aliases": [ + "vertex_ai-ai21_models/vertex_ai/jamba-1.5-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-ai21_models", + "model": "vertex_ai/jamba-1.5-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-ai21_models", + "model": "vertex_ai/jamba-1.5-large", + "mode": "chat" + } + ] + }, + { + "id": "vertex-ai-ai21-models/jamba-1.5-large@001", + "provider": "vertex-ai-ai21-models", + "model": "jamba-1.5-large@001", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-ai21_models" + ], + "aliases": [ + "vertex_ai-ai21_models/vertex_ai/jamba-1.5-large@001" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-ai21_models", + "model": "vertex_ai/jamba-1.5-large@001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-ai21_models", + "model": "vertex_ai/jamba-1.5-large@001", + "mode": "chat" + } + ] + }, + { + "id": "vertex-ai-ai21-models/jamba-1.5-mini", + "provider": "vertex-ai-ai21-models", + "model": "jamba-1.5-mini", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-ai21_models" + ], + "aliases": [ + "vertex_ai-ai21_models/vertex_ai/jamba-1.5-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-ai21_models", + "model": "vertex_ai/jamba-1.5-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-ai21_models", + "model": "vertex_ai/jamba-1.5-mini", + "mode": "chat" + } + ] + }, + { + "id": "vertex-ai-ai21-models/jamba-1.5-mini@001", + "provider": "vertex-ai-ai21-models", + "model": "jamba-1.5-mini@001", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-ai21_models" + ], + "aliases": [ + "vertex_ai-ai21_models/vertex_ai/jamba-1.5-mini@001" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-ai21_models", + "model": "vertex_ai/jamba-1.5-mini@001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-ai21_models", + "model": "vertex_ai/jamba-1.5-mini@001", + "mode": "chat" + } + ] + }, + { + "id": "vertex-ai-embedding-models/multimodalembedding", + "provider": "vertex-ai-embedding-models", + "model": "multimodalembedding", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-embedding-models" + ], + "aliases": [ + "vertex_ai-embedding-models/multimodalembedding" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2048, + "inputTokens": 2048, + "maxTokens": 2048, + "outputTokens": 2048, + "outputVectorSize": 768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-embedding-models", + "model": "multimodalembedding", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 0 + }, + "perImage": { + "input": 0.0001 + }, + "perVideoSecond": { + "input": 0.0005, + "inputAbove8SInterval": 0.001, + "inputAbove15SInterval": 0.002 + }, + "perCharacter": { + "input": 2e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "supportedEndpoints": [ + "/v1/embeddings" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-embedding-models", + "model": "multimodalembedding", + "mode": "embedding", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models", + "supportedEndpoints": [ + "/v1/embeddings" + ] + } + } + ] + }, + { + "id": "vertex-ai-embedding-models/multimodalembedding@001", + "provider": "vertex-ai-embedding-models", + "model": "multimodalembedding@001", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-embedding-models" + ], + "aliases": [ + "vertex_ai-embedding-models/multimodalembedding@001" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2048, + "inputTokens": 2048, + "maxTokens": 2048, + "outputTokens": 2048, + "outputVectorSize": 768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-embedding-models", + "model": "multimodalembedding@001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 0 + }, + "perImage": { + "input": 0.0001 + }, + "perVideoSecond": { + "input": 0.0005, + "inputAbove8SInterval": 0.001, + "inputAbove15SInterval": 0.002 + }, + "perCharacter": { + "input": 2e-7 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "supportedEndpoints": [ + "/v1/embeddings" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-embedding-models", + "model": "multimodalembedding@001", + "mode": "embedding", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models", + "supportedEndpoints": [ + "/v1/embeddings" + ] + } + } + ] + }, + { + "id": "vertex-ai-embedding-models/text-multilingual-embedding-002", + "provider": "vertex-ai-embedding-models", + "model": "text-multilingual-embedding-002", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-embedding-models" + ], + "aliases": [ + "vertex_ai-embedding-models/text-multilingual-embedding-002" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2048, + "inputTokens": 2048, + "maxTokens": 2048, + "outputTokens": 2048, + "outputVectorSize": 768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-embedding-models", + "model": "text-multilingual-embedding-002", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + }, + "perCharacter": { + "input": 2.5e-8 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-embedding-models", + "model": "text-multilingual-embedding-002", + "mode": "embedding", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models" + } + } + ] + }, + { + "id": "vertex-ai-image-models/imagegeneration@006", + "provider": "vertex-ai-image-models", + "model": "imagegeneration@006", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-image-models" + ], + "aliases": [ + "vertex_ai-image-models/vertex_ai/imagegeneration@006" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": true, + "imageInput": false, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-image-models", + "model": "vertex_ai/imagegeneration@006", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perImage": { + "output": 0.02 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-image-models", + "model": "vertex_ai/imagegeneration@006", + "mode": "image_generation", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing" + } + } + ] + }, + { + "id": "vertex-ai-language-models/deep-research-pro-preview-12-2025", + "provider": "vertex-ai-language-models", + "model": "deep-research-pro-preview-12-2025", + "mode": "image_generation", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-language-models" + ], + "aliases": [ + "vertex_ai-language-models/deep-research-pro-preview-12-2025", + "vertex_ai-language-models/vertex_ai/deep-research-pro-preview-12-2025" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": true, + "imageInput": true, + "imageOutput": true, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "deep-research-pro-preview-12-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 12, + "outputImage": 120 + }, + "perImage": { + "input": 0.0011, + "output": 0.134 + }, + "extra": { + "input_cost_per_token_batches": 0.000001, + "output_cost_per_token_batches": 0.000006 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "vertex_ai/deep-research-pro-preview-12-2025", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 12, + "outputImage": 120 + }, + "perImage": { + "input": 0.0011, + "output": 0.134 + }, + "extra": { + "input_cost_per_token_batches": 0.000001, + "output_cost_per_token_batches": 0.000006 + } + } + ] + }, + "metadata": { + "modes": [ + "image_generation" + ], + "supportedEndpoints": [ + "/v1/batch", + "/v1/chat/completions", + "/v1/completions" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "deep-research-pro-preview-12-2025", + "mode": "image_generation", + "metadata": { + "source": "https://ai.google.dev/gemini-api/docs/pricing", + "supportedEndpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "vertex_ai/deep-research-pro-preview-12-2025", + "mode": "image_generation", + "metadata": { + "source": "https://docs.cloud.google.com/vertex-ai/generative-ai/docs/models/gemini/3-pro-image" + } + } + ] + }, + { + "id": "vertex-ai-language-models/medlm-large", + "provider": "vertex-ai-language-models", + "model": "medlm-large", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-language-models" + ], + "aliases": [ + "vertex_ai-language-models/medlm-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "medlm-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.000005, + "output": 0.000015 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "medlm-large", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models" + } + } + ] + }, + { + "id": "vertex-ai-language-models/medlm-medium", + "provider": "vertex-ai-language-models", + "model": "medlm-medium", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-language-models" + ], + "aliases": [ + "vertex_ai-language-models/medlm-medium" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-language-models", + "model": "medlm-medium", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 5e-7, + "output": 0.000001 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-language-models", + "model": "medlm-medium", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models" + } + } + ] + }, + { + "id": "vertex-ai-text-models/text-unicorn", + "provider": "vertex-ai-text-models", + "model": "text-unicorn", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-text-models" + ], + "aliases": [ + "vertex_ai-text-models/text-unicorn" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-text-models", + "model": "text-unicorn", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10, + "output": 28 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-text-models", + "model": "text-unicorn", + "mode": "completion", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models" + } + } + ] + }, + { + "id": "vertex-ai-text-models/text-unicorn@001", + "provider": "vertex-ai-text-models", + "model": "text-unicorn@001", + "mode": "completion", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai-text-models" + ], + "aliases": [ + "vertex_ai-text-models/text-unicorn@001" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai-text-models", + "model": "text-unicorn@001", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 10, + "output": 28 + } + } + ] + }, + "metadata": { + "modes": [ + "completion" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-text-models", + "model": "text-unicorn@001", + "mode": "completion", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models" + } + } + ] + }, + { + "id": "vertex-ai/chirp", + "provider": "vertex-ai", + "model": "chirp", + "mode": "audio_speech", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai" + ], + "aliases": [ + "vertex_ai/chirp" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": true, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai", + "model": "vertex_ai/chirp", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perCharacter": { + "input": 0.00003 + } + } + ] + }, + "metadata": { + "modes": [ + "audio_speech" + ], + "supportedEndpoints": [ + "/v1/audio/speech" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai", + "model": "vertex_ai/chirp", + "mode": "audio_speech", + "metadata": { + "source": "https://cloud.google.com/text-to-speech/pricing", + "supportedEndpoints": [ + "/v1/audio/speech" + ] + } + } + ] + }, + { + "id": "vertex-ai/search-api", + "provider": "vertex-ai", + "model": "search-api", + "mode": "vector_store", + "sources": [ + "litellm" + ], + "providers": [ + "vertex_ai" + ], + "aliases": [ + "vertex_ai/search_api" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vertex_ai", + "model": "vertex_ai/search_api", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perQuery": { + "input": 0.0015 + } + } + ] + }, + "metadata": { + "modes": [ + "vector_store" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai", + "model": "vertex_ai/search_api", + "mode": "vector_store" + } + ] + }, + { + "id": "volcengine/doubao-embedding", + "provider": "volcengine", + "model": "doubao-embedding", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "volcengine" + ], + "aliases": [ + "volcengine/doubao-embedding" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "outputVectorSize": 2560, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "volcengine", + "model": "doubao-embedding", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "volcengine", + "model": "doubao-embedding", + "mode": "embedding", + "metadata": { + "metadata": { + "notes": "Volcengine Doubao embedding model - standard version with 2560 dimensions" + } + } + } + ] + }, + { + "id": "volcengine/doubao-embedding-large", + "provider": "volcengine", + "model": "doubao-embedding-large", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "volcengine" + ], + "aliases": [ + "volcengine/doubao-embedding-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "outputVectorSize": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "volcengine", + "model": "doubao-embedding-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "volcengine", + "model": "doubao-embedding-large", + "mode": "embedding", + "metadata": { + "metadata": { + "notes": "Volcengine Doubao embedding model - large version with 2048 dimensions" + } + } + } + ] + }, + { + "id": "volcengine/doubao-embedding-large-text-240915", + "provider": "volcengine", + "model": "doubao-embedding-large-text-240915", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "volcengine" + ], + "aliases": [ + "volcengine/doubao-embedding-large-text-240915" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "outputVectorSize": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "volcengine", + "model": "doubao-embedding-large-text-240915", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "volcengine", + "model": "doubao-embedding-large-text-240915", + "mode": "embedding", + "metadata": { + "metadata": { + "notes": "Volcengine Doubao embedding model - text-240915 version with 4096 dimensions" + } + } + } + ] + }, + { + "id": "volcengine/doubao-embedding-large-text-250515", + "provider": "volcengine", + "model": "doubao-embedding-large-text-250515", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "volcengine" + ], + "aliases": [ + "volcengine/doubao-embedding-large-text-250515" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "outputVectorSize": 2048, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "volcengine", + "model": "doubao-embedding-large-text-250515", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "volcengine", + "model": "doubao-embedding-large-text-250515", + "mode": "embedding", + "metadata": { + "metadata": { + "notes": "Volcengine Doubao embedding model - text-250515 version with 2048 dimensions" + } + } + } + ] + }, + { + "id": "volcengine/doubao-embedding-text-240715", + "provider": "volcengine", + "model": "doubao-embedding-text-240715", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "volcengine" + ], + "aliases": [ + "volcengine/doubao-embedding-text-240715" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "outputVectorSize": 2560, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "volcengine", + "model": "doubao-embedding-text-240715", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "volcengine", + "model": "doubao-embedding-text-240715", + "mode": "embedding", + "metadata": { + "metadata": { + "notes": "Volcengine Doubao embedding model - text-240715 version with 2560 dimensions" + } + } + } + ] + }, + { + "id": "volcengine/doubao-seed-2-0-code-preview-260215", + "provider": "volcengine", + "model": "doubao-seed-2-0-code-preview-260215", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "volcengine" + ], + "aliases": [ + "volcengine/doubao-seed-2-0-code-preview-260215" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "volcengine", + "model": "volcengine/doubao-seed-2-0-code-preview-260215", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "volcengine", + "model": "volcengine/doubao-seed-2-0-code-preview-260215", + "mode": "chat", + "metadata": { + "source": "https://www.volcengine.com/docs/82379/1330310" + } + } + ] + }, + { + "id": "volcengine/doubao-seed-2-0-lite-260215", + "provider": "volcengine", + "model": "doubao-seed-2-0-lite-260215", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "volcengine" + ], + "aliases": [ + "volcengine/doubao-seed-2-0-lite-260215" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "volcengine", + "model": "volcengine/doubao-seed-2-0-lite-260215", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "volcengine", + "model": "volcengine/doubao-seed-2-0-lite-260215", + "mode": "chat", + "metadata": { + "source": "https://www.volcengine.com/docs/82379/1330310" + } + } + ] + }, + { + "id": "volcengine/doubao-seed-2-0-mini-260215", + "provider": "volcengine", + "model": "doubao-seed-2-0-mini-260215", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "volcengine" + ], + "aliases": [ + "volcengine/doubao-seed-2-0-mini-260215" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "volcengine", + "model": "volcengine/doubao-seed-2-0-mini-260215", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "volcengine", + "model": "volcengine/doubao-seed-2-0-mini-260215", + "mode": "chat", + "metadata": { + "source": "https://www.volcengine.com/docs/82379/1330310" + } + } + ] + }, + { + "id": "volcengine/doubao-seed-2-0-pro-260215", + "provider": "volcengine", + "model": "doubao-seed-2-0-pro-260215", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "volcengine" + ], + "aliases": [ + "volcengine/doubao-seed-2-0-pro-260215" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "volcengine", + "model": "volcengine/doubao-seed-2-0-pro-260215", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields" + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "volcengine", + "model": "volcengine/doubao-seed-2-0-pro-260215", + "mode": "chat", + "metadata": { + "source": "https://www.volcengine.com/docs/82379/1330310" + } + } + ] + }, + { + "id": "voyage/rerank-2", + "provider": "voyage", + "model": "rerank-2", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/rerank-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16000, + "inputTokens": 16000, + "maxQueryTokens": 16000, + "maxTokens": 16000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/rerank-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/rerank-2", + "mode": "rerank" + } + ] + }, + { + "id": "voyage/rerank-2-lite", + "provider": "voyage", + "model": "rerank-2-lite", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/rerank-2-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 8000, + "maxQueryTokens": 8000, + "maxTokens": 8000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/rerank-2-lite", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/rerank-2-lite", + "mode": "rerank" + } + ] + }, + { + "id": "voyage/rerank-2.5", + "provider": "voyage", + "model": "rerank-2.5", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/rerank-2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxQueryTokens": 32000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/rerank-2.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.05, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/rerank-2.5", + "mode": "rerank" + } + ] + }, + { + "id": "voyage/rerank-2.5-lite", + "provider": "voyage", + "model": "rerank-2.5-lite", + "mode": "rerank", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/rerank-2.5-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxQueryTokens": 32000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": true, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/rerank-2.5-lite", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "rerank" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/rerank-2.5-lite", + "mode": "rerank" + } + ] + }, + { + "id": "voyage/voyage-2", + "provider": "voyage", + "model": "voyage-2", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/voyage-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4000, + "inputTokens": 4000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/voyage-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/voyage-2", + "mode": "embedding" + } + ] + }, + { + "id": "voyage/voyage-3", + "provider": "voyage", + "model": "voyage-3", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/voyage-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/voyage-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/voyage-3", + "mode": "embedding" + } + ] + }, + { + "id": "voyage/voyage-3-large", + "provider": "voyage", + "model": "voyage-3-large", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/voyage-3-large" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/voyage-3-large", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.18, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/voyage-3-large", + "mode": "embedding" + } + ] + }, + { + "id": "voyage/voyage-3-lite", + "provider": "voyage", + "model": "voyage-3-lite", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/voyage-3-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/voyage-3-lite", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/voyage-3-lite", + "mode": "embedding" + } + ] + }, + { + "id": "voyage/voyage-3.5", + "provider": "voyage", + "model": "voyage-3.5", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/voyage-3.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/voyage-3.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/voyage-3.5", + "mode": "embedding" + } + ] + }, + { + "id": "voyage/voyage-3.5-lite", + "provider": "voyage", + "model": "voyage-3.5-lite", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/voyage-3.5-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/voyage-3.5-lite", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.02, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/voyage-3.5-lite", + "mode": "embedding" + } + ] + }, + { + "id": "voyage/voyage-code-2", + "provider": "voyage", + "model": "voyage-code-2", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/voyage-code-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16000, + "inputTokens": 16000, + "maxTokens": 16000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/voyage-code-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/voyage-code-2", + "mode": "embedding" + } + ] + }, + { + "id": "voyage/voyage-code-3", + "provider": "voyage", + "model": "voyage-code-3", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/voyage-code-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/voyage-code-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.18, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/voyage-code-3", + "mode": "embedding" + } + ] + }, + { + "id": "voyage/voyage-context-3", + "provider": "voyage", + "model": "voyage-context-3", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/voyage-context-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 120000, + "inputTokens": 120000, + "maxTokens": 120000, + "outputTokens": 120000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/voyage-context-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.18, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/voyage-context-3", + "mode": "embedding" + } + ] + }, + { + "id": "voyage/voyage-finance-2", + "provider": "voyage", + "model": "voyage-finance-2", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/voyage-finance-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/voyage-finance-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/voyage-finance-2", + "mode": "embedding" + } + ] + }, + { + "id": "voyage/voyage-large-2", + "provider": "voyage", + "model": "voyage-large-2", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/voyage-large-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16000, + "inputTokens": 16000, + "maxTokens": 16000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/voyage-large-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/voyage-large-2", + "mode": "embedding" + } + ] + }, + { + "id": "voyage/voyage-law-2", + "provider": "voyage", + "model": "voyage-law-2", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/voyage-law-2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 16000, + "inputTokens": 16000, + "maxTokens": 16000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/voyage-law-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/voyage-law-2", + "mode": "embedding" + } + ] + }, + { + "id": "voyage/voyage-lite-01", + "provider": "voyage", + "model": "voyage-lite-01", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/voyage-lite-01" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4096, + "inputTokens": 4096, + "maxTokens": 4096, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/voyage-lite-01", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/voyage-lite-01", + "mode": "embedding" + } + ] + }, + { + "id": "voyage/voyage-lite-02-instruct", + "provider": "voyage", + "model": "voyage-lite-02-instruct", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/voyage-lite-02-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 4000, + "inputTokens": 4000, + "maxTokens": 4000, + "outputTokens": 4000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/voyage-lite-02-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/voyage-lite-02-instruct", + "mode": "embedding" + } + ] + }, + { + "id": "voyage/voyage-multimodal-3", + "provider": "voyage", + "model": "voyage-multimodal-3", + "mode": "embedding", + "sources": [ + "litellm" + ], + "providers": [ + "voyage" + ], + "aliases": [ + "voyage/voyage-multimodal-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "maxTokens": 32000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "voyage", + "model": "voyage/voyage-multimodal-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.12, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "embedding" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "voyage", + "model": "voyage/voyage-multimodal-3", + "mode": "embedding" + } + ] + }, + { + "id": "vultr/nemotron-3-nano-omni-30b-a3b-reasoning-bf16", + "provider": "vultr", + "model": "nemotron-3-nano-omni-30b-a3b-reasoning-bf16", + "displayName": "NVIDIA Nemotron 3 Nano Omni", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "vultr" + ], + "aliases": [ + "vultr/nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vultr", + "model": "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.38 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA Nemotron 3 Nano Omni" + ], + "families": [ + "nemotron" + ], + "knowledgeCutoff": "2025-05", + "releaseDate": "2026-04-28", + "lastUpdated": "2026-04-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vultr", + "providerName": "Vultr", + "providerApi": "https://api.vultrinference.com/v1", + "providerDoc": "https://api.vultrinference.com/", + "model": "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16", + "modelKey": "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16", + "displayName": "NVIDIA Nemotron 3 Nano Omni", + "family": "nemotron", + "metadata": { + "knowledgeCutoff": "2025-05", + "lastUpdated": "2026-04-28", + "openWeights": true, + "releaseDate": "2026-04-28" + } + } + ] + }, + { + "id": "vultr/nemotron-cascade-2-30b-a3b", + "provider": "vultr", + "model": "nemotron-cascade-2-30b-a3b", + "displayName": "NVIDIA Nemotron Cascade 2", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "vultr" + ], + "aliases": [ + "vultr/nvidia/Nemotron-Cascade-2-30B-A3B" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vultr", + "model": "nvidia/Nemotron-Cascade-2-30B-A3B", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA Nemotron Cascade 2" + ], + "families": [ + "nemotron" + ], + "knowledgeCutoff": "2024-07", + "releaseDate": "2025-12-01", + "lastUpdated": "2025-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vultr", + "providerName": "Vultr", + "providerApi": "https://api.vultrinference.com/v1", + "providerDoc": "https://api.vultrinference.com/", + "model": "nvidia/Nemotron-Cascade-2-30B-A3B", + "modelKey": "nvidia/Nemotron-Cascade-2-30B-A3B", + "displayName": "NVIDIA Nemotron Cascade 2", + "family": "nemotron", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2025-12-01", + "openWeights": true, + "releaseDate": "2025-12-01" + } + } + ] + }, + { + "id": "wandb/nvidia-nemotron-3-super-120b-a12b-fp8", + "provider": "wandb", + "model": "nvidia-nemotron-3-super-120b-a12b-fp8", + "displayName": "NVIDIA Nemotron 3 Super 120B", + "family": "nemotron", + "sources": [ + "models.dev" + ], + "providers": [ + "wandb" + ], + "aliases": [ + "wandb/nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "wandb", + "model": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "NVIDIA Nemotron 3 Super 120B" + ], + "families": [ + "nemotron" + ], + "releaseDate": "2026-03-11", + "lastUpdated": "2026-03-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8", + "modelKey": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8", + "displayName": "NVIDIA Nemotron 3 Super 120B", + "family": "nemotron", + "metadata": { + "lastUpdated": "2026-03-12", + "openWeights": true, + "releaseDate": "2026-03-11" + } + } + ] + }, + { + "id": "wandb/phi-4-mini-instruct", + "provider": "wandb", + "model": "phi-4-mini-instruct", + "displayName": "Phi-4-mini-instruct", + "family": "phi", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "wandb" + ], + "aliases": [ + "wandb/microsoft/Phi-4-mini-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "wandb", + "model": "microsoft/Phi-4-mini-instruct", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.08, + "output": 0.35 + } + }, + { + "source": "litellm", + "provider": "wandb", + "model": "wandb/microsoft/Phi-4-mini-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 8000, + "output": 35000 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Phi-4-mini-instruct" + ], + "families": [ + "phi" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2024-12-11", + "lastUpdated": "2026-03-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "microsoft/Phi-4-mini-instruct", + "modelKey": "microsoft/Phi-4-mini-instruct", + "displayName": "Phi-4-mini-instruct", + "family": "phi", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2026-03-12", + "openWeights": true, + "releaseDate": "2024-12-11" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "wandb", + "model": "wandb/microsoft/Phi-4-mini-instruct", + "mode": "chat" + } + ] + }, + { + "id": "watsonx/allam-1-13b-instruct", + "provider": "watsonx", + "model": "allam-1-13b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/sdaia/allam-1-13b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/sdaia/allam-1-13b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.8, + "output": 1.8 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/sdaia/allam-1-13b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "watsonx/granite-13b-chat-v2", + "provider": "watsonx", + "model": "granite-13b-chat-v2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/ibm/granite-13b-chat-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/ibm/granite-13b-chat-v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/ibm/granite-13b-chat-v2", + "mode": "chat" + } + ] + }, + { + "id": "watsonx/granite-13b-instruct-v2", + "provider": "watsonx", + "model": "granite-13b-instruct-v2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/ibm/granite-13b-instruct-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/ibm/granite-13b-instruct-v2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 0.6 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/ibm/granite-13b-instruct-v2", + "mode": "chat" + } + ] + }, + { + "id": "watsonx/granite-3-3-8b-instruct", + "provider": "watsonx", + "model": "granite-3-3-8b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/ibm/granite-3-3-8b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/ibm/granite-3-3-8b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/ibm/granite-3-3-8b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "watsonx/granite-3-8b-instruct", + "provider": "watsonx", + "model": "granite-3-8b-instruct", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/ibm/granite-3-8b-instruct" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 1024, + "outputTokens": 1024, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "systemMessages": true, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/ibm/granite-3-8b-instruct", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/ibm/granite-3-8b-instruct", + "mode": "chat" + } + ] + }, + { + "id": "watsonx/granite-4-h-small", + "provider": "watsonx", + "model": "granite-4-h-small", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/ibm/granite-4-h-small" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 20480, + "inputTokens": 20480, + "maxTokens": 20480, + "outputTokens": 20480, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/ibm/granite-4-h-small", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.06, + "output": 0.25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/ibm/granite-4-h-small", + "mode": "chat" + } + ] + }, + { + "id": "watsonx/granite-guardian-3-2-2b", + "provider": "watsonx", + "model": "granite-guardian-3-2-2b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/ibm/granite-guardian-3-2-2b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/ibm/granite-guardian-3-2-2b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/ibm/granite-guardian-3-2-2b", + "mode": "chat" + } + ] + }, + { + "id": "watsonx/granite-guardian-3-3-8b", + "provider": "watsonx", + "model": "granite-guardian-3-3-8b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/ibm/granite-guardian-3-3-8b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/ibm/granite-guardian-3-3-8b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/ibm/granite-guardian-3-3-8b", + "mode": "chat" + } + ] + }, + { + "id": "watsonx/granite-ttm-1024-96-r2", + "provider": "watsonx", + "model": "granite-ttm-1024-96-r2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/ibm/granite-ttm-1024-96-r2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/ibm/granite-ttm-1024-96-r2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.38, + "output": 0.38 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/ibm/granite-ttm-1024-96-r2", + "mode": "chat" + } + ] + }, + { + "id": "watsonx/granite-ttm-1536-96-r2", + "provider": "watsonx", + "model": "granite-ttm-1536-96-r2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/ibm/granite-ttm-1536-96-r2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/ibm/granite-ttm-1536-96-r2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.38, + "output": 0.38 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/ibm/granite-ttm-1536-96-r2", + "mode": "chat" + } + ] + }, + { + "id": "watsonx/granite-ttm-512-96-r2", + "provider": "watsonx", + "model": "granite-ttm-512-96-r2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/ibm/granite-ttm-512-96-r2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 512, + "inputTokens": 512, + "maxTokens": 512, + "outputTokens": 512, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/ibm/granite-ttm-512-96-r2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.38, + "output": 0.38 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/ibm/granite-ttm-512-96-r2", + "mode": "chat" + } + ] + }, + { + "id": "watsonx/granite-vision-3-2-2b", + "provider": "watsonx", + "model": "granite-vision-3-2-2b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/ibm/granite-vision-3-2-2b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/ibm/granite-vision-3-2-2b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/ibm/granite-vision-3-2-2b", + "mode": "chat" + } + ] + }, + { + "id": "watsonx/jais-13b-chat", + "provider": "watsonx", + "model": "jais-13b-chat", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/core42/jais-13b-chat" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/core42/jais-13b-chat", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 500, + "output": 2000 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/core42/jais-13b-chat", + "mode": "chat" + } + ] + }, + { + "id": "watsonx/mt0-xxl-13b", + "provider": "watsonx", + "model": "mt0-xxl-13b", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "watsonx" + ], + "aliases": [ + "watsonx/bigscience/mt0-xxl-13b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "vision": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "watsonx", + "model": "watsonx/bigscience/mt0-xxl-13b", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 500, + "output": 2000 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "watsonx", + "model": "watsonx/bigscience/mt0-xxl-13b", + "mode": "chat" + } + ] + }, + { + "id": "x-ai/grok-2", + "provider": "x-ai", + "model": "grok-2", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vercel_ai_gateway", + "xai" + ], + "aliases": [ + "vercel_ai_gateway/xai/grok-2", + "xai/grok-2" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/xai/grok-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-2", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 10 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/xai/grok-2", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-2", + "mode": "chat" + } + ] + }, + { + "id": "x-ai/grok-2-1212", + "provider": "x-ai", + "model": "grok-2-1212", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-2-1212" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-2-1212", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 10 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-2-1212", + "mode": "chat" + } + ] + }, + { + "id": "x-ai/grok-2-latest", + "provider": "x-ai", + "model": "grok-2-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-2-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-2-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 10 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-2-latest", + "mode": "chat" + } + ] + }, + { + "id": "x-ai/grok-2-vision", + "provider": "x-ai", + "model": "grok-2-vision", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vercel_ai_gateway", + "xai" + ], + "aliases": [ + "vercel_ai_gateway/xai/grok-2-vision", + "xai/grok-2-vision" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "supports1MContext": false, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/xai/grok-2-vision", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 10 + } + }, + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-2-vision", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 10 + }, + "perImage": { + "input": 0.000002 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/xai/grok-2-vision", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-2-vision", + "mode": "chat" + } + ] + }, + { + "id": "x-ai/grok-2-vision-1212", + "provider": "x-ai", + "model": "grok-2-vision-1212", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-2-vision-1212" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-2-vision-1212", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 10 + }, + "perImage": { + "input": 0.000002 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2026-02-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-2-vision-1212", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-02-28" + } + } + ] + }, + { + "id": "x-ai/grok-2-vision-latest", + "provider": "x-ai", + "model": "grok-2-vision-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-2-vision-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32768, + "inputTokens": 32768, + "maxTokens": 32768, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-2-vision-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2, + "output": 10 + }, + "perImage": { + "input": 0.000002 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-2-vision-latest", + "mode": "chat" + } + ] + }, + { + "id": "x-ai/grok-3", + "provider": "x-ai", + "model": "grok-3", + "displayName": "Grok 3", + "family": "grok", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure_ai", + "github-models", + "helicone", + "poe", + "vercel_ai_gateway", + "xai" + ], + "aliases": [ + "azure_ai/global/grok-3", + "azure_ai/grok-3", + "github-models/xai/grok-3", + "helicone/grok-3", + "poe/xai/grok-3", + "vercel_ai_gateway/xai/grok-3", + "xai/grok-3" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "webSearch": true, + "promptCaching": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "xai/grok-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "grok-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "xai/grok-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/global/grok-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/grok-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/xai/grok-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 3", + "xAI Grok 3" + ], + "families": [ + "grok" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-12-09", + "lastUpdated": "2024-12-09", + "deprecationDate": "2026-05-15", + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "xai/grok-3", + "modelKey": "xai/grok-3", + "displayName": "Grok 3", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-12-09", + "openWeights": false, + "releaseDate": "2024-12-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "grok-3", + "modelKey": "grok-3", + "displayName": "xAI Grok 3", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2024-06-01", + "openWeights": false, + "releaseDate": "2024-06-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "xai/grok-3", + "modelKey": "xai/grok-3", + "displayName": "Grok 3", + "family": "grok", + "metadata": { + "lastUpdated": "2025-04-11", + "openWeights": false, + "releaseDate": "2025-04-11" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/global/grok-3", + "mode": "chat", + "metadata": { + "source": "https://devblogs.microsoft.com/foundry/announcing-grok-3-and-grok-3-mini-on-azure-ai-foundry/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/grok-3", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/ai-foundry-models/grok/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/xai/grok-3", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-3", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-15", + "source": "https://x.ai/api#pricing" + } + } + ] + }, + { + "id": "x-ai/grok-3-beta", + "provider": "x-ai", + "model": "grok-3-beta", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-3-beta" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "responseSchema": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-3-beta", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-3-beta", + "mode": "chat", + "metadata": { + "source": "https://x.ai/api#pricing" + } + } + ] + }, + { + "id": "x-ai/grok-3-fast", + "provider": "x-ai", + "model": "grok-3-fast", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vercel_ai_gateway" + ], + "aliases": [ + "vercel_ai_gateway/xai/grok-3-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/xai/grok-3-fast", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/xai/grok-3-fast", + "mode": "chat" + } + ] + }, + { + "id": "x-ai/grok-3-fast-beta", + "provider": "x-ai", + "model": "grok-3-fast-beta", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-3-fast-beta" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "responseSchema": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-3-fast-beta", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-3-fast-beta", + "mode": "chat", + "metadata": { + "source": "https://x.ai/api#pricing" + } + } + ] + }, + { + "id": "x-ai/grok-3-fast-latest", + "provider": "x-ai", + "model": "grok-3-fast-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-3-fast-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "responseSchema": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-3-fast-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 1.25, + "input": 5, + "output": 25 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-3-fast-latest", + "mode": "chat", + "metadata": { + "source": "https://x.ai/api#pricing" + } + } + ] + }, + { + "id": "x-ai/grok-3-latest", + "provider": "x-ai", + "model": "grok-3-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-3-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "responseSchema": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-3-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.75, + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-3-latest", + "mode": "chat", + "metadata": { + "source": "https://x.ai/api#pricing" + } + } + ] + }, + { + "id": "x-ai/grok-3-mini", + "provider": "x-ai", + "model": "grok-3-mini", + "displayName": "Grok 3 Mini", + "family": "grok", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure_ai", + "github-models", + "helicone", + "poe", + "vercel_ai_gateway", + "xai" + ], + "aliases": [ + "azure_ai/global/grok-3-mini", + "azure_ai/grok-3-mini", + "github-models/xai/grok-3-mini", + "helicone/grok-3-mini", + "poe/xai/grok-3-mini", + "vercel_ai_gateway/xai/grok-3-mini", + "xai/grok-3-mini" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "webSearch": true, + "promptCaching": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "github-models", + "model": "xai/grok-3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "grok-3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "xai/grok-3-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/global/grok-3-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 1.27 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/grok-3-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.25, + "output": 1.27 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/xai/grok-3-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.3, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-3-mini", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 3 Mini", + "xAI Grok 3 Mini" + ], + "families": [ + "grok" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2024-12-09", + "lastUpdated": "2024-12-09", + "deprecationDate": "2026-02-28", + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "github-models", + "providerName": "GitHub Models", + "providerApi": "https://models.github.ai/inference", + "providerDoc": "https://docs.github.com/en/github-models", + "model": "xai/grok-3-mini", + "modelKey": "xai/grok-3-mini", + "displayName": "Grok 3 Mini", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-12-09", + "openWeights": false, + "releaseDate": "2024-12-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "grok-3-mini", + "modelKey": "grok-3-mini", + "displayName": "xAI Grok 3 Mini", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2024-06", + "lastUpdated": "2024-06-01", + "openWeights": false, + "releaseDate": "2024-06-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "xai/grok-3-mini", + "modelKey": "xai/grok-3-mini", + "displayName": "Grok 3 Mini", + "family": "grok", + "metadata": { + "lastUpdated": "2025-04-11", + "openWeights": false, + "releaseDate": "2025-04-11" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/global/grok-3-mini", + "mode": "chat", + "metadata": { + "source": "https://devblogs.microsoft.com/foundry/announcing-grok-3-and-grok-3-mini-on-azure-ai-foundry/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/grok-3-mini", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/ai-foundry-models/grok/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/xai/grok-3-mini", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-3-mini", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-02-28", + "source": "https://x.ai/api#pricing" + } + } + ] + }, + { + "id": "x-ai/grok-3-mini-beta", + "provider": "x-ai", + "model": "grok-3-mini-beta", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-3-mini-beta" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-3-mini-beta", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3, + "output": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2026-02-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-3-mini-beta", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-02-28", + "source": "https://x.ai/api#pricing" + } + } + ] + }, + { + "id": "x-ai/grok-3-mini-fast", + "provider": "x-ai", + "model": "grok-3-mini-fast", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "vercel_ai_gateway", + "xai" + ], + "aliases": [ + "vercel_ai_gateway/xai/grok-3-mini-fast", + "xai/grok-3-mini-fast" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false, + "promptCaching": true, + "reasoning": true, + "responseSchema": false, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/xai/grok-3-mini-fast", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 4 + } + }, + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-3-mini-fast", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/xai/grok-3-mini-fast", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-3-mini-fast", + "mode": "chat", + "metadata": { + "source": "https://x.ai/api#pricing" + } + } + ] + }, + { + "id": "x-ai/grok-3-mini-fast-beta", + "provider": "x-ai", + "model": "grok-3-mini-fast-beta", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-3-mini-fast-beta" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-3-mini-fast-beta", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-3-mini-fast-beta", + "mode": "chat", + "metadata": { + "source": "https://x.ai/api#pricing" + } + } + ] + }, + { + "id": "x-ai/grok-3-mini-fast-latest", + "provider": "x-ai", + "model": "grok-3-mini-fast-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-3-mini-fast-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-3-mini-fast-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.6, + "output": 4 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-3-mini-fast-latest", + "mode": "chat", + "metadata": { + "source": "https://x.ai/api#pricing" + } + } + ] + }, + { + "id": "x-ai/grok-3-mini-latest", + "provider": "x-ai", + "model": "grok-3-mini-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-3-mini-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-3-mini-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.075, + "input": 0.3, + "output": 0.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-3-mini-latest", + "mode": "chat", + "metadata": { + "source": "https://x.ai/api#pricing" + } + } + ] + }, + { + "id": "x-ai/grok-4", + "provider": "x-ai", + "model": "grok-4", + "displayName": "Grok 4", + "family": "grok", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "azure_ai", + "fastrouter", + "helicone", + "openrouter", + "poe", + "replicate", + "requesty", + "vercel_ai_gateway", + "xai", + "zenmux" + ], + "aliases": [ + "azure_ai/grok-4", + "fastrouter/x-ai/grok-4", + "helicone/grok-4", + "openrouter/x-ai/grok-4", + "poe/xai/grok-4", + "replicate/xai/grok-4", + "requesty/xai/grok-4", + "vercel_ai_gateway/xai/grok-4", + "xai/grok-4", + "zenmux/x-ai/grok-4" + ], + "mergedProviderModelRecords": 10, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "webSearch": true, + "systemMessages": true, + "promptCaching": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fastrouter", + "model": "x-ai/grok-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.75, + "cacheWrite": 15, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "grok-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "xai/grok-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.75, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "requesty", + "model": "xai/grok-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.75, + "cacheWrite": 3, + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "x-ai/grok-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.75, + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/grok-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/x-ai/grok-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "replicate", + "model": "replicate/xai/grok-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 7.2, + "output": 36 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/xai/grok-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-4", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4", + "Grok-4", + "xAI Grok 4" + ], + "families": [ + "grok" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-07", + "releaseDate": "2025-07-09", + "lastUpdated": "2025-07-09", + "providerModelRecordCount": 10 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "x-ai/grok-4", + "modelKey": "x-ai/grok-4", + "displayName": "Grok 4", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2025-07-09", + "openWeights": false, + "releaseDate": "2025-07-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "grok-4", + "modelKey": "grok-4", + "displayName": "xAI Grok 4", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2024-07-09", + "openWeights": false, + "releaseDate": "2024-07-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "xai/grok-4", + "modelKey": "xai/grok-4", + "displayName": "Grok-4", + "family": "grok", + "metadata": { + "lastUpdated": "2025-07-10", + "openWeights": false, + "releaseDate": "2025-07-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "xai/grok-4", + "modelKey": "xai/grok-4", + "displayName": "Grok 4", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-09-09", + "openWeights": false, + "releaseDate": "2025-09-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "x-ai/grok-4", + "modelKey": "x-ai/grok-4", + "displayName": "Grok 4", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-07-09", + "openWeights": false, + "releaseDate": "2025-07-09" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/grok-4", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/ai-foundry-models/grok/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/x-ai/grok-4", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/x-ai/grok-4" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "replicate", + "model": "replicate/xai/grok-4", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/xai/grok-4", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-4", + "mode": "chat", + "metadata": { + "source": "https://docs.x.ai/docs/models" + } + } + ] + }, + { + "id": "x-ai/grok-4-0709", + "provider": "x-ai", + "model": "grok-4-0709", + "displayName": "Grok 4", + "family": "grok", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "abacus", + "jiekou", + "llmgateway", + "xai" + ], + "aliases": [ + "abacus/grok-4-0709", + "jiekou/grok-4-0709", + "llmgateway/grok-4-0709", + "xai/grok-4-0709" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "grok-4-0709", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "grok-4-0709", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.7, + "output": 13.5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "grok-4-0709", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 15 + } + }, + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-4-0709", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + }, + "extra": { + "input_cost_per_token_above_128k_tokens": 0.000006, + "output_cost_per_token_above_128k_tokens": 0.00003 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4", + "Grok 4 (0709)", + "grok-4-0709" + ], + "families": [ + "grok" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-07-09", + "lastUpdated": "2025-07-09", + "deprecationDate": "2026-05-15", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "grok-4-0709", + "modelKey": "grok-4-0709", + "displayName": "Grok 4", + "family": "grok", + "metadata": { + "lastUpdated": "2025-07-09", + "openWeights": false, + "releaseDate": "2025-07-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "grok-4-0709", + "modelKey": "grok-4-0709", + "displayName": "grok-4-0709", + "family": "grok", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "grok-4-0709", + "modelKey": "grok-4-0709", + "displayName": "Grok 4 (0709)", + "family": "grok", + "metadata": { + "lastUpdated": "2025-07-09", + "openWeights": false, + "releaseDate": "2025-07-09" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-4-0709", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-15", + "source": "https://docs.x.ai/docs/models" + } + } + ] + }, + { + "id": "x-ai/grok-4-1-fast", + "provider": "x-ai", + "model": "grok-4-1-fast", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-4-1-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "maxTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-4-1-fast", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + }, + "extra": { + "input_cost_per_token_above_128k_tokens": 4e-7, + "output_cost_per_token_above_128k_tokens": 0.000001 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-4-1-fast", + "mode": "chat", + "metadata": { + "source": "https://docs.x.ai/docs/models/grok-4-1-fast-reasoning" + } + } + ] + }, + { + "id": "x-ai/grok-4-1-fast-non-reasoning", + "provider": "x-ai", + "model": "grok-4-1-fast-non-reasoning", + "displayName": "grok-4-1-fast-non-reasoning", + "family": "grok", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "abacus", + "azure", + "azure_ai", + "frogbot", + "helicone", + "jiekou", + "perplexity-agent", + "xai" + ], + "aliases": [ + "302ai/grok-4-1-fast-non-reasoning", + "abacus/grok-4-1-fast-non-reasoning", + "azure/grok-4-1-fast-non-reasoning", + "azure_ai/grok-4-1-fast-non-reasoning", + "frogbot/grok-4-1-fast-non-reasoning", + "helicone/grok-4-1-fast-non-reasoning", + "jiekou/grok-4-1-fast-non-reasoning", + "perplexity-agent/xai/grok-4-1-fast-non-reasoning", + "xai/grok-4-1-fast-non-reasoning" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "maxTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "webSearch": true, + "promptCaching": true, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "grok-4-1-fast-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "grok-4-1-fast-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "grok-4-1-fast-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "frogbot", + "model": "grok-4-1-fast-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "grok-4-1-fast-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.049999999999999996, + "input": 0.19999999999999998, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "grok-4-1-fast-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.45 + } + }, + { + "source": "models.dev", + "provider": "perplexity-agent", + "model": "xai/grok-4-1-fast-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/grok-4-1-fast-non-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-4-1-fast-non-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + }, + "extra": { + "input_cost_per_token_above_128k_tokens": 4e-7, + "output_cost_per_token_above_128k_tokens": 0.000001 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.1 Fast (Non-Reasoning)", + "grok-4-1-fast-non-reasoning", + "xAI Grok 4.1 Fast Non-Reasoning" + ], + "families": [ + "grok" + ], + "modes": [ + "chat" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2025-11-20", + "lastUpdated": "2025-11-20", + "deprecationDate": "2026-05-15", + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "grok-4-1-fast-non-reasoning", + "modelKey": "grok-4-1-fast-non-reasoning", + "displayName": "grok-4-1-fast-non-reasoning", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-11-20", + "openWeights": false, + "releaseDate": "2025-11-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "grok-4-1-fast-non-reasoning", + "modelKey": "grok-4-1-fast-non-reasoning", + "displayName": "Grok 4.1 Fast (Non-Reasoning)", + "family": "grok", + "metadata": { + "lastUpdated": "2025-11-17", + "openWeights": false, + "releaseDate": "2025-11-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "grok-4-1-fast-non-reasoning", + "modelKey": "grok-4-1-fast-non-reasoning", + "displayName": "Grok 4.1 Fast (Non-Reasoning)", + "family": "grok", + "status": "beta", + "metadata": { + "lastUpdated": "2025-06-27", + "openWeights": false, + "releaseDate": "2025-06-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "grok-4-1-fast-non-reasoning", + "modelKey": "grok-4-1-fast-non-reasoning", + "displayName": "Grok 4.1 Fast (Non-Reasoning)", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2025-11", + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-11-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "grok-4-1-fast-non-reasoning", + "modelKey": "grok-4-1-fast-non-reasoning", + "displayName": "xAI Grok 4.1 Fast Non-Reasoning", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2025-11", + "lastUpdated": "2025-11-17", + "openWeights": false, + "releaseDate": "2025-11-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "grok-4-1-fast-non-reasoning", + "modelKey": "grok-4-1-fast-non-reasoning", + "displayName": "grok-4-1-fast-non-reasoning", + "family": "grok", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "perplexity-agent", + "providerName": "Perplexity Agent", + "providerApi": "https://api.perplexity.ai/v1", + "providerDoc": "https://docs.perplexity.ai/docs/agent-api/models", + "model": "xai/grok-4-1-fast-non-reasoning", + "modelKey": "xai/grok-4-1-fast-non-reasoning", + "displayName": "Grok 4.1 Fast (Non-Reasoning)", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2025-11-19", + "openWeights": false, + "releaseDate": "2025-11-19" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/grok-4-1-fast-non-reasoning", + "mode": "chat", + "metadata": { + "source": "https://techcommunity.microsoft.com/t5/Azure-AI-Foundry-Blog/Grok-4-0-Goes-GA-in-Microsoft-Foundry-and-Grok-4-1-Fast-Arrives/ba-p/4497964" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-4-1-fast-non-reasoning", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-15", + "source": "https://docs.x.ai/docs/models/grok-4-1-fast-non-reasoning" + } + } + ] + }, + { + "id": "x-ai/grok-4-1-fast-non-reasoning-latest", + "provider": "x-ai", + "model": "grok-4-1-fast-non-reasoning-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-4-1-fast-non-reasoning-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "maxTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-4-1-fast-non-reasoning-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + }, + "extra": { + "input_cost_per_token_above_128k_tokens": 4e-7, + "output_cost_per_token_above_128k_tokens": 0.000001 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2026-05-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-4-1-fast-non-reasoning-latest", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-15", + "source": "https://docs.x.ai/docs/models/grok-4-1-fast-non-reasoning" + } + } + ] + }, + { + "id": "x-ai/grok-4-1-fast-reasoning", + "provider": "x-ai", + "model": "grok-4-1-fast-reasoning", + "displayName": "grok-4-1-fast-reasoning", + "family": "grok", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "azure", + "azure_ai", + "frogbot", + "helicone", + "jiekou", + "llmgateway", + "xai" + ], + "aliases": [ + "302ai/grok-4-1-fast-reasoning", + "azure/grok-4-1-fast-reasoning", + "azure_ai/grok-4-1-fast-reasoning", + "frogbot/grok-4-1-fast-reasoning", + "helicone/grok-4-1-fast-reasoning", + "jiekou/grok-4-1-fast-reasoning", + "llmgateway/grok-4-1-fast-reasoning", + "xai/grok-4-1-fast-reasoning" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "maxTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "webSearch": true, + "promptCaching": true, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "grok-4-1-fast-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "grok-4-1-fast-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "frogbot", + "model": "grok-4-1-fast-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "grok-4-1-fast-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.049999999999999996, + "input": 0.19999999999999998, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "grok-4-1-fast-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.45 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "grok-4-1-fast-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/grok-4-1-fast-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-4-1-fast-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + }, + "extra": { + "input_cost_per_token_above_128k_tokens": 4e-7, + "output_cost_per_token_above_128k_tokens": 0.000001 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.1 Fast (Reasoning)", + "Grok 4.1 Fast Reasoning", + "grok-4-1-fast-reasoning", + "xAI Grok 4.1 Fast Reasoning" + ], + "families": [ + "grok" + ], + "modes": [ + "chat" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2025-11-20", + "lastUpdated": "2025-11-20", + "deprecationDate": "2026-05-15", + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "grok-4-1-fast-reasoning", + "modelKey": "grok-4-1-fast-reasoning", + "displayName": "grok-4-1-fast-reasoning", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-11-20", + "openWeights": false, + "releaseDate": "2025-11-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "grok-4-1-fast-reasoning", + "modelKey": "grok-4-1-fast-reasoning", + "displayName": "Grok 4.1 Fast (Reasoning)", + "family": "grok", + "status": "beta", + "metadata": { + "lastUpdated": "2025-06-27", + "openWeights": false, + "releaseDate": "2025-06-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "grok-4-1-fast-reasoning", + "modelKey": "grok-4-1-fast-reasoning", + "displayName": "Grok 4.1 Fast (Reasoning)", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2025-11", + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-11-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "grok-4-1-fast-reasoning", + "modelKey": "grok-4-1-fast-reasoning", + "displayName": "xAI Grok 4.1 Fast Reasoning", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2025-11", + "lastUpdated": "2025-11-17", + "openWeights": false, + "releaseDate": "2025-11-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "grok-4-1-fast-reasoning", + "modelKey": "grok-4-1-fast-reasoning", + "displayName": "grok-4-1-fast-reasoning", + "family": "grok", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "grok-4-1-fast-reasoning", + "modelKey": "grok-4-1-fast-reasoning", + "displayName": "Grok 4.1 Fast Reasoning", + "family": "grok", + "metadata": { + "lastUpdated": "2025-11-19", + "openWeights": false, + "releaseDate": "2025-11-19", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/grok-4-1-fast-reasoning", + "mode": "chat", + "metadata": { + "source": "https://techcommunity.microsoft.com/t5/Azure-AI-Foundry-Blog/Grok-4-0-Goes-GA-in-Microsoft-Foundry-and-Grok-4-1-Fast-Arrives/ba-p/4497964" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-4-1-fast-reasoning", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-15", + "source": "https://docs.x.ai/docs/models/grok-4-1-fast-reasoning" + } + } + ] + }, + { + "id": "x-ai/grok-4-1-fast-reasoning-latest", + "provider": "x-ai", + "model": "grok-4-1-fast-reasoning-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-4-1-fast-reasoning-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "maxTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": true, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-4-1-fast-reasoning-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + }, + "extra": { + "input_cost_per_token_above_128k_tokens": 4e-7, + "output_cost_per_token_above_128k_tokens": 0.000001 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2026-05-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-4-1-fast-reasoning-latest", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-15", + "source": "https://docs.x.ai/docs/models/grok-4-1-fast-reasoning" + } + } + ] + }, + { + "id": "x-ai/grok-4-20", + "provider": "x-ai", + "model": "grok-4-20", + "displayName": "Grok 4.20", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/grok-4-20" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "grok-4-20", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.23, + "input": 1.42, + "output": 2.83 + }, + "tiered": { + "contextOver200K": { + "input": 2.83, + "output": 5.67, + "cache_read": 0.45 + }, + "tiers": [ + { + "input": 2.83, + "output": 5.67, + "cache_read": 0.45, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.20" + ], + "families": [ + "grok" + ], + "releaseDate": "2026-03-12", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "grok-4-20", + "modelKey": "grok-4-20", + "displayName": "Grok 4.20", + "family": "grok", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-03-12" + } + } + ] + }, + { + "id": "x-ai/grok-4-20-beta-0309-non-reasoning", + "provider": "x-ai", + "model": "grok-4-20-beta-0309-non-reasoning", + "displayName": "Grok 4.20 (Non-Reasoning)", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/grok-4-20-beta-0309-non-reasoning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 30000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "grok-4-20-beta-0309-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 5, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2.5, + "output": 5, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.20 (Non-Reasoning)" + ], + "families": [ + "grok" + ], + "releaseDate": "2026-03-09", + "lastUpdated": "2026-03-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "grok-4-20-beta-0309-non-reasoning", + "modelKey": "grok-4-20-beta-0309-non-reasoning", + "displayName": "Grok 4.20 (Non-Reasoning)", + "family": "grok", + "metadata": { + "lastUpdated": "2026-03-09", + "openWeights": false, + "releaseDate": "2026-03-09" + } + } + ] + }, + { + "id": "x-ai/grok-4-20-beta-0309-reasoning", + "provider": "x-ai", + "model": "grok-4-20-beta-0309-reasoning", + "displayName": "Grok 4.20 (Reasoning)", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/grok-4-20-beta-0309-reasoning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 30000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "grok-4-20-beta-0309-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 5, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2.5, + "output": 5, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.20 (Reasoning)" + ], + "families": [ + "grok" + ], + "releaseDate": "2026-03-09", + "lastUpdated": "2026-03-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "grok-4-20-beta-0309-reasoning", + "modelKey": "grok-4-20-beta-0309-reasoning", + "displayName": "Grok 4.20 (Reasoning)", + "family": "grok", + "metadata": { + "lastUpdated": "2026-03-09", + "openWeights": false, + "releaseDate": "2026-03-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "x-ai/grok-4-20-multi-agent", + "provider": "x-ai", + "model": "grok-4-20-multi-agent", + "displayName": "Grok 4.20 Multi-Agent", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "venice" + ], + "aliases": [ + "venice/grok-4-20-multi-agent" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "venice", + "model": "grok-4-20-multi-agent", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.23, + "input": 1.42, + "output": 2.83 + }, + "tiered": { + "contextOver200K": { + "input": 2.83, + "output": 5.67, + "cache_read": 0.45 + }, + "tiers": [ + { + "input": 2.83, + "output": 5.67, + "cache_read": 0.45, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.20 Multi-Agent" + ], + "families": [ + "grok" + ], + "releaseDate": "2026-03-12", + "lastUpdated": "2026-06-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "grok-4-20-multi-agent", + "modelKey": "grok-4-20-multi-agent", + "displayName": "Grok 4.20 Multi-Agent", + "family": "grok", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-03-12" + } + } + ] + }, + { + "id": "x-ai/grok-4-20-non-reasoning", + "provider": "x-ai", + "model": "grok-4-20-non-reasoning", + "displayName": "Grok 4.20 (Non-Reasoning)", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "azure", + "llmgateway" + ], + "aliases": [ + "azure/grok-4-20-non-reasoning", + "llmgateway/grok-4-20-non-reasoning" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1000000, + "outputTokens": 30000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "grok-4-20-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "grok-4-20-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 5, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2.5, + "output": 5, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.20 (Non-Reasoning)" + ], + "families": [ + "grok" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2025-09", + "releaseDate": "2026-04-08", + "lastUpdated": "2026-04-08", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "grok-4-20-non-reasoning", + "modelKey": "grok-4-20-non-reasoning", + "displayName": "Grok 4.20 (Non-Reasoning)", + "family": "grok", + "status": "beta", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2026-04-08", + "openWeights": false, + "releaseDate": "2026-04-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "grok-4-20-non-reasoning", + "modelKey": "grok-4-20-non-reasoning", + "displayName": "Grok 4.20 (Non-Reasoning)", + "family": "grok", + "metadata": { + "lastUpdated": "2026-03-09", + "openWeights": false, + "releaseDate": "2026-03-09" + } + } + ] + }, + { + "id": "x-ai/grok-4-20-reasoning", + "provider": "x-ai", + "model": "grok-4-20-reasoning", + "displayName": "Grok 4.20 (Reasoning)", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "azure", + "llmgateway" + ], + "aliases": [ + "azure/grok-4-20-reasoning", + "llmgateway/grok-4-20-reasoning" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1000000, + "outputTokens": 30000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "azure", + "model": "grok-4-20-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "grok-4-20-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 5, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2.5, + "output": 5, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.20 (Reasoning)" + ], + "families": [ + "grok" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2025-09", + "releaseDate": "2026-04-08", + "lastUpdated": "2026-04-08", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "grok-4-20-reasoning", + "modelKey": "grok-4-20-reasoning", + "displayName": "Grok 4.20 (Reasoning)", + "family": "grok", + "status": "beta", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2026-04-08", + "openWeights": false, + "releaseDate": "2026-04-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "grok-4-20-reasoning", + "modelKey": "grok-4-20-reasoning", + "displayName": "Grok 4.20 (Reasoning)", + "family": "grok", + "metadata": { + "lastUpdated": "2026-03-09", + "openWeights": false, + "releaseDate": "2026-03-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "x-ai/grok-4-3", + "provider": "x-ai", + "model": "grok-4-3", + "displayName": "Grok 4.3", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "frogbot", + "llmgateway", + "venice" + ], + "aliases": [ + "frogbot/grok-4-3", + "llmgateway/grok-4-3", + "venice/grok-4-3" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "frogbot", + "model": "grok-4-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "grok-4-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 5, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2.5, + "output": 5, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "grok-4-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.23, + "input": 1.42, + "output": 2.83 + }, + "tiered": { + "contextOver200K": { + "input": 2.83, + "output": 5.67, + "cache_read": 0.45 + }, + "tiers": [ + { + "input": 2.83, + "output": 5.67, + "cache_read": 0.45, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.3" + ], + "families": [ + "grok" + ], + "knowledgeCutoff": "2024-11", + "releaseDate": "2026-04-30", + "lastUpdated": "2026-04-30", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "grok-4-3", + "modelKey": "grok-4-3", + "displayName": "Grok 4.3", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2024-11", + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "grok-4-3", + "modelKey": "grok-4-3", + "displayName": "Grok 4.3", + "family": "grok", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": false, + "releaseDate": "2026-04-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "grok-4-3", + "modelKey": "grok-4-3", + "displayName": "Grok 4.3", + "family": "grok", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-04-18" + } + } + ] + }, + { + "id": "x-ai/grok-4-fast", + "provider": "x-ai", + "model": "grok-4-fast", + "displayName": "Grok 4 Fast", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai", + "requesty", + "zenmux" + ], + "aliases": [ + "qiniu-ai/x-ai/grok-4-fast", + "requesty/xai/grok-4-fast", + "zenmux/x-ai/grok-4-fast" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "requesty", + "model": "xai/grok-4-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0.2, + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "x-ai/grok-4-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4 Fast", + "x-AI/Grok-4-Fast" + ], + "families": [ + "grok" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2025-09-20", + "lastUpdated": "2025-09-20", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "x-ai/grok-4-fast", + "modelKey": "x-ai/grok-4-fast", + "displayName": "x-AI/Grok-4-Fast", + "metadata": { + "lastUpdated": "2025-09-20", + "openWeights": false, + "releaseDate": "2025-09-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "requesty", + "providerName": "Requesty", + "providerApi": "https://router.requesty.ai/v1", + "providerDoc": "https://requesty.ai/solution/llm-routing/models", + "model": "xai/grok-4-fast", + "modelKey": "xai/grok-4-fast", + "displayName": "Grok 4 Fast", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2025-09-19", + "openWeights": false, + "releaseDate": "2025-09-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "x-ai/grok-4-fast", + "modelKey": "x-ai/grok-4-fast", + "displayName": "Grok 4 Fast", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-09-19", + "openWeights": false, + "releaseDate": "2025-09-19", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "x-ai/grok-4-fast-non-reasoning", + "provider": "x-ai", + "model": "grok-4-fast-non-reasoning", + "displayName": "grok-4-fast-non-reasoning", + "family": "grok", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "abacus", + "azure_ai", + "helicone", + "jiekou", + "poe", + "qiniu-ai", + "xai" + ], + "aliases": [ + "302ai/grok-4-fast-non-reasoning", + "abacus/grok-4-fast-non-reasoning", + "azure_ai/grok-4-fast-non-reasoning", + "helicone/grok-4-fast-non-reasoning", + "jiekou/grok-4-fast-non-reasoning", + "poe/xai/grok-4-fast-non-reasoning", + "qiniu-ai/x-ai/grok-4-fast-non-reasoning", + "xai/grok-4-fast-non-reasoning" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "maxTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "structuredOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "webSearch": true, + "promptCaching": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "grok-4-fast-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "grok-4-fast-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "grok-4-fast-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.049999999999999996, + "input": 0.19999999999999998, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "grok-4-fast-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.45 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "xai/grok-4-fast-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/grok-4-fast-non-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-4-fast-non-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + }, + "extra": { + "input_cost_per_token_above_128k_tokens": 4e-7, + "output_cost_per_token_above_128k_tokens": 0.000001 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4 Fast (Non-Reasoning)", + "Grok-4-Fast-Non-Reasoning", + "X-Ai/Grok-4-Fast-Non-Reasoning", + "grok-4-fast-non-reasoning", + "xAI Grok 4 Fast Non-Reasoning" + ], + "families": [ + "grok" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2025-09-23", + "lastUpdated": "2025-09-23", + "deprecationDate": "2026-05-15", + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "grok-4-fast-non-reasoning", + "modelKey": "grok-4-fast-non-reasoning", + "displayName": "grok-4-fast-non-reasoning", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-09-23", + "openWeights": false, + "releaseDate": "2025-09-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "grok-4-fast-non-reasoning", + "modelKey": "grok-4-fast-non-reasoning", + "displayName": "Grok 4 Fast (Non-Reasoning)", + "family": "grok", + "metadata": { + "lastUpdated": "2025-07-09", + "openWeights": false, + "releaseDate": "2025-07-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "grok-4-fast-non-reasoning", + "modelKey": "grok-4-fast-non-reasoning", + "displayName": "xAI Grok 4 Fast Non-Reasoning", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2025-09-19", + "openWeights": false, + "releaseDate": "2025-09-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "grok-4-fast-non-reasoning", + "modelKey": "grok-4-fast-non-reasoning", + "displayName": "grok-4-fast-non-reasoning", + "family": "grok", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "xai/grok-4-fast-non-reasoning", + "modelKey": "xai/grok-4-fast-non-reasoning", + "displayName": "Grok-4-Fast-Non-Reasoning", + "family": "grok", + "metadata": { + "lastUpdated": "2025-09-16", + "openWeights": false, + "releaseDate": "2025-09-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "x-ai/grok-4-fast-non-reasoning", + "modelKey": "x-ai/grok-4-fast-non-reasoning", + "displayName": "X-Ai/Grok-4-Fast-Non-Reasoning", + "metadata": { + "lastUpdated": "2025-12-18", + "openWeights": false, + "releaseDate": "2025-12-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/grok-4-fast-non-reasoning", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-4-fast-non-reasoning", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-15", + "source": "https://docs.x.ai/docs/models" + } + } + ] + }, + { + "id": "x-ai/grok-4-fast-reasoning", + "provider": "x-ai", + "model": "grok-4-fast-reasoning", + "displayName": "grok-4-fast-reasoning", + "family": "grok", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "azure", + "azure-cognitive-services", + "azure_ai", + "helicone", + "jiekou", + "llmgateway", + "poe", + "qiniu-ai", + "xai" + ], + "aliases": [ + "302ai/grok-4-fast-reasoning", + "azure-cognitive-services/grok-4-fast-reasoning", + "azure/grok-4-fast-reasoning", + "azure_ai/grok-4-fast-reasoning", + "helicone/grok-4-fast-reasoning", + "jiekou/grok-4-fast-reasoning", + "llmgateway/grok-4-fast-reasoning", + "poe/xai/grok-4-fast-reasoning", + "qiniu-ai/x-ai/grok-4-fast-reasoning", + "xai/grok-4-fast-reasoning" + ], + "mergedProviderModelRecords": 10, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "maxTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "structuredOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "webSearch": true, + "promptCaching": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "grok-4-fast-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "azure-cognitive-services", + "model": "grok-4-fast-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "azure", + "model": "grok-4-fast-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "grok-4-fast-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.049999999999999996, + "input": 0.19999999999999998, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "grok-4-fast-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 0.45 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "grok-4-fast-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "xai/grok-4-fast-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/grok-4-fast-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-4-fast-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + }, + "extra": { + "input_cost_per_token_above_128k_tokens": 4e-7, + "output_cost_per_token_above_128k_tokens": 0.000001 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4 Fast (Reasoning)", + "Grok 4 Fast Reasoning", + "Grok-4-Fast-Reasoning", + "X-Ai/Grok-4-Fast-Reasoning", + "grok-4-fast-reasoning", + "xAI: Grok 4 Fast Reasoning" + ], + "families": [ + "grok" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2025-09-23", + "lastUpdated": "2025-09-23", + "deprecationDate": "2026-05-15", + "providerModelRecordCount": 10 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "grok-4-fast-reasoning", + "modelKey": "grok-4-fast-reasoning", + "displayName": "grok-4-fast-reasoning", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-09-23", + "openWeights": false, + "releaseDate": "2025-09-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure-cognitive-services", + "providerName": "Azure Cognitive Services", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "grok-4-fast-reasoning", + "modelKey": "grok-4-fast-reasoning", + "displayName": "Grok 4 Fast (Reasoning)", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2025-09-19", + "openWeights": false, + "releaseDate": "2025-09-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "azure", + "providerName": "Azure", + "providerDoc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "model": "grok-4-fast-reasoning", + "modelKey": "grok-4-fast-reasoning", + "displayName": "Grok 4 Fast (Reasoning)", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2025-09-19", + "openWeights": false, + "releaseDate": "2025-09-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "grok-4-fast-reasoning", + "modelKey": "grok-4-fast-reasoning", + "displayName": "xAI: Grok 4 Fast Reasoning", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2025-09", + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2025-09-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "grok-4-fast-reasoning", + "modelKey": "grok-4-fast-reasoning", + "displayName": "grok-4-fast-reasoning", + "family": "grok", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "grok-4-fast-reasoning", + "modelKey": "grok-4-fast-reasoning", + "displayName": "Grok 4 Fast Reasoning", + "family": "grok", + "metadata": { + "lastUpdated": "2025-07-09", + "openWeights": false, + "releaseDate": "2025-07-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "xai/grok-4-fast-reasoning", + "modelKey": "xai/grok-4-fast-reasoning", + "displayName": "Grok-4-Fast-Reasoning", + "family": "grok", + "metadata": { + "lastUpdated": "2025-09-16", + "openWeights": false, + "releaseDate": "2025-09-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "x-ai/grok-4-fast-reasoning", + "modelKey": "x-ai/grok-4-fast-reasoning", + "displayName": "X-Ai/Grok-4-Fast-Reasoning", + "metadata": { + "lastUpdated": "2025-12-18", + "openWeights": false, + "releaseDate": "2025-12-18" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/grok-4-fast-reasoning", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/ai-foundry-models/grok/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-4-fast-reasoning", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-15", + "source": "https://docs.x.ai/docs/models" + } + } + ] + }, + { + "id": "x-ai/grok-4-latest", + "provider": "x-ai", + "model": "grok-4-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-4-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-4-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 3, + "output": 15 + }, + "extra": { + "input_cost_per_token_above_128k_tokens": 0.000006, + "output_cost_per_token_above_128k_tokens": 0.00003 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-4-latest", + "mode": "chat", + "metadata": { + "source": "https://docs.x.ai/docs/models" + } + } + ] + }, + { + "id": "x-ai/grok-4.1", + "provider": "x-ai", + "model": "grok-4.1", + "displayName": "grok-4.1", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai" + ], + "aliases": [ + "302ai/grok-4.1" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "grok-4.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 10 + } + } + ] + }, + "metadata": { + "displayNames": [ + "grok-4.1" + ], + "knowledgeCutoff": "2025-06", + "releaseDate": "2025-11-18", + "lastUpdated": "2025-11-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "grok-4.1", + "modelKey": "grok-4.1", + "displayName": "grok-4.1", + "metadata": { + "knowledgeCutoff": "2025-06", + "lastUpdated": "2025-11-18", + "openWeights": false, + "releaseDate": "2025-11-18" + } + } + ] + }, + { + "id": "x-ai/grok-4.1-fast", + "provider": "x-ai", + "model": "grok-4.1-fast", + "displayName": "Grok 4.1 Fast", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai", + "zenmux" + ], + "aliases": [ + "qiniu-ai/x-ai/grok-4.1-fast", + "zenmux/x-ai/grok-4.1-fast" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "x-ai/grok-4.1-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.1 Fast", + "x-AI/Grok-4.1-Fast" + ], + "knowledgeCutoff": "2025-01-01", + "releaseDate": "2025-11-20", + "lastUpdated": "2025-11-20", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "x-ai/grok-4.1-fast", + "modelKey": "x-ai/grok-4.1-fast", + "displayName": "x-AI/Grok-4.1-Fast", + "metadata": { + "lastUpdated": "2025-11-20", + "openWeights": false, + "releaseDate": "2025-11-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "x-ai/grok-4.1-fast", + "modelKey": "x-ai/grok-4.1-fast", + "displayName": "Grok 4.1 Fast", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-11-20", + "openWeights": false, + "releaseDate": "2025-11-20", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "x-ai/grok-4.1-fast-non-reasoning", + "provider": "x-ai", + "model": "grok-4.1-fast-non-reasoning", + "displayName": "Grok 4.1 Fast Non-Reasoning", + "family": "grok", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "poe", + "qiniu-ai", + "vercel", + "vertex_ai", + "zenmux" + ], + "aliases": [ + "poe/xai/grok-4.1-fast-non-reasoning", + "qiniu-ai/x-ai/grok-4.1-fast-non-reasoning", + "vercel/xai/grok-4.1-fast-non-reasoning", + "vertex_ai/xai/grok-4.1-fast-non-reasoning", + "zenmux/x-ai/grok-4.1-fast-non-reasoning" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "maxTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "xai/grok-4.1-fast-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "x-ai/grok-4.1-fast-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "vertex_ai", + "model": "vertex_ai/xai/grok-4.1-fast-non-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.1 Fast Non Reasoning", + "Grok 4.1 Fast Non-Reasoning", + "Grok-4.1-Fast-Non-Reasoning", + "X-Ai/Grok 4.1 Fast Non Reasoning" + ], + "families": [ + "grok" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-11-19", + "lastUpdated": "2025-11-19", + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "xai/grok-4.1-fast-non-reasoning", + "modelKey": "xai/grok-4.1-fast-non-reasoning", + "displayName": "Grok-4.1-Fast-Non-Reasoning", + "family": "grok", + "metadata": { + "lastUpdated": "2025-11-19", + "openWeights": false, + "releaseDate": "2025-11-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "x-ai/grok-4.1-fast-non-reasoning", + "modelKey": "x-ai/grok-4.1-fast-non-reasoning", + "displayName": "X-Ai/Grok 4.1 Fast Non Reasoning", + "metadata": { + "lastUpdated": "2025-12-19", + "openWeights": false, + "releaseDate": "2025-12-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "xai/grok-4.1-fast-non-reasoning", + "modelKey": "xai/grok-4.1-fast-non-reasoning", + "displayName": "Grok 4.1 Fast Non-Reasoning", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-07-09", + "openWeights": false, + "releaseDate": "2025-07-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "x-ai/grok-4.1-fast-non-reasoning", + "modelKey": "x-ai/grok-4.1-fast-non-reasoning", + "displayName": "Grok 4.1 Fast Non Reasoning", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-11-20", + "openWeights": false, + "releaseDate": "2025-11-20" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai", + "model": "vertex_ai/xai/grok-4.1-fast-non-reasoning", + "mode": "chat", + "metadata": { + "source": "https://docs.x.ai/docs/models (Vertex AI Model Garden)" + } + } + ] + }, + { + "id": "x-ai/grok-4.1-fast-reasoning", + "provider": "x-ai", + "model": "grok-4.1-fast-reasoning", + "displayName": "Grok 4.1 Fast Reasoning", + "family": "grok", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "poe", + "qiniu-ai", + "vercel", + "vertex_ai" + ], + "aliases": [ + "poe/xai/grok-4.1-fast-reasoning", + "qiniu-ai/x-ai/grok-4.1-fast-reasoning", + "vercel/xai/grok-4.1-fast-reasoning", + "vertex_ai/xai/grok-4.1-fast-reasoning" + ], + "mergedProviderModelRecords": 4, + "limits": { + "contextTokens": 20000000, + "inputTokens": 2000000, + "maxTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "structuredOutput": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "xai/grok-4.1-fast-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + }, + { + "source": "litellm", + "provider": "vertex_ai", + "model": "vertex_ai/xai/grok-4.1-fast-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.2, + "output": 0.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.1 Fast Reasoning", + "Grok-4.1-Fast-Reasoning", + "X-Ai/Grok 4.1 Fast Reasoning" + ], + "families": [ + "grok" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-11-19", + "lastUpdated": "2025-11-19", + "providerModelRecordCount": 4 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "xai/grok-4.1-fast-reasoning", + "modelKey": "xai/grok-4.1-fast-reasoning", + "displayName": "Grok-4.1-Fast-Reasoning", + "family": "grok", + "metadata": { + "lastUpdated": "2025-11-19", + "openWeights": false, + "releaseDate": "2025-11-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "x-ai/grok-4.1-fast-reasoning", + "modelKey": "x-ai/grok-4.1-fast-reasoning", + "displayName": "X-Ai/Grok 4.1 Fast Reasoning", + "metadata": { + "lastUpdated": "2025-12-19", + "openWeights": false, + "releaseDate": "2025-12-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "xai/grok-4.1-fast-reasoning", + "modelKey": "xai/grok-4.1-fast-reasoning", + "displayName": "Grok 4.1 Fast Reasoning", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-07-09", + "openWeights": false, + "releaseDate": "2025-07-09" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai", + "model": "vertex_ai/xai/grok-4.1-fast-reasoning", + "mode": "chat", + "metadata": { + "source": "https://docs.x.ai/docs/models (Vertex AI Model Garden)" + } + } + ] + }, + { + "id": "x-ai/grok-4.2-fast", + "provider": "x-ai", + "model": "grok-4.2-fast", + "displayName": "Grok 4.2 Fast", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/x-ai/grok-4.2-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2000000, + "outputTokens": 30000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "x-ai/grok-4.2-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.2 Fast" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-20", + "lastUpdated": "2026-03-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "x-ai/grok-4.2-fast", + "modelKey": "x-ai/grok-4.2-fast", + "displayName": "Grok 4.2 Fast", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-20", + "openWeights": false, + "releaseDate": "2026-03-20" + } + } + ] + }, + { + "id": "x-ai/grok-4.2-fast-non-reasoning", + "provider": "x-ai", + "model": "grok-4.2-fast-non-reasoning", + "displayName": "Grok 4.2 Fast Non Reasoning", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/x-ai/grok-4.2-fast-non-reasoning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2000000, + "outputTokens": 30000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "x-ai/grok-4.2-fast-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3, + "output": 9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.2 Fast Non Reasoning" + ], + "knowledgeCutoff": "2025-08-31", + "releaseDate": "2026-03-20", + "lastUpdated": "2026-03-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "x-ai/grok-4.2-fast-non-reasoning", + "modelKey": "x-ai/grok-4.2-fast-non-reasoning", + "displayName": "Grok 4.2 Fast Non Reasoning", + "metadata": { + "knowledgeCutoff": "2025-08-31", + "lastUpdated": "2026-03-20", + "openWeights": false, + "releaseDate": "2026-03-20" + } + } + ] + }, + { + "id": "x-ai/grok-4.20", + "provider": "x-ai", + "model": "grok-4.20", + "displayName": "xAI: Grok 4.20", + "family": "grok", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openrouter" + ], + "aliases": [ + "kilo/x-ai/grok-4.20", + "nano-gpt/x-ai/grok-4.20", + "openrouter/x-ai/grok-4.20" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "x-ai/grok-4.20", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "x-ai/grok-4.20", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "x-ai/grok-4.20", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "x-ai/grok-4.20", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "other": { + "webSearch": 0.005 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.20", + "xAI: Grok 4.20" + ], + "families": [ + "grok" + ], + "knowledgeCutoff": "2025-09-01", + "releaseDate": "2026-03-31", + "lastUpdated": "2026-04-11", + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "x-ai/grok-4.20", + "modelKey": "x-ai/grok-4.20", + "displayName": "xAI: Grok 4.20", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": false, + "releaseDate": "2026-03-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "x-ai/grok-4.20", + "modelKey": "x-ai/grok-4.20", + "displayName": "Grok 4.20", + "metadata": { + "lastUpdated": "2026-03-31", + "openWeights": false, + "releaseDate": "2026-03-31", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "x-ai/grok-4.20", + "modelKey": "x-ai/grok-4.20", + "displayName": "Grok 4.20", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2025-09-01", + "lastUpdated": "2026-03-31", + "openWeights": false, + "releaseDate": "2026-03-31" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "x-ai/grok-4.20", + "displayName": "xAI: Grok 4.20", + "metadata": { + "canonicalSlug": "x-ai/grok-4.20-20260309", + "createdAt": "2026-03-31T17:43:39.000Z", + "knowledgeCutoff": "2025-09-01", + "links": { + "details": "/api/v1/models/x-ai/grok-4.20-20260309/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": false + }, + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Grok", + "topProvider": { + "context_length": 2000000, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "x-ai/grok-4.20-0309-non-reasoning", + "provider": "x-ai", + "model": "grok-4.20-0309-non-reasoning", + "displayName": "Grok 4.20 (Non-Reasoning)", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-4.20-0309-non-reasoning" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 30000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xai", + "model": "grok-4.20-0309-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 5, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2.5, + "output": 5, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.20 (Non-Reasoning)" + ], + "families": [ + "grok" + ], + "releaseDate": "2026-03-09", + "lastUpdated": "2026-03-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xai", + "providerName": "xAI", + "providerDoc": "https://docs.x.ai/docs/models", + "model": "grok-4.20-0309-non-reasoning", + "modelKey": "grok-4.20-0309-non-reasoning", + "displayName": "Grok 4.20 (Non-Reasoning)", + "family": "grok", + "metadata": { + "lastUpdated": "2026-03-09", + "openWeights": false, + "releaseDate": "2026-03-09" + } + } + ] + }, + { + "id": "x-ai/grok-4.20-0309-reasoning", + "provider": "x-ai", + "model": "grok-4.20-0309-reasoning", + "displayName": "Grok 4.20 (Reasoning)", + "family": "grok", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "merge-gateway", + "xai" + ], + "aliases": [ + "merge-gateway/xai/grok-4.20-0309-reasoning", + "xai/grok-4.20-0309-reasoning" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "maxTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "xai/grok-4.20-0309-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 5, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2.5, + "output": 5, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "xai", + "model": "grok-4.20-0309-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 5, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2.5, + "output": 5, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-4.20-0309-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.20 (Reasoning)" + ], + "families": [ + "grok" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-03-09", + "lastUpdated": "2026-03-09", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "xai/grok-4.20-0309-reasoning", + "modelKey": "xai/grok-4.20-0309-reasoning", + "displayName": "Grok 4.20 (Reasoning)", + "family": "grok", + "metadata": { + "lastUpdated": "2026-03-09", + "openWeights": false, + "releaseDate": "2026-03-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xai", + "providerName": "xAI", + "providerDoc": "https://docs.x.ai/docs/models", + "model": "grok-4.20-0309-reasoning", + "modelKey": "grok-4.20-0309-reasoning", + "displayName": "Grok 4.20 (Reasoning)", + "family": "grok", + "metadata": { + "lastUpdated": "2026-03-09", + "openWeights": false, + "releaseDate": "2026-03-09" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-4.20-0309-reasoning", + "mode": "chat", + "metadata": { + "source": "https://docs.x.ai/docs/models" + } + } + ] + }, + { + "id": "x-ai/grok-4.20-beta-0309-non-reasoning", + "provider": "x-ai", + "model": "grok-4.20-beta-0309-non-reasoning", + "displayName": "grok-4.20-beta-0309-non-reasoning", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "xai" + ], + "aliases": [ + "302ai/grok-4.20-beta-0309-non-reasoning", + "xai/grok-4.20-beta-0309-non-reasoning" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "maxTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "grok-4.20-beta-0309-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-4.20-beta-0309-non-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "grok-4.20-beta-0309-non-reasoning" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-03-16", + "lastUpdated": "2026-03-16", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "grok-4.20-beta-0309-non-reasoning", + "modelKey": "grok-4.20-beta-0309-non-reasoning", + "displayName": "grok-4.20-beta-0309-non-reasoning", + "metadata": { + "lastUpdated": "2026-03-16", + "openWeights": false, + "releaseDate": "2026-03-16" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-4.20-beta-0309-non-reasoning", + "mode": "chat", + "metadata": { + "source": "https://docs.x.ai/docs/models" + } + } + ] + }, + { + "id": "x-ai/grok-4.20-beta-0309-reasoning", + "provider": "x-ai", + "model": "grok-4.20-beta-0309-reasoning", + "displayName": "grok-4.20-beta-0309-reasoning", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "xai" + ], + "aliases": [ + "302ai/grok-4.20-beta-0309-reasoning", + "xai/grok-4.20-beta-0309-reasoning" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "maxTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "grok-4.20-beta-0309-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-4.20-beta-0309-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "grok-4.20-beta-0309-reasoning" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-03-16", + "lastUpdated": "2026-03-16", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "grok-4.20-beta-0309-reasoning", + "modelKey": "grok-4.20-beta-0309-reasoning", + "displayName": "grok-4.20-beta-0309-reasoning", + "metadata": { + "lastUpdated": "2026-03-16", + "openWeights": false, + "releaseDate": "2026-03-16" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-4.20-beta-0309-reasoning", + "mode": "chat", + "metadata": { + "source": "https://docs.x.ai/docs/models" + } + } + ] + }, + { + "id": "x-ai/grok-4.20-multi-agent", + "provider": "x-ai", + "model": "grok-4.20-multi-agent", + "displayName": "xAI: Grok 4.20 Multi-Agent", + "family": "grok", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "kilo", + "nano-gpt", + "openrouter", + "poe", + "vercel" + ], + "aliases": [ + "kilo/x-ai/grok-4.20-multi-agent", + "nano-gpt/x-ai/grok-4.20-multi-agent", + "openrouter/x-ai/grok-4.20-multi-agent", + "poe/xai/grok-4.20-multi-agent", + "vercel/xai/grok-4.20-multi-agent" + ], + "mergedProviderModelRecords": 5, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "file", + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "structuredOutput": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": false, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "x-ai/grok-4.20-multi-agent", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "x-ai/grok-4.20-multi-agent", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "x-ai/grok-4.20-multi-agent", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "xai/grok-4.20-multi-agent", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 6 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "xai/grok-4.20-multi-agent", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "x-ai/grok-4.20-multi-agent", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "other": { + "webSearch": 0.005 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.20 Multi-Agent", + "Grok-4.20-Multi-Agent", + "xAI: Grok 4.20 Multi-Agent" + ], + "families": [ + "grok" + ], + "knowledgeCutoff": "2025-09-01", + "releaseDate": "2026-03-31", + "lastUpdated": "2026-04-11", + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 5 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "x-ai/grok-4.20-multi-agent", + "modelKey": "x-ai/grok-4.20-multi-agent", + "displayName": "xAI: Grok 4.20 Multi-Agent", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": false, + "releaseDate": "2026-03-31" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "x-ai/grok-4.20-multi-agent", + "modelKey": "x-ai/grok-4.20-multi-agent", + "displayName": "Grok 4.20 Multi-Agent", + "metadata": { + "lastUpdated": "2026-03-31", + "openWeights": false, + "releaseDate": "2026-03-31", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "x-ai/grok-4.20-multi-agent", + "modelKey": "x-ai/grok-4.20-multi-agent", + "displayName": "Grok 4.20 Multi-Agent", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2025-09-01", + "lastUpdated": "2026-03-31", + "openWeights": false, + "releaseDate": "2026-03-31", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "xai/grok-4.20-multi-agent", + "modelKey": "xai/grok-4.20-multi-agent", + "displayName": "Grok-4.20-Multi-Agent", + "metadata": { + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-03-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "xai/grok-4.20-multi-agent", + "modelKey": "xai/grok-4.20-multi-agent", + "displayName": "Grok 4.20 Multi-Agent", + "family": "grok", + "metadata": { + "lastUpdated": "2026-03-23", + "openWeights": false, + "releaseDate": "2026-03-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "high" + ] + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "x-ai/grok-4.20-multi-agent", + "displayName": "xAI: Grok 4.20 Multi-Agent", + "metadata": { + "canonicalSlug": "x-ai/grok-4.20-multi-agent-20260309", + "createdAt": "2026-03-31T17:45:58.000Z", + "knowledgeCutoff": "2025-09-01", + "links": { + "details": "/api/v1/models/x-ai/grok-4.20-multi-agent-20260309/endpoints" + }, + "reasoning": { + "mandatory": true, + "default_enabled": true, + "supported_efforts": [ + "xhigh", + "high", + "medium", + "low" + ], + "default_effort": "medium" + }, + "supportedParameters": [ + "include_reasoning", + "logprobs", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "temperature", + "top_logprobs", + "top_p" + ], + "tokenizer": "Grok", + "topProvider": { + "context_length": 2000000, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "x-ai/grok-4.20-multi-agent-0309", + "provider": "x-ai", + "model": "grok-4.20-multi-agent-0309", + "displayName": "Grok 4.20 Multi-Agent", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-4.20-multi-agent-0309" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 30000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xai", + "model": "grok-4.20-multi-agent-0309", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 5, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2.5, + "output": 5, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.20 Multi-Agent" + ], + "families": [ + "grok" + ], + "releaseDate": "2026-03-09", + "lastUpdated": "2026-03-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xai", + "providerName": "xAI", + "providerDoc": "https://docs.x.ai/docs/models", + "model": "grok-4.20-multi-agent-0309", + "modelKey": "grok-4.20-multi-agent-0309", + "displayName": "Grok 4.20 Multi-Agent", + "family": "grok", + "metadata": { + "lastUpdated": "2026-03-09", + "openWeights": false, + "releaseDate": "2026-03-09", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + } + ] + }, + { + "id": "x-ai/grok-4.20-multi-agent-beta", + "provider": "x-ai", + "model": "grok-4.20-multi-agent-beta", + "displayName": "Grok 4.20 Multi Agent Beta", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/xai/grok-4.20-multi-agent-beta" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "xai/grok-4.20-multi-agent-beta", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.20 Multi Agent Beta" + ], + "families": [ + "grok" + ], + "releaseDate": "2026-03-11", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "xai/grok-4.20-multi-agent-beta", + "modelKey": "xai/grok-4.20-multi-agent-beta", + "displayName": "Grok 4.20 Multi Agent Beta", + "family": "grok", + "metadata": { + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-03-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "x-ai/grok-4.20-multi-agent-beta-0309", + "provider": "x-ai", + "model": "grok-4.20-multi-agent-beta-0309", + "displayName": "grok-4.20-multi-agent-beta-0309", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "xai" + ], + "aliases": [ + "302ai/grok-4.20-multi-agent-beta-0309", + "xai/grok-4.20-multi-agent-beta-0309" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "maxTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "grok-4.20-multi-agent-beta-0309", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2, + "output": 6 + } + }, + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-4.20-multi-agent-beta-0309", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "grok-4.20-multi-agent-beta-0309" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-03-16", + "lastUpdated": "2026-03-16", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "grok-4.20-multi-agent-beta-0309", + "modelKey": "grok-4.20-multi-agent-beta-0309", + "displayName": "grok-4.20-multi-agent-beta-0309", + "metadata": { + "lastUpdated": "2026-03-16", + "openWeights": false, + "releaseDate": "2026-03-16" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-4.20-multi-agent-beta-0309", + "mode": "chat", + "metadata": { + "source": "https://docs.x.ai/docs/models" + } + } + ] + }, + { + "id": "x-ai/grok-4.20-non-reasoning", + "provider": "x-ai", + "model": "grok-4.20-non-reasoning", + "displayName": "Grok 4.20 Non-Reasoning", + "family": "grok", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vertex_ai" + ], + "aliases": [ + "vercel/xai/grok-4.20-non-reasoning", + "vertex_ai/xai/grok-4.20-non-reasoning" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "maxTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "xai/grok-4.20-non-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "vertex_ai", + "model": "vertex_ai/xai/grok-4.20-non-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.20 Non-Reasoning" + ], + "families": [ + "grok" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-03-09", + "lastUpdated": "2026-03-23", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "xai/grok-4.20-non-reasoning", + "modelKey": "xai/grok-4.20-non-reasoning", + "displayName": "Grok 4.20 Non-Reasoning", + "family": "grok", + "metadata": { + "lastUpdated": "2026-03-23", + "openWeights": false, + "releaseDate": "2026-03-09" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai", + "model": "vertex_ai/xai/grok-4.20-non-reasoning", + "mode": "chat", + "metadata": { + "source": "https://docs.x.ai/docs/models (Vertex AI Model Garden)" + } + } + ] + }, + { + "id": "x-ai/grok-4.20-non-reasoning-beta", + "provider": "x-ai", + "model": "grok-4.20-non-reasoning-beta", + "displayName": "Grok 4.20 Beta Non-Reasoning", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/xai/grok-4.20-non-reasoning-beta" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "xai/grok-4.20-non-reasoning-beta", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.4, + "input": 1.25, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.20 Beta Non-Reasoning" + ], + "families": [ + "grok" + ], + "releaseDate": "2026-03-11", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "xai/grok-4.20-non-reasoning-beta", + "modelKey": "xai/grok-4.20-non-reasoning-beta", + "displayName": "Grok 4.20 Beta Non-Reasoning", + "family": "grok", + "metadata": { + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-03-11" + } + } + ] + }, + { + "id": "x-ai/grok-4.20-reasoning", + "provider": "x-ai", + "model": "grok-4.20-reasoning", + "displayName": "Grok 4.20 Reasoning", + "family": "grok", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "vercel", + "vertex_ai" + ], + "aliases": [ + "vercel/xai/grok-4.20-reasoning", + "vertex_ai/xai/grok-4.20-reasoning" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 2000000, + "inputTokens": 2000000, + "maxTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "xai/grok-4.20-reasoning", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + } + }, + { + "source": "litellm", + "provider": "vertex_ai", + "model": "vertex_ai/xai/grok-4.20-reasoning", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 2, + "output": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.20 Reasoning" + ], + "families": [ + "grok" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-03-09", + "lastUpdated": "2026-03-23", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "xai/grok-4.20-reasoning", + "modelKey": "xai/grok-4.20-reasoning", + "displayName": "Grok 4.20 Reasoning", + "family": "grok", + "metadata": { + "lastUpdated": "2026-03-23", + "openWeights": false, + "releaseDate": "2026-03-09" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai", + "model": "vertex_ai/xai/grok-4.20-reasoning", + "mode": "chat", + "metadata": { + "source": "https://docs.x.ai/docs/models (Vertex AI Model Garden)" + } + } + ] + }, + { + "id": "x-ai/grok-4.20-reasoning-beta", + "provider": "x-ai", + "model": "grok-4.20-reasoning-beta", + "displayName": "Grok 4.20 Beta Reasoning", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/xai/grok-4.20-reasoning-beta" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 2000000, + "outputTokens": 2000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "vercel", + "model": "xai/grok-4.20-reasoning-beta", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.20 Beta Reasoning" + ], + "families": [ + "grok" + ], + "releaseDate": "2026-03-11", + "lastUpdated": "2026-03-13", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "xai/grok-4.20-reasoning-beta", + "modelKey": "xai/grok-4.20-reasoning-beta", + "displayName": "Grok 4.20 Beta Reasoning", + "family": "grok", + "metadata": { + "lastUpdated": "2026-03-13", + "openWeights": false, + "releaseDate": "2026-03-11" + } + } + ] + }, + { + "id": "x-ai/grok-4.3", + "provider": "x-ai", + "model": "grok-4.3", + "displayName": "Grok 4.3", + "family": "grok", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "aihubmix", + "anyapi", + "auriko", + "fastrouter", + "kilo", + "merge-gateway", + "nano-gpt", + "openrouter", + "orcarouter", + "vercel", + "xai", + "zenmux" + ], + "aliases": [ + "aihubmix/grok-4.3", + "anyapi/xai/grok-4.3", + "auriko/grok-4.3", + "fastrouter/x-ai/grok-4.3", + "kilo/x-ai/grok-4.3", + "merge-gateway/xai/grok-4.3", + "nano-gpt/x-ai/grok-4.3", + "openrouter/x-ai/grok-4.3", + "orcarouter/grok/grok-4.3", + "vercel/xai/grok-4.3", + "xai/grok-4.3", + "zenmux/x-ai/grok-4.3" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 1000000, + "outputTokens": 1000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "webSearch": true, + "supports1MContext": true, + "parallelFunctionCalling": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "aihubmix", + "model": "grok-4.3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 5, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2.5, + "output": 5, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "auriko", + "model": "grok-4.3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 5, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2.5, + "output": 5, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "x-ai/grok-4.3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "x-ai/grok-4.3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "xai/grok-4.3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 5, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2.5, + "output": 5, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "x-ai/grok-4.3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "x-ai/grok-4.3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 5, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2.5, + "output": 5, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "grok/grok-4.3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 5, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2.5, + "output": 5, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "xai/grok-4.3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + } + }, + { + "source": "models.dev", + "provider": "xai", + "model": "grok-4.3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 5, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2.5, + "output": 5, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "x-ai/grok-4.3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0, + "input": 1.25, + "output": 2.5 + }, + "tiered": { + "contextOver200K": { + "input": 2.5, + "output": 5, + "cache_read": 0.4, + "cache_write": 0 + }, + "tiers": [ + { + "input": 2.5, + "output": 5, + "cache_read": 0.4, + "cache_write": 0, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-4.3", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 4e-7, + "input_cost_per_token_above_200k_tokens": 0.0000025, + "output_cost_per_token_above_200k_tokens": 0.000005 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "x-ai/grok-4.3", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "other": { + "webSearch": 0.005 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.3", + "xAI: Grok 4.3" + ], + "families": [ + "grok" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-05-01", + "lastUpdated": "2026-05-01", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "grok-4.3", + "modelKey": "grok-4.3", + "displayName": "Grok 4.3", + "family": "grok", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-05-01", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "anyapi", + "providerName": "AnyAPI", + "providerApi": "https://api.anyapi.ai/v1", + "providerDoc": "https://docs.anyapi.ai", + "model": "xai/grok-4.3", + "modelKey": "xai/grok-4.3", + "displayName": "Grok 4.3", + "family": "grok", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": false, + "releaseDate": "2026-04-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "auriko", + "providerName": "Auriko", + "providerApi": "https://api.auriko.ai/v1", + "providerDoc": "https://docs.auriko.ai", + "model": "grok-4.3", + "modelKey": "grok-4.3", + "displayName": "Grok 4.3", + "family": "grok", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": false, + "releaseDate": "2026-04-17", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "x-ai/grok-4.3", + "modelKey": "x-ai/grok-4.3", + "displayName": "Grok 4.3", + "family": "grok", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": false, + "releaseDate": "2026-04-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "x-ai/grok-4.3", + "modelKey": "x-ai/grok-4.3", + "displayName": "xAI: Grok 4.3", + "metadata": { + "lastUpdated": "2026-05-01", + "openWeights": false, + "releaseDate": "2026-05-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "xai/grok-4.3", + "modelKey": "xai/grok-4.3", + "displayName": "Grok 4.3", + "family": "grok", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": false, + "releaseDate": "2026-04-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "x-ai/grok-4.3", + "modelKey": "x-ai/grok-4.3", + "displayName": "Grok 4.3", + "metadata": { + "lastUpdated": "2026-04-30", + "openWeights": false, + "releaseDate": "2026-04-30", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "x-ai/grok-4.3", + "modelKey": "x-ai/grok-4.3", + "displayName": "Grok 4.3", + "family": "grok", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": false, + "releaseDate": "2026-04-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "grok/grok-4.3", + "modelKey": "grok/grok-4.3", + "displayName": "Grok 4.3", + "family": "grok", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": false, + "releaseDate": "2026-04-17" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "xai/grok-4.3", + "modelKey": "xai/grok-4.3", + "displayName": "Grok 4.3", + "family": "grok", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": false, + "releaseDate": "2026-04-30", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xai", + "providerName": "xAI", + "providerDoc": "https://docs.x.ai/docs/models", + "model": "grok-4.3", + "modelKey": "grok-4.3", + "displayName": "Grok 4.3", + "family": "grok", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": false, + "releaseDate": "2026-04-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "x-ai/grok-4.3", + "modelKey": "x-ai/grok-4.3", + "displayName": "Grok 4.3", + "family": "grok", + "metadata": { + "lastUpdated": "2026-04-17", + "openWeights": false, + "releaseDate": "2026-04-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-4.3", + "mode": "chat", + "metadata": { + "source": "https://docs.x.ai/docs/models" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "x-ai/grok-4.3", + "displayName": "xAI: Grok 4.3", + "metadata": { + "canonicalSlug": "x-ai/grok-4.3-20260430", + "createdAt": "2026-04-30T23:30:21.000Z", + "links": { + "details": "/api/v1/models/x-ai/grok-4.3-20260430/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true, + "supported_efforts": [ + "high", + "medium", + "low", + "none" + ], + "default_effort": "low" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Grok", + "topProvider": { + "context_length": 1000000, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "x-ai/grok-4.3-latest", + "provider": "x-ai", + "model": "grok-4.3-latest", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-4.3-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "maxTokens": 1000000, + "outputTokens": 1000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-4.3-latest", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + }, + "extra": { + "cache_read_input_token_cost_above_200k_tokens": 4e-7, + "input_cost_per_token_above_200k_tokens": 0.0000025, + "output_cost_per_token_above_200k_tokens": 0.000005 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-4.3-latest", + "mode": "chat", + "metadata": { + "source": "https://docs.x.ai/docs/models" + } + } + ] + }, + { + "id": "x-ai/grok-beta", + "provider": "x-ai", + "model": "grok-beta", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-beta" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-beta", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5, + "output": 15 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-beta", + "mode": "chat" + } + ] + }, + { + "id": "x-ai/grok-build-0-1", + "provider": "x-ai", + "model": "grok-build-0-1", + "displayName": "Grok Build 0.1", + "family": "grok-build", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway", + "venice" + ], + "aliases": [ + "llmgateway/grok-build-0-1", + "venice/grok-build-0-1" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "grok-build-0-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 2 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 4, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 4, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "venice", + "model": "grok-build-0-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 2 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 4, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 4, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok Build 0.1" + ], + "families": [ + "grok-build" + ], + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "grok-build-0-1", + "modelKey": "grok-build-0-1", + "displayName": "Grok Build 0.1", + "family": "grok-build", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "venice", + "providerName": "Venice AI", + "providerDoc": "https://docs.venice.ai", + "model": "grok-build-0-1", + "modelKey": "grok-build-0-1", + "displayName": "Grok Build 0.1", + "family": "grok-build", + "metadata": { + "lastUpdated": "2026-06-11", + "openWeights": false, + "releaseDate": "2026-05-21" + } + } + ] + }, + { + "id": "x-ai/grok-build-0.1", + "provider": "x-ai", + "model": "grok-build-0.1", + "displayName": "Grok Build 0.1", + "family": "grok-build", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "fastrouter", + "kilo", + "nano-gpt", + "opencode", + "openrouter", + "vercel", + "xai", + "zenmux" + ], + "aliases": [ + "fastrouter/x-ai/grok-build-0.1", + "kilo/x-ai/grok-build-0.1", + "nano-gpt/x-ai/grok-build-0.1", + "opencode/grok-build-0.1", + "openrouter/x-ai/grok-build-0.1", + "vercel/xai/grok-build-0.1", + "xai/grok-build-0.1", + "zenmux/x-ai/grok-build-0.1" + ], + "mergedProviderModelRecords": 8, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fastrouter", + "model": "x-ai/grok-build-0.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "x-ai/grok-build-0.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "x-ai/grok-build-0.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "grok-build-0.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "x-ai/grok-build-0.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "xai/grok-build-0.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "xai", + "model": "grok-build-0.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 2 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 4, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 4, + "cache_read": 0.4, + "tier": { + "size": 200000 + } + } + ] + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "x-ai/grok-build-0.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "x-ai/grok-build-0.1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 2 + }, + "other": { + "webSearch": 0.005 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok Build 0.1", + "xAI: Grok Build 0.1" + ], + "families": [ + "grok-build" + ], + "releaseDate": "2026-04-16", + "lastUpdated": "2026-04-16", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 8 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "x-ai/grok-build-0.1", + "modelKey": "x-ai/grok-build-0.1", + "displayName": "Grok Build 0.1", + "family": "grok-build", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "x-ai/grok-build-0.1", + "modelKey": "x-ai/grok-build-0.1", + "displayName": "xAI: Grok Build 0.1", + "metadata": { + "lastUpdated": "2026-05-27", + "openWeights": false, + "releaseDate": "2026-05-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "x-ai/grok-build-0.1", + "modelKey": "x-ai/grok-build-0.1", + "displayName": "Grok Build 0.1", + "metadata": { + "lastUpdated": "2026-05-20", + "openWeights": false, + "releaseDate": "2026-05-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "grok-build-0.1", + "modelKey": "grok-build-0.1", + "displayName": "Grok Build 0.1", + "family": "grok-build", + "metadata": { + "lastUpdated": "2026-05-20", + "openWeights": false, + "releaseDate": "2026-05-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "x-ai/grok-build-0.1", + "modelKey": "x-ai/grok-build-0.1", + "displayName": "Grok Build 0.1", + "family": "grok-build", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "xai/grok-build-0.1", + "modelKey": "xai/grok-build-0.1", + "displayName": "Grok Build 0.1", + "family": "grok-build", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-05-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xai", + "providerName": "xAI", + "providerDoc": "https://docs.x.ai/docs/models", + "model": "grok-build-0.1", + "modelKey": "grok-build-0.1", + "displayName": "Grok Build 0.1", + "family": "grok-build", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "x-ai/grok-build-0.1", + "modelKey": "x-ai/grok-build-0.1", + "displayName": "Grok Build 0.1", + "family": "grok-build", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": false, + "releaseDate": "2026-04-16" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "x-ai/grok-build-0.1", + "displayName": "xAI: Grok Build 0.1", + "metadata": { + "canonicalSlug": "x-ai/grok-build-0.1-20260520", + "createdAt": "2026-05-20T17:28:43.000Z", + "links": { + "details": "/api/v1/models/x-ai/grok-build-0.1-20260520/endpoints" + }, + "reasoning": { + "mandatory": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ], + "tokenizer": "Grok", + "topProvider": { + "context_length": 256000, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "x-ai/grok-code", + "provider": "x-ai", + "model": "grok-code", + "displayName": "Grok Code Fast 1", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/grok-code" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "grok-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok Code Fast 1" + ], + "families": [ + "grok" + ], + "statuses": [ + "deprecated" + ], + "releaseDate": "2025-08-20", + "lastUpdated": "2025-08-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "grok-code", + "modelKey": "grok-code", + "displayName": "Grok Code Fast 1", + "family": "grok", + "status": "deprecated", + "metadata": { + "lastUpdated": "2025-08-20", + "openWeights": false, + "releaseDate": "2025-08-20" + } + } + ] + }, + { + "id": "x-ai/grok-code-fast", + "provider": "x-ai", + "model": "grok-code-fast", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-code-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-code-fast", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-code-fast", + "mode": "chat", + "metadata": { + "source": "https://docs.x.ai/docs/models" + } + } + ] + }, + { + "id": "x-ai/grok-code-fast-1", + "provider": "x-ai", + "model": "grok-code-fast-1", + "displayName": "Grok Code Fast 1", + "family": "grok", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "abacus", + "azure_ai", + "frogbot", + "helicone", + "jiekou", + "poe", + "qiniu-ai", + "xai", + "zenmux" + ], + "aliases": [ + "abacus/grok-code-fast-1", + "azure_ai/grok-code-fast-1", + "frogbot/grok-code-fast-1", + "helicone/grok-code-fast-1", + "jiekou/grok-code-fast-1", + "poe/xai/grok-code-fast-1", + "qiniu-ai/x-ai/grok-code-fast-1", + "xai/grok-code-fast-1", + "zenmux/x-ai/grok-code-fast-1" + ], + "mergedProviderModelRecords": 9, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "webSearch": true, + "promptCaching": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "abacus", + "model": "grok-code-fast-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "frogbot", + "model": "grok-code-fast-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "grok-code-fast-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.19999999999999998, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "grok-code-fast-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.18, + "output": 1.35 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "xai/grok-code-fast-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "x-ai/grok-code-fast-1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "azure_ai", + "model": "azure_ai/grok-code-fast-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-code-fast-1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok 4.1 Fast (Reasoning)", + "Grok Code Fast 1", + "grok-code-fast-1", + "x-AI/Grok-Code-Fast 1", + "xAI Grok Code Fast 1" + ], + "families": [ + "grok" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2023-10", + "releaseDate": "2025-09-01", + "lastUpdated": "2025-09-01", + "deprecationDate": "2026-05-15", + "providerModelRecordCount": 9 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "grok-code-fast-1", + "modelKey": "grok-code-fast-1", + "displayName": "Grok Code Fast 1", + "family": "grok", + "metadata": { + "lastUpdated": "2025-09-01", + "openWeights": false, + "releaseDate": "2025-09-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "frogbot", + "providerName": "FrogBot", + "providerApi": "https://app.frogbot.ai/api/v1", + "providerDoc": "https://docs.frogbot.ai", + "model": "grok-code-fast-1", + "modelKey": "grok-code-fast-1", + "displayName": "Grok 4.1 Fast (Reasoning)", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2023-10", + "lastUpdated": "2025-08-28", + "openWeights": false, + "releaseDate": "2025-08-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "grok-code-fast-1", + "modelKey": "grok-code-fast-1", + "displayName": "xAI Grok Code Fast 1", + "family": "grok", + "metadata": { + "knowledgeCutoff": "2024-08", + "lastUpdated": "2024-08-25", + "openWeights": false, + "releaseDate": "2024-08-25" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "grok-code-fast-1", + "modelKey": "grok-code-fast-1", + "displayName": "grok-code-fast-1", + "family": "grok", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": false, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "xai/grok-code-fast-1", + "modelKey": "xai/grok-code-fast-1", + "displayName": "Grok Code Fast 1", + "family": "grok", + "metadata": { + "lastUpdated": "2025-08-22", + "openWeights": false, + "releaseDate": "2025-08-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "x-ai/grok-code-fast-1", + "modelKey": "x-ai/grok-code-fast-1", + "displayName": "x-AI/Grok-Code-Fast 1", + "metadata": { + "lastUpdated": "2025-09-02", + "openWeights": false, + "releaseDate": "2025-09-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "x-ai/grok-code-fast-1", + "modelKey": "x-ai/grok-code-fast-1", + "displayName": "Grok Code Fast 1", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-08-26", + "openWeights": false, + "releaseDate": "2025-08-26" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "azure_ai", + "model": "azure_ai/grok-code-fast-1", + "mode": "chat", + "metadata": { + "source": "https://azure.microsoft.com/en-us/pricing/details/ai-foundry-models/grok/" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-code-fast-1", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-15", + "source": "https://docs.x.ai/docs/models" + } + } + ] + }, + { + "id": "x-ai/grok-code-fast-1-0825", + "provider": "x-ai", + "model": "grok-code-fast-1-0825", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-code-fast-1-0825" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "maxTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-code-fast-1-0825", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.2, + "output": 1.5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "deprecationDate": "2026-05-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-code-fast-1-0825", + "mode": "chat", + "metadata": { + "deprecationDate": "2026-05-15", + "source": "https://docs.x.ai/docs/models" + } + } + ] + }, + { + "id": "x-ai/grok-imagine-image", + "provider": "x-ai", + "model": "grok-imagine-image", + "displayName": "Grok Imagine Image", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel", + "xai" + ], + "aliases": [ + "vercel/xai/grok-imagine-image", + "xai/grok-imagine-image" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 8000, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "image", + "pdf", + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Grok Imagine Image" + ], + "families": [ + "grok" + ], + "releaseDate": "2026-01-28", + "lastUpdated": "2026-02-19", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "xai/grok-imagine-image", + "modelKey": "xai/grok-imagine-image", + "displayName": "Grok Imagine Image", + "family": "grok", + "metadata": { + "lastUpdated": "2026-02-19", + "openWeights": false, + "releaseDate": "2026-01-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xai", + "providerName": "xAI", + "providerDoc": "https://docs.x.ai/docs/models", + "model": "grok-imagine-image", + "modelKey": "grok-imagine-image", + "displayName": "Grok Imagine Image", + "family": "grok", + "metadata": { + "lastUpdated": "2026-01-28", + "openWeights": false, + "releaseDate": "2026-01-28" + } + } + ] + }, + { + "id": "x-ai/grok-imagine-image-quality", + "provider": "x-ai", + "model": "grok-imagine-image-quality", + "displayName": "Grok Imagine Image Quality", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-imagine-image-quality" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "image", + "pdf" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": true, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Grok Imagine Image Quality" + ], + "families": [ + "grok" + ], + "releaseDate": "2026-04-03", + "lastUpdated": "2026-04-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xai", + "providerName": "xAI", + "providerDoc": "https://docs.x.ai/docs/models", + "model": "grok-imagine-image-quality", + "modelKey": "grok-imagine-image-quality", + "displayName": "Grok Imagine Image Quality", + "family": "grok", + "metadata": { + "lastUpdated": "2026-04-03", + "openWeights": false, + "releaseDate": "2026-04-03" + } + } + ] + }, + { + "id": "x-ai/grok-imagine-video", + "provider": "x-ai", + "model": "grok-imagine-video", + "displayName": "Grok Imagine", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel", + "xai" + ], + "aliases": [ + "vercel/xai/grok-imagine-video", + "xai/grok-imagine-video" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 1024, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Grok Imagine", + "Grok Imagine Video" + ], + "families": [ + "grok" + ], + "releaseDate": "2026-01-28", + "lastUpdated": "2026-01-28", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "xai/grok-imagine-video", + "modelKey": "xai/grok-imagine-video", + "displayName": "Grok Imagine", + "family": "grok", + "metadata": { + "lastUpdated": "2026-01-28", + "openWeights": false, + "releaseDate": "2026-01-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xai", + "providerName": "xAI", + "providerDoc": "https://docs.x.ai/docs/models", + "model": "grok-imagine-video", + "modelKey": "grok-imagine-video", + "displayName": "Grok Imagine Video", + "family": "grok", + "metadata": { + "lastUpdated": "2026-01-28", + "openWeights": false, + "releaseDate": "2026-01-28" + } + } + ] + }, + { + "id": "x-ai/grok-imagine-video-1.5-preview", + "provider": "x-ai", + "model": "grok-imagine-video-1.5-preview", + "displayName": "Grok Imagine Video 1.5 Preview", + "family": "grok", + "sources": [ + "models.dev" + ], + "providers": [ + "vercel" + ], + "aliases": [ + "vercel/xai/grok-imagine-video-1.5-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 0, + "outputTokens": 0, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Grok Imagine Video 1.5 Preview" + ], + "families": [ + "grok" + ], + "releaseDate": "2026-05-30", + "lastUpdated": "2026-05-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "xai/grok-imagine-video-1.5-preview", + "modelKey": "xai/grok-imagine-video-1.5-preview", + "displayName": "Grok Imagine Video 1.5 Preview", + "family": "grok", + "metadata": { + "lastUpdated": "2026-05-30", + "openWeights": false, + "releaseDate": "2026-05-30" + } + } + ] + }, + { + "id": "x-ai/grok-latest", + "provider": "x-ai", + "model": "grok-latest", + "displayName": "Grok Latest", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/x-ai/grok-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 1000000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "x-ai/grok-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.25, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Grok Latest" + ], + "releaseDate": "2026-05-03", + "lastUpdated": "2026-05-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "x-ai/grok-latest", + "modelKey": "x-ai/grok-latest", + "displayName": "Grok Latest", + "metadata": { + "lastUpdated": "2026-05-03", + "openWeights": false, + "releaseDate": "2026-05-03", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "x-ai/grok-vision-beta", + "provider": "x-ai", + "model": "grok-vision-beta", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "xai" + ], + "aliases": [ + "xai/grok-vision-beta" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "inputTokens": 8192, + "maxTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": true, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "vision": true, + "webSearch": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "xai", + "model": "xai/grok-vision-beta", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 5, + "output": 15 + }, + "perImage": { + "input": 0.000005 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "xai", + "model": "xai/grok-vision-beta", + "mode": "chat" + } + ] + }, + { + "id": "xiaomi-token-plan-ams/mimo-v2-omni", + "provider": "xiaomi-token-plan-ams", + "model": "mimo-v2-omni", + "displayName": "MiMo-V2-Omni", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-ams" + ], + "aliases": [ + "xiaomi-token-plan-ams/mimo-v2-omni" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-ams", + "model": "mimo-v2-omni", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-Omni" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-ams", + "providerName": "Xiaomi Token Plan (Europe)", + "providerApi": "https://token-plan-ams.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2-omni", + "modelKey": "mimo-v2-omni", + "displayName": "MiMo-V2-Omni", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xiaomi-token-plan-ams/mimo-v2-pro", + "provider": "xiaomi-token-plan-ams", + "model": "mimo-v2-pro", + "displayName": "MiMo-V2-Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-ams" + ], + "aliases": [ + "xiaomi-token-plan-ams/mimo-v2-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-ams", + "model": "mimo-v2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-ams", + "providerName": "Xiaomi Token Plan (Europe)", + "providerApi": "https://token-plan-ams.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2-pro", + "modelKey": "mimo-v2-pro", + "displayName": "MiMo-V2-Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xiaomi-token-plan-ams/mimo-v2-tts", + "provider": "xiaomi-token-plan-ams", + "model": "mimo-v2-tts", + "displayName": "MiMo-V2-TTS", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-ams" + ], + "aliases": [ + "xiaomi-token-plan-ams/mimo-v2-tts" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-ams", + "model": "mimo-v2-tts", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-TTS" + ], + "families": [ + "mimo" + ], + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-ams", + "providerName": "Xiaomi Token Plan (Europe)", + "providerApi": "https://token-plan-ams.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2-tts", + "modelKey": "mimo-v2-tts", + "displayName": "MiMo-V2-TTS", + "family": "mimo", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "xiaomi-token-plan-ams/mimo-v2.5", + "provider": "xiaomi-token-plan-ams", + "model": "mimo-v2.5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-ams" + ], + "aliases": [ + "xiaomi-token-plan-ams/mimo-v2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-ams", + "model": "mimo-v2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-ams", + "providerName": "Xiaomi Token Plan (Europe)", + "providerApi": "https://token-plan-ams.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5", + "modelKey": "mimo-v2.5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xiaomi-token-plan-ams/mimo-v2.5-pro", + "provider": "xiaomi-token-plan-ams", + "model": "mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-ams" + ], + "aliases": [ + "xiaomi-token-plan-ams/mimo-v2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-ams", + "model": "mimo-v2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-ams", + "providerName": "Xiaomi Token Plan (Europe)", + "providerApi": "https://token-plan-ams.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5-pro", + "modelKey": "mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xiaomi-token-plan-ams/mimo-v2.5-tts", + "provider": "xiaomi-token-plan-ams", + "model": "mimo-v2.5-tts", + "displayName": "MiMo-V2.5-TTS", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-ams" + ], + "aliases": [ + "xiaomi-token-plan-ams/mimo-v2.5-tts" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-ams", + "model": "mimo-v2.5-tts", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-TTS" + ], + "families": [ + "mimo" + ], + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-ams", + "providerName": "Xiaomi Token Plan (Europe)", + "providerApi": "https://token-plan-ams.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5-tts", + "modelKey": "mimo-v2.5-tts", + "displayName": "MiMo-V2.5-TTS", + "family": "mimo", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "xiaomi-token-plan-ams/mimo-v2.5-tts-voiceclone", + "provider": "xiaomi-token-plan-ams", + "model": "mimo-v2.5-tts-voiceclone", + "displayName": "MiMo-V2.5-TTS-VoiceClone", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-ams" + ], + "aliases": [ + "xiaomi-token-plan-ams/mimo-v2.5-tts-voiceclone" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-ams", + "model": "mimo-v2.5-tts-voiceclone", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-TTS-VoiceClone" + ], + "families": [ + "mimo" + ], + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-ams", + "providerName": "Xiaomi Token Plan (Europe)", + "providerApi": "https://token-plan-ams.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5-tts-voiceclone", + "modelKey": "mimo-v2.5-tts-voiceclone", + "displayName": "MiMo-V2.5-TTS-VoiceClone", + "family": "mimo", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "xiaomi-token-plan-ams/mimo-v2.5-tts-voicedesign", + "provider": "xiaomi-token-plan-ams", + "model": "mimo-v2.5-tts-voicedesign", + "displayName": "MiMo-V2.5-TTS-VoiceDesign", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-ams" + ], + "aliases": [ + "xiaomi-token-plan-ams/mimo-v2.5-tts-voicedesign" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-ams", + "model": "mimo-v2.5-tts-voicedesign", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-TTS-VoiceDesign" + ], + "families": [ + "mimo" + ], + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-ams", + "providerName": "Xiaomi Token Plan (Europe)", + "providerApi": "https://token-plan-ams.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5-tts-voicedesign", + "modelKey": "mimo-v2.5-tts-voicedesign", + "displayName": "MiMo-V2.5-TTS-VoiceDesign", + "family": "mimo", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "xiaomi-token-plan-cn/mimo-v2-omni", + "provider": "xiaomi-token-plan-cn", + "model": "mimo-v2-omni", + "displayName": "MiMo-V2-Omni", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-cn" + ], + "aliases": [ + "xiaomi-token-plan-cn/mimo-v2-omni" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-cn", + "model": "mimo-v2-omni", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-Omni" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-cn", + "providerName": "Xiaomi Token Plan (China)", + "providerApi": "https://token-plan-cn.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2-omni", + "modelKey": "mimo-v2-omni", + "displayName": "MiMo-V2-Omni", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xiaomi-token-plan-cn/mimo-v2-pro", + "provider": "xiaomi-token-plan-cn", + "model": "mimo-v2-pro", + "displayName": "MiMo-V2-Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-cn" + ], + "aliases": [ + "xiaomi-token-plan-cn/mimo-v2-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-cn", + "model": "mimo-v2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-cn", + "providerName": "Xiaomi Token Plan (China)", + "providerApi": "https://token-plan-cn.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2-pro", + "modelKey": "mimo-v2-pro", + "displayName": "MiMo-V2-Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xiaomi-token-plan-cn/mimo-v2-tts", + "provider": "xiaomi-token-plan-cn", + "model": "mimo-v2-tts", + "displayName": "MiMo-V2-TTS", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-cn" + ], + "aliases": [ + "xiaomi-token-plan-cn/mimo-v2-tts" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-cn", + "model": "mimo-v2-tts", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-TTS" + ], + "families": [ + "mimo" + ], + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-cn", + "providerName": "Xiaomi Token Plan (China)", + "providerApi": "https://token-plan-cn.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2-tts", + "modelKey": "mimo-v2-tts", + "displayName": "MiMo-V2-TTS", + "family": "mimo", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "xiaomi-token-plan-cn/mimo-v2.5", + "provider": "xiaomi-token-plan-cn", + "model": "mimo-v2.5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-cn" + ], + "aliases": [ + "xiaomi-token-plan-cn/mimo-v2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-cn", + "model": "mimo-v2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-cn", + "providerName": "Xiaomi Token Plan (China)", + "providerApi": "https://token-plan-cn.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5", + "modelKey": "mimo-v2.5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xiaomi-token-plan-cn/mimo-v2.5-pro", + "provider": "xiaomi-token-plan-cn", + "model": "mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-cn" + ], + "aliases": [ + "xiaomi-token-plan-cn/mimo-v2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-cn", + "model": "mimo-v2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-cn", + "providerName": "Xiaomi Token Plan (China)", + "providerApi": "https://token-plan-cn.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5-pro", + "modelKey": "mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xiaomi-token-plan-cn/mimo-v2.5-tts", + "provider": "xiaomi-token-plan-cn", + "model": "mimo-v2.5-tts", + "displayName": "MiMo-V2.5-TTS", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-cn" + ], + "aliases": [ + "xiaomi-token-plan-cn/mimo-v2.5-tts" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-cn", + "model": "mimo-v2.5-tts", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-TTS" + ], + "families": [ + "mimo" + ], + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-cn", + "providerName": "Xiaomi Token Plan (China)", + "providerApi": "https://token-plan-cn.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5-tts", + "modelKey": "mimo-v2.5-tts", + "displayName": "MiMo-V2.5-TTS", + "family": "mimo", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "xiaomi-token-plan-cn/mimo-v2.5-tts-voiceclone", + "provider": "xiaomi-token-plan-cn", + "model": "mimo-v2.5-tts-voiceclone", + "displayName": "MiMo-V2.5-TTS-VoiceClone", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-cn" + ], + "aliases": [ + "xiaomi-token-plan-cn/mimo-v2.5-tts-voiceclone" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-cn", + "model": "mimo-v2.5-tts-voiceclone", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-TTS-VoiceClone" + ], + "families": [ + "mimo" + ], + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-cn", + "providerName": "Xiaomi Token Plan (China)", + "providerApi": "https://token-plan-cn.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5-tts-voiceclone", + "modelKey": "mimo-v2.5-tts-voiceclone", + "displayName": "MiMo-V2.5-TTS-VoiceClone", + "family": "mimo", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "xiaomi-token-plan-cn/mimo-v2.5-tts-voicedesign", + "provider": "xiaomi-token-plan-cn", + "model": "mimo-v2.5-tts-voicedesign", + "displayName": "MiMo-V2.5-TTS-VoiceDesign", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-cn" + ], + "aliases": [ + "xiaomi-token-plan-cn/mimo-v2.5-tts-voicedesign" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-cn", + "model": "mimo-v2.5-tts-voicedesign", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-TTS-VoiceDesign" + ], + "families": [ + "mimo" + ], + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-cn", + "providerName": "Xiaomi Token Plan (China)", + "providerApi": "https://token-plan-cn.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5-tts-voicedesign", + "modelKey": "mimo-v2.5-tts-voicedesign", + "displayName": "MiMo-V2.5-TTS-VoiceDesign", + "family": "mimo", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "xiaomi-token-plan-sgp/mimo-v2-omni", + "provider": "xiaomi-token-plan-sgp", + "model": "mimo-v2-omni", + "displayName": "MiMo-V2-Omni", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-sgp" + ], + "aliases": [ + "xiaomi-token-plan-sgp/mimo-v2-omni" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-sgp", + "model": "mimo-v2-omni", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-Omni" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-sgp", + "providerName": "Xiaomi Token Plan (Singapore)", + "providerApi": "https://token-plan-sgp.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2-omni", + "modelKey": "mimo-v2-omni", + "displayName": "MiMo-V2-Omni", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xiaomi-token-plan-sgp/mimo-v2-pro", + "provider": "xiaomi-token-plan-sgp", + "model": "mimo-v2-pro", + "displayName": "MiMo-V2-Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-sgp" + ], + "aliases": [ + "xiaomi-token-plan-sgp/mimo-v2-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-sgp", + "model": "mimo-v2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-sgp", + "providerName": "Xiaomi Token Plan (Singapore)", + "providerApi": "https://token-plan-sgp.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2-pro", + "modelKey": "mimo-v2-pro", + "displayName": "MiMo-V2-Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xiaomi-token-plan-sgp/mimo-v2-tts", + "provider": "xiaomi-token-plan-sgp", + "model": "mimo-v2-tts", + "displayName": "MiMo-V2-TTS", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-sgp" + ], + "aliases": [ + "xiaomi-token-plan-sgp/mimo-v2-tts" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-sgp", + "model": "mimo-v2-tts", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-TTS" + ], + "families": [ + "mimo" + ], + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-sgp", + "providerName": "Xiaomi Token Plan (Singapore)", + "providerApi": "https://token-plan-sgp.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2-tts", + "modelKey": "mimo-v2-tts", + "displayName": "MiMo-V2-TTS", + "family": "mimo", + "metadata": { + "lastUpdated": "2026-03-18", + "openWeights": true, + "releaseDate": "2026-03-18" + } + } + ] + }, + { + "id": "xiaomi-token-plan-sgp/mimo-v2.5", + "provider": "xiaomi-token-plan-sgp", + "model": "mimo-v2.5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-sgp" + ], + "aliases": [ + "xiaomi-token-plan-sgp/mimo-v2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-sgp", + "model": "mimo-v2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-sgp", + "providerName": "Xiaomi Token Plan (Singapore)", + "providerApi": "https://token-plan-sgp.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5", + "modelKey": "mimo-v2.5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xiaomi-token-plan-sgp/mimo-v2.5-pro", + "provider": "xiaomi-token-plan-sgp", + "model": "mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-sgp" + ], + "aliases": [ + "xiaomi-token-plan-sgp/mimo-v2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-sgp", + "model": "mimo-v2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-sgp", + "providerName": "Xiaomi Token Plan (Singapore)", + "providerApi": "https://token-plan-sgp.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5-pro", + "modelKey": "mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xiaomi-token-plan-sgp/mimo-v2.5-tts", + "provider": "xiaomi-token-plan-sgp", + "model": "mimo-v2.5-tts", + "displayName": "MiMo-V2.5-TTS", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-sgp" + ], + "aliases": [ + "xiaomi-token-plan-sgp/mimo-v2.5-tts" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-sgp", + "model": "mimo-v2.5-tts", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-TTS" + ], + "families": [ + "mimo" + ], + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-sgp", + "providerName": "Xiaomi Token Plan (Singapore)", + "providerApi": "https://token-plan-sgp.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5-tts", + "modelKey": "mimo-v2.5-tts", + "displayName": "MiMo-V2.5-TTS", + "family": "mimo", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "xiaomi-token-plan-sgp/mimo-v2.5-tts-voiceclone", + "provider": "xiaomi-token-plan-sgp", + "model": "mimo-v2.5-tts-voiceclone", + "displayName": "MiMo-V2.5-TTS-VoiceClone", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-sgp" + ], + "aliases": [ + "xiaomi-token-plan-sgp/mimo-v2.5-tts-voiceclone" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-sgp", + "model": "mimo-v2.5-tts-voiceclone", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-TTS-VoiceClone" + ], + "families": [ + "mimo" + ], + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-sgp", + "providerName": "Xiaomi Token Plan (Singapore)", + "providerApi": "https://token-plan-sgp.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5-tts-voiceclone", + "modelKey": "mimo-v2.5-tts-voiceclone", + "displayName": "MiMo-V2.5-TTS-VoiceClone", + "family": "mimo", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "xiaomi-token-plan-sgp/mimo-v2.5-tts-voicedesign", + "provider": "xiaomi-token-plan-sgp", + "model": "mimo-v2.5-tts-voicedesign", + "displayName": "MiMo-V2.5-TTS-VoiceDesign", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi-token-plan-sgp" + ], + "aliases": [ + "xiaomi-token-plan-sgp/mimo-v2.5-tts-voicedesign" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8192, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": true, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi-token-plan-sgp", + "model": "mimo-v2.5-tts-voicedesign", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-TTS-VoiceDesign" + ], + "families": [ + "mimo" + ], + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi-token-plan-sgp", + "providerName": "Xiaomi Token Plan (Singapore)", + "providerApi": "https://token-plan-sgp.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5-tts-voicedesign", + "modelKey": "mimo-v2.5-tts-voicedesign", + "displayName": "MiMo-V2.5-TTS-VoiceDesign", + "family": "mimo", + "metadata": { + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22" + } + } + ] + }, + { + "id": "xiaomi/mimo-v2-flash", + "provider": "xiaomi", + "model": "mimo-v2-flash", + "displayName": "MiMo-V2-Flash", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi" + ], + "aliases": [ + "xiaomi/mimo-v2-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi", + "model": "mimo-v2-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-Flash" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12-01", + "releaseDate": "2025-12-16", + "lastUpdated": "2026-02-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi", + "providerName": "Xiaomi", + "providerApi": "https://api.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2-flash", + "modelKey": "mimo-v2-flash", + "displayName": "MiMo-V2-Flash", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12-01", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2025-12-16", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xiaomi/mimo-v2-omni", + "provider": "xiaomi", + "model": "mimo-v2-omni", + "displayName": "MiMo-V2-Omni", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi" + ], + "aliases": [ + "xiaomi/mimo-v2-omni" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi", + "model": "mimo-v2-omni", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-Omni" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi", + "providerName": "Xiaomi", + "providerApi": "https://api.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2-omni", + "modelKey": "mimo-v2-omni", + "displayName": "MiMo-V2-Omni", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xiaomi/mimo-v2-pro", + "provider": "xiaomi", + "model": "mimo-v2-pro", + "displayName": "MiMo-V2-Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi" + ], + "aliases": [ + "xiaomi/mimo-v2-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi", + "model": "mimo-v2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.4, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi", + "providerName": "Xiaomi", + "providerApi": "https://api.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2-pro", + "modelKey": "mimo-v2-pro", + "displayName": "MiMo-V2-Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xiaomi/mimo-v2.5", + "provider": "xiaomi", + "model": "mimo-v2.5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi" + ], + "aliases": [ + "xiaomi/mimo-v2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi", + "model": "mimo-v2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.4, + "output": 2 + }, + "tiered": { + "contextOver200K": { + "input": 0.8, + "output": 4, + "cache_read": 0.16 + }, + "tiers": [ + { + "input": 0.8, + "output": 4, + "cache_read": 0.16, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi", + "providerName": "Xiaomi", + "providerApi": "https://api.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5", + "modelKey": "mimo-v2.5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xiaomi/mimo-v2.5-pro", + "provider": "xiaomi", + "model": "mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi" + ], + "aliases": [ + "xiaomi/mimo-v2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi", + "model": "mimo-v2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.4, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi", + "providerName": "Xiaomi", + "providerApi": "https://api.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5-pro", + "modelKey": "mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xiaomi/mimo-v2.5-pro-ultraspeed", + "provider": "xiaomi", + "model": "mimo-v2.5-pro-ultraspeed", + "displayName": "MiMo-V2.5-Pro-UltraSpeed", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "xiaomi" + ], + "aliases": [ + "xiaomi/mimo-v2.5-pro-ultraspeed" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xiaomi", + "model": "mimo-v2.5-pro-ultraspeed", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0108, + "input": 1.305, + "output": 2.61 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-Pro-UltraSpeed" + ], + "families": [ + "mimo" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-06-08", + "lastUpdated": "2026-06-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xiaomi", + "providerName": "Xiaomi", + "providerApi": "https://api.xiaomimimo.com/v1", + "providerDoc": "https://platform.xiaomimimo.com/#/docs", + "model": "mimo-v2.5-pro-ultraspeed", + "modelKey": "mimo-v2.5-pro-ultraspeed", + "displayName": "MiMo-V2.5-Pro-UltraSpeed", + "family": "mimo", + "status": "beta", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-06-09", + "openWeights": true, + "releaseDate": "2026-06-08", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "xpersona/xpersona-frieren-coder", + "provider": "xpersona", + "model": "xpersona-frieren-coder", + "displayName": "Xpersona Frieren 1", + "sources": [ + "models.dev" + ], + "providers": [ + "xpersona" + ], + "aliases": [ + "xpersona/xpersona-frieren-coder" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 384000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xpersona", + "model": "xpersona-frieren-coder", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 1.5, + "output": 6, + "reasoningOutput": 6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Xpersona Frieren 1" + ], + "knowledgeCutoff": "2025-12-30", + "releaseDate": "2026-05-01", + "lastUpdated": "2026-05-25", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xpersona", + "providerName": "Xpersona", + "providerApi": "https://www.xpersona.co/v1", + "providerDoc": "https://www.xpersona.co/docs", + "model": "xpersona-frieren-coder", + "modelKey": "xpersona-frieren-coder", + "displayName": "Xpersona Frieren 1", + "metadata": { + "knowledgeCutoff": "2025-12-30", + "lastUpdated": "2026-05-25", + "openWeights": false, + "releaseDate": "2026-05-01" + } + } + ] + }, + { + "id": "xpersona/xpersona-gpt-5.5", + "provider": "xpersona", + "model": "xpersona-gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "sources": [ + "models.dev" + ], + "providers": [ + "xpersona" + ], + "aliases": [ + "xpersona/xpersona-gpt-5.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 128000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "xpersona", + "model": "xpersona-gpt-5.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "input": 3, + "output": 18, + "reasoningOutput": 18 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GPT-5.5" + ], + "families": [ + "gpt" + ], + "knowledgeCutoff": "2025-12-30", + "releaseDate": "2026-05-29", + "lastUpdated": "2026-05-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "xpersona", + "providerName": "Xpersona", + "providerApi": "https://www.xpersona.co/v1", + "providerDoc": "https://www.xpersona.co/docs", + "model": "xpersona-gpt-5.5", + "modelKey": "xpersona-gpt-5.5", + "displayName": "GPT-5.5", + "family": "gpt", + "metadata": { + "knowledgeCutoff": "2025-12-30", + "lastUpdated": "2026-05-29", + "openWeights": false, + "releaseDate": "2026-05-29" + } + } + ] + }, + { + "id": "you-com/search", + "provider": "you-com", + "model": "search", + "mode": "search", + "sources": [ + "litellm" + ], + "providers": [ + "you_com" + ], + "aliases": [ + "you_com/search" + ], + "mergedProviderModelRecords": 1, + "limits": { + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "you_com", + "model": "you_com/search", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "perQuery": { + "input": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "search" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "you_com", + "model": "you_com/search", + "mode": "search" + } + ] + }, + { + "id": "z-ai/autoglm-phone-9b", + "provider": "z-ai", + "model": "autoglm-phone-9b", + "displayName": "Z-Ai/Autoglm Phone 9b", + "sources": [ + "models.dev" + ], + "providers": [ + "qiniu-ai" + ], + "aliases": [ + "qiniu-ai/z-ai/autoglm-phone-9b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 12800, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "Z-Ai/Autoglm Phone 9b" + ], + "releaseDate": "2025-12-23", + "lastUpdated": "2025-12-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "z-ai/autoglm-phone-9b", + "modelKey": "z-ai/autoglm-phone-9b", + "displayName": "Z-Ai/Autoglm Phone 9b", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": false, + "releaseDate": "2025-12-23" + } + } + ] + }, + { + "id": "z-ai/autoglm-phone-9b-multilingual", + "provider": "z-ai", + "model": "autoglm-phone-9b-multilingual", + "displayName": "AutoGLM-Phone-9B-Multilingual", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "novita", + "novita-ai" + ], + "aliases": [ + "novita-ai/zai-org/autoglm-phone-9b-multilingual", + "novita/zai-org/autoglm-phone-9b-multilingual" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 65536, + "inputTokens": 65536, + "maxTokens": 65536, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "novita-ai", + "model": "zai-org/autoglm-phone-9b-multilingual", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.035, + "output": 0.138 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/zai-org/autoglm-phone-9b-multilingual", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.035, + "output": 0.138 + } + } + ] + }, + "metadata": { + "displayNames": [ + "AutoGLM-Phone-9B-Multilingual" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-12-10", + "lastUpdated": "2025-12-10", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "zai-org/autoglm-phone-9b-multilingual", + "modelKey": "zai-org/autoglm-phone-9b-multilingual", + "displayName": "AutoGLM-Phone-9B-Multilingual", + "metadata": { + "lastUpdated": "2025-12-10", + "openWeights": true, + "releaseDate": "2025-12-10" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/zai-org/autoglm-phone-9b-multilingual", + "mode": "chat" + } + ] + }, + { + "id": "z-ai/glm-4", + "provider": "z-ai", + "model": "glm-4", + "displayName": "GLM-4", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/glm-4" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "glm-4", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 14.994, + "output": 14.994 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-4" + ], + "releaseDate": "2024-01-16", + "lastUpdated": "2024-01-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "glm-4", + "modelKey": "glm-4", + "displayName": "GLM-4", + "metadata": { + "lastUpdated": "2024-01-16", + "openWeights": false, + "releaseDate": "2024-01-16" + } + } + ] + }, + { + "id": "z-ai/glm-4-32b", + "provider": "z-ai", + "model": "glm-4-32b", + "displayName": "Z.ai: GLM 4 32B", + "sources": [ + "models.dev" + ], + "providers": [ + "kilo" + ], + "aliases": [ + "kilo/z-ai/glm-4-32b" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 32768, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "kilo", + "model": "z-ai/glm-4-32b", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Z.ai: GLM 4 32B" + ], + "releaseDate": "2025-07-25", + "lastUpdated": "2026-03-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "z-ai/glm-4-32b", + "modelKey": "z-ai/glm-4-32b", + "displayName": "Z.ai: GLM 4 32B", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-07-25" + } + } + ] + }, + { + "id": "z-ai/glm-4-32b-0414", + "provider": "z-ai", + "model": "glm-4-32b-0414", + "displayName": "GLM 4 32B 0414", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/THUDM/GLM-4-32B-0414" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "THUDM/GLM-4-32B-0414", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4 32B 0414" + ], + "families": [ + "glm" + ], + "releaseDate": "2025-04-14", + "lastUpdated": "2025-04-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "THUDM/GLM-4-32B-0414", + "modelKey": "THUDM/GLM-4-32B-0414", + "displayName": "GLM 4 32B 0414", + "family": "glm", + "metadata": { + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + } + ] + }, + { + "id": "z-ai/glm-4-32b-0414-128k", + "provider": "z-ai", + "model": "glm-4-32b-0414-128k", + "displayName": "GLM-4 32B (0414-128k)", + "family": "glm", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "llmgateway", + "zai" + ], + "aliases": [ + "llmgateway/glm-4-32b-0414-128k", + "zai/glm-4-32b-0414-128k" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "glm-4-32b-0414-128k", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + }, + { + "source": "litellm", + "provider": "zai", + "model": "zai/glm-4-32b-0414-128k", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.1, + "output": 0.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-4 32B (0414-128k)" + ], + "families": [ + "glm" + ], + "modes": [ + "chat" + ], + "releaseDate": "2025-04-14", + "lastUpdated": "2025-04-14", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "glm-4-32b-0414-128k", + "modelKey": "glm-4-32b-0414-128k", + "displayName": "GLM-4 32B (0414-128k)", + "family": "glm", + "metadata": { + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "zai", + "model": "zai/glm-4-32b-0414-128k", + "mode": "chat", + "metadata": { + "source": "https://docs.z.ai/guides/overview/pricing" + } + } + ] + }, + { + "id": "z-ai/glm-4-7-251222", + "provider": "z-ai", + "model": "glm-4-7-251222", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "volcengine" + ], + "aliases": [ + "volcengine/glm-4-7-251222" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "inputTokens": 204800, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "assistantPrefill": true, + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "volcengine", + "model": "glm-4-7-251222", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "volcengine", + "model": "glm-4-7-251222", + "mode": "chat" + } + ] + }, + { + "id": "z-ai/glm-4-9b-0414", + "provider": "z-ai", + "model": "glm-4-9b-0414", + "displayName": "GLM 4 9B 0414", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/THUDM/GLM-4-9B-0414" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "THUDM/GLM-4-9B-0414", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4 9B 0414" + ], + "families": [ + "glm" + ], + "releaseDate": "2025-04-14", + "lastUpdated": "2025-04-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "THUDM/GLM-4-9B-0414", + "modelKey": "THUDM/GLM-4-9B-0414", + "displayName": "GLM 4 9B 0414", + "family": "glm", + "metadata": { + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + } + ] + }, + { + "id": "z-ai/glm-4-air", + "provider": "z-ai", + "model": "glm-4-air", + "displayName": "GLM-4 Air", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/glm-4-air" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "glm-4-air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2006, + "output": 0.2006 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-4 Air" + ], + "releaseDate": "2024-06-05", + "lastUpdated": "2024-06-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "glm-4-air", + "modelKey": "glm-4-air", + "displayName": "GLM-4 Air", + "metadata": { + "lastUpdated": "2024-06-05", + "openWeights": false, + "releaseDate": "2024-06-05" + } + } + ] + }, + { + "id": "z-ai/glm-4-air-0111", + "provider": "z-ai", + "model": "glm-4-air-0111", + "displayName": "GLM 4 Air 0111", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/glm-4-air-0111" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "glm-4-air-0111", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1394, + "output": 0.1394 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4 Air 0111" + ], + "releaseDate": "2025-01-11", + "lastUpdated": "2025-01-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "glm-4-air-0111", + "modelKey": "glm-4-air-0111", + "displayName": "GLM 4 Air 0111", + "metadata": { + "lastUpdated": "2025-01-11", + "openWeights": false, + "releaseDate": "2025-01-11" + } + } + ] + }, + { + "id": "z-ai/glm-4-airx", + "provider": "z-ai", + "model": "glm-4-airx", + "displayName": "GLM-4 AirX", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/glm-4-airx" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 8000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "glm-4-airx", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 2.006, + "output": 2.006 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-4 AirX" + ], + "releaseDate": "2024-06-05", + "lastUpdated": "2024-06-05", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "glm-4-airx", + "modelKey": "glm-4-airx", + "displayName": "GLM-4 AirX", + "metadata": { + "lastUpdated": "2024-06-05", + "openWeights": false, + "releaseDate": "2024-06-05" + } + } + ] + }, + { + "id": "z-ai/glm-4-flash", + "provider": "z-ai", + "model": "glm-4-flash", + "displayName": "GLM-4 Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/glm-4-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "glm-4-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1003, + "output": 0.1003 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-4 Flash" + ], + "releaseDate": "2024-08-01", + "lastUpdated": "2024-08-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "glm-4-flash", + "modelKey": "glm-4-flash", + "displayName": "GLM-4 Flash", + "metadata": { + "lastUpdated": "2024-08-01", + "openWeights": false, + "releaseDate": "2024-08-01" + } + } + ] + }, + { + "id": "z-ai/glm-4-long", + "provider": "z-ai", + "model": "glm-4-long", + "displayName": "GLM-4 Long", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/glm-4-long" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "inputTokens": 1000000, + "outputTokens": 4096, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "glm-4-long", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2006, + "output": 0.2006 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-4 Long" + ], + "releaseDate": "2024-08-01", + "lastUpdated": "2024-08-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "glm-4-long", + "modelKey": "glm-4-long", + "displayName": "GLM-4 Long", + "metadata": { + "lastUpdated": "2024-08-01", + "openWeights": false, + "releaseDate": "2024-08-01" + } + } + ] + }, + { + "id": "z-ai/glm-4-plus", + "provider": "z-ai", + "model": "glm-4-plus", + "displayName": "GLM-4 Plus", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/glm-4-plus" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "glm-4-plus", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 7.497, + "output": 7.497 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-4 Plus" + ], + "releaseDate": "2024-08-01", + "lastUpdated": "2024-08-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "glm-4-plus", + "modelKey": "glm-4-plus", + "displayName": "GLM-4 Plus", + "metadata": { + "lastUpdated": "2024-08-01", + "openWeights": false, + "releaseDate": "2024-08-01" + } + } + ] + }, + { + "id": "z-ai/glm-4-plus-0111", + "provider": "z-ai", + "model": "glm-4-plus-0111", + "displayName": "GLM 4 Plus 0111", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/glm-4-plus-0111" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "glm-4-plus-0111", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 9.996, + "output": 9.996 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4 Plus 0111" + ], + "releaseDate": "2025-02-19", + "lastUpdated": "2025-02-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "glm-4-plus-0111", + "modelKey": "glm-4-plus-0111", + "displayName": "GLM 4 Plus 0111", + "metadata": { + "lastUpdated": "2025-02-19", + "openWeights": false, + "releaseDate": "2025-02-19" + } + } + ] + }, + { + "id": "z-ai/glm-4.1v-thinking-flash", + "provider": "z-ai", + "model": "glm-4.1v-thinking-flash", + "displayName": "GLM 4.1V Thinking Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/glm-4.1v-thinking-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 64000, + "inputTokens": 64000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "glm-4.1v-thinking-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.1V Thinking Flash" + ], + "releaseDate": "2025-07-09", + "lastUpdated": "2025-07-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "glm-4.1v-thinking-flash", + "modelKey": "glm-4.1v-thinking-flash", + "displayName": "GLM 4.1V Thinking Flash", + "metadata": { + "lastUpdated": "2025-07-09", + "openWeights": false, + "releaseDate": "2025-07-09" + } + } + ] + }, + { + "id": "z-ai/glm-4.1v-thinking-flashx", + "provider": "z-ai", + "model": "glm-4.1v-thinking-flashx", + "displayName": "GLM 4.1V Thinking FlashX", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/glm-4.1v-thinking-flashx" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 64000, + "inputTokens": 64000, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "glm-4.1v-thinking-flashx", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.1V Thinking FlashX" + ], + "releaseDate": "2025-07-09", + "lastUpdated": "2025-07-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "glm-4.1v-thinking-flashx", + "modelKey": "glm-4.1v-thinking-flashx", + "displayName": "GLM 4.1V Thinking FlashX", + "metadata": { + "lastUpdated": "2025-07-09", + "openWeights": false, + "releaseDate": "2025-07-09" + } + } + ] + }, + { + "id": "z-ai/glm-4.5", + "provider": "z-ai", + "model": "glm-4.5", + "displayName": "GLM-4.5", + "family": "glm", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "abacus", + "cortecs", + "deepinfra", + "jiekou", + "kilo", + "llmgateway", + "merge-gateway", + "modelscope", + "nano-gpt", + "novita", + "novita-ai", + "openrouter", + "orcarouter", + "qiniu-ai", + "siliconflow", + "vercel", + "vercel_ai_gateway", + "wandb", + "zai", + "zenmux", + "zhipuai" + ], + "aliases": [ + "302ai/glm-4.5", + "abacus/zai-org/glm-4.5", + "cortecs/glm-4.5", + "deepinfra/zai-org/GLM-4.5", + "jiekou/zai-org/glm-4.5", + "kilo/z-ai/glm-4.5", + "llmgateway/glm-4.5", + "merge-gateway/zai/glm-4.5", + "modelscope/ZhipuAI/GLM-4.5", + "nano-gpt/zai-org/glm-4.5", + "novita-ai/zai-org/glm-4.5", + "novita/zai-org/glm-4.5", + "openrouter/z-ai/glm-4.5", + "orcarouter/z-ai/glm-4.5", + "qiniu-ai/glm-4.5", + "siliconflow/zai-org/GLM-4.5", + "vercel/zai/glm-4.5", + "vercel_ai_gateway/zai/glm-4.5", + "wandb/zai-org/GLM-4.5", + "zai/glm-4.5", + "zenmux/z-ai/glm-4.5", + "zhipuai/glm-4.5" + ], + "mergedProviderModelRecords": 22, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": false, + "interleaved": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "glm-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.286, + "output": 1.142 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "zai-org/glm-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "glm-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.67, + "output": 2.46 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "zai-org/glm-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "z-ai/glm-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "glm-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "zai/glm-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "modelscope", + "model": "ZhipuAI/GLM-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.3 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "zai-org/glm-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "z-ai/glm-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "z-ai/glm-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "zai-org/GLM-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "zai/glm-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "zai", + "model": "glm-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "z-ai/glm-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.07, + "input": 0.35, + "output": 1.54 + } + }, + { + "source": "models.dev", + "provider": "zhipuai", + "model": "glm-4.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "litellm", + "provider": "deepinfra", + "model": "deepinfra/zai-org/GLM-4.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 1.6 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/zai-org/glm-4.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.6, + "output": 2.2 + }, + "extra": { + "input_cost_per_token_cache_hit": 1.1e-7 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/zai/glm-4.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "litellm", + "provider": "wandb", + "model": "wandb/zai-org/GLM-4.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 55000, + "output": 200000 + } + }, + { + "source": "litellm", + "provider": "zai", + "model": "zai/glm-4.5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "z-ai/glm-4.5", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.6, + "output": 2.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.5", + "GLM-4.5", + "Z.ai: GLM 4.5", + "zai-org/GLM-4.5" + ], + "families": [ + "glm" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-07-29", + "lastUpdated": "2025-07-29", + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 22 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "glm-4.5", + "modelKey": "glm-4.5", + "displayName": "GLM-4.5", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-29", + "openWeights": true, + "releaseDate": "2025-07-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "zai-org/glm-4.5", + "modelKey": "zai-org/glm-4.5", + "displayName": "GLM-4.5", + "family": "glm", + "metadata": { + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "glm-4.5", + "modelKey": "glm-4.5", + "displayName": "GLM 4.5", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-29", + "openWeights": true, + "releaseDate": "2025-07-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "zai-org/glm-4.5", + "modelKey": "zai-org/glm-4.5", + "displayName": "GLM-4.5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "z-ai/glm-4.5", + "modelKey": "z-ai/glm-4.5", + "displayName": "Z.ai: GLM 4.5", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "glm-4.5", + "modelKey": "glm-4.5", + "displayName": "GLM-4.5", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "zai/glm-4.5", + "modelKey": "zai/glm-4.5", + "displayName": "GLM-4.5", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "modelscope", + "providerName": "ModelScope", + "providerApi": "https://api-inference.modelscope.cn/v1", + "providerDoc": "https://modelscope.cn/docs/model-service/API-Inference/intro", + "model": "ZhipuAI/GLM-4.5", + "modelKey": "ZhipuAI/GLM-4.5", + "displayName": "GLM-4.5", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-4.5", + "modelKey": "zai-org/glm-4.5", + "displayName": "GLM 4.5", + "metadata": { + "lastUpdated": "2025-04-15", + "openWeights": false, + "releaseDate": "2025-04-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "zai-org/glm-4.5", + "modelKey": "zai-org/glm-4.5", + "displayName": "GLM-4.5", + "family": "glm", + "metadata": { + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "z-ai/glm-4.5", + "modelKey": "z-ai/glm-4.5", + "displayName": "GLM-4.5", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "z-ai/glm-4.5", + "modelKey": "z-ai/glm-4.5", + "displayName": "GLM-4.5", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "glm-4.5", + "modelKey": "glm-4.5", + "displayName": "GLM 4.5", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "zai-org/GLM-4.5", + "modelKey": "zai-org/GLM-4.5", + "displayName": "zai-org/GLM-4.5", + "family": "glm", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "zai/glm-4.5", + "modelKey": "zai/glm-4.5", + "displayName": "GLM 4.5", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai", + "providerName": "Z.AI", + "providerApi": "https://api.z.ai/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.5", + "modelKey": "glm-4.5", + "displayName": "GLM-4.5", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "z-ai/glm-4.5", + "modelKey": "z-ai/glm-4.5", + "displayName": "GLM 4.5", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-07-25", + "openWeights": false, + "releaseDate": "2025-07-25", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai", + "providerName": "Zhipu AI", + "providerApi": "https://open.bigmodel.cn/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.5", + "modelKey": "glm-4.5", + "displayName": "GLM-4.5", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "deepinfra", + "model": "deepinfra/zai-org/GLM-4.5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/zai-org/glm-4.5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/zai/glm-4.5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "wandb", + "model": "wandb/zai-org/GLM-4.5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "zai", + "model": "zai/glm-4.5", + "mode": "chat", + "metadata": { + "source": "https://docs.z.ai/guides/overview/pricing" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "z-ai/glm-4.5", + "displayName": "Z.ai: GLM 4.5", + "metadata": { + "canonicalSlug": "z-ai/glm-4.5", + "createdAt": "2025-07-25T19:22:27.000Z", + "expirationDate": "2026-12-31", + "huggingFaceId": "zai-org/GLM-4.5", + "knowledgeCutoff": "2024-12-31", + "links": { + "details": "/api/v1/models/z-ai/glm-4.5/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 98304, + "is_moderated": false + } + } + } + ] + }, + { + "id": "z-ai/glm-4.5-air", + "provider": "z-ai", + "model": "glm-4.5-air", + "displayName": "GLM-4.5-Air", + "family": "glm-air", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "cortecs", + "kilo", + "llmgateway", + "merge-gateway", + "nano-gpt", + "novita", + "novita-ai", + "openrouter", + "orcarouter", + "qiniu-ai", + "siliconflow", + "siliconflow-cn", + "submodel", + "vercel", + "vercel_ai_gateway", + "zai", + "zai-coding-plan", + "zenmux", + "zhipuai", + "zhipuai-coding-plan" + ], + "aliases": [ + "302ai/glm-4.5-air", + "cortecs/glm-4.5-air", + "kilo/z-ai/glm-4.5-air", + "llmgateway/glm-4.5-air", + "merge-gateway/zai/glm-4.5-air", + "nano-gpt/zai-org/GLM-4.5-Air", + "novita-ai/zai-org/glm-4.5-air", + "novita/zai-org/glm-4.5-air", + "openrouter/z-ai/glm-4.5-air", + "orcarouter/z-ai/glm-4.5-air", + "qiniu-ai/glm-4.5-air", + "siliconflow-cn/zai-org/GLM-4.5-Air", + "siliconflow/zai-org/GLM-4.5-Air", + "submodel/zai-org/GLM-4.5-Air", + "vercel/zai/glm-4.5-air", + "vercel_ai_gateway/zai/glm-4.5-air", + "zai-coding-plan/glm-4.5-air", + "zai/glm-4.5-air", + "zenmux/z-ai/glm-4.5-air", + "zhipuai-coding-plan/glm-4.5-air", + "zhipuai/glm-4.5-air" + ], + "mergedProviderModelRecords": 21, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 98304, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": false, + "webSearch": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "glm-4.5-air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1143, + "output": 0.286 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "glm-4.5-air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.22, + "output": 1.34 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "z-ai/glm-4.5-air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.13, + "output": 0.85 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "glm-4.5-air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0, + "input": 0.2, + "output": 1.1 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "zai/glm-4.5-air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0, + "input": 0.2, + "output": 1.1 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/GLM-4.5-Air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "zai-org/glm-4.5-air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.13, + "output": 0.85 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "z-ai/glm-4.5-air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.13, + "output": 0.85 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "z-ai/glm-4.5-air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0, + "input": 0.2, + "output": 1.1 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "zai-org/GLM-4.5-Air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.86 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "zai-org/GLM-4.5-Air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.86 + } + }, + { + "source": "models.dev", + "provider": "submodel", + "model": "zai-org/GLM-4.5-Air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "zai/glm-4.5-air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.2, + "output": 1.1 + } + }, + { + "source": "models.dev", + "provider": "zai-coding-plan", + "model": "glm-4.5-air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "zai", + "model": "glm-4.5-air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0, + "input": 0.2, + "output": 1.1 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "z-ai/glm-4.5-air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "input": 0.11, + "output": 0.56 + } + }, + { + "source": "models.dev", + "provider": "zhipuai-coding-plan", + "model": "glm-4.5-air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "zhipuai", + "model": "glm-4.5-air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "cacheWrite": 0, + "input": 0.2, + "output": 1.1 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/zai-org/glm-4.5-air", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.13, + "output": 0.85 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/zai/glm-4.5-air", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 1.1 + } + }, + { + "source": "litellm", + "provider": "zai", + "model": "zai/glm-4.5-air", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 1.1 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "z-ai/glm-4.5-air", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.025, + "input": 0.13, + "output": 0.85 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.5 Air", + "GLM-4.5-Air", + "Z.ai: GLM 4.5 Air", + "glm-4.5-air", + "zai-org/GLM-4.5-Air" + ], + "families": [ + "glm-air" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-07-29", + "lastUpdated": "2025-07-29", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 21 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "glm-4.5-air", + "modelKey": "glm-4.5-air", + "displayName": "glm-4.5-air", + "family": "glm-air", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-29", + "openWeights": true, + "releaseDate": "2025-07-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "glm-4.5-air", + "modelKey": "glm-4.5-air", + "displayName": "GLM 4.5 Air", + "family": "glm-air", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-08-01", + "openWeights": true, + "releaseDate": "2025-08-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "z-ai/glm-4.5-air", + "modelKey": "z-ai/glm-4.5-air", + "displayName": "Z.ai: GLM 4.5 Air", + "metadata": { + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "glm-4.5-air", + "modelKey": "glm-4.5-air", + "displayName": "GLM-4.5-Air", + "family": "glm-air", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "zai/glm-4.5-air", + "modelKey": "zai/glm-4.5-air", + "displayName": "GLM-4.5-Air", + "family": "glm-air", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/GLM-4.5-Air", + "modelKey": "zai-org/GLM-4.5-Air", + "displayName": "GLM 4.5 Air", + "metadata": { + "lastUpdated": "2025-04-15", + "openWeights": false, + "releaseDate": "2025-04-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "zai-org/glm-4.5-air", + "modelKey": "zai-org/glm-4.5-air", + "displayName": "GLM 4.5 Air", + "family": "glm-air", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-10-13", + "openWeights": true, + "releaseDate": "2025-10-13", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "z-ai/glm-4.5-air", + "modelKey": "z-ai/glm-4.5-air", + "displayName": "GLM-4.5-Air", + "family": "glm-air", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "z-ai/glm-4.5-air", + "modelKey": "z-ai/glm-4.5-air", + "displayName": "GLM-4.5-Air", + "family": "glm-air", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "glm-4.5-air", + "modelKey": "glm-4.5-air", + "displayName": "GLM 4.5 Air", + "metadata": { + "lastUpdated": "2025-08-05", + "openWeights": false, + "releaseDate": "2025-08-05" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "zai-org/GLM-4.5-Air", + "modelKey": "zai-org/GLM-4.5-Air", + "displayName": "zai-org/GLM-4.5-Air", + "family": "glm-air", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "zai-org/GLM-4.5-Air", + "modelKey": "zai-org/GLM-4.5-Air", + "displayName": "zai-org/GLM-4.5-Air", + "family": "glm-air", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "submodel", + "providerName": "submodel", + "providerApi": "https://llm.submodel.ai/v1", + "providerDoc": "https://submodel.gitbook.io", + "model": "zai-org/GLM-4.5-Air", + "modelKey": "zai-org/GLM-4.5-Air", + "displayName": "GLM 4.5 Air", + "family": "glm-air", + "metadata": { + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "zai/glm-4.5-air", + "modelKey": "zai/glm-4.5-air", + "displayName": "GLM 4.5 Air", + "family": "glm-air", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai-coding-plan", + "providerName": "Z.AI Coding Plan", + "providerApi": "https://api.z.ai/api/coding/paas/v4", + "providerDoc": "https://docs.z.ai/devpack/overview", + "model": "glm-4.5-air", + "modelKey": "glm-4.5-air", + "displayName": "GLM-4.5-Air", + "family": "glm-air", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai", + "providerName": "Z.AI", + "providerApi": "https://api.z.ai/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.5-air", + "modelKey": "glm-4.5-air", + "displayName": "GLM-4.5-Air", + "family": "glm-air", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "z-ai/glm-4.5-air", + "modelKey": "z-ai/glm-4.5-air", + "displayName": "GLM 4.5 Air", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-07-25", + "openWeights": false, + "releaseDate": "2025-07-25", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai-coding-plan", + "providerName": "Zhipu AI Coding Plan", + "providerApi": "https://open.bigmodel.cn/api/coding/paas/v4", + "providerDoc": "https://docs.bigmodel.cn/cn/coding-plan/overview", + "model": "glm-4.5-air", + "modelKey": "glm-4.5-air", + "displayName": "GLM-4.5-Air", + "family": "glm-air", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai", + "providerName": "Zhipu AI", + "providerApi": "https://open.bigmodel.cn/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.5-air", + "modelKey": "glm-4.5-air", + "displayName": "GLM-4.5-Air", + "family": "glm-air", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/zai-org/glm-4.5-air", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/zai/glm-4.5-air", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "zai", + "model": "zai/glm-4.5-air", + "mode": "chat", + "metadata": { + "source": "https://docs.z.ai/guides/overview/pricing" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "z-ai/glm-4.5-air", + "displayName": "Z.ai: GLM 4.5 Air", + "metadata": { + "canonicalSlug": "z-ai/glm-4.5-air", + "createdAt": "2025-07-25T19:20:58.000Z", + "huggingFaceId": "zai-org/GLM-4.5-Air", + "knowledgeCutoff": "2024-12-31", + "links": { + "details": "/api/v1/models/z-ai/glm-4.5-air/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 98304, + "is_moderated": false + } + } + } + ] + }, + { + "id": "z-ai/glm-4.5-air-fp8", + "provider": "z-ai", + "model": "glm-4.5-air-fp8", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "together_ai" + ], + "aliases": [ + "together_ai/zai-org/GLM-4.5-Air-FP8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "parallelFunctionCalling": true, + "pdfInput": false, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/zai-org/GLM-4.5-Air-FP8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.2, + "output": 1.1 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/zai-org/GLM-4.5-Air-FP8", + "mode": "chat", + "metadata": { + "source": "https://www.together.ai/models/glm-4-5-air" + } + } + ] + }, + { + "id": "z-ai/glm-4.5-air:thinking", + "provider": "z-ai", + "model": "glm-4.5-air:thinking", + "displayName": "GLM 4.5 Air (Thinking)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/GLM-4.5-Air:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 98304, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/GLM-4.5-Air:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.5 Air (Thinking)" + ], + "releaseDate": "2024-01-01", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/GLM-4.5-Air:thinking", + "modelKey": "zai-org/GLM-4.5-Air:thinking", + "displayName": "GLM 4.5 Air (Thinking)", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + } + ] + }, + { + "id": "z-ai/glm-4.5-airx", + "provider": "z-ai", + "model": "glm-4.5-airx", + "displayName": "glm-4.5-airx", + "family": "glm", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "llmgateway", + "zai" + ], + "aliases": [ + "302ai/glm-4.5-airx", + "llmgateway/glm-4.5-airx", + "zai/glm-4.5-airx" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "glm-4.5-airx", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.572, + "output": 1.714 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "glm-4.5-airx", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.22, + "input": 1.1, + "output": 4.5 + } + }, + { + "source": "litellm", + "provider": "zai", + "model": "zai/glm-4.5-airx", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.1, + "output": 4.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-4.5 AirX", + "glm-4.5-airx" + ], + "families": [ + "glm" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-07-29", + "lastUpdated": "2025-07-29", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "glm-4.5-airx", + "modelKey": "glm-4.5-airx", + "displayName": "glm-4.5-airx", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-29", + "openWeights": false, + "releaseDate": "2025-07-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "glm-4.5-airx", + "modelKey": "glm-4.5-airx", + "displayName": "GLM-4.5 AirX", + "family": "glm", + "metadata": { + "lastUpdated": "2025-07-28", + "openWeights": false, + "releaseDate": "2025-07-28" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "zai", + "model": "zai/glm-4.5-airx", + "mode": "chat", + "metadata": { + "source": "https://docs.z.ai/guides/overview/pricing" + } + } + ] + }, + { + "id": "z-ai/glm-4.5-flash", + "provider": "z-ai", + "model": "glm-4.5-flash", + "displayName": "GLM-4.5-Flash", + "family": "glm-flash", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "llmgateway", + "zai", + "zhipuai" + ], + "aliases": [ + "llmgateway/glm-4.5-flash", + "zai/glm-4.5-flash", + "zhipuai/glm-4.5-flash" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 131072, + "inputTokens": 128000, + "outputTokens": 98304, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "glm-4.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "zai", + "model": "glm-4.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "zhipuai", + "model": "glm-4.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "zai", + "model": "zai/glm-4.5-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-4.5-Flash" + ], + "families": [ + "glm-flash" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-07-28", + "lastUpdated": "2025-07-28", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "glm-4.5-flash", + "modelKey": "glm-4.5-flash", + "displayName": "GLM-4.5-Flash", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": false, + "releaseDate": "2025-07-28" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai", + "providerName": "Z.AI", + "providerApi": "https://api.z.ai/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.5-flash", + "modelKey": "glm-4.5-flash", + "displayName": "GLM-4.5-Flash", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai", + "providerName": "Zhipu AI", + "providerApi": "https://open.bigmodel.cn/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.5-flash", + "modelKey": "glm-4.5-flash", + "displayName": "GLM-4.5-Flash", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "zai", + "model": "zai/glm-4.5-flash", + "mode": "chat", + "metadata": { + "source": "https://docs.z.ai/guides/overview/pricing" + } + } + ] + }, + { + "id": "z-ai/glm-4.5-fp8", + "provider": "z-ai", + "model": "glm-4.5-fp8", + "displayName": "GLM 4.5 FP8", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "submodel" + ], + "aliases": [ + "submodel/zai-org/GLM-4.5-FP8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "submodel", + "model": "zai-org/GLM-4.5-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.5 FP8" + ], + "families": [ + "glm" + ], + "releaseDate": "2025-07-28", + "lastUpdated": "2025-07-28", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "submodel", + "providerName": "submodel", + "providerApi": "https://llm.submodel.ai/v1", + "providerDoc": "https://submodel.gitbook.io", + "model": "zai-org/GLM-4.5-FP8", + "modelKey": "zai-org/GLM-4.5-FP8", + "displayName": "GLM 4.5 FP8", + "family": "glm", + "metadata": { + "lastUpdated": "2025-07-28", + "openWeights": true, + "releaseDate": "2025-07-28" + } + } + ] + }, + { + "id": "z-ai/glm-4.5-x", + "provider": "z-ai", + "model": "glm-4.5-x", + "displayName": "glm-4.5-x", + "family": "glm", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "302ai", + "llmgateway", + "zai" + ], + "aliases": [ + "302ai/glm-4.5-x", + "llmgateway/glm-4.5-x", + "zai/glm-4.5-x" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "glm-4.5-x", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.143, + "output": 2.29 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "glm-4.5-x", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.45, + "input": 2.2, + "output": 8.9 + } + }, + { + "source": "litellm", + "provider": "zai", + "model": "zai/glm-4.5-x", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 2.2, + "output": 8.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-4.5 X", + "glm-4.5-x" + ], + "families": [ + "glm" + ], + "modes": [ + "chat" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-07-29", + "lastUpdated": "2025-07-29", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "glm-4.5-x", + "modelKey": "glm-4.5-x", + "displayName": "glm-4.5-x", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-07-29", + "openWeights": false, + "releaseDate": "2025-07-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "glm-4.5-x", + "modelKey": "glm-4.5-x", + "displayName": "GLM-4.5 X", + "family": "glm", + "status": "beta", + "metadata": { + "lastUpdated": "2025-07-28", + "openWeights": false, + "releaseDate": "2025-07-28" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "zai", + "model": "zai/glm-4.5-x", + "mode": "chat", + "metadata": { + "source": "https://docs.z.ai/guides/overview/pricing" + } + } + ] + }, + { + "id": "z-ai/glm-4.5:thinking", + "provider": "z-ai", + "model": "glm-4.5:thinking", + "displayName": "GLM 4.5 (Thinking)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/GLM-4.5:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/GLM-4.5:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 1.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.5 (Thinking)" + ], + "releaseDate": "2024-01-01", + "lastUpdated": "2024-01-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/GLM-4.5:thinking", + "modelKey": "zai-org/GLM-4.5:thinking", + "displayName": "GLM 4.5 (Thinking)", + "metadata": { + "lastUpdated": "2024-01-01", + "openWeights": false, + "releaseDate": "2024-01-01" + } + } + ] + }, + { + "id": "z-ai/glm-4.5v", + "provider": "z-ai", + "model": "glm-4.5v", + "displayName": "GLM-4.5V", + "family": "glm", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "jiekou", + "kilo", + "llmgateway", + "nano-gpt", + "novita", + "novita-ai", + "openrouter", + "siliconflow", + "siliconflow-cn", + "vercel", + "zai", + "zhipuai" + ], + "aliases": [ + "302ai/glm-4.5v", + "jiekou/zai-org/glm-4.5v", + "kilo/z-ai/glm-4.5v", + "llmgateway/glm-4.5v", + "nano-gpt/z-ai/glm-4.5v", + "novita-ai/zai-org/glm-4.5v", + "novita/zai-org/glm-4.5v", + "openrouter/z-ai/glm-4.5v", + "siliconflow-cn/zai-org/GLM-4.5V", + "siliconflow/zai-org/GLM-4.5V", + "vercel/zai/glm-4.5v", + "zai/glm-4.5v", + "zhipuai/glm-4.5v" + ], + "mergedProviderModelRecords": 13, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 16384, + "outputTokens": 96000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": false, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "glm-4.5v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.29, + "output": 0.86 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "zai-org/glm-4.5v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 1.8 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "z-ai/glm-4.5v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.6, + "output": 1.8 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "glm-4.5v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 1.8 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "z-ai/glm-4.5v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 1.7999999999999998 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "zai-org/glm-4.5v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.6, + "output": 1.8 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "z-ai/glm-4.5v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.6, + "output": 1.8 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "zai-org/GLM-4.5V", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.86 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "zai-org/GLM-4.5V", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.14, + "output": 0.86 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "zai/glm-4.5v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.6, + "output": 1.8 + } + }, + { + "source": "models.dev", + "provider": "zai", + "model": "glm-4.5v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 1.8 + } + }, + { + "source": "models.dev", + "provider": "zhipuai", + "model": "glm-4.5v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 1.8 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/zai-org/glm-4.5v", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.6, + "output": 1.8 + }, + "extra": { + "input_cost_per_token_cache_hit": 1.1e-7 + } + }, + { + "source": "litellm", + "provider": "zai", + "model": "zai/glm-4.5v", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 1.8 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "z-ai/glm-4.5v", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.6, + "output": 1.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.5V", + "GLM-4.5V", + "Z.ai: GLM 4.5V", + "zai-org/GLM-4.5V" + ], + "families": [ + "glm", + "glmv" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-08-12", + "lastUpdated": "2025-08-12", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 13 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "glm-4.5v", + "modelKey": "glm-4.5v", + "displayName": "GLM-4.5V", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-08-12", + "openWeights": true, + "releaseDate": "2025-08-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "zai-org/glm-4.5v", + "modelKey": "zai-org/glm-4.5v", + "displayName": "GLM 4.5V", + "family": "glmv", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "z-ai/glm-4.5v", + "modelKey": "z-ai/glm-4.5v", + "displayName": "Z.ai: GLM 4.5V", + "metadata": { + "lastUpdated": "2025-08-11", + "openWeights": true, + "releaseDate": "2025-08-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "glm-4.5v", + "modelKey": "glm-4.5v", + "displayName": "GLM-4.5V", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-08-11", + "openWeights": true, + "releaseDate": "2025-08-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "z-ai/glm-4.5v", + "modelKey": "z-ai/glm-4.5v", + "displayName": "GLM 4.5V", + "family": "glmv", + "metadata": { + "lastUpdated": "2025-11-22", + "openWeights": false, + "releaseDate": "2025-11-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "zai-org/glm-4.5v", + "modelKey": "zai-org/glm-4.5v", + "displayName": "GLM 4.5V", + "family": "glmv", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-08-11", + "openWeights": true, + "releaseDate": "2025-08-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "z-ai/glm-4.5v", + "modelKey": "z-ai/glm-4.5v", + "displayName": "GLM-4.5V", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-08-11", + "openWeights": true, + "releaseDate": "2025-08-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "zai-org/GLM-4.5V", + "modelKey": "zai-org/GLM-4.5V", + "displayName": "zai-org/GLM-4.5V", + "family": "glm", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-08-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "zai-org/GLM-4.5V", + "modelKey": "zai-org/GLM-4.5V", + "displayName": "zai-org/GLM-4.5V", + "family": "glm", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-08-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "zai/glm-4.5v", + "modelKey": "zai/glm-4.5v", + "displayName": "GLM 4.5V", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-08", + "lastUpdated": "2025-08-11", + "openWeights": true, + "releaseDate": "2025-08-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai", + "providerName": "Z.AI", + "providerApi": "https://api.z.ai/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.5v", + "modelKey": "glm-4.5v", + "displayName": "GLM-4.5V", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-08-11", + "openWeights": true, + "releaseDate": "2025-08-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai", + "providerName": "Zhipu AI", + "providerApi": "https://open.bigmodel.cn/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.5v", + "modelKey": "glm-4.5v", + "displayName": "GLM-4.5V", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-08-11", + "openWeights": true, + "releaseDate": "2025-08-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/zai-org/glm-4.5v", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "zai", + "model": "zai/glm-4.5v", + "mode": "chat", + "metadata": { + "source": "https://docs.z.ai/guides/overview/pricing" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "z-ai/glm-4.5v", + "displayName": "Z.ai: GLM 4.5V", + "metadata": { + "canonicalSlug": "z-ai/glm-4.5v", + "createdAt": "2025-08-11T14:24:48.000Z", + "huggingFaceId": "zai-org/GLM-4.5V", + "knowledgeCutoff": "2024-12-31", + "links": { + "details": "/api/v1/models/z-ai/glm-4.5v/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 65536, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "z-ai/glm-4.5v:thinking", + "provider": "z-ai", + "model": "glm-4.5v:thinking", + "displayName": "GLM 4.5V Thinking", + "family": "glmv", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/z-ai/glm-4.5v:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 64000, + "inputTokens": 64000, + "outputTokens": 96000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "z-ai/glm-4.5v:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 1.7999999999999998 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.5V Thinking" + ], + "families": [ + "glmv" + ], + "releaseDate": "2025-11-22", + "lastUpdated": "2025-11-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "z-ai/glm-4.5v:thinking", + "modelKey": "z-ai/glm-4.5v:thinking", + "displayName": "GLM 4.5V Thinking", + "family": "glmv", + "metadata": { + "lastUpdated": "2025-11-22", + "openWeights": false, + "releaseDate": "2025-11-22" + } + } + ] + }, + { + "id": "z-ai/glm-4.6", + "provider": "z-ai", + "model": "glm-4.6", + "displayName": "GLM-4.6", + "family": "glm", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "abacus", + "baseten", + "deepinfra", + "helicone", + "iflowcn", + "io-net", + "kilo", + "llmgateway", + "meganova", + "merge-gateway", + "modelscope", + "nano-gpt", + "novita", + "novita-ai", + "ollama-cloud", + "opencode", + "openrouter", + "orcarouter", + "poe", + "qiniu-ai", + "siliconflow", + "siliconflow-cn", + "synthetic", + "together_ai", + "vercel", + "vercel_ai_gateway", + "zai", + "zenmux", + "zhipuai" + ], + "aliases": [ + "302ai/glm-4.6", + "abacus/zai-org/glm-4.6", + "baseten/zai-org/GLM-4.6", + "deepinfra/zai-org/GLM-4.6", + "helicone/glm-4.6", + "iflowcn/glm-4.6", + "io-net/zai-org/GLM-4.6", + "kilo/z-ai/glm-4.6", + "llmgateway/glm-4.6", + "meganova/zai-org/GLM-4.6", + "merge-gateway/zai/glm-4.6", + "modelscope/ZhipuAI/GLM-4.6", + "nano-gpt/z-ai/glm-4.6", + "novita-ai/zai-org/glm-4.6", + "novita/zai-org/glm-4.6", + "ollama-cloud/glm-4.6", + "opencode/glm-4.6", + "openrouter/z-ai/glm-4.6", + "orcarouter/z-ai/glm-4.6", + "poe/novita/glm-4.6", + "qiniu-ai/z-ai/glm-4.6", + "siliconflow-cn/zai-org/GLM-4.6", + "siliconflow/zai-org/GLM-4.6", + "synthetic/hf:zai-org/GLM-4.6", + "together_ai/zai-org/GLM-4.6", + "vercel/zai/glm-4.6", + "vercel_ai_gateway/zai/glm-4.6", + "zai/glm-4.6", + "zenmux/z-ai/glm-4.6", + "zhipuai/glm-4.6" + ], + "mergedProviderModelRecords": 30, + "limits": { + "contextTokens": 205000, + "inputTokens": 204800, + "maxTokens": 200000, + "outputTokens": 205000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false, + "interleaved": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "glm-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.286, + "output": 1.142 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "zai-org/glm-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "zai-org/GLM-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.43, + "output": 1.74 + } + }, + { + "source": "models.dev", + "provider": "helicone", + "model": "glm-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.44999999999999996, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "iflowcn", + "model": "glm-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "io-net", + "model": "zai-org/GLM-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0.8, + "input": 0.4, + "output": 1.75 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "z-ai/glm-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.175, + "input": 0.39, + "output": 1.9 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "glm-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "zai-org/GLM-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 1.9 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "zai/glm-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "modelscope", + "model": "ZhipuAI/GLM-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "z-ai/glm-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.5 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "zai-org/glm-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.55, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "glm-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "z-ai/glm-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.43, + "output": 1.74 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "z-ai/glm-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "zai-org/GLM-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.9 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "zai-org/GLM-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.5, + "output": 1.9 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:zai-org/GLM-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.19 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "zai/glm-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "zai", + "model": "glm-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "z-ai/glm-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.07, + "input": 0.35, + "output": 1.54 + } + }, + { + "source": "models.dev", + "provider": "zhipuai", + "model": "glm-4.6", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "litellm", + "provider": "baseten", + "model": "baseten/zai-org/GLM-4.6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/zai-org/glm-4.6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.55, + "output": 2.2 + }, + "extra": { + "input_cost_per_token_cache_hit": 1.1e-7 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/z-ai/glm-4.6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 1.75 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/zai-org/GLM-4.6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "litellm", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/zai/glm-4.6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.45, + "output": 1.8 + } + }, + { + "source": "litellm", + "provider": "zai", + "model": "zai/glm-4.6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "z-ai/glm-4.6", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.43, + "output": 1.74 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.6", + "GLM-4.6", + "Z-AI/GLM 4.6", + "Z.ai: GLM 4.6", + "Zai GLM-4.6", + "glm-4.6", + "zai-org/GLM-4.6" + ], + "families": [ + "glm" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-09-30", + "lastUpdated": "2025-09-30", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 30 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "glm-4.6", + "modelKey": "glm-4.6", + "displayName": "glm-4.6", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-30", + "openWeights": true, + "releaseDate": "2025-09-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "zai-org/glm-4.6", + "modelKey": "zai-org/glm-4.6", + "displayName": "GLM-4.6", + "family": "glm", + "metadata": { + "lastUpdated": "2025-03-01", + "openWeights": true, + "releaseDate": "2025-03-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "zai-org/GLM-4.6", + "modelKey": "zai-org/GLM-4.6", + "displayName": "GLM-4.6", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-30", + "openWeights": true, + "releaseDate": "2025-09-30", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "helicone", + "providerName": "Helicone", + "providerApi": "https://ai-gateway.helicone.ai/v1", + "providerDoc": "https://helicone.ai/models", + "model": "glm-4.6", + "modelKey": "glm-4.6", + "displayName": "Zai GLM-4.6", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2024-07", + "lastUpdated": "2024-07-18", + "openWeights": false, + "releaseDate": "2024-07-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "iflowcn", + "providerName": "iFlow", + "providerApi": "https://apis.iflow.cn/v1", + "providerDoc": "https://platform.iflow.cn/en/docs", + "model": "glm-4.6", + "modelKey": "glm-4.6", + "displayName": "GLM-4.6", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-11-13", + "openWeights": false, + "releaseDate": "2024-12-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "io-net", + "providerName": "IO.NET", + "providerApi": "https://api.intelligence.io.solutions/api/v1", + "providerDoc": "https://io.net/docs/guides/intelligence/io-intelligence", + "model": "zai-org/GLM-4.6", + "modelKey": "zai-org/GLM-4.6", + "displayName": "GLM 4.6", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2024-11-15", + "openWeights": false, + "releaseDate": "2024-11-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "z-ai/glm-4.6", + "modelKey": "z-ai/glm-4.6", + "displayName": "Z.ai: GLM 4.6", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-09-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "glm-4.6", + "modelKey": "glm-4.6", + "displayName": "GLM-4.6", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-30", + "openWeights": true, + "releaseDate": "2025-09-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "zai-org/GLM-4.6", + "modelKey": "zai-org/GLM-4.6", + "displayName": "GLM-4.6", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-30", + "openWeights": true, + "releaseDate": "2025-09-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "zai/glm-4.6", + "modelKey": "zai/glm-4.6", + "displayName": "GLM-4.6", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-30", + "openWeights": true, + "releaseDate": "2025-09-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "modelscope", + "providerName": "ModelScope", + "providerApi": "https://api-inference.modelscope.cn/v1", + "providerDoc": "https://modelscope.cn/docs/model-service/API-Inference/intro", + "model": "ZhipuAI/GLM-4.6", + "modelKey": "ZhipuAI/GLM-4.6", + "displayName": "GLM-4.6", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-07", + "lastUpdated": "2025-09-30", + "openWeights": true, + "releaseDate": "2025-09-30", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "z-ai/glm-4.6", + "modelKey": "z-ai/glm-4.6", + "displayName": "GLM 4.6", + "family": "glm", + "metadata": { + "lastUpdated": "2025-09-30", + "openWeights": false, + "releaseDate": "2025-09-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "zai-org/glm-4.6", + "modelKey": "zai-org/glm-4.6", + "displayName": "GLM 4.6", + "family": "glm", + "metadata": { + "lastUpdated": "2025-09-30", + "openWeights": true, + "releaseDate": "2025-09-30", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "glm-4.6", + "modelKey": "glm-4.6", + "displayName": "glm-4.6", + "family": "glm", + "status": "deprecated", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-09-29", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "glm-4.6", + "modelKey": "glm-4.6", + "displayName": "GLM-4.6", + "family": "glm", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-30", + "openWeights": true, + "releaseDate": "2025-09-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "z-ai/glm-4.6", + "modelKey": "z-ai/glm-4.6", + "displayName": "GLM-4.6", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-30", + "openWeights": true, + "releaseDate": "2025-09-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "z-ai/glm-4.6", + "modelKey": "z-ai/glm-4.6", + "displayName": "GLM-4.6", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-30", + "openWeights": true, + "releaseDate": "2025-09-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "novita/glm-4.6", + "modelKey": "novita/glm-4.6", + "displayName": "GLM-4.6", + "family": "glm", + "metadata": { + "lastUpdated": "2025-09-30", + "openWeights": false, + "releaseDate": "2025-09-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "z-ai/glm-4.6", + "modelKey": "z-ai/glm-4.6", + "displayName": "Z-AI/GLM 4.6", + "metadata": { + "lastUpdated": "2025-10-11", + "openWeights": false, + "releaseDate": "2025-10-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "zai-org/GLM-4.6", + "modelKey": "zai-org/GLM-4.6", + "displayName": "zai-org/GLM-4.6", + "family": "glm", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "zai-org/GLM-4.6", + "modelKey": "zai-org/GLM-4.6", + "displayName": "zai-org/GLM-4.6", + "family": "glm", + "metadata": { + "lastUpdated": "2025-11-25", + "openWeights": false, + "releaseDate": "2025-10-04" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:zai-org/GLM-4.6", + "modelKey": "hf:zai-org/GLM-4.6", + "displayName": "GLM 4.6", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-30", + "openWeights": true, + "releaseDate": "2025-09-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "zai/glm-4.6", + "modelKey": "zai/glm-4.6", + "displayName": "GLM 4.6", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-30", + "openWeights": true, + "releaseDate": "2025-09-30", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai", + "providerName": "Z.AI", + "providerApi": "https://api.z.ai/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.6", + "modelKey": "glm-4.6", + "displayName": "GLM-4.6", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-30", + "openWeights": true, + "releaseDate": "2025-09-30", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "z-ai/glm-4.6", + "modelKey": "z-ai/glm-4.6", + "displayName": "GLM 4.6", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-09-30", + "openWeights": false, + "releaseDate": "2025-09-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai", + "providerName": "Zhipu AI", + "providerApi": "https://open.bigmodel.cn/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.6", + "modelKey": "glm-4.6", + "displayName": "GLM-4.6", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-09-30", + "openWeights": true, + "releaseDate": "2025-09-30", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "baseten", + "model": "baseten/zai-org/GLM-4.6", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/zai-org/glm-4.6", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/z-ai/glm-4.6", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/z-ai/glm-4.6" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/zai-org/GLM-4.6", + "mode": "chat", + "metadata": { + "source": "https://www.together.ai/models/glm-4-6" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vercel_ai_gateway", + "model": "vercel_ai_gateway/zai/glm-4.6", + "mode": "chat", + "metadata": { + "source": "https://vercel.com/ai-gateway/models/glm-4.6" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "zai", + "model": "zai/glm-4.6", + "mode": "chat", + "metadata": { + "source": "https://docs.z.ai/guides/overview/pricing" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "z-ai/glm-4.6", + "displayName": "Z.ai: GLM 4.6", + "metadata": { + "canonicalSlug": "z-ai/glm-4.6", + "createdAt": "2025-09-30T12:32:56.000Z", + "huggingFaceId": "zai-org/GLM-4.6", + "knowledgeCutoff": "2025-03-31", + "links": { + "details": "/api/v1/models/z-ai/glm-4.6/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 202752, + "max_completion_tokens": 131072, + "is_moderated": false + } + } + } + ] + }, + { + "id": "z-ai/glm-4.6-derestricted-v5", + "provider": "z-ai", + "model": "glm-4.6-derestricted-v5", + "displayName": "GLM 4.6 Derestricted v5", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/GLM-4.6-Derestricted-v5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "outputTokens": 8192, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "GLM-4.6-Derestricted-v5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.6 Derestricted v5" + ], + "releaseDate": "2025-12-23", + "lastUpdated": "2025-12-23", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "GLM-4.6-Derestricted-v5", + "modelKey": "GLM-4.6-Derestricted-v5", + "displayName": "GLM 4.6 Derestricted v5", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": false, + "releaseDate": "2025-12-23" + } + } + ] + }, + { + "id": "z-ai/glm-4.6-original", + "provider": "z-ai", + "model": "glm-4.6-original", + "displayName": "GLM 4.6 Original", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/glm-4.6-original" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 65535, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-4.6-original", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.35, + "output": 1.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.6 Original" + ], + "releaseDate": "2025-12-11", + "lastUpdated": "2025-12-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-4.6-original", + "modelKey": "zai-org/glm-4.6-original", + "displayName": "GLM 4.6 Original", + "metadata": { + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + } + ] + }, + { + "id": "z-ai/glm-4.6-turbo", + "provider": "z-ai", + "model": "glm-4.6-turbo", + "displayName": "GLM 4.6 Turbo", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/GLM-4.6-turbo" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 204800, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/GLM-4.6-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.6 Turbo" + ], + "releaseDate": "2025-10-02", + "lastUpdated": "2025-10-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/GLM-4.6-turbo", + "modelKey": "zai-org/GLM-4.6-turbo", + "displayName": "GLM 4.6 Turbo", + "metadata": { + "lastUpdated": "2025-10-02", + "openWeights": false, + "releaseDate": "2025-10-02" + } + } + ] + }, + { + "id": "z-ai/glm-4.6-turbo:thinking", + "provider": "z-ai", + "model": "glm-4.6-turbo:thinking", + "displayName": "GLM 4.6 Turbo (Thinking)", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/GLM-4.6-turbo:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 204800, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/GLM-4.6-turbo:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.6 Turbo (Thinking)" + ], + "releaseDate": "2025-10-02", + "lastUpdated": "2025-10-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/GLM-4.6-turbo:thinking", + "modelKey": "zai-org/GLM-4.6-turbo:thinking", + "displayName": "GLM 4.6 Turbo (Thinking)", + "metadata": { + "lastUpdated": "2025-10-02", + "openWeights": false, + "releaseDate": "2025-10-02" + } + } + ] + }, + { + "id": "z-ai/glm-4.6:exacto", + "provider": "z-ai", + "model": "glm-4.6:exacto", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "openrouter" + ], + "aliases": [ + "openrouter/z-ai/glm-4.6:exacto" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 202800, + "inputTokens": 202800, + "maxTokens": 131000, + "outputTokens": 131000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/z-ai/glm-4.6:exacto", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.45, + "output": 1.9 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/z-ai/glm-4.6:exacto", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/z-ai/glm-4.6:exacto" + } + } + ] + }, + { + "id": "z-ai/glm-4.6:thinking", + "provider": "z-ai", + "model": "glm-4.6:thinking", + "displayName": "GLM 4.6 Thinking", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/z-ai/glm-4.6:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 65535, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "z-ai/glm-4.6:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.4, + "output": 1.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.6 Thinking" + ], + "families": [ + "glm" + ], + "releaseDate": "2025-09-29", + "lastUpdated": "2025-09-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "z-ai/glm-4.6:thinking", + "modelKey": "z-ai/glm-4.6:thinking", + "displayName": "GLM 4.6 Thinking", + "family": "glm", + "metadata": { + "lastUpdated": "2025-09-29", + "openWeights": false, + "releaseDate": "2025-09-29" + } + } + ] + }, + { + "id": "z-ai/glm-4.6v", + "provider": "z-ai", + "model": "glm-4.6v", + "displayName": "GLM-4.6V", + "family": "glm", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "chutes", + "kilo", + "llmgateway", + "nano-gpt", + "novita", + "novita-ai", + "openrouter", + "poe", + "siliconflow", + "siliconflow-cn", + "vercel", + "zai", + "zenmux", + "zhipuai", + "zhipuai-coding-plan" + ], + "aliases": [ + "302ai/glm-4.6v", + "chutes/zai-org/GLM-4.6V", + "kilo/z-ai/glm-4.6v", + "llmgateway/glm-4.6v", + "nano-gpt/zai-org/glm-4.6v", + "novita-ai/zai-org/glm-4.6v", + "novita/zai-org/glm-4.6v", + "openrouter/z-ai/glm-4.6v", + "poe/novita/glm-4.6v", + "siliconflow-cn/zai-org/GLM-4.6V", + "siliconflow/zai-org/GLM-4.6V", + "vercel/zai/glm-4.6v", + "zai/glm-4.6v", + "zenmux/z-ai/glm-4.6v", + "zhipuai-coding-plan/glm-4.6v", + "zhipuai/glm-4.6v" + ], + "mergedProviderModelRecords": 16, + "limits": { + "contextTokens": 200000, + "inputTokens": 131072, + "maxTokens": 32768, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "structuredOutput": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "systemMessages": true, + "transcription": false, + "vision": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "glm-4.6v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.145, + "output": 0.43 + } + }, + { + "source": "models.dev", + "provider": "chutes", + "model": "zai-org/GLM-4.6V", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "z-ai/glm-4.6v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "glm-4.6v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-4.6v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "zai-org/glm-4.6v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.055, + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "z-ai/glm-4.6v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.055, + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "zai-org/GLM-4.6V", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "zai-org/GLM-4.6V", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "zai/glm-4.6v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "zai", + "model": "glm-4.6v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "z-ai/glm-4.6v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.14, + "output": 0.42 + } + }, + { + "source": "models.dev", + "provider": "zhipuai-coding-plan", + "model": "glm-4.6v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "models.dev", + "provider": "zhipuai", + "model": "glm-4.6v", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 0.9 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/zai-org/glm-4.6v", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.055, + "input": 0.3, + "output": 0.9 + }, + "extra": { + "input_cost_per_token_cache_hit": 5.5e-8 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "z-ai/glm-4.6v", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.055, + "input": 0.3, + "output": 0.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.6V", + "GLM-4.6V", + "Z.ai: GLM 4.6V", + "glm-4.6v", + "zai-org/GLM-4.6V" + ], + "families": [ + "glm", + "glmv" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-12-08", + "lastUpdated": "2025-12-08", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 16 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "glm-4.6v", + "modelKey": "glm-4.6v", + "displayName": "GLM-4.6V", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-08", + "openWeights": true, + "releaseDate": "2025-12-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "zai-org/GLM-4.6V", + "modelKey": "zai-org/GLM-4.6V", + "displayName": "GLM 4.6V", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2025-12-29", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "z-ai/glm-4.6v", + "modelKey": "z-ai/glm-4.6v", + "displayName": "Z.ai: GLM 4.6V", + "metadata": { + "lastUpdated": "2026-01-10", + "openWeights": true, + "releaseDate": "2025-09-30" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "glm-4.6v", + "modelKey": "glm-4.6v", + "displayName": "GLM-4.6V", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-08", + "openWeights": true, + "releaseDate": "2025-12-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-4.6v", + "modelKey": "zai-org/glm-4.6v", + "displayName": "GLM 4.6V", + "metadata": { + "lastUpdated": "2025-12-11", + "openWeights": false, + "releaseDate": "2025-12-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "zai-org/glm-4.6v", + "modelKey": "zai-org/glm-4.6v", + "displayName": "GLM 4.6V", + "family": "glmv", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-08", + "openWeights": true, + "releaseDate": "2025-12-08", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "z-ai/glm-4.6v", + "modelKey": "z-ai/glm-4.6v", + "displayName": "GLM-4.6V", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-08", + "openWeights": true, + "releaseDate": "2025-12-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "novita/glm-4.6v", + "modelKey": "novita/glm-4.6v", + "displayName": "glm-4.6v", + "metadata": { + "lastUpdated": "2025-12-09", + "openWeights": false, + "releaseDate": "2025-12-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "zai-org/GLM-4.6V", + "modelKey": "zai-org/GLM-4.6V", + "displayName": "zai-org/GLM-4.6V", + "family": "glm", + "metadata": { + "lastUpdated": "2025-12-07", + "openWeights": false, + "releaseDate": "2025-12-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "zai-org/GLM-4.6V", + "modelKey": "zai-org/GLM-4.6V", + "displayName": "zai-org/GLM-4.6V", + "family": "glm", + "metadata": { + "lastUpdated": "2025-12-07", + "openWeights": false, + "releaseDate": "2025-12-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "zai/glm-4.6v", + "modelKey": "zai/glm-4.6v", + "displayName": "GLM-4.6V", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-12-08", + "openWeights": false, + "releaseDate": "2025-09-30", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai", + "providerName": "Z.AI", + "providerApi": "https://api.z.ai/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.6v", + "modelKey": "glm-4.6v", + "displayName": "GLM-4.6V", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-08", + "openWeights": true, + "releaseDate": "2025-12-08", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "z-ai/glm-4.6v", + "modelKey": "z-ai/glm-4.6v", + "displayName": "GLM 4.6V", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-12-08", + "openWeights": false, + "releaseDate": "2025-12-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai-coding-plan", + "providerName": "Zhipu AI Coding Plan", + "providerApi": "https://open.bigmodel.cn/api/coding/paas/v4", + "providerDoc": "https://docs.bigmodel.cn/cn/coding-plan/overview", + "model": "glm-4.6v", + "modelKey": "glm-4.6v", + "displayName": "GLM-4.6V", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-08", + "openWeights": true, + "releaseDate": "2025-12-08", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai", + "providerName": "Zhipu AI", + "providerApi": "https://open.bigmodel.cn/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.6v", + "modelKey": "glm-4.6v", + "displayName": "GLM-4.6V", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-08", + "openWeights": true, + "releaseDate": "2025-12-08", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/zai-org/glm-4.6v", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "z-ai/glm-4.6v", + "displayName": "Z.ai: GLM 4.6V", + "metadata": { + "canonicalSlug": "z-ai/glm-4.6-20251208", + "createdAt": "2025-12-08T15:24:22.000Z", + "huggingFaceId": "zai-org/GLM-4.6V", + "links": { + "details": "/api/v1/models/z-ai/glm-4.6-20251208/endpoints" + }, + "reasoning": { + "mandatory": false + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 131072, + "max_completion_tokens": 32768, + "is_moderated": false + } + } + } + ] + }, + { + "id": "z-ai/glm-4.6v-flash", + "provider": "z-ai", + "model": "glm-4.6v-flash", + "displayName": "GLM-4.6V Flash", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway", + "vercel", + "zenmux" + ], + "aliases": [ + "llmgateway/glm-4.6v-flash", + "vercel/zai/glm-4.6v-flash", + "zenmux/z-ai/glm-4.6v-flash" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "glm-4.6v-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "z-ai/glm-4.6v-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.0043, + "input": 0.02, + "output": 0.21 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.6V FlashX", + "GLM-4.6V Flash", + "GLM-4.6V-Flash" + ], + "families": [ + "glm" + ], + "statuses": [ + "beta" + ], + "knowledgeCutoff": "2024-10", + "releaseDate": "2025-12-08", + "lastUpdated": "2025-12-08", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "glm-4.6v-flash", + "modelKey": "glm-4.6v-flash", + "displayName": "GLM-4.6V Flash", + "family": "glm", + "status": "beta", + "metadata": { + "lastUpdated": "2025-12-08", + "openWeights": true, + "releaseDate": "2025-12-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "zai/glm-4.6v-flash", + "modelKey": "zai/glm-4.6v-flash", + "displayName": "GLM-4.6V-Flash", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-09-30", + "openWeights": false, + "releaseDate": "2025-09-30", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "z-ai/glm-4.6v-flash", + "modelKey": "z-ai/glm-4.6v-flash", + "displayName": "GLM 4.6V FlashX", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-12-08", + "openWeights": false, + "releaseDate": "2025-12-08" + } + } + ] + }, + { + "id": "z-ai/glm-4.6v-flash-free", + "provider": "z-ai", + "model": "glm-4.6v-flash-free", + "displayName": "GLM 4.6V Flash (Free)", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/z-ai/glm-4.6v-flash-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "z-ai/glm-4.6v-flash-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.6V Flash (Free)" + ], + "knowledgeCutoff": "2025-01-01", + "releaseDate": "2025-12-08", + "lastUpdated": "2025-12-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "z-ai/glm-4.6v-flash-free", + "modelKey": "z-ai/glm-4.6v-flash-free", + "displayName": "GLM 4.6V Flash (Free)", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-12-08", + "openWeights": false, + "releaseDate": "2025-12-08" + } + } + ] + }, + { + "id": "z-ai/glm-4.6v-flash-original", + "provider": "z-ai", + "model": "glm-4.6v-flash-original", + "displayName": "GLM 4.6V Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/glm-4.6v-flash-original" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 24000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-4.6v-flash-original", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.6V Flash" + ], + "releaseDate": "2025-12-08", + "lastUpdated": "2025-12-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-4.6v-flash-original", + "modelKey": "zai-org/glm-4.6v-flash-original", + "displayName": "GLM 4.6V Flash", + "metadata": { + "lastUpdated": "2025-12-08", + "openWeights": false, + "releaseDate": "2025-12-08" + } + } + ] + }, + { + "id": "z-ai/glm-4.6v-flashx", + "provider": "z-ai", + "model": "glm-4.6v-flashx", + "displayName": "GLM-4.6V FlashX", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "llmgateway" + ], + "aliases": [ + "llmgateway/glm-4.6v-flashx" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 16000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "llmgateway", + "model": "glm-4.6v-flashx", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.004, + "input": 0.04, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-4.6V FlashX" + ], + "families": [ + "glm" + ], + "releaseDate": "2025-12-08", + "lastUpdated": "2025-12-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "glm-4.6v-flashx", + "modelKey": "glm-4.6v-flashx", + "displayName": "GLM-4.6V FlashX", + "family": "glm", + "metadata": { + "lastUpdated": "2025-12-08", + "openWeights": false, + "releaseDate": "2025-12-08" + } + } + ] + }, + { + "id": "z-ai/glm-4.6v-original", + "provider": "z-ai", + "model": "glm-4.6v-original", + "displayName": "GLM 4.6V Original", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/glm-4.6v-original" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 24000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-4.6v-original", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 0.9 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.6V Original" + ], + "releaseDate": "2025-12-08", + "lastUpdated": "2025-12-08", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-4.6v-original", + "modelKey": "zai-org/glm-4.6v-original", + "displayName": "GLM 4.6V Original", + "metadata": { + "lastUpdated": "2025-12-08", + "openWeights": false, + "releaseDate": "2025-12-08" + } + } + ] + }, + { + "id": "z-ai/glm-4.7", + "provider": "z-ai", + "model": "glm-4.7", + "displayName": "GLM 4.7", + "family": "glm", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "abacus", + "alibaba-coding-plan", + "alibaba-coding-plan-cn", + "baseten", + "berget", + "cortecs", + "crof", + "deepinfra", + "dinference", + "huggingface", + "jiekou", + "kilo", + "kuae-cloud-coding-plan", + "llmgateway", + "meganova", + "merge-gateway", + "moark", + "nano-gpt", + "novita", + "novita-ai", + "ollama-cloud", + "opencode", + "openrouter", + "orcarouter", + "poe", + "qiniu-ai", + "siliconflow", + "siliconflow-cn", + "synthetic", + "together_ai", + "vercel", + "zai", + "zai-coding-plan", + "zenmux", + "zhipuai", + "zhipuai-coding-plan" + ], + "aliases": [ + "302ai/glm-4.7", + "abacus/zai-org/glm-4.7", + "alibaba-coding-plan-cn/glm-4.7", + "alibaba-coding-plan/glm-4.7", + "baseten/zai-org/GLM-4.7", + "berget/zai-org/GLM-4.7", + "cortecs/glm-4.7", + "crof/glm-4.7", + "deepinfra/zai-org/GLM-4.7", + "dinference/glm-4.7", + "huggingface/zai-org/GLM-4.7", + "jiekou/zai-org/glm-4.7", + "kilo/z-ai/glm-4.7", + "kuae-cloud-coding-plan/GLM-4.7", + "llmgateway/glm-4.7", + "meganova/zai-org/GLM-4.7", + "merge-gateway/zai/glm-4.7", + "moark/GLM-4.7", + "nano-gpt/TEE/glm-4.7", + "nano-gpt/zai-org/glm-4.7", + "novita-ai/zai-org/glm-4.7", + "novita/zai-org/glm-4.7", + "ollama-cloud/glm-4.7", + "opencode/glm-4.7", + "openrouter/z-ai/glm-4.7", + "orcarouter/z-ai/glm-4.7", + "poe/novita/glm-4.7", + "qiniu-ai/z-ai/glm-4.7", + "siliconflow-cn/Pro/zai-org/GLM-4.7", + "siliconflow/zai-org/GLM-4.7", + "synthetic/hf:zai-org/GLM-4.7", + "together_ai/zai-org/GLM-4.7", + "vercel/zai/glm-4.7", + "zai-coding-plan/glm-4.7", + "zai/glm-4.7", + "zenmux/z-ai/glm-4.7", + "zhipuai-coding-plan/glm-4.7", + "zhipuai/glm-4.7" + ], + "mergedProviderModelRecords": 38, + "limits": { + "contextTokens": 205000, + "inputTokens": 204800, + "maxTokens": 200000, + "outputTokens": 205000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false, + "assistantPrefill": true, + "functionCalling": true, + "promptCaching": true, + "toolChoice": true, + "vision": true, + "parallelFunctionCalling": true, + "responseSchema": true, + "webSearch": false, + "interleaved": true, + "systemMessages": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.286, + "output": 1.142 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "zai-org/glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan-cn", + "model": "glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan", + "model": "glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "baseten", + "model": "zai-org/GLM-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "berget", + "model": "zai-org/GLM-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.77, + "output": 2.75 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 2.23 + } + }, + { + "source": "models.dev", + "provider": "crof", + "model": "glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.05, + "cacheWrite": 0, + "input": 0.25, + "output": 1.1 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "zai-org/GLM-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.4, + "output": 1.75 + } + }, + { + "source": "models.dev", + "provider": "dinference", + "model": "glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.45, + "output": 1.65 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "zai-org/GLM-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "zai-org/glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "z-ai/glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.38, + "output": 1.98 + } + }, + { + "source": "models.dev", + "provider": "kuae-cloud-coding-plan", + "model": "GLM-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "zai-org/GLM-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "zai/glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "moark", + "model": "GLM-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 3.5, + "output": 14 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.85, + "output": 3.3 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.8 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "zai-org/glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "z-ai/glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.4, + "output": 1.75 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "z-ai/glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Pro/zai-org/GLM-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "zai-org/GLM-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:zai-org/GLM-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.55, + "output": 2.19 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "zai/glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 2.25, + "input": 2.25, + "output": 2.75 + } + }, + { + "source": "models.dev", + "provider": "zai-coding-plan", + "model": "glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "zai", + "model": "glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "z-ai/glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.28, + "output": 1.14 + } + }, + { + "source": "models.dev", + "provider": "zhipuai-coding-plan", + "model": "glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "zhipuai", + "model": "glm-4.7", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "litellm", + "provider": "baseten", + "model": "baseten/zai-org/GLM-4.7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "litellm", + "provider": "novita", + "model": "novita/zai-org/glm-4.7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.6, + "output": 2.2 + }, + "extra": { + "input_cost_per_token_cache_hit": 1.1e-7 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/z-ai/glm-4.7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0.4, + "output": 1.5 + } + }, + { + "source": "litellm", + "provider": "together_ai", + "model": "together_ai/zai-org/GLM-4.7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.45, + "output": 2 + } + }, + { + "source": "litellm", + "provider": "zai", + "model": "zai/glm-4.7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.11, + "cacheWrite": 0, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "z-ai/glm-4.7", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.4, + "output": 1.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.7", + "GLM 4.7 TEE", + "GLM-4.7", + "Pro/zai-org/GLM-4.7", + "Z-Ai/GLM 4.7", + "Z.ai: GLM 4.7", + "glm-4.7", + "zai-org/GLM-4.7" + ], + "families": [ + "glm" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-12-22", + "lastUpdated": "2025-12-22", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 38 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "glm-4.7", + "modelKey": "glm-4.7", + "displayName": "glm-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "zai-org/glm-4.7", + "modelKey": "zai-org/glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "lastUpdated": "2025-06-01", + "openWeights": true, + "releaseDate": "2025-06-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan-cn", + "providerName": "Alibaba Coding Plan (China)", + "providerApi": "https://coding.dashscope.aliyuncs.com/v1", + "providerDoc": "https://help.aliyun.com/zh/model-studio/coding-plan", + "model": "glm-4.7", + "modelKey": "glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan", + "providerName": "Alibaba Coding Plan", + "providerApi": "https://coding-intl.dashscope.aliyuncs.com/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/coding-plan", + "model": "glm-4.7", + "modelKey": "glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "baseten", + "providerName": "Baseten", + "providerApi": "https://inference.baseten.co/v1", + "providerDoc": "https://docs.baseten.co/inference/model-apis/overview", + "model": "zai-org/GLM-4.7", + "modelKey": "zai-org/GLM-4.7", + "displayName": "GLM 4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "berget", + "providerName": "Berget.AI", + "providerApi": "https://api.berget.ai/v1", + "providerDoc": "https://api.berget.ai", + "model": "zai-org/GLM-4.7", + "modelKey": "zai-org/GLM-4.7", + "displayName": "GLM 4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2026-01-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "glm-4.7", + "modelKey": "glm-4.7", + "displayName": "GLM 4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "glm-4.7", + "modelKey": "glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "zai-org/GLM-4.7", + "modelKey": "zai-org/GLM-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "dinference", + "providerName": "DInference", + "providerApi": "https://api.dinference.com/v1", + "providerDoc": "https://dinference.com", + "model": "glm-4.7", + "modelKey": "glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "zai-org/GLM-4.7", + "modelKey": "zai-org/GLM-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "zai-org/glm-4.7", + "modelKey": "zai-org/glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "z-ai/glm-4.7", + "modelKey": "z-ai/glm-4.7", + "displayName": "Z.ai: GLM 4.7", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2025-12-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kuae-cloud-coding-plan", + "providerName": "KUAE Cloud Coding Plan", + "providerApi": "https://coding-plan-endpoint.kuaecloud.net/v1", + "providerDoc": "https://docs.mthreads.com/kuaecloud/kuaecloud-doc-online/coding_plan/", + "model": "GLM-4.7", + "modelKey": "GLM-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "glm-4.7", + "modelKey": "glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "zai-org/GLM-4.7", + "modelKey": "zai-org/GLM-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "zai/glm-4.7", + "modelKey": "zai/glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "moark", + "providerName": "Moark", + "providerApi": "https://moark.com/v1", + "providerDoc": "https://moark.com/docs/openapi/v1#tag/%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90", + "model": "GLM-4.7", + "modelKey": "GLM-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/glm-4.7", + "modelKey": "TEE/glm-4.7", + "displayName": "GLM 4.7 TEE", + "family": "glm", + "metadata": { + "lastUpdated": "2026-01-29", + "openWeights": false, + "releaseDate": "2026-01-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-4.7", + "modelKey": "zai-org/glm-4.7", + "displayName": "GLM 4.7", + "family": "glm", + "metadata": { + "lastUpdated": "2026-01-29", + "openWeights": true, + "releaseDate": "2026-01-29" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "zai-org/glm-4.7", + "modelKey": "zai-org/glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "glm-4.7", + "modelKey": "glm-4.7", + "displayName": "glm-4.7", + "family": "glm", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-12-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "glm-4.7", + "modelKey": "glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "z-ai/glm-4.7", + "modelKey": "z-ai/glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "z-ai/glm-4.7", + "modelKey": "z-ai/glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "novita/glm-4.7", + "modelKey": "novita/glm-4.7", + "displayName": "glm-4.7", + "status": "deprecated", + "metadata": { + "lastUpdated": "2025-12-22", + "openWeights": false, + "releaseDate": "2025-12-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "z-ai/glm-4.7", + "modelKey": "z-ai/glm-4.7", + "displayName": "Z-Ai/GLM 4.7", + "metadata": { + "lastUpdated": "2025-12-23", + "openWeights": false, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Pro/zai-org/GLM-4.7", + "modelKey": "Pro/zai-org/GLM-4.7", + "displayName": "Pro/zai-org/GLM-4.7", + "family": "glm", + "metadata": { + "lastUpdated": "2025-12-22", + "openWeights": false, + "releaseDate": "2025-12-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "zai-org/GLM-4.7", + "modelKey": "zai-org/GLM-4.7", + "displayName": "zai-org/GLM-4.7", + "family": "glm", + "metadata": { + "lastUpdated": "2025-12-22", + "openWeights": false, + "releaseDate": "2025-12-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:zai-org/GLM-4.7", + "modelKey": "hf:zai-org/GLM-4.7", + "displayName": "GLM 4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "zai/glm-4.7", + "modelKey": "zai/glm-4.7", + "displayName": "GLM 4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2024-10", + "lastUpdated": "2025-12-22", + "openWeights": false, + "releaseDate": "2025-12-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai-coding-plan", + "providerName": "Z.AI Coding Plan", + "providerApi": "https://api.z.ai/api/coding/paas/v4", + "providerDoc": "https://docs.z.ai/devpack/overview", + "model": "glm-4.7", + "modelKey": "glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai", + "providerName": "Z.AI", + "providerApi": "https://api.z.ai/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.7", + "modelKey": "glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "z-ai/glm-4.7", + "modelKey": "z-ai/glm-4.7", + "displayName": "GLM 4.7", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-12-23", + "openWeights": false, + "releaseDate": "2025-12-23" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai-coding-plan", + "providerName": "Zhipu AI Coding Plan", + "providerApi": "https://open.bigmodel.cn/api/coding/paas/v4", + "providerDoc": "https://docs.bigmodel.cn/cn/coding-plan/overview", + "model": "glm-4.7", + "modelKey": "glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai", + "providerName": "Zhipu AI", + "providerApi": "https://open.bigmodel.cn/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.7", + "modelKey": "glm-4.7", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "baseten", + "model": "baseten/zai-org/GLM-4.7", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "novita", + "model": "novita/zai-org/glm-4.7", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/z-ai/glm-4.7", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "together_ai", + "model": "together_ai/zai-org/GLM-4.7", + "mode": "chat", + "metadata": { + "source": "https://www.together.ai/models/glm-4-7" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "zai", + "model": "zai/glm-4.7", + "mode": "chat", + "metadata": { + "source": "https://docs.z.ai/guides/overview/pricing" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "z-ai/glm-4.7", + "displayName": "Z.ai: GLM 4.7", + "metadata": { + "canonicalSlug": "z-ai/glm-4.7-20251222", + "createdAt": "2025-12-22T04:33:34.000Z", + "huggingFaceId": "zai-org/GLM-4.7", + "links": { + "details": "/api/v1/models/z-ai/glm-4.7-20251222/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 202752, + "max_completion_tokens": 131072, + "is_moderated": false + } + } + } + ] + }, + { + "id": "z-ai/glm-4.7-flash", + "provider": "z-ai", + "model": "glm-4.7-flash", + "displayName": "GLM-4.7-Flash", + "family": "glm-flash", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "cloudflare-ai-gateway", + "cloudflare-workers-ai", + "cortecs", + "crof", + "deepinfra", + "huggingface", + "jiekou", + "kilo", + "llmgateway", + "nano-gpt", + "novita-ai", + "openrouter", + "poe", + "synthetic", + "vercel", + "zai", + "zhipuai" + ], + "aliases": [ + "cloudflare-ai-gateway/workers-ai/@cf/zai-org/glm-4.7-flash", + "cloudflare-workers-ai/@cf/zai-org/glm-4.7-flash", + "cortecs/glm-4.7-flash", + "crof/glm-4.7-flash", + "deepinfra/zai-org/GLM-4.7-Flash", + "huggingface/zai-org/GLM-4.7-Flash", + "jiekou/zai-org/glm-4.7-flash", + "kilo/z-ai/glm-4.7-flash", + "llmgateway/glm-4.7-flash", + "nano-gpt/TEE/glm-4.7-flash", + "nano-gpt/zai-org/glm-4.7-flash", + "novita-ai/zai-org/glm-4.7-flash", + "openrouter/z-ai/glm-4.7-flash", + "poe/novita/glm-4.7-flash", + "synthetic/hf:zai-org/GLM-4.7-Flash", + "vercel/zai/glm-4.7-flash", + "zai/glm-4.7-flash", + "zhipuai/glm-4.7-flash" + ], + "mergedProviderModelRecords": 18, + "limits": { + "contextTokens": 203000, + "inputTokens": 203000, + "maxTokens": 32000, + "outputTokens": 203000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "vision": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "cloudflare-ai-gateway", + "model": "workers-ai/@cf/zai-org/glm-4.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.06, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/zai-org/glm-4.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0605, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "glm-4.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.09, + "output": 0.53 + } + }, + { + "source": "models.dev", + "provider": "crof", + "model": "glm-4.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.008, + "cacheWrite": 0, + "input": 0.04, + "output": 0.3 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "zai-org/GLM-4.7-Flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.06, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "zai-org/GLM-4.7-Flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "jiekou", + "model": "zai-org/glm-4.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "z-ai/glm-4.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.06, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "glm-4.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/glm-4.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.15, + "output": 0.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-4.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "zai-org/glm-4.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.07, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "z-ai/glm-4.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.06, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:zai-org/GLM-4.7-Flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.06, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "zai/glm-4.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "zai", + "model": "glm-4.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "zhipuai", + "model": "glm-4.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/z-ai/glm-4.7-flash", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0.07, + "output": 0.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "z-ai/glm-4.7-flash", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.06, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.7 Flash", + "GLM 4.7 Flash TEE", + "GLM-4.7-Flash", + "Z.ai: GLM 4.7 Flash", + "glm-4.7-flash" + ], + "families": [ + "glm", + "glm-flash" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-01-19", + "lastUpdated": "2026-01-19", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 18 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-ai-gateway", + "providerName": "Cloudflare AI Gateway", + "providerDoc": "https://developers.cloudflare.com/ai-gateway/", + "model": "workers-ai/@cf/zai-org/glm-4.7-flash", + "modelKey": "workers-ai/@cf/zai-org/glm-4.7-flash", + "displayName": "GLM-4.7-Flash", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2026-01-19", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/zai-org/glm-4.7-flash", + "modelKey": "@cf/zai-org/glm-4.7-flash", + "displayName": "GLM-4.7-Flash", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2026-01-19", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "glm-4.7-flash", + "modelKey": "glm-4.7-flash", + "displayName": "GLM-4.7-Flash", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-08-08", + "openWeights": true, + "releaseDate": "2025-08-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "glm-4.7-flash", + "modelKey": "glm-4.7-flash", + "displayName": "GLM-4.7-Flash", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2026-01-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "zai-org/GLM-4.7-Flash", + "modelKey": "zai-org/GLM-4.7-Flash", + "displayName": "GLM-4.7-Flash", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2026-01-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "zai-org/GLM-4.7-Flash", + "modelKey": "zai-org/GLM-4.7-Flash", + "displayName": "GLM-4.7-Flash", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-08-08", + "openWeights": true, + "releaseDate": "2025-08-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "jiekou", + "providerName": "Jiekou.AI", + "providerApi": "https://api.jiekou.ai/openai", + "providerDoc": "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", + "model": "zai-org/glm-4.7-flash", + "modelKey": "zai-org/glm-4.7-flash", + "displayName": "GLM-4.7-Flash", + "family": "glm", + "metadata": { + "lastUpdated": "2026-01", + "openWeights": true, + "releaseDate": "2026-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "z-ai/glm-4.7-flash", + "modelKey": "z-ai/glm-4.7-flash", + "displayName": "Z.ai: GLM 4.7 Flash", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2026-01-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "glm-4.7-flash", + "modelKey": "glm-4.7-flash", + "displayName": "GLM-4.7-Flash", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2026-01-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/glm-4.7-flash", + "modelKey": "TEE/glm-4.7-flash", + "displayName": "GLM 4.7 Flash TEE", + "family": "glm-flash", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": false, + "releaseDate": "2026-01-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-4.7-flash", + "modelKey": "zai-org/glm-4.7-flash", + "displayName": "GLM 4.7 Flash", + "family": "glm-flash", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2026-01-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "zai-org/glm-4.7-flash", + "modelKey": "zai-org/glm-4.7-flash", + "displayName": "GLM-4.7-Flash", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2026-01-19", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "z-ai/glm-4.7-flash", + "modelKey": "z-ai/glm-4.7-flash", + "displayName": "GLM-4.7-Flash", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2026-01-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "novita/glm-4.7-flash", + "modelKey": "novita/glm-4.7-flash", + "displayName": "glm-4.7-flash", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": false, + "releaseDate": "2026-01-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:zai-org/GLM-4.7-Flash", + "modelKey": "hf:zai-org/GLM-4.7-Flash", + "displayName": "GLM-4.7-Flash", + "family": "glm", + "metadata": { + "lastUpdated": "2026-01-18", + "openWeights": true, + "releaseDate": "2026-01-18" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "zai/glm-4.7-flash", + "modelKey": "zai/glm-4.7-flash", + "displayName": "GLM 4.7 Flash", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-19", + "openWeights": false, + "releaseDate": "2026-03-13", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai", + "providerName": "Z.AI", + "providerApi": "https://api.z.ai/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.7-flash", + "modelKey": "glm-4.7-flash", + "displayName": "GLM-4.7-Flash", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2026-01-19", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai", + "providerName": "Zhipu AI", + "providerApi": "https://open.bigmodel.cn/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.7-flash", + "modelKey": "glm-4.7-flash", + "displayName": "GLM-4.7-Flash", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2026-01-19", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/z-ai/glm-4.7-flash", + "mode": "chat" + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "z-ai/glm-4.7-flash", + "displayName": "Z.ai: GLM 4.7 Flash", + "metadata": { + "canonicalSlug": "z-ai/glm-4.7-flash-20260119", + "createdAt": "2026-01-19T14:45:13.000Z", + "huggingFaceId": "zai-org/GLM-4.7-Flash", + "links": { + "details": "/api/v1/models/z-ai/glm-4.7-flash-20260119/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 202752, + "max_completion_tokens": 16384, + "is_moderated": false + } + } + } + ] + }, + { + "id": "z-ai/glm-4.7-flash-free", + "provider": "z-ai", + "model": "glm-4.7-flash-free", + "displayName": "GLM 4.7 Flash (Free)", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/z-ai/glm-4.7-flash-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "z-ai/glm-4.7-flash-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.7 Flash (Free)" + ], + "knowledgeCutoff": "2025-01-01", + "releaseDate": "2026-01-19", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "z-ai/glm-4.7-flash-free", + "modelKey": "z-ai/glm-4.7-flash-free", + "displayName": "GLM 4.7 Flash (Free)", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-01-19", + "openWeights": false, + "releaseDate": "2026-01-19" + } + } + ] + }, + { + "id": "z-ai/glm-4.7-flash-original", + "provider": "z-ai", + "model": "glm-4.7-flash-original", + "displayName": "GLM 4.7 Flash Original", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/glm-4.7-flash-original" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-4.7-flash-original", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.7 Flash Original" + ], + "releaseDate": "2026-01-19", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-4.7-flash-original", + "modelKey": "zai-org/glm-4.7-flash-original", + "displayName": "GLM 4.7 Flash Original", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": false, + "releaseDate": "2026-01-19" + } + } + ] + }, + { + "id": "z-ai/glm-4.7-flash-original:thinking", + "provider": "z-ai", + "model": "glm-4.7-flash-original:thinking", + "displayName": "GLM 4.7 Flash Original Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/glm-4.7-flash-original:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-4.7-flash-original:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.7 Flash Original Thinking" + ], + "releaseDate": "2026-01-19", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-4.7-flash-original:thinking", + "modelKey": "zai-org/glm-4.7-flash-original:thinking", + "displayName": "GLM 4.7 Flash Original Thinking", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": false, + "releaseDate": "2026-01-19" + } + } + ] + }, + { + "id": "z-ai/glm-4.7-flash:thinking", + "provider": "z-ai", + "model": "glm-4.7-flash:thinking", + "displayName": "GLM 4.7 Flash Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/glm-4.7-flash:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-4.7-flash:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.7 Flash Thinking" + ], + "releaseDate": "2026-01-19", + "lastUpdated": "2026-01-19", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-4.7-flash:thinking", + "modelKey": "zai-org/glm-4.7-flash:thinking", + "displayName": "GLM 4.7 Flash Thinking", + "metadata": { + "lastUpdated": "2026-01-19", + "openWeights": false, + "releaseDate": "2026-01-19" + } + } + ] + }, + { + "id": "z-ai/glm-4.7-flashx", + "provider": "z-ai", + "model": "glm-4.7-flashx", + "displayName": "glm-4.7-flashx", + "family": "glm-flash", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai", + "llmgateway", + "merge-gateway", + "vercel", + "zai", + "zenmux", + "zhipuai" + ], + "aliases": [ + "302ai/glm-4.7-flashx", + "llmgateway/glm-4.7-flashx", + "merge-gateway/zai/glm-4.7-flashx", + "vercel/zai/glm-4.7-flashx", + "zai/glm-4.7-flashx", + "zenmux/z-ai/glm-4.7-flashx", + "zhipuai/glm-4.7-flashx" + ], + "mergedProviderModelRecords": 7, + "limits": { + "contextTokens": 200000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "interleaved": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "glm-4.7-flashx", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.0715, + "output": 0.429 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "glm-4.7-flashx", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0, + "input": 0.07, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "zai/glm-4.7-flashx", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0, + "input": 0.07, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "zai/glm-4.7-flashx", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.06, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "zai", + "model": "glm-4.7-flashx", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0, + "input": 0.07, + "output": 0.4 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "z-ai/glm-4.7-flashx", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.07, + "output": 0.42 + } + }, + { + "source": "models.dev", + "provider": "zhipuai", + "model": "glm-4.7-flashx", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0, + "input": 0.07, + "output": 0.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.7 FlashX", + "GLM-4.7-FlashX", + "glm-4.7-flashx" + ], + "families": [ + "glm-flash" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-01-20", + "lastUpdated": "2026-01-20", + "providerModelRecordCount": 7 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "glm-4.7-flashx", + "modelKey": "glm-4.7-flashx", + "displayName": "glm-4.7-flashx", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-20", + "openWeights": true, + "releaseDate": "2026-01-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "glm-4.7-flashx", + "modelKey": "glm-4.7-flashx", + "displayName": "GLM-4.7-FlashX", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2026-01-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "zai/glm-4.7-flashx", + "modelKey": "zai/glm-4.7-flashx", + "displayName": "GLM-4.7-FlashX", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2026-01-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "zai/glm-4.7-flashx", + "modelKey": "zai/glm-4.7-flashx", + "displayName": "GLM 4.7 FlashX", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2025-01-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai", + "providerName": "Z.AI", + "providerApi": "https://api.z.ai/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.7-flashx", + "modelKey": "glm-4.7-flashx", + "displayName": "GLM-4.7-FlashX", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2026-01-19", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "z-ai/glm-4.7-flashx", + "modelKey": "z-ai/glm-4.7-flashx", + "displayName": "GLM 4.7 FlashX", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-01-19", + "openWeights": false, + "releaseDate": "2026-01-19" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai", + "providerName": "Zhipu AI", + "providerApi": "https://open.bigmodel.cn/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-4.7-flashx", + "modelKey": "glm-4.7-flashx", + "displayName": "GLM-4.7-FlashX", + "family": "glm-flash", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-19", + "openWeights": true, + "releaseDate": "2026-01-19", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "z-ai/glm-4.7-fp8", + "provider": "z-ai", + "model": "glm-4.7-fp8", + "displayName": "GLM 4.7 FP8", + "family": "glm", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "chutes", + "gmi" + ], + "aliases": [ + "chutes/zai-org/GLM-4.7-FP8", + "gmi/zai-org/GLM-4.7-FP8" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 202752, + "inputTokens": 202752, + "maxTokens": 16384, + "outputTokens": 65535, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "zai-org/GLM-4.7-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.14945, + "input": 0.2989, + "output": 1.1957 + } + }, + { + "source": "litellm", + "provider": "gmi", + "model": "gmi/zai-org/GLM-4.7-FP8", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.7 FP8" + ], + "families": [ + "glm" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-01-27", + "lastUpdated": "2026-04-25", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "zai-org/GLM-4.7-FP8", + "modelKey": "zai-org/GLM-4.7-FP8", + "displayName": "GLM 4.7 FP8", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2026-01-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "gmi", + "model": "gmi/zai-org/GLM-4.7-FP8", + "mode": "chat" + } + ] + }, + { + "id": "z-ai/glm-4.7-free", + "provider": "z-ai", + "model": "glm-4.7-free", + "displayName": "GLM-4.7 Free", + "family": "glm-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/glm-4.7-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "glm-4.7-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-4.7 Free" + ], + "families": [ + "glm-free" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-12-22", + "lastUpdated": "2025-12-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "glm-4.7-free", + "modelKey": "glm-4.7-free", + "displayName": "GLM-4.7 Free", + "family": "glm-free", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22" + } + } + ] + }, + { + "id": "z-ai/glm-4.7-maas", + "provider": "z-ai", + "model": "glm-4.7-maas", + "displayName": "GLM-4.7", + "family": "glm", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "vertex_ai-zai_models" + ], + "aliases": [ + "google-vertex/zai-org/glm-4.7-maas", + "vertex_ai-zai_models/vertex_ai/zai-org/glm-4.7-maas" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "maxTokens": 128000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex", + "model": "zai-org/glm-4.7-maas", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-zai_models", + "model": "vertex_ai/zai-org/glm-4.7-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.6, + "output": 2.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-4.7" + ], + "families": [ + "glm" + ], + "modes": [ + "chat" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-01-06", + "lastUpdated": "2026-01-06", + "supportedRegions": [ + "global" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "zai-org/glm-4.7-maas", + "modelKey": "zai-org/glm-4.7-maas", + "displayName": "GLM-4.7", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-01-06", + "openWeights": true, + "releaseDate": "2026-01-06", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-zai_models", + "model": "vertex_ai/zai-org/glm-4.7-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#partner-models", + "supportedRegions": [ + "global" + ] + } + } + ] + }, + { + "id": "z-ai/glm-4.7-n", + "provider": "z-ai", + "model": "glm-4.7-n", + "displayName": "glm-4.7-n", + "sources": [ + "models.dev" + ], + "providers": [ + "poe" + ], + "aliases": [ + "poe/novita/glm-4.7-n" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 205000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": false, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "metadata": { + "displayNames": [ + "glm-4.7-n" + ], + "releaseDate": "2025-12-22", + "lastUpdated": "2025-12-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "novita/glm-4.7-n", + "modelKey": "novita/glm-4.7-n", + "displayName": "glm-4.7-n", + "metadata": { + "lastUpdated": "2025-12-22", + "openWeights": false, + "releaseDate": "2025-12-22" + } + } + ] + }, + { + "id": "z-ai/glm-4.7-original", + "provider": "z-ai", + "model": "glm-4.7-original", + "displayName": "GLM 4.7 Original", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/glm-4.7-original" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 65535, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-4.7-original", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.6, + "output": 2.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.7 Original" + ], + "releaseDate": "2025-12-22", + "lastUpdated": "2025-12-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-4.7-original", + "modelKey": "zai-org/glm-4.7-original", + "displayName": "GLM 4.7 Original", + "metadata": { + "lastUpdated": "2025-12-22", + "openWeights": false, + "releaseDate": "2025-12-22" + } + } + ] + }, + { + "id": "z-ai/glm-4.7-original:thinking", + "provider": "z-ai", + "model": "glm-4.7-original:thinking", + "displayName": "GLM 4.7 Original Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/glm-4.7-original:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 65535, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-4.7-original:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.6, + "output": 2.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.7 Original Thinking" + ], + "releaseDate": "2025-12-22", + "lastUpdated": "2025-12-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-4.7-original:thinking", + "modelKey": "zai-org/glm-4.7-original:thinking", + "displayName": "GLM 4.7 Original Thinking", + "metadata": { + "lastUpdated": "2025-12-22", + "openWeights": false, + "releaseDate": "2025-12-22" + } + } + ] + }, + { + "id": "z-ai/glm-4.7-tee", + "provider": "z-ai", + "model": "glm-4.7-tee", + "displayName": "GLM 4.7 TEE", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/zai-org/GLM-4.7-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 202752, + "outputTokens": 65535, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "zai-org/GLM-4.7-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.195, + "input": 0.39, + "output": 1.75 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.7 TEE" + ], + "families": [ + "glm" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2025-12-22", + "lastUpdated": "2025-12-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "zai-org/GLM-4.7-TEE", + "modelKey": "zai-org/GLM-4.7-TEE", + "displayName": "GLM 4.7 TEE", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2025-12-22", + "openWeights": true, + "releaseDate": "2025-12-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "z-ai/glm-4.7:thinking", + "provider": "z-ai", + "model": "glm-4.7:thinking", + "displayName": "GLM 4.7 Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/glm-4.7:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 65535, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-4.7:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 4.7 Thinking" + ], + "releaseDate": "2025-12-22", + "lastUpdated": "2025-12-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-4.7:thinking", + "modelKey": "zai-org/glm-4.7:thinking", + "displayName": "GLM 4.7 Thinking", + "metadata": { + "lastUpdated": "2025-12-22", + "openWeights": false, + "releaseDate": "2025-12-22" + } + } + ] + }, + { + "id": "z-ai/glm-4p5", + "provider": "z-ai", + "model": "glm-4p5", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/glm-4p5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 96000, + "outputTokens": 96000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/glm-4p5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.55, + "output": 2.19 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/glm-4p5", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/models/fireworks/glm-4p5" + } + } + ] + }, + { + "id": "z-ai/glm-4p5-air", + "provider": "z-ai", + "model": "glm-4p5-air", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/glm-4p5-air" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "maxTokens": 96000, + "outputTokens": 96000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/glm-4p5-air", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.22, + "output": 0.88 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/glm-4p5-air", + "mode": "chat", + "metadata": { + "source": "https://artificialanalysis.ai/models/glm-4-5-air" + } + } + ] + }, + { + "id": "z-ai/glm-4p5v", + "provider": "z-ai", + "model": "glm-4p5v", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/glm-4p5v" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 131072, + "inputTokens": 131072, + "maxTokens": 131072, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "speech": false, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/glm-4p5v", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 1.2, + "output": 1.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/glm-4p5v", + "mode": "chat" + } + ] + }, + { + "id": "z-ai/glm-4p6", + "provider": "z-ai", + "model": "glm-4p6", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/glm-4p6" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 202800, + "inputTokens": 202800, + "maxTokens": 202800, + "outputTokens": 202800, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/glm-4p6", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.55, + "output": 2.19 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/glm-4p6", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/pricing" + } + } + ] + }, + { + "id": "z-ai/glm-4p7", + "provider": "z-ai", + "model": "glm-4p7", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "fireworks_ai" + ], + "aliases": [ + "fireworks_ai/accounts/fireworks/models/glm-4p7", + "fireworks_ai/glm-4p7" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 202800, + "inputTokens": 202800, + "maxTokens": 202800, + "outputTokens": 202800, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "reasoning": true, + "rerank": false, + "responseSchema": true, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/glm-4p7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "input": 0.6, + "output": 2.2 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/glm-4p7", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "input": 0.6, + "output": 2.2 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/glm-4p7", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/models/fireworks/glm-4p7" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/glm-4p7", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/models/fireworks/glm-4p7" + } + } + ] + }, + { + "id": "z-ai/glm-5", + "provider": "z-ai", + "model": "glm-5", + "displayName": "GLM 5", + "family": "glm", + "mode": "chat", + "sources": [ + "litellm", + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "abacus", + "alibaba-cn", + "alibaba-coding-plan", + "alibaba-coding-plan-cn", + "alibaba-token-plan", + "alibaba-token-plan-cn", + "baseten", + "cortecs", + "crof", + "deepinfra", + "digitalocean", + "dinference", + "fastrouter", + "friendli", + "huggingface", + "kilo", + "llmgateway", + "meganova", + "merge-gateway", + "nano-gpt", + "nebius", + "novita-ai", + "ollama-cloud", + "opencode", + "opencode-go", + "openrouter", + "orcarouter", + "poe", + "qiniu-ai", + "siliconflow", + "siliconflow-cn", + "synthetic", + "tencent-coding-plan", + "togetherai", + "vercel", + "zai", + "zenmux", + "zhipuai" + ], + "aliases": [ + "302ai/glm-5", + "abacus/zai-org/glm-5", + "alibaba-cn/glm-5", + "alibaba-coding-plan-cn/glm-5", + "alibaba-coding-plan/glm-5", + "alibaba-token-plan-cn/glm-5", + "alibaba-token-plan/glm-5", + "baseten/zai-org/GLM-5", + "cortecs/glm-5", + "crof/glm-5", + "deepinfra/zai-org/GLM-5", + "digitalocean/glm-5", + "dinference/glm-5", + "fastrouter/z-ai/glm-5", + "friendli/zai-org/GLM-5", + "huggingface/zai-org/GLM-5", + "kilo/z-ai/glm-5", + "llmgateway/glm-5", + "meganova/zai-org/GLM-5", + "merge-gateway/zai/glm-5", + "nano-gpt/TEE/glm-5", + "nano-gpt/zai-org/glm-5", + "nebius/zai-org/GLM-5", + "novita-ai/zai-org/glm-5", + "ollama-cloud/glm-5", + "opencode-go/glm-5", + "opencode/glm-5", + "openrouter/z-ai/glm-5", + "orcarouter/z-ai/glm-5", + "poe/novita/glm-5", + "qiniu-ai/z-ai/glm-5", + "siliconflow-cn/Pro/zai-org/GLM-5", + "siliconflow/zai-org/GLM-5", + "synthetic/hf:zai-org/GLM-5", + "tencent-coding-plan/glm-5", + "togetherai/zai-org/GLM-5", + "vercel/zai/glm-5", + "zai/glm-5", + "zenmux/z-ai/glm-5", + "zhipuai/glm-5" + ], + "mergedProviderModelRecords": 40, + "limits": { + "contextTokens": 205000, + "inputTokens": 203000, + "maxTokens": 128000, + "outputTokens": 205000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "embedding": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "speech": false, + "transcription": false, + "supports1MContext": false, + "functionCalling": true, + "toolChoice": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "webSearch": false, + "promptCaching": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.6, + "output": 2.6 + } + }, + { + "source": "models.dev", + "provider": "abacus", + "model": "zai-org/glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.86, + "output": 3.15 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan-cn", + "model": "glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-coding-plan", + "model": "glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "baseten", + "model": "zai-org/GLM-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 0.95, + "output": 3.15 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.08, + "output": 3.44 + } + }, + { + "source": "models.dev", + "provider": "crof", + "model": "glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 0, + "input": 0.48, + "output": 1.9 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "zai-org/GLM-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12, + "input": 0.6, + "output": 2.08 + } + }, + { + "source": "models.dev", + "provider": "digitalocean", + "model": "glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "dinference", + "model": "glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.75, + "output": 2.4 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "z-ai/glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.95, + "output": 3.15 + } + }, + { + "source": "models.dev", + "provider": "friendli", + "model": "zai-org/GLM-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.5, + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "zai-org/GLM-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "z-ai/glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.72, + "output": 2.3 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0, + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "meganova", + "model": "zai-org/GLM-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.8, + "output": 2.56 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "zai/glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0, + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.2, + "output": 3.5 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.55 + } + }, + { + "source": "models.dev", + "provider": "nebius", + "model": "zai-org/GLM-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 1, + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "zai-org/glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "opencode-go", + "model": "glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "z-ai/glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12, + "input": 0.6, + "output": 1.92 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "z-ai/glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0, + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "poe", + "model": "novita/glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Pro/zai-org/GLM-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "zai-org/GLM-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.95, + "output": 2.55 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:zai-org/GLM-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "input": 1, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "tencent-coding-plan", + "model": "glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "zai-org/GLM-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "zai/glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "zai", + "model": "glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0, + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "z-ai/glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.14, + "input": 0.58, + "output": 2.6 + } + }, + { + "source": "models.dev", + "provider": "zhipuai", + "model": "glm-5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0, + "input": 1, + "output": 3.2 + } + }, + { + "source": "litellm", + "provider": "baseten", + "model": "baseten/zai-org/GLM-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.95, + "output": 3.15 + } + }, + { + "source": "litellm", + "provider": "openrouter", + "model": "openrouter/z-ai/glm-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "input": 0.8, + "output": 2.56 + } + }, + { + "source": "litellm", + "provider": "zai", + "model": "zai/glm-5", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "cacheWrite": 0, + "input": 1, + "output": 3.2 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "z-ai/glm-5", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.12, + "input": 0.6, + "output": 1.92 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5", + "GLM 5 TEE", + "GLM-5", + "Pro/zai-org/GLM-5", + "Z-Ai/GLM 5", + "Z.ai: GLM 5", + "glm-5", + "zai-org/GLM-5" + ], + "families": [ + "glm" + ], + "modes": [ + "chat" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2026-01", + "releaseDate": "2026-02-12", + "lastUpdated": "2026-02-12", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 40 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "glm-5", + "modelKey": "glm-5", + "displayName": "glm-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "abacus", + "providerName": "Abacus", + "providerApi": "https://routellm.abacus.ai/v1", + "providerDoc": "https://abacus.ai/help/api", + "model": "zai-org/glm-5", + "modelKey": "zai-org/glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": true, + "releaseDate": "2026-02-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "glm-5", + "modelKey": "glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": false, + "releaseDate": "2026-02-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan-cn", + "providerName": "Alibaba Coding Plan (China)", + "providerApi": "https://coding.dashscope.aliyuncs.com/v1", + "providerDoc": "https://help.aliyun.com/zh/model-studio/coding-plan", + "model": "glm-5", + "modelKey": "glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": false, + "releaseDate": "2026-02-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-coding-plan", + "providerName": "Alibaba Coding Plan", + "providerApi": "https://coding-intl.dashscope.aliyuncs.com/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/coding-plan", + "model": "glm-5", + "modelKey": "glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": false, + "releaseDate": "2026-02-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "glm-5", + "modelKey": "glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": false, + "releaseDate": "2026-02-12", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "glm-5", + "modelKey": "glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": false, + "releaseDate": "2026-02-12", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "baseten", + "providerName": "Baseten", + "providerApi": "https://inference.baseten.co/v1", + "providerDoc": "https://docs.baseten.co/inference/model-apis/overview", + "model": "zai-org/GLM-5", + "modelKey": "zai-org/GLM-5", + "displayName": "GLM 5", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2026-01", + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "glm-5", + "modelKey": "glm-5", + "displayName": "GLM 5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": true, + "releaseDate": "2026-02-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "glm-5", + "modelKey": "glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "zai-org/GLM-5", + "modelKey": "zai-org/GLM-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-12", + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "digitalocean", + "providerName": "DigitalOcean", + "providerApi": "https://inference.do-ai.run/v1", + "providerDoc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "model": "glm-5", + "modelKey": "glm-5", + "displayName": "GLM 5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-16", + "openWeights": true, + "releaseDate": "2026-02-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "dinference", + "providerName": "DInference", + "providerApi": "https://api.dinference.com/v1", + "providerDoc": "https://dinference.com", + "model": "glm-5", + "modelKey": "glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "z-ai/glm-5", + "modelKey": "z-ai/glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": true, + "releaseDate": "2026-02-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "friendli", + "providerName": "Friendli", + "providerApi": "https://api.friendli.ai/serverless/v1", + "providerDoc": "https://friendli.ai/docs/guides/serverless_endpoints/introduction", + "model": "zai-org/GLM-5", + "modelKey": "zai-org/GLM-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "zai-org/GLM-5", + "modelKey": "zai-org/GLM-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": true, + "releaseDate": "2026-02-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "z-ai/glm-5", + "modelKey": "z-ai/glm-5", + "displayName": "Z.ai: GLM 5", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "glm-5", + "modelKey": "glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "meganova", + "providerName": "Meganova", + "providerApi": "https://api.meganova.ai/v1", + "providerDoc": "https://docs.meganova.ai", + "model": "zai-org/GLM-5", + "modelKey": "zai-org/GLM-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": true, + "releaseDate": "2026-02-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "zai/glm-5", + "modelKey": "zai/glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/glm-5", + "modelKey": "TEE/glm-5", + "displayName": "GLM 5 TEE", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": false, + "releaseDate": "2026-02-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-5", + "modelKey": "zai-org/glm-5", + "displayName": "GLM 5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": true, + "releaseDate": "2026-02-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nebius", + "providerName": "Nebius Token Factory", + "providerApi": "https://api.tokenfactory.nebius.com/v1", + "providerDoc": "https://docs.tokenfactory.nebius.com/", + "model": "zai-org/GLM-5", + "modelKey": "zai-org/GLM-5", + "displayName": "GLM-5", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2026-01", + "lastUpdated": "2026-03-10", + "openWeights": false, + "releaseDate": "2026-03-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "zai-org/glm-5", + "modelKey": "zai-org/glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "glm-5", + "modelKey": "glm-5", + "displayName": "glm-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": true, + "releaseDate": "2026-02-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "glm-5", + "modelKey": "glm-5", + "displayName": "GLM-5", + "family": "glm", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-11", + "openWeights": true, + "releaseDate": "2026-02-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "glm-5", + "modelKey": "glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-11", + "openWeights": true, + "releaseDate": "2026-02-11" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "z-ai/glm-5", + "modelKey": "z-ai/glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "z-ai/glm-5", + "modelKey": "z-ai/glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "poe", + "providerName": "Poe", + "providerApi": "https://api.poe.com/v1", + "providerDoc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "model": "novita/glm-5", + "modelKey": "novita/glm-5", + "displayName": "GLM-5", + "metadata": { + "lastUpdated": "2026-02-15", + "openWeights": false, + "releaseDate": "2026-02-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "qiniu-ai", + "providerName": "Qiniu", + "providerApi": "https://api.qnaigc.com/v1", + "providerDoc": "https://developer.qiniu.com/aitokenapi", + "model": "z-ai/glm-5", + "modelKey": "z-ai/glm-5", + "displayName": "Z-Ai/GLM 5", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": false, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Pro/zai-org/GLM-5", + "modelKey": "Pro/zai-org/GLM-5", + "displayName": "Pro/zai-org/GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "zai-org/GLM-5", + "modelKey": "zai-org/GLM-5", + "displayName": "zai-org/GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-15", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:zai-org/GLM-5", + "modelKey": "hf:zai-org/GLM-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-08", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "tencent-coding-plan", + "providerName": "Tencent Coding Plan (China)", + "providerApi": "https://api.lkeap.cloud.tencent.com/coding/v3", + "providerDoc": "https://cloud.tencent.com/document/product/1772/128947", + "model": "glm-5", + "modelKey": "glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": false, + "releaseDate": "2026-02-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "zai-org/GLM-5", + "modelKey": "zai-org/GLM-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": true, + "releaseDate": "2026-02-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "zai/glm-5", + "modelKey": "zai/glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai", + "providerName": "Z.AI", + "providerApi": "https://api.z.ai/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-5", + "modelKey": "glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "z-ai/glm-5", + "modelKey": "z-ai/glm-5", + "displayName": "GLM 5", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai", + "providerName": "Zhipu AI", + "providerApi": "https://open.bigmodel.cn/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-5", + "modelKey": "glm-5", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": true, + "releaseDate": "2026-02-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "baseten", + "model": "baseten/zai-org/GLM-5", + "mode": "chat" + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "openrouter", + "model": "openrouter/z-ai/glm-5", + "mode": "chat", + "metadata": { + "source": "https://openrouter.ai/z-ai/glm-5" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "zai", + "model": "zai/glm-5", + "mode": "chat", + "metadata": { + "source": "https://docs.z.ai/guides/overview/pricing" + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "z-ai/glm-5", + "displayName": "Z.ai: GLM 5", + "metadata": { + "canonicalSlug": "z-ai/glm-5-20260211", + "createdAt": "2026-02-11T16:59:42.000Z", + "huggingFaceId": "zai-org/GLM-5", + "links": { + "details": "/api/v1/models/z-ai/glm-5-20260211/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 202752, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "z-ai/glm-5-code", + "provider": "z-ai", + "model": "glm-5-code", + "mode": "chat", + "sources": [ + "litellm" + ], + "providers": [ + "zai" + ], + "aliases": [ + "zai/glm-5-code" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "audioInput": false, + "audioOutput": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "imageInput": false, + "imageOutput": false, + "moderation": false, + "pdfInput": false, + "promptCaching": true, + "reasoning": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "litellm", + "provider": "zai", + "model": "zai/glm-5-code", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.3, + "cacheWrite": 0, + "input": 1.2, + "output": 5 + } + } + ] + }, + "metadata": { + "modes": [ + "chat" + ], + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "zai", + "model": "zai/glm-5-code", + "mode": "chat", + "metadata": { + "source": "https://docs.z.ai/guides/overview/pricing" + } + } + ] + }, + { + "id": "z-ai/glm-5-fast", + "provider": "z-ai", + "model": "glm-5-fast", + "displayName": "GLM 5 Fast", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "neuralwatt" + ], + "aliases": [ + "neuralwatt/glm-5-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 202736, + "outputTokens": 202736, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "neuralwatt", + "model": "glm-5-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.1, + "output": 3.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5 Fast" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-04-07", + "lastUpdated": "2026-04-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neuralwatt", + "providerName": "Neuralwatt", + "providerApi": "https://api.neuralwatt.com/v1", + "providerDoc": "https://portal.neuralwatt.com/docs", + "model": "glm-5-fast", + "modelKey": "glm-5-fast", + "displayName": "GLM 5 Fast", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + } + ] + }, + { + "id": "z-ai/glm-5-fp8", + "provider": "z-ai", + "model": "glm-5-fp8", + "displayName": "GLM-5", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "gmicloud", + "wandb" + ], + "aliases": [ + "gmicloud/zai-org/GLM-5-FP8", + "wandb/zai-org/GLM-5-FP8" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 202752, + "outputTokens": 200000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "gmicloud", + "model": "zai-org/GLM-5-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.12, + "input": 0.6, + "output": 1.92 + } + }, + { + "source": "models.dev", + "provider": "wandb", + "model": "zai-org/GLM-5-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1, + "output": 3.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5", + "GLM-5" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-02-12", + "lastUpdated": "2026-02-12", + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gmicloud", + "providerName": "GMI Cloud", + "providerApi": "https://api.gmi-serving.com/v1", + "providerDoc": "https://docs.gmicloud.ai/inference-engine/api-reference/llm-api-reference", + "model": "zai-org/GLM-5-FP8", + "modelKey": "zai-org/GLM-5-FP8", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "zai-org/GLM-5-FP8", + "modelKey": "zai-org/GLM-5-FP8", + "displayName": "GLM 5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-12", + "openWeights": true, + "releaseDate": "2026-02-11" + } + } + ] + }, + { + "id": "z-ai/glm-5-free", + "provider": "z-ai", + "model": "glm-5-free", + "displayName": "GLM-5 Free", + "family": "glm-free", + "sources": [ + "models.dev" + ], + "providers": [ + "opencode" + ], + "aliases": [ + "opencode/glm-5-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 204800, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "opencode", + "model": "glm-5-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-5 Free" + ], + "families": [ + "glm-free" + ], + "statuses": [ + "deprecated" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-02-11", + "lastUpdated": "2026-02-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "glm-5-free", + "modelKey": "glm-5-free", + "displayName": "GLM-5 Free", + "family": "glm-free", + "status": "deprecated", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-02-11", + "openWeights": true, + "releaseDate": "2026-02-11" + } + } + ] + }, + { + "id": "z-ai/glm-5-maas", + "provider": "z-ai", + "model": "glm-5-maas", + "displayName": "GLM-5", + "family": "glm", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "google-vertex", + "vertex_ai-zai_models" + ], + "aliases": [ + "google-vertex/zai-org/glm-5-maas", + "vertex_ai-zai_models/vertex_ai/zai-org/glm-5-maas" + ], + "mergedProviderModelRecords": 2, + "limits": { + "contextTokens": 202752, + "inputTokens": 200000, + "maxTokens": 128000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": true, + "imageGeneration": false, + "moderation": false, + "promptCaching": true, + "rerank": false, + "speech": false, + "toolChoice": true, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "google-vertex", + "model": "zai-org/glm-5-maas", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "input": 1, + "output": 3.2 + } + }, + { + "source": "litellm", + "provider": "vertex_ai-zai_models", + "model": "vertex_ai/zai-org/glm-5-maas", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.1, + "input": 1, + "output": 3.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM-5" + ], + "families": [ + "glm" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-02-11", + "lastUpdated": "2026-02-11", + "supportedRegions": [ + "global" + ], + "providerModelRecordCount": 2 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "google-vertex", + "providerName": "Vertex", + "providerDoc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "model": "zai-org/glm-5-maas", + "modelKey": "zai-org/glm-5-maas", + "displayName": "GLM-5", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": true, + "releaseDate": "2026-02-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "vertex_ai-zai_models", + "model": "vertex_ai/zai-org/glm-5-maas", + "mode": "chat", + "metadata": { + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#glm-models", + "supportedRegions": [ + "global" + ] + } + } + ] + }, + { + "id": "z-ai/glm-5-original", + "provider": "z-ai", + "model": "glm-5-original", + "displayName": "GLM 5 Original", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/glm-5-original" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-5-original", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5 Original" + ], + "releaseDate": "2026-02-11", + "lastUpdated": "2026-02-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-5-original", + "modelKey": "zai-org/glm-5-original", + "displayName": "GLM 5 Original", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": false, + "releaseDate": "2026-02-11" + } + } + ] + }, + { + "id": "z-ai/glm-5-original:thinking", + "provider": "z-ai", + "model": "glm-5-original:thinking", + "displayName": "GLM 5 Original Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/glm-5-original:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-5-original:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5 Original Thinking" + ], + "releaseDate": "2026-02-11", + "lastUpdated": "2026-02-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-5-original:thinking", + "modelKey": "zai-org/glm-5-original:thinking", + "displayName": "GLM 5 Original Thinking", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": false, + "releaseDate": "2026-02-11" + } + } + ] + }, + { + "id": "z-ai/glm-5-tee", + "provider": "z-ai", + "model": "glm-5-tee", + "displayName": "GLM 5 TEE", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/zai-org/GLM-5-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 202752, + "outputTokens": 65535, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "zai-org/GLM-5-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.475, + "input": 0.95, + "output": 2.55 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5 TEE" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-02-12", + "lastUpdated": "2026-02-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "zai-org/GLM-5-TEE", + "modelKey": "zai-org/GLM-5-TEE", + "displayName": "GLM 5 TEE", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-12", + "openWeights": true, + "releaseDate": "2026-02-12", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "z-ai/glm-5-turbo", + "provider": "z-ai", + "model": "glm-5-turbo", + "displayName": "glm-5-turbo", + "family": "glm", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "chutes", + "cortecs", + "kilo", + "merge-gateway", + "nano-gpt", + "openrouter", + "vercel", + "zai", + "zai-coding-plan", + "zenmux", + "zhipuai-coding-plan" + ], + "aliases": [ + "302ai/glm-5-turbo", + "chutes/zai-org/GLM-5-Turbo", + "cortecs/glm-5-turbo", + "kilo/z-ai/glm-5-turbo", + "merge-gateway/zai/glm-5-turbo", + "nano-gpt/z-ai/glm-5-turbo", + "openrouter/z-ai/glm-5-turbo", + "vercel/zai/glm-5-turbo", + "zai-coding-plan/glm-5-turbo", + "zai/glm-5-turbo", + "zenmux/z-ai/glm-5-turbo", + "zhipuai-coding-plan/glm-5-turbo" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 262144, + "inputTokens": 202800, + "outputTokens": 131100, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "glm-5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.72, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "chutes", + "model": "zai-org/GLM-5-Turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24455, + "input": 0.4891, + "output": 1.9565 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "glm-5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.308, + "cacheWrite": 1.544, + "input": 1.235, + "output": 4.118 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "z-ai/glm-5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "input": 1.2, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "zai/glm-5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "cacheWrite": 0, + "input": 1.2, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "z-ai/glm-5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "input": 1.2, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "z-ai/glm-5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "input": 1.2, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "zai/glm-5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "input": 1.2, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "zai-coding-plan", + "model": "glm-5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "zai", + "model": "glm-5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "cacheWrite": 0, + "input": 1.2, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "z-ai/glm-5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.88, + "output": 3.48 + } + }, + { + "source": "models.dev", + "provider": "zhipuai-coding-plan", + "model": "glm-5-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "z-ai/glm-5-turbo", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.24, + "input": 1.2, + "output": 4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5 Turbo", + "GLM-5-Turbo", + "Z.ai: GLM 5 Turbo", + "glm-5-turbo" + ], + "families": [ + "glm" + ], + "knowledgeCutoff": "2025-01-01", + "releaseDate": "2026-03-16", + "lastUpdated": "2026-03-16", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "glm-5-turbo", + "modelKey": "glm-5-turbo", + "displayName": "glm-5-turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-16", + "openWeights": false, + "releaseDate": "2026-03-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "zai-org/GLM-5-Turbo", + "modelKey": "zai-org/GLM-5-Turbo", + "displayName": "GLM 5 Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-25", + "openWeights": true, + "releaseDate": "2026-03-11", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "glm-5-turbo", + "modelKey": "glm-5-turbo", + "displayName": "GLM-5-Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-16", + "openWeights": false, + "releaseDate": "2026-03-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "z-ai/glm-5-turbo", + "modelKey": "z-ai/glm-5-turbo", + "displayName": "Z.ai: GLM 5 Turbo", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": true, + "releaseDate": "2026-03-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "zai/glm-5-turbo", + "modelKey": "zai/glm-5-turbo", + "displayName": "GLM-5-Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-16", + "openWeights": false, + "releaseDate": "2026-03-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "z-ai/glm-5-turbo", + "modelKey": "z-ai/glm-5-turbo", + "displayName": "GLM 5 Turbo", + "metadata": { + "lastUpdated": "2026-03-15", + "openWeights": false, + "releaseDate": "2026-03-15" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "z-ai/glm-5-turbo", + "modelKey": "z-ai/glm-5-turbo", + "displayName": "GLM-5-Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-16", + "openWeights": false, + "releaseDate": "2026-03-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "zai/glm-5-turbo", + "modelKey": "zai/glm-5-turbo", + "displayName": "GLM 5 Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-16", + "openWeights": false, + "releaseDate": "2026-03-15", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai-coding-plan", + "providerName": "Z.AI Coding Plan", + "providerApi": "https://api.z.ai/api/coding/paas/v4", + "providerDoc": "https://docs.z.ai/devpack/overview", + "model": "glm-5-turbo", + "modelKey": "glm-5-turbo", + "displayName": "GLM-5-Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-16", + "openWeights": false, + "releaseDate": "2026-03-16", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai", + "providerName": "Z.AI", + "providerApi": "https://api.z.ai/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-5-turbo", + "modelKey": "glm-5-turbo", + "displayName": "GLM-5-Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-16", + "openWeights": false, + "releaseDate": "2026-03-16", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "z-ai/glm-5-turbo", + "modelKey": "z-ai/glm-5-turbo", + "displayName": "GLM 5 Turbo", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-03-20", + "openWeights": false, + "releaseDate": "2026-03-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai-coding-plan", + "providerName": "Zhipu AI Coding Plan", + "providerApi": "https://open.bigmodel.cn/api/coding/paas/v4", + "providerDoc": "https://docs.bigmodel.cn/cn/coding-plan/overview", + "model": "glm-5-turbo", + "modelKey": "glm-5-turbo", + "displayName": "GLM-5-Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-16", + "openWeights": false, + "releaseDate": "2026-03-16", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "z-ai/glm-5-turbo", + "displayName": "Z.ai: GLM 5 Turbo", + "metadata": { + "canonicalSlug": "z-ai/glm-5-turbo-20260315", + "createdAt": "2026-03-15T14:06:13.000Z", + "links": { + "details": "/api/v1/models/z-ai/glm-5-turbo-20260315/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 262144, + "max_completion_tokens": 131072, + "is_moderated": false + } + } + } + ] + }, + { + "id": "z-ai/glm-5:thinking", + "provider": "z-ai", + "model": "glm-5:thinking", + "displayName": "GLM 5 Thinking", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/glm-5:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 128000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-5:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.55 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5 Thinking" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-02-11", + "lastUpdated": "2026-02-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-5:thinking", + "modelKey": "zai-org/glm-5:thinking", + "displayName": "GLM 5 Thinking", + "family": "glm", + "metadata": { + "lastUpdated": "2026-02-11", + "openWeights": true, + "releaseDate": "2026-02-11" + } + } + ] + }, + { + "id": "z-ai/glm-5.1", + "provider": "z-ai", + "model": "glm-5.1", + "displayName": "glm-5.1", + "family": "glm", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "302ai", + "alibaba-cn", + "alibaba-token-plan", + "alibaba-token-plan-cn", + "auriko", + "baseten", + "cortecs", + "crof", + "deepinfra", + "dinference", + "fastrouter", + "friendli", + "hpc-ai", + "huggingface", + "kilo", + "lilac", + "llmgateway", + "merge-gateway", + "nano-gpt", + "novita-ai", + "nvidia", + "ollama-cloud", + "opencode", + "opencode-go", + "openrouter", + "orcarouter", + "routing-run", + "siliconflow", + "siliconflow-cn", + "synthetic", + "togetherai", + "vercel", + "wafer.ai", + "wandb", + "zai", + "zai-coding-plan", + "zenmux", + "zhipuai", + "zhipuai-coding-plan" + ], + "aliases": [ + "302ai/glm-5.1", + "alibaba-cn/glm-5.1", + "alibaba-token-plan-cn/glm-5.1", + "alibaba-token-plan/glm-5.1", + "auriko/glm-5.1", + "baseten/zai-org/GLM-5.1", + "cortecs/glm-5.1", + "crof/glm-5.1", + "deepinfra/zai-org/GLM-5.1", + "dinference/glm-5.1", + "fastrouter/z-ai/glm-5.1", + "friendli/zai-org/GLM-5.1", + "hpc-ai/zai-org/glm-5.1", + "huggingface/zai-org/GLM-5.1", + "kilo/z-ai/glm-5.1", + "lilac/zai-org/glm-5.1", + "llmgateway/glm-5.1", + "merge-gateway/zai/glm-5.1", + "nano-gpt/TEE/glm-5.1", + "nano-gpt/zai-org/glm-5.1", + "novita-ai/zai-org/glm-5.1", + "nvidia/z-ai/glm-5.1", + "ollama-cloud/glm-5.1", + "opencode-go/glm-5.1", + "opencode/glm-5.1", + "openrouter/z-ai/glm-5.1", + "orcarouter/z-ai/glm-5.1", + "routing-run/route/glm-5.1", + "siliconflow-cn/Pro/zai-org/GLM-5.1", + "siliconflow/zai-org/GLM-5.1", + "synthetic/hf:zai-org/GLM-5.1", + "togetherai/zai-org/GLM-5.1", + "vercel/zai/glm-5.1", + "wafer.ai/GLM-5.1", + "wandb/zai-org/GLM-5.1", + "zai-coding-plan/glm-5.1", + "zai/glm-5.1", + "zenmux/z-ai/glm-5.1", + "zhipuai-coding-plan/glm-5.1", + "zhipuai/glm-5.1" + ], + "mergedProviderModelRecords": 40, + "limits": { + "contextTokens": 205000, + "inputTokens": 202752, + "outputTokens": 205000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "pdf", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "parallelFunctionCalling": true, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.86, + "output": 3.5 + } + }, + { + "source": "models.dev", + "provider": "alibaba-cn", + "model": "glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.17, + "input": 0.87, + "output": 3.48 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "auriko", + "model": "glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "baseten", + "model": "zai-org/GLM-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "input": 1.3, + "output": 4.3 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "input": 1.31, + "output": 4.1 + } + }, + { + "source": "models.dev", + "provider": "crof", + "model": "glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "cacheWrite": 0, + "input": 0.45, + "output": 2.15 + } + }, + { + "source": "models.dev", + "provider": "deepinfra", + "model": "zai-org/GLM-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.205, + "input": 1.05, + "output": 3.5 + } + }, + { + "source": "models.dev", + "provider": "dinference", + "model": "glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.25, + "output": 3.89 + } + }, + { + "source": "models.dev", + "provider": "fastrouter", + "model": "z-ai/glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.05, + "output": 3.5 + } + }, + { + "source": "models.dev", + "provider": "friendli", + "model": "zai-org/GLM-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "hpc-ai", + "model": "zai-org/glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.133, + "input": 0.615, + "output": 2.46 + } + }, + { + "source": "models.dev", + "provider": "huggingface", + "model": "zai-org/GLM-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "z-ai/glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.26, + "output": 3.96 + } + }, + { + "source": "models.dev", + "provider": "lilac", + "model": "zai-org/glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.27, + "input": 0.9, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "llmgateway", + "model": "glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.3, + "cacheWrite": 0, + "input": 6, + "output": 24 + } + }, + { + "source": "models.dev", + "provider": "merge-gateway", + "model": "zai/glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "cacheWrite": 0, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "input": 1.5, + "output": 5.25 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.55 + } + }, + { + "source": "models.dev", + "provider": "novita-ai", + "model": "zai-org/glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "nvidia", + "model": "z-ai/glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "opencode-go", + "model": "glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "opencode", + "model": "glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "z-ai/glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.182, + "input": 0.98, + "output": 3.08 + } + }, + { + "source": "models.dev", + "provider": "orcarouter", + "model": "z-ai/glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "cacheWrite": 0, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "cacheWrite": 0, + "input": 1, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "Pro/zai-org/GLM-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 0, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "zai-org/GLM-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 0, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "synthetic", + "model": "hf:zai-org/GLM-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1, + "input": 1, + "output": 3 + } + }, + { + "source": "models.dev", + "provider": "togetherai", + "model": "zai-org/GLM-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "zai/glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "wafer.ai", + "model": "GLM-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1, + "cacheWrite": 0, + "input": 1, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "wandb", + "model": "zai-org/GLM-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "cacheWrite": 0, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "zai-coding-plan", + "model": "glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "zai", + "model": "glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "cacheWrite": 0, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "z-ai/glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1903, + "input": 0.8781, + "output": 3.5126 + } + }, + { + "source": "models.dev", + "provider": "zhipuai-coding-plan", + "model": "glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "zhipuai", + "model": "glm-5.1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.3, + "cacheWrite": 0, + "input": 6, + "output": 24 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "z-ai/glm-5.1", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.182, + "input": 0.98, + "output": 3.08 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5.1", + "GLM 5.1 TEE", + "GLM-5.1", + "Pro/zai-org/GLM-5.1", + "Z.ai: GLM 5.1", + "glm-5.1", + "zai-org/GLM-5.1" + ], + "families": [ + "glm" + ], + "knowledgeCutoff": "2025-04", + "releaseDate": "2026-04-10", + "lastUpdated": "2026-04-10", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "parallel_tool_calls", + "presence_penalty", + "reasoning", + "reasoning_effort", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 40 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "glm-5.1", + "modelKey": "glm-5.1", + "displayName": "glm-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-10", + "openWeights": false, + "releaseDate": "2026-04-10" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-cn", + "providerName": "Alibaba (China)", + "providerApi": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/models", + "model": "glm-5.1", + "modelKey": "glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-14", + "openWeights": true, + "releaseDate": "2026-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "glm-5.1", + "modelKey": "glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "glm-5.1", + "modelKey": "glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "auriko", + "providerName": "Auriko", + "providerApi": "https://api.auriko.ai/v1", + "providerDoc": "https://docs.auriko.ai", + "model": "glm-5.1", + "modelKey": "glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "baseten", + "providerName": "Baseten", + "providerApi": "https://inference.baseten.co/v1", + "providerDoc": "https://docs.baseten.co/inference/model-apis/overview", + "model": "zai-org/GLM-5.1", + "modelKey": "zai-org/GLM-5.1", + "displayName": "GLM 5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "glm-5.1", + "modelKey": "glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-14", + "openWeights": true, + "releaseDate": "2026-04-14" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "glm-5.1", + "modelKey": "glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "deepinfra", + "providerName": "Deep Infra", + "providerDoc": "https://deepinfra.com/models", + "model": "zai-org/GLM-5.1", + "modelKey": "zai-org/GLM-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "dinference", + "providerName": "DInference", + "providerApi": "https://api.dinference.com/v1", + "providerDoc": "https://dinference.com", + "model": "glm-5.1", + "modelKey": "glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fastrouter", + "providerName": "FastRouter", + "providerApi": "https://go.fastrouter.ai/api/v1", + "providerDoc": "https://fastrouter.ai/models", + "model": "z-ai/glm-5.1", + "modelKey": "z-ai/glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "friendli", + "providerName": "Friendli", + "providerApi": "https://api.friendli.ai/serverless/v1", + "providerDoc": "https://friendli.ai/docs/guides/serverless_endpoints/introduction", + "model": "zai-org/GLM-5.1", + "modelKey": "zai-org/GLM-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "hpc-ai", + "providerName": "HPC-AI", + "providerApi": "https://api.hpc-ai.com/inference/v1", + "providerDoc": "https://www.hpc-ai.com/doc/docs/quickstart/", + "model": "zai-org/glm-5.1", + "modelKey": "zai-org/glm-5.1", + "displayName": "GLM 5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-01", + "openWeights": true, + "releaseDate": "2026-04-08", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "huggingface", + "providerName": "Hugging Face", + "providerApi": "https://router.huggingface.co/v1", + "providerDoc": "https://huggingface.co/docs/inference-providers", + "model": "zai-org/GLM-5.1", + "modelKey": "zai-org/GLM-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-03", + "openWeights": true, + "releaseDate": "2026-04-03" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "z-ai/glm-5.1", + "modelKey": "z-ai/glm-5.1", + "displayName": "Z.ai: GLM 5.1", + "metadata": { + "lastUpdated": "2026-03-27", + "openWeights": true, + "releaseDate": "2026-03-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "lilac", + "providerName": "Lilac", + "providerApi": "https://api.getlilac.com/v1", + "providerDoc": "https://docs.getlilac.com/inference/models", + "model": "zai-org/glm-5.1", + "modelKey": "zai-org/glm-5.1", + "displayName": "GLM 5.1", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "llmgateway", + "providerName": "LLM Gateway", + "providerApi": "https://api.llmgateway.io/v1", + "providerDoc": "https://llmgateway.io/docs", + "model": "glm-5.1", + "modelKey": "glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "merge-gateway", + "providerName": "Merge Gateway", + "providerDoc": "https://docs.merge.dev/merge-gateway", + "model": "zai/glm-5.1", + "modelKey": "zai/glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/glm-5.1", + "modelKey": "TEE/glm-5.1", + "displayName": "GLM 5.1 TEE", + "metadata": { + "lastUpdated": "2026-04-20", + "openWeights": false, + "releaseDate": "2026-04-20" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-5.1", + "modelKey": "zai-org/glm-5.1", + "displayName": "GLM 5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-27", + "openWeights": true, + "releaseDate": "2026-03-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "novita-ai", + "providerName": "NovitaAI", + "providerApi": "https://api.novita.ai/openai", + "providerDoc": "https://novita.ai/docs/guides/introduction", + "model": "zai-org/glm-5.1", + "modelKey": "zai-org/glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-27", + "openWeights": true, + "releaseDate": "2026-03-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nvidia", + "providerName": "Nvidia", + "providerApi": "https://integrate.api.nvidia.com/v1", + "providerDoc": "https://docs.api.nvidia.com/nim/", + "model": "z-ai/glm-5.1", + "modelKey": "z-ai/glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-27", + "openWeights": true, + "releaseDate": "2026-03-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "glm-5.1", + "modelKey": "glm-5.1", + "displayName": "glm-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-03-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "glm-5.1", + "modelKey": "glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode", + "providerName": "OpenCode Zen", + "providerApi": "https://opencode.ai/zen/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "glm-5.1", + "modelKey": "glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "z-ai/glm-5.1", + "modelKey": "z-ai/glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "orcarouter", + "providerName": "OrcaRouter", + "providerApi": "https://api.orcarouter.ai/v1", + "providerDoc": "https://docs.orcarouter.ai", + "model": "z-ai/glm-5.1", + "modelKey": "z-ai/glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/glm-5.1", + "modelKey": "route/glm-5.1", + "displayName": "GLM 5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "Pro/zai-org/GLM-5.1", + "modelKey": "Pro/zai-org/GLM-5.1", + "displayName": "Pro/zai-org/GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-08", + "openWeights": true, + "releaseDate": "2026-04-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "zai-org/GLM-5.1", + "modelKey": "zai-org/GLM-5.1", + "displayName": "zai-org/GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-08", + "openWeights": true, + "releaseDate": "2026-04-08" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "synthetic", + "providerName": "Synthetic", + "providerApi": "https://api.synthetic.new/openai/v1", + "providerDoc": "https://synthetic.new/pricing", + "model": "hf:zai-org/GLM-5.1", + "modelKey": "hf:zai-org/GLM-5.1", + "displayName": "GLM 5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-12", + "openWeights": true, + "releaseDate": "2026-03-27" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "togetherai", + "providerName": "Together AI", + "providerDoc": "https://docs.together.ai/docs/serverless-models", + "model": "zai-org/GLM-5.1", + "modelKey": "zai-org/GLM-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-11", + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "zai/glm-5.1", + "modelKey": "zai/glm-5.1", + "displayName": "GLM 5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": false, + "releaseDate": "2026-04-07", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wafer.ai", + "providerName": "Wafer", + "providerApi": "https://pass.wafer.ai/v1", + "providerDoc": "https://docs.wafer.ai/wafer-pass", + "model": "GLM-5.1", + "modelKey": "GLM-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "knowledgeCutoff": "2025-04", + "lastUpdated": "2026-06-01", + "openWeights": true, + "releaseDate": "2026-04-07", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "wandb", + "providerName": "Weights & Biases", + "providerApi": "https://api.inference.wandb.ai/v1", + "providerDoc": "https://docs.wandb.ai/guides/integrations/inference/", + "model": "zai-org/GLM-5.1", + "modelKey": "zai-org/GLM-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai-coding-plan", + "providerName": "Z.AI Coding Plan", + "providerApi": "https://api.z.ai/api/coding/paas/v4", + "providerDoc": "https://docs.z.ai/devpack/overview", + "model": "glm-5.1", + "modelKey": "glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-27", + "openWeights": false, + "releaseDate": "2026-03-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai", + "providerName": "Z.AI", + "providerApi": "https://api.z.ai/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-5.1", + "modelKey": "glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "z-ai/glm-5.1", + "modelKey": "z-ai/glm-5.1", + "displayName": "GLM-5.1", + "metadata": { + "lastUpdated": "2026-04-03", + "openWeights": false, + "releaseDate": "2026-04-03", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai-coding-plan", + "providerName": "Zhipu AI Coding Plan", + "providerApi": "https://open.bigmodel.cn/api/coding/paas/v4", + "providerDoc": "https://docs.bigmodel.cn/cn/coding-plan/overview", + "model": "glm-5.1", + "modelKey": "glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-27", + "openWeights": false, + "releaseDate": "2026-03-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai", + "providerName": "Zhipu AI", + "providerApi": "https://open.bigmodel.cn/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-5.1", + "modelKey": "glm-5.1", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-27", + "openWeights": false, + "releaseDate": "2026-03-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "z-ai/glm-5.1", + "displayName": "Z.ai: GLM 5.1", + "metadata": { + "canonicalSlug": "z-ai/glm-5.1-20260406", + "createdAt": "2026-04-07T16:07:05.000Z", + "huggingFaceId": "zai-org/GLM-5.1", + "links": { + "details": "/api/v1/models/z-ai/glm-5.1-20260406/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "parallel_tool_calls", + "presence_penalty", + "reasoning", + "reasoning_effort", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 202752, + "max_completion_tokens": null, + "is_moderated": false + } + } + } + ] + }, + { + "id": "z-ai/glm-5.1-6bit", + "provider": "z-ai", + "model": "glm-5.1-6bit", + "displayName": "GLM 5.1 6bit", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "routing-run" + ], + "aliases": [ + "routing-run/route/glm-5.1-6bit" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 202752, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "routing-run", + "model": "route/glm-5.1-6bit", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "cacheWrite": 0, + "input": 1, + "output": 3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5.1 6bit" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-04-07", + "lastUpdated": "2026-04-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "routing-run", + "providerName": "routing.run", + "providerApi": "https://ai.routing.sh/v1", + "providerDoc": "https://docs.routing.run/api-reference/models", + "model": "route/glm-5.1-6bit", + "modelKey": "route/glm-5.1-6bit", + "displayName": "GLM 5.1 6bit", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + } + ] + }, + { + "id": "z-ai/glm-5.1-fast", + "provider": "z-ai", + "model": "glm-5.1-fast", + "displayName": "GLM 5.1 Fast", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "neuralwatt" + ], + "aliases": [ + "neuralwatt/glm-5.1-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 202736, + "outputTokens": 202736, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "neuralwatt", + "model": "glm-5.1-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.1, + "output": 3.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5.1 Fast" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-04-07", + "lastUpdated": "2026-04-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neuralwatt", + "providerName": "Neuralwatt", + "providerApi": "https://api.neuralwatt.com/v1", + "providerDoc": "https://portal.neuralwatt.com/docs", + "model": "glm-5.1-fast", + "modelKey": "glm-5.1-fast", + "displayName": "GLM 5.1 Fast", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + } + ] + }, + { + "id": "z-ai/glm-5.1-fp8", + "provider": "z-ai", + "model": "glm-5.1-fp8", + "displayName": "GLM 5.1", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "ambient", + "gmicloud", + "inceptron", + "nearai", + "neuralwatt", + "vultr" + ], + "aliases": [ + "ambient/zai-org/GLM-5.1-FP8", + "gmicloud/zai-org/GLM-5.1-FP8", + "inceptron/zai-org/GLM-5.1-FP8", + "nearai/zai-org/GLM-5.1-FP8", + "neuralwatt/zai-org/GLM-5.1-FP8", + "vultr/zai-org/GLM-5.1-FP8" + ], + "mergedProviderModelRecords": 6, + "limits": { + "contextTokens": 202752, + "outputTokens": 202752, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "ambient", + "model": "zai-org/GLM-5.1-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "gmicloud", + "model": "zai-org/GLM-5.1-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.182, + "input": 0.98, + "output": 3.08 + } + }, + { + "source": "models.dev", + "provider": "inceptron", + "model": "zai-org/GLM-5.1-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "cacheWrite": 0, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "nearai", + "model": "zai-org/GLM-5.1-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.85, + "output": 3.3 + } + }, + { + "source": "models.dev", + "provider": "neuralwatt", + "model": "zai-org/GLM-5.1-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.1, + "output": 3.6 + } + }, + { + "source": "models.dev", + "provider": "vultr", + "model": "zai-org/GLM-5.1-FP8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.85, + "output": 3.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5.1", + "GLM 5.1 FP8", + "GLM-5.1", + "GLM-5.1 FP8" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-04-07", + "lastUpdated": "2026-04-07", + "providerModelRecordCount": 6 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ambient", + "providerName": "Ambient", + "providerApi": "https://api.ambient.xyz/v1", + "providerDoc": "https://ambient.xyz", + "model": "zai-org/GLM-5.1-FP8", + "modelKey": "zai-org/GLM-5.1-FP8", + "displayName": "GLM 5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "gmicloud", + "providerName": "GMI Cloud", + "providerApi": "https://api.gmi-serving.com/v1", + "providerDoc": "https://docs.gmicloud.ai/inference-engine/api-reference/llm-api-reference", + "model": "zai-org/GLM-5.1-FP8", + "modelKey": "zai-org/GLM-5.1-FP8", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "inceptron", + "providerName": "Inceptron", + "providerApi": "https://api.inceptron.io/v1", + "providerDoc": "https://docs.inceptron.io", + "model": "zai-org/GLM-5.1-FP8", + "modelKey": "zai-org/GLM-5.1-FP8", + "displayName": "GLM 5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nearai", + "providerName": "NEAR AI Cloud", + "providerApi": "https://cloud-api.near.ai/v1", + "providerDoc": "https://docs.near.ai/", + "model": "zai-org/GLM-5.1-FP8", + "modelKey": "zai-org/GLM-5.1-FP8", + "displayName": "GLM-5.1 FP8", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-27", + "openWeights": true, + "releaseDate": "2026-03-27", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neuralwatt", + "providerName": "Neuralwatt", + "providerApi": "https://api.neuralwatt.com/v1", + "providerDoc": "https://portal.neuralwatt.com/docs", + "model": "zai-org/GLM-5.1-FP8", + "modelKey": "zai-org/GLM-5.1-FP8", + "displayName": "GLM 5.1 FP8", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vultr", + "providerName": "Vultr", + "providerApi": "https://api.vultrinference.com/v1", + "providerDoc": "https://api.vultrinference.com/", + "model": "zai-org/GLM-5.1-FP8", + "modelKey": "zai-org/GLM-5.1-FP8", + "displayName": "GLM-5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07" + } + } + ] + }, + { + "id": "z-ai/glm-5.1-tee", + "provider": "z-ai", + "model": "glm-5.1-tee", + "displayName": "GLM 5.1 TEE", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "chutes" + ], + "aliases": [ + "chutes/zai-org/GLM-5.1-TEE" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 202752, + "outputTokens": 65535, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "chutes", + "model": "zai-org/GLM-5.1-TEE", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.525, + "input": 1.05, + "output": 3.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5.1 TEE" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-04-07", + "lastUpdated": "2026-04-07", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "chutes", + "providerName": "Chutes", + "providerApi": "https://llm.chutes.ai/v1", + "providerDoc": "https://llm.chutes.ai/v1/models", + "model": "zai-org/GLM-5.1-TEE", + "modelKey": "zai-org/GLM-5.1-TEE", + "displayName": "GLM 5.1 TEE", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-07", + "openWeights": true, + "releaseDate": "2026-04-07", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "z-ai/glm-5.1-thinking", + "provider": "z-ai", + "model": "glm-5.1-thinking", + "displayName": "GLM 5.1 Thinking TEE", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/TEE/glm-5.1-thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 202752, + "inputTokens": 202752, + "outputTokens": 65535, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "TEE/glm-5.1-thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "input": 1.5, + "output": 5.25 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5.1 Thinking TEE" + ], + "releaseDate": "2026-04-20", + "lastUpdated": "2026-04-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "TEE/glm-5.1-thinking", + "modelKey": "TEE/glm-5.1-thinking", + "displayName": "GLM 5.1 Thinking TEE", + "metadata": { + "lastUpdated": "2026-04-20", + "openWeights": false, + "releaseDate": "2026-04-20" + } + } + ] + }, + { + "id": "z-ai/glm-5.1:thinking", + "provider": "z-ai", + "model": "glm-5.1:thinking", + "displayName": "GLM 5.1 Thinking", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/glm-5.1:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-5.1:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.3, + "output": 2.55 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5.1 Thinking" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-03-27", + "lastUpdated": "2026-03-27", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-5.1:thinking", + "modelKey": "zai-org/glm-5.1:thinking", + "displayName": "GLM 5.1 Thinking", + "family": "glm", + "metadata": { + "lastUpdated": "2026-03-27", + "openWeights": true, + "releaseDate": "2026-03-27" + } + } + ] + }, + { + "id": "z-ai/glm-5.2", + "provider": "z-ai", + "model": "glm-5.2", + "displayName": "GLM-5.2", + "family": "glm", + "sources": [ + "models.dev", + "openrouter" + ], + "providers": [ + "alibaba-token-plan", + "alibaba-token-plan-cn", + "baseten", + "cloudflare-workers-ai", + "cortecs", + "crof", + "neuralwatt", + "ollama-cloud", + "opencode-go", + "openrouter", + "siliconflow", + "siliconflow-cn", + "vercel", + "zai-coding-plan", + "zhipuai", + "zhipuai-coding-plan" + ], + "aliases": [ + "alibaba-token-plan-cn/glm-5.2", + "alibaba-token-plan/glm-5.2", + "baseten/zai-org/GLM-5.2", + "cloudflare-workers-ai/@cf/zai-org/glm-5.2", + "cortecs/glm-5.2", + "crof/glm-5.2", + "neuralwatt/glm-5.2", + "ollama-cloud/glm-5.2", + "opencode-go/glm-5.2", + "openrouter/z-ai/glm-5.2", + "siliconflow-cn/zai-org/GLM-5.2", + "siliconflow/zai-org/GLM-5.2", + "vercel/zai/glm-5.2", + "zai-coding-plan/glm-5.2", + "zhipuai-coding-plan/glm-5.2", + "zhipuai/glm-5.2" + ], + "mergedProviderModelRecords": 16, + "limits": { + "contextTokens": 1048576, + "outputTokens": 1048560, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true, + "parallelFunctionCalling": false, + "responseSchema": true, + "toolChoice": true, + "webSearch": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "alibaba-token-plan-cn", + "model": "glm-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "alibaba-token-plan", + "model": "glm-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "baseten", + "model": "zai-org/GLM-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "input": 1.5, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "cloudflare-workers-ai", + "model": "@cf/zai-org/glm-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "glm-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.39, + "input": 1.44, + "output": 4.53 + } + }, + { + "source": "models.dev", + "provider": "crof", + "model": "glm-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.5, + "output": 2.2 + } + }, + { + "source": "models.dev", + "provider": "neuralwatt", + "model": "glm-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.45, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "opencode-go", + "model": "glm-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "openrouter", + "model": "z-ai/glm-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.2, + "output": 4.1 + } + }, + { + "source": "models.dev", + "provider": "siliconflow-cn", + "model": "zai-org/GLM-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 0, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "zai-org/GLM-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 0, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "zai/glm-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.3, + "input": 1.5, + "output": 4.5 + } + }, + { + "source": "models.dev", + "provider": "zai-coding-plan", + "model": "glm-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "zhipuai-coding-plan", + "model": "glm-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "zhipuai", + "model": "glm-5.2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "cacheWrite": 0, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "openrouter", + "provider": "openrouter", + "model": "z-ai/glm-5.2", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1.2, + "output": 4.1 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5.2", + "GLM-5.2", + "Glm 5.2", + "Z.ai: GLM 5.2" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-06-13", + "lastUpdated": "2026-06-13", + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "providerModelRecordCount": 16 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan-cn", + "providerName": "Alibaba Token Plan (China)", + "providerApi": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "model": "glm-5.2", + "modelKey": "glm-5.2", + "displayName": "GLM-5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-06-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "alibaba-token-plan", + "providerName": "Alibaba Token Plan", + "providerApi": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "providerDoc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "model": "glm-5.2", + "modelKey": "glm-5.2", + "displayName": "GLM-5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-06-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "baseten", + "providerName": "Baseten", + "providerApi": "https://inference.baseten.co/v1", + "providerDoc": "https://docs.baseten.co/inference/model-apis/overview", + "model": "zai-org/GLM-5.2", + "modelKey": "zai-org/GLM-5.2", + "displayName": "GLM 5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-06-13", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cloudflare-workers-ai", + "providerName": "Cloudflare Workers AI", + "providerApi": "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", + "providerDoc": "https://developers.cloudflare.com/workers-ai/models/", + "model": "@cf/zai-org/glm-5.2", + "modelKey": "@cf/zai-org/glm-5.2", + "displayName": "Glm 5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-06-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "glm-5.2", + "modelKey": "glm-5.2", + "displayName": "GLM-5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-06-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "crof", + "providerName": "CrofAI", + "providerApi": "https://crof.ai/v1", + "providerDoc": "https://crof.ai/docs", + "model": "glm-5.2", + "modelKey": "glm-5.2", + "displayName": "GLM-5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-06-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "neuralwatt", + "providerName": "Neuralwatt", + "providerApi": "https://api.neuralwatt.com/v1", + "providerDoc": "https://portal.neuralwatt.com/docs", + "model": "glm-5.2", + "modelKey": "glm-5.2", + "displayName": "GLM 5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-17", + "openWeights": true, + "releaseDate": "2026-06-17", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "ollama-cloud", + "providerName": "Ollama Cloud", + "providerApi": "https://ollama.com/v1", + "providerDoc": "https://docs.ollama.com/cloud", + "model": "glm-5.2", + "modelKey": "glm-5.2", + "displayName": "GLM-5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-06-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "opencode-go", + "providerName": "OpenCode Go", + "providerApi": "https://opencode.ai/zen/go/v1", + "providerDoc": "https://opencode.ai/docs/zen", + "model": "glm-5.2", + "modelKey": "glm-5.2", + "displayName": "GLM-5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-06-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "openrouter", + "providerName": "OpenRouter", + "providerApi": "https://openrouter.ai/api/v1", + "providerDoc": "https://openrouter.ai/models", + "model": "z-ai/glm-5.2", + "modelKey": "z-ai/glm-5.2", + "displayName": "GLM-5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-06-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow-cn", + "providerName": "SiliconFlow (China)", + "providerApi": "https://api.siliconflow.cn/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "zai-org/GLM-5.2", + "modelKey": "zai-org/GLM-5.2", + "displayName": "GLM-5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-06-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "zai-org/GLM-5.2", + "modelKey": "zai-org/GLM-5.2", + "displayName": "GLM-5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-06-13" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "zai/glm-5.2", + "modelKey": "zai/glm-5.2", + "displayName": "GLM 5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-06-16" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai-coding-plan", + "providerName": "Z.AI Coding Plan", + "providerApi": "https://api.z.ai/api/coding/paas/v4", + "providerDoc": "https://docs.z.ai/devpack/overview", + "model": "glm-5.2", + "modelKey": "glm-5.2", + "displayName": "GLM-5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-06-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai-coding-plan", + "providerName": "Zhipu AI Coding Plan", + "providerApi": "https://open.bigmodel.cn/api/coding/paas/v4", + "providerDoc": "https://docs.bigmodel.cn/cn/coding-plan/overview", + "model": "glm-5.2", + "modelKey": "glm-5.2", + "displayName": "GLM-5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": true, + "releaseDate": "2026-06-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai", + "providerName": "Zhipu AI", + "providerApi": "https://open.bigmodel.cn/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-5.2", + "modelKey": "glm-5.2", + "displayName": "GLM-5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-13", + "openWeights": false, + "releaseDate": "2026-06-13", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + }, + { + "source": "openrouter", + "sourceUrl": "https://openrouter.ai/api/v1/models", + "provider": "openrouter", + "model": "z-ai/glm-5.2", + "displayName": "Z.ai: GLM 5.2", + "metadata": { + "canonicalSlug": "z-ai/glm-5.2-20260616", + "createdAt": "2026-06-16T17:45:30.000Z", + "huggingFaceId": "zai-org/GLM-5.2", + "links": { + "details": "/api/v1/models/z-ai/glm-5.2-20260616/endpoints" + }, + "reasoning": { + "mandatory": false, + "default_enabled": true, + "supported_efforts": [ + "xhigh", + "high" + ], + "default_effort": "high" + }, + "supportedParameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_logprobs", + "top_p" + ], + "tokenizer": "Other", + "topProvider": { + "context_length": 1048576, + "max_completion_tokens": 131072, + "is_moderated": false + } + } + } + ] + }, + { + "id": "z-ai/glm-5p1", + "provider": "z-ai", + "model": "glm-5p1", + "displayName": "GLM 5.1", + "family": "glm", + "mode": "chat", + "sources": [ + "litellm", + "models.dev" + ], + "providers": [ + "fireworks-ai", + "fireworks_ai" + ], + "aliases": [ + "fireworks-ai/accounts/fireworks/models/glm-5p1", + "fireworks_ai/accounts/fireworks/models/glm-5p1", + "fireworks_ai/glm-5p1" + ], + "mergedProviderModelRecords": 3, + "limits": { + "contextTokens": 202800, + "inputTokens": 202800, + "maxTokens": 202800, + "outputTokens": 202800, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false, + "embedding": false, + "functionCalling": false, + "imageGeneration": false, + "moderation": false, + "rerank": false, + "responseSchema": false, + "speech": false, + "toolChoice": false, + "transcription": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fireworks-ai", + "model": "accounts/fireworks/models/glm-5p1", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/glm-5p1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.26, + "input": 1.4, + "output": 4.4 + } + }, + { + "source": "litellm", + "provider": "fireworks_ai", + "model": "fireworks_ai/glm-5p1", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "sourceUnit": "usd_per_token_for_token_fields", + "per1MTokens": { + "cacheRead": 0.26, + "input": 1.4, + "output": 4.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5.1" + ], + "families": [ + "glm" + ], + "modes": [ + "chat" + ], + "releaseDate": "2026-04-01", + "lastUpdated": "2026-04-01", + "providerModelRecordCount": 3 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fireworks-ai", + "providerName": "Fireworks AI", + "providerApi": "https://api.fireworks.ai/inference/v1/", + "providerDoc": "https://fireworks.ai/docs/", + "model": "accounts/fireworks/models/glm-5p1", + "modelKey": "accounts/fireworks/models/glm-5p1", + "displayName": "GLM 5.1", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-01", + "openWeights": true, + "releaseDate": "2026-04-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/accounts/fireworks/models/glm-5p1", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/models/fireworks/glm-5p1" + } + }, + { + "source": "litellm", + "sourceUrl": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json", + "provider": "fireworks_ai", + "model": "fireworks_ai/glm-5p1", + "mode": "chat", + "metadata": { + "source": "https://fireworks.ai/models/fireworks/glm-5p1" + } + } + ] + }, + { + "id": "z-ai/glm-5p1-fast", + "provider": "z-ai", + "model": "glm-5p1-fast", + "displayName": "GLM 5.1 Fast", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "fireworks-ai" + ], + "aliases": [ + "fireworks-ai/accounts/fireworks/routers/glm-5p1-fast" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 202800, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fireworks-ai", + "model": "accounts/fireworks/routers/glm-5p1-fast", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.52, + "input": 2.8, + "output": 8.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5.1 Fast" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-04-01", + "lastUpdated": "2026-04-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fireworks-ai", + "providerName": "Fireworks AI", + "providerApi": "https://api.fireworks.ai/inference/v1/", + "providerDoc": "https://fireworks.ai/docs/", + "model": "accounts/fireworks/routers/glm-5p1-fast", + "modelKey": "accounts/fireworks/routers/glm-5p1-fast", + "displayName": "GLM 5.1 Fast", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-01", + "openWeights": true, + "releaseDate": "2026-04-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "z-ai/glm-5p2", + "provider": "z-ai", + "model": "glm-5p2", + "displayName": "GLM 5.2", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "fireworks-ai" + ], + "aliases": [ + "fireworks-ai/accounts/fireworks/models/glm-5p2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "fireworks-ai", + "model": "accounts/fireworks/models/glm-5p2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.26, + "input": 1.4, + "output": 4.4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5.2" + ], + "families": [ + "glm" + ], + "releaseDate": "2026-06-16", + "lastUpdated": "2026-06-16", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "fireworks-ai", + "providerName": "Fireworks AI", + "providerApi": "https://api.fireworks.ai/inference/v1/", + "providerDoc": "https://fireworks.ai/docs/", + "model": "accounts/fireworks/models/glm-5p2", + "modelKey": "accounts/fireworks/models/glm-5p2", + "displayName": "GLM 5.2", + "family": "glm", + "metadata": { + "lastUpdated": "2026-06-16", + "openWeights": true, + "releaseDate": "2026-06-16", + "reasoningOptions": [ + { + "type": "toggle" + }, + { + "type": "effort", + "values": [ + "high", + "max" + ] + } + ] + } + } + ] + }, + { + "id": "z-ai/glm-5v-turbo", + "provider": "z-ai", + "model": "glm-5v-turbo", + "displayName": "GLM-5V-Turbo", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai", + "aihubmix", + "cortecs", + "kilo", + "nano-gpt", + "siliconflow", + "vercel", + "zai", + "zai-coding-plan", + "zenmux", + "zhipuai", + "zhipuai-coding-plan" + ], + "aliases": [ + "302ai/glm-5v-turbo", + "aihubmix/glm-5v-turbo", + "cortecs/glm-5v-turbo", + "kilo/z-ai/glm-5v-turbo", + "nano-gpt/z-ai/glm-5v-turbo", + "siliconflow/zai-org/GLM-5V-Turbo", + "vercel/zai/glm-5v-turbo", + "zai-coding-plan/glm-5v-turbo", + "zai/glm-5v-turbo", + "zenmux/z-ai/glm-5v-turbo", + "zhipuai-coding-plan/glm-5v-turbo", + "zhipuai/glm-5v-turbo" + ], + "mergedProviderModelRecords": 12, + "limits": { + "contextTokens": 202800, + "inputTokens": 202800, + "outputTokens": 131100, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false, + "structuredOutput": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "glm-5v-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.72, + "output": 3.2 + } + }, + { + "source": "models.dev", + "provider": "aihubmix", + "model": "glm-5v-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.169008, + "input": 0.7042, + "output": 3.09848 + } + }, + { + "source": "models.dev", + "provider": "cortecs", + "model": "glm-5v-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.308, + "cacheWrite": 1.544, + "input": 1.235, + "output": 4.118 + } + }, + { + "source": "models.dev", + "provider": "kilo", + "model": "z-ai/glm-5v-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "input": 1.2, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "z-ai/glm-5v-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "input": 1.2, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "siliconflow", + "model": "zai-org/GLM-5V-Turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheWrite": 0, + "input": 1.2, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "vercel", + "model": "zai/glm-5v-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "input": 1.2, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "zai-coding-plan", + "model": "glm-5v-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "zai", + "model": "glm-5v-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "cacheWrite": 0, + "input": 1.2, + "output": 4 + } + }, + { + "source": "models.dev", + "provider": "zenmux", + "model": "z-ai/glm-5v-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.1743, + "input": 0.726, + "output": 3.1946 + } + }, + { + "source": "models.dev", + "provider": "zhipuai-coding-plan", + "model": "glm-5v-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0, + "cacheWrite": 0, + "input": 0, + "output": 0 + } + }, + { + "source": "models.dev", + "provider": "zhipuai", + "model": "glm-5v-turbo", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 1.2, + "cacheWrite": 0, + "input": 5, + "output": 22 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5 Vision Turbo", + "GLM 5V Turbo", + "GLM-5V-Turbo", + "Z.ai: GLM 5V Turbo", + "zai-org/GLM-5V-Turbo" + ], + "families": [ + "glm", + "glmv" + ], + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "providerModelRecordCount": 12 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "glm-5v-turbo", + "modelKey": "glm-5v-turbo", + "displayName": "GLM-5V-Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "aihubmix", + "providerName": "AIHubMix", + "providerDoc": "https://docs.aihubmix.com", + "model": "glm-5v-turbo", + "modelKey": "glm-5v-turbo", + "displayName": "GLM 5 Vision Turbo", + "family": "glmv", + "metadata": { + "lastUpdated": "2026-05-09", + "openWeights": false, + "releaseDate": "2026-05-09" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "cortecs", + "providerName": "Cortecs", + "providerApi": "https://api.cortecs.ai/v1", + "providerDoc": "https://api.cortecs.ai/v1/models", + "model": "glm-5v-turbo", + "modelKey": "glm-5v-turbo", + "displayName": "GLM-5V-Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-01", + "openWeights": false, + "releaseDate": "2026-04-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "kilo", + "providerName": "Kilo Gateway", + "providerApi": "https://api.kilo.ai/api/gateway", + "providerDoc": "https://kilo.ai", + "model": "z-ai/glm-5v-turbo", + "modelKey": "z-ai/glm-5v-turbo", + "displayName": "Z.ai: GLM 5V Turbo", + "metadata": { + "lastUpdated": "2026-04-11", + "openWeights": true, + "releaseDate": "2026-04-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "z-ai/glm-5v-turbo", + "modelKey": "z-ai/glm-5v-turbo", + "displayName": "GLM 5V Turbo", + "metadata": { + "lastUpdated": "2026-04-01", + "openWeights": false, + "releaseDate": "2026-04-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "siliconflow", + "providerName": "SiliconFlow", + "providerApi": "https://api.siliconflow.com/v1", + "providerDoc": "https://cloud.siliconflow.com/models", + "model": "zai-org/GLM-5V-Turbo", + "modelKey": "zai-org/GLM-5V-Turbo", + "displayName": "zai-org/GLM-5V-Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-01", + "openWeights": false, + "releaseDate": "2026-04-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "vercel", + "providerName": "Vercel AI Gateway", + "providerDoc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "model": "zai/glm-5v-turbo", + "modelKey": "zai/glm-5v-turbo", + "displayName": "GLM 5V Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-01", + "openWeights": false, + "releaseDate": "2026-04-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai-coding-plan", + "providerName": "Z.AI Coding Plan", + "providerApi": "https://api.z.ai/api/coding/paas/v4", + "providerDoc": "https://docs.z.ai/devpack/overview", + "model": "glm-5v-turbo", + "modelKey": "glm-5v-turbo", + "displayName": "GLM-5V-Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-01", + "openWeights": false, + "releaseDate": "2026-04-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zai", + "providerName": "Z.AI", + "providerApi": "https://api.z.ai/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-5v-turbo", + "modelKey": "glm-5v-turbo", + "displayName": "GLM-5V-Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-01", + "openWeights": false, + "releaseDate": "2026-04-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "z-ai/glm-5v-turbo", + "modelKey": "z-ai/glm-5v-turbo", + "displayName": "GLM 5V Turbo", + "metadata": { + "lastUpdated": "2026-04-01", + "openWeights": false, + "releaseDate": "2026-04-01" + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai-coding-plan", + "providerName": "Zhipu AI Coding Plan", + "providerApi": "https://open.bigmodel.cn/api/coding/paas/v4", + "providerDoc": "https://docs.bigmodel.cn/cn/coding-plan/overview", + "model": "glm-5v-turbo", + "modelKey": "glm-5v-turbo", + "displayName": "GLM-5V-Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-01", + "openWeights": false, + "releaseDate": "2026-04-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + }, + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zhipuai", + "providerName": "Zhipu AI", + "providerApi": "https://open.bigmodel.cn/api/paas/v4", + "providerDoc": "https://docs.z.ai/guides/overview/pricing", + "model": "glm-5v-turbo", + "modelKey": "glm-5v-turbo", + "displayName": "GLM-5V-Turbo", + "family": "glm", + "metadata": { + "lastUpdated": "2026-04-01", + "openWeights": false, + "releaseDate": "2026-04-01", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "z-ai/glm-5v-turbo:thinking", + "provider": "z-ai", + "model": "glm-5v-turbo:thinking", + "displayName": "GLM 5V Turbo Thinking", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/z-ai/glm-5v-turbo:thinking" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 202800, + "inputTokens": 202800, + "outputTokens": 131100, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "z-ai/glm-5v-turbo:thinking", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.24, + "input": 1.2, + "output": 4 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM 5V Turbo Thinking" + ], + "releaseDate": "2026-04-02", + "lastUpdated": "2026-04-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "z-ai/glm-5v-turbo:thinking", + "modelKey": "z-ai/glm-5v-turbo:thinking", + "displayName": "GLM 5V Turbo Thinking", + "metadata": { + "lastUpdated": "2026-04-02", + "openWeights": false, + "releaseDate": "2026-04-02" + } + } + ] + }, + { + "id": "z-ai/glm-for-coding", + "provider": "z-ai", + "model": "glm-for-coding", + "displayName": "glm-for-coding", + "family": "glm", + "sources": [ + "models.dev" + ], + "providers": [ + "302ai" + ], + "aliases": [ + "302ai/glm-for-coding" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "302ai", + "model": "glm-for-coding", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.086, + "output": 0.343 + } + } + ] + }, + "metadata": { + "displayNames": [ + "glm-for-coding" + ], + "families": [ + "glm" + ], + "releaseDate": "2025-09-30", + "lastUpdated": "2025-09-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "302ai", + "providerName": "302.AI", + "providerApi": "https://api.302.ai/v1", + "providerDoc": "https://doc.302.ai", + "model": "glm-for-coding", + "modelKey": "glm-for-coding", + "displayName": "glm-for-coding", + "family": "glm", + "metadata": { + "lastUpdated": "2025-09-30", + "openWeights": false, + "releaseDate": "2025-09-30" + } + } + ] + }, + { + "id": "z-ai/glm-latest", + "provider": "z-ai", + "model": "glm-latest", + "displayName": "GLM Latest", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/zai-org/glm-latest" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 200000, + "inputTokens": 200000, + "outputTokens": 131072, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "zai-org/glm-latest", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.15, + "input": 0.75, + "output": 2.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM Latest" + ], + "releaseDate": "2026-05-03", + "lastUpdated": "2026-05-03", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "zai-org/glm-latest", + "modelKey": "zai-org/glm-latest", + "displayName": "GLM Latest", + "metadata": { + "lastUpdated": "2026-05-03", + "openWeights": false, + "releaseDate": "2026-05-03" + } + } + ] + }, + { + "id": "z-ai/glm-z1-32b-0414", + "provider": "z-ai", + "model": "glm-z1-32b-0414", + "displayName": "GLM Z1 32B 0414", + "family": "glm-z", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/THUDM/GLM-Z1-32B-0414" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "inputTokens": 128000, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "THUDM/GLM-Z1-32B-0414", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM Z1 32B 0414" + ], + "families": [ + "glm-z" + ], + "releaseDate": "2025-04-15", + "lastUpdated": "2025-04-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "THUDM/GLM-Z1-32B-0414", + "modelKey": "THUDM/GLM-Z1-32B-0414", + "displayName": "GLM Z1 32B 0414", + "family": "glm-z", + "metadata": { + "lastUpdated": "2025-04-15", + "openWeights": false, + "releaseDate": "2025-04-15" + } + } + ] + }, + { + "id": "z-ai/glm-z1-9b-0414", + "provider": "z-ai", + "model": "glm-z1-9b-0414", + "displayName": "GLM Z1 9B 0414", + "family": "glm-z", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/THUDM/GLM-Z1-9B-0414" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "outputTokens": 8000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "THUDM/GLM-Z1-9B-0414", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 0.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM Z1 9B 0414" + ], + "families": [ + "glm-z" + ], + "releaseDate": "2025-04-14", + "lastUpdated": "2025-04-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "THUDM/GLM-Z1-9B-0414", + "modelKey": "THUDM/GLM-Z1-9B-0414", + "displayName": "GLM Z1 9B 0414", + "family": "glm-z", + "metadata": { + "lastUpdated": "2025-04-14", + "openWeights": false, + "releaseDate": "2025-04-14" + } + } + ] + }, + { + "id": "z-ai/glm-z1-air", + "provider": "z-ai", + "model": "glm-z1-air", + "displayName": "GLM Z1 Air", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/glm-z1-air" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "glm-z1-air", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.07, + "output": 0.07 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM Z1 Air" + ], + "releaseDate": "2025-04-15", + "lastUpdated": "2025-04-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "glm-z1-air", + "modelKey": "glm-z1-air", + "displayName": "GLM Z1 Air", + "metadata": { + "lastUpdated": "2025-04-15", + "openWeights": false, + "releaseDate": "2025-04-15" + } + } + ] + }, + { + "id": "z-ai/glm-z1-airx", + "provider": "z-ai", + "model": "glm-z1-airx", + "displayName": "GLM Z1 AirX", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/glm-z1-airx" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 32000, + "inputTokens": 32000, + "outputTokens": 16384, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "glm-z1-airx", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.7, + "output": 0.7 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM Z1 AirX" + ], + "releaseDate": "2025-04-15", + "lastUpdated": "2025-04-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "glm-z1-airx", + "modelKey": "glm-z1-airx", + "displayName": "GLM Z1 AirX", + "metadata": { + "lastUpdated": "2025-04-15", + "openWeights": false, + "releaseDate": "2025-04-15" + } + } + ] + }, + { + "id": "z-ai/glm-zero-preview", + "provider": "z-ai", + "model": "glm-zero-preview", + "displayName": "GLM Zero Preview", + "sources": [ + "models.dev" + ], + "providers": [ + "nano-gpt" + ], + "aliases": [ + "nano-gpt/glm-zero-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 8000, + "inputTokens": 8000, + "outputTokens": 4096, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "structuredOutput": false, + "toolCalling": false, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "nano-gpt", + "model": "glm-zero-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 1.802, + "output": 1.802 + } + } + ] + }, + "metadata": { + "displayNames": [ + "GLM Zero Preview" + ], + "releaseDate": "2024-12-01", + "lastUpdated": "2024-12-01", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "nano-gpt", + "providerName": "NanoGPT", + "providerApi": "https://nano-gpt.com/api/v1", + "providerDoc": "https://docs.nano-gpt.com", + "model": "glm-zero-preview", + "modelKey": "glm-zero-preview", + "displayName": "GLM Zero Preview", + "metadata": { + "lastUpdated": "2024-12-01", + "openWeights": false, + "releaseDate": "2024-12-01" + } + } + ] + }, + { + "id": "zeldoc/z-code", + "provider": "zeldoc", + "model": "z-code", + "displayName": "Z-Code", + "sources": [ + "models.dev" + ], + "providers": [ + "zeldoc" + ], + "aliases": [ + "zeldoc/z-code" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 262144, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "structuredOutput": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zeldoc", + "model": "z-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Z-Code" + ], + "knowledgeCutoff": "2025-01", + "releaseDate": "2026-04-15", + "lastUpdated": "2026-04-15", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zeldoc", + "providerName": "Zeldoc", + "providerApi": "https://api.zeldoc.ai/v1", + "providerDoc": "https://docs.zeldoc.ai", + "model": "z-code", + "modelKey": "z-code", + "displayName": "Z-Code", + "metadata": { + "knowledgeCutoff": "2025-01", + "lastUpdated": "2026-04-15", + "openWeights": false, + "releaseDate": "2026-04-15", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "zenmux/agnes-1.5-lite", + "provider": "zenmux", + "model": "agnes-1.5-lite", + "displayName": "Agnes 1.5 Lite", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/sapiens-ai/agnes-1.5-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "sapiens-ai/agnes-1.5-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.12, + "output": 0.6 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agnes 1.5 Lite" + ], + "releaseDate": "2026-03-26", + "lastUpdated": "2026-03-26", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "sapiens-ai/agnes-1.5-lite", + "modelKey": "sapiens-ai/agnes-1.5-lite", + "displayName": "Agnes 1.5 Lite", + "metadata": { + "lastUpdated": "2026-03-26", + "openWeights": false, + "releaseDate": "2026-03-26" + } + } + ] + }, + { + "id": "zenmux/agnes-1.5-pro", + "provider": "zenmux", + "model": "agnes-1.5-pro", + "displayName": "Agnes 1.5 Pro", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/sapiens-ai/agnes-1.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "sapiens-ai/agnes-1.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.16, + "output": 0.8 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Agnes 1.5 Pro" + ], + "releaseDate": "2026-03-21", + "lastUpdated": "2026-03-21", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "sapiens-ai/agnes-1.5-pro", + "modelKey": "sapiens-ai/agnes-1.5-pro", + "displayName": "Agnes 1.5 Pro", + "metadata": { + "lastUpdated": "2026-03-21", + "openWeights": false, + "releaseDate": "2026-03-21" + } + } + ] + }, + { + "id": "zenmux/doubao-seed-1.8", + "provider": "zenmux", + "model": "doubao-seed-1.8", + "displayName": "Doubao-Seed-1.8", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/volcengine/doubao-seed-1.8" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "volcengine/doubao-seed-1.8", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "cacheWrite": 0.0024, + "input": 0.11, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao-Seed-1.8" + ], + "knowledgeCutoff": "2025-01-01", + "releaseDate": "2025-12-18", + "lastUpdated": "2025-12-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "volcengine/doubao-seed-1.8", + "modelKey": "volcengine/doubao-seed-1.8", + "displayName": "Doubao-Seed-1.8", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-12-18", + "openWeights": false, + "releaseDate": "2025-12-18", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "zenmux/doubao-seed-2.0-code", + "provider": "zenmux", + "model": "doubao-seed-2.0-code", + "displayName": "Doubao Seed 2.0 Code", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/volcengine/doubao-seed-2.0-code" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 32000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "volcengine/doubao-seed-2.0-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.9, + "output": 4.48 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao Seed 2.0 Code" + ], + "knowledgeCutoff": "2025-01-01", + "releaseDate": "2026-03-20", + "lastUpdated": "2026-03-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "volcengine/doubao-seed-2.0-code", + "modelKey": "volcengine/doubao-seed-2.0-code", + "displayName": "Doubao Seed 2.0 Code", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-03-20", + "openWeights": false, + "releaseDate": "2026-03-20" + } + } + ] + }, + { + "id": "zenmux/doubao-seed-2.0-lite", + "provider": "zenmux", + "model": "doubao-seed-2.0-lite", + "displayName": "Doubao-Seed-2.0-lite", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/volcengine/doubao-seed-2.0-lite" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "volcengine/doubao-seed-2.0-lite", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.02, + "cacheWrite": 0.0024, + "input": 0.09, + "output": 0.51 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao-Seed-2.0-lite" + ], + "knowledgeCutoff": "2026-02-14", + "releaseDate": "2026-02-14", + "lastUpdated": "2026-02-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "volcengine/doubao-seed-2.0-lite", + "modelKey": "volcengine/doubao-seed-2.0-lite", + "displayName": "Doubao-Seed-2.0-lite", + "metadata": { + "knowledgeCutoff": "2026-02-14", + "lastUpdated": "2026-02-14", + "openWeights": false, + "releaseDate": "2026-02-14", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "zenmux/doubao-seed-2.0-mini", + "provider": "zenmux", + "model": "doubao-seed-2.0-mini", + "displayName": "Doubao-Seed-2.0-mini", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/volcengine/doubao-seed-2.0-mini" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "volcengine/doubao-seed-2.0-mini", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "cacheWrite": 0.0024, + "input": 0.03, + "output": 0.28 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao-Seed-2.0-mini" + ], + "knowledgeCutoff": "2026-02-14", + "releaseDate": "2026-02-14", + "lastUpdated": "2026-02-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "volcengine/doubao-seed-2.0-mini", + "modelKey": "volcengine/doubao-seed-2.0-mini", + "displayName": "Doubao-Seed-2.0-mini", + "metadata": { + "knowledgeCutoff": "2026-02-14", + "lastUpdated": "2026-02-14", + "openWeights": false, + "releaseDate": "2026-02-14", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "zenmux/doubao-seed-2.0-pro", + "provider": "zenmux", + "model": "doubao-seed-2.0-pro", + "displayName": "Doubao-Seed-2.0-pro", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/volcengine/doubao-seed-2.0-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "volcengine/doubao-seed-2.0-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.09, + "cacheWrite": 0.0024, + "input": 0.45, + "output": 2.24 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao-Seed-2.0-pro" + ], + "knowledgeCutoff": "2026-02-14", + "releaseDate": "2026-02-14", + "lastUpdated": "2026-02-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "volcengine/doubao-seed-2.0-pro", + "modelKey": "volcengine/doubao-seed-2.0-pro", + "displayName": "Doubao-Seed-2.0-pro", + "metadata": { + "knowledgeCutoff": "2026-02-14", + "lastUpdated": "2026-02-14", + "openWeights": false, + "releaseDate": "2026-02-14", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "zenmux/doubao-seed-code", + "provider": "zenmux", + "model": "doubao-seed-code", + "displayName": "Doubao-Seed-Code", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/volcengine/doubao-seed-code" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "volcengine/doubao-seed-code", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.03, + "input": 0.17, + "output": 1.12 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Doubao-Seed-Code" + ], + "knowledgeCutoff": "2025-01-01", + "releaseDate": "2025-11-11", + "lastUpdated": "2025-11-11", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "volcengine/doubao-seed-code", + "modelKey": "volcengine/doubao-seed-code", + "displayName": "Doubao-Seed-Code", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-11-11", + "openWeights": false, + "releaseDate": "2025-11-11", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "zenmux/ernie-5.0-thinking-preview", + "provider": "zenmux", + "model": "ernie-5.0-thinking-preview", + "displayName": "ERNIE 5.0", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/baidu/ernie-5.0-thinking-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "baidu/ernie-5.0-thinking-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.84, + "output": 3.37 + } + } + ] + }, + "metadata": { + "displayNames": [ + "ERNIE 5.0" + ], + "knowledgeCutoff": "2025-01-01", + "releaseDate": "2026-01-22", + "lastUpdated": "2026-01-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "baidu/ernie-5.0-thinking-preview", + "modelKey": "baidu/ernie-5.0-thinking-preview", + "displayName": "ERNIE 5.0", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-01-22", + "openWeights": false, + "releaseDate": "2026-01-22" + } + } + ] + }, + { + "id": "zenmux/hy3-preview", + "provider": "zenmux", + "model": "hy3-preview", + "displayName": "Hy3 preview", + "family": "Hy", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/tencent/hy3-preview" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "tencent/hy3-preview", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.058, + "cacheWrite": 0, + "input": 0.172, + "output": 0.572 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Hy3 preview" + ], + "families": [ + "Hy" + ], + "releaseDate": "2026-04-20", + "lastUpdated": "2026-04-20", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "tencent/hy3-preview", + "modelKey": "tencent/hy3-preview", + "displayName": "Hy3 preview", + "family": "Hy", + "metadata": { + "lastUpdated": "2026-04-20", + "openWeights": true, + "releaseDate": "2026-04-20", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "none", + "low", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "zenmux/kat-coder-pro-v2", + "provider": "zenmux", + "model": "kat-coder-pro-v2", + "displayName": "KAT-Coder-Pro-V2", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/kuaishou/kat-coder-pro-v2" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 80000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "kuaishou/kat-coder-pro-v2", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 1.2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "KAT-Coder-Pro-V2" + ], + "releaseDate": "2026-03-30", + "lastUpdated": "2026-03-30", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "kuaishou/kat-coder-pro-v2", + "modelKey": "kuaishou/kat-coder-pro-v2", + "displayName": "KAT-Coder-Pro-V2", + "metadata": { + "lastUpdated": "2026-03-30", + "openWeights": false, + "releaseDate": "2026-03-30" + } + } + ] + }, + { + "id": "zenmux/ling-1t", + "provider": "zenmux", + "model": "ling-1t", + "displayName": "Ling-1T", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/inclusionai/ling-1t" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "inclusionai/ling-1t", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.56, + "output": 2.24 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ling-1T" + ], + "knowledgeCutoff": "2025-01-01", + "releaseDate": "2025-10-09", + "lastUpdated": "2025-10-09", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "inclusionai/ling-1t", + "modelKey": "inclusionai/ling-1t", + "displayName": "Ling-1T", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-10-09", + "openWeights": false, + "releaseDate": "2025-10-09" + } + } + ] + }, + { + "id": "zenmux/mimo-v2-flash", + "provider": "zenmux", + "model": "mimo-v2-flash", + "displayName": "MiMo-V2-Flash", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/xiaomi/mimo-v2-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262144, + "outputTokens": 65536, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "xiaomi/mimo-v2-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.01, + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2-Flash" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12-01", + "releaseDate": "2025-12-16", + "lastUpdated": "2026-02-04", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "xiaomi/mimo-v2-flash", + "modelKey": "xiaomi/mimo-v2-flash", + "displayName": "MiMo-V2-Flash", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12-01", + "lastUpdated": "2026-02-04", + "openWeights": true, + "releaseDate": "2025-12-16", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "zenmux/mimo-v2-omni", + "provider": "zenmux", + "model": "mimo-v2-omni", + "displayName": "MiMo V2 Omni", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/xiaomi/mimo-v2-omni" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 265000, + "outputTokens": 265000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "audio", + "image", + "pdf", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": true, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "xiaomi/mimo-v2-omni", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.4, + "output": 2 + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2 Omni" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "xiaomi/mimo-v2-omni", + "modelKey": "xiaomi/mimo-v2-omni", + "displayName": "MiMo V2 Omni", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "zenmux/mimo-v2-pro", + "provider": "zenmux", + "model": "mimo-v2-pro", + "displayName": "MiMo V2 Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/xiaomi/mimo-v2-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1000000, + "outputTokens": 256000, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "xiaomi/mimo-v2-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.4, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo V2 Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-03-18", + "lastUpdated": "2026-03-18", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "xiaomi/mimo-v2-pro", + "modelKey": "xiaomi/mimo-v2-pro", + "displayName": "MiMo V2 Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-03-18", + "openWeights": false, + "releaseDate": "2026-03-18", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "zenmux/mimo-v2.5", + "provider": "zenmux", + "model": "mimo-v2.5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/xiaomi/mimo-v2.5" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "audio", + "image", + "text", + "video" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": true, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": true, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "xiaomi/mimo-v2.5", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.08, + "input": 0.4, + "output": 2 + }, + "tiered": { + "contextOver200K": { + "input": 0.8, + "output": 4, + "cache_read": 0.16 + }, + "tiers": [ + { + "input": 0.8, + "output": 4, + "cache_read": 0.16, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "xiaomi/mimo-v2.5", + "modelKey": "xiaomi/mimo-v2.5", + "displayName": "MiMo-V2.5", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "zenmux/mimo-v2.5-pro", + "provider": "zenmux", + "model": "mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/xiaomi/mimo-v2.5-pro" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 1048576, + "outputTokens": 131072, + "supports1MContext": true + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": true + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "xiaomi/mimo-v2.5-pro", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.2, + "input": 1, + "output": 3 + }, + "tiered": { + "contextOver200K": { + "input": 2, + "output": 6, + "cache_read": 0.4 + }, + "tiers": [ + { + "input": 2, + "output": 6, + "cache_read": 0.4, + "tier": { + "size": 256000 + } + } + ] + } + } + ] + }, + "metadata": { + "displayNames": [ + "MiMo-V2.5-Pro" + ], + "families": [ + "mimo" + ], + "knowledgeCutoff": "2024-12", + "releaseDate": "2026-04-22", + "lastUpdated": "2026-04-22", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "xiaomi/mimo-v2.5-pro", + "modelKey": "xiaomi/mimo-v2.5-pro", + "displayName": "MiMo-V2.5-Pro", + "family": "mimo", + "metadata": { + "knowledgeCutoff": "2024-12", + "lastUpdated": "2026-04-22", + "openWeights": true, + "releaseDate": "2026-04-22", + "reasoningOptions": [ + { + "type": "toggle" + } + ] + } + } + ] + }, + { + "id": "zenmux/ring-1t", + "provider": "zenmux", + "model": "ring-1t", + "displayName": "Ring-1T", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/inclusionai/ring-1t" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 128000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "inclusionai/ring-1t", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.11, + "input": 0.56, + "output": 2.24 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Ring-1T" + ], + "knowledgeCutoff": "2025-01-01", + "releaseDate": "2025-10-12", + "lastUpdated": "2025-10-12", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "inclusionai/ring-1t", + "modelKey": "inclusionai/ring-1t", + "displayName": "Ring-1T", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-10-12", + "openWeights": false, + "releaseDate": "2025-10-12" + } + } + ] + }, + { + "id": "zenmux/ring-2.6-1t", + "provider": "zenmux", + "model": "ring-2.6-1t", + "displayName": "inclusionAI: Ring-2.6-1T", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/inclusionai/ring-2.6-1t" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 262000, + "outputTokens": 65000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "inclusionai/ring-2.6-1t", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "cacheRead": 0.06, + "input": 0.3, + "output": 2.5 + } + } + ] + }, + "metadata": { + "displayNames": [ + "inclusionAI: Ring-2.6-1T" + ], + "knowledgeCutoff": "2025-12-31", + "releaseDate": "2026-05-07", + "lastUpdated": "2026-05-14", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "inclusionai/ring-2.6-1t", + "modelKey": "inclusionai/ring-2.6-1t", + "displayName": "inclusionAI: Ring-2.6-1T", + "metadata": { + "knowledgeCutoff": "2025-12-31", + "lastUpdated": "2026-05-14", + "openWeights": true, + "releaseDate": "2026-05-07" + } + } + ] + }, + { + "id": "zenmux/step-3", + "provider": "zenmux", + "model": "step-3", + "displayName": "Step-3", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/stepfun/step-3" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 65536, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "stepfun/step-3", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.21, + "output": 0.57 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step-3" + ], + "knowledgeCutoff": "2025-01-01", + "releaseDate": "2025-07-31", + "lastUpdated": "2025-07-31", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "stepfun/step-3", + "modelKey": "stepfun/step-3", + "displayName": "Step-3", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2025-07-31", + "openWeights": false, + "releaseDate": "2025-07-31" + } + } + ] + }, + { + "id": "zenmux/step-3.5-flash", + "provider": "zenmux", + "model": "step-3.5-flash", + "displayName": "Step 3.5 Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/stepfun/step-3.5-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "outputTokens": 64000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": false, + "audioInput": false, + "audioOutput": false, + "imageInput": false, + "imageOutput": false, + "openWeights": false, + "pdfInput": false, + "reasoning": false, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "stepfun/step-3.5-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.1, + "output": 0.3 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 3.5 Flash" + ], + "knowledgeCutoff": "2025-01-01", + "releaseDate": "2026-02-02", + "lastUpdated": "2026-02-02", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "stepfun/step-3.5-flash", + "modelKey": "stepfun/step-3.5-flash", + "displayName": "Step 3.5 Flash", + "metadata": { + "knowledgeCutoff": "2025-01-01", + "lastUpdated": "2026-02-02", + "openWeights": false, + "releaseDate": "2026-02-02" + } + } + ] + }, + { + "id": "zenmux/step-3.7-flash", + "provider": "zenmux", + "model": "step-3.7-flash", + "displayName": "Step 3.7 Flash", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/stepfun/step-3.7-flash" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "stepfun/step-3.7-flash", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0.2, + "output": 1.15 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 3.7 Flash" + ], + "knowledgeCutoff": "2026-01-01", + "releaseDate": "2026-05-29", + "lastUpdated": "2026-05-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "stepfun/step-3.7-flash", + "modelKey": "stepfun/step-3.7-flash", + "displayName": "Step 3.7 Flash", + "metadata": { + "knowledgeCutoff": "2026-01-01", + "lastUpdated": "2026-05-29", + "openWeights": true, + "releaseDate": "2026-05-29", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + }, + { + "id": "zenmux/step-3.7-flash-free", + "provider": "zenmux", + "model": "step-3.7-flash-free", + "displayName": "Step 3.7 Flash (Free)", + "sources": [ + "models.dev" + ], + "providers": [ + "zenmux" + ], + "aliases": [ + "zenmux/stepfun/step-3.7-flash-free" + ], + "mergedProviderModelRecords": 1, + "limits": { + "contextTokens": 256000, + "inputTokens": 256000, + "outputTokens": 256000, + "supports1MContext": false + }, + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "capabilities": { + "attachments": true, + "audioInput": false, + "audioOutput": false, + "imageInput": true, + "imageOutput": false, + "openWeights": true, + "pdfInput": false, + "reasoning": true, + "temperature": true, + "toolCalling": true, + "videoInput": false, + "supports1MContext": false + }, + "pricing": { + "currency": "USD", + "normalizedUnit": "per1MTokens values are USD per 1,000,000 tokens; non-token values keep the unit named by their object key.", + "offers": [ + { + "source": "models.dev", + "provider": "zenmux", + "model": "stepfun/step-3.7-flash-free", + "sourceUrl": "https://models.dev/api.json", + "sourceUnit": "usd_per_1m_tokens", + "per1MTokens": { + "input": 0, + "output": 0 + } + } + ] + }, + "metadata": { + "displayNames": [ + "Step 3.7 Flash (Free)" + ], + "knowledgeCutoff": "2026-01-01", + "releaseDate": "2026-05-29", + "lastUpdated": "2026-05-29", + "providerModelRecordCount": 1 + }, + "sourceRecords": [ + { + "source": "models.dev", + "sourceUrl": "https://models.dev/api.json", + "provider": "zenmux", + "providerName": "ZenMux", + "providerApi": "https://zenmux.ai/api/v1", + "providerDoc": "https://docs.zenmux.ai", + "model": "stepfun/step-3.7-flash-free", + "modelKey": "stepfun/step-3.7-flash-free", + "displayName": "Step 3.7 Flash (Free)", + "metadata": { + "knowledgeCutoff": "2026-01-01", + "lastUpdated": "2026-05-29", + "openWeights": true, + "releaseDate": "2026-05-29", + "reasoningOptions": [ + { + "type": "effort", + "values": [ + "low", + "medium", + "high" + ] + } + ] + } + } + ] + } + ] +} diff --git a/packages/core/package.json b/packages/core/package.json new file mode 100644 index 0000000..91f6862 --- /dev/null +++ b/packages/core/package.json @@ -0,0 +1,21 @@ +{ + "name": "@claude-code-router/core", + "version": "3.0.3", + "private": true, + "description": "Claude Code Router core gateway, routing, provider, and storage services.", + "main": "dist/main/server.js", + "bin": { + "ccr-core-server": "dist/main/server.js" + }, + "engines": { + "node": ">=22" + }, + "dependencies": { + "@the-next-ai/ai-gateway": "^1.0.4", + "@the-next-ai/bot-gateway-sdk": "^0.1.0", + "better-sqlite3": "^12.11.1", + "node-forge": "^1.4.0", + "pm2": "^6.0.13", + "undici": "^7.27.2" + } +} diff --git a/packages/core/src/agents/bot-gateway/env.ts b/packages/core/src/agents/bot-gateway/env.ts new file mode 100644 index 0000000..1dd8e60 --- /dev/null +++ b/packages/core/src/agents/bot-gateway/env.ts @@ -0,0 +1,297 @@ +import os from "node:os"; +import { createRequire } from "node:module"; +import { existsSync } from "node:fs"; +import path from "node:path"; +import type { AppConfig, BotGatewayRuntimeConfig, ProfileConfig, ProfileOpenSurface } from "@ccr/core/contracts/app"; +import { CONFIGDIR } from "@ccr/core/config/constants"; + +const requireFromHere = createRequire(__filename); + +export function botGatewayProfileEnv(config: AppConfig, profile: ProfileConfig, surface?: ProfileOpenSurface): Record { + const bot = normalizeBotGatewayForWebSocket(resolveBotGatewayConfig(config, profile, surface)); + if (!bot?.enabled || !bot.platform || bot.platform === "none") { + return disabledBotGatewayEnv(); + } + + const handoff = bot.handoff ?? { + enabled: false, + idleSeconds: 30, + phoneBluetoothTargets: [], + phoneWifiTargets: [], + screenLock: true, + userIdle: true + }; + const stateDir = resolveBotGatewayStateDir(bot, profile); + const env: Record = { + BOT_GATEWAY_STATE_DIR: stateDir, + CCR_BOT_GATEWAY_ACK_EVENTS: boolEnv(bot.acknowledgeEvents), + CCR_BOT_GATEWAY_ARGS_JSON: JSON.stringify(bot.args ?? []), + CCR_BOT_GATEWAY_AUTH_TYPE: bot.authType ?? "", + CCR_BOT_GATEWAY_AUTO_START_INTEGRATION: boolEnv(bot.autoStartIntegration), + CCR_BOT_GATEWAY_COMMAND: bot.command ?? "", + CCR_BOT_GATEWAY_CONFIG_JSON: JSON.stringify(bot.integrationConfig ?? {}), + CCR_BOT_GATEWAY_CREATE_INTEGRATION: boolEnv(shouldCreateBotGatewayIntegration(bot)), + CCR_BOT_GATEWAY_CREDENTIALS_JSON: JSON.stringify(bot.credentials ?? {}), + CCR_BOT_GATEWAY_CWD: bot.cwd ?? "", + CCR_BOT_GATEWAY_ENABLED: "true", + CCR_BOT_GATEWAY_FORWARD_ALL_AGENT_MESSAGES: boolEnv(bot.forwardAllAgentMessages), + CCR_BOT_GATEWAY_INTEGRATION_ID: bot.integrationId ?? "", + CCR_BOT_GATEWAY_PLATFORM: bot.platform, + CCR_BOT_GATEWAY_POLL_INTERVAL_MS: String(bot.pollIntervalMs ?? 2000), + CCR_BOT_GATEWAY_REQUEST_TIMEOUT_MS: String(bot.requestTimeoutMs ?? 600000), + CCR_BOT_GATEWAY_SOURCE_DIR: "", + ...botGatewaySdkEnv(), + CCR_BOT_GATEWAY_STARTUP_TIMEOUT_MS: String(bot.startupTimeoutMs ?? 10000), + CCR_BOT_GATEWAY_STATE_DIR: stateDir, + CCR_BOT_GATEWAY_TENANT_ID: bot.tenantId ?? "ccr", + CCR_BOT_HANDOFF_ENABLED: boolEnv(handoff.enabled), + CCR_BOT_HANDOFF_IDLE_SECONDS: String(handoff.idleSeconds ?? 30), + CCR_BOT_HANDOFF_PHONE_BLUETOOTH_TARGETS: (handoff.phoneBluetoothTargets ?? []).join("\n"), + CCR_BOT_HANDOFF_PHONE_WIFI_TARGETS: (handoff.phoneWifiTargets ?? []).join("\n"), + CCR_BOT_HANDOFF_SCREEN_LOCK: boolEnv(handoff.screenLock), + CCR_BOT_HANDOFF_USER_IDLE: boolEnv(handoff.userIdle), + CCR_BOT_PROFILE_ID: profile.id, + CCR_BOT_PROFILE_NAME: profile.name, + + CODEXL_BOT_GATEWAY_ENABLED: "true", + CODEXL_BOT_GATEWAY_FORWARD_ALL_CODEX_MESSAGES: boolEnv(bot.forwardAllAgentMessages), + CODEXL_BOT_GATEWAY_INTEGRATION_ID: bot.integrationId ?? "", + CODEXL_BOT_GATEWAY_PLATFORM: bot.platform, + CODEXL_BOT_GATEWAY_STATE_DIR: stateDir, + CODEXL_BOT_GATEWAY_TENANT_ID: bot.tenantId ?? "ccr", + CODEXL_BOT_HANDOFF_ENABLED: boolEnv(handoff.enabled), + CODEXL_BOT_HANDOFF_IDLE_SECONDS: String(handoff.idleSeconds ?? 30), + CODEXL_BOT_HANDOFF_PHONE_BLUETOOTH_TARGETS: (handoff.phoneBluetoothTargets ?? []).join("\n"), + CODEXL_BOT_HANDOFF_PHONE_WIFI_TARGETS: (handoff.phoneWifiTargets ?? []).join("\n"), + CODEXL_BOT_HANDOFF_SCREEN_LOCK: boolEnv(handoff.screenLock), + CODEXL_BOT_HANDOFF_USER_IDLE: boolEnv(handoff.userIdle) + }; + + if (bot.conversationRef) { + env.CCR_BOT_GATEWAY_CONVERSATION_REF_JSON = JSON.stringify(bot.conversationRef); + } + + return env; +} + +function resolveBotGatewayConfig(config: AppConfig, profile: ProfileConfig, surface?: ProfileOpenSurface): BotGatewayRuntimeConfig { + const runtimeSurface = surface ?? normalizeProfileSurface(profile.surface); + if (runtimeSurface !== "app") { + return { + ...config.botGateway, + enabled: false, + platform: "none" + }; + } + const savedBot = profile.botConfigId + ? (config.botConfigs ?? []).find((item) => item.id === profile.botConfigId) + : undefined; + return mergeBotGatewayRuntimeConfig( + mergeBotGatewayRuntimeConfig(config.botGateway, savedBot?.botGateway), + profile.botGateway + ); +} + +function mergeBotGatewayRuntimeConfig( + base: BotGatewayRuntimeConfig, + override?: BotGatewayRuntimeConfig +): BotGatewayRuntimeConfig { + if (!override) { + return base; + } + return { + ...base, + ...override, + credentials: { + ...base.credentials, + ...override.credentials + }, + handoff: { + ...base.handoff, + ...override.handoff + }, + integrationConfig: { + ...base.integrationConfig, + ...override.integrationConfig + } + }; +} + +function normalizeProfileSurface(value: ProfileConfig["surface"]): "auto" | "cli" | "app" { + return value === "cli" || value === "app" ? value : "auto"; +} + +function botGatewaySdkEnv(): Record { + const sdkModule = resolveBotGatewaySdkModule(); + return sdkModule ? { CCR_BOT_GATEWAY_SDK_MODULE: sdkModule } : {}; +} + +function resolveBotGatewaySdkModule(): string { + const bundled = resolveBundledBotGatewaySdkModule(); + if (bundled) { + return bundled; + } + + try { + return path.join(path.dirname(requireFromHere.resolve("@the-next-ai/bot-gateway-sdk/package.json")), "dist", "index.js"); + } catch { + return ""; + } +} + +function resolveBundledBotGatewaySdkModule(): string { + const resourcesPath = (process as NodeJS.Process & { resourcesPath?: string }).resourcesPath; + const candidates = [ + path.join(__dirname, "bot-gateway-sdk", "dist", "index.js"), + ...(resourcesPath + ? [ + path.join(resourcesPath, "app.asar", "dist", "main", "bot-gateway-sdk", "dist", "index.js"), + path.join(resourcesPath, "app", "dist", "main", "bot-gateway-sdk", "dist", "index.js") + ] + : []) + ]; + return candidates.find((candidate) => existsSync(candidate)) ?? ""; +} + +function normalizeBotGatewayForWebSocket(bot: BotGatewayRuntimeConfig): BotGatewayRuntimeConfig { + const platform = normalizeBotGatewayPlatform(bot.platform); + return { + ...bot, + authType: normalizeBotGatewayAuthType(platform, bot.authType), + credentials: sanitizeBotGatewayRecord(bot.credentials), + integrationConfig: websocketBotGatewayIntegrationConfig(platform, bot.integrationConfig), + platform + }; +} + +function normalizeBotGatewayPlatform(value: string): string { + const normalized = value.trim().toLowerCase(); + if (!normalized || normalized === "off" || normalized === "disabled") { + return "none"; + } + if (normalized === "lark") { + return "feishu"; + } + if (normalized === "dingding") { + return "dingtalk"; + } + if (["wechat", "weixin", "wx", "weixin-ilink", "weixin_ilink", "ilink"].includes(normalized)) { + return "weixin-ilink"; + } + if (["wecom", "wework", "wechat-work", "work-weixin", "enterprise-wechat"].includes(normalized)) { + return "wecom"; + } + return normalized || "none"; +} + +function normalizeBotGatewayAuthType(platform: string, value: string): string { + const normalized = value.trim().toLowerCase().replace(/-/g, "_"); + if (!platform || platform === "none") { + return ""; + } + if (!normalized || normalized === "default" || normalized === "auto" || normalized === "webhook" || normalized === "webhook_secret" || normalized === "outgoing_webhook") { + return defaultBotGatewayAuthType(platform); + } + if (normalized === "appsecret") { + return "app_secret"; + } + if (normalized === "bottoken" || normalized === "token") { + return "bot_token"; + } + if (normalized === "oauth" || normalized === "oauth_2") { + return "oauth2"; + } + if (["qr", "qr_login", "qrcode", "qr_code"].includes(normalized)) { + return "qr_login"; + } + return normalized; +} + +function defaultBotGatewayAuthType(platform: string): string { + if (platform === "weixin-ilink") { + return "qr_login"; + } + if (platform === "feishu" || platform === "dingtalk" || platform === "wecom") { + return "app_secret"; + } + if (platform === "slack" || platform === "discord" || platform === "telegram" || platform === "line") { + return "bot_token"; + } + return ""; +} + +function websocketBotGatewayIntegrationConfig(platform: string, value: Record): Record { + const config = sanitizeBotGatewayRecord(value); + delete config.transport; + delete config.sendMode; + const transport = botGatewayWebSocketTransport(platform); + return transport ? { ...config, transport } : config; +} + +function botGatewayWebSocketTransport(platform: string): string { + if (!platform || platform === "none") { + return ""; + } + return platform === "slack" ? "socket" : "websocket"; +} + +function sanitizeBotGatewayRecord(value: Record | undefined): Record { + const result: Record = {}; + if (!value || typeof value !== "object" || Array.isArray(value)) { + return result; + } + for (const [key, rawValue] of Object.entries(value)) { + if (!key.trim() || isWebhookRelatedBotGatewayKey(key)) { + continue; + } + result[key] = rawValue; + } + return result; +} + +function isWebhookRelatedBotGatewayKey(key: string): boolean { + const normalized = key.trim().toLowerCase().replace(/[_-]+/g, ""); + return normalized.includes("webhook") || normalized === "sendmode"; +} + +function disabledBotGatewayEnv(): Record { + return { + CCR_BOT_GATEWAY_ENABLED: "false", + CODEXL_BOT_GATEWAY_ENABLED: "false" + }; +} + +function resolveBotGatewayStateDir(bot: BotGatewayRuntimeConfig, profile: ProfileConfig): string { + const configured = (bot.stateDir ?? "").trim(); + if (configured) { + return resolveUserPath(configured); + } + const slug = sanitizePathSegment(profile.id || profile.name || profile.agent) || "default"; + return path.join(CONFIGDIR, "bot-gateway", slug); +} + +function resolveUserPath(value: string): string { + const trimmed = value.trim(); + if (trimmed === "~") { + return os.homedir(); + } + if (trimmed.startsWith("~/") || trimmed.startsWith("~\\")) { + return path.join(os.homedir(), trimmed.slice(2)); + } + return path.resolve(trimmed || "."); +} + +function sanitizePathSegment(value: string): string { + return value.trim().toLowerCase().replace(/[^a-z0-9_.-]+/g, "-").replace(/^-+|-+$/g, ""); +} + +function boolEnv(value: boolean): string { + return value ? "true" : "false"; +} + +function shouldCreateBotGatewayIntegration(bot: BotGatewayRuntimeConfig): boolean { + if (bot.authType === "qr_login") { + return false; + } + return bot.createIntegration; +} diff --git a/packages/core/src/agents/bot-gateway/handoff-scan-service.ts b/packages/core/src/agents/bot-gateway/handoff-scan-service.ts new file mode 100644 index 0000000..59712eb --- /dev/null +++ b/packages/core/src/agents/bot-gateway/handoff-scan-service.ts @@ -0,0 +1,295 @@ +import { execFile } from "node:child_process"; +import { promisify } from "node:util"; +import type { BotHandoffScanTarget } from "@ccr/core/contracts/app"; +import { windowsSystemCommand } from "@ccr/core/platform/windows-system"; + +const execFileAsync = promisify(execFile); + +export async function scanBotHandoffWifiTargets(): Promise { + const output = await commandStdout(process.platform === "win32" ? windowsSystemCommand("arp.exe") : "arp", ["-a"]); + if (!output.trim()) { + throw new Error("No Wi-Fi/LAN targets found."); + } + return parseArpScanTargets(output); +} + +export async function scanBotHandoffBluetoothTargets(): Promise { + const targets: BotHandoffScanTarget[] = []; + if (process.platform === "darwin") { + await collectBluetoothTargetsFromCommand(targets, "blueutil", ["--format", "json", "--connected"], "blueutil connected"); + await collectBluetoothTargetsFromCommand(targets, "blueutil", ["--format", "json", "--paired"], "blueutil paired"); + await collectBluetoothTargetsFromCommand(targets, "blueutil", ["--format", "json", "--recent"], "blueutil recent"); + await collectBluetoothTargetsFromCommand(targets, "/usr/sbin/system_profiler", ["SPBluetoothDataType", "-json"], "system_profiler bluetooth json"); + await collectBluetoothTargetsFromCommand(targets, "/usr/sbin/system_profiler", ["SPBluetoothDataType"], "system_profiler bluetooth"); + await collectBluetoothTargetsFromCommand(targets, "ioreg", ["-r", "-c", "IOBluetoothDevice", "-l"], "ioreg IOBluetoothDevice"); + } else if (process.platform === "win32") { + await collectBluetoothTargetsFromCommand(targets, windowsSystemCommand("powershell.exe"), [ + "-NoProfile", + "-Command", + "Get-PnpDevice -Class Bluetooth | Where-Object { $_.FriendlyName } | ForEach-Object { $_.FriendlyName }" + ], "Windows Bluetooth device"); + } + return uniqueTargets(targets); +} + +async function collectBluetoothTargetsFromCommand( + targets: BotHandoffScanTarget[], + command: string, + args: string[], + sourceDetail: string +) { + const output = await commandStdout(command, args).catch(() => ""); + if (!output.trim()) { + return; + } + for (const target of parseBluetoothScanTargets(output)) { + pushUniqueTarget(targets, { + ...target, + detail: target.detail || sourceDetail + }); + } +} + +async function commandStdout(command: string, args: string[]): Promise { + const { stdout } = await execFileAsync(command, args, { + maxBuffer: 4 * 1024 * 1024, + timeout: 12_000, + windowsHide: process.platform === "win32" + }); + return stdout; +} + +function parseArpScanTargets(output: string): BotHandoffScanTarget[] { + const targets: BotHandoffScanTarget[] = []; + for (const line of output.split(/\r?\n/)) { + const target = parseArpScanTarget(line); + if (target) { + pushUniqueTarget(targets, target); + } + } + return targets; +} + +function parseArpScanTarget(line: string): BotHandoffScanTarget | undefined { + const trimmed = line.trim(); + if (!trimmed || trimmed.includes("(incomplete)")) { + return undefined; + } + const windowsTarget = parseWindowsArpScanTarget(trimmed); + if (windowsTarget) { + return windowsTarget; + } + const open = trimmed.indexOf("("); + const close = open >= 0 ? trimmed.indexOf(")", open + 1) : -1; + if (open < 0 || close < 0) { + return undefined; + } + const host = trimmed.slice(0, open).trim().replace(/\.$/, ""); + const ip = trimmed.slice(open + 1, close).trim(); + const afterAt = trimmed.split(" at ")[1]?.trim() ?? ""; + const mac = afterAt.split(/\s+/)[0]?.replace(/,$/, "") ?? ""; + const networkInterface = trimmed.split(" on ")[1]?.split(/\s+/)[0] ?? ""; + const target = ip || mac; + if (!target) { + return undefined; + } + const detailParts = []; + if (mac && mac !== "(incomplete)") { + detailParts.push(`MAC ${mac}`); + } + if (networkInterface) { + detailParts.push(`interface ${networkInterface}`); + } + return { + detail: detailParts.join(" / "), + id: `wifi:${target}`, + label: host && host !== "?" ? `${host} (${target})` : target, + source: "wifi", + target + }; +} + +function parseWindowsArpScanTarget(line: string): BotHandoffScanTarget | undefined { + const [ip, mac] = line.split(/\s+/); + if (!looksLikeIpv4(ip) || !looksLikeMac(mac)) { + return undefined; + } + return { + detail: `MAC ${mac}`, + id: `wifi:${ip}`, + label: `${ip} (${mac})`, + source: "wifi", + target: ip + }; +} + +function parseBluetoothScanTargets(output: string): BotHandoffScanTarget[] { + const targets: BotHandoffScanTarget[] = []; + try { + collectBluetoothScanTargets(JSON.parse(output), targets); + } catch { + // Text output is parsed below. + } + if (targets.length === 0) { + collectBluetoothScanTargetsFromText(output, targets); + } + return uniqueTargets(targets); +} + +function collectBluetoothScanTargets(value: unknown, targets: BotHandoffScanTarget[]) { + if (Array.isArray(value)) { + for (const item of value) { + collectBluetoothScanTargets(item, targets); + } + return; + } + if (!isRecord(value)) { + return; + } + const target = bluetoothScanTargetFromObject(value); + if (target) { + pushUniqueTarget(targets, target); + } + for (const item of Object.values(value)) { + if (typeof item === "object" && item !== null) { + collectBluetoothScanTargets(item, targets); + } + } +} + +function bluetoothScanTargetFromObject(record: Record): BotHandoffScanTarget | undefined { + const name = firstStringField(record, [ + "device_name", + "device_title", + "name", + "_name", + "displayName", + "deviceName", + "DeviceName", + "localName", + "Product" + ])?.trim() ?? ""; + const address = firstStringField(record, [ + "device_address", + "address", + "bd_addr", + "macAddress", + "deviceAddress", + "BD_ADDR", + "BTAddress", + "DeviceAddress" + ])?.trim(); + const identifier = firstStringField(record, ["identifier", "id", "uuid", "UUID", "peripheralIdentifier"])?.trim(); + const hasDeviceMarker = Boolean(address || identifier || firstStringField(record, ["device_rssi", "rssi", "RSSI"])) || + Object.keys(record).some((key) => key.toLowerCase().includes("device")); + if (!hasDeviceMarker || name.toLowerCase() === "bluetooth" || name.toLowerCase() === "bluetooth-incoming-port") { + return undefined; + } + const target = address || identifier || name; + if (!target) { + return undefined; + } + const detailParts = []; + if (address) { + detailParts.push(`address ${address}`); + } + if (identifier && identifier !== address) { + detailParts.push(`id ${identifier}`); + } + const connected = firstStringField(record, ["device_connected", "connected"]); + if (connected) { + detailParts.push(`connected ${connected}`); + } + const rssi = firstStringField(record, ["device_rssi", "rssi", "RSSI"]); + if (rssi) { + detailParts.push(`RSSI ${rssi}`); + } + return { + detail: detailParts.join(" / "), + id: `bluetooth:${target}`, + label: name || bluetoothFallbackLabel(target), + source: "bluetooth", + target + }; +} + +function collectBluetoothScanTargetsFromText(output: string, targets: BotHandoffScanTarget[]) { + const blocks: Array> = []; + let current: Record = {}; + for (const line of output.split(/\r?\n/)) { + const trimmed = line.trim(); + if (!trimmed) { + continue; + } + const quoted = trimmed.match(/"([^"]+)"\s*=\s*"([^"]*)"/); + if (quoted) { + current[quoted[1]] = quoted[2]; + continue; + } + const keyValue = trimmed.match(/^([^:]+):\s*(.+)$/); + if (keyValue) { + current[keyValue[1].trim()] = keyValue[2].trim(); + continue; + } + const heading = trimmed.match(/^(.+):$/); + if (heading) { + if (Object.keys(current).length > 0) { + blocks.push(current); + } + current = { name: heading[1].trim() }; + } + } + if (Object.keys(current).length > 0) { + blocks.push(current); + } + for (const block of blocks) { + const target = bluetoothScanTargetFromObject(block); + if (target) { + pushUniqueTarget(targets, target); + } + } +} + +function firstStringField(record: Record, keys: string[]): string | undefined { + for (const key of keys) { + const value = record[key]; + if (typeof value === "string" && value.trim()) { + return value.trim(); + } + if ((typeof value === "number" || typeof value === "boolean") && String(value).trim()) { + return String(value); + } + } + return undefined; +} + +function bluetoothFallbackLabel(target: string): string { + const short = target.length > 12 ? `${target.slice(0, 8)}...${target.slice(-4)}` : target; + return `Bluetooth device ${short}`; +} + +function pushUniqueTarget(targets: BotHandoffScanTarget[], target: BotHandoffScanTarget) { + if (!targets.some((item) => item.id === target.id || (item.source === target.source && item.target === target.target))) { + targets.push(target); + } +} + +function uniqueTargets(targets: BotHandoffScanTarget[]): BotHandoffScanTarget[] { + const result: BotHandoffScanTarget[] = []; + for (const target of targets) { + pushUniqueTarget(result, target); + } + return result; +} + +function looksLikeIpv4(value: string | undefined): value is string { + return Boolean(value && /^\d{1,3}(?:\.\d{1,3}){3}$/.test(value)); +} + +function looksLikeMac(value: string | undefined): value is string { + return Boolean(value && /^[0-9a-f]{2}(?:[:-][0-9a-f]{2}){5}$/i.test(value)); +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} diff --git a/packages/core/src/agents/bot-gateway/qr-login-service.ts b/packages/core/src/agents/bot-gateway/qr-login-service.ts new file mode 100644 index 0000000..cf1f665 --- /dev/null +++ b/packages/core/src/agents/bot-gateway/qr-login-service.ts @@ -0,0 +1,513 @@ +import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import { pathToFileURL } from "node:url"; +import { CONFIGDIR } from "@ccr/core/config/constants"; +import type { + BotGatewayQrLoginCancelRequest, + BotGatewayQrLoginCancelResult, + BotGatewayQrLoginStartRequest, + BotGatewayQrLoginStartResult, + BotGatewayQrLoginWaitRequest, + BotGatewayQrLoginWaitResult, + BotGatewayRuntimeConfig +} from "@ccr/core/contracts/app"; + +type BotGatewayClientWithRequest = { + close?: () => Promise | void; + health: () => Promise; + request: (method: string, params?: unknown) => Promise; +}; + +type BotGatewaySdkModule = { + bundledStdioPath?: () => string; + createBotGatewayClient: (options?: unknown) => unknown; +}; + +type QrSession = { + botConfigId: string; + client: BotGatewayClientWithRequest; + credentials: Record; + integrationConfig: Record; + integrationId: string; + platform: string; + stateDir: string; + tenantId: string; + timeoutMs: number; +}; + +const qrSessions = new Map(); +let sdkPromise: Promise | undefined; + +export async function startBotGatewayQrLogin( + request: BotGatewayQrLoginStartRequest +): Promise { + const savedConfig = request.config; + const bot = normalizeBotGatewayForQr(savedConfig.botGateway); + if (!bot.enabled || bot.platform !== "weixin-ilink" || bot.authType !== "qr_login") { + throw new Error("微信扫码登录只支持微信平台的扫码认证方式。"); + } + + const stateDir = resolveBotGatewayStateDir(bot, savedConfig.id); + mkdirSync(stateDir, { recursive: true }); + const client = await createQrClient(bot, stateDir); + const timeoutMs = Math.max(1000, bot.requestTimeoutMs || 600000); + let registered = false; + try { + await withTimeout(client.health(), Math.max(1000, bot.startupTimeoutMs || 10000), "Bot Gateway health check timed out."); + + const integrationId = await resolveWeixinQrIntegrationId(client, bot, timeoutMs); + const rawStart = await botGatewayClientRequest(client, "auth.qr.start", { + config: bot.integrationConfig, + credentials: bot.credentials, + force: request.force !== false, + integrationId, + platform: bot.platform, + tenantId: bot.tenantId + }, timeoutMs); + const auth = unwrapGatewayResult(rawStart); + const sessionId = stringValue(auth.sessionId); + if (!sessionId) { + throw new Error("Bot Gateway QR start response missing sessionId."); + } + + const previous = qrSessions.get(sessionId); + if (previous) { + closeQrClient(previous.client); + } + qrSessions.set(sessionId, { + botConfigId: savedConfig.id, + client, + credentials: bot.credentials, + integrationConfig: bot.integrationConfig, + integrationId, + platform: bot.platform, + stateDir, + tenantId: bot.tenantId, + timeoutMs + }); + registered = true; + + const qrCodeUrl = qrCodeUrlFromAuth(auth); + if (!qrCodeUrl) { + throw new Error("Bot Gateway QR start response missing qrCodeUrl."); + } + + return { + botConfigId: savedConfig.id, + expiresAt: stringValue(auth.expiresAt), + integrationId, + message: stringValue(auth.message), + platform: bot.platform, + qrCodeUrl, + sessionId, + stateDir, + tenantId: bot.tenantId + }; + } catch (error) { + if (!registered) { + closeQrClient(client); + } + throw error; + } +} + +export async function waitBotGatewayQrLogin( + request: BotGatewayQrLoginWaitRequest +): Promise { + const sessionId = request.sessionId.trim(); + const session = qrSessions.get(sessionId); + if (!session) { + throw new Error("微信扫码登录会话不存在,请重新生成二维码。"); + } + + const rawWait = await botGatewayClientRequest(session.client, "auth.qr.wait", { + autoStart: true, + config: session.integrationConfig, + configOverride: { + ...session.integrationConfig, + transport: botGatewayWebSocketTransport(session.platform) + }, + credentials: session.credentials, + integrationId: session.integrationId, + platform: session.platform, + sessionId, + tenantId: session.tenantId, + timeoutMs: Math.max(1000, request.timeoutMs || 5000), + verifyCode: request.verifyCode?.trim() || undefined + }, session.timeoutMs); + const auth = unwrapGatewayResult(rawWait); + const status = stringValue(auth.status) || "pending"; + const confirmed = status === "confirmed"; + const result = { + confirmed, + integrationId: session.integrationId, + message: stringValue(auth.message), + sessionId, + stateDir: session.stateDir, + status, + tenantId: session.tenantId + }; + + if (isTerminalQrLoginStatus(status)) { + qrSessions.delete(sessionId); + closeQrClient(session.client); + } + + return result; +} + +export function cancelBotGatewayQrLogin( + request: BotGatewayQrLoginCancelRequest +): BotGatewayQrLoginCancelResult { + const sessionId = request.sessionId.trim(); + const session = qrSessions.get(sessionId); + if (session) { + qrSessions.delete(sessionId); + closeQrClient(session.client); + } + return { canceled: Boolean(session) }; +} + +async function createQrClient(bot: BotGatewayRuntimeConfig, stateDir: string): Promise { + const sdk = await loadBotGatewaySdk(); + const command = resolveBotGatewayCommand(sdk, bot); + const client = sdk.createBotGatewayClient({ + transport: "stdio", + env: { + ...process.env, + BOT_GATEWAY_STATE_DIR: stateDir, + CODEXL_HOME: CONFIGDIR + }, + ...command + }) as BotGatewayClientWithRequest; + if (!client || typeof client.request !== "function" || typeof client.health !== "function") { + throw new Error("Bot Gateway SDK client does not expose request()."); + } + return client; +} + +function resolveBotGatewayCommand(sdk: BotGatewaySdkModule, bot: BotGatewayRuntimeConfig): { args?: string[]; command: string; cwd?: string } | undefined { + if (bot.command) { + return { + args: bot.args, + command: resolveUserPath(bot.command), + cwd: bot.cwd ? resolveUserPath(bot.cwd) : process.cwd() + }; + } + if (typeof sdk.bundledStdioPath !== "function") { + return undefined; + } + const bundledPath = sdk.bundledStdioPath(); + return { + args: [sanitizedBotGatewayStdioRunnerPath(bundledPath)], + command: process.execPath, + cwd: path.dirname(bundledPath) + }; +} + +function sanitizedBotGatewayStdioRunnerPath(sourcePath: string): string { + const source = readFileSync(sourcePath, "utf8"); + const normalized = normalizeDuplicateShebangs(source); + if (normalized === source) { + return sourcePath; + } + + const targetDir = path.join(CONFIGDIR, "bot-gateway", "runners"); + const targetPath = path.join(targetDir, "bot-gateway-stdio.mjs"); + mkdirSync(targetDir, { recursive: true }); + if (!existsSync(targetPath) || readFileSync(targetPath, "utf8") !== normalized) { + writeFileSync(targetPath, normalized); + } + return targetPath; +} + +function normalizeDuplicateShebangs(source: string): string { + const lines = source.split("\n"); + if (!lines[0]?.startsWith("#!")) { + return source; + } + let index = 1; + while (lines[index]?.startsWith("#!")) { + index += 1; + } + return [lines[0], ...lines.slice(index)].join("\n"); +} + +async function loadBotGatewaySdk(): Promise { + if (!sdkPromise) { + sdkPromise = importBotGatewaySdk(); + } + return sdkPromise; +} + +async function importBotGatewaySdk(): Promise { + const candidates = [ + process.env.CCR_BOT_GATEWAY_SDK_MODULE, + resolveBundledBotGatewaySdkModule(), + "@the-next-ai/bot-gateway-sdk" + ].filter((value): value is string => Boolean(value?.trim())); + const errors: string[] = []; + for (const candidate of candidates) { + try { + const sdk = await import(botGatewaySdkImportSpecifier(candidate)); + if (sdk && typeof sdk.createBotGatewayClient === "function") { + return sdk as BotGatewaySdkModule; + } + errors.push(`${candidate}: missing createBotGatewayClient export`); + } catch (error) { + errors.push(`${candidate}: ${formatError(error)}`); + } + } + throw new Error(`Unable to load @the-next-ai/bot-gateway-sdk. ${errors.join("; ")}`); +} + +function resolveBundledBotGatewaySdkModule(): string { + const resourcesPath = (process as NodeJS.Process & { resourcesPath?: string }).resourcesPath; + const candidates = [ + path.join(__dirname, "bot-gateway-sdk", "dist", "index.js"), + ...(resourcesPath + ? [ + path.join(resourcesPath, "app.asar", "dist", "main", "bot-gateway-sdk", "dist", "index.js"), + path.join(resourcesPath, "app", "dist", "main", "bot-gateway-sdk", "dist", "index.js") + ] + : []) + ]; + return candidates.find((candidate) => existsSync(candidate)) ?? ""; +} + +function botGatewaySdkImportSpecifier(value: string): string { + const trimmed = value.trim(); + if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)) { + return trimmed; + } + if (path.isAbsolute(trimmed)) { + return pathToFileURL(trimmed).href; + } + return trimmed; +} + +async function resolveWeixinQrIntegrationId( + client: BotGatewayClientWithRequest, + bot: BotGatewayRuntimeConfig, + timeoutMs: number +): Promise { + const requested = bot.integrationId.trim(); + const raw = await botGatewayClientRequest(client, "integrations.list", {}, timeoutMs).catch(() => ({})); + const result = unwrapGatewayResult(raw); + const integrations = Array.isArray(result.integrations) ? result.integrations.filter(isRecord) : []; + const requestedIntegration = integrations.find((integration) => stringValue(integration.id) === requested); + if (requestedIntegration) { + if (stringValue(requestedIntegration.platform) === "weixin-ilink") { + return requested; + } + } else if (requested) { + return requested; + } + + const tenant = bot.tenantId.trim(); + const tenantIntegration = integrations.find((integration) => + stringValue(integration.platform) === "weixin-ilink" && + stringValue(integration.tenantId).toLowerCase() === tenant.toLowerCase() + ); + if (tenantIntegration) { + const id = stringValue(tenantIntegration.id); + if (id) return id; + } + + const platformIntegration = integrations.find((integration) => stringValue(integration.platform) === "weixin-ilink"); + if (platformIntegration) { + const id = stringValue(platformIntegration.id); + if (id) return id; + } + + return requested || safePathSegment(`weixin-ilink-${tenant || "ccr"}`); +} + +function normalizeBotGatewayForQr(bot: BotGatewayRuntimeConfig): BotGatewayRuntimeConfig { + const platform = normalizeBotGatewayPlatform(bot.platform); + const authType = normalizeBotGatewayAuthType(platform, bot.authType); + return { + ...bot, + authType, + credentials: sanitizeBotGatewayRecord(bot.credentials), + integrationConfig: websocketBotGatewayIntegrationConfig(platform, bot.integrationConfig), + platform, + tenantId: bot.tenantId.trim() || "ccr" + }; +} + +function websocketBotGatewayIntegrationConfig(platform: string, value: Record): Record { + const config = sanitizeBotGatewayRecord(value); + delete config.transport; + delete config.sendMode; + const transport = botGatewayWebSocketTransport(platform); + return transport ? { ...config, transport } : config; +} + +function botGatewayWebSocketTransport(platform: string): string { + if (!platform || platform === "none") { + return ""; + } + return platform === "slack" ? "socket" : "websocket"; +} + +function normalizeBotGatewayPlatform(value: string): string { + const normalized = value.trim().toLowerCase(); + if (!normalized || normalized === "off" || normalized === "disabled") { + return "none"; + } + if (normalized === "lark") { + return "feishu"; + } + if (normalized === "dingding") { + return "dingtalk"; + } + if (normalized === "wechat" || normalized === "weixin-work" || normalized === "wework") { + return "wecom"; + } + return normalized; +} + +function normalizeBotGatewayAuthType(platform: string, value: string): string { + const normalized = value.trim().toLowerCase().replace(/[-\s]+/g, "_"); + const aliases: Record = { + qr: "qr_login", + qr_code: "qr_login", + qr_login: "qr_login", + qrcode: "qr_login", + token: "bot_token" + }; + const authType = aliases[normalized] ?? normalized; + if (platform === "weixin-ilink") { + return authType || "qr_login"; + } + return authType; +} + +function sanitizeBotGatewayRecord(value: Record | undefined): Record { + const result: Record = {}; + if (!value || typeof value !== "object" || Array.isArray(value)) { + return result; + } + for (const [key, rawValue] of Object.entries(value)) { + if (!key.trim() || isWebhookRelatedBotGatewayKey(key)) { + continue; + } + result[key] = rawValue; + } + return result; +} + +function isWebhookRelatedBotGatewayKey(key: string): boolean { + const normalized = key.trim().toLowerCase().replace(/[_-]+/g, ""); + return normalized.includes("webhook") || normalized === "sendmode"; +} + +function unwrapGatewayResult(value: unknown): Record { + if (!isRecord(value)) { + return {}; + } + const result = value.result; + return isRecord(result) ? result : value; +} + +function qrCodeUrlFromAuth(auth: Record): string { + const direct = stringValue(auth.qrCodeUrl) || + stringValue(auth.qrCodeURL) || + stringValue(auth.qrcodeUrl) || + stringValue(auth.qrcodeURL) || + stringValue(auth.qrcode_img_content) || + stringValue(auth.url); + if (direct) { + return direct; + } + const raw = auth.raw; + if (isRecord(raw)) { + return stringValue(raw.qrCodeUrl) || + stringValue(raw.qrCodeURL) || + stringValue(raw.qrcodeUrl) || + stringValue(raw.qrcodeURL) || + stringValue(raw.qrcode_img_content) || + stringValue(raw.url); + } + return ""; +} + +function botGatewayClientRequest( + client: BotGatewayClientWithRequest, + method: string, + params: unknown, + timeoutMs: number +): Promise { + return withTimeout(client.request(method, params), timeoutMs, `Bot Gateway request timed out: ${method}`); +} + +function withTimeout(promise: Promise, timeoutMs: number, message: string): Promise { + const timeout = Math.max(1000, timeoutMs || 30000); + let timer: NodeJS.Timeout | undefined; + return new Promise((resolve, reject) => { + timer = setTimeout(() => reject(new Error(message)), timeout); + promise.then( + (value) => { + if (timer) clearTimeout(timer); + resolve(value); + }, + (error) => { + if (timer) clearTimeout(timer); + reject(error); + } + ); + }); +} + +function closeQrClient(client: BotGatewayClientWithRequest): void { + try { + const result = client.close?.(); + if (result && typeof (result as Promise).catch === "function") { + (result as Promise).catch(() => undefined); + } + } catch { + // Best-effort cleanup for a short-lived QR login helper process. + } +} + +function resolveBotGatewayStateDir(bot: BotGatewayRuntimeConfig, configId: string): string { + const configured = bot.stateDir.trim(); + if (configured) { + return resolveUserPath(configured); + } + const slug = safePathSegment(configId || bot.integrationId || bot.tenantId) || "default"; + return path.join(CONFIGDIR, "bot-gateway", slug); +} + +function resolveUserPath(value: string): string { + const trimmed = value.trim(); + if (trimmed === "~") { + return os.homedir(); + } + if (trimmed.startsWith("~/")) { + return path.join(os.homedir(), trimmed.slice(2)); + } + return trimmed; +} + +function safePathSegment(value: string): string { + return value.trim().replace(/[^a-zA-Z0-9_.-]+/g, "-").replace(/^-+|-+$/g, ""); +} + +function isTerminalQrLoginStatus(status: string): boolean { + return ["already_bound", "confirmed", "expired", "failed"].includes(status); +} + +function isRecord(value: unknown): value is Record { + return Boolean(value && typeof value === "object" && !Array.isArray(value)); +} + +function stringValue(value: unknown): string { + return typeof value === "string" ? value.trim() : ""; +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/core/src/agents/claude-app/cdp.ts b/packages/core/src/agents/claude-app/cdp.ts new file mode 100644 index 0000000..9ced811 --- /dev/null +++ b/packages/core/src/agents/claude-app/cdp.ts @@ -0,0 +1,452 @@ +import { rmSync } from "node:fs"; +import { createServer, type AddressInfo } from "node:net"; +import path from "node:path"; +import { WebSocket } from "undici"; + +type ClaudeAppCdpLogger = Pick; + +type ClaudeAppDesignCdpOptions = { + cdpPort?: number; + designUrl?: string; + enabled?: boolean; + logger?: ClaudeAppCdpLogger; +}; + +type DevToolsTarget = { + id?: string; + title?: string; + type?: string; + url?: string; + webSocketDebuggerUrl?: string; +}; + +type CdpError = { + code?: number; + data?: unknown; + message?: string; +}; + +type CdpMessage = { + error?: CdpError; + id?: number; + method?: string; + params?: unknown; + result?: unknown; +}; + +type FetchRequestPausedParams = { + request?: { + url?: string; + }; + requestId?: string; +}; + +const claudeAppDevToolsActivePortFile = "DevToolsActivePort"; +const claudeAppDesignCdpConnectTimeoutMs = 15_000; +const claudeAppDesignCdpKeepAliveMs = 45_000; +const claudeAppDesignCdpPollIntervalMs = 250; + +export function shouldEnableClaudeAppDesignCdp(_enabledByConfig = false): boolean { + const configured = process.env.CCR_CLAUDE_APP_DESIGN_CDP?.trim().toLowerCase(); + return configured === "true" || configured === "1" || configured === "on"; +} + +export async function reserveClaudeAppCdpPort(logger: ClaudeAppCdpLogger = console, enabledByConfig = false): Promise { + if (!shouldEnableClaudeAppDesignCdp(enabledByConfig)) { + return undefined; + } + const configured = Number(process.env.CCR_CLAUDE_APP_CDP_PORT); + if (Number.isInteger(configured) && configured > 0 && configured <= 65535) { + return configured; + } + try { + return await reserveLoopbackPort(); + } catch (error) { + logger.warn(`[profile] Failed to reserve Claude App CDP port: ${nodeErrorMessage(error)}`); + return undefined; + } +} + +export function prepareClaudeAppCdpUserDataDir(userDataDir: string): void { + rmSync(path.join(userDataDir, claudeAppDevToolsActivePortFile), { force: true }); +} + +export function scheduleClaudeAppDesignCdp(options: ClaudeAppDesignCdpOptions): void { + if (!shouldEnableClaudeAppDesignCdp(options.enabled === true)) { + return; + } + const logger = options.logger || console; + const designUrl = normalizeClaudeAppDesignUrl(options.designUrl); + if (!options.cdpPort || !designUrl) { + return; + } + void forceOpenClaudeAppDesignViaCdp({ + cdpPort: options.cdpPort, + designUrl, + logger + }).catch((error) => { + logger.warn(`[profile] Failed to force-open Claude Design via CDP: ${nodeErrorMessage(error)}`); + }); +} + +async function forceOpenClaudeAppDesignViaCdp(options: { + cdpPort: number; + designUrl: string; + logger: ClaudeAppCdpLogger; +}): Promise { + const target = await waitForClaudeAppPageTarget(options.cdpPort, claudeAppDesignCdpConnectTimeoutMs); + if (!target.webSocketDebuggerUrl) { + throw new Error(`Claude App CDP page target was not available on port ${options.cdpPort}.`); + } + + const client = await CdpClient.connect(target.webSocketDebuggerUrl); + try { + client.on("Fetch.requestPaused", (params) => { + void handleFetchRequestPaused(client, params as FetchRequestPausedParams, options.logger); + }); + + await client.send("Page.enable"); + await client.send("Runtime.enable"); + await client.send("Fetch.enable", { + patterns: [ + { + requestStage: "Request", + urlPattern: "app://localhost/v1/privacy-consents*" + } + ] + }); + await client.send("Page.setBypassCSP", { enabled: true }); + await client.send("Page.addScriptToEvaluateOnNewDocument", { + source: claudeAppDesignFeatureScript() + }); + await client.send("Runtime.evaluate", { + awaitPromise: false, + expression: claudeAppDesignFeatureScript() + }); + await client.send("Page.navigate", { + url: claudeAppDesktopDesignUrl(options.designUrl) + }); + await sleep(1_200); + await client.send("Runtime.evaluate", { + awaitPromise: false, + expression: claudeAppDesignFrameScript(options.designUrl) + }); + options.logger.info(`[profile] Force-opened Claude Design via CDP at ${options.designUrl}.`); + await sleep(claudeAppDesignCdpKeepAliveMs); + } finally { + client.close(); + } +} + +async function handleFetchRequestPaused(client: CdpClient, params: FetchRequestPausedParams, logger: ClaudeAppCdpLogger): Promise { + const requestId = params.requestId; + if (!requestId) { + return; + } + const url = params.request?.url || ""; + try { + if (url.startsWith("app://localhost/v1/privacy-consents")) { + await client.send("Fetch.fulfillRequest", { + body: Buffer.from(JSON.stringify({ + consents: {}, + ok: true, + values: {} + })).toString("base64"), + responseCode: 200, + responseHeaders: [ + { name: "content-type", value: "application/json; charset=utf-8" }, + { name: "cache-control", value: "no-store" } + ], + requestId + }); + return; + } + await client.send("Fetch.continueRequest", { requestId }); + } catch (error) { + logger.warn(`[profile] Failed to handle Claude App CDP request ${url}: ${nodeErrorMessage(error)}`); + } +} + +async function waitForClaudeAppPageTarget(port: number, timeoutMs: number): Promise { + const deadline = Date.now() + timeoutMs; + let lastError: unknown; + while (Date.now() < deadline) { + try { + const targets = await cdpJson(port, "/json/list"); + const target = targets.find(isClaudeAppPageTarget) || + targets.find((entry) => entry.type === "page" && entry.webSocketDebuggerUrl); + if (target) { + return target; + } + } catch (error) { + lastError = error; + } + await sleep(claudeAppDesignCdpPollIntervalMs); + } + throw new Error(`Claude App CDP page target was not available on port ${port}${lastError ? `: ${nodeErrorMessage(lastError)}` : ""}`); +} + +function isClaudeAppPageTarget(target: DevToolsTarget): boolean { + if (target.type !== "page" || !target.webSocketDebuggerUrl) { + return false; + } + const url = target.url || ""; + return url.startsWith("app://localhost/") || url.startsWith("app://-/") || /claude/i.test(target.title || ""); +} + +async function cdpJson(port: number, endpoint: string): Promise { + const response = await fetch(`http://127.0.0.1:${port}${endpoint}`, { + signal: AbortSignal.timeout(1_000) + }); + if (!response.ok) { + throw new Error(`CDP ${endpoint} returned HTTP ${response.status}`); + } + return await response.json() as T; +} + +function claudeAppDesktopDesignUrl(designUrl: string): string { + return `app://localhost/desktop-design?path=${encodeURIComponent(designUrl)}`; +} + +function claudeAppDesignFeatureScript(): string { + return `(() => { + const forced = { claudeDesignWindow: { status: "supported" } }; + function merge(value) { + return Object.assign({}, value || {}, forced); + } + let bootFeatures = merge(globalThis.desktopBootFeatures); + try { + Object.defineProperty(globalThis, "desktopBootFeatures", { + configurable: true, + get() { + return bootFeatures; + }, + set(value) { + bootFeatures = merge(value); + } + }); + } catch (_) { + globalThis.desktopBootFeatures = bootFeatures; + } + function patchAppFeatures(container) { + if (!container) { + return; + } + const existing = container.AppFeatures || {}; + if (existing.__ccrClaudeDesignPatched) { + return; + } + const previous = existing.getSupportedFeatures; + container.AppFeatures = Object.assign({}, existing, { + __ccrClaudeDesignPatched: true, + getSupportedFeatures() { + if (typeof previous === "function") { + return Promise.resolve(previous.call(existing)).then(merge, () => merge()); + } + return Promise.resolve(merge()); + } + }); + } + globalThis["claude.settings"] = globalThis["claude.settings"] || {}; + patchAppFeatures(globalThis["claude.settings"]); + globalThis.claude = globalThis.claude || {}; + globalThis.claude.settings = globalThis.claude.settings || {}; + patchAppFeatures(globalThis.claude.settings); + })();`; +} + +function claudeAppDesignFrameScript(designUrl: string): string { + const target = JSON.stringify(designUrl); + return `(() => { + const target = ${target}; + function forceFrame() { + const frames = Array.from(document.querySelectorAll("iframe")); + const designFrame = frames.find((frame) => /design|desktop-design|omelette/i.test(frame.getAttribute("src") || frame.id || frame.className || "")); + const frame = designFrame || frames[0]; + if (frame && frame.src !== target) { + frame.src = target; + } + } + forceFrame(); + globalThis.__ccrClaudeDesignFrameTimer = globalThis.__ccrClaudeDesignFrameTimer || setInterval(forceFrame, 500); + })();`; +} + +function normalizeClaudeAppDesignUrl(value: string | undefined): string { + const raw = value?.trim(); + if (!raw) { + return ""; + } + try { + const url = new URL(raw); + if (url.protocol !== "http:" && url.protocol !== "https:") { + return ""; + } + url.pathname = normalizeDesignPath(url.pathname); + url.searchParams.set("__ccr_design_iframe", "1"); + return url.toString(); + } catch { + return ""; + } +} + +function normalizeDesignPath(value: string): string { + if (!value || value === "/") { + return "/design"; + } + return value.startsWith("/") ? value : `/${value}`; +} + +function reserveLoopbackPort(): Promise { + return new Promise((resolve, reject) => { + const server = createServer(); + server.once("error", reject); + server.listen({ host: "127.0.0.1", port: 0 }, () => { + const address = server.address() as AddressInfo | null; + const port = address?.port; + server.close((error) => { + if (error) { + reject(error); + return; + } + if (!port) { + reject(new Error("No loopback port was assigned.")); + return; + } + resolve(port); + }); + }); + }); +} + +function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +class CdpClient { + private readonly handlers = new Map void>>(); + private nextId = 1; + private readonly pending = new Map void; + resolve: (value: unknown) => void; + }>(); + + private constructor(private readonly ws: WebSocket) { + ws.addEventListener("message", (event) => this.handleMessage(event.data)); + ws.addEventListener("close", () => this.rejectPending(new Error("CDP WebSocket closed."))); + ws.addEventListener("error", () => this.rejectPending(new Error("CDP WebSocket failed."))); + } + + static connect(url: string): Promise { + return new Promise((resolve, reject) => { + const ws = new WebSocket(url); + let settled = false; + const timer = setTimeout(() => { + if (settled) { + return; + } + settled = true; + try { + ws.close(); + } catch { + // Ignore close failures during timeout cleanup. + } + reject(new Error("Timed out connecting to Claude App CDP WebSocket.")); + }, 5_000); + ws.addEventListener("open", () => { + if (settled) { + return; + } + settled = true; + clearTimeout(timer); + resolve(new CdpClient(ws)); + }); + ws.addEventListener("error", () => { + if (settled) { + return; + } + settled = true; + clearTimeout(timer); + reject(new Error("Failed to connect to Claude App CDP WebSocket.")); + }); + }); + } + + close(): void { + if (this.ws.readyState === 0 || this.ws.readyState === 1) { + this.ws.close(); + } + } + + on(method: string, handler: (params: unknown) => void): void { + const handlers = this.handlers.get(method) || []; + handlers.push(handler); + this.handlers.set(method, handlers); + } + + send(method: string, params?: Record): Promise { + if (this.ws.readyState !== 1) { + return Promise.reject(new Error("CDP WebSocket is not open.")); + } + const id = this.nextId++; + const payload = params === undefined ? { id, method } : { id, method, params }; + this.ws.send(JSON.stringify(payload)); + return new Promise((resolve, reject) => { + this.pending.set(id, { reject, resolve }); + }); + } + + private handleMessage(data: unknown): void { + let message: CdpMessage; + try { + message = JSON.parse(webSocketDataToString(data)) as CdpMessage; + } catch { + return; + } + if (typeof message.id === "number") { + const pending = this.pending.get(message.id); + if (!pending) { + return; + } + this.pending.delete(message.id); + if (message.error) { + pending.reject(new Error(message.error.message || `CDP command failed with code ${message.error.code || "unknown"}`)); + return; + } + pending.resolve(message.result); + return; + } + if (message.method) { + for (const handler of this.handlers.get(message.method) || []) { + handler(message.params); + } + } + } + + private rejectPending(error: Error): void { + for (const pending of this.pending.values()) { + pending.reject(error); + } + this.pending.clear(); + } +} + +function webSocketDataToString(data: unknown): string { + if (typeof data === "string") { + return data; + } + if (Buffer.isBuffer(data)) { + return data.toString("utf8"); + } + if (data instanceof ArrayBuffer) { + return Buffer.from(data).toString("utf8"); + } + if (ArrayBuffer.isView(data)) { + return Buffer.from(data.buffer, data.byteOffset, data.byteLength).toString("utf8"); + } + return String(data); +} + +function nodeErrorMessage(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/core/src/agents/claude-app/gateway-routes.ts b/packages/core/src/agents/claude-app/gateway-routes.ts new file mode 100644 index 0000000..3ccda7e --- /dev/null +++ b/packages/core/src/agents/claude-app/gateway-routes.ts @@ -0,0 +1,350 @@ +import type { AppConfig } from "@ccr/core/contracts/app"; +import { normalizeProfileScopeValue } from "@ccr/core/contracts/app"; + +export const CLAUDE_APP_FALLBACK_MODEL = "claude-sonnet-4-5"; +export const CLAUDE_APP_ONE_MILLION_CONTEXT_SUFFIX = "[1m]"; +const CLAUDE_APP_ENCODED_ROUTE_PREFIX = "anthropic/claude-ccr-h"; + +export type ClaudeAppGatewayModelRoute = { + displayName: string; + id: string; + legacyId?: string; + legacyIds?: string[]; + oneMillionContext: boolean; + targetModel: string; +}; + +export type ClaudeAppGatewayModelRouteOptions = { + displayName?: (model: string) => string | undefined; + supportsOneMillionContext?: (model: string) => boolean; +}; + +export type ClaudeAppGatewayInferenceModel = { + labelOverride: string; + name: string; + supports1m?: true; +}; + +export function inferClaudeAppGatewayTargetModel(config: Pick): string { + return inferGlobalClaudeProfileModel(config) || + CLAUDE_APP_FALLBACK_MODEL; +} + +export function buildClaudeAppGatewayModelRoutes( + config: Pick, + options: ClaudeAppGatewayModelRouteOptions = {} +): ClaudeAppGatewayModelRoute[] { + const targetModels = claudeAppGatewayTargetModels(config); + const displayNames = claudeAppGatewayDisplayNames(targetModels, options); + const configuredTargetKeys = new Set(targetModels.map((model) => + stripClaudeAppGatewayOneMillionContextSuffix(model).toLowerCase() + )); + const usedRouteIds = new Set(); + const seenTargets = new Set(); + return targetModels.flatMap((rawTargetModel, index) => { + const targetModel = stripClaudeAppGatewayOneMillionContextSuffix(rawTargetModel); + const oneMillionContext = claudeAppGatewaySupportsOneMillionContext(rawTargetModel, options); + const targetKey = `${targetModel.toLowerCase()}::${oneMillionContext ? "1m" : "base"}`; + if (seenTargets.has(targetKey)) { + return []; + } + seenTargets.add(targetKey); + + const routeId = claudeAppGatewayRouteId(targetModel, usedRouteIds, configuredTargetKeys); + if (!routeId) { + return []; + } + + const legacyIds = uniqueStrings([ + claudeAppGatewayGeneratedRouteId(rawTargetModel), + rawTargetModel === targetModel ? "" : claudeAppGatewayGeneratedRouteId(targetModel), + targetModel + ]).filter((id) => id.toLowerCase() !== routeId.toLowerCase()); + return [{ + displayName: displayNames[index], + id: routeId, + legacyId: legacyIds[0], + legacyIds, + oneMillionContext, + targetModel + }]; + }); +} + +export function resolveClaudeAppGatewayRouteModel( + model: string, + config: Pick, + options: ClaudeAppGatewayModelRouteOptions = {} +): string | undefined { + const normalized = model.trim().toLowerCase(); + const decodedRouteModel = decodeClaudeAppGatewayRouteId(normalized); + if (decodedRouteModel) { + const decodedTarget = claudeAppGatewayTargetModels(config).find((targetModel) => + stripClaudeAppGatewayOneMillionContextSuffix(targetModel).toLowerCase() === decodedRouteModel.toLowerCase() + ); + if (decodedTarget) { + return stripClaudeAppGatewayOneMillionContextSuffix(decodedTarget); + } + } + + return buildClaudeAppGatewayModelRoutes(config, options).find((route) => { + const normalizedBase = stripClaudeAppGatewayOneMillionContextSuffix(normalized).toLowerCase(); + return claudeAppGatewayRouteMatchIds(route).some((id) => { + const routeId = id.toLowerCase(); + const routeBaseId = stripClaudeAppGatewayOneMillionContextSuffix(routeId).toLowerCase(); + return routeId === normalized || routeBaseId === normalizedBase; + }); + })?.targetModel; +} + +export function buildClaudeAppGatewayInferenceModels( + config: Pick, + options: ClaudeAppGatewayModelRouteOptions = {} +): ClaudeAppGatewayInferenceModel[] { + const routes = buildClaudeAppGatewayModelRoutes(config, options); + return routes.length + ? routes.map((route) => ({ + labelOverride: route.displayName, + name: route.id, + ...(route.oneMillionContext ? { supports1m: true as const } : {}) + })) + : [{ labelOverride: "Claude Sonnet 4.5", name: CLAUDE_APP_FALLBACK_MODEL }]; +} + +export function hasClaudeAppGatewayOneMillionContextSuffix(id: string): boolean { + return id.trim().toLowerCase().endsWith(CLAUDE_APP_ONE_MILLION_CONTEXT_SUFFIX); +} + +export function stripClaudeAppGatewayOneMillionContextSuffix(id: string): string { + return id.trim().replace(/\[1m\]$/i, "").trim(); +} + +function inferGlobalClaudeProfileModel(config: Pick): string { + return config.profile.profiles.find((profile) => + profile.enabled && + profile.agent === "claude-code" && + normalizeProfileScopeValue(profile.scope) === "global" && + profile.model.trim() + )?.model.trim() ?? ""; +} + +function claudeAppGatewayTargetModels(config: Pick): string[] { + const baseEntries = config.Providers.flatMap((provider) => { + const providerName = provider.name?.trim(); + if (!providerName || !Array.isArray(provider.models)) { + return []; + } + return provider.models.flatMap((rawModel) => { + const modelName = rawModel.trim(); + return modelName ? [{ modelName, providerName }] : []; + }); + }); + + return uniqueStrings([ + inferClaudeAppGatewayTargetModel(config), + ...baseEntries.map((entry) => `${entry.providerName}/${entry.modelName}`), + ...(config.virtualModelProfiles ?? []).flatMap((profile) => { + if ( + profile.enabled === false || + profile.materialization?.enabled === false || + profile.materialization?.includeInGatewayModels === false + ) { + return []; + } + const derivedModels = baseEntries.flatMap((entry) => [ + ...(profile.match?.prefixes ?? []).flatMap((prefix) => { + const normalizedPrefix = prefix.trim(); + return normalizedPrefix ? [`${entry.providerName}/${normalizedPrefix}${entry.modelName}`] : []; + }), + ...(profile.match?.suffixes ?? []).flatMap((suffix) => { + const normalizedSuffix = suffix.trim(); + return normalizedSuffix ? [`${entry.providerName}/${entry.modelName}${normalizedSuffix}`] : []; + }) + ]); + return [ + ...derivedModels, + ...(profile.match?.exactAliases ?? []).flatMap((alias) => { + const normalizedAlias = alias.trim(); + if (!normalizedAlias) { + return []; + } + return normalizedAlias.toLowerCase().startsWith("fusion/") + ? [normalizedAlias] + : [`Fusion/${normalizedAlias}`]; + }) + ]; + }) + ]); +} + +function claudeAppGatewaySupportsOneMillionContext( + model: string, + options: ClaudeAppGatewayModelRouteOptions +): boolean { + const baseModel = stripClaudeAppGatewayOneMillionContextSuffix(model); + return hasClaudeAppGatewayOneMillionContextSuffix(model) || + Boolean(options.supportsOneMillionContext?.(baseModel)); +} + +function claudeAppGatewayRouteId( + model: string, + usedRouteIds: Set, + configuredTargetKeys: Set +): string | undefined { + const targetModel = stripClaudeAppGatewayOneMillionContextSuffix(model); + const candidates = [claudeAppGatewayNativeRouteId(targetModel), claudeAppGatewayEncodedRouteId(targetModel)]; + + for (const candidate of candidates) { + const claimed = claimClaudeAppGatewayRouteId(candidate, usedRouteIds, configuredTargetKeys, targetModel); + if (claimed) { + return claimed; + } + } + + for (let index = 2; index < 100; index += 1) { + const claimed = claimClaudeAppGatewayRouteId( + claudeAppGatewayEncodedRouteId(targetModel, index), + usedRouteIds, + configuredTargetKeys, + targetModel + ); + if (claimed) { + return claimed; + } + } + + return undefined; +} + +function claudeAppGatewayGeneratedRouteId(model: string): string { + const normalized = model.trim(); + return normalized.toLowerCase().startsWith("claude-") ? normalized : `claude-${normalized}`; +} + +function claudeAppGatewayNativeRouteId(model: string): string | undefined { + const normalized = stripClaudeAppGatewayOneMillionContextSuffix(model); + const lower = normalized.toLowerCase(); + if (!normalized.includes("/") && claudeAppGatewayNativeModelNameIsSafe(lower)) { + return normalized; + } + if (lower.startsWith("anthropic/")) { + const anthropicModel = normalized.slice("anthropic/".length); + return claudeAppGatewayNativeModelNameIsSafe(anthropicModel.toLowerCase()) ? normalized : undefined; + } + return undefined; +} + +function claudeAppGatewayNativeModelNameIsSafe(model: string): boolean { + return /^claude-(?:3(?:-[57])?-(?:haiku|sonnet|opus)|(?:haiku|sonnet|opus|fable)(?:[-.:@0-9a-z]+)?|code(?:[-.:@0-9a-z]+)?)$/i.test(model); +} + +function claudeAppGatewayEncodedRouteId(model: string, variant?: number): string { + const routePrefix = variant && variant > 1 + ? `anthropic/claude-ccr${variant}-h` + : CLAUDE_APP_ENCODED_ROUTE_PREFIX; + return `${routePrefix}${encodeClaudeAppGatewayRouteModel(model)}`; +} + +function encodeClaudeAppGatewayRouteModel(model: string): string { + return Buffer.from(stripClaudeAppGatewayOneMillionContextSuffix(model), "utf8").toString("hex"); +} + +function decodeClaudeAppGatewayRouteId(routeId: string): string | undefined { + const normalized = stripClaudeAppGatewayOneMillionContextSuffix(routeId).toLowerCase(); + const match = /^anthropic\/claude-ccr(?:\d+)?-h([0-9a-f]+)$/.exec(normalized); + const encoded = match?.[1]; + if (!encoded || encoded.length % 2 !== 0) { + return undefined; + } + try { + const decoded = Buffer.from(encoded, "hex").toString("utf8").trim(); + return decoded || undefined; + } catch { + return undefined; + } +} + +function claimClaudeAppGatewayRouteId( + routeId: string | undefined, + usedRouteIds: Set, + configuredTargetKeys: Set, + targetModel: string +): string | undefined { + const normalized = routeId ? stripClaudeAppGatewayOneMillionContextSuffix(routeId) : ""; + if (!normalized) { + return undefined; + } + const key = normalized.toLowerCase(); + const targetKey = stripClaudeAppGatewayOneMillionContextSuffix(targetModel).toLowerCase(); + if (usedRouteIds.has(key) || (configuredTargetKeys.has(key) && key !== targetKey)) { + return undefined; + } + usedRouteIds.add(key); + return normalized; +} + +function claudeAppGatewayRouteMatchIds(route: ClaudeAppGatewayModelRoute): string[] { + return uniqueStrings([route.id, route.legacyId, ...(route.legacyIds ?? [])]); +} + +function claudeAppGatewayDisplayNames( + models: string[], + options: ClaudeAppGatewayModelRouteOptions +): string[] { + const baseNames = models.map((model) => { + const targetModel = stripClaudeAppGatewayOneMillionContextSuffix(model); + return claudeAppGatewayDisplayNameWithProvider( + targetModel, + options.displayName?.(targetModel) ?? claudeAppGatewayBaseDisplayName(targetModel) + ); + }); + const counts = new Map(); + for (const baseName of baseNames) { + const key = baseName.toLowerCase(); + counts.set(key, (counts.get(key) ?? 0) + 1); + } + const duplicateIndexes = new Map(); + return models.map((_model, index) => { + const baseName = baseNames[index]; + const key = baseName.toLowerCase(); + if (counts.get(key) === 1) { + return baseName; + } + const duplicateIndex = (duplicateIndexes.get(key) ?? 0) + 1; + duplicateIndexes.set(key, duplicateIndex); + return `${baseName} #${duplicateIndex}`; + }); +} + +function claudeAppGatewayBaseDisplayName(model: string): string { + const trimmed = model.trim(); + return trimmed.includes("/") ? trimmed.slice(trimmed.lastIndexOf("/") + 1) : trimmed; +} + +function claudeAppGatewayDisplayNameWithProvider(model: string, displayName: string): string { + const trimmed = model.trim(); + const separator = trimmed.indexOf("/"); + if (separator <= 0 || separator >= trimmed.length - 1) { + return displayName; + } + const provider = trimmed.slice(0, separator).trim(); + if (!provider || displayName.toLowerCase().startsWith(`${provider.toLowerCase()}/`)) { + return displayName; + } + return `${provider}/${displayName}`; +} + +function uniqueStrings(values: Array): string[] { + const seen = new Set(); + const result: string[] = []; + for (const value of values) { + const normalized = value?.trim() ?? ""; + const key = normalized.toLowerCase(); + if (!normalized || seen.has(key)) { + continue; + } + seen.add(key); + result.push(normalized); + } + return result; +} diff --git a/packages/core/src/agents/claude-app/gateway-service.ts b/packages/core/src/agents/claude-app/gateway-service.ts new file mode 100644 index 0000000..58c7eff --- /dev/null +++ b/packages/core/src/agents/claude-app/gateway-service.ts @@ -0,0 +1,453 @@ +import { chmodSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import { createHash, randomBytes, randomUUID } from "node:crypto"; +import { resolveRuntimeAppPath } from "@ccr/core/runtime/app-paths"; +import { saveAppConfig } from "@ccr/core/config/config"; +import { CONFIGDIR } from "@ccr/core/config/constants"; +import { + buildClaudeAppGatewayInferenceModels, + type ClaudeAppGatewayInferenceModel, + type ClaudeAppGatewayModelRouteOptions +} from "@ccr/core/agents/claude-app/gateway-routes"; +import { NO_AVAILABLE_GATEWAY_MODELS_MESSAGE, hasAvailableGatewayModels, type ApiKeyConfig, type AppConfig, type ClaudeAppGatewayApplyResult } from "@ccr/core/contracts/app"; +import { findModelCatalogEntry } from "@ccr/core/gateway/model-catalog"; + +const CLAUDE_APP_CONFIG_ID = "8f69f2f1-3275-4ad8-9317-4aa7e972f311"; +const CLAUDE_APP_CONFIG_NAME = "Claude Code Router"; +const CLAUDE_APP_CONFIG_FILE = "claude_desktop_config.json"; +const CLAUDE_APP_CONFIG_LIBRARY_DIR = "configLibrary"; +const CLAUDE_APP_CONFIG_META_FILE = "_meta.json"; +const CLAUDE_APP_GATEWAY_BACKUP_FILE = path.join(CONFIGDIR, "claude-app-gateway-backup.json"); +const claudeAppGatewayModelRouteOptions: ClaudeAppGatewayModelRouteOptions = { + displayName: (model) => findModelCatalogEntry(model)?.displayName, + supportsOneMillionContext: (model) => Boolean(findModelCatalogEntry(model)?.limits?.supports1MContext) +}; + +type ClaudeAppGatewayConfig = { + inferenceCredentialKind: "static"; + inferenceGatewayApiKey: string; + inferenceGatewayAuthScheme: "x-api-key"; + inferenceGatewayBaseUrl: string; + inferenceModels: ClaudeAppGatewayInferenceModel[]; + inferenceModelsUpdatedAt: string; + inferenceModelsVersion: string; + inferenceProvider: "gateway"; + modelDiscoveryEnabled: true; + unstableDisableModelVerification: true; +}; + +type ClaudeAppApplyState = { + apiKey: string; + apiKeyGenerated: boolean; + config: AppConfig; +}; + +type ClaudeAppGatewayPaths = { + configLibraryFile: string; + dataDir: string; + libraryDir: string; + metaFile: string; + rootConfigFile: string; +}; + +type ClaudeAppGatewayFileSnapshot = { + content?: string; + exists: boolean; +}; + +type ClaudeAppGatewayBackup = { + configLibraryFile: ClaudeAppGatewayFileSnapshot; + createdAt: string; + metaFile: ClaudeAppGatewayFileSnapshot; + rootConfigFile: ClaudeAppGatewayFileSnapshot; + version: 1; +}; + +type ClaudeAppGatewayApplyOptions = { + backup?: boolean; + dataDir?: string; + refreshModelDiscoveryCache?: boolean; +}; + +export type ClaudeAppGatewaySyncResult = { + config: AppConfig; + configChanged: boolean; + result: ClaudeAppGatewayApplyResult; +}; + +export async function syncClaudeAppGatewayConfig(config: AppConfig): Promise { + if (!hasAvailableGatewayModels(config)) { + return { + config, + configChanged: false, + result: skippedClaudeAppGatewayResult(config) + }; + } + + const applied = applyClaudeAppGatewayConfig(config); + if (applied.config === config) { + return { + config, + configChanged: false, + result: applied.result + }; + } + + return { + config: await saveAppConfig(applied.config), + configChanged: true, + result: applied.result + }; +} + +function skippedClaudeAppGatewayResult(config: AppConfig): ClaudeAppGatewayApplyResult { + const paths = getClaudeAppGatewayPaths(); + return { + apiKeyGenerated: false, + configFile: paths.rootConfigFile, + configLibraryFile: paths.configLibraryFile, + dataDir: paths.dataDir, + endpoint: gatewayEndpoint(config), + message: NO_AVAILABLE_GATEWAY_MODELS_MESSAGE, + model: "", + requiresRestart: false + }; +} + +export function applyClaudeAppGatewayConfig(config: AppConfig, options: ClaudeAppGatewayApplyOptions = {}): { config: AppConfig; result: ClaudeAppGatewayApplyResult } { + if (!hasAvailableGatewayModels(config)) { + throw new Error(NO_AVAILABLE_GATEWAY_MODELS_MESSAGE); + } + + const state = ensureClaudeAppGatewayState(config); + const paths = getClaudeAppGatewayPaths(options.dataDir); + const endpoint = gatewayEndpoint(state.config); + const models = buildClaudeAppGatewayInferenceModels(state.config, claudeAppGatewayModelRouteOptions); + const model = models[0]?.name ?? ""; + const modelsVersion = claudeAppGatewayModelsVersion(endpoint, models); + const gatewayConfig: ClaudeAppGatewayConfig = { + inferenceCredentialKind: "static", + inferenceGatewayApiKey: state.apiKey, + inferenceGatewayAuthScheme: "x-api-key", + inferenceGatewayBaseUrl: endpoint, + inferenceModels: models, + inferenceModelsUpdatedAt: new Date().toISOString(), + inferenceModelsVersion: modelsVersion, + inferenceProvider: "gateway", + modelDiscoveryEnabled: true, + unstableDisableModelVerification: true + }; + + if (options.backup !== false) { + backupClaudeAppGatewayConfig(paths); + } + mkdirSync(paths.libraryDir, { mode: 0o700, recursive: true }); + writeJsonFile(paths.configLibraryFile, gatewayConfig); + applyClaudeAppConfigMeta(paths.metaFile); + applyClaudeAppDeploymentMode(paths.rootConfigFile); + if (options.refreshModelDiscoveryCache) { + refreshClaudeAppModelDiscoveryCache(paths.dataDir); + } + + return { + config: state.config, + result: { + apiKeyGenerated: state.apiKeyGenerated, + configFile: paths.rootConfigFile, + configLibraryFile: paths.configLibraryFile, + dataDir: paths.dataDir, + endpoint, + message: `Claude App is configured for CCR gateway at ${endpoint}. Restart Claude App if it is already open.`, + model, + requiresRestart: true + } + }; +} + +function claudeAppGatewayModelsVersion(endpoint: string, models: ClaudeAppGatewayInferenceModel[]): string { + return createHash("sha256") + .update(JSON.stringify({ endpoint, models })) + .digest("hex") + .slice(0, 16); +} + +function refreshClaudeAppModelDiscoveryCache(dataDir: string): void { + for (const relativePath of [ + "Cache", + "Code Cache", + "DawnCache", + "GPUCache", + "GrShaderCache", + "ShaderCache", + path.join("Service Worker", "CacheStorage"), + path.join("Service Worker", "ScriptCache") + ]) { + rmSync(path.join(dataDir, relativePath), { force: true, recursive: true }); + } +} + +export function restoreClaudeAppGatewayConfig(): void { + const backup = readClaudeAppGatewayBackup(); + if (!backup) { + return; + } + + const paths = getClaudeAppGatewayPaths(); + restoreFileSnapshot(paths.rootConfigFile, backup.rootConfigFile); + restoreFileSnapshot(paths.metaFile, backup.metaFile); + restoreFileSnapshot(paths.configLibraryFile, backup.configLibraryFile); + rmSync(CLAUDE_APP_GATEWAY_BACKUP_FILE, { force: true }); +} + +export function readClaudeAppGatewayApiKeyCandidates(): string[] { + return uniqueStrings([ + readClaudeAppGatewayApiKey(getClaudeAppGatewayPaths().configLibraryFile) + ]); +} + +function readClaudeAppGatewayApiKey(file: string): string { + const config = readJsonRecord(file); + return typeof config?.inferenceGatewayApiKey === "string" + ? config.inferenceGatewayApiKey.trim() + : ""; +} + +function uniqueStrings(values: string[]): string[] { + const seen = new Set(); + const result: string[] = []; + for (const value of values) { + const normalized = value.trim(); + if (!normalized || seen.has(normalized)) { + continue; + } + seen.add(normalized); + result.push(normalized); + } + return result; +} + +function ensureClaudeAppGatewayState(config: AppConfig): ClaudeAppApplyState { + const currentApiKey = findReusableApiKey(config); + const gatewayEnabledConfig = config.gateway.enabled + ? config + : { + ...config, + gateway: { + ...config.gateway, + enabled: true + } + }; + + if (currentApiKey) { + return { + apiKey: currentApiKey, + apiKeyGenerated: false, + config: gatewayEnabledConfig + }; + } + + const generatedApiKey: ApiKeyConfig = { + createdAt: new Date().toISOString(), + id: randomUUID(), + key: `ccr-${randomBytes(24).toString("hex")}`, + name: "Claude App" + }; + + return { + apiKey: generatedApiKey.key, + apiKeyGenerated: true, + config: { + ...gatewayEnabledConfig, + APIKEY: generatedApiKey.key, + APIKEYS: [...(Array.isArray(gatewayEnabledConfig.APIKEYS) ? gatewayEnabledConfig.APIKEYS : []), generatedApiKey] + } + }; +} + +function findReusableApiKey(config: AppConfig): string { + const apiKeys = Array.isArray(config.APIKEYS) ? config.APIKEYS : []; + for (const apiKey of apiKeys) { + const key = apiKey.key.trim(); + if (key) { + return key; + } + } + return config.APIKEY.trim(); +} + +function getClaudeAppGatewayPaths(dataDir = getClaudeApp3pDataDir()): ClaudeAppGatewayPaths { + const libraryDir = path.join(dataDir, CLAUDE_APP_CONFIG_LIBRARY_DIR); + return { + configLibraryFile: path.join(libraryDir, `${CLAUDE_APP_CONFIG_ID}.json`), + dataDir, + libraryDir, + metaFile: path.join(libraryDir, CLAUDE_APP_CONFIG_META_FILE), + rootConfigFile: path.join(dataDir, CLAUDE_APP_CONFIG_FILE) + }; +} + +function getClaudeApp3pDataDir(): string { + if (process.platform === "darwin") { + return path.join(appPath("home"), "Library", "Application Support", "Claude-3p"); + } + if (process.platform === "win32") { + const localAppData = process.env.LOCALAPPDATA || path.join(appPath("appData"), "..", "Local"); + return path.join(localAppData, "Claude-3p"); + } + return path.join(appPath("appData") || os.homedir(), "Claude-3p"); +} + +function appPath(name: "appData" | "home"): string { + return resolveRuntimeAppPath(name); +} + +function backupClaudeAppGatewayConfig(paths: ClaudeAppGatewayPaths): void { + if (existsSync(CLAUDE_APP_GATEWAY_BACKUP_FILE)) { + return; + } + + const backup: ClaudeAppGatewayBackup = { + configLibraryFile: readFileSnapshot(paths.configLibraryFile), + createdAt: new Date().toISOString(), + metaFile: readFileSnapshot(paths.metaFile), + rootConfigFile: readFileSnapshot(paths.rootConfigFile), + version: 1 + }; + writeJsonFile(CLAUDE_APP_GATEWAY_BACKUP_FILE, backup); +} + +function readClaudeAppGatewayBackup(): ClaudeAppGatewayBackup | undefined { + try { + const parsed: unknown = JSON.parse(readFileSync(CLAUDE_APP_GATEWAY_BACKUP_FILE, "utf8")); + if (!isPlainRecord(parsed) || parsed.version !== 1) { + return undefined; + } + const rootConfigFile = normalizeFileSnapshot(parsed.rootConfigFile); + const metaFile = normalizeFileSnapshot(parsed.metaFile); + const configLibraryFile = normalizeFileSnapshot(parsed.configLibraryFile); + if (!rootConfigFile || !metaFile || !configLibraryFile) { + return undefined; + } + return { + configLibraryFile, + createdAt: stringValue(parsed.createdAt) || new Date(0).toISOString(), + metaFile, + rootConfigFile, + version: 1 + }; + } catch { + return undefined; + } +} + +function readFileSnapshot(file: string): ClaudeAppGatewayFileSnapshot { + if (!existsSync(file)) { + return { exists: false }; + } + return { + content: readFileSync(file, "utf8"), + exists: true + }; +} + +function normalizeFileSnapshot(value: unknown): ClaudeAppGatewayFileSnapshot | undefined { + if (!isPlainRecord(value) || typeof value.exists !== "boolean") { + return undefined; + } + if (!value.exists) { + return { exists: false }; + } + return typeof value.content === "string" + ? { content: value.content, exists: true } + : undefined; +} + +function restoreFileSnapshot(file: string, snapshot: ClaudeAppGatewayFileSnapshot): void { + if (!snapshot.exists) { + rmSync(file, { force: true }); + return; + } + + mkdirSync(path.dirname(file), { recursive: true }); + writeFileSync(file, snapshot.content ?? "", { encoding: "utf8", mode: 0o600 }); + try { + chmodSync(file, 0o600); + } catch { + // File permissions are best-effort across platforms. + } +} + +function gatewayEndpoint(config: AppConfig): string { + const rawHost = config.gateway.host || config.HOST || "127.0.0.1"; + const host = rawHost.trim() === "0.0.0.0" || rawHost.trim() === "::" ? "127.0.0.1" : rawHost.trim() || "127.0.0.1"; + const formattedHost = host.includes(":") && !host.startsWith("[") ? `[${host}]` : host; + const port = Number.isInteger(config.gateway.port) && config.gateway.port > 0 ? config.gateway.port : config.PORT; + return `http://${formattedHost}:${port}`; +} + +function applyClaudeAppConfigMeta(metaFile: string): void { + const current = readJsonRecord(metaFile); + const entries = normalizeMetaEntries(current?.entries).filter((entry) => entry.id !== CLAUDE_APP_CONFIG_ID); + entries.push({ id: CLAUDE_APP_CONFIG_ID, name: CLAUDE_APP_CONFIG_NAME }); + + writeJsonFile(metaFile, { + ...(current ?? {}), + appliedId: CLAUDE_APP_CONFIG_ID, + entries + }); +} + +function normalizeMetaEntries(value: unknown): Array<{ id: string; name: string }> { + if (!Array.isArray(value)) { + return []; + } + const entries: Array<{ id: string; name: string }> = []; + for (const item of value) { + if (!isPlainRecord(item)) { + continue; + } + const id = stringValue(item.id); + const name = stringValue(item.name); + if (!id) { + continue; + } + entries.push({ id, name: name || "Unnamed" }); + } + return entries; +} + +function applyClaudeAppDeploymentMode(rootConfigFile: string): void { + const current = readJsonRecord(rootConfigFile); + writeJsonFile(rootConfigFile, { + ...(current ?? {}), + deploymentMode: "3p" + }); +} + +function readJsonRecord(file: string): Record | undefined { + try { + const parsed: unknown = JSON.parse(readFileSync(file, "utf8")); + return isPlainRecord(parsed) ? parsed : undefined; + } catch { + return undefined; + } +} + +function writeJsonFile(file: string, value: unknown): void { + mkdirSync(path.dirname(file), { recursive: true }); + writeFileSync(file, `${JSON.stringify(value, null, 2)}\n`, { encoding: "utf8", mode: 0o600 }); + try { + chmodSync(file, 0o600); + } catch { + // File permissions are best-effort across platforms. + } +} + +function isPlainRecord(value: unknown): value is Record { + return Boolean(value) && typeof value === "object" && !Array.isArray(value); +} + +function stringValue(value: unknown): string { + return typeof value === "string" ? value.trim() : ""; +} diff --git a/packages/core/src/agents/claude-app/launch.ts b/packages/core/src/agents/claude-app/launch.ts new file mode 100644 index 0000000..7969edf --- /dev/null +++ b/packages/core/src/agents/claude-app/launch.ts @@ -0,0 +1,477 @@ +import { spawn, type ChildProcess } from "node:child_process"; +import { mkdirSync, readdirSync, readFileSync, statSync } from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import type { AppConfig, ProfileConfig } from "@ccr/core/contracts/app"; +import { botGatewayProfileEnv } from "@ccr/core/agents/bot-gateway/env"; +import { prepareClaudeAppCdpUserDataDir, reserveClaudeAppCdpPort, scheduleClaudeAppDesignCdp } from "@ccr/core/agents/claude-app/cdp"; +import { claudeCodeUtcTimezoneEnvOverride } from "@ccr/core/agents/claude-code/environment"; +import { resolveClaudeCodeSettingsFile } from "@ccr/core/profiles/launch-core"; +import { normalizeWindowsDesktopAppCandidate, windowsDesktopAppCandidates } from "@ccr/core/platform/windows-app-discovery"; + +type ClaudeAppLookupResult = { + checked: string[]; + executable?: string; +}; + +export type ClaudeAppLaunchResult = { + child: ChildProcess; + command: string; + cdpPort?: number; + claudeDesignProxy?: boolean; + pidIsLauncher?: boolean; + pid?: number; + userDataDir: string; +}; + +const macClaudeAppNames = ["Claude.app", "Claude Desktop.app"]; +const windowsClaudeAppDirs = ["Claude", "Claude Desktop", "ClaudeDesktop", "AnthropicClaude"]; +const windowsClaudeExeNames = [ + "Claude.exe", + "claude.exe", + "Claude Desktop.exe", + "ClaudeDesktop.exe", + "AnthropicClaude.exe", + "claude-desktop.exe" +]; +const windowsClaudePackageKeywords = ["claude", "anthropic"]; + +type ClaudeAppCandidateOptions = { + allowGenericExecutable?: boolean; +}; + +export async function launchClaudeAppProfile(configDir: string, profile: ProfileConfig, config?: AppConfig): Promise { + const lookup = findInstalledClaudeAppExecutable(profile.appPath); + if (!lookup.executable) { + throw new Error([ + "Claude App was not found. Install Claude App or set CLAUDE_APP_PATH to its executable, then try again.", + lookup.checked.length ? `Checked: ${lookup.checked.join(", ")}` : "" + ].filter(Boolean).join(" ")); + } + + const settingsFile = resolveClaudeCodeSettingsFile(configDir, profile); + const settingsDir = path.dirname(settingsFile); + const userDataDir = resolveClaudeAppProfileUserDataDir(configDir, profile); + mkdirSync(userDataDir, { recursive: true }); + prepareClaudeAppCdpUserDataDir(userDataDir); + const shouldOpenDesign = shouldOpenClaudeAppDesign(config); + const cdpPort = await reserveClaudeAppCdpPort(console, shouldOpenDesign); + + const appEnv: Record = { + ...profileEnv(profile), + ...claudeCodeModelEnv(profile), + ...(config ? botGatewayProfileEnv(config, profile, "app") : {}), + CLAUDE_CONFIG_DIR: settingsDir, + CLAUDE_USER_DATA_DIR: userDataDir, + CCR_CLAUDE_APP_USER_DATA_PATH: userDataDir, + CCR_PROFILE_SURFACE: "app", + ELECTRON_ENABLE_LOGGING: "1", + ...claudeCodeUtcTimezoneEnvOverride() + }; + const env: NodeJS.ProcessEnv = { + ...process.env, + ...appEnv + }; + delete env.ELECTRON_RUN_AS_NODE; + + const designUrl = claudeAppDesignUrl(config); + const proxyUrl = claudeAppProxyUrl(config); + const launch = claudeAppLaunchCommand(lookup.executable, userDataDir, cdpPort, proxyUrl, appEnv); + const child = spawn(launch.command, launch.args, { + detached: true, + env, + stdio: "ignore" + }); + child.unref(); + scheduleClaudeAppDesignCdp({ + cdpPort, + designUrl, + enabled: shouldOpenDesign, + logger: console + }); + + return { + child, + claudeDesignProxy: Boolean(proxyUrl), + command: launch.command, + ...(cdpPort ? { cdpPort } : {}), + ...(launch.pidIsLauncher ? { pidIsLauncher: launch.pidIsLauncher } : {}), + pid: child.pid, + userDataDir + }; +} + +export function resolveClaudeAppProfileUserDataDir(configDir: string, profile: ProfileConfig): string { + const settingsFile = resolveClaudeCodeSettingsFile(configDir, profile); + return claudeElectronUserDataDir(path.dirname(settingsFile), profile); +} + +function shouldOpenClaudeAppDesign(config: AppConfig | undefined): boolean { + return Boolean(claudeDesignPluginConfig(config)); +} + +function claudeAppDesignUrl(config: AppConfig | undefined): string | undefined { + const plugin = claudeDesignPluginConfig(config); + if (!plugin) { + return undefined; + } + const options = isRecord(plugin.config) ? plugin.config : {}; + const host = typeof options.host === "string" && options.host.trim() ? options.host.trim() : "claude.ai"; + return `https://${host}/design`; +} + +function claudeDesignPluginConfig(config: AppConfig | undefined): AppConfig["plugins"][number] | undefined { + return config?.plugins.find((plugin) => plugin.enabled !== false && plugin.id === "claude-design"); +} + +function claudeAppProxyUrl(config: AppConfig | undefined): string | undefined { + if (!config?.proxy?.enabled) { + return undefined; + } + const port = Number.isInteger(config.gateway?.port) && config.gateway.port > 0 + ? config.gateway.port + : Number.isInteger(config.PORT) && config.PORT > 0 + ? config.PORT + : undefined; + if (!port) { + return undefined; + } + const host = formatLoopbackGatewayHost(config.gateway?.host || "127.0.0.1"); + return `http://${host}:${port}`; +} + +function formatLoopbackGatewayHost(host: string): string { + const trimmed = host.trim(); + if (!trimmed || trimmed === "0.0.0.0" || trimmed === "::" || trimmed === "[::]") { + return "127.0.0.1"; + } + if (trimmed.includes(":") && !trimmed.startsWith("[")) { + return `[${trimmed}]`; + } + return trimmed; +} + +function claudeElectronArgs(userDataDir: string, cdpPort?: number, proxyUrl?: string): string[] { + return [ + ...(cdpPort + ? [ + `--remote-debugging-port=${cdpPort}`, + "--remote-debugging-address=127.0.0.1" + ] + : []), + ...(proxyUrl + ? [ + `--proxy-server=${proxyUrl}`, + "--proxy-bypass-list=localhost;127.0.0.1;[::1]" + ] + : []), + `--user-data-dir=${userDataDir}`, + "--remote-allow-origins=*", + "--disable-renderer-backgrounding", + "--disable-background-timer-throttling", + "--disable-backgrounding-occluded-windows" + ]; +} + +export function claudeAppLaunchCommand( + executable: string, + userDataDir: string, + cdpPort: number | undefined, + proxyUrl: string | undefined, + env: Record +): { args: string[]; command: string; pidIsLauncher?: boolean } { + const args = claudeElectronArgs(userDataDir, cdpPort, proxyUrl); + const appBundle = process.platform === "darwin" ? macAppBundleFromExecutable(executable) : undefined; + if (appBundle) { + return { + args: [ + "-W", + "-n", + ...macOpenEnvArgs(env), + appBundle, + "--args", + ...args + ], + command: "/usr/bin/open", + pidIsLauncher: true + }; + } + return { + args, + command: executable + }; +} + +function macAppBundleFromExecutable(executable: string): string | undefined { + const normalized = path.normalize(executable); + const marker = `${path.sep}Contents${path.sep}MacOS${path.sep}`; + const markerIndex = normalized.lastIndexOf(marker); + if (markerIndex <= 0) { + return undefined; + } + const appBundle = normalized.slice(0, markerIndex); + return appBundle.endsWith(".app") && isDirectory(appBundle) ? appBundle : undefined; +} + +function macOpenEnvArgs(env: Record): string[] { + return Object.entries(env) + .filter(([key, value]) => isEnvName(key) && typeof value === "string") + .flatMap(([key, value]) => ["--env", `${key}=${value}`]); +} + +function claudeElectronUserDataDir(settingsDir: string, profile: ProfileConfig): string { + return path.join( + settingsDir, + ".claude-code-router", + "claude-app-user-data", + sanitizeProfilePathSegment(profile.id || profile.name || "default") || "default" + ); +} + +export function findInstalledClaudeAppExecutable(profileAppPath?: string): ClaudeAppLookupResult { + const checked: string[] = []; + const profileCandidate = findFirstExecutable(profileClaudeAppPathCandidates(profileAppPath), checked, { allowGenericExecutable: true }); + if (profileCandidate) { + return { checked, executable: profileCandidate }; + } + + const envCandidate = findFirstExecutable(envClaudeAppPathCandidates(), checked, { allowGenericExecutable: true }); + if (envCandidate) { + return { checked, executable: envCandidate }; + } + + if (process.platform === "darwin") { + return { checked, executable: findFirstExecutable(macClaudeAppCandidates(), checked) }; + } + if (process.platform === "win32") { + return { checked, executable: findFirstExecutable(windowsClaudeAppCandidates(), checked) }; + } + return { checked, executable: findFirstExecutable(linuxClaudeAppCandidates(), checked) }; +} + +function findFirstExecutable(candidates: string[], checked: string[], options: ClaudeAppCandidateOptions = {}): string | undefined { + for (const candidate of candidates) { + if (!candidate || checked.includes(candidate)) { + continue; + } + checked.push(candidate); + const executable = normalizeClaudeAppCandidate(candidate, options); + if (executable) { + return executable; + } + } + return undefined; +} + +function envClaudeAppPathCandidates(): string[] { + return ["CCR_CLAUDE_APP_PATH", "CLAUDE_APP_PATH"] + .map((key) => process.env[key]?.trim() || "") + .filter(Boolean) + .map(resolveUserPath); +} + +function profileClaudeAppPathCandidates(value: string | undefined): string[] { + const trimmed = value?.trim() || ""; + return trimmed ? [resolveUserPath(trimmed)] : []; +} + +function macClaudeAppCandidates(): string[] { + const roots = [ + "/Applications", + path.join(os.homedir(), "Applications") + ]; + return roots.flatMap((root) => macClaudeAppNames.map((name) => path.join(root, name))); +} + +function windowsClaudeAppCandidates(): string[] { + return windowsDesktopAppCandidates({ + appDirs: windowsClaudeAppDirs, + exeNames: windowsClaudeExeNames, + packageKeywords: windowsClaudePackageKeywords, + vendorDirs: ["Anthropic"], + whereNames: [ + "Claude", + "claude", + "Claude Desktop", + "ClaudeDesktop", + "AnthropicClaude", + "claude-desktop" + ] + }); +} + +function linuxClaudeAppCandidates(): string[] { + return [ + "/usr/bin/claude", + "/usr/bin/claude-desktop", + "/usr/local/bin/claude", + "/usr/local/bin/claude-desktop", + "/opt/Claude/claude", + "/opt/Claude/Claude", + "/opt/Claude Desktop/claude", + "/opt/Claude Desktop/Claude", + "/opt/Claude Desktop/claude-desktop", + "/opt/ClaudeDesktop/ClaudeDesktop", + "/opt/AnthropicClaude/AnthropicClaude" + ]; +} + +export function normalizeClaudeAppCandidate(candidate: string, options: ClaudeAppCandidateOptions = {}): string | undefined { + if (process.platform === "darwin") { + if (candidate.endsWith(".app")) { + return executableFromMacAppBundle(candidate); + } + return isFile(candidate) ? candidate : undefined; + } + if (process.platform === "win32") { + const executable = normalizeWindowsClaudeAppCandidate(candidate); + return executable && isAllowedClaudeAppExecutable(executable, options) ? executable : undefined; + } + return isFile(candidate) && isAllowedClaudeAppExecutable(candidate, options) ? candidate : undefined; +} + +function executableFromMacAppBundle(appPath: string): string | undefined { + if (!isDirectory(appPath)) { + return undefined; + } + const infoPath = path.join(appPath, "Contents", "Info.plist"); + const macosDir = path.join(appPath, "Contents", "MacOS"); + const bundleExecutable = readBundleExecutable(infoPath); + if (bundleExecutable) { + const executable = path.join(macosDir, bundleExecutable); + if (isFile(executable)) { + return executable; + } + } + + const appName = path.basename(appPath, ".app"); + for (const name of [appName, "Claude", "claude"]) { + const executable = path.join(macosDir, name); + if (isFile(executable)) { + return executable; + } + } + + try { + return readdirSync(macosDir) + .map((entry) => path.join(macosDir, entry)) + .find((entry) => isFile(entry)); + } catch { + return undefined; + } +} + +function readBundleExecutable(infoPath: string): string | undefined { + if (!isFile(infoPath)) { + return undefined; + } + try { + const content = readFileSync(infoPath, "utf8"); + return content.match(/CFBundleExecutable<\/key>\s*([^<]+)<\/string>/)?.[1]?.trim(); + } catch { + return undefined; + } +} + +function normalizeWindowsClaudeAppCandidate(candidate: string): string | undefined { + return normalizeWindowsDesktopAppCandidate(candidate, { + exeNames: windowsClaudeExeNames, + packageKeywords: windowsClaudePackageKeywords + }); +} + +function isAllowedClaudeAppExecutable(executable: string, options: ClaudeAppCandidateOptions): boolean { + if (options.allowGenericExecutable || !isGenericClaudeExecutableName(executable)) { + return true; + } + return hasElectronDesktopAppResources(executable); +} + +function isGenericClaudeExecutableName(executable: string): boolean { + const name = path.basename(executable).toLowerCase(); + return name === "claude" || name === "claude.exe"; +} + +function hasElectronDesktopAppResources(executable: string): boolean { + const resourcesDir = path.join(path.dirname(executable), "resources"); + return isFile(path.join(resourcesDir, "app.asar")) || + isDirectory(path.join(resourcesDir, "app")) || + isDirectory(path.join(resourcesDir, "app.asar.unpacked")); +} + +function profileEnv(profile: ProfileConfig): Record { + return Object.entries(profile.env ?? {}).reduce>((result, [key, value]) => { + if (isEnvName(key) && typeof value === "string") { + result[key] = value; + } + return result; + }, {}); +} + +function claudeCodeModelEnv(profile: ProfileConfig): Record { + const env: Record = {}; + const model = normalizeClientModel(profile.model); + if (model) { + env.ANTHROPIC_MODEL = model; + env.CCR_CLAUDE_CODE_MODEL = model; + env.CODEXL_CLAUDE_CODE_MODEL = model; + } + const smallFastModel = normalizeClientModel(profile.smallFastModel); + if (smallFastModel) { + env.ANTHROPIC_SMALL_FAST_MODEL = smallFastModel; + } + return env; +} + +function normalizeClientModel(value: string | undefined): string { + const trimmed = value?.trim() || ""; + if (!trimmed) { + return ""; + } + const commaIndex = trimmed.indexOf(","); + if (commaIndex > 0 && commaIndex < trimmed.length - 1) { + const provider = trimmed.slice(0, commaIndex).trim(); + const model = trimmed.slice(commaIndex + 1).trim(); + return provider && model ? `${provider}/${model}` : ""; + } + return trimmed; +} + +function isEnvName(value: string): boolean { + return /^[A-Za-z_][A-Za-z0-9_]*$/.test(value); +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function sanitizeProfilePathSegment(value: string): string { + return value.trim().replace(/[^a-zA-Z0-9_.-]+/g, "-").replace(/^-+|-+$/g, ""); +} + +function resolveUserPath(value: string): string { + const trimmed = value.trim(); + if (trimmed === "~") { + return os.homedir(); + } + if (trimmed.startsWith("~/") || trimmed.startsWith("~\\")) { + return path.join(os.homedir(), trimmed.slice(2)); + } + return path.resolve(trimmed); +} + +function isFile(file: string): boolean { + try { + return statSync(file).isFile(); + } catch { + return false; + } +} + +function isDirectory(file: string): boolean { + try { + return statSync(file).isDirectory(); + } catch { + return false; + } +} diff --git a/packages/core/src/agents/claude-code/environment.ts b/packages/core/src/agents/claude-code/environment.ts new file mode 100644 index 0000000..33ed526 --- /dev/null +++ b/packages/core/src/agents/claude-code/environment.ts @@ -0,0 +1,39 @@ +export const CLAUDE_CODE_MCP_CONFIG_ENV = "CCR_CLAUDE_CODE_MCP_CONFIG"; +export const CODEXL_CLAUDE_CODE_MCP_CONFIG_ENV = "CODEXL_CLAUDE_CODE_MCP_CONFIG"; + +const chinaTimeZones = new Set([ + "asia/chongqing", + "asia/chungking", + "asia/harbin", + "asia/kashgar", + "asia/shanghai", + "asia/urumqi", + "china standard time", + "prc" +]); + +export function claudeCodeMcpConfigEnv(configFile: string | undefined): Record { + return configFile + ? { + [CLAUDE_CODE_MCP_CONFIG_ENV]: configFile, + [CODEXL_CLAUDE_CODE_MCP_CONFIG_ENV]: configFile + } + : {}; +} + +export function claudeCodeUtcTimezoneEnvOverride(timeZone = currentTimeZone()): Record { + return isChinaTimeZone(timeZone) ? { TZ: "UTC" } : {}; +} + +export function currentTimeZone(): string | undefined { + try { + return Intl.DateTimeFormat().resolvedOptions().timeZone; + } catch { + return undefined; + } +} + +export function isChinaTimeZone(timeZone: string | undefined): boolean { + const normalized = timeZone?.trim().toLowerCase(); + return Boolean(normalized && chinaTimeZones.has(normalized)); +} diff --git a/packages/core/src/agents/codex/app-launch.ts b/packages/core/src/agents/codex/app-launch.ts new file mode 100644 index 0000000..316f209 --- /dev/null +++ b/packages/core/src/agents/codex/app-launch.ts @@ -0,0 +1,617 @@ +import { spawn, type ChildProcess } from "node:child_process"; +import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, unlinkSync, writeFileSync } from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import type { AppConfig, ProfileConfig } from "@ccr/core/contracts/app"; +import { botGatewayProfileEnv } from "@ccr/core/agents/bot-gateway/env"; +import { codexModelCatalogJson } from "@ccr/core/agents/codex/model-catalog"; +import { buildProfileLaunchPlan, resolveCodexConfigFile } from "@ccr/core/profiles/launch-core"; +import { normalizeWindowsDesktopAppCandidate, windowsDesktopAppCandidates } from "@ccr/core/platform/windows-app-discovery"; +import { writeZcodeGatewayConfig, zcodeHomeFromConfigFile } from "@ccr/core/agents/zcode/profile-config"; + +export type CodexAppLookupResult = { + checked: string[]; + executable?: string; +}; + +type CodexCompatibleAppKind = "codex" | "zcode"; + +type CodexCompatibleAppSpec = { + bundledCliNames: string[]; + defaultCliCommand: string; + displayName: string; + envPathKeys: string[]; + kind: CodexCompatibleAppKind; + linuxCandidates: string[]; + macAppNames: string[]; + modelCatalogFilename: string; + userDataDirName: string; + windowsAppDirs: string[]; + windowsExeNames: string[]; + windowsPackageKeywords: string[]; + windowsVendorDirs: string[]; + windowsWhereNames: string[]; +}; + +export type CodexAppLaunchResult = { + child: ChildProcess; + command: string; + pidIsLauncher?: boolean; + pid?: number; + userDataDir: string; +}; + +export type CodexCompatibleAppModelCatalogWriteResult = { + changed: boolean; + file: string; + userDataDir: string; +}; + +export const codexDesktopAppName = "ChatGPT"; + +const codexAppSpec: CodexCompatibleAppSpec = { + bundledCliNames: ["codex", "Codex", "OpenAI Codex"], + defaultCliCommand: "codex", + displayName: codexDesktopAppName, + envPathKeys: ["CCR_CHATGPT_APP_PATH", "CHATGPT_APP_PATH", "CODEXL_CHATGPT_PATH", "CCR_CODEX_APP_PATH", "CODEX_APP_PATH", "CODEXL_CODEX_PATH"], + kind: "codex", + linuxCandidates: [ + "/opt/ChatGPT/chatgpt", + "/opt/ChatGPT/ChatGPT", + "/opt/OpenAI ChatGPT/chatgpt", + "/opt/OpenAI ChatGPT/ChatGPT", + "/usr/local/bin/chatgpt-app", + "/usr/bin/chatgpt-app", + "/opt/Codex/codex", + "/opt/Codex/Codex", + "/opt/OpenAI Codex/codex", + "/opt/OpenAI Codex/Codex", + "/usr/local/bin/codex-app", + "/usr/bin/codex-app" + ], + macAppNames: ["ChatGPT.app", "OpenAI ChatGPT.app", "Codex.app", "OpenAI Codex.app"], + modelCatalogFilename: "ccr-codex-model-catalog.json", + userDataDirName: "codex-app-user-data", + windowsAppDirs: ["ChatGPT", "OpenAI ChatGPT", "OpenAIChatGPT", "Codex", "OpenAI Codex", "OpenAICodex"], + windowsExeNames: [ + "ChatGPT.exe", + "chatgpt.exe", + "OpenAI ChatGPT.exe", + "OpenAIChatGPT.exe", + "OpenAIChatGPTApp.exe", + "chatgpt-app.exe", + "openai-chatgpt.exe", + "Codex.exe", + "codex.exe", + "OpenAI Codex.exe", + "OpenAICodex.exe", + "OpenAICodexApp.exe", + "codex-app.exe", + "openai-codex.exe" + ], + windowsPackageKeywords: ["chatgpt", "openaichatgpt", "codex", "openaicodex"], + windowsVendorDirs: ["OpenAI"], + windowsWhereNames: [ + "ChatGPT", + "chatgpt", + "OpenAI ChatGPT", + "OpenAIChatGPT", + "OpenAIChatGPTApp", + "chatgpt-app", + "openai-chatgpt", + "Codex", + "codex", + "OpenAI Codex", + "OpenAICodex", + "OpenAICodexApp", + "codex-app", + "openai-codex" + ] +}; + +const zcodeAppSpec: CodexCompatibleAppSpec = { + bundledCliNames: ["glm/zcode.cjs", "zcode", "ZCode", "Z Code", "z-code", "zai-code", "codex", "Codex"], + defaultCliCommand: "zcode", + displayName: "ZCode App", + envPathKeys: ["CCR_ZCODE_APP_PATH", "ZCODE_APP_PATH", "CODEXL_ZCODE_PATH"], + kind: "zcode", + linuxCandidates: [ + "/opt/ZCode/zcode", + "/opt/ZCode/ZCode", + "/opt/Z Code/zcode", + "/opt/Z.AI Code/zcode", + "/usr/local/bin/zcode", + "/usr/bin/zcode", + "/usr/local/bin/z-code", + "/usr/bin/z-code", + "/usr/local/bin/zai-code", + "/usr/bin/zai-code" + ], + macAppNames: ["ZCode.app", "Z Code.app", "Z.AI Code.app", "ZAI Code.app"], + modelCatalogFilename: "ccr-zcode-model-catalog.json", + userDataDirName: "zcode-app-user-data", + windowsAppDirs: ["ZCode", "Z Code", "ZAI Code", "Z.AI Code", "Zhipu ZCode"], + windowsExeNames: [ + "ZCode.exe", + "zcode.exe", + "Z Code.exe", + "ZAI Code.exe", + "ZAICode.exe", + "z-code.exe", + "zai-code.exe" + ], + windowsPackageKeywords: ["zcode", "z-code", "zaicode", "zai-code"], + windowsVendorDirs: ["ZCode", "Z.AI", "ZAI", "Zhipu", "ZhipuAI"], + windowsWhereNames: [ + "ZCode", + "zcode", + "Z Code", + "ZAI Code", + "ZAICode", + "z-code", + "zai-code" + ] +}; + +export function launchCodexAppProfile(configDir: string, profile: ProfileConfig, config?: AppConfig): CodexAppLaunchResult { + return launchCodexCompatibleAppProfile(configDir, profile, codexAppSpec, config); +} + +export function findInstalledCodexAppExecutable(profileAppPath?: string): CodexAppLookupResult { + return findInstalledCodexCompatibleAppExecutable(codexAppSpec, profileAppPath); +} + +export function findInstalledZcodeAppExecutable(profileAppPath?: string): CodexAppLookupResult { + return findInstalledCodexCompatibleAppExecutable(zcodeAppSpec, profileAppPath); +} + +export function launchZcodeAppProfile(configDir: string, profile: ProfileConfig, config?: AppConfig): CodexAppLaunchResult { + return launchCodexCompatibleAppProfile(configDir, profile, zcodeAppSpec, config); +} + +export function refreshCodexCompatibleAppProfileFiles( + configDir: string, + profile: ProfileConfig, + config?: AppConfig +): { modelCatalogChanged: boolean; modelCatalogFile: string; userDataDir: string } { + const spec = profile.agent === "zcode" ? zcodeAppSpec : codexAppSpec; + if (spec.kind === "zcode" && config?.APIKEY) { + writeZcodeGatewayConfig(config, profile, config.APIKEY, { backup: false }); + } + const modelCatalog = writeCodexCompatibleAppModelCatalog(configDir, profile, config); + return { + modelCatalogChanged: modelCatalog.changed, + modelCatalogFile: modelCatalog.file, + userDataDir: modelCatalog.userDataDir + }; +} + +export function writeCodexCompatibleAppModelCatalog( + configDir: string, + profile: ProfileConfig, + config?: AppConfig +): CodexCompatibleAppModelCatalogWriteResult { + const spec = profile.agent === "zcode" ? zcodeAppSpec : codexAppSpec; + const configFile = resolveCodexConfigFile(configDir, profile); + const codexHome = codexCompatibleHomeFromConfigFile(spec, configFile); + if (spec.kind === "codex") { + removeLegacyCodexVirtualAuthMarker(codexHome); + } + const userDataDir = codexElectronUserDataDir(codexHome, profile, spec); + mkdirSync(userDataDir, { recursive: true }); + const file = codexAppModelCatalogFile(userDataDir, spec); + const content = codexModelCatalogJson(config, profile.model); + const previous = existsSync(file) ? readFileSync(file, "utf8") : undefined; + if (previous !== content) { + writeFileSync(file, content, "utf8"); + } + return { changed: previous !== content, file, userDataDir }; +} + +export function removeLegacyCodexVirtualAuthMarker(codexHome: string): boolean { + const authFile = path.join(codexHome, "auth.json"); + if (!isFile(authFile)) { + return false; + } + try { + const value = JSON.parse(readFileSync(authFile, "utf8")) as Record; + const keys = Object.keys(value).sort(); + if ( + keys.length !== 2 || + keys[0] !== "OPENAI_API_KEY" || + keys[1] !== "auth_mode" || + value.auth_mode !== "apikey" || + value.OPENAI_API_KEY !== "ccr-local-profile" + ) { + return false; + } + unlinkSync(authFile); + return true; + } catch { + return false; + } +} + +function launchCodexCompatibleAppProfile( + configDir: string, + profile: ProfileConfig, + spec: CodexCompatibleAppSpec, + config?: AppConfig +): CodexAppLaunchResult { + const lookup = findInstalledCodexCompatibleAppExecutable(spec, profile.appPath); + if (!lookup.executable) { + throw new Error([ + `${spec.displayName} was not found. Install ${spec.displayName} or set ${spec.envPathKeys[1]} to its executable, then try again.`, + lookup.checked.length ? `Checked: ${lookup.checked.join(", ")}` : "" + ].filter(Boolean).join(" ")); + } + + const plan = buildProfileLaunchPlan(configDir, profile, "app"); + if (path.isAbsolute(plan.command) && !existsSync(plan.command)) { + throw new Error(`Profile launcher was not found: ${plan.command}. Re-save the profile and try again.`); + } + + const configFile = resolveCodexConfigFile(configDir, profile); + const codexHome = codexCompatibleHomeFromConfigFile(spec, configFile); + const { modelCatalogFile, userDataDir } = refreshCodexCompatibleAppProfileFiles(configDir, profile, config); + + const appEnv: Record = { + ...plan.env, + ...(config ? botGatewayProfileEnv(config, profile, "app") : {}), + ...codexProfileEnv(profile, lookup.executable, spec), + CODEXL_PROFILE_SURFACE: "app", + CCR_PROFILE_SURFACE: "app", + ...codexAppAgentEnv(spec, plan.command, codexHome, userDataDir, modelCatalogFile), + ELECTRON_ENABLE_LOGGING: "1" + }; + const env: NodeJS.ProcessEnv = { + ...process.env, + ...appEnv + }; + delete env.ELECTRON_RUN_AS_NODE; + delete env.CCR_CODEX_MODEL_CATALOG_B64; + delete env.CODEXL_CODEX_MODEL_CATALOG_B64; + delete env.CCR_ZCODE_MODEL_CATALOG_B64; + delete env.CODEXL_ZCODE_MODEL_CATALOG_B64; + sanitizeCodexCompatibleAppEnv(env, spec.kind); + + const launch = codexAppLaunchCommand(lookup.executable, userDataDir); + const child = spawn(launch.command, launch.args, { + detached: true, + env, + stdio: "ignore" + }); + child.unref(); + + return { + child, + command: launch.command, + pidIsLauncher: launch.pidIsLauncher, + pid: child.pid, + userDataDir + }; +} + +function codexProfileEnv(profile: ProfileConfig, appExecutable: string, spec: CodexCompatibleAppSpec): Record { + const providerId = sanitizeCodexProviderId(profile.providerId || "") || "claude-code-router"; + const realCliPath = profile.codexCliPath?.trim() || bundledCodexCliPath(appExecutable, spec) || spec.defaultCliCommand; + const remoteFrontendMode = normalizeCodexRemoteFrontendMode(profile.remoteFrontendMode); + if (spec.kind === "zcode") { + return { + ...(profile.model.trim() ? { CCR_ZCODE_MODEL: profile.model.trim() } : {}), + CCR_ZCODE_MODEL_PROVIDER: providerId, + CCR_ZCODE_PROFILE: providerId, + CCR_ZCODE_REMOTE_FRONTEND_MODE: remoteFrontendMode, + CCR_REAL_ZCODE_CLI_PATH: realCliPath, + CODEXL_REAL_ZCODE_CLI_PATH: realCliPath, + CODEXL_ZCODE_CORE_MODE: remoteFrontendMode, + CODEXL_ZCODE_MODEL_PROVIDER: providerId, + CODEXL_ZCODE_PROFILE: providerId, + CODEXL_ZCODE_WORKSPACE_NAME: profile.name || providerId + }; + } + return { + ...(profile.model.trim() ? { CCR_CODEX_MODEL: profile.model.trim() } : {}), + ...(process.env.CCR_CODEX_CLI_MIDDLEWARE_LOG?.trim() + ? { CCR_CODEX_CLI_MIDDLEWARE_LOG: process.env.CCR_CODEX_CLI_MIDDLEWARE_LOG.trim() } + : {}), + CCR_CODEX_MODEL_PROVIDER: providerId, + CCR_CODEX_PROFILE: providerId, + CCR_CODEX_REMOTE_FRONTEND_MODE: remoteFrontendMode, + CCR_REAL_CODEX_CLI_PATH: realCliPath, + CODEXL_CODEX_CORE_MODE: remoteFrontendMode, + CODEXL_CODEX_MODEL_PROVIDER: providerId, + CODEXL_CODEX_PROFILE: providerId, + CODEXL_CODEX_WORKSPACE_NAME: profile.name || providerId, + CODEXL_REAL_CODEX_CLI_PATH: realCliPath + }; +} + +function codexAppAgentEnv( + spec: CodexCompatibleAppSpec, + launcher: string, + home: string, + userDataDir: string, + modelCatalogFile: string +): Record { + return spec.kind === "zcode" + ? { + CCR_ZCODE_MODEL_CATALOG_FILE: modelCatalogFile, + CODEXL_ZCODE_MODEL_CATALOG_FILE: modelCatalogFile, + ZCODE_CLI_PATH: launcher, + ZCODE_ELECTRON_USER_DATA_PATH: userDataDir, + ZCODE_HOME: home, + ZCODE_STORAGE_DIR: home + } + : { + CCR_CODEX_MODEL_CATALOG_FILE: modelCatalogFile, + CODEX_CLI_PATH: launcher, + CODEX_ELECTRON_USER_DATA_PATH: userDataDir, + CODEX_HOME: home, + CODEXL_CODEX_MODEL_CATALOG_FILE: modelCatalogFile + }; +} + +function sanitizeCodexCompatibleAppEnv(env: NodeJS.ProcessEnv, kind: CodexCompatibleAppKind): void { + const blockedPrefixes = kind === "zcode" ? ["CCR_CODEX_", "CODEXL_CODEX_"] : ["CCR_ZCODE_", "CODEXL_ZCODE_"]; + for (const key of Object.keys(env)) { + if (blockedPrefixes.some((prefix) => key.startsWith(prefix))) { + delete env[key]; + } + } + if (kind === "zcode") { + delete env.CODEX_CLI_PATH; + delete env.CODEX_ELECTRON_USER_DATA_PATH; + delete env.CODEX_HOME; + return; + } + delete env.ZCODE_CLI_PATH; + delete env.ZCODE_ELECTRON_USER_DATA_PATH; + delete env.ZCODE_HOME; + delete env.ZCODE_STORAGE_DIR; +} + +function bundledCodexCliPath(appExecutable: string, spec: CodexCompatibleAppSpec): string | undefined { + if (process.platform === "darwin") { + const appBundle = macAppBundleFromExecutable(appExecutable); + if (!appBundle) { + return undefined; + } + for (const name of spec.bundledCliNames) { + const candidate = path.join(appBundle, "Contents", "Resources", name); + if (isFile(candidate)) { + return candidate; + } + } + return undefined; + } + + if (process.platform === "win32") { + const appDir = path.dirname(appExecutable); + const resourceDir = path.join(appDir, "resources"); + for (const name of spec.windowsExeNames) { + const candidate = path.join(resourceDir, name); + if (isFile(candidate)) { + return candidate; + } + } + } + + return undefined; +} + +function codexElectronArgs(userDataDir: string): string[] { + return [ + "--remote-debugging-port=0", + `--user-data-dir=${userDataDir}`, + "--remote-allow-origins=*", + "--disable-renderer-backgrounding", + "--disable-background-timer-throttling", + "--disable-backgrounding-occluded-windows" + ]; +} + +function codexAppLaunchCommand(executable: string, userDataDir: string): { args: string[]; command: string; pidIsLauncher?: boolean } { + return { + command: executable, + args: codexElectronArgs(userDataDir) + }; +} + +function macAppBundleFromExecutable(executable: string): string | undefined { + const marker = ".app/Contents/MacOS/"; + const index = executable.indexOf(marker); + if (index < 0) { + return undefined; + } + const appBundle = executable.slice(0, index + ".app".length); + return isDirectory(appBundle) ? appBundle : undefined; +} + +function codexElectronUserDataDir(codexHome: string, profile: ProfileConfig, spec: CodexCompatibleAppSpec): string { + return path.join( + codexHome, + ".claude-code-router", + spec.userDataDirName, + sanitizeProfilePathSegment(profile.id || profile.name || "default") || "default" + ); +} + +function codexAppModelCatalogFile(userDataDir: string, spec: CodexCompatibleAppSpec): string { + return path.join(userDataDir, spec.modelCatalogFilename); +} + +function codexCompatibleHomeFromConfigFile(spec: CodexCompatibleAppSpec, configFile: string): string { + return spec.kind === "zcode" ? zcodeHomeFromConfigFile(configFile) : path.dirname(configFile); +} + +function findInstalledCodexCompatibleAppExecutable(spec: CodexCompatibleAppSpec, profileAppPath?: string): CodexAppLookupResult { + const checked: string[] = []; + const profileCandidate = findFirstExecutable(profileCodexAppPathCandidates(profileAppPath), checked, spec); + if (profileCandidate) { + return { checked, executable: profileCandidate }; + } + + const envCandidate = findFirstExecutable(envCodexAppPathCandidates(spec), checked, spec); + if (envCandidate) { + return { checked, executable: envCandidate }; + } + + if (process.platform === "darwin") { + return { checked, executable: findFirstExecutable(macCodexAppCandidates(spec), checked, spec) }; + } + if (process.platform === "win32") { + return { checked, executable: findFirstExecutable(windowsCodexAppCandidates(spec), checked, spec) }; + } + return { checked, executable: findFirstExecutable(linuxCodexAppCandidates(spec), checked, spec) }; +} + +function findFirstExecutable(candidates: string[], checked: string[], spec: CodexCompatibleAppSpec): string | undefined { + for (const candidate of candidates) { + if (!candidate || checked.includes(candidate)) { + continue; + } + checked.push(candidate); + const executable = normalizeCodexAppCandidate(candidate, spec); + if (executable) { + return executable; + } + } + return undefined; +} + +function envCodexAppPathCandidates(spec: CodexCompatibleAppSpec): string[] { + return spec.envPathKeys + .map((key) => process.env[key]?.trim() || "") + .filter(Boolean) + .map(resolveUserPath); +} + +function profileCodexAppPathCandidates(value: string | undefined): string[] { + const trimmed = value?.trim() || ""; + return trimmed ? [resolveUserPath(trimmed)] : []; +} + +function macCodexAppCandidates(spec: CodexCompatibleAppSpec): string[] { + const roots = [ + "/Applications", + path.join(os.homedir(), "Applications") + ]; + return roots.flatMap((root) => spec.macAppNames.map((name) => path.join(root, name))); +} + +function windowsCodexAppCandidates(spec: CodexCompatibleAppSpec): string[] { + return windowsDesktopAppCandidates({ + appDirs: spec.windowsAppDirs, + exeNames: spec.windowsExeNames, + packageKeywords: spec.windowsPackageKeywords, + vendorDirs: spec.windowsVendorDirs, + whereNames: spec.windowsWhereNames + }); +} + +function linuxCodexAppCandidates(spec: CodexCompatibleAppSpec): string[] { + return spec.linuxCandidates; +} + +function normalizeCodexAppCandidate(candidate: string, spec: CodexCompatibleAppSpec): string | undefined { + if (process.platform === "darwin") { + if (candidate.endsWith(".app")) { + return executableFromMacAppBundle(candidate, spec); + } + return isFile(candidate) ? candidate : undefined; + } + if (process.platform === "win32") { + return normalizeWindowsCodexAppCandidate(candidate, spec); + } + return isFile(candidate) ? candidate : undefined; +} + +function executableFromMacAppBundle(appPath: string, spec: CodexCompatibleAppSpec): string | undefined { + if (!isDirectory(appPath)) { + return undefined; + } + const infoPath = path.join(appPath, "Contents", "Info.plist"); + const macosDir = path.join(appPath, "Contents", "MacOS"); + const bundleExecutable = readBundleExecutable(infoPath); + if (bundleExecutable) { + const executable = path.join(macosDir, bundleExecutable); + if (isFile(executable)) { + return executable; + } + } + + const appName = path.basename(appPath, ".app"); + for (const name of [appName, ...spec.bundledCliNames]) { + const executable = path.join(macosDir, name); + if (isFile(executable)) { + return executable; + } + } + + try { + return readdirSync(macosDir) + .map((entry) => path.join(macosDir, entry)) + .find((entry) => isFile(entry)); + } catch { + return undefined; + } +} + +function readBundleExecutable(infoPath: string): string | undefined { + if (!isFile(infoPath)) { + return undefined; + } + try { + const content = readFileSync(infoPath, "utf8"); + return content.match(/CFBundleExecutable<\/key>\s*([^<]+)<\/string>/)?.[1]?.trim(); + } catch { + return undefined; + } +} + +function normalizeWindowsCodexAppCandidate(candidate: string, spec: CodexCompatibleAppSpec): string | undefined { + return normalizeWindowsDesktopAppCandidate(candidate, { + exeNames: spec.windowsExeNames, + packageKeywords: spec.windowsPackageKeywords + }); +} + +function normalizeCodexRemoteFrontendMode(value: ProfileConfig["remoteFrontendMode"]): "app" | "cli" | "claude-code" { + return value === "cli" || value === "claude-code" ? value : "app"; +} + +function sanitizeCodexProviderId(value: string): string { + return value.trim().replace(/[^a-zA-Z0-9_.-]+/g, "-").replace(/^-+|-+$/g, ""); +} + +function sanitizeProfilePathSegment(value: string): string { + return value.trim().replace(/[^a-zA-Z0-9_.-]+/g, "-").replace(/^-+|-+$/g, ""); +} + +function resolveUserPath(value: string): string { + const trimmed = value.trim(); + if (trimmed === "~") { + return os.homedir(); + } + if (trimmed.startsWith("~/") || trimmed.startsWith("~\\")) { + return path.join(os.homedir(), trimmed.slice(2)); + } + return path.resolve(trimmed); +} + +function isFile(file: string): boolean { + try { + return statSync(file).isFile(); + } catch { + return false; + } +} + +function isDirectory(file: string): boolean { + try { + return statSync(file).isDirectory(); + } catch { + return false; + } +} diff --git a/packages/core/src/agents/codex/cli-middleware-runtime.ts b/packages/core/src/agents/codex/cli-middleware-runtime.ts new file mode 100644 index 0000000..74ddc63 --- /dev/null +++ b/packages/core/src/agents/codex/cli-middleware-runtime.ts @@ -0,0 +1,4641 @@ +export function codexCliMiddlewareRuntimeScript(): string { + return String.raw`#!/usr/bin/env node +"use strict"; + +const childProcess = require("node:child_process"); +const crypto = require("node:crypto"); +const fs = require("node:fs"); +const os = require("node:os"); +const path = require("node:path"); +const readline = require("node:readline"); +const { pathToFileURL } = require("node:url"); + +const VERSION = "3.0.0"; +const DEFAULT_MODEL = "claude-sonnet-4-5"; +const PROTOCOL_VERSION = "2025-06-18"; +const BOT_SESSION_ENTRY_VERSION = 2; +const REQUEST_TIMEOUT_MS = numberEnv("CCR_CODEX_APP_REQUEST_TIMEOUT_MS", 10 * 60 * 1000); +const TURN_IDLE_TIMEOUT_MS = numberEnv("CCR_CODEX_CLAUDE_TURN_IDLE_TIMEOUT_MS", 10 * 60 * 1000); +const CONFIG_DIR = resolveConfigDir(); +const LOG_PATH = process.env.CCR_CODEX_CLI_MIDDLEWARE_LOG || ""; +const CLAUDE_CODE_MCP_CONFIG_ENV = "CCR_CLAUDE_CODE_MCP_CONFIG"; +const CODEXL_CLAUDE_CODE_MCP_CONFIG_ENV = "CODEXL_CLAUDE_CODE_MCP_CONFIG"; +const CLAUDE_CODE_CHINA_TIME_ZONES = new Set([ + "asia/chongqing", + "asia/chungking", + "asia/harbin", + "asia/kashgar", + "asia/shanghai", + "asia/urumqi", + "china standard time", + "prc" +]); +const ACCOUNT_REMOTE_PLUGIN_MARKETPLACE_KINDS = new Set([ + "created-by-me-remote", + "shared-with-me", + "workspace-directory" +]); +let BOT_BRIDGE_INSTANCE = null; + +function claudeCodeUtcTimezoneEnvOverride() { + return isClaudeCodeChinaTimeZone(currentTimeZone()) ? { TZ: "UTC" } : {}; +} + +function currentTimeZone() { + try { + return Intl.DateTimeFormat().resolvedOptions().timeZone; + } catch { + return ""; + } +} + +function isClaudeCodeChinaTimeZone(timeZone) { + const normalized = String(timeZone || "").trim().toLowerCase(); + return Boolean(normalized && CLAUDE_CODE_CHINA_TIME_ZONES.has(normalized)); +} + +function resolveConfigDir() { + const configured = nonEmptyEnv("CODEXL_HOME") || nonEmptyEnv("CCR_CONFIG_DIR"); + if (configured) { + return expandHome(configured); + } + if (process.platform === "win32") { + const appData = process.env.APPDATA || process.env.LOCALAPPDATA || path.join(os.homedir(), "AppData", "Roaming"); + const current = path.join(appData, "claude-code-router"); + const legacy = path.join(appData, "Claude Code Router"); + return fs.existsSync(current) || !fs.existsSync(legacy) ? current : legacy; + } + return path.join(os.homedir(), ".claude-code-router"); +} + +function botBridge() { + if (!BOT_BRIDGE_INSTANCE) { + BOT_BRIDGE_INSTANCE = createBotGatewayBridge(); + } + return BOT_BRIDGE_INSTANCE; +} + +async function main() { + const args = directProfileDispatchArgs(process.argv.slice(2)); + if (process.env.CCR_CLAUDE_CODE_BOT_WORKER === "1" || args[0] === "claude-bot-worker") { + await runClaudeCodeBotWorker(args); + return; + } + if (process.env.CCR_CLAUDE_CODE_WRAPPER === "1") { + await runClaudeCodeCliWrapper(args); + return; + } + if (shouldRunClaudeCodeAppServer(args)) { + await runClaudeCodeAppServer(args); + return; + } + await runCodexCliMiddleware(args.length === 0 ? defaultCodexArgs() : args); +} + +function directProfileDispatchArgs(args) { + if (process.env.CCR_CLI_DIRECT_PROFILE_DISPATCH !== "1") { + return args; + } + const forwarded = args.slice(1); + if (forwarded[0] === "cli" || forwarded[0] === "--cli") { + forwarded.shift(); + } + if (forwarded[0] === "--") { + forwarded.shift(); + } + return forwarded; +} + +async function runClaudeCodeCliWrapper(args) { + const realCli = expandHome(nonEmptyEnv("CCR_REAL_CLAUDE_CODE_BIN") || nonEmptyEnv("CCR_CLAUDE_CODE_BIN") || nonEmptyEnv("CODEXL_CLAUDE_CODE_BIN") || "claude"); + const realArgs = claudeCodeCliWrapperArgs(args); + log("claude_code_wrapper_start", { realCli, args, realArgs }); + const captureStdout = shouldCaptureClaudeCodeCliStdout(args); + const remoteSync = createRemoteSyncClient({ + args, + cwd: process.cwd(), + mode: "claude-cli", + title: nonEmptyEnv("CCR_REMOTE_SYNC_PROFILE_NAME") || "Claude Code" + }); + const injectRemoteStdin = boolEnv("CCR_REMOTE_SYNC_INJECT_STDIN"); + const child = spawnAgentCli(realCli, realArgs, { + env: { + ...withoutKeys(process.env, ["CCR_CLAUDE_CODE_WRAPPER", "CCR_REAL_CLAUDE_CODE_BIN"]), + ...claudeCodeUtcTimezoneEnvOverride() + }, + stdio: [injectRemoteStdin ? "pipe" : "inherit", captureStdout ? "pipe" : "inherit", "inherit"] + }); + if (injectRemoteStdin && child.stdin) { + process.stdin.pipe(child.stdin); + } + remoteSync.start((event) => { + const text = remoteEventText(event); + if (!text) return; + if (injectRemoteStdin && child.stdin && !child.killed) { + child.stdin.write(text + "\n"); + return; + } + if (boolEnv("CCR_REMOTE_SYNC_NOTIFY_INBOUND") || !process.env.CCR_REMOTE_SYNC_NOTIFY_INBOUND) { + process.stdout.write("\n[CCR remote] " + text + "\n"); + } + }); + child.on("error", (error) => { + log("claude_code_wrapper_spawn_error", { error: formatError(error) }); + process.stderr.write("Failed to start " + realCli + ": " + formatError(error) + "\n"); + remoteSync.postEvent("claude.spawn.error", { error: formatError(error) }, { direction: "system" }); + }); + let pending = ""; + if (captureStdout && child.stdout) { + child.stdout.on("data", (chunk) => { + process.stdout.write(chunk); + pending += chunk.toString("utf8"); + const lines = pending.split(/\r?\n/g); + pending = lines.pop() || ""; + for (const line of lines) { + botBridge().handleClaudeCliLine(line); + remoteSync.postEvent("claude.stdout", { line }, { text: line }); + } + }); + } + const code = await waitForChild(child); + if (captureStdout && pending.trim()) { + botBridge().handleClaudeCliLine(pending); + remoteSync.postEvent("claude.stdout", { line: pending }, { text: pending }); + } + await remoteSync.postEvent("claude.exit", { code }, { direction: "system" }); + remoteSync.stop(); + log("claude_code_wrapper_exit", { code }); + process.exitCode = code; +} + +function claudeCodeCliWrapperArgs(args) { + const modelArgs = claudeCodeArgsWithModel(args); + return claudeCodeArgsWithMcpConfig(modelArgs, process.env); +} + +function claudeCodeArgsWithModel(args) { + const model = nonEmptyEnv("CCR_CLAUDE_CODE_MODEL") || nonEmptyEnv("CODEXL_CLAUDE_CODE_MODEL") || nonEmptyEnv("ANTHROPIC_MODEL"); + if (!model || claudeCodeArgsHaveModel(args) || claudeCodeArgsShouldSkipModelInjection(args)) { + return args; + } + return ["--model", model, ...args]; +} + +function claudeCodeArgsWithMcpConfig(args, env) { + const mcpConfig = nonEmptyEnvFrom(env, CLAUDE_CODE_MCP_CONFIG_ENV) || nonEmptyEnvFrom(env, CODEXL_CLAUDE_CODE_MCP_CONFIG_ENV); + if (!mcpConfig || claudeCodeArgsHaveMcpConfig(args) || claudeCodeArgsShouldSkipModelInjection(args)) { + return args; + } + return ["--mcp-config", mcpConfig, ...args]; +} + +function claudeCodeArgsHaveModel(args) { + for (const arg of args) { + if (arg === "--model" || arg === "-m" || arg.startsWith("--model=")) { + return true; + } + } + return false; +} + +function claudeCodeArgsHaveMcpConfig(args) { + for (const arg of args) { + if (arg === "--mcp-config" || arg.startsWith("--mcp-config=")) { + return true; + } + } + return false; +} + +function claudeCodeArgsShouldSkipModelInjection(args) { + if (args.some((arg) => arg === "--help" || arg === "-h" || arg === "--version" || arg === "-v")) { + return true; + } + const command = firstClaudeCodePositionalArg(args); + return Boolean(command && new Set([ + "config", + "doctor", + "help", + "install", + "login", + "logout", + "mcp", + "update", + "upgrade", + "version" + ]).has(command.toLowerCase())); +} + +function firstClaudeCodePositionalArg(args) { + for (let index = 0; index < args.length; index += 1) { + const arg = args[index]; + if (arg === "--") { + return undefined; + } + if (!arg.startsWith("-")) { + return arg; + } + if (claudeCodeOptionTakesValue(arg) && !arg.includes("=")) { + index += 1; + } + } + return undefined; +} + +function claudeCodeOptionTakesValue(arg) { + return new Set([ + "--add-dir", + "--append-system-prompt", + "--config", + "--continue", + "--debug-to", + "--fallback-model", + "--model", + "--mcp-config", + "--output-format", + "--permission-mode", + "--resume", + "--settings", + "--system-prompt", + "-c", + "-m", + "-p", + "-r" + ]).has(arg); +} + +function shouldCaptureClaudeCodeCliStdout(args) { + if (boolEnv("CCR_CLAUDE_CODE_CAPTURE_STDOUT") || boolEnv("CODEXL_CLAUDE_CODE_CAPTURE_STDOUT")) { + return true; + } + if (botGatewayCliCaptureEnabled()) { + return true; + } + return claudeCodeArgsUsePrintMode(args); +} + +function botGatewayCliCaptureEnabled() { + const enabled = boolEnv("CCR_BOT_GATEWAY_ENABLED") || boolEnv("CODEXL_BOT_GATEWAY_ENABLED"); + const platform = normalizeBotGatewayPlatform(nonEmptyEnv("CCR_BOT_GATEWAY_PLATFORM") || nonEmptyEnv("CODEXL_BOT_GATEWAY_PLATFORM") || "none"); + return enabled && platform !== "none"; +} + +function claudeCodeArgsUsePrintMode(args) { + return args.some((arg) => arg === "--print" || arg === "-p"); +} + +function defaultCodexArgs() { + return normalizeProfileSurface(nonEmptyEnv("CCR_PROFILE_SURFACE") || nonEmptyEnv("CODEXL_PROFILE_SURFACE")) === "cli" + ? [] + : ["app-server", "--analytics-default-enabled"]; +} + +async function runCodexCliMiddleware(args) { + const runtimeAgent = codexRuntimeAgent(); + const realCli = expandHome(codexRuntimeRealCli(runtimeAgent)); + const profile = agentEnv(runtimeAgent, "PROFILE"); + const modelProvider = agentEnv(runtimeAgent, "MODEL_PROVIDER") || profile; + const configFormat = normalizeConfigFormat(agentEnv(runtimeAgent, "PROFILE_CONFIG_FORMAT")); + const realArgs = realCliArgs(profile, modelProvider, configFormat, args); + log("codex_cli_start", { realCli, realArgs, runtimeAgent }); + + if (shouldRunDirectCodexCli(args)) { + await runDirectCodexCli(realCli, realArgs); + return; + } + + const cleanupAuthBootstrap = createEphemeralCodexApiKeyBootstrap(runtimeAgent); + const child = spawnAgentCli(realCli, realArgs, { + env: childEnvForAgent(runtimeAgent), + stdio: ["pipe", "pipe", "inherit"] + }); + child.on("error", (error) => { + cleanupAuthBootstrap(); + log("codex_cli_spawn_error", { error: formatError(error) }); + process.stderr.write("Failed to start " + realCli + ": " + formatError(error) + "\n"); + }); + + const requestMap = new Map(); + const current = { cwd: "" }; + const chatGptAuth = loadChatGptAuth(); + const stdinRl = readline.createInterface({ input: process.stdin, crlfDelay: Infinity, terminal: false }); + stdinRl.on("line", (line) => { + const custom = customAppServerLineResponse(line); + if (custom) { + writeLine(process.stdout, custom); + return; + } + const rewritten = rewriteCodexStdinLine(line); + trackRequestLine(rewritten, requestMap, current); + if (!child.stdin.destroyed) child.stdin.write(rewritten + "\n"); + }); + stdinRl.on("close", () => { + if (!child.stdin.destroyed) child.stdin.end(); + }); + + const stdoutRl = readline.createInterface({ input: child.stdout, crlfDelay: Infinity, terminal: false }); + stdoutRl.on("line", (line) => { + cleanupAuthBootstrap(); + const rewritten = rewriteCodexStdoutLine(line, requestMap, chatGptAuth); + botBridge().handleJsonRpcLine(rewritten); + if (!shouldSuppressBotBridgeLine(rewritten)) { + process.stdout.write(rewritten + "\n"); + } + }); + + const exit = await waitForChildResult(child); + cleanupAuthBootstrap(); + log("codex_cli_exit", { code: exit.code, signal: exit.signal, exitCode: exit.exitCode }); + process.exitCode = exit.exitCode; +} + +function createEphemeralCodexApiKeyBootstrap(runtimeAgent) { + if (runtimeAgent !== "codex") return () => {}; + const scope = nonEmptyEnv("CCR_PROFILE_SCOPE"); + if (scope !== "ccr" && scope !== "custom") return () => {}; + const authFile = path.join(codexRuntimeHome(), "auth.json"); + if (fs.existsSync(authFile)) return () => {}; + const temporary = authFile + ".tmp-" + process.pid; + let active = false; + try { + fs.mkdirSync(path.dirname(authFile), { recursive: true, mode: 0o700 }); + fs.writeFileSync(temporary, JSON.stringify({ + auth_mode: "apikey", + OPENAI_API_KEY: "ccr-local-profile" + }, null, 2) + "\n", { mode: 0o600 }); + fs.renameSync(temporary, authFile); + active = true; + log("codex_auth_bootstrap_created", { authFile }); + } catch (error) { + try { + fs.unlinkSync(temporary); + } catch { + } + log("codex_auth_bootstrap_create_error", { authFile, error: formatError(error) }); + } + + return () => { + if (!active) return; + try { + if (!fs.existsSync(authFile)) { + active = false; + return; + } + const value = readJsonFile(authFile); + const keys = value && typeof value === "object" ? Object.keys(value).sort() : []; + if ( + keys.length === 2 && + keys[0] === "OPENAI_API_KEY" && + keys[1] === "auth_mode" && + value.auth_mode === "apikey" && + value.OPENAI_API_KEY === "ccr-local-profile" + ) { + fs.unlinkSync(authFile); + active = false; + log("codex_auth_bootstrap_removed", { authFile }); + return; + } + active = false; + log("codex_auth_bootstrap_preserved_changed_file", { authFile }); + } catch (error) { + log("codex_auth_bootstrap_remove_error", { authFile, error: formatError(error) }); + } + }; +} + +async function runDirectCodexCli(realCli, realArgs) { + const runtimeAgent = codexRuntimeAgent(); + const child = spawnAgentCli(realCli, realArgs, { + env: childEnvForAgent(runtimeAgent), + stdio: "inherit" + }); + child.on("error", (error) => { + log("codex_cli_spawn_error", { error: formatError(error) }); + process.stderr.write("Failed to start " + realCli + ": " + formatError(error) + "\n"); + }); + const exit = await waitForChildResult(child); + log("codex_cli_exit", { code: exit.code, signal: exit.signal, exitCode: exit.exitCode }); + process.exitCode = exit.exitCode; +} + +function shouldRunDirectCodexCli(args) { + return codexPositionalArgs(args)[0] !== "app-server"; +} + +function spawnAgentCli(command, args, options) { + if (process.platform !== "win32") { + return childProcess.spawn(command, args, options); + } + + const commandFile = resolveWindowsCommandFile(command, options && options.env); + if (commandFile && /\.(?:com|exe)$/i.test(commandFile)) { + return childProcess.spawn(commandFile, args, options); + } + + const shellCommand = [escapeWindowsCmdCommand(commandFile || command)] + .concat(args.map(escapeWindowsCmdArgument)) + .join(" "); + return childProcess.spawn( + process.env.ComSpec || process.env.COMSPEC || "cmd.exe", + ["/d", "/s", "/c", '"' + shellCommand + '"'], + { ...options, windowsVerbatimArguments: true } + ); +} + +function resolveWindowsCommandFile(command, env) { + const value = String(command || "").trim().replace(/^"|"$/g, ""); + if (!value) return ""; + const commandExt = path.extname(value); + const pathExt = String((env && (env.PATHEXT || env.Pathext)) || process.env.PATHEXT || ".COM;.EXE;.BAT;.CMD") + .split(";") + .map((extension) => extension.trim()) + .filter(Boolean); + const extensions = commandExt ? [""] : ["", ...pathExt]; + const hasPath = path.isAbsolute(value) || value.includes("\\") || value.includes("/"); + const directories = hasPath + ? [""] + : String((env && (env.PATH || env.Path)) || process.env.PATH || "") + .split(path.delimiter) + .map((directory) => directory.replace(/^"|"$/g, "")) + .filter(Boolean); + + for (const directory of directories) { + for (const extension of extensions) { + const candidate = directory ? path.join(directory, value + extension) : value + extension; + try { + if (fs.statSync(candidate).isFile()) return candidate; + } catch { + } + } + } + return ""; +} + +const WINDOWS_CMD_META_CHARS = /([()\][%!^"\`<>&|;, *?])/g; + +function escapeWindowsCmdCommand(value) { + return String(value).replace(WINDOWS_CMD_META_CHARS, "^$1"); +} + +function escapeWindowsCmdArgument(value) { + let escaped = String(value); + escaped = escaped.replace(/(?=(\\+?)?)\1"/g, "$1$1\\\""); + escaped = escaped.replace(/(?=(\\+?)?)\1$/g, "$1$1"); + escaped = '"' + escaped + '"'; + return escaped.replace(WINDOWS_CMD_META_CHARS, "^$1"); +} + +function realCliArgs(profile, modelProvider, configFormat, args) { + const realArgs = []; + if (profile) { + if (configFormat === "separate_profile_files") { + if (codexArgsAcceptProfileFlag(args)) { + realArgs.push("--profile", profile); + } + } else { + realArgs.push("-c", cliConfigString("profile", profile)); + } + } + if (modelProvider) { + realArgs.push("-c", cliConfigString("model_provider", modelProvider)); + } + realArgs.push(...args); + return realArgs; +} + +function codexArgsAcceptProfileFlag(args) { + const positionals = codexPositionalArgs(args); + const command = positionals[0]; + if (!command) return true; + if (["exec", "e", "review", "resume", "fork", "mcp", "sandbox"].includes(command)) return true; + if (command === "debug") return positionals[1] === "prompt-input"; + if (["login", "logout", "plugin", "mcp-server", "app-server", "remote-control", "app", "completion", "update", "doctor", "apply", "a", "cloud", "exec-server", "features", "help"].includes(command)) return false; + return true; +} + +function codexPositionalArgs(args) { + const positionals = []; + let skipNext = false; + for (const arg of args) { + if (skipNext) { + skipNext = false; + continue; + } + if (arg === "--") break; + if (codexOptionTakesValue(arg)) { + if (!arg.includes("=")) skipNext = true; + continue; + } + if (arg.startsWith("-")) continue; + positionals.push(arg); + if (positionals.length >= 2) break; + } + return positionals; +} + +function codexOptionTakesValue(arg) { + const option = arg.split("=")[0]; + return ["-c", "--config", "--enable", "--disable", "--remote", "--remote-auth-token-env", "-i", "--image", "-m", "--model", "--local-provider", "-p", "--profile", "-s", "--sandbox", "-C", "--cd", "--add-dir", "-a", "--ask-for-approval"].includes(option); +} + +function cliConfigString(key, value) { + return key + "=\"" + tomlEscape(value) + "\""; +} + +function rewriteCodexStdoutLine(line, requestMap, chatGptAuth) { + let value; + try { + value = JSON.parse(line); + } catch { + return line; + } + const id = jsonRpcIdKey(value.id); + if (!id || !requestMap.has(id)) return line; + const request = requestMap.get(id); + requestMap.delete(id); + if (value.error) { + if (request.method === "model/list" || request.method === "plugin/list") { + log("app_server_list_error", { method: request.method, error: value.error }); + } + return line; + } + if (request.method === "account/read") { + value.result = codexAppAccountRead(chatGptAuth); + } else if (request.method === "getAuthStatus") { + value.result = codexAppAuthStatus(chatGptAuth, request.includeToken); + } else if (request.method === "thread/list") { + value = mergeForeignThreadList(value, request.params); + } else if (request.method === "model/list") { + log("app_server_model_list_response", { + count: extractModelListItems(value.result).length, + nextCursor: value.result && value.result.nextCursor + }); + return line; + } else if (request.method === "plugin/list") { + const marketplaces = value.result && Array.isArray(value.result.marketplaces) ? value.result.marketplaces : []; + log("app_server_plugin_list_response", { + marketplaceCount: marketplaces.length, + marketplaces: marketplaces.map((marketplace) => ({ + name: marketplace && marketplace.name, + path: marketplace && marketplace.path, + pluginCount: marketplace && Array.isArray(marketplace.plugins) ? marketplace.plugins.length : 0 + })) + }); + return line; + } else { + return line; + } + return JSON.stringify(value); +} + +function rewriteCodexStdinLine(line) { + let value; + try { + value = JSON.parse(line); + } catch { + return line; + } + if (value && value.type === "fetch") { + return rewriteCodexFetchLine(line, value); + } + if (!value || typeof value !== "object" || typeof value.method !== "string") { + return line; + } + if (value.method === "model/list" || value.method === "plugin/list") { + log("app_server_list_request", { method: value.method, params: value.params || {} }); + } + let changed = false; + if (normalizeCliAppServerRequest(value)) { + changed = true; + log("codex_app_server_request_normalized", { method: value.method, id: jsonRpcIdKey(value.id) }); + } + if (value.params && normalizeCodexToolSchemas(value.params, "", 0)) { + changed = true; + log("codex_stdin_tool_schema_rewrite", { method: value.method, id: jsonRpcIdKey(value.id) }); + } + if (!changed) { + return line; + } + return JSON.stringify(value); +} + +function normalizeCliAppServerRequest(request) { + const method = typeof request.method === "string" ? request.method : ""; + if (!["thread/start", "thread/resume", "turn/start"].includes(method)) return false; + const before = JSON.stringify(request.params === undefined ? null : request.params); + request.params = cliAppServerMethodParams(method, request.params); + return JSON.stringify(request.params) !== before; +} + +function cliAppServerMethodParams(method, params) { + if (method === "thread/start") return cliThreadStartParams(params); + if (method === "thread/resume") return cliThreadResumeParams(params); + if (method === "turn/start") return cliTurnStartParamsForAppServer(params); + return params; +} + +function cliThreadStartParams(params) { + const source = isPlainObject(params) ? params : {}; + const output = {}; + for (const key of [ + "cwd", + "serviceTier", + "config", + "threadSource", + "model", + "modelProvider", + "reasoningEffort", + "workspaceKind", + "workspaceRoots", + "projectlessOutputDirectory", + "sandbox", + "baseInstructions", + "developerInstructions", + "personality", + "ephemeral", + "persistExtendedHistory" + ]) { + copyJsonField(source, output, key); + } + copyJsonField(source, output, "additionalDeveloperInstructions", "developerInstructions"); + ensureCliProjectlessOutputDirectory(source, output); + copyPermissionFields(source, output); + copyCollaborationModelFields(source, output); + if (output.threadSource === undefined) output.threadSource = "user"; + if (output.serviceName === undefined) output.serviceName = "ccr_codex_cli_middleware"; + if (output.ephemeral === undefined) output.ephemeral = false; + if (output.personality === undefined) output.personality = "pragmatic"; + return output; +} + +function cliThreadResumeParams(params) { + const source = isPlainObject(params) ? params : {}; + const output = {}; + copyJsonField(source, output, "threadId"); + if (output.threadId === undefined) copyJsonField(source, output, "conversationId", "threadId"); + for (const key of [ + "cwd", + "path", + "history", + "serviceTier", + "config", + "model", + "modelProvider", + "reasoningEffort", + "workspaceKind", + "workspaceRoots", + "projectlessOutputDirectory", + "sandbox", + "baseInstructions", + "developerInstructions", + "personality", + "excludeTurns", + "persistExtendedHistory" + ]) { + copyJsonField(source, output, key); + } + copyPermissionFields(source, output); + copyCollaborationModelFields(source, output); + return output; +} + +function cliTurnStartParamsForAppServer(params) { + const source = isPlainObject(params) ? params : {}; + const output = {}; + for (const key of [ + "threadId", + "cwd", + "input", + "attachments", + "commentAttachments", + "serviceTier", + "model", + "effort", + "reasoningEffort", + "workspaceKind", + "projectlessOutputDirectory" + ]) { + copyJsonField(source, output, key); + } + copyPermissionFields(source, output); + copyCollaborationModelFields(source, output); + return output; +} + +function ensureCliProjectlessOutputDirectory(source, target) { + if (source.workspaceKind !== "projectless") return; + const outputDirectory = stringValue(target.projectlessOutputDirectory) || + stringValue(source.projectlessOutputDirectory) || + stringValue(source.outputDirectory) || + stringValue(source.cwd) || + firstArrayString(source.workspaceRoots); + if (!outputDirectory) return; + target.projectlessOutputDirectory = outputDirectory; + if (target.cwd === undefined) target.cwd = outputDirectory; + appendDeveloperInstruction( + target, + "When using local files for this projectless thread, write scratch files, drafts, generated assets, and other outputs under " + + outputDirectory + + ". Do not write directly in the home directory unless the user explicitly asks." + ); +} + +function appendDeveloperInstruction(target, instruction) { + const existing = typeof target.developerInstructions === "string" ? target.developerInstructions.trim() : ""; + target.developerInstructions = existing ? existing + "\n\n" + instruction : instruction; +} + +function copyPermissionFields(source, target) { + if (isPlainObject(source.permissions)) { + copyJsonField(source.permissions, target, "approvalPolicy"); + copyJsonField(source.permissions, target, "sandboxPolicy"); + copyJsonField(source.permissions, target, "approvalsReviewer"); + } + copyJsonField(source, target, "approvalPolicy"); + copyJsonField(source, target, "sandboxPolicy"); + copyJsonField(source, target, "approvalsReviewer"); +} + +function copyCollaborationModelFields(source, target) { + const settings = source.collaborationMode && isPlainObject(source.collaborationMode.settings) + ? source.collaborationMode.settings + : undefined; + if (!settings) return; + if (target.model === undefined) copyJsonField(settings, target, "model"); + if (target.reasoningEffort === undefined) { + if (!copyJsonField(settings, target, "reasoning_effort", "reasoningEffort")) { + copyJsonField(settings, target, "reasoningEffort"); + } + } +} + +function copyJsonField(source, target, sourceKey, targetKey) { + const value = source[sourceKey]; + if (value === undefined || value === null) return false; + target[targetKey || sourceKey] = value; + return true; +} + +function firstArrayString(value) { + return Array.isArray(value) ? value.map(stringValue).find(Boolean) : undefined; +} + +function rewriteCodexFetchLine(line, value) { + const rewritten = rewriteCodexFetchBody(value); + if (!rewritten) return line; + log("codex_fetch_tool_schema_rewrite", { + method: String(value.method || ""), + requestId: jsonRpcIdKey(value.requestId || value.id), + url: String(value.url || "") + }); + return JSON.stringify(value); +} + +function rewriteCodexFetchBody(value) { + for (const key of ["body", "bodyText", "data", "payload"]) { + if (rewriteCodexFetchJsonField(value, key)) return true; + } + if (typeof value.bodyBase64 === "string" && value.bodyBase64.trim()) { + try { + const text = Buffer.from(value.bodyBase64, "base64").toString("utf8"); + if (!codexBodyMayContainToolSchemaAliases(text)) return false; + const body = JSON.parse(text); + if (!normalizeCodexToolSchemas(body, "", 0)) return false; + value.bodyBase64 = Buffer.from(JSON.stringify(body), "utf8").toString("base64"); + return true; + } catch { + return false; + } + } + return false; +} + +function rewriteCodexFetchJsonField(value, key) { + const body = value[key]; + if (typeof body === "string") { + if (!codexBodyMayContainToolSchemaAliases(body)) return false; + try { + const parsed = JSON.parse(body); + if (!normalizeCodexToolSchemas(parsed, "", 0)) return false; + value[key] = JSON.stringify(parsed); + return true; + } catch { + return false; + } + } + if (!body || typeof body !== "object" || !codexValueMayContainToolSchemaAliases(body)) { + return false; + } + return normalizeCodexToolSchemas(body, "", 0); +} + +function codexBodyMayContainToolSchemaAliases(value) { + return /"input_schema"|"dynamic_tools"|"dynamicTools"|"experimental_supported_tools"|"experimentalSupportedTools"|"defer_loading"|"expose_to_context"/.test(value); +} + +function codexValueMayContainToolSchemaAliases(value) { + try { + return codexBodyMayContainToolSchemaAliases(JSON.stringify(value)); + } catch { + return false; + } +} + +function normalizeCodexToolSchemas(value, parentKey, depth) { + if (depth > 40 || !value || typeof value !== "object") return false; + let changed = false; + if (Array.isArray(value)) { + for (const item of value) { + if (normalizeCodexToolSchemas(item, parentKey, depth + 1)) changed = true; + } + return changed; + } + if (normalizeCodexToolSchemaObject(value, parentKey)) changed = true; + for (const [key, child] of Object.entries(value)) { + if (normalizeCodexToolSchemas(child, key, depth + 1)) changed = true; + } + return changed; +} + +function normalizeCodexToolSchemaObject(value, parentKey) { + if (!looksLikeCodexToolSpec(value, parentKey)) return false; + let changed = false; + const inputSchema = normalizeCodexInputSchema(value.inputSchema) || + normalizeCodexInputSchema(value.input_schema) || + normalizeCodexInputSchema(value.parameters) || + normalizeCodexInputSchema(value.schema) || + normalizeCodexInputSchema(value.inputConfig && value.inputConfig.inputSchema) || + normalizeCodexInputSchema(value.function && value.function.parameters); + if (!isPlainObject(value.inputSchema)) { + value.inputSchema = inputSchema || { type: "object", properties: {} }; + changed = true; + } + if (!isPlainObject(value.outputSchema)) { + const outputSchema = normalizeCodexInputSchema(value.output_schema); + if (outputSchema) { + value.outputSchema = outputSchema; + changed = true; + } + } + if (value.deferLoading === undefined && value.defer_loading !== undefined) { + value.deferLoading = Boolean(value.defer_loading); + changed = true; + } + if (value.exposeToContext === undefined && value.expose_to_context !== undefined) { + value.exposeToContext = Boolean(value.expose_to_context); + changed = true; + } + return changed; +} + +function looksLikeCodexToolSpec(value, parentKey) { + const parent = String(parentKey || ""); + if (["dynamic_tools", "dynamicTools", "experimental_supported_tools", "experimentalSupportedTools"].includes(parent)) { + return true; + } + if (parent === "tools" && hasCodexToolIdentity(value)) { + return Boolean( + value.inputSchema || + value.input_schema || + value.parameters || + value.schema || + (value.inputConfig && value.inputConfig.inputSchema) || + (value.function && value.function.parameters) + ); + } + return hasCodexToolIdentity(value) && Boolean(value.input_schema || value.parameters || value.schema); +} + +function hasCodexToolIdentity(value) { + return stringValue(value.name) || + stringValue(value.namespace) || + stringValue(value.toolName) || + stringValue(value.canonicalName) || + stringValue(value.alias) || + Boolean(value.function && stringValue(value.function.name)); +} + +function normalizeCodexInputSchema(value) { + let parsed = value; + if (typeof value === "string" && value.trim()) { + try { + parsed = JSON.parse(value); + } catch { + return undefined; + } + } + if (!isPlainObject(parsed)) return undefined; + return { + type: parsed.type || "object", + properties: isPlainObject(parsed.properties) ? parsed.properties : {}, + ...parsed + }; +} + +function isPlainObject(value) { + return Boolean(value && typeof value === "object" && !Array.isArray(value)); +} + +function trackRequestLine(line, requestMap, current) { + let value; + try { + value = JSON.parse(line); + } catch { + return; + } + const id = jsonRpcIdKey(value.id); + const method = typeof value.method === "string" ? value.method : undefined; + if (!id || !method) return; + const cwd = requestWorkspaceCwd(value, method); + if (cwd) current.cwd = cwd; + if (!["account/read", "getAuthStatus", "thread/list", "config/read", "model/list", "plugin/list"].includes(method)) return; + const params = clone(value.params || {}); + if (method === "thread/list" && current.cwd && !params.codexlWorkspaceCwd) { + params.codexlWorkspaceCwd = current.cwd; + } + requestMap.set(id, { + includeToken: Boolean(value.params && value.params.includeToken), + method, + params + }); +} + +function customAppServerLineResponse(line) { + let value; + try { + value = JSON.parse(line); + } catch { + return undefined; + } + if (value && typeof value.method === "string") { + log("app_server_request", { + id: jsonRpcIdKey(value.id), + method: value.method, + params: value.params || {} + }); + } + if (value && value.type === "fetch" && String(value.method || "").toUpperCase() === "POST" && fetchUrlIsTranscribe(value.url)) { + return { + requestId: value.requestId || value.id || uuid(), + status: 501, + ok: false, + body: JSON.stringify({ error: "Transcribe is not available in CCR middleware." }), + headers: { "content-type": "application/json" } + }; + } + if (value && value.method === "plugin/list" && jsonRpcIdKey(value.id) && accountRemoteOnlyPluginList(value.params)) { + log("app_server_account_remote_plugin_list_empty", { + marketplaceKinds: value.params.marketplaceKinds + }); + return { + id: value.id, + result: { marketplaces: [], marketplaceLoadErrors: [], featuredPluginIds: [] } + }; + } + return undefined; +} + +function accountRemoteOnlyPluginList(params) { + const kinds = params && Array.isArray(params.marketplaceKinds) + ? params.marketplaceKinds.map((kind) => String(kind || "")).filter(Boolean) + : []; + return kinds.length > 0 && kinds.every((kind) => ACCOUNT_REMOTE_PLUGIN_MARKETPLACE_KINDS.has(kind)); +} + +function fetchUrlIsTranscribe(url) { + const text = String(url || "").trim(); + if (text === "/transcribe") return true; + try { + return new URL(text).pathname === "/transcribe"; + } catch { + return false; + } +} + +function shouldSuppressBotBridgeLine(_line) { + return false; +} + +async function runClaudeCodeAppServer(args) { + const options = parseAppServerOptions(args); + const server = new ClaudeCodeAppServer(options); + await server.run(); +} + +async function runClaudeCodeBotWorker(args) { + const options = parseAppServerOptions(args); + const lock = acquireClaudeBotWorkerLock(); + if (!lock) return; + try { + const server = new ClaudeCodeAppServer(options); + server.ensureBotBridgeRegistered(); + log("claude_bot_worker_start", { + workspaceName: options.workspaceName, + pid: process.pid, + lockPath: lock.path, + claudeConfigDir: nonEmptyEnv("CLAUDE_CONFIG_DIR"), + claudeUserDataDir: currentClaudeAppUserDataDir(), + model: nonEmptyEnv("CCR_CLAUDE_CODE_MODEL") || nonEmptyEnv("CODEXL_CLAUDE_CODE_MODEL") || agentEnv(codexRuntimeAgent(), "MODEL") || "" + }); + await waitForTerminationSignal(); + await botBridge().stop(); + log("claude_bot_worker_stop", { pid: process.pid }); + } finally { + releaseClaudeBotWorkerLock(lock); + } +} + +function acquireClaudeBotWorkerLock() { + const lockPath = claudeBotWorkerLockPath(); + const token = uuid(); + const payload = { + pid: process.pid, + token, + startedAt: Date.now() + }; + fs.mkdirSync(path.dirname(lockPath), { recursive: true }); + for (let attempt = 0; attempt < 2; attempt += 1) { + try { + fs.writeFileSync(lockPath, JSON.stringify(payload, null, 2), { flag: "wx" }); + const lock = { path: lockPath, token }; + process.once("exit", () => releaseClaudeBotWorkerLock(lock)); + return lock; + } catch (error) { + if (!error || error.code !== "EEXIST") throw error; + const existing = readJsonFile(lockPath) || {}; + const existingPid = Number(existing.pid); + if (existingPid && existingPid !== process.pid && processIsRunning(existingPid)) { + log("claude_bot_worker_lock_held", { lockPath, pid: process.pid, ownerPid: existingPid }); + return null; + } + try { + fs.unlinkSync(lockPath); + log("claude_bot_worker_stale_lock_removed", { lockPath, pid: process.pid, ownerPid: existingPid || null }); + } catch (unlinkError) { + log("claude_bot_worker_lock_remove_failed", { lockPath, pid: process.pid, error: formatError(unlinkError) }); + return null; + } + } + } + log("claude_bot_worker_lock_failed", { lockPath, pid: process.pid }); + return null; +} + +function releaseClaudeBotWorkerLock(lock) { + if (!lock || !lock.path) return; + try { + const existing = readJsonFile(lock.path) || {}; + if (existing.token && existing.token !== lock.token) return; + fs.unlinkSync(lock.path); + } catch { + // The lock may have already been removed during shutdown. + } +} + +function claudeBotWorkerLockPath() { + const stateDir = nonEmptyEnv("CCR_BOT_GATEWAY_STATE_DIR") || + nonEmptyEnv("CODEXL_BOT_GATEWAY_STATE_DIR") || + nonEmptyEnv("BOT_GATEWAY_STATE_DIR") || + path.join(CONFIG_DIR, "bot-gateway", safePathSegment(nonEmptyEnv("CCR_BOT_PROFILE_ID") || "default")); + return path.join(expandHome(stateDir), "claude-bot-worker.lock"); +} + +function processIsRunning(pid) { + if (!Number.isFinite(pid) || pid <= 0) return false; + try { + process.kill(pid, 0); + return true; + } catch (error) { + return Boolean(error && error.code === "EPERM"); + } +} + +function waitForTerminationSignal() { + return new Promise((resolve) => { + const timer = setInterval(() => {}, 2147483647); + const done = () => { + clearInterval(timer); + process.off("SIGINT", done); + process.off("SIGTERM", done); + process.off("SIGHUP", done); + resolve(); + }; + process.once("SIGINT", done); + process.once("SIGTERM", done); + process.once("SIGHUP", done); + }); +} + +function parseAppServerOptions(args) { + const runtimeAgent = codexRuntimeAgent(); + let workspaceName = agentEnv(runtimeAgent, "WORKSPACE_NAME") || + (runtimeAgent === "codex" ? nonEmptyEnv("CODEXL_CODEX_INSTANCE_NAME") : "") || + (runtimeAgent === "zcode" ? "ZCode" : "Claude Code"); + for (let i = 0; i < args.length; i += 1) { + if (args[i] === "--workspace-name" && args[i + 1]) { + workspaceName = args[i + 1]; + i += 1; + } + } + return { workspaceName }; +} + +function shouldRunClaudeCodeAppServer(args) { + const mode = normalizeRemoteFrontendMode(agentEnv(codexRuntimeAgent(), "REMOTE_FRONTEND_MODE", "CORE_MODE")); + const nextArgs = args.length === 0 ? ["app-server"] : args; + return mode === "claude-code" && nextArgs[0] === "app-server"; +} + +class ClaudeCodeAppServer { + constructor(options) { + this.workspaceName = options.workspaceName || "Claude Code"; + this.threads = new Map(); + this.active = new Map(); + this.appResponses = new Map(); + this.botBridgeRegistered = false; + this.botSessionStore = { version: 1, conversations: {} }; + this.botSessionStoreLoaded = false; + this.botThreadKeys = new Map(); + this.botThreads = new Map(); + this.configValues = {}; + this.pollingEvents = false; + this.stdin = readline.createInterface({ input: process.stdin, crlfDelay: Infinity, terminal: false }); + } + + async run() { + log("claude_app_server_start", { workspaceName: this.workspaceName, pid: process.pid }); + const workers = []; + for await (const line of this.stdin) { + const worker = this.handleLine(line); + if (worker) workers.push(worker); + } + await Promise.allSettled(workers); + log("claude_app_server_stop", { pid: process.pid }); + } + + handleLine(line) { + let request; + try { + request = JSON.parse(line); + } catch (error) { + log("claude_app_invalid_json", { error: formatError(error) }); + return undefined; + } + if (!request || typeof request !== "object") return undefined; + if (!request.method) { + const key = jsonRpcIdKey(request.id); + if (key) { + this.appResponses.set(key, request.result === undefined ? { error: request.error } : request.result); + } + return undefined; + } + if (request.method === "notifications/initialized" || request.method === "initialized") return undefined; + try { + return this.handleRequest(request); + } catch (error) { + writeError(request.id, -32000, formatError(error)); + return undefined; + } + } + + handleRequest(request) { + const id = request.id; + const method = request.method; + const params = request.params || {}; + log("claude_app_request", { method, id: jsonRpcIdKey(id) }); + if (!isClaudeOwnedMethod(method)) { + const result = standaloneCodexAppResult(method, params); + if (result !== undefined) { + writeResponse(id, result); + } else { + writeError(id, -32601, "Claude Code app-server does not support method: " + method); + } + return undefined; + } + switch (method) { + case "initialize": + writeResponse(id, { + protocolVersion: String(params.protocolVersion || PROTOCOL_VERSION), + capabilities: { experimentalApi: true }, + serverInfo: { name: "ccr-claude-code-app-server", version: VERSION }, + userAgent: "ccr-claude-code-app-server/" + VERSION, + codexHome: codexRuntimeHome(), + platformFamily: process.platform === "win32" ? "windows" : "unix", + platformOs: process.platform + }); + this.ensureBotBridgeRegistered(); + return undefined; + case "thread/start": { + const thread = this.createThread(params); + writeResponse(id, threadRuntimeResponse(thread, false)); + writeNotification("thread/started", { thread: threadJson(thread, false) }); + return undefined; + } + case "thread/resume": { + const thread = this.getOrCreateThread(params); + writeResponse(id, threadRuntimeResponse(thread, !params.excludeTurns)); + writeNotification("thread/started", { thread: threadJson(thread, false) }); + return undefined; + } + case "thread/read": { + const thread = this.requireThread(params.threadId); + writeResponse(id, { thread: threadJson(thread, Boolean(params.includeTurns)) }); + return undefined; + } + case "thread/list": + case "thread/search": { + writeResponse(id, this.threadList(params)); + return undefined; + } + case "thread/loaded/list": { + writeResponse(id, { data: Array.from(this.threads.keys()), nextCursor: null }); + return undefined; + } + case "thread/turns/list": + case "turn/list": { + const thread = this.requireThread(requiredThreadId(params)); + let turns = thread.turns.slice(); + if (params.sortDirection !== "asc") turns.reverse(); + if (Number.isFinite(params.limit)) turns = turns.slice(0, params.limit); + writeResponse(id, { data: turns.map((turn) => turnJson(turn, true)), nextCursor: null, backwardsCursor: null }); + return undefined; + } + case "thread/turns/items/list": { + const thread = this.requireThread(requiredThreadId(params)); + let turns = thread.turns.filter((turn) => !params.turnId || turn.id === params.turnId); + if (params.sortDirection !== "asc") turns.reverse(); + let items = turns.flatMap((turn) => turnItems(turn)); + if (Number.isFinite(params.limit)) items = items.slice(0, params.limit); + writeResponse(id, { data: items, nextCursor: null, backwardsCursor: null }); + return undefined; + } + case "thread/archive": + case "thread/unarchive": { + const thread = this.requireThread(params.threadId); + thread.archived = method === "thread/archive"; + thread.updatedAt = nowSeconds(); + writeResponse(id, {}); + writeNotification(thread.archived ? "thread/archived" : "thread/unarchived", { threadId: thread.id }); + return undefined; + } + case "thread/unsubscribe": + writeResponse(id, { status: "notSubscribed" }); + return undefined; + case "thread/name/set": { + const thread = this.requireThread(params.threadId); + thread.name = typeof params.name === "string" ? params.name : null; + thread.updatedAt = nowSeconds(); + writeResponse(id, {}); + writeNotification("thread/name/updated", { threadId: thread.id, name: thread.name }); + return undefined; + } + case "thread/metadata/update": { + const thread = this.requireThread(params.threadId); + applyThreadMetadata(thread, params); + writeResponse(id, { thread: threadJson(thread, Boolean(params.includeTurns)) }); + writeNotification("thread/stream/state", threadStreamState(thread)); + return undefined; + } + case "thread/pin": + case "thread/unpin": + writeResponse(id, { threadId: params.threadId, pinned: method === "thread/pin" }); + return undefined; + case "thread/pinned/list": + case "thread/pins/list": + writeResponse(id, { threadIds: [], data: [], nextCursor: null }); + return undefined; + case "thread/memoryMode/get": + case "thread/memory/get": + writeResponse(id, { threadId: params.threadId, memoryMode: null }); + return undefined; + case "thread/memoryMode/set": + case "thread/memory/set": + writeResponse(id, { threadId: params.threadId, memoryMode: params.memoryMode || params.mode || null }); + return undefined; + case "thread/memoryMode/clear": + case "thread/memory/clear": + case "thread/prewarm/clear": + case "thread/prewarm/clearAll": + writeResponse(id, {}); + return undefined; + case "thread/prewarm": + case "thread/prewarm/start": { + const thread = this.createThread(params); + writeResponse(id, { ...threadRuntimeResponse(thread, false), prewarmed: true }); + writeNotification("thread/started", { thread: threadJson(thread, false) }); + return undefined; + } + case "thread/goal/get": + writeResponse(id, { goal: null }); + return undefined; + case "thread/goal/set": + writeResponse(id, { goal: params.goal || null }); + return undefined; + case "thread/goal/clear": + writeResponse(id, { goal: null }); + return undefined; + case "turn/start": { + const prepared = this.startTurn(params); + writeResponse(id, { turn: turnJson(prepared.turn, false) }); + for (const notification of prepared.notifications) writeRaw(notification); + return this.runTurn(prepared.work); + } + case "turn/interrupt": { + const key = activeKey(params.threadId, params.turnId); + const entry = this.active.get(key) || findActiveForThread(this.active, params.threadId); + if (entry) { + entry.child.kill("SIGTERM"); + this.active.delete(entry.key); + const thread = this.threads.get(entry.threadId); + const turn = thread && thread.turns.find((item) => item.id === entry.turnId); + if (turn) { + turn.status = "interrupted"; + turn.completedAt = nowSeconds(); + turn.durationMs = Math.max(0, (turn.completedAt - turn.startedAt) * 1000); + } + } + writeResponse(id, {}); + return undefined; + } + case "turn/steer": { + const entry = findActiveForThread(this.active, params.threadId); + if (!entry || !entry.child.stdin) throw new Error("No active turn for thread " + params.threadId); + entry.child.stdin.write(JSON.stringify(claudeInputMessage(params.input || params.message || params)) + "\n"); + writeResponse(id, {}); + return undefined; + } + case "model/list": + writeResponse(id, modelList(params)); + return undefined; + case "modelProvider/capabilities/read": + writeResponse(id, { namespaceTools: false, imageGeneration: false, webSearch: false }); + return undefined; + case "account/read": + writeResponse(id, mockAccountRead()); + return undefined; + case "getAuthStatus": + writeResponse(id, mockAuthStatus(Boolean(params.includeToken))); + return undefined; + case "permissionProfile/list": + case "skills/list": + case "plugin/list": + case "app/list": + case "mcpServerStatus/list": + case "experimentalFeature/list": + writeResponse(id, { data: [], nextCursor: null }); + return undefined; + case "hooks/list": + writeResponse(id, { data: [] }); + return undefined; + case "collaborationMode/list": + writeResponse(id, collaborationModes()); + return undefined; + case "config/read": + writeResponse(id, configRead(params, this.configValues)); + return undefined; + case "config/value/write": + case "config/batchWrite": + applyConfigWrite(method, params, this.configValues); + writeResponse(id, configWriteResponse(params)); + return undefined; + case "configRequirements/read": + writeResponse(id, { requirements: null }); + return undefined; + case "config/mcpServer/reload": + case "memory/reset": + writeResponse(id, {}); + return undefined; + default: + writeError(id, -32601, "Claude Code app-server does not support method: " + method); + return undefined; + } + } + + async handleBotInbound(event, _queued, eventId, bridge) { + const text = botEventText(event); + if (!text) { + log("bot_gateway_inbound_skip", { eventId, reason: "empty_text" }); + return; + } + const commandReply = this.handleBotCommand(event, text); + if (commandReply !== null) { + await bridge.sendReplyToEvent(event, commandReply, "ccr:claude-code:command:" + eventId); + log("bot_gateway_command_replied", { eventId, textLen: commandReply.length }); + return; + } + const thread = this.botThreadForEvent(event, text); + const prepared = this.startTurn({ + cwd: thread.cwd, + input: [{ type: "text", text }], + threadId: thread.id + }); + for (const notification of prepared.notifications) writeRaw(notification); + bridge.suppressTurn(prepared.turn.id); + try { + await this.runTurn(prepared.work); + } finally { + bridge.unsuppressTurn(prepared.turn.id); + } + + const completed = thread.turns.find((turn) => turn.id === prepared.turn.id) || prepared.turn; + const responseText = completed.error + ? "Agent turn failed: " + completed.error + : (completed.agentText || "").trim() || "Claude Code completed the turn without a text response."; + await bridge.sendReplyToEvent(event, responseText, "ccr:claude-code:" + eventId + ":" + prepared.turn.id); + log("bot_gateway_inbound_replied", { eventId, threadId: thread.id, turnId: prepared.turn.id, textLen: responseText.length }); + } + + handleBotCommand(event, text) { + const command = parseBotCommand(text); + if (!command) return null; + const key = botConversationKey(event); + try { + if (command.name === "help") return botCommandHelpText(); + if (command.name === "ls") return this.renderBotSessionList(key); + if (command.name === "current" || command.name === "status") return this.renderCurrentBotSession(key); + if (command.name === "reset") { + this.clearBotThreadForConversation(key); + return "Reset. The next message will create a new Claude App session."; + } + if (command.name === "new") { + this.clearBotThreadForConversation(key); + const seed = command.args.replace(/^session\b/i, "").trim() || "New Claude App bot session"; + const thread = this.botThreadForEvent(event, seed); + return "Created session " + shortSessionId(thread.claudeAppSessionId || thread.sessionId || thread.id) + ": " + (thread.preview || "New Claude App session") + "\nNext message will continue in this Claude App session."; + } + if (command.name === "select" || command.name === "use") { + if (!command.args) return "Usage: select . Send 'ls' to list sessions."; + const session = resolveClaudeAppLocalAgentSession(command.args); + if (!session) return "Session '" + command.args + "' was not found. Send 'ls' to list sessions."; + const thread = this.bindBotConversationToClaudeAppSession(key, session); + return "Selected session " + shortSessionId(session.sessionId) + ": " + botSessionTitle(session) + "\nNext message will continue in this Claude App session."; + } + return null; + } catch (error) { + return formatError(error); + } + } + + ensureBotBridgeRegistered() { + if (this.botBridgeRegistered) return; + this.botBridgeRegistered = true; + botBridge().setInboundHandler((event, queued, eventId, bridge) => this.handleBotInbound(event, queued, eventId, bridge)); + } + + botThreadForEvent(event, text) { + const key = botConversationKey(event); + const mappedThreadId = this.botThreads.get(key); + if (mappedThreadId && this.threads.has(mappedThreadId)) { + return this.threads.get(mappedThreadId); + } + const restoredThread = this.restoreBotThreadForConversation(key); + if (restoredThread) { + if (!restoredThread.preview) restoredThread.preview = text.slice(0, 160); + return restoredThread; + } + const appThread = this.createBotThreadForNewClaudeAppSession(key, text); + if (appThread) return appThread; + const thread = this.createThread({ cwd: process.cwd(), workspaceKind: "local" }); + if (!thread.preview) thread.preview = text.slice(0, 160); + this.botThreads.set(key, thread.id); + this.botThreadKeys.set(thread.id, key); + this.persistBotThread(thread.id); + return thread; + } + + bindBotConversationToClaudeAppSession(key, session) { + const oldThreadId = this.botThreads.get(key); + if (oldThreadId) this.botThreadKeys.delete(oldThreadId); + const thread = this.createThread({ + cwd: session.cwd || process.cwd(), + model: session.model || undefined, + workspaceKind: "local", + claudeConfigDir: session.claudeConfigDir || null + }); + thread.sessionId = session.sessionId || thread.id; + thread.claudeSessionId = session.cliSessionId || null; + thread.claudeConfigDir = session.claudeConfigDir || null; + thread.claudeAppSessionId = session.sessionId || null; + thread.claudeAppSessionFile = session.file || ""; + thread.preview = botSessionTitle(session); + thread.name = botSessionTitle(session); + thread.updatedAt = Math.floor((session.lastActivityAt || Date.now()) / 1000); + this.botThreads.set(key, thread.id); + this.botThreadKeys.set(thread.id, key); + this.persistBotThread(thread.id); + return thread; + } + + clearBotThreadForConversation(key) { + const threadId = this.botThreads.get(key); + if (threadId) this.botThreadKeys.delete(threadId); + this.botThreads.delete(key); + const store = this.loadBotSessionStore(); + delete store.conversations[key]; + this.saveBotSessionStore(); + } + + renderBotSessionList(key) { + const sessions = claudeAppLocalAgentSessions(); + if (!sessions.length) return "No Claude App sessions found. Send any message to create a new session."; + const current = this.currentBotSessionInfo(key); + const lines = ["Claude App sessions:"]; + for (let i = 0; i < sessions.length; i += 1) { + const session = sessions[i]; + const selected = current && current.sessionId === session.sessionId ? " [selected]" : ""; + lines.push("[" + (i + 1) + "] " + shortSessionId(session.sessionId) + " " + botSessionTitle(session) + selected); + lines.push(" cwd: " + (session.cwd || "(unknown)")); + } + lines.push("Commands: select , new, current, reset, help"); + return lines.join("\n"); + } + + renderCurrentBotSession(key) { + const current = this.currentBotSessionInfo(key); + if (!current) return "No selected Claude App session. Send any message to create a new session, or send 'ls' and then 'select '."; + const title = current.title || current.sessionId || "Claude App session"; + return [ + "Current Claude App session:", + shortSessionId(current.sessionId || current.threadId || "") + " " + title, + "cwd: " + (current.cwd || "(unknown)") + ].join("\n"); + } + + currentBotSessionInfo(key) { + const threadId = this.botThreads.get(key); + const thread = threadId ? this.threads.get(threadId) : null; + if (thread) { + return { + sessionId: thread.claudeAppSessionId || thread.sessionId, + threadId: thread.id, + title: thread.name || thread.preview, + cwd: thread.cwd + }; + } + const entry = this.loadBotSessionStore().conversations[key]; + if (!entry || typeof entry !== "object") return null; + if (Number(entry.entryVersion || 0) < BOT_SESSION_ENTRY_VERSION) return null; + return { + sessionId: entry.claudeAppSessionId || entry.sessionId || "", + threadId: entry.threadId || "", + title: entry.preview || "", + cwd: entry.cwd || "" + }; + } + + restoreBotThreadForConversation(key) { + const entry = this.loadBotSessionStore().conversations[key]; + if (!entry || typeof entry !== "object") return null; + if (Number(entry.entryVersion || 0) < BOT_SESSION_ENTRY_VERSION) { + log("bot_gateway_session_legacy_skip", { + conversationKeyPrefix: key.slice(0, 80), + threadId: entry.threadId || "", + entryVersion: Number(entry.entryVersion || 0) + }); + return null; + } + if (!entry.claudeSessionId && !entry.claudeAppSessionId) return null; + const appSession = readClaudeAppLocalAgentSession(entry.claudeAppSessionFile || ""); + if (!botSessionEntryMatchesCurrentProfile(entry, appSession)) { + log("bot_gateway_session_scope_skip", { + conversationKeyPrefix: key.slice(0, 80), + threadId: entry.threadId || "", + claudeConfigDir: entry.claudeConfigDir || appSession.claudeConfigDir || "", + claudeAppSessionFile: entry.claudeAppSessionFile || "", + expectedUserDataDir: currentClaudeAppUserDataDir() + }); + return null; + } + const thread = this.createThread({ + cwd: entry.cwd || process.cwd(), + model: entry.model || undefined, + workspaceKind: "local", + claudeConfigDir: entry.claudeConfigDir || null + }); + this.replaceThreadId(thread, entry.threadId || thread.id); + thread.sessionId = entry.sessionId || thread.id; + thread.claudeSessionId = entry.claudeSessionId || appSession.cliSessionId || null; + thread.claudeConfigDir = entry.claudeConfigDir || appSession.claudeConfigDir || null; + thread.claudeAppSessionId = entry.claudeAppSessionId || null; + thread.claudeAppSessionFile = entry.claudeAppSessionFile || ""; + thread.preview = entry.preview || ""; + thread.updatedAt = entry.updatedAtSeconds || nowSeconds(); + this.botThreads.set(key, thread.id); + this.botThreadKeys.set(thread.id, key); + log("bot_gateway_session_restored", { + conversationKeyPrefix: key.slice(0, 80), + threadId: thread.id, + claudeSessionIdPrefix: thread.claudeSessionId ? thread.claudeSessionId.slice(0, 8) : "" + }); + return thread; + } + + createBotThreadForNewClaudeAppSession(key, text) { + const session = createClaudeAppLocalAgentSession(text); + if (!session) return null; + const thread = this.createThread({ + cwd: session.cwd || process.cwd(), + model: session.model || undefined, + workspaceKind: "local", + claudeConfigDir: session.claudeConfigDir || null + }); + thread.sessionId = session.sessionId || thread.id; + thread.claudeSessionId = null; + thread.claudeConfigDir = session.claudeConfigDir || null; + thread.claudeAppSessionId = session.sessionId || null; + thread.claudeAppSessionFile = session.file || ""; + thread.preview = session.title || text.slice(0, 160); + thread.name = session.title || this.workspaceName; + thread.updatedAt = Math.floor((session.lastActivityAt || Date.now()) / 1000); + this.botThreads.set(key, thread.id); + this.botThreadKeys.set(thread.id, key); + this.persistBotThread(thread.id); + log("bot_gateway_session_created", { + conversationKeyPrefix: key.slice(0, 80), + threadId: thread.id, + appSessionId: thread.claudeAppSessionId, + cwd: thread.cwd + }); + return thread; + } + + replaceThreadId(thread, id) { + const nextId = String(id || "").trim(); + if (!nextId || thread.id === nextId) return; + this.threads.delete(thread.id); + thread.id = nextId; + this.threads.set(thread.id, thread); + } + + loadBotSessionStore() { + if (this.botSessionStoreLoaded) return this.botSessionStore; + this.botSessionStoreLoaded = true; + try { + this.botSessionStore = normalizeBotSessionStore(JSON.parse(fs.readFileSync(botSessionStorePath(), "utf8"))); + } catch { + this.botSessionStore = { version: 1, conversations: {} }; + } + return this.botSessionStore; + } + + saveBotSessionStore() { + const file = botSessionStorePath(); + fs.mkdirSync(path.dirname(file), { recursive: true }); + fs.writeFileSync(file, JSON.stringify(this.botSessionStore, null, 2)); + } + + persistBotThread(threadId) { + const key = this.botThreadKeys.get(threadId); + if (!key) return; + const thread = this.threads.get(threadId); + if (!thread) return; + const store = this.loadBotSessionStore(); + store.conversations[key] = { + entryVersion: BOT_SESSION_ENTRY_VERSION, + threadId: thread.id, + sessionId: thread.sessionId || thread.id, + claudeSessionId: thread.claudeSessionId || null, + claudeAppSessionId: thread.claudeAppSessionId || null, + claudeAppSessionFile: thread.claudeAppSessionFile || null, + claudeConfigDir: thread.claudeConfigDir || null, + cwd: thread.cwd || process.cwd(), + model: thread.model || "", + preview: thread.preview || "", + updatedAt: Date.now(), + updatedAtSeconds: thread.updatedAt || nowSeconds() + }; + this.saveBotSessionStore(); + } + + rememberClaudeSession(message, work) { + const sessionId = claudeSessionIdFromMessage(message); + if (!sessionId) return; + const thread = this.threads.get(work.threadId); + if (!thread || thread.claudeSessionId === sessionId) return; + thread.claudeSessionId = sessionId; + log("claude_session_remembered", { threadId: work.threadId, turnId: work.turnId, sessionIdPrefix: sessionId.slice(0, 8) }); + updateClaudeAppLocalAgentSession(thread, { cliSessionId: sessionId, lastActivityAt: Date.now() }); + this.persistBotThread(work.threadId); + } + + createThread(params) { + const id = uuid(); + const cwd = normalizeCwd(params.cwd); + const now = nowSeconds(); + const thread = { + id, + sessionId: id, + claudeSessionId: null, + claudeConfigDir: params.claudeConfigDir || null, + claudeAppSessionId: params.claudeAppSessionId || null, + claudeAppSessionFile: params.claudeAppSessionFile || null, + path: null, + preview: "", + cwd, + gitInfo: {}, + workspaceKind: params.workspaceKind || "local", + workspaceRoots: normalizeWorkspaceRoots(params.workspaceRoots || params.workspace_roots, cwd), + workspaceBrowserRoot: params.workspaceBrowserRoot || params.workspaceRoot || cwd, + projectlessOutputDirectory: params.projectlessOutputDirectory || null, + baseInstructions: params.baseInstructions || null, + developerInstructions: combinedDeveloperInstructions(params), + personality: params.personality ?? null, + persistExtendedHistory: params.persistExtendedHistory ?? null, + model: params.model || agentEnv(codexRuntimeAgent(), "MODEL") || DEFAULT_MODEL, + reasoningEffort: params.reasoningEffort ?? params.reasoning_effort ?? null, + serviceTier: params.serviceTier ?? params.service_tier ?? null, + collaborationMode: params.collaborationMode || { mode: "default", model: params.model || DEFAULT_MODEL, reasoning_effort: null }, + createdAt: now, + updatedAt: now, + archived: false, + name: this.workspaceName, + approvalPolicy: params.approvalPolicy || params.approval_policy || "default", + approvalsReviewer: params.approvalsReviewer || params.approvals_reviewer || "auto_review", + turns: [], + goal: null, + latestTokenUsageInfo: null + }; + this.threads.set(id, thread); + return thread; + } + + getOrCreateThread(params) { + const requested = params.threadId || params.thread_id; + if (requested && this.threads.has(requested)) return this.threads.get(requested); + if (requested) { + const thread = this.createThread({ ...params, cwd: params.cwd || process.cwd() }); + thread.id = requested; + thread.sessionId = requested; + thread.claudeSessionId = requested; + this.threads.delete(Array.from(this.threads.keys()).find((key) => this.threads.get(key) === thread)); + this.threads.set(requested, thread); + return thread; + } + return this.createThread(params); + } + + requireThread(threadId) { + const id = String(threadId || ""); + const thread = this.threads.get(id); + if (!thread) throw new Error("thread not found: " + id); + return thread; + } + + threadList(params) { + let data = Array.from(this.threads.values()) + .filter((thread) => Boolean(thread.archived) === Boolean(params.archived)) + .map((thread) => threadJson(thread, false)); + const search = String(params.search || params.query || "").toLowerCase().trim(); + if (search) { + data = data.filter((thread) => JSON.stringify(thread).toLowerCase().includes(search)); + } + data.sort((a, b) => (b.updatedAt || 0) - (a.updatedAt || 0)); + if (Number.isFinite(params.limit)) data = data.slice(0, params.limit); + return { data, nextCursor: null, backwardsCursor: null }; + } + + startTurn(params) { + const thread = this.requireThread(params.threadId); + applyThreadMetadata(thread, params); + const input = Array.isArray(params.input) ? clone(params.input) : []; + const prompt = promptFromInput(input, params); + const now = nowSeconds(); + if (!thread.preview) thread.preview = prompt.slice(0, 160); + const turn = { + id: "turn-" + uuid(), + input, + toolItems: [], + agentText: "", + status: "inProgress", + error: null, + startedAt: now, + completedAt: null, + durationMs: null, + approvalPolicy: thread.approvalPolicy, + approvalsReviewer: thread.approvalsReviewer, + reasoningEffort: thread.reasoningEffort, + serviceTier: thread.serviceTier, + collaborationMode: thread.collaborationMode + }; + thread.turns.push(turn); + thread.updatedAt = now; + const work = { + threadId: thread.id, + turnId: turn.id, + agentItemId: agentItemIdForTurn(turn.id), + cwd: thread.cwd, + prompt, + input, + resumeExisting: Boolean(thread.claudeSessionId), + claudeSessionId: thread.claudeSessionId, + claudeConfigDir: thread.claudeConfigDir, + model: thread.model + }; + const userItem = userItemJson(turn); + const notifications = [ + { method: "thread/started", params: { thread: threadJson(thread, false) } }, + { method: "turn/started", params: { threadId: thread.id, turn: turnJson(turn, false) } }, + { method: "item/started", params: { threadId: thread.id, turnId: turn.id, item: userItem, startedAtMs: Date.now() } }, + { method: "thread/stream/state", params: threadStreamState(thread) } + ]; + return { thread, turn, work, notifications }; + } + + async runTurn(work) { + const thread = this.threads.get(work.threadId); + const turn = thread && thread.turns.find((item) => item.id === work.turnId); + if (!thread || !turn) return; + const started = Date.now(); + const command = claudeCommand(work); + log("claude_turn_spawn", { + threadId: work.threadId, + turnId: work.turnId, + command: command.command, + args: command.args, + cwd: work.cwd, + claudeConfigDir: work.claudeConfigDir || "", + expectedUserDataDir: currentClaudeAppUserDataDir() + }); + const child = childProcess.spawn(command.command, command.args, { + cwd: work.cwd, + env: command.env, + stdio: ["pipe", "pipe", "pipe"], + detached: process.platform !== "win32" + }); + let childSpawnError = null; + child.on("error", (error) => { + childSpawnError = error; + log("claude_spawn_error", { threadId: work.threadId, turnId: work.turnId, error: formatError(error) }); + }); + const key = activeKey(work.threadId, work.turnId); + this.active.set(key, { key, threadId: work.threadId, turnId: work.turnId, child }); + try { + child.stdin.write(JSON.stringify({ type: "control_request", request_id: uuid(), request: { subtype: "initialize" } }) + "\n"); + child.stdin.write(JSON.stringify(claudeInputMessage(work.input.length ? work.input : [{ type: "text", text: work.prompt }], work.claudeSessionId || "")) + "\n"); + } catch (error) { + childSpawnError = error; + log("claude_stdin_error", { threadId: work.threadId, turnId: work.turnId, error: formatError(error) }); + } + + const stream = { + emitted: "", + pending: "", + agentStarted: false, + resultText: "", + resultError: null, + resultSeenAt: 0, + onResult: null, + latestUsage: null, + tools: new Map(), + toolIndex: new Map(), + toolDelta: new Map() + }; + const resultSeen = new Promise((resolve) => { + stream.onResult = resolve; + }); + let stderr = ""; + let lastEventAt = Date.now(); + const stdoutRl = readline.createInterface({ input: child.stdout, crlfDelay: Infinity, terminal: false }); + stdoutRl.on("line", (line) => { + lastEventAt = Date.now(); + this.handleClaudeOutputLine(line, work, stream, child); + }); + const stderrRl = readline.createInterface({ input: child.stderr, crlfDelay: Infinity, terminal: false }); + stderrRl.on("line", (line) => { + stderr += line + "\n"; + log("claude_stderr", { threadId: work.threadId, turnId: work.turnId, line: line.slice(0, 500) }); + }); + + const idle = setInterval(() => { + if (Date.now() - lastEventAt > TURN_IDLE_TIMEOUT_MS && !child.killed) { + log("claude_turn_idle_timeout", { threadId: work.threadId, turnId: work.turnId }); + child.kill("SIGTERM"); + } else if (!child.killed) { + writeNotification("thread/stream/state", threadStreamState(thread)); + } + }, 1000); + + const childDone = waitForChild(child).then((code) => ({ kind: "exit", code })); + const resultDone = resultSeen.then(() => sleep(250).then(() => ({ kind: "result", code: 0 }))); + const done = await Promise.race([childDone, resultDone]); + if (done.kind === "result" && !child.killed) { + log("claude_turn_finish_after_result", { + threadId: work.threadId, + turnId: work.turnId, + resultSeenAt: stream.resultSeenAt + }); + try { + child.kill("SIGTERM"); + } catch { + // The process may have already exited after emitting result. + } + } + const code = done.code; + clearInterval(idle); + stdoutRl.close(); + stderrRl.close(); + this.active.delete(key); + const text = stream.resultText || stream.emitted || stream.pending; + turn.agentText = text; + turn.error = stream.resultError || (childSpawnError ? formatError(childSpawnError) : code === 0 ? null : stderr.trim() || "Claude Code exited with code " + code); + turn.status = turn.error ? "failed" : "completed"; + turn.completedAt = nowSeconds(); + turn.durationMs = Date.now() - started; + turn.toolItems = Array.from(stream.tools.values()).map((tool) => toolItemJson(work.threadId, work.cwd, tool)); + thread.updatedAt = turn.completedAt; + thread.latestTokenUsageInfo = stream.latestUsage; + updateClaudeAppLocalAgentSession(thread, { + lastActivityAt: Date.now(), + title: thread.name || thread.preview || promptTitle(thread.preview || work.prompt) + }); + this.persistBotThread(work.threadId); + if (!stream.agentStarted && text) { + writeNotification("item/completed", { + threadId: thread.id, + turnId: turn.id, + item: agentItemJson(turn), + completedAtMs: Date.now() + }); + } + writeNotification("turn/completed", { threadId: thread.id, turn: turnJson(turn, false) }); + writeNotification("thread/stream/state", threadStreamState(thread)); + log("claude_turn_exit", { threadId: work.threadId, turnId: work.turnId, code, error: turn.error }); + } + + handleClaudeOutputLine(line, work, stream, child) { + let message; + try { + message = JSON.parse(line); + } catch { + return; + } + this.rememberClaudeSession(message, work); + rememberUsage(message, work, stream); + if (message.type === "control_request") { + this.handleControlRequest(message, work, child); + return; + } + if (message.type === "stream_event" && message.event) { + handleClaudeStreamEvent(message.event, work, stream); + return; + } + if (message.type === "assistant" && message.message && message.message.content) { + handleClaudeContent(message.message.content, work, stream); + return; + } + if (message.type === "user" && message.message && message.message.content) { + handleClaudeToolResults(message.message.content, work, stream); + return; + } + if (message.type === "result") { + stream.resultText = stringValue(message.result) || stream.resultText; + stream.resultError = message.is_error ? stringValue(message.result) || "Claude Code returned an error" : stream.resultError; + if (!stream.resultSeenAt) { + stream.resultSeenAt = Date.now(); + if (typeof stream.onResult === "function") stream.onResult(stream.resultSeenAt); + } + } + } + + handleControlRequest(message, work, child) { + const subtype = stringValue(message.subtype) || stringValue(message.request && (message.request.subtype || message.request.type)) || ""; + if (subtype === "initialize") { + child.stdin.write(JSON.stringify({ type: "control_response", response: { subtype: "success", request_id: controlRequestId(message), response: {} } }) + "\n"); + return; + } + const requestId = controlRequestId(message); + const method = subtype.toLowerCase().includes("elicitation") ? "mcpServer/elicitation/request" : "item/permissions/requestApproval"; + const params = method === "item/permissions/requestApproval" + ? permissionRequestParams(work, requestId, message) + : elicitationRequestParams(work, requestId, message); + writeRaw({ id: requestId, method, params }); + waitForAppResponse(this.appResponses, requestId, REQUEST_TIMEOUT_MS).then((approval) => { + const response = method === "item/permissions/requestApproval" + ? claudeControlPermissionResponse(message, requestId, approval) + : claudeControlElicitationResponse(requestId, approval); + child.stdin.write(JSON.stringify(response) + "\n"); + }).catch((error) => { + child.stdin.write(JSON.stringify({ type: "control_response", response: { subtype: "error", request_id: requestId, error: formatError(error) } }) + "\n"); + }); + } +} + +function handleClaudeStreamEvent(event, work, stream) { + const type = event.type; + if (type === "content_block_start" && event.content_block) { + const block = event.content_block; + if (Number.isFinite(event.index) && block.id) stream.toolIndex.set(event.index, block.id); + handleClaudeContentBlock(block, work, stream); + } else if (type === "content_block_delta" && event.delta) { + const delta = event.delta; + if (delta.type === "text_delta" && typeof delta.text === "string") { + emitAgentDelta(work, stream, delta.text); + } else if (delta.type === "thinking_delta" && typeof delta.thinking === "string") { + emitReasoningDelta(work, stream, delta.thinking); + } else if (delta.type === "input_json_delta" && Number.isFinite(event.index) && typeof delta.partial_json === "string") { + const toolId = stream.toolIndex.get(event.index); + if (toolId) stream.toolDelta.set(toolId, (stream.toolDelta.get(toolId) || "") + delta.partial_json); + } + } else if (type === "content_block_stop" && Number.isFinite(event.index)) { + const toolId = stream.toolIndex.get(event.index); + const partial = toolId && stream.toolDelta.get(toolId); + const tool = toolId && stream.tools.get(toolId); + if (tool && partial) { + tool.arguments = parseToolArguments(partial); + writeNotification("item/updated", { threadId: work.threadId, turnId: work.turnId, item: toolItemJson(work.threadId, work.cwd, tool), updatedAtMs: Date.now() }); + } + } +} + +function handleClaudeContent(content, work, stream) { + const text = textFromContent(content); + if (text && !contentContainsToolUse(content)) { + emitAgentSnapshot(work, stream, text); + } + for (const block of asArray(content)) { + handleClaudeContentBlock(block, work, stream); + } +} + +function handleClaudeToolResults(content, work, stream) { + for (const block of asArray(content)) { + if (String(block && block.type || "").includes("tool_result")) { + const toolId = block.tool_use_id || block.id || "unknown"; + const tool = stream.tools.get(toolId) || { id: toolId, name: "tool", arguments: {}, status: "inProgress", result: "" }; + tool.status = block.is_error ? "failed" : "completed"; + tool.result = textFromContent(block.content) || JSON.stringify(block.content || block); + stream.tools.set(toolId, tool); + writeNotification("item/completed", { threadId: work.threadId, turnId: work.turnId, item: toolItemJson(work.threadId, work.cwd, tool), completedAtMs: Date.now() }); + } + } +} + +function claudeSessionIdFromMessage(message) { + return ( + objectSessionId(message) || + objectSessionId(message && message.message) || + objectSessionId(message && message.event) || + objectSessionId(message && message.result) || + objectSessionId(message && message.response) || + "" + ); +} + +function objectSessionId(value) { + if (!value || typeof value !== "object") return ""; + return stringValue(value.session_id) || stringValue(value.sessionId); +} + +function handleClaudeContentBlock(block, work, stream) { + const type = block && block.type; + if (type === "text" && typeof block.text === "string") { + emitAgentSnapshot(work, stream, block.text); + } else if ((type === "thinking" || type === "thinking_delta") && typeof (block.thinking || block.text) === "string") { + emitReasoningDelta(work, stream, block.thinking || block.text); + } else if (["tool_use", "server_tool_use", "mcp_tool_use"].includes(type)) { + const id = block.id || uuid(); + const tool = { + id, + name: block.name || "tool", + arguments: block.input || {}, + status: "inProgress", + result: "" + }; + stream.tools.set(id, tool); + writeNotification("item/started", { threadId: work.threadId, turnId: work.turnId, item: toolItemJson(work.threadId, work.cwd, tool), startedAtMs: Date.now() }); + } else if (String(type || "").includes("tool_result")) { + handleClaudeToolResults([block], work, stream); + } +} + +function emitAgentDelta(work, stream, text) { + if (!stream.agentStarted) { + stream.agentStarted = true; + writeNotification("item/started", { + threadId: work.threadId, + turnId: work.turnId, + item: { id: work.agentItemId, type: "agentMessage", text: "", status: "inProgress" }, + startedAtMs: Date.now() + }); + } + stream.emitted += text; + writeNotification("item/updated", { + threadId: work.threadId, + turnId: work.turnId, + item: { id: work.agentItemId, type: "agentMessage", text: stream.emitted, status: "inProgress" }, + delta: text, + updatedAtMs: Date.now() + }); +} + +function emitAgentSnapshot(work, stream, text) { + if (!stream.agentStarted && !stream.emitted) { + stream.pending = text; + return; + } + const delta = text.startsWith(stream.emitted) ? text.slice(stream.emitted.length) : text; + if (delta) emitAgentDelta(work, stream, delta); +} + +function emitReasoningDelta(work, stream, text) { + const item = { id: "reasoning-" + work.turnId, type: "reasoning", text, status: "inProgress" }; + writeNotification("item/updated", { threadId: work.threadId, turnId: work.turnId, item, delta: text, updatedAtMs: Date.now() }); +} + +function claudeCommand(work) { + const command = nonEmptyEnv("CCR_CLAUDE_CODE_BIN") || nonEmptyEnv("CODEXL_CLAUDE_CODE_BIN") || "claude"; + if (work.claudeConfigDir) { + ensureClaudeSessionConfig(work.claudeConfigDir); + } + const args = [ + "--print", + "--output-format", "stream-json", + "--input-format", "stream-json", + "--verbose", + "--include-partial-messages" + ]; + const model = nonEmptyEnv("CCR_CLAUDE_CODE_MODEL") || nonEmptyEnv("CODEXL_CLAUDE_CODE_MODEL") || work.model; + if (model) args.push("--model", model); + if (work.resumeExisting && work.claudeSessionId) args.push("--resume", work.claudeSessionId); + const extra = splitShellLike(nonEmptyEnv("CCR_CLAUDE_CODE_EXTRA_ARGS") || nonEmptyEnv("CODEXL_CLAUDE_CODE_EXTRA_ARGS") || ""); + args.push(...extra); + const settingsEnv = work.claudeConfigDir ? claudeSettingsEnv(work.claudeConfigDir) : {}; + const env = withoutKeys({ + ...process.env, + ...settingsEnv, + ...claudeCodeUtcTimezoneEnvOverride(), + CODEX_SESSION_ID: work.threadId, + CODEX_THREAD_ID: work.threadId, + CODEX_TURN_ID: work.turnId + }, ["CCR_CLAUDE_CODE_BOT_WORKER", "ELECTRON_RUN_AS_NODE"]); + if (work.claudeConfigDir) { + env.CLAUDE_CONFIG_DIR = work.claudeConfigDir; + } + return { + command, + args: claudeCodeArgsWithMcpConfig(args, env), + env + }; +} + +function claudeInputMessage(input, sessionId = "") { + return { + type: "user", + session_id: sessionId || "", + message: { role: "user", content: claudeContentFromInput(input) }, + parent_tool_use_id: null + }; +} + +function claudeContentFromInput(input) { + const items = Array.isArray(input) ? input : [input]; + const content = []; + for (const item of items) { + if (typeof item === "string") { + content.push({ type: "text", text: item }); + } else if (item && item.type === "text" && typeof item.text === "string") { + content.push({ type: "text", text: item.text }); + } else if (item && (item.type === "image" || item.type === "localImage")) { + const image = imageContent(item); + content.push(image || { type: "text", text: promptTextForItem(item) }); + } else if (item) { + content.push({ type: "text", text: promptTextForItem(item) }); + } + } + return content.length ? content : [{ type: "text", text: "" }]; +} + +function imageContent(item) { + const url = item.url || item.uri || item.href || item.src; + if (url) return { type: "image", source: { type: "url", url } }; + const filePath = item.path || item.filePath || item.file_path; + const data = item.data || item.dataBase64 || item.base64 || (filePath && safeReadBase64(filePath)); + if (!data) return undefined; + return { type: "image", source: { type: "base64", media_type: item.mimeType || item.mediaType || mimeTypeForPath(filePath), data } }; +} + +function isClaudeOwnedMethod(method) { + return [ + "initialize", "thread/start", "thread/resume", "thread/read", "thread/list", "thread/search", "thread/loaded/list", + "thread/turns/list", "turn/list", "thread/turns/items/list", "thread/archive", "thread/unarchive", "thread/unsubscribe", + "thread/name/set", "thread/metadata/update", "thread/pin", "thread/unpin", "thread/pinned/list", "thread/pins/list", + "thread/memoryMode/get", "thread/memoryMode/set", "thread/memoryMode/clear", "thread/memory/get", "thread/memory/set", + "thread/memory/clear", "thread/prewarm", "thread/prewarm/start", "thread/prewarm/clear", "thread/prewarm/clearAll", + "thread/goal/get", "thread/goal/set", "thread/goal/clear", "turn/start", "turn/interrupt", "turn/steer", + "account/read", "getAuthStatus", "config/read", "config/value/write", "config/batchWrite", "model/list", + "modelProvider/capabilities/read", "permissionProfile/list", "skills/list", "plugin/list", "app/list", "mcpServerStatus/list", + "experimentalFeature/list", "hooks/list", "collaborationMode/list", "configRequirements/read", "config/mcpServer/reload", "memory/reset" + ].includes(method); +} + +function standaloneCodexAppResult(method, params) { + if (method === "fs/readFile") { + const file = String(params.path || ""); + return { dataBase64: safeReadBase64(file) || "" }; + } + if (["extension/list", "extensions/list", "skills/list", "plugin/list", "app/list", "mcpServerStatus/list", "permissionProfile/list", "experimentalFeature/list"].includes(method)) { + return { data: [], marketplaces: method === "plugin/list" ? [] : undefined, nextCursor: null }; + } + if (method === "hooks/list") return { data: [] }; + if (method === "collaborationMode/list") return collaborationModes(); + if (method === "model/list") return modelList(params); + if (method === "modelProvider/capabilities/read") return { namespaceTools: false, imageGeneration: false, webSearch: false }; + if (method === "configRequirements/read") return { requirements: null }; + if (method === "remoteControl/status/read") return { enabled: false, status: "unavailable" }; + if (method === "config/value/write" || method === "config/batchWrite") return configWriteResponse(params); + if (method.startsWith("plugin/") || method.startsWith("marketplace/") || method.startsWith("mcpServer/") || method === "memory/reset" || method === "config/mcpServer/reload") return {}; + return undefined; +} + +function threadJson(thread, includeTurns) { + return { + id: thread.id, + threadId: thread.id, + conversationId: thread.id, + sessionId: thread.sessionId, + claudeSessionId: thread.claudeSessionId, + path: thread.path, + preview: thread.preview, + cwd: thread.cwd, + gitInfo: thread.gitInfo, + workspaceKind: thread.workspaceKind, + workspaceRoots: thread.workspaceRoots, + workspaceBrowserRoot: thread.workspaceBrowserRoot, + projectlessOutputDirectory: thread.projectlessOutputDirectory, + model: thread.model, + reasoningEffort: thread.reasoningEffort, + serviceTier: thread.serviceTier, + collaborationMode: thread.collaborationMode, + createdAt: thread.createdAt, + updatedAt: thread.updatedAt, + archived: thread.archived, + name: thread.name, + title: thread.name || thread.preview || "Claude Code", + approvalPolicy: thread.approvalPolicy, + approvalsReviewer: thread.approvalsReviewer, + latestTokenUsageInfo: thread.latestTokenUsageInfo, + turns: includeTurns ? thread.turns.map((turn) => turnJson(turn, true)) : [] + }; +} + +function turnJson(turn, includeItems) { + return { + id: turn.id, + turnId: turn.id, + status: turn.status, + input: turn.input, + items: includeItems ? turnItems(turn) : [], + agentText: turn.agentText, + error: turn.error, + startedAt: turn.startedAt, + completedAt: turn.completedAt, + durationMs: turn.durationMs, + approvalPolicy: turn.approvalPolicy, + approvalsReviewer: turn.approvalsReviewer, + reasoningEffort: turn.reasoningEffort, + serviceTier: turn.serviceTier, + collaborationMode: turn.collaborationMode + }; +} + +function turnItems(turn) { + const items = [userItemJson(turn)]; + items.push(...turn.toolItems); + if (turn.agentText) items.push(agentItemJson(turn)); + return items; +} + +function userItemJson(turn) { + return { id: "user-" + turn.id, type: "userMessage", input: turn.input, status: "completed" }; +} + +function agentItemJson(turn) { + return { id: agentItemIdForTurn(turn.id), type: "agentMessage", text: turn.agentText, status: turn.status === "completed" ? "completed" : turn.status }; +} + +function toolItemJson(threadId, cwd, tool) { + return { + id: tool.id, + type: "mcpToolCall", + name: tool.name, + toolName: tool.name, + input: tool.arguments || {}, + arguments: tool.arguments || {}, + result: tool.result || null, + status: tool.status || "inProgress", + threadId, + cwd + }; +} + +function threadRuntimeResponse(thread, includeTurns) { + return { thread: threadJson(thread, includeTurns), conversationId: thread.id, threadId: thread.id }; +} + +function threadStreamState(thread) { + return { threadId: thread.id, thread: threadJson(thread, true), state: "loaded" }; +} + +function applyThreadMetadata(thread, params) { + if (typeof params.cwd === "string" && params.cwd.trim()) thread.cwd = normalizeCwd(params.cwd); + if (typeof params.model === "string" && params.model.trim()) thread.model = params.model.trim(); + if (params.reasoningEffort !== undefined) thread.reasoningEffort = params.reasoningEffort; + if (params.serviceTier !== undefined) thread.serviceTier = params.serviceTier; + if (params.collaborationMode !== undefined) thread.collaborationMode = params.collaborationMode; + if (params.approvalPolicy) thread.approvalPolicy = params.approvalPolicy; + if (params.approvalsReviewer) thread.approvalsReviewer = params.approvalsReviewer; + if (params.name !== undefined || params.title !== undefined) thread.name = params.name || params.title || null; + thread.updatedAt = nowSeconds(); +} + +function requiredThreadId(params) { + return params.threadId || params.thread_id || params.conversationId || params.conversation_id; +} + +function promptFromInput(input, params) { + const parts = []; + for (const item of input) { + const text = promptTextForItem(item); + if (text) parts.push(text); + } + if (params.prompt) parts.push(String(params.prompt)); + return parts.join("\n\n").trim() || JSON.stringify(input); +} + +function promptTextForItem(item) { + if (typeof item === "string") return item; + if (!item || typeof item !== "object") return ""; + if (typeof item.text === "string") return item.text; + if (typeof item.content === "string") return item.content; + if (item.type === "mention") return "@" + (item.name || item.path || "mention"); + try { + return JSON.stringify(item); + } catch { + return String(item); + } +} + +function collaborationModes() { + return { data: [ + { mode: "plan", model: DEFAULT_MODEL, reasoning_effort: null }, + { mode: "default", model: DEFAULT_MODEL, reasoning_effort: null } + ] }; +} + +function modelList(params, existingResult) { + const runtimeAgent = codexRuntimeAgent(); + const isClaudeCodeRuntime = normalizeRemoteFrontendMode(agentEnv(runtimeAgent, "REMOTE_FRONTEND_MODE", "CORE_MODE")) === "claude-code"; + const configured = normalizeModelSelector(agentEnv(runtimeAgent, "MODEL") || nonEmptyEnv("CODEXL_CLAUDE_CODE_MODEL")); + const selected = configured || (isClaudeCodeRuntime ? DEFAULT_MODEL : ""); + const fallbackIds = isClaudeCodeRuntime + ? [configured].filter(Boolean) + : [configured].filter((model) => model && !isClaudeCodeOnlyModel(model)); + const models = mergeModelListItems(extractModelListItems(existingResult), [...catalogModelIds(), ...fallbackIds], selected); + const offset = Number(params.cursor || 0) || 0; + const limit = Number(params.limit || models.length) || models.length; + const data = models.slice(offset, offset + limit); + return { + ...(existingResult && typeof existingResult === "object" && !Array.isArray(existingResult) ? existingResult : {}), + data, + models: data, + nextCursor: offset + limit < models.length ? String(offset + limit) : null + }; +} + +function catalogModelIds() { + const values = parseModelCatalogEnv(); + return values.map(normalizeModelSelector).filter(Boolean); +} + +function parseModelCatalogEnv() { + const file = modelCatalogFileEnv(); + if (file) { + const parsed = readJsonFile(file); + if (parsed) { + return modelIdsFromJson(parsed); + } + log("model_catalog_parse_error", { source: "file", file }); + } + const encoded = agentEnv(codexRuntimeAgent(), "MODEL_CATALOG_B64"); + if (encoded) { + try { + return modelIdsFromJson(JSON.parse(Buffer.from(encoded, "base64").toString("utf8"))); + } catch (error) { + log("model_catalog_parse_error", { source: "base64", error: formatError(error) }); + } + } + const raw = agentEnv(codexRuntimeAgent(), "MODEL_CATALOG"); + if (raw) { + try { + return modelIdsFromJson(JSON.parse(raw)); + } catch (error) { + log("model_catalog_parse_error", { source: "json", error: formatError(error) }); + } + } + return []; +} + +function modelIdsFromJson(value) { + const output = []; + collectModelIdsFromJson(value, output); + return output; +} + +function collectModelIdsFromJson(value, output) { + if (Array.isArray(value)) { + for (const item of value) { + collectModelIdFromJsonItem(item, output); + } + return; + } + if (value && typeof value === "object") { + let foundList = false; + for (const key of ["models", "data", "items", "results", "model_list"]) { + if (Array.isArray(value[key])) { + foundList = true; + collectModelIdsFromJson(value[key], output); + } + } + if (!foundList) { + collectModelIdFromJsonItem(value, output); + } + } +} + +function collectModelIdFromJsonItem(item, output) { + if (typeof item === "string") { + output.push(item); + return; + } + if (item && typeof item === "object") { + const id = firstString(item, ["/model", "/id", "/slug", "/display_name", "/displayName", "/name", "/label"]); + if (id) output.push(id); + } +} + +function mergeModelListItems(existingItems, catalogIds, selectedModel) { + const seen = new Set(); + const output = []; + for (const item of existingItems) { + const id = normalizeModelSelector(modelItemId(item)); + if (!id || seen.has(id.toLowerCase())) continue; + seen.add(id.toLowerCase()); + output.push(typeof item === "object" && item !== null ? { ...item, id: item.id || id, model: item.model || id } : codexModelItem(id, selectedModel)); + } + for (const rawId of catalogIds) { + const id = normalizeModelSelector(rawId); + if (!id || seen.has(id.toLowerCase())) continue; + seen.add(id.toLowerCase()); + output.push(codexModelItem(id, selectedModel)); + } + return output; +} + +function extractModelListItems(result) { + if (Array.isArray(result)) return result; + if (!result || typeof result !== "object") return []; + for (const key of ["models", "data", "items"]) { + if (Array.isArray(result[key])) return result[key]; + } + return []; +} + +function modelItemId(item) { + if (typeof item === "string") return item; + if (!item || typeof item !== "object") return ""; + return firstString(item, ["/model", "/id", "/slug", "/name", "/label"]) || ""; +} + +function codexModelItem(model, selectedModel) { + const provider = modelProviderFromSelector(model) || agentEnv(codexRuntimeAgent(), "MODEL_PROVIDER") || "claude-code-router"; + const displayName = modelDisplayName(model); + return { + id: model, + model, + name: model, + label: model, + provider, + providerName: provider, + modelProvider: provider, + displayName, + description: "CCR model", + hidden: false, + isDefault: model === selectedModel, + contextWindow: 0, + inputModalities: ["text", "image"], + supportedReasoningEfforts: [], + defaultReasoningEffort: null, + supportsPersonality: false, + additionalSpeedTiers: [], + serviceTiers: [], + defaultServiceTier: null, + upgrade: null, + upgradeInfo: null, + availabilityNux: null + }; +} + +function normalizeModelSelector(value) { + const trimmed = String(value || "").trim(); + if (!trimmed) return ""; + const commaIndex = trimmed.indexOf(","); + if (commaIndex > 0 && commaIndex < trimmed.length - 1) { + const provider = trimmed.slice(0, commaIndex).trim(); + const model = trimmed.slice(commaIndex + 1).trim(); + return provider && model ? provider + "/" + model : ""; + } + return trimmed; +} + +function modelProviderFromSelector(model) { + const slashIndex = model.indexOf("/"); + return slashIndex > 0 && slashIndex < model.length - 1 ? model.slice(0, slashIndex) : ""; +} + +function modelDisplayName(model) { + const slashIndex = model.indexOf("/"); + return slashIndex > 0 && slashIndex < model.length - 1 ? model.slice(slashIndex + 1) : model; +} + +function isClaudeCodeOnlyModel(model) { + const normalized = String(model || "").trim().toLowerCase(); + return normalized === DEFAULT_MODEL || + normalized === "claude-opus-4-5" || + normalized === "claude-haiku-4-5"; +} + +function configRead(params, values) { + const cwd = params.cwd || process.cwd(); + const runtimeAgent = codexRuntimeAgent(); + return { + config: { + ...values, + cwd, + model: agentEnv(runtimeAgent, "MODEL") || DEFAULT_MODEL, + model_catalog_json: JSON.stringify(modelCatalogConfigValue()), + model_provider: agentEnv(runtimeAgent, "MODEL_PROVIDER") || "claude-code", + approval_policy: "default" + // sandbox_mode intentionally omitted: let Codex read it from its own + // config.toml (e.g. [windows] sandbox) instead of forcing workspace-write. + // Forcing workspace-write triggers codex-windows-sandbox-setup.exe on every + // command, which fails on systems where the COM+ catalog is unavailable + // (see openai/codex#29332), surfacing as repeated error dialogs. + } + }; +} + +function modelCatalogConfigValue() { + const file = modelCatalogFileEnv(); + if (file) { + const parsed = readJsonFile(file); + if (parsed && typeof parsed === "object") { + return parsed; + } + log("model_catalog_parse_error", { source: "file-config", file }); + } + const encoded = agentEnv(codexRuntimeAgent(), "MODEL_CATALOG_B64"); + if (encoded) { + try { + const parsed = JSON.parse(Buffer.from(encoded, "base64").toString("utf8")); + if (parsed && typeof parsed === "object") return parsed; + } catch (error) { + log("model_catalog_parse_error", { source: "base64-config", error: formatError(error) }); + } + } + return { models: catalogModelIds().map((model, index) => modelCatalogConfigItem(model, index)) }; +} + +function modelCatalogFileEnv() { + const runtimeAgent = codexRuntimeAgent(); + return agentEnv(runtimeAgent, "MODEL_CATALOG_FILE") || + agentEnv(runtimeAgent, "MODEL_CATALOG_PATH"); +} + +function modelCatalogConfigItem(model, priority) { + return { + slug: model, + display_name: model, + description: "CCR gateway model " + model, + default_reasoning_level: null, + supported_reasoning_levels: [], + shell_type: "shell_command", + visibility: "list", + supported_in_api: true, + priority, + additional_speed_tiers: [], + service_tiers: [], + availability_nux: null, + upgrade: null, + base_instructions: "You are Codex, a coding agent.", + supports_reasoning_summaries: false, + default_reasoning_summary: "none", + support_verbosity: true, + default_verbosity: "low", + apply_patch_tool_type: null, + web_search_tool_type: "text", + truncation_policy: { mode: "tokens", limit: 10000 }, + supports_parallel_tool_calls: false, + supports_image_detail_original: false, + context_window: 128000, + max_context_window: 128000, + effective_context_window_percent: 95, + experimental_supported_tools: [], + input_modalities: ["text"], + supports_search_tool: false + }; +} + +function applyConfigWrite(method, params, values) { + if (method === "config/value/write" && params.key) values[params.key] = params.value; + const entries = Array.isArray(params.values) ? params.values : Array.isArray(params.items) ? params.items : []; + for (const entry of entries) { + if (entry && entry.key) values[entry.key] = entry.value; + } +} + +function configWriteResponse(params) { + return { config: params.config || null, ok: true }; +} + +function loadChatGptAuth() { + const workspaceName = nonEmptyEnv("CCR_CODEX_WORKSPACE_NAME") || + nonEmptyEnv("CODEXL_CODEX_WORKSPACE_NAME") || + nonEmptyEnv("CODEXL_CODEX_INSTANCE_NAME") || + agentEnv("codex", "PROFILE"); + const fallback = { + authToken: "", + email: "", + planType: "", + workspaceName + }; + const value = readJsonFile(path.join(codexRuntimeHome(), "auth.json")); + if (!value || !isPlainObject(value)) return fallback; + if (typeof value.auth_mode === "string" && value.auth_mode !== "chatgpt") return fallback; + if (!isPlainObject(value.tokens)) return fallback; + + const authToken = stringValue(value.tokens.access_token); + const idToken = stringValue(value.tokens.id_token); + const claims = jwtPayloadClaims(authToken) || jwtPayloadClaims(idToken) || {}; + const profileClaims = isPlainObject(claims["https://api.openai.com/profile"]) + ? claims["https://api.openai.com/profile"] + : {}; + const authClaims = isPlainObject(claims["https://api.openai.com/auth"]) + ? claims["https://api.openai.com/auth"] + : {}; + return { + authToken, + email: stringValue(profileClaims.email) || stringValue(claims.email) || stringValue(value.email), + planType: stringValue(authClaims.chatgpt_plan_type) || stringValue(claims.chatgpt_plan_type), + workspaceName + }; +} + +function jwtPayloadClaims(token) { + if (!token) return undefined; + const payload = String(token).split(".")[1]; + if (!payload) return undefined; + try { + const normalized = payload.replace(/-/g, "+").replace(/_/g, "/"); + const padded = normalized + "=".repeat((4 - normalized.length % 4) % 4); + const value = JSON.parse(Buffer.from(padded, "base64").toString("utf8")); + return isPlainObject(value) ? value : undefined; + } catch { + return undefined; + } +} + +function codexAppAccountRead(auth) { + return { + account: { + type: "chatgpt", + email: auth.email || auth.workspaceName || "codex", + planType: auth.planType || "unknown" + }, + requiresOpenaiAuth: true + }; +} + +function codexAppAuthStatus(auth, includeToken) { + const result = { + authMethod: "chatgpt", + requiresOpenaiAuth: true + }; + if (includeToken) result.authToken = auth.authToken || null; + return result; +} + +function mockAccountRead() { + return { + account: { type: "amazonBedrock", credentialSource: "codexManaged" }, + requiresOpenaiAuth: false + }; +} + +function mockAuthStatus(includeToken) { + const result = { authMethod: "amazonBedrock", authToken: null, requiresOpenaiAuth: false }; + if (includeToken) result.authToken = "ccr-local-profile"; + return result; +} + +function mergeForeignThreadList(value, _params) { + return value; +} + +function rememberUsage(message, work, stream) { + const usage = message.usage || (message.message && message.message.usage); + if (!usage) return; + stream.latestUsage = { model: work.model || DEFAULT_MODEL, usage }; + writeNotification("thread/tokenUsage/updated", { + threadId: work.threadId, + conversationId: work.threadId, + latestTokenUsageInfo: stream.latestUsage + }); +} + +function permissionRequestParams(work, requestId, message) { + const toolName = firstString(message, ["/request/tool_name", "/request/toolName", "/request/name", "/tool_name", "/toolName", "/name"]) || "tool"; + const serverName = firstString(message, ["/request/server_name", "/request/serverName", "/params/serverName"]); + const label = serverName ? serverName + "/" + toolName : toolName; + return { + threadId: work.threadId, + turnId: work.turnId, + itemId: firstString(message, ["/request/tool_use_id", "/request/toolUseId", "/params/tool_use_id"]) || requestId, + cwd: work.cwd, + reason: "Claude Code wants to use " + label + ".", + permissions: { network: { enabled: true }, fileSystem: { read: [work.cwd], write: [work.cwd] } } + }; +} + +function elicitationRequestParams(work, requestId, message) { + return { + threadId: work.threadId, + turnId: work.turnId, + itemId: requestId, + mode: firstString(message, ["/request/mode", "/params/mode"]) || "form", + message: firstString(message, ["/request/message", "/params/message", "/message"]) || "Codex requests input from an MCP server.", + requestedSchema: pointer(message, "/request/requestedSchema") || pointer(message, "/params/requestedSchema") || { type: "object", properties: {} } + }; +} + +function claudeControlPermissionResponse(message, requestId, approval) { + const allows = permissionResponseAllows(approval); + const response = allows + ? { behavior: "allow", updatedInput: pointer(message, "/request/input") || pointer(message, "/params/input") || {} } + : { behavior: "deny", message: "Denied in ChatGPT" }; + const toolUseId = firstString(message, ["/request/tool_use_id", "/request/toolUseId", "/params/tool_use_id"]); + if (toolUseId) response.toolUseID = toolUseId; + return { type: "control_response", response: { subtype: "success", request_id: requestId, response } }; +} + +function claudeControlElicitationResponse(requestId, value) { + return { type: "control_response", response: { subtype: "success", request_id: requestId, response: value || {} } }; +} + +async function waitForAppResponse(map, requestId, timeoutMs) { + const started = Date.now(); + while (Date.now() - started < timeoutMs) { + if (map.has(requestId)) { + const value = map.get(requestId); + map.delete(requestId); + return value; + } + await sleep(100); + } + throw new Error("Timed out waiting for ChatGPT response: " + requestId); +} + +function permissionResponseAllows(value) { + if (!value) return false; + if (value.approved === true || value.allow === true || value.allowed === true || value.decision === "allow") return true; + if (value.approved === false || value.allow === false || value.allowed === false || value.decision === "deny") return false; + if (typeof value === "boolean") return value; + return Boolean(value); +} + +function writeResponse(id, result) { + writeRaw({ id, result }); +} + +function writeError(id, code, message) { + writeRaw({ id, error: { code, message } }); +} + +function writeNotification(method, params) { + writeRaw({ method, params }); +} + +function writeRaw(value) { + botBridge().handleJsonRpcValue(value); + writeLine(process.stdout, value); +} + +function writeLine(stream, value) { + stream.write(JSON.stringify(value) + "\n"); +} + +function createRemoteSyncClient(options) { + const endpoint = normalizeRemoteSyncEndpoint(nonEmptyEnv("CCR_REMOTE_SYNC_ENDPOINT")); + const enabled = endpoint && !["0", "false", "no", "off"].includes(String(process.env.CCR_REMOTE_SYNC_ENABLED || "1").trim().toLowerCase()); + if (!enabled || typeof fetch !== "function") { + return { + postEvent: async () => {}, + start() {}, + stop() {} + }; + } + return new RemoteSyncClient({ + args: options.args || [], + cwd: options.cwd || process.cwd(), + endpoint, + mode: options.mode || "agent", + title: options.title || "CCR Remote", + profileId: nonEmptyEnv("CCR_REMOTE_SYNC_PROFILE_ID"), + profileName: nonEmptyEnv("CCR_REMOTE_SYNC_PROFILE_NAME") + }); +} + +class RemoteSyncClient { + constructor(options) { + this.options = options; + this.active = false; + this.apiKey = ""; + this.lastInboundSeq = 0; + this.pollTimer = null; + this.ready = null; + this.seenInbound = new Set(); + this.sessionId = nonEmptyEnv("CCR_REMOTE_SYNC_SESSION_ID") || "ccr-" + safePathSegment(options.profileId || options.profileName || options.mode) + "-" + uuid(); + } + + start(onInbound) { + if (this.active) return; + this.active = true; + this.ready = this.open().catch((error) => { + this.active = false; + log("remote_sync_start_failed", { error: formatError(error) }); + }); + this.ready.then(() => { + if (this.active) this.pollInbound(onInbound); + }).catch(() => {}); + } + + stop() { + this.active = false; + if (this.pollTimer) { + clearTimeout(this.pollTimer); + this.pollTimer = null; + } + } + + async open() { + this.apiKey = await readRemoteSyncApiKey(); + const response = await this.request("POST", "/sessions", { + id: this.sessionId, + title: this.options.title, + metadata: { + args: this.options.args, + cwd: this.options.cwd, + mode: this.options.mode, + pid: process.pid, + profileId: this.options.profileId, + profileName: this.options.profileName, + startedAt: new Date().toISOString() + } + }); + const session = response && response.session; + if (session && session.id) this.sessionId = session.id; + log("remote_sync_started", { sessionId: this.sessionId, endpoint: this.options.endpoint }); + } + + postEvent(type, payload, options) { + if (!this.active) return Promise.resolve(); + const eventOptions = options || {}; + return Promise.resolve(this.ready) + .then(() => { + if (!this.active || !this.sessionId) return undefined; + return this.request("POST", "/sessions/" + encodeURIComponent(this.sessionId) + "/events", { + direction: eventOptions.direction || "local", + payload: payload || {}, + source: "ccr-claude-wrapper", + text: eventOptions.text, + type + }); + }) + .catch((error) => { + log("remote_sync_event_failed", { type, error: formatError(error) }); + }); + } + + pollInbound(onInbound) { + if (!this.active) return; + this.request("GET", "/sessions/" + encodeURIComponent(this.sessionId) + "/inbound?after=" + this.lastInboundSeq) + .then((response) => { + const events = Array.isArray(response && response.events) ? response.events : []; + for (const event of events) { + if (!event || !Number.isFinite(event.seq)) continue; + this.lastInboundSeq = Math.max(this.lastInboundSeq, event.seq); + const key = event.id || event.dedupeKey || String(event.seq); + if (this.seenInbound.has(key)) continue; + this.seenInbound.add(key); + while (this.seenInbound.size > 500) { + const oldest = this.seenInbound.values().next().value; + if (!oldest) break; + this.seenInbound.delete(oldest); + } + try { + onInbound(event); + } catch (error) { + log("remote_sync_inbound_handler_failed", { error: formatError(error) }); + } + } + }) + .catch((error) => { + log("remote_sync_poll_failed", { error: formatError(error) }); + }) + .finally(() => { + if (!this.active) return; + this.pollTimer = setTimeout(() => this.pollInbound(onInbound), numberEnv("CCR_REMOTE_SYNC_POLL_INTERVAL_MS", 2000)); + }); + } + + async request(method, suffix, body) { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), numberEnv("CCR_REMOTE_SYNC_REQUEST_TIMEOUT_MS", 5000)); + const headers = { "accept": "application/json" }; + if (body !== undefined) headers["content-type"] = "application/json"; + if (this.apiKey) headers.authorization = "Bearer " + this.apiKey; + try { + const response = await fetch(remoteSyncUrl(this.options.endpoint, suffix), { + method, + headers, + body: body === undefined ? undefined : JSON.stringify(body), + signal: controller.signal + }); + if (!response.ok) { + throw new Error("HTTP " + response.status + " from CCR remote sync"); + } + return await response.json(); + } finally { + clearTimeout(timeout); + } + } +} + +async function readRemoteSyncApiKey() { + const direct = nonEmptyEnv("CCR_REMOTE_SYNC_API_KEY"); + if (direct) return direct; + const helper = nonEmptyEnv("CCR_REMOTE_SYNC_API_KEY_HELPER"); + if (!helper) return ""; + return new Promise((resolve) => { + childProcess.execFile(expandHome(helper), { + shell: process.platform === "win32", + timeout: 3000, + windowsHide: true + }, (error, stdout) => { + if (error) { + log("remote_sync_api_key_helper_failed", { error: formatError(error) }); + resolve(""); + return; + } + resolve(String(stdout || "").split(/\r?\n/).map((line) => line.trim()).find(Boolean) || ""); + }); + }); +} + +function normalizeRemoteSyncEndpoint(value) { + const trimmed = String(value || "").trim().replace(/\/+$/, ""); + return trimmed || ""; +} + +function remoteSyncUrl(endpoint, suffix) { + return endpoint + (String(suffix || "").startsWith("/") ? suffix : "/" + suffix); +} + +function remoteEventText(event) { + if (!event || typeof event !== "object") return ""; + if (typeof event.text === "string" && event.text.trim()) return event.text.trim(); + const payload = event.payload; + if (typeof payload === "string" && payload.trim()) return payload.trim(); + if (payload && typeof payload === "object") { + if (typeof payload.text === "string" && payload.text.trim()) return payload.text.trim(); + if (typeof payload.content === "string" && payload.content.trim()) return payload.content.trim(); + if (typeof payload.message === "string" && payload.message.trim()) return payload.message.trim(); + } + return ""; +} + +function createBotGatewayBridge() { + const config = readBotGatewayBridgeConfig(); + if (!config.enabled) { + return { + handleClaudeCliLine() {}, + handleJsonRpcLine() {}, + handleJsonRpcValue() {}, + sendReplyToEvent: async () => {}, + setInboundHandler() {}, + stop: async () => {}, + suppressTurn() {}, + unsuppressTurn() {} + }; + } + const bridge = new BotGatewayBridge(config); + process.once("exit", () => bridge.stop()); + return bridge; +} + +function readBotGatewayBridgeConfig() { + const enabled = boolEnv("CCR_BOT_GATEWAY_ENABLED") || boolEnv("CODEXL_BOT_GATEWAY_ENABLED"); + const platform = normalizeBotGatewayPlatform(nonEmptyEnv("CCR_BOT_GATEWAY_PLATFORM") || nonEmptyEnv("CODEXL_BOT_GATEWAY_PLATFORM") || "none"); + const handoffEnabled = boolEnv("CCR_BOT_HANDOFF_ENABLED") || boolEnv("CODEXL_BOT_HANDOFF_ENABLED"); + return { + acknowledgeEvents: boolEnv("CCR_BOT_GATEWAY_ACK_EVENTS"), + args: jsonArrayEnv("CCR_BOT_GATEWAY_ARGS_JSON"), + authType: normalizeBotGatewayAuthType(platform, nonEmptyEnv("CCR_BOT_GATEWAY_AUTH_TYPE") || ""), + autoStartIntegration: boolEnv("CCR_BOT_GATEWAY_AUTO_START_INTEGRATION"), + command: nonEmptyEnv("CCR_BOT_GATEWAY_COMMAND") || "", + conversationRef: jsonObjectEnv("CCR_BOT_GATEWAY_CONVERSATION_REF_JSON"), + createIntegration: boolEnv("CCR_BOT_GATEWAY_CREATE_INTEGRATION"), + credentials: sanitizeBotGatewayRecord(jsonObjectEnv("CCR_BOT_GATEWAY_CREDENTIALS_JSON") || {}), + cwd: nonEmptyEnv("CCR_BOT_GATEWAY_CWD") || "", + enabled: enabled && platform !== "none", + forwardAllAgentMessages: boolEnv("CCR_BOT_GATEWAY_FORWARD_ALL_AGENT_MESSAGES") || boolEnv("CODEXL_BOT_GATEWAY_FORWARD_ALL_CODEX_MESSAGES"), + handoff: { + enabled: handoffEnabled, + idleSeconds: numberEnv("CCR_BOT_HANDOFF_IDLE_SECONDS", numberEnv("CODEXL_BOT_HANDOFF_IDLE_SECONDS", 30)), + phoneBluetoothTargets: listEnv("CCR_BOT_HANDOFF_PHONE_BLUETOOTH_TARGETS") || listEnv("CODEXL_BOT_HANDOFF_PHONE_BLUETOOTH_TARGETS"), + phoneWifiTargets: listEnv("CCR_BOT_HANDOFF_PHONE_WIFI_TARGETS") || listEnv("CODEXL_BOT_HANDOFF_PHONE_WIFI_TARGETS"), + screenLock: boolEnv("CCR_BOT_HANDOFF_SCREEN_LOCK") || boolEnv("CODEXL_BOT_HANDOFF_SCREEN_LOCK"), + userIdle: boolEnv("CCR_BOT_HANDOFF_USER_IDLE") || boolEnv("CODEXL_BOT_HANDOFF_USER_IDLE") + }, + integrationConfig: websocketBotGatewayIntegrationConfig(platform, jsonObjectEnv("CCR_BOT_GATEWAY_CONFIG_JSON") || {}), + integrationId: nonEmptyEnv("CCR_BOT_GATEWAY_INTEGRATION_ID") || nonEmptyEnv("CODEXL_BOT_GATEWAY_INTEGRATION_ID") || "", + platform, + pollIntervalMs: numberEnv("CCR_BOT_GATEWAY_POLL_INTERVAL_MS", 2000), + profileId: nonEmptyEnv("CCR_BOT_PROFILE_ID") || agentEnv(codexRuntimeAgent(), "PROFILE") || "default", + profileName: nonEmptyEnv("CCR_BOT_PROFILE_NAME") || agentEnv(codexRuntimeAgent(), "WORKSPACE_NAME") || "CCR", + requestTimeoutMs: numberEnv("CCR_BOT_GATEWAY_REQUEST_TIMEOUT_MS", 600000), + sourceDir: nonEmptyEnv("CCR_BOT_GATEWAY_SOURCE_DIR") || "", + startupTimeoutMs: numberEnv("CCR_BOT_GATEWAY_STARTUP_TIMEOUT_MS", 10000), + stateDir: nonEmptyEnv("CCR_BOT_GATEWAY_STATE_DIR") || nonEmptyEnv("CODEXL_BOT_GATEWAY_STATE_DIR") || nonEmptyEnv("BOT_GATEWAY_STATE_DIR") || "", + tenantId: nonEmptyEnv("CCR_BOT_GATEWAY_TENANT_ID") || nonEmptyEnv("CODEXL_BOT_GATEWAY_TENANT_ID") || "ccr" + }; +} + +function normalizeBotGatewayPlatform(value) { + const normalized = String(value || "").trim().toLowerCase(); + if (!normalized || normalized === "off" || normalized === "disabled") return "none"; + if (normalized === "lark") return "feishu"; + if (normalized === "dingding") return "dingtalk"; + if (["wechat", "weixin", "wx", "weixin-ilink", "weixin_ilink", "ilink"].includes(normalized)) return "weixin-ilink"; + if (["wecom", "wework", "wechat-work", "work-weixin", "enterprise-wechat"].includes(normalized)) return "wecom"; + return normalized; +} + +function normalizeBotGatewayAuthType(platform, value) { + const normalized = String(value || "").trim().toLowerCase().replace(/-/g, "_"); + if (!platform || platform === "none") return ""; + if (!normalized || normalized === "default" || normalized === "auto" || normalized === "webhook" || normalized === "webhook_secret" || normalized === "outgoing_webhook") { + return defaultBotGatewayAuthType(platform); + } + if (normalized === "appsecret") return "app_secret"; + if (normalized === "bottoken" || normalized === "token") return "bot_token"; + if (normalized === "oauth" || normalized === "oauth_2") return "oauth2"; + if (["qr", "qr_login", "qrcode", "qr_code"].includes(normalized)) return "qr_login"; + return normalized; +} + +function defaultBotGatewayAuthType(platform) { + if (platform === "weixin-ilink") return "qr_login"; + if (platform === "feishu" || platform === "dingtalk" || platform === "wecom") return "app_secret"; + if (platform === "slack" || platform === "discord" || platform === "telegram" || platform === "line") return "bot_token"; + return ""; +} + +function websocketBotGatewayIntegrationConfig(platform, value) { + const config = sanitizeBotGatewayRecord(value); + delete config.transport; + delete config.sendMode; + const transport = botGatewayWebSocketTransport(platform); + return transport ? { ...config, transport } : config; +} + +function botGatewayWebSocketTransport(platform) { + if (!platform || platform === "none") return ""; + return platform === "slack" ? "socket" : "websocket"; +} + +function sanitizeBotGatewayRecord(value) { + const result = {}; + if (!value || typeof value !== "object" || Array.isArray(value)) return result; + for (const [key, rawValue] of Object.entries(value)) { + if (!key.trim() || isWebhookRelatedBotGatewayKey(key)) continue; + result[key] = rawValue; + } + return result; +} + +function isWebhookRelatedBotGatewayKey(key) { + const normalized = key.trim().toLowerCase().replace(/[_-]+/g, ""); + return normalized.includes("webhook") || normalized === "sendmode"; +} + +class BotGatewayBridge { + constructor(config) { + this.config = config; + this.child = null; + this.client = null; + this.forwarded = new Set(); + this.inboundHandler = null; + this.inboundEvents = new Set(); + this.latestEvent = null; + this.messageCounter = 0; + this.pollTimer = null; + this.startPromise = null; + this.suppressedTurnIds = new Set(); + this.claudeCliCapture = { finalText: "", resultCount: 0, text: "" }; + this.turnCaptures = new Map(); + } + + setInboundHandler(handler) { + this.inboundHandler = typeof handler === "function" ? handler : null; + if (this.inboundHandler) { + this.ensureStarted().catch((error) => this.logError("start_failed", error)); + } + } + + suppressTurn(turnId) { + if (turnId) this.suppressedTurnIds.add(String(turnId)); + } + + unsuppressTurn(turnId) { + if (turnId) this.suppressedTurnIds.delete(String(turnId)); + } + + async stop() { + if (this.pollTimer) { + clearInterval(this.pollTimer); + this.pollTimer = null; + } + const client = this.client; + this.client = null; + this.startPromise = null; + await closeBotGatewayClient(client); + } + + handleClaudeCliLine(line) { + if (!line || !this.config.enabled) return; + let message; + try { + message = JSON.parse(line); + } catch { + return; + } + if (!message || typeof message !== "object") return; + if (message.type === "stream_event" && message.event) { + this.captureClaudeStreamEvent(message.event); + return; + } + if (message.type === "assistant" && message.message && message.message.content) { + const text = textFromContent(message.message.content); + if (text) this.claudeCliCapture.finalText = text; + return; + } + if (message.type === "result") { + const errorText = message.is_error ? stringValue(message.result) || "Claude Code returned an error" : ""; + const text = errorText + ? "Agent turn failed: " + errorText + : this.claudeCliCapture.finalText || stringValue(message.result) || this.claudeCliCapture.text; + this.completeClaudeCliCapture(text, Boolean(errorText)); + return; + } + const result = stringValue(message.result); + if (result && !message.method && !message.params) { + this.completeClaudeCliCapture(result, false); + } + } + + captureClaudeStreamEvent(event) { + if (!event || typeof event !== "object") return; + if (event.type === "content_block_delta" && event.delta && event.delta.type === "text_delta" && typeof event.delta.text === "string") { + this.claudeCliCapture.text += event.delta.text; + return; + } + if (event.type === "content_block_start" && event.content_block) { + const text = textFromContent([event.content_block]); + if (text) this.claudeCliCapture.finalText = text; + } + } + + completeClaudeCliCapture(text, isError) { + const trimmed = typeof text === "string" ? text.trim() : ""; + if (!trimmed) return; + this.claudeCliCapture.resultCount += 1; + const key = [ + isError ? "claude-cli-error" : "claude-cli", + process.pid, + this.claudeCliCapture.resultCount, + trimmed.length + ].join(":"); + this.forwardAgentText(key, trimmed, {}); + this.claudeCliCapture.finalText = ""; + this.claudeCliCapture.text = ""; + } + + handleJsonRpcLine(line) { + if (!line || !this.config.enabled) return; + let value; + try { + value = JSON.parse(line); + } catch { + return; + } + this.handleJsonRpcValue(value); + } + + handleJsonRpcValue(value) { + if (!this.config.enabled || !value || typeof value !== "object") return; + const method = typeof value.method === "string" ? value.method : ""; + const params = value.params && typeof value.params === "object" ? value.params : {}; + if (method === "item/completed") { + this.handleCompletedItem(params); + } else if (method === "item/agentMessage/delta") { + this.handleAgentMessageDelta(params); + } else if (method === "turn/completed") { + this.handleTurnCompleted(params); + } + } + + handleCompletedItem(params) { + const item = params.item && typeof params.item === "object" ? params.item : null; + if (!isAgentMessageItem(item)) return; + const text = agentMessageItemText(item).trim(); + if (!text) return; + const capture = this.turnCapture(params); + if (capture) capture.finalText = text; + const key = ["item", params.threadId, params.turnId, item.id, text.length].map((part) => String(part || "")).join(":"); + this.forwardAgentText(key, text, params); + } + + handleAgentMessageDelta(params) { + const delta = typeof params.delta === "string" ? params.delta : typeof params.text === "string" ? params.text : ""; + if (!delta) return; + const capture = this.turnCapture(params); + if (capture) capture.text += delta; + } + + handleTurnCompleted(params) { + const turn = params.turn && typeof params.turn === "object" ? params.turn : null; + const captureKey = turnCaptureKey(params); + const errorText = turnErrorText(turn); + if (errorText) { + const key = ["turn-error", params.threadId || (turn && turn.threadId), turn && turn.id, errorText.length].map((part) => String(part || "")).join(":"); + this.forwardAgentText(key, "Agent turn failed: " + errorText, params); + if (captureKey) this.turnCaptures.delete(captureKey); + return; + } + const capture = captureKey ? this.turnCaptures.get(captureKey) : null; + const text = capture ? (capture.finalText || capture.text || "").trim() : ""; + if (text) { + const key = ["turn", params.threadId || (turn && turn.threadId), turn && turn.id, text.length].map((part) => String(part || "")).join(":"); + this.forwardAgentText(key, text, params); + } + if (captureKey) this.turnCaptures.delete(captureKey); + } + + turnCapture(params) { + const key = turnCaptureKey(params); + if (!key) return null; + let capture = this.turnCaptures.get(key); + if (!capture) { + capture = { finalText: "", text: "" }; + this.turnCaptures.set(key, capture); + } + return capture; + } + + forwardAgentText(key, text, params) { + if (this.forwarded.has(key)) return; + const turnId = params && (params.turnId || params.turn_id || (params.turn && params.turn.id)); + if (turnId && this.suppressedTurnIds.has(String(turnId))) { + log("bot_gateway_forward_skip", { key, reason: "bot_inbound_turn" }); + return; + } + const decision = this.forwardDecision(); + if (!decision.shouldForward) { + log("bot_gateway_forward_skip", { key, reason: decision.reason }); + return; + } + this.forwarded.add(key); + this.ensureStarted() + .then(() => this.sendText(key, text, params, decision)) + .catch((error) => { + this.forwarded.delete(key); + this.logError("forward_failed", error); + }); + } + + forwardDecision() { + if (!this.config.forwardAllAgentMessages) { + return { shouldForward: false, reason: "forward_all_disabled" }; + } + if (!this.config.handoff.enabled) { + return { shouldForward: false, reason: "handoff_disabled" }; + } + const presence = evaluateHandoffPresence(this.config.handoff); + return { + shouldForward: presence.away, + reason: presence.away ? presence.reasons.join(", ") : presence.evidence.join(", ") + }; + } + + async sendText(key, text, params, decision) { + const conversationRef = this.resolveConversationRef(); + if (!conversationRef) { + throw new Error("No Bot Gateway conversationRef is configured and no inbound bot event context is available."); + } + this.messageCounter += 1; + const outbound = { + tenantId: this.resolveTenantId(), + integrationId: this.resolveIntegrationId(), + conversationRef, + intent: { + type: "text", + text + }, + idempotencyKey: "ccr:handoff:" + this.config.profileId + ":" + key + ":" + this.messageCounter + }; + await withTimeout(this.client.send(outbound), this.config.requestTimeoutMs, "Bot Gateway request timed out: outbound.send"); + log("bot_gateway_forward_sent", { + key, + reason: decision.reason, + textLen: text.length, + threadId: params.threadId || "", + turnId: params.turnId || "" + }); + } + + async sendReplyToEvent(event, text, key) { + if (!text || !String(text).trim()) return; + await this.ensureStarted(); + const conversationRef = conversationRefFromEvent(event) || this.config.conversationRef; + if (!conversationRef) { + throw new Error("No Bot Gateway conversationRef is available for inbound bot response."); + } + this.messageCounter += 1; + const outbound = { + tenantId: eventString(event, "tenantId") || this.config.tenantId || "ccr", + integrationId: eventString(event, "integrationId") || this.config.integrationId, + conversationRef, + intent: { + type: "text", + text + }, + idempotencyKey: key + ":" + this.messageCounter + }; + await withTimeout(this.client.send(outbound), this.config.requestTimeoutMs, "Bot Gateway request timed out: inbound outbound.send"); + } + + resolveTenantId() { + return eventString(this.latestEvent, "tenantId") || this.config.tenantId || "ccr"; + } + + resolveIntegrationId() { + return eventString(this.latestEvent, "integrationId") || this.config.integrationId; + } + + resolveConversationRef() { + if (this.config.conversationRef) return this.config.conversationRef; + const event = this.latestEvent; + return conversationRefFromEvent(event); + } + + async ensureStarted() { + if (this.client) return; + if (this.startPromise) return this.startPromise; + this.startPromise = this.start().finally(() => { + this.startPromise = null; + }); + return this.startPromise; + } + + async start() { + const sdk = await loadBotGatewaySdk(); + const env = Object.assign({}, process.env, { + BOT_GATEWAY_STATE_DIR: this.config.stateDir || path.join(CONFIG_DIR, "bot-gateway", safePathSegment(this.config.profileId)), + CODEXL_HOME: CONFIG_DIR + }); + const clientOptions = botGatewaySdkClientOptions(this.config, env, sdk); + this.client = sdk.createBotGatewayClient(clientOptions); + await withTimeout(this.client.health(), this.config.startupTimeoutMs, "Bot Gateway health check timed out."); + await this.ensureIntegration(); + await this.pollEvents(); + this.pollTimer = setInterval(() => { + this.pollEvents().catch((error) => this.logError("poll_failed", error)); + }, Math.max(500, this.config.pollIntervalMs)); + log("bot_gateway_started", { platform: this.config.platform, sdkTransport: clientOptions.transport, command: clientOptions.command || "sdk-bundled" }); + } + + async ensureIntegration() { + if (!this.config.integrationId) return; + if (this.config.createIntegration && this.config.authType !== "qr_login") { + await botGatewayClientRequest(this.client, "integrations.create", { + id: this.config.integrationId, + tenantId: this.config.tenantId, + platform: this.config.platform, + authType: this.config.authType, + credentials: this.config.credentials, + config: this.config.integrationConfig + }, this.config.requestTimeoutMs); + } + if (this.config.autoStartIntegration) { + await botGatewayClientRequest(this.client, "integrations.start", { + integrationId: this.config.integrationId + }, this.config.requestTimeoutMs).catch((error) => { + log("bot_gateway_integration_start_skip", { error: formatError(error) }); + }); + } + } + + async pollEvents() { + if (!this.client) return; + if (this.pollingEvents) return; + this.pollingEvents = true; + try { + const result = await withTimeout(this.client.events(20), this.config.requestTimeoutMs, "Bot Gateway request timed out: events.list"); + const events = Array.isArray(result && result.events) ? result.events : []; + for (const queued of events) { + const event = queued && queued.event && typeof queued.event === "object" ? queued.event : null; + if (!event || !this.matchesEvent(event)) continue; + if (event.actor && event.actor.isBot === true) continue; + this.latestEvent = event; + const eventId = eventIdFromQueued(queued, event); + if (this.inboundHandler) { + await this.dispatchInboundEvent(queued, event, eventId); + } else { + await this.ackEvent(eventId); + } + } + } finally { + this.pollingEvents = false; + } + } + + async dispatchInboundEvent(queued, event, eventId) { + const key = eventId || botEventDedupeKey(event); + if (this.inboundEvents.has(key)) return; + this.inboundEvents.add(key); + try { + await this.inboundHandler(event, queued, eventId || key, this); + await this.ackEvent(eventId); + } catch (error) { + this.inboundEvents.delete(key); + throw error; + } + } + + async ackEvent(eventId) { + if (!this.config.acknowledgeEvents || !eventId) return; + await withTimeout(this.client.ackEvent(eventId), this.config.requestTimeoutMs, "Bot Gateway request timed out: events.ack").catch((error) => { + log("bot_gateway_ack_failed", { eventId, error: formatError(error) }); + }); + } + + matchesEvent(event) { + if (this.config.integrationId && event.integrationId !== this.config.integrationId) return false; + if (this.config.platform && this.config.platform !== "none" && event.platform !== this.config.platform) return false; + if (this.config.tenantId && event.tenantId !== this.config.tenantId) return false; + return true; + } + + stop() { + if (this.pollTimer) { + clearInterval(this.pollTimer); + this.pollTimer = null; + } + if (this.client && typeof this.client.close === "function") { + this.client.close(); + } + this.client = null; + } + + logError(event, error) { + log("bot_gateway_" + event, { error: formatError(error) }); + } +} + +let BOT_GATEWAY_SDK_PROMISE = null; + +async function loadBotGatewaySdk() { + if (!BOT_GATEWAY_SDK_PROMISE) { + BOT_GATEWAY_SDK_PROMISE = importBotGatewaySdk(); + } + return BOT_GATEWAY_SDK_PROMISE; +} + +async function importBotGatewaySdk() { + const candidates = []; + const configured = nonEmptyEnv("CCR_BOT_GATEWAY_SDK_MODULE"); + if (configured) { + candidates.push(configured); + } + const bundled = bundledBotGatewaySdkModule(); + if (bundled) { + candidates.push(bundled); + } + candidates.push("@the-next-ai/bot-gateway-sdk"); + const errors = []; + for (const candidate of candidates) { + try { + const sdk = await import(botGatewaySdkImportSpecifier(candidate)); + if (sdk && typeof sdk.createBotGatewayClient === "function") { + return sdk; + } + errors.push(candidate + ": missing createBotGatewayClient export"); + } catch (error) { + errors.push(candidate + ": " + formatError(error)); + } + } + throw new Error("Unable to load @the-next-ai/bot-gateway-sdk. " + errors.join("; ")); +} + +function bundledBotGatewaySdkModule() { + const resourcesPath = process["resourcesPath"]; + const candidates = [ + path.join(__dirname, "bot-gateway-sdk", "dist", "index.js"), + ...(resourcesPath + ? [ + path.join(resourcesPath, "app.asar", "dist", "main", "bot-gateway-sdk", "dist", "index.js"), + path.join(resourcesPath, "app", "dist", "main", "bot-gateway-sdk", "dist", "index.js") + ] + : []) + ]; + return candidates.find((candidate) => fs.existsSync(candidate)) || ""; +} + +function botGatewaySdkImportSpecifier(value) { + const trimmed = String(value || "").trim(); + if (!trimmed) return "@the-next-ai/bot-gateway-sdk"; + if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)) return trimmed; + if (path.isAbsolute(trimmed)) return pathToFileURL(trimmed).href; + return trimmed; +} + +function botGatewaySdkClientOptions(config, env, sdk) { + const command = resolveBotGatewayCommand(config) || resolveBundledBotGatewayCommand(sdk); + return { + transport: "stdio", + ...(command || {}), + env + }; +} + +function resolveBotGatewayCommand(config) { + if (config.command) { + return { + command: expandHome(config.command), + args: config.args, + cwd: config.cwd || process.cwd() + }; + } + return undefined; +} + +function resolveBundledBotGatewayCommand(sdk) { + if (!sdk || typeof sdk.bundledStdioPath !== "function") { + return undefined; + } + const bundledPath = sdk.bundledStdioPath(); + return { + command: process.execPath, + args: [sanitizedBotGatewayStdioRunnerPath(bundledPath)], + cwd: path.dirname(bundledPath) + }; +} + +function sanitizedBotGatewayStdioRunnerPath(sourcePath) { + const source = fs.readFileSync(sourcePath, "utf8"); + const normalized = normalizeDuplicateShebangs(source); + if (normalized === source) { + return sourcePath; + } + + const targetDir = path.join(CONFIG_DIR, "bot-gateway", "runners"); + const targetPath = path.join(targetDir, "bot-gateway-stdio.mjs"); + fs.mkdirSync(targetDir, { recursive: true }); + if (!fs.existsSync(targetPath) || fs.readFileSync(targetPath, "utf8") !== normalized) { + fs.writeFileSync(targetPath, normalized); + } + return targetPath; +} + +function normalizeDuplicateShebangs(source) { + const lines = source.split("\n"); + if (!lines[0] || !lines[0].startsWith("#!")) { + return source; + } + let index = 1; + while (lines[index] && lines[index].startsWith("#!")) { + index += 1; + } + return [lines[0], ...lines.slice(index)].join("\n"); +} + +function botGatewayClientRequest(client, method, params, timeoutMs) { + if (!client || typeof client.request !== "function") { + return Promise.reject(new Error("Bot Gateway SDK client does not expose request().")); + } + return withTimeout(client.request(method, params), timeoutMs, "Bot Gateway request timed out: " + method); +} + +async function closeBotGatewayClient(client) { + if (!client || typeof client !== "object") return; + for (const method of ["close", "dispose", "stop"]) { + if (typeof client[method] !== "function") continue; + try { + await Promise.resolve(client[method]()); + } catch (error) { + log("bot_gateway_client_close_failed", { method, error: formatError(error) }); + } + return; + } +} + +function withTimeout(promise, timeoutMs, message) { + const timeout = Math.max(1000, timeoutMs || 30000); + let timer = null; + return new Promise((resolve, reject) => { + timer = setTimeout(() => reject(new Error(message)), timeout); + Promise.resolve(promise).then( + (value) => { + clearTimeout(timer); + resolve(value); + }, + (error) => { + clearTimeout(timer); + reject(error); + } + ); + }); +} + +function evaluateHandoffPresence(config) { + if (!config.enabled) { + return { away: false, reasons: [], evidence: ["handoff disabled"] }; + } + const reasons = []; + const evidence = []; + if (config.screenLock) { + const locked = detectScreenLocked(); + if (locked !== true) { + return { away: false, reasons, evidence: [locked === false ? "screen unlocked" : "screen lock unknown"] }; + } + reasons.push("screen locked"); + } + if (config.userIdle) { + const seconds = detectUserIdleSeconds(); + if (!Number.isFinite(seconds)) { + evidence.push("idle time unknown"); + } else if (seconds >= config.idleSeconds) { + reasons.push("idle for " + seconds + "s"); + } else { + return { away: false, reasons, evidence: ["idle for " + seconds + "s"] }; + } + } + if (config.phoneWifiTargets.length || config.phoneBluetoothTargets.length) { + evidence.push("phone target checks are configured but not available in CCR middleware"); + } + return { away: reasons.length > 0, reasons, evidence }; +} + +function detectScreenLocked() { + if (process.platform !== "darwin") return null; + const output = commandOutput("/usr/sbin/ioreg", ["-r", "-k", "CGSSessionScreenIsLocked"]) || commandOutput("/usr/sbin/ioreg", ["-n", "Root", "-d1"]); + if (!output) return null; + for (const line of output.split(/\r?\n/g)) { + if (!line.includes("CGSSessionScreenIsLocked") && !line.includes("IOConsoleLocked")) continue; + const lower = line.toLowerCase(); + if (lower.includes("yes") || lower.includes("true") || lower.includes("= 1")) return true; + if (lower.includes("no") || lower.includes("false") || lower.includes("= 0")) return false; + } + return false; +} + +function detectUserIdleSeconds() { + if (process.platform !== "darwin") return null; + const output = commandOutput("/usr/sbin/ioreg", ["-c", "IOHIDSystem"]); + if (!output) return null; + for (const line of output.split(/\r?\n/g)) { + if (!line.includes("HIDIdleTime")) continue; + const raw = String(line.split("=")[1] || "").trim(); + const digits = raw.match(/^\d+/); + if (!digits) return null; + return Math.floor(Number(digits[0]) / 1000000000); + } + return null; +} + +function commandOutput(command, args) { + try { + const result = childProcess.spawnSync(command, args, { encoding: "utf8", timeout: 2000 }); + return result.status === 0 ? result.stdout : ""; + } catch { + return ""; + } +} + +function isAgentMessageItem(item) { + if (!item || typeof item !== "object") return false; + return item.type === "agentMessage" || item.type === "agent_message" || item.type === "assistantMessage" || item.type === "assistant_message"; +} + +function agentMessageItemText(item) { + if (!item || typeof item !== "object") return ""; + if (typeof item.text === "string") return item.text; + if (typeof item.content === "string") return item.content; + if (typeof item.message === "string") return item.message; + return ""; +} + +function turnCaptureKey(params) { + const threadId = params.threadId || params.thread_id || (params.thread && params.thread.id); + const turnId = params.turnId || params.turn_id || (params.turn && params.turn.id); + if (!threadId || !turnId) return ""; + return String(threadId) + ":" + String(turnId); +} + +function turnErrorText(turn) { + if (!turn) return ""; + if (typeof turn.error === "string" && turn.error.trim()) return turn.error.trim(); + if (turn.error && typeof turn.error === "object") { + if (typeof turn.error.message === "string") return turn.error.message.trim(); + if (typeof turn.error.details === "string") return turn.error.details.trim(); + } + return ""; +} + +function botSessionStorePath() { + const stateDir = nonEmptyEnv("CCR_BOT_GATEWAY_STATE_DIR") || + nonEmptyEnv("CODEXL_BOT_GATEWAY_STATE_DIR") || + nonEmptyEnv("BOT_GATEWAY_STATE_DIR") || + path.join(CONFIG_DIR, "bot-gateway", safePathSegment(nonEmptyEnv("CCR_BOT_PROFILE_ID") || "default")); + return path.join(expandHome(stateDir), "claude-bot-sessions.json"); +} + +function normalizeBotSessionStore(value) { + const conversations = value && typeof value === "object" && value.conversations && typeof value.conversations === "object" + ? value.conversations + : {}; + return { version: BOT_SESSION_ENTRY_VERSION, conversations }; +} + +function parseBotCommand(text) { + let trimmed = String(text || "").trim(); + if (!trimmed) return null; + if (trimmed.startsWith("/")) trimmed = trimmed.slice(1).trim(); + const space = trimmed.search(/\s/); + const rawName = space >= 0 ? trimmed.slice(0, space) : trimmed; + const name = rawName.toLowerCase(); + const args = space >= 0 ? trimmed.slice(space + 1).trim() : ""; + if (["help", "?", "h"].includes(name)) return { name: "help", args }; + if (["ls", "list", "sessions"].includes(name)) return { name: "ls", args }; + if (["current", "status", "pwd"].includes(name)) return { name: "current", args }; + if (["new", "create"].includes(name)) return { name: "new", args }; + if (name === "reset") return { name, args }; + if (name === "select" || name === "use") return { name, args }; + return null; +} + +function botCommandHelpText() { + return [ + "Bot commands:", + "ls - list Claude App sessions", + "new - create and select a new Claude App session", + "select - continue a listed session", + "use - alias for select", + "current - show selected session", + "reset - clear selected session; next message creates a new Claude App session", + "help - show this message" + ].join("\n"); +} + +function latestClaudeAppLocalAgentSession() { + return claudeAppLocalAgentSessions()[0] || null; +} + +function claudeAppLocalAgentSessions() { + const baseDir = currentClaudeAppUserDataDir(); + if (!baseDir) return []; + const root = path.join(baseDir, "local-agent-mode-sessions"); + const files = listClaudeAppSessionFiles(root, 6); + const sessions = []; + for (const file of files) { + let value; + try { + value = JSON.parse(fs.readFileSync(file, "utf8")); + } catch { + continue; + } + if (!value || typeof value !== "object" || value.isArchived === true || value.archived === true) continue; + const cliSessionId = stringValue(value.cliSessionId) || stringValue(value.cli_session_id); + if (!cliSessionId) continue; + const sessionId = stringValue(value.sessionId) || path.basename(file, ".json"); + const lastActivityAt = numberValue(value.lastActivityAt) || numberValue(value.updatedAt) || numberValue(value.createdAt) || fileMtimeMs(file); + const item = { + file, + sessionId, + cliSessionId, + cwd: stringValue(value.cwd) || process.cwd(), + model: stringValue(value.model) || "", + title: stringValue(value.title) || "", + initialMessage: stringValue(value.initialMessage) || "", + lastActivityAt, + claudeConfigDir: claudeAppSessionConfigDir(file, value), + metadata: value + }; + sessions.push(item); + } + sessions.sort((left, right) => (right.lastActivityAt || 0) - (left.lastActivityAt || 0)); + return sessions; +} + +function currentClaudeAppUserDataDir() { + return expandHome(nonEmptyEnv("CCR_CLAUDE_APP_USER_DATA_PATH") || nonEmptyEnv("CLAUDE_USER_DATA_DIR") || ""); +} + +function botSessionEntryMatchesCurrentProfile(entry, appSession) { + const expectedUserDataDir = currentClaudeAppUserDataDir(); + if (!expectedUserDataDir) return true; + const candidates = [ + entry && entry.claudeConfigDir, + entry && entry.claudeAppSessionFile, + entry && entry.cwd, + appSession && appSession.claudeConfigDir + ]; + return candidates.some((candidate) => pathIsInside(candidate, expectedUserDataDir)); +} + +function pathIsInside(candidate, parentDir) { + const child = expandHome(String(candidate || "")); + const parent = expandHome(String(parentDir || "")); + if (!child || !parent) return false; + const childPath = normalizeComparablePath(path.resolve(child)); + const parentPath = normalizeComparablePath(path.resolve(parent)); + if (childPath === parentPath) return true; + const relative = path.relative(parentPath, childPath); + return Boolean(relative) && !relative.startsWith("..") && !path.isAbsolute(relative); +} + +function normalizeComparablePath(value) { + return process.platform === "win32" ? value.toLowerCase() : value; +} + +function resolveClaudeAppLocalAgentSession(selector) { + const query = String(selector || "").trim(); + if (!query) return null; + const sessions = claudeAppLocalAgentSessions(); + const numeric = Number(query); + if (Number.isInteger(numeric) && numeric >= 1 && numeric <= sessions.length) { + return sessions[numeric - 1]; + } + const lower = query.toLowerCase(); + let matches = sessions.filter((session) => + String(session.sessionId || "").toLowerCase() === lower || + String(session.sessionId || "").toLowerCase().startsWith(lower) || + String(session.cliSessionId || "").toLowerCase() === lower || + String(session.cliSessionId || "").toLowerCase().startsWith(lower) || + botSessionTitle(session).toLowerCase().includes(lower) + ); + if (!matches.length) return null; + matches.sort((left, right) => + scoreBotSessionMatch(left, lower) - scoreBotSessionMatch(right, lower) || + (right.lastActivityAt || 0) - (left.lastActivityAt || 0) + ); + return matches[0]; +} + +function scoreBotSessionMatch(session, query) { + const id = String(session.sessionId || "").toLowerCase(); + const cli = String(session.cliSessionId || "").toLowerCase(); + const title = botSessionTitle(session).toLowerCase(); + if (id === query || cli === query) return 0; + if (id.startsWith(query) || cli.startsWith(query)) return 1; + if (title === query) return 2; + return 3; +} + +function botSessionTitle(session) { + return stringValue(session && session.title) || + stringValue(session && session.initialMessage) || + "Untitled"; +} + +function shortSessionId(value) { + const text = String(value || "").trim(); + if (!text) return "(none)"; + if (text.startsWith("local_")) return text.slice(0, 14); + return text.slice(0, 8); +} + +function createClaudeAppLocalAgentSession(text) { + const baseDir = nonEmptyEnv("CCR_CLAUDE_APP_USER_DATA_PATH") || nonEmptyEnv("CLAUDE_USER_DATA_DIR"); + if (!baseDir) return null; + const root = path.join(expandHome(baseDir), "local-agent-mode-sessions"); + const template = latestClaudeAppLocalAgentSession(); + const parentDir = template && template.file ? path.dirname(template.file) : defaultClaudeAppLocalAgentParentDir(root); + const sessionId = "local_" + uuid(); + const sessionDir = path.join(parentDir, sessionId); + const cwd = path.join(sessionDir, "outputs"); + const claudeConfigDir = path.join(sessionDir, ".claude"); + const file = path.join(parentDir, sessionId + ".json"); + const now = Date.now(); + const title = promptTitle(text); + fs.mkdirSync(cwd, { recursive: true }); + fs.mkdirSync(path.join(sessionDir, "uploads"), { recursive: true }); + fs.mkdirSync(claudeConfigDir, { recursive: true }); + copyClaudeConfigTemplate(claudeConfigDir, template); + const metadata = { + ...claudeAppSessionTemplateFields(template && template.metadata), + sessionId, + processName: "ccr-bot-" + sessionId.slice(6, 14), + cliSessionId: "", + cwd, + userSelectedFolders: [], + createdAt: now, + lastActivityAt: now, + model: nonEmptyEnv("CCR_CLAUDE_CODE_MODEL") || nonEmptyEnv("CODEXL_CLAUDE_CODE_MODEL") || agentEnv(codexRuntimeAgent(), "MODEL") || DEFAULT_MODEL, + isArchived: false, + title, + vmProcessName: "ccr-bot-" + sessionId.slice(6, 14), + hostLoopMode: true, + initialMessage: text + }; + fs.mkdirSync(parentDir, { recursive: true }); + fs.writeFileSync(file, JSON.stringify(metadata, null, 2)); + return { file, sessionId, cwd, claudeConfigDir, title, lastActivityAt: now }; +} + +function defaultClaudeAppLocalAgentParentDir(root) { + const config = readJsonFile(path.join(nonEmptyEnv("CLAUDE_CONFIG_DIR") || path.join(os.homedir(), ".claude"), ".claude.json")) || {}; + const account = config.oauthAccount && typeof config.oauthAccount === "object" ? config.oauthAccount : {}; + const accountPrefix = uuidPrefix(stringValue(account.accountUuid)) || "ccr"; + const orgPrefix = uuidPrefix(stringValue(account.organizationUuid)) || "00000000"; + return path.join(root, accountPrefix, orgPrefix); +} + +function claudeAppSessionTemplateFields(value) { + if (!value || typeof value !== "object") return {}; + const output = {}; + for (const key of [ + "slashCommands", + "enabledMcpTools", + "remoteMcpServersConfig", + "egressAllowedDomains", + "orgCliExecPolicies", + "memoryEnabled", + "skillsEnabled", + "pluginsEnabled", + "systemPrompt", + "systemPromptRendererAppends", + "accountName", + "emailAddress" + ]) { + if (value[key] !== undefined) output[key] = clone(value[key]); + } + return output; +} + +function copyClaudeConfigTemplate(claudeConfigDir, template) { + const targetDir = expandHome(claudeConfigDir); + fs.mkdirSync(targetDir, { recursive: true }); + copyClaudeConfigFile(targetDir, ".claude.json", claudeConfigSourceDirs(template, "session-first")); + copyClaudeConfigFile(targetDir, "settings.json", claudeConfigSourceDirs(template, "base-first")); + if (!fs.existsSync(path.join(targetDir, ".claude.json"))) { + fs.writeFileSync(path.join(targetDir, ".claude.json"), JSON.stringify({ firstStartTime: new Date().toISOString() }, null, 2)); + } +} + +function ensureClaudeSessionConfig(claudeConfigDir) { + const targetDir = expandHome(claudeConfigDir); + if (!targetDir) return; + try { + fs.mkdirSync(targetDir, { recursive: true }); + copyClaudeConfigFile(targetDir, "settings.json", claudeConfigSourceDirs(null, "base-first")); + if (!fs.existsSync(path.join(targetDir, ".claude.json"))) { + copyClaudeConfigFile(targetDir, ".claude.json", claudeConfigSourceDirs(null, "base-first")); + } + } catch (error) { + log("claude_session_config_ensure_failed", { claudeConfigDir: targetDir, error: formatError(error) }); + } +} + +function copyClaudeConfigFile(targetDir, filename, sourceDirs) { + const target = path.join(targetDir, filename); + if (fs.existsSync(target)) return false; + for (const sourceDir of sourceDirs) { + const source = path.join(sourceDir, filename); + if (source === target) continue; + try { + if (!fs.existsSync(source)) continue; + fs.copyFileSync(source, target); + log("claude_session_config_copied", { filename, sourceDir, targetDir }); + return true; + } catch (error) { + log("claude_session_config_copy_failed", { filename, sourceDir, targetDir, error: formatError(error) }); + } + } + return false; +} + +function claudeConfigSourceDirs(template, order) { + const base = [ + nonEmptyEnv("CCR_CLAUDE_BASE_CONFIG_DIR"), + nonEmptyEnv("CLAUDE_CONFIG_DIR"), + path.join(os.homedir(), ".claude") + ]; + const session = [ + template && template.claudeConfigDir ? template.claudeConfigDir : "", + inferBaseClaudeConfigDirFromSession(template && template.claudeConfigDir ? template.claudeConfigDir : "") + ]; + return uniqueExistingDirs(order === "session-first" ? [...session, ...base] : [...base, ...session]); +} + +function inferBaseClaudeConfigDirFromSession(value) { + const text = String(value || ""); + const marker = path.sep + ".claude-code-router" + path.sep; + const index = text.indexOf(marker); + return index > 0 ? text.slice(0, index) : ""; +} + +function uniqueExistingDirs(values) { + const seen = new Set(); + const output = []; + for (const value of values) { + const dir = expandHome(value || ""); + if (!dir || seen.has(dir)) continue; + seen.add(dir); + if (fs.existsSync(dir)) output.push(dir); + } + return output; +} + +function claudeSettingsEnv(claudeConfigDir) { + const settings = readJsonFile(path.join(claudeConfigDir, "settings.json")); + const raw = settings && typeof settings === "object" && settings.env && typeof settings.env === "object" ? settings.env : null; + if (!raw) return {}; + const env = {}; + for (const [key, value] of Object.entries(raw)) { + if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(key) && typeof value === "string") { + env[key] = value; + } + } + return env; +} + +function readClaudeAppLocalAgentSession(file) { + const metadata = readJsonFile(file); + if (!metadata || typeof metadata !== "object") return {}; + return { + cliSessionId: stringValue(metadata.cliSessionId) || stringValue(metadata.cli_session_id) || "", + claudeConfigDir: claudeAppSessionConfigDir(file, metadata) + }; +} + +function updateClaudeAppLocalAgentSession(thread, updates) { + const file = thread && thread.claudeAppSessionFile; + if (!file) return; + const metadata = readJsonFile(file); + if (!metadata || typeof metadata !== "object") return; + if (updates.cliSessionId) metadata.cliSessionId = updates.cliSessionId; + if (updates.lastActivityAt) metadata.lastActivityAt = updates.lastActivityAt; + if (updates.title && !metadata.title) metadata.title = updates.title; + try { + fs.writeFileSync(file, JSON.stringify(metadata, null, 2)); + } catch (error) { + log("claude_app_session_update_failed", { file, error: formatError(error) }); + } +} + +function promptTitle(text) { + const value = String(text || "").replace(/\s+/g, " ").trim(); + if (!value) return "Bot message"; + return value.length > 48 ? value.slice(0, 48) : value; +} + +function uuidPrefix(value) { + const text = stringValue(value); + if (!text) return ""; + return text.split("-")[0] || ""; +} + +function readJsonFile(file) { + if (!file) return null; + try { + return JSON.parse(fs.readFileSync(expandHome(file), "utf8")); + } catch { + return null; + } +} + +function listClaudeAppSessionFiles(root, maxDepth) { + const files = []; + const visit = (dir, depth) => { + if (depth < 0) return; + let entries = []; + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } catch { + return; + } + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + visit(fullPath, depth - 1); + } else if (entry.isFile() && entry.name.startsWith("local_") && entry.name.endsWith(".json")) { + files.push(fullPath); + } + } + }; + visit(root, maxDepth); + return files; +} + +function claudeAppSessionConfigDir(file, value) { + const candidates = []; + const cwd = stringValue(value && value.cwd); + if (cwd) candidates.push(path.join(path.dirname(expandHome(cwd)), ".claude")); + const sessionId = stringValue(value && value.sessionId) || path.basename(file, ".json"); + if (sessionId) candidates.push(path.join(path.dirname(file), sessionId, ".claude")); + candidates.push(path.join(path.dirname(file), ".claude")); + for (const candidate of candidates) { + if (candidate && fs.existsSync(candidate)) return candidate; + } + return ""; +} + +function fileMtimeMs(file) { + try { + return fs.statSync(file).mtimeMs; + } catch { + return 0; + } +} + +function numberValue(value) { + const number = Number(value); + return Number.isFinite(number) ? number : 0; +} + +function botEventText(event) { + const direct = valueStringAtPaths(event, [ + "/message/text", + "/message/content", + "/raw/message/text", + "/raw/message/content", + "/raw/text/content", + "/raw/content/text", + "/raw/content", + "/text", + "/content" + ]); + if (direct) return direct; + return valueStringAtPaths(event, [ + "/message/transcript", + "/message/transcription", + "/message/voiceText", + "/message/voice_text", + "/message/audioText", + "/message/audio_text", + "/raw/transcript", + "/raw/transcription", + "/raw/voiceText", + "/raw/voice_text", + "/raw/audioText", + "/raw/audio_text" + ]) || ""; +} + +function conversationRefFromEvent(event) { + if (!event || !event.conversation || typeof event.conversation !== "object") return null; + const conversation = event.conversation; + const platformConversationId = eventString(conversation, "id") || eventString(conversation, "platformConversationId"); + const gatewayConversationId = eventString(conversation, "gatewayConversationId"); + if (!platformConversationId && !gatewayConversationId) return null; + const rawType = eventString(conversation, "type"); + const type = ["dm", "group", "channel", "thread"].includes(rawType) ? rawType : "dm"; + const ref = { + ...(gatewayConversationId ? { gatewayConversationId } : {}), + ...(platformConversationId ? { platformConversationId } : {}), + type + }; + const threadId = event.message && typeof event.message === "object" ? eventString(event.message, "threadId") : ""; + if (threadId) ref.threadId = threadId; + const contextToken = valueStringAtPaths(event, ["/raw/context_token", "/raw/sessionWebhook", "/raw/contextToken"]); + if (contextToken) ref.contextToken = contextToken; + return ref; +} + +function eventIdFromQueued(queued, event) { + return eventString(queued, "id") || + eventString(event, "id") || + valueStringAtPaths(event, ["/message/id", "/message/messageId", "/raw/message/id", "/raw/messageId", "/raw/msgId"]); +} + +function botEventDedupeKey(event) { + const conversation = event && event.conversation && typeof event.conversation === "object" ? event.conversation : {}; + return [ + eventString(event, "tenantId"), + eventString(event, "integrationId"), + eventString(conversation, "id") || eventString(conversation, "gatewayConversationId"), + valueStringAtPaths(event, ["/message/id", "/message/messageId", "/raw/message/id", "/raw/messageId", "/raw/msgId"]), + botEventText(event), + valueStringAtPaths(event, ["/message/createdAt", "/message/timestamp", "/raw/createAt", "/raw/timestamp"]) + ].join(":"); +} + +function botConversationKey(event) { + const conversation = event && event.conversation && typeof event.conversation === "object" ? event.conversation : {}; + return [ + eventString(event, "tenantId"), + eventString(event, "integrationId"), + eventString(conversation, "id") || eventString(conversation, "gatewayConversationId") || "default", + event.message && typeof event.message === "object" ? eventString(event.message, "threadId") : "" + ].join(":"); +} + +function valueStringAtPaths(value, paths) { + for (const path of paths) { + const candidate = valueAtPointer(value, path); + if (typeof candidate === "string" && candidate.trim()) return candidate.trim(); + if (Number.isFinite(candidate) || typeof candidate === "boolean") return String(candidate); + } + return ""; +} + +function valueAtPointer(value, pointer) { + if (!value || typeof pointer !== "string" || !pointer.startsWith("/")) return undefined; + let current = value; + for (const rawPart of pointer.slice(1).split("/")) { + if (current === null || current === undefined) return undefined; + const part = rawPart.replace(/~1/g, "/").replace(/~0/g, "~"); + current = current[part]; + } + return current; +} + +function eventString(value, key) { + return value && typeof value[key] === "string" ? value[key].trim() : ""; +} + +function jsonObjectEnv(name) { + const text = nonEmptyEnv(name); + if (!text) return null; + try { + const value = JSON.parse(text); + return value && typeof value === "object" && !Array.isArray(value) ? value : null; + } catch { + return null; + } +} + +function jsonArrayEnv(name) { + const text = nonEmptyEnv(name); + if (!text) return []; + try { + const value = JSON.parse(text); + return Array.isArray(value) ? value.map((item) => String(item)) : []; + } catch { + return []; + } +} + +function listEnv(name) { + const value = process.env[name]; + if (!value) return []; + return value.split(/\r?\n|,/g).map((item) => item.trim()).filter(Boolean); +} + +function boolEnv(name) { + const value = process.env[name]; + if (!value) return false; + return ["1", "true", "yes", "on"].includes(value.trim().toLowerCase()); +} + +function safePathSegment(value) { + const segment = String(value || "").trim().toLowerCase().replace(/[^a-z0-9_.-]+/g, "-").replace(/^-+|-+$/g, ""); + return segment || "default"; +} + +function waitForChild(child) { + return waitForChildResult(child).then((result) => result.exitCode); +} + +function waitForChildResult(child) { + return new Promise((resolve) => { + child.on("exit", (code, signal) => resolve({ + code, + signal, + exitCode: code ?? signalExitCode(signal) + })); + child.on("error", () => resolve({ code: 1, signal: null, exitCode: 1 })); + }); +} + +function signalExitCode(signal) { + if (signal === "SIGINT") return 130; + if (signal === "SIGTERM") return 143; + if (signal === "SIGKILL") return 137; + return 1; +} + +function activeKey(threadId, turnId) { + return String(threadId || "") + "\0" + String(turnId || ""); +} + +function latestThread(threads) { + let latest = null; + for (const thread of threads.values()) { + if (!latest || (thread.updatedAt || 0) > (latest.updatedAt || 0)) { + latest = thread; + } + } + return latest; +} + +function findActiveForThread(active, threadId) { + for (const [key, value] of active) { + if (value.threadId === threadId) return { ...value, key }; + } + return undefined; +} + +function normalizeWorkspaceRoots(value, cwd) { + const roots = Array.isArray(value) ? value.filter((item) => typeof item === "string" && item.trim()) : []; + return roots.length ? roots : [cwd]; +} + +function combinedDeveloperInstructions(params) { + return params.developerInstructions || params.developer_instructions || null; +} + +function normalizeCwd(value) { + return expandHome(String(value || process.cwd())); +} + +function requestWorkspaceCwd(value, method) { + const params = value.params || {}; + if (["config/read", "thread/resume", "turn/start"].includes(method) && typeof params.cwd === "string") return params.cwd.trim(); + if (method === "hooks/list" && Array.isArray(params.cwds) && params.cwds.length === 1) return String(params.cwds[0]).trim(); + return ""; +} + +function contentContainsToolUse(content) { + return asArray(content).some((item) => ["tool_use", "server_tool_use", "mcp_tool_use"].includes(item && item.type)); +} + +function textFromContent(content) { + if (typeof content === "string") return content; + if (Array.isArray(content)) return content.map(textFromContent).filter(Boolean).join(""); + if (content && typeof content === "object") { + if (typeof content.text === "string") return content.text; + if (typeof content.content === "string") return content.content; + if (content.content) return textFromContent(content.content); + } + return ""; +} + +function asArray(value) { + return Array.isArray(value) ? value : value && typeof value === "object" ? [value] : []; +} + +function parseToolArguments(value) { + try { + return JSON.parse(value); + } catch { + return { partial_json: value }; + } +} + +function firstString(value, pointers) { + for (const p of pointers) { + const item = pointer(value, p); + if (typeof item === "string" && item.trim()) return item.trim(); + } + return undefined; +} + +function pointer(value, p) { + const parts = p.split("/").slice(1).map((part) => part.replace(/~1/g, "/").replace(/~0/g, "~")); + let current = value; + for (const part of parts) { + if (!current || typeof current !== "object") return undefined; + current = current[part]; + } + return current; +} + +function controlRequestId(message) { + return stringValue(message.request_id) || stringValue(message.id) || uuid(); +} + +function stringValue(value) { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function jsonRpcIdKey(id) { + if (typeof id === "string") return id; + if (typeof id === "number" || typeof id === "boolean") return String(id); + return undefined; +} + +function safeReadBase64(file) { + try { + return fs.readFileSync(expandHome(file)).toString("base64"); + } catch { + return ""; + } +} + +function mimeTypeForPath(file) { + const ext = String(file || "").toLowerCase().split(".").pop(); + if (ext === "jpg" || ext === "jpeg") return "image/jpeg"; + if (ext === "gif") return "image/gif"; + if (ext === "webp") return "image/webp"; + return "image/png"; +} + +function splitShellLike(value) { + if (!value.trim()) return []; + const result = []; + let current = ""; + let quote = ""; + for (let i = 0; i < value.length; i += 1) { + const ch = value[i]; + if (quote) { + if (ch === quote) quote = ""; + else current += ch; + } else if (ch === "'" || ch === '"') { + quote = ch; + } else if (/\s/.test(ch)) { + if (current) { + result.push(current); + current = ""; + } + } else { + current += ch; + } + } + if (current) result.push(current); + return result; +} + +function agentItemIdForTurn(turnId) { + return "agent-" + turnId; +} + +function uuid() { + return crypto.randomUUID ? crypto.randomUUID() : crypto.randomBytes(16).toString("hex"); +} + +function nowSeconds() { + return Math.floor(Date.now() / 1000); +} + +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +function clone(value) { + return JSON.parse(JSON.stringify(value)); +} + +function withoutKeys(env, keys) { + const next = { ...env }; + for (const key of keys) delete next[key]; + return next; +} + +function childEnvForAgent(agent) { + const next = withoutKeys(process.env, ["CODEX_CLI_PATH", "ZCODE_CLI_PATH", "CCR_REAL_CODEX_CLI_PATH", "CODEXL_REAL_CODEX_CLI_PATH", "CCR_REAL_ZCODE_CLI_PATH", "CODEXL_REAL_ZCODE_CLI_PATH"]); + const blockedPrefixes = agent === "zcode" ? ["CCR_CODEX_", "CODEXL_CODEX_"] : ["CCR_ZCODE_", "CODEXL_ZCODE_"]; + for (const key of Object.keys(next)) { + if (blockedPrefixes.some((prefix) => key.startsWith(prefix))) { + delete next[key]; + } + } + if (agent === "zcode") { + delete next.CODEX_HOME; + delete next.CODEX_ELECTRON_USER_DATA_PATH; + } else { + delete next.ZCODE_HOME; + delete next.ZCODE_STORAGE_DIR; + delete next.ZCODE_ELECTRON_USER_DATA_PATH; + } + return next; +} + +function nonEmptyEnv(name) { + const value = process.env[name]; + return typeof value === "string" && value.trim() ? value.trim() : ""; +} + +function nonEmptyEnvFrom(env, name) { + const value = env?.[name]; + return typeof value === "string" && value.trim() ? value.trim() : ""; +} + +function codexRuntimeAgent() { + return nonEmptyEnv("CCR_ZCODE_PROFILE") || + nonEmptyEnv("CODEXL_ZCODE_PROFILE") || + nonEmptyEnv("CCR_REAL_ZCODE_CLI_PATH") || + nonEmptyEnv("CODEXL_REAL_ZCODE_CLI_PATH") || + nonEmptyEnv("ZCODE_CLI_PATH") || + nonEmptyEnv("ZCODE_STORAGE_DIR") || + nonEmptyEnv("ZCODE_HOME") + ? "zcode" + : "codex"; +} + +function codexRuntimeRealCli(agent) { + if (agent === "zcode") { + return nonEmptyEnv("CCR_REAL_ZCODE_CLI_PATH") || + nonEmptyEnv("CODEXL_REAL_ZCODE_CLI_PATH") || + nonEmptyEnv("ZCODE_CLI_PATH") || + "zcode"; + } + return nonEmptyEnv("CCR_REAL_CODEX_CLI_PATH") || + nonEmptyEnv("CODEXL_REAL_CODEX_CLI_PATH") || + nonEmptyEnv("CODEX_CLI_PATH") || + "codex"; +} + +function codexRuntimeHome() { + const agent = codexRuntimeAgent(); + if (agent === "zcode") { + return process.env.ZCODE_STORAGE_DIR || process.env.ZCODE_HOME || path.join(os.homedir(), ".zcode"); + } + return process.env.CODEX_HOME || path.join(os.homedir(), ".codex"); +} + +function agentEnv(agent, primarySuffix, secondarySuffix) { + const suffixes = [primarySuffix, secondarySuffix].filter(Boolean); + const prefixes = agent === "zcode" + ? ["CCR_ZCODE_", "CODEXL_ZCODE_"] + : ["CCR_CODEX_", "CODEXL_CODEX_"]; + for (const suffix of suffixes) { + for (const prefix of prefixes) { + const value = nonEmptyEnv(prefix + suffix); + if (value) return value; + } + } + return ""; +} + +function numberEnv(name, fallback) { + const value = Number(process.env[name]); + return Number.isFinite(value) && value > 0 ? value : fallback; +} + +function normalizeConfigFormat(value) { + return "separate_profile_files"; +} + +function normalizeRemoteFrontendMode(value) { + const normalized = String(value || "").replace(/_/g, "-").toLowerCase(); + return normalized === "cli" || normalized === "claude-code" ? normalized : "app"; +} + +function normalizeProfileSurface(value) { + const normalized = String(value || "").replace(/_/g, "-").toLowerCase(); + return normalized === "cli" || normalized === "app" ? normalized : "auto"; +} + +function expandHome(value) { + const text = String(value || ""); + if (text === "~") return os.homedir(); + if (text.startsWith("~/")) return path.join(os.homedir(), text.slice(2)); + return text; +} + +function tomlEscape(value) { + return String(value).replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t"); +} + +function formatError(error) { + return error && error.stack ? error.stack : error && error.message ? error.message : String(error); +} + +function log(event, fields) { + if (!LOG_PATH) return; + try { + fs.mkdirSync(path.dirname(LOG_PATH), { recursive: true }); + fs.appendFileSync(LOG_PATH, JSON.stringify({ tsMs: Date.now(), event, ...fields }) + "\n"); + } catch { + } +} + +main().catch((error) => { + log("fatal", { error: formatError(error) }); + process.stderr.write(formatError(error) + "\n"); + process.exitCode = 1; +}); +`; +} diff --git a/packages/core/src/agents/codex/model-catalog.ts b/packages/core/src/agents/codex/model-catalog.ts new file mode 100644 index 0000000..198f207 --- /dev/null +++ b/packages/core/src/agents/codex/model-catalog.ts @@ -0,0 +1,609 @@ +import { BUILTIN_FUSION_WEB_SEARCH_TOOL_NAME } from "@ccr/core/contracts/app"; +import type { AppConfig, GatewayProviderConfig, GatewayProviderProtocol, ProviderModelMetadata, ProviderReasoningLevel, VirtualModelProfileConfig } from "@ccr/core/contracts/app"; +import { + findModelCatalogEntry, + modelCatalogMaxInputTokens, + readCatalogCapability, + type ModelCatalogEntry +} from "@ccr/core/gateway/model-catalog"; +import { codexDefaultBaseUrl, readCodexLocalModelCatalog } from "@ccr/core/agents/local-providers/codex"; +import { localAgentProviderApiKey } from "@ccr/core/agents/local-providers/shared"; +import { normalizeProviderBaseUrl } from "@ccr/core/providers/url"; + +const fusionModelProviderName = "Fusion"; +const codexDefaultContextWindow = 128_000; +const codexEffectiveContextWindowPercent = 95; + +export type CodexModelCatalog = { + models: CodexModelCatalogItem[]; +}; + +export type CodexModelCatalogItem = { + additional_speed_tiers: unknown[]; + apply_patch_tool_type: string | null; + availability_nux: null; + base_instructions: string; + context_window: number; + default_reasoning_level: string | null; + default_reasoning_summary: string; + description: string; + display_name: string; + effective_context_window_percent: number; + experimental_supported_tools: unknown[]; + input_modalities: string[]; + max_context_window: number; + priority: number; + service_tiers: unknown[]; + shell_type: string; + slug: string; + support_verbosity: boolean; + supported_in_api: boolean; + supported_reasoning_levels: Array<{ description: string; effort: string }>; + supports_image_detail_original: boolean; + supports_parallel_tool_calls: boolean; + supports_reasoning_summaries: boolean; + supports_search_tool: boolean; + truncation_policy: { limit: number; mode: string }; + upgrade: null; + visibility: string; + web_search_tool_type: string; +}; + +export function buildCodexModelCatalog(config?: Partial>, selectedModel?: string): CodexModelCatalog { + return { + models: buildCodexModelCatalogIds(config, selectedModel).map((model, index) => codexModelCatalogItem(model, index, config)) + }; +} + +export function buildCodexModelCatalogIds(config?: Partial>, selectedModel?: string): string[] { + const ids: string[] = []; + pushUniqueModel(ids, normalizeModelSelector(selectedModel)); + + const baseEntries: Array<{ modelName: string; providerName: string }> = []; + for (const provider of config?.Providers ?? []) { + const providerName = provider.name?.trim(); + if (!providerName || !Array.isArray(provider.models)) { + continue; + } + for (const rawModel of provider.models) { + const modelName = rawModel.trim(); + if (!modelName) { + continue; + } + baseEntries.push({ modelName, providerName }); + pushUniqueModel(ids, `${providerName}/${modelName}`); + } + } + + for (const profile of config?.virtualModelProfiles ?? []) { + if (!virtualModelIsCatalogVisible(profile)) { + continue; + } + for (const entry of baseEntries) { + for (const prefix of profile.match?.prefixes ?? []) { + const normalizedPrefix = prefix.trim(); + if (normalizedPrefix) { + pushUniqueModel(ids, `${entry.providerName}/${normalizedPrefix}${entry.modelName}`); + } + } + for (const suffix of profile.match?.suffixes ?? []) { + const normalizedSuffix = suffix.trim(); + if (normalizedSuffix) { + pushUniqueModel(ids, `${entry.providerName}/${entry.modelName}${normalizedSuffix}`); + } + } + } + for (const alias of virtualModelRawCatalogNames(profile)) { + pushUniqueModel(ids, fusionModelSelector(alias)); + } + } + + return ids; +} + +export function codexModelCatalogJson(config?: Partial>, selectedModel?: string): string { + return `${JSON.stringify(buildCodexModelCatalog(config, selectedModel), null, 2)}\n`; +} + +export function codexModelCatalogBase64(config?: Partial>, selectedModel?: string): string { + const catalog = buildCodexModelCatalog(config, selectedModel); + return Buffer.from(JSON.stringify(catalog), "utf8").toString("base64"); +} + +function codexModelCatalogItem( + model: string, + priority: number, + config?: Partial> +): CodexModelCatalogItem { + const profile = codexModelCapabilityProfile(model, config); + const contextWindow = codexModelContextWindow(model, profile.catalogEntry); + return { + additional_speed_tiers: profile.additionalSpeedTiers, + apply_patch_tool_type: profile.applyPatchToolType, + availability_nux: null, + base_instructions: "You are Codex, a coding agent.", + context_window: contextWindow, + default_reasoning_level: profile.defaultReasoningLevel, + default_reasoning_summary: profile.defaultReasoningSummary, + description: `CCR gateway model ${model}`, + display_name: model, + effective_context_window_percent: codexEffectiveContextWindowPercent, + experimental_supported_tools: [], + input_modalities: profile.inputModalities, + max_context_window: contextWindow, + priority, + service_tiers: profile.serviceTiers, + shell_type: "shell_command", + slug: model, + support_verbosity: true, + supported_in_api: true, + supported_reasoning_levels: profile.supportedReasoningLevels, + supports_image_detail_original: profile.supportsImageInput, + supports_parallel_tool_calls: profile.supportsParallelToolCalls, + supports_reasoning_summaries: profile.supportsReasoning, + supports_search_tool: profile.supportsSearchTool, + truncation_policy: { mode: "tokens", limit: 10_000 }, + upgrade: null, + visibility: "list", + web_search_tool_type: profile.supportsSearchTool && profile.supportsImageInput ? "text_and_image" : "text" + }; +} + +type CodexCapabilityProfile = { + additionalSpeedTiers: unknown[]; + applyPatchToolType: string | null; + catalogEntry?: ModelCatalogEntry; + defaultReasoningLevel: string | null; + defaultReasoningSummary: string; + inputModalities: string[]; + supportedReasoningLevels: Array<{ description: string; effort: string }>; + serviceTiers: unknown[]; + supportsImageInput: boolean; + supportsParallelToolCalls: boolean; + supportsReasoning: boolean; + supportsSearchTool: boolean; +}; + +function codexModelCapabilityProfile( + model: string, + config?: Partial> +): CodexCapabilityProfile { + const selector = parseModelSelector(model); + const provider = selector?.provider ? findConfiguredProvider(config, selector.provider) : findConfiguredProviderForModel(config, model); + const providerModel = selector?.model ?? model; + const providerModelMetadata = provider + ? providerModelMetadataFor(provider, providerModel) ?? localCodexModelMetadataFor(provider, providerModel) + : undefined; + const catalogEntry = findModelCatalogEntry(model); + const capabilities = catalogEntry?.capabilities ?? {}; + const providerProtocol = provider ? codexProviderProtocol(provider) : undefined; + const providerSupportsResponses = provider ? codexProviderSupportsResponses(provider) : false; + const supportsFusionWebSearch = codexVirtualModelSupportsFusionWebSearch(model, config); + const metadataReasoningLevels = normalizeProviderReasoningLevels(providerModelMetadata?.supportedReasoningLevels); + const supportsReasoning = providerModelMetadata?.supportsReasoningSummaries ?? (metadataReasoningLevels ? true : readCatalogCapability(capabilities, "reasoning")); + const supportsImageInput = catalogEntrySupportsImageInput(catalogEntry); + const supportsParallelToolCalls = readCatalogCapability(capabilities, "parallelFunctionCalling"); + const applyPatchToolType = providerSupportsResponses || catalogModelLooksLikeGpt(model, catalogEntry) || codexPatchBridgeApplies(model, catalogEntry, config) + ? "freeform" + : null; + const supportsSearchTool = + supportsFusionWebSearch || + ( + readCatalogCapability(capabilities, "webSearch") && + ( + providerProtocol === "openai_responses" || + providerProtocol === "anthropic_messages" || + providerProtocol === "gemini_interactions" + ) + ); + + return { + additionalSpeedTiers: providerModelMetadata?.additionalSpeedTiers ?? [], + applyPatchToolType, + catalogEntry, + defaultReasoningLevel: providerModelMetadata && providerModelMetadata.defaultReasoningLevel !== undefined + ? providerModelMetadata.defaultReasoningLevel + : supportsReasoning + ? "medium" + : null, + defaultReasoningSummary: providerModelMetadata?.defaultReasoningSummary ?? "none", + inputModalities: supportsImageInput ? ["text", "image"] : ["text"], + serviceTiers: providerModelMetadata?.serviceTiers ?? [], + supportedReasoningLevels: metadataReasoningLevels ?? (supportsReasoning ? supportedReasoningLevels(capabilities) : []), + supportsImageInput, + supportsParallelToolCalls, + supportsReasoning, + supportsSearchTool + }; +} + +function providerModelMetadataFor(provider: GatewayProviderConfig, model: string): ProviderModelMetadata | undefined { + const metadata = provider.modelMetadata ?? {}; + const direct = metadata[model]; + if (direct) { + return direct; + } + const normalized = model.trim().toLowerCase(); + const match = Object.entries(metadata).find(([candidate]) => candidate.trim().toLowerCase() === normalized); + return match?.[1]; +} + +function localCodexModelMetadataFor(provider: GatewayProviderConfig, model: string): ProviderModelMetadata | undefined { + if (!isLocalCodexProvider(provider)) { + return undefined; + } + return readCodexLocalModelCatalog().modelMetadata?.[model]; +} + +function isLocalCodexProvider(provider: GatewayProviderConfig): boolean { + const baseUrl = providerBaseUrl(provider).trim().replace(/\/+$/g, ""); + const normalizedBaseUrl = normalizeProviderBaseUrl(baseUrl); + const normalizedCodexBaseUrl = normalizeProviderBaseUrl(codexDefaultBaseUrl); + return ( + providerApiKey(provider) === localAgentProviderApiKey && + ( + baseUrl.toLowerCase() === codexDefaultBaseUrl.toLowerCase() || + baseUrl.toLowerCase().includes("chatgpt.com/backend-api/codex") || + normalizedBaseUrl === normalizedCodexBaseUrl + ) + ); +} + +function providerBaseUrl(provider: GatewayProviderConfig): string { + return provider.api_base_url || provider.baseUrl || provider.baseurl || ""; +} + +function providerApiKey(provider: GatewayProviderConfig): string { + return provider.api_key || provider.apiKey || provider.apikey || ""; +} + +function normalizeProviderReasoningLevels(levels: ProviderReasoningLevel[] | undefined): Array<{ description: string; effort: string }> | undefined { + const normalized = (levels ?? []) + .map((level) => ({ + description: level.description.trim() || effortDescription(level.effort), + effort: level.effort.trim() + })) + .filter((level) => level.effort); + return normalized.length > 0 ? normalized : undefined; +} + +function effortDescription(effort: string): string { + const normalized = effort.trim().toLowerCase(); + if (normalized === "xhigh") { + return "Extra high reasoning"; + } + return `${effort.slice(0, 1).toUpperCase()}${effort.slice(1)} reasoning`; +} + +function codexModelContextWindow(model: string, entry = findModelCatalogEntry(model)): number { + return modelCatalogMaxInputTokens(entry) || codexDefaultContextWindow; +} + +function catalogEntrySupportsImageInput(entry: ModelCatalogEntry | undefined): boolean { + const capabilities = entry?.capabilities ?? {}; + const modalities = new Set((entry?.modalities?.input ?? []).map((item) => item.toLowerCase())); + return modalities.has("image") || + readCatalogCapability(capabilities, "imageInput") || + readCatalogCapability(capabilities, "vision") || + readCatalogCapability(capabilities, "multimodal"); +} + +function supportedReasoningLevels(capabilities: Record): Array<{ description: string; effort: string }> { + const levels = [ + { effort: "low", description: "Low reasoning" }, + { effort: "medium", description: "Medium reasoning" }, + { effort: "high", description: "High reasoning" } + ]; + if (readCatalogCapability(capabilities, "xhighReasoningEffort") || readCatalogCapability(capabilities, "maxReasoningEffort")) { + levels.push({ effort: "xhigh", description: "Extra high reasoning" }); + } + return levels; +} + +function findConfiguredProvider( + config: Partial> | undefined, + providerName: string +): GatewayProviderConfig | undefined { + const normalized = providerName.trim().toLowerCase(); + if (!normalized) { + return undefined; + } + return (config?.Providers ?? []).find((provider) => provider.name.trim().toLowerCase() === normalized); +} + +function findConfiguredProviderForModel( + config: Partial> | undefined, + model: string +): GatewayProviderConfig | undefined { + const normalized = model.trim().toLowerCase(); + if (!normalized) { + return undefined; + } + return (config?.Providers ?? []).find((provider) => + provider.models.some((candidate) => candidate.trim().toLowerCase() === normalized) + ); +} + +function codexProviderProtocol(provider: GatewayProviderConfig): GatewayProviderProtocol | undefined { + const capabilityProtocols = uniqueProviderProtocols((provider.capabilities ?? []).map((capability) => normalizeProviderProtocol(capability.type))); + for (const protocol of ["openai_responses", "openai_chat_completions", "anthropic_messages", "gemini_generate_content", "gemini_interactions"] as GatewayProviderProtocol[]) { + if (capabilityProtocols.includes(protocol)) { + return protocol; + } + } + + return normalizeProviderProtocol(provider.type) ?? normalizeProviderProtocol(provider.provider) ?? inferProviderProtocol(provider); +} + +function codexProviderSupportsResponses(provider: GatewayProviderConfig): boolean { + return uniqueProviderProtocols((provider.capabilities ?? []).map((capability) => normalizeProviderProtocol(capability.type))).includes("openai_responses") || + normalizeProviderProtocol(provider.type) === "openai_responses" || + normalizeProviderProtocol(provider.provider) === "openai_responses" || + providerEndpointLooksLikeResponses(provider); +} + +function inferProviderProtocol(provider: GatewayProviderConfig): GatewayProviderProtocol { + const url = (provider.baseUrl || provider.baseurl || provider.api_base_url || "").toLowerCase(); + const transformer = JSON.stringify(provider.transformer ?? "").toLowerCase(); + if (providerEndpointLooksLikeResponses(provider)) { + return "openai_responses"; + } + if (url.includes("/interactions") || transformer.includes("gemini_interactions")) { + return "gemini_interactions"; + } + if (url.includes("generativelanguage.googleapis.com") || transformer.includes("gemini")) { + return "gemini_generate_content"; + } + if (url.includes("anthropic") || transformer.includes("anthropic")) { + return "anthropic_messages"; + } + return "openai_chat_completions"; +} + +function providerEndpointLooksLikeResponses(provider: GatewayProviderConfig): boolean { + const url = (provider.baseUrl || provider.baseurl || provider.api_base_url || "").toLowerCase(); + return url.endsWith("/responses") || url.includes("/responses?"); +} + +function catalogModelLooksLikeGpt(model: string, entry: ModelCatalogEntry | undefined): boolean { + return [ + model, + entry?.id, + entry?.model + ].some((value) => typeof value === "string" && value.toLowerCase().includes("gpt")); +} + +function codexPatchBridgeApplies( + model: string, + entry: ModelCatalogEntry | undefined, + config?: Partial> +): boolean { + const codexRule = config?.Router?.builtInRules?.codex; + if (!codexRule || codexRule.enabled === false) { + return false; + } + return !catalogModelLooksLikeGpt(modelNameForPatchBridge(model), entry); +} + +function modelNameForPatchBridge(model: string): string { + return parseModelSelector(model)?.model ?? model; +} + +function normalizeProviderProtocol(value: unknown): GatewayProviderProtocol | undefined { + if (typeof value !== "string") { + return undefined; + } + const normalized = value.trim().toLowerCase(); + if (normalized === "openai" || normalized === "openai_responses") { + return "openai_responses"; + } + if (normalized === "openai_chat" || normalized === "openai_chat_completions") { + return "openai_chat_completions"; + } + if (normalized === "anthropic" || normalized === "anthropic_messages") { + return "anthropic_messages"; + } + if (normalized === "gemini" || normalized === "gemini_generate_content") { + return "gemini_generate_content"; + } + if ( + normalized === "gemini_interactions" || + normalized === "gemini-interactions" || + normalized === "google_interactions" || + normalized === "google-interactions" || + normalized === "interactions" || + normalized === "interaction" + ) { + return "gemini_interactions"; + } + return undefined; +} + +function uniqueProviderProtocols(values: Array): GatewayProviderProtocol[] { + const seen = new Set(); + const output: GatewayProviderProtocol[] = []; + for (const value of values) { + if (!value || seen.has(value)) { + continue; + } + seen.add(value); + output.push(value); + } + return output; +} + +function parseModelSelector(model: string): { model: string; provider: string } | undefined { + const normalized = normalizeModelSelector(model); + const slashIndex = normalized.indexOf("/"); + if (slashIndex <= 0 || slashIndex >= normalized.length - 1) { + return undefined; + } + return { + provider: normalized.slice(0, slashIndex), + model: normalized.slice(slashIndex + 1) + }; +} + +function codexVirtualModelSupportsFusionWebSearch( + model: string, + config?: Partial> +): boolean { + return (config?.virtualModelProfiles ?? []).some((profile) => + virtualModelIsCatalogVisible(profile) && + virtualModelMatchesCatalogModel(profile, model, config) && + virtualModelProfileSupportsFusionWebSearch(profile) + ); +} + +function virtualModelMatchesCatalogModel( + profile: VirtualModelProfileConfig, + model: string, + config?: Partial> +): boolean { + const normalizedModel = normalizeModelSelector(model); + const normalizedModelLower = normalizedModel.toLowerCase(); + if (!normalizedModelLower) { + return false; + } + + for (const alias of virtualModelRawCatalogNames(profile)) { + const normalizedAlias = alias.trim().toLowerCase(); + if (normalizedAlias && (normalizedModelLower === normalizedAlias || normalizedModelLower === fusionModelSelector(alias).toLowerCase())) { + return true; + } + } + + const selector = parseModelSelector(normalizedModel); + if (!selector) { + return false; + } + const provider = findConfiguredProvider(config, selector.provider); + if (!provider) { + return false; + } + const configuredModels = new Set(provider.models.map((item) => item.trim().toLowerCase()).filter(Boolean)); + const selectedModel = selector.model.trim(); + const selectedModelLower = selectedModel.toLowerCase(); + + for (const prefix of profile.match?.prefixes ?? []) { + const normalizedPrefix = prefix.trim(); + if (!normalizedPrefix || !selectedModelLower.startsWith(normalizedPrefix.toLowerCase())) { + continue; + } + const baseModel = selectedModel.slice(normalizedPrefix.length).trim().toLowerCase(); + if (configuredModels.has(baseModel)) { + return true; + } + } + + for (const suffix of profile.match?.suffixes ?? []) { + const normalizedSuffix = suffix.trim(); + if (!normalizedSuffix || !selectedModelLower.endsWith(normalizedSuffix.toLowerCase())) { + continue; + } + const baseModel = selectedModel.slice(0, selectedModel.length - normalizedSuffix.length).trim().toLowerCase(); + if (configuredModels.has(baseModel)) { + return true; + } + } + + return false; +} + +function virtualModelProfileSupportsFusionWebSearch(profile: VirtualModelProfileConfig): boolean { + const metadata = recordValue(profile.metadata); + const fusionWebSearch = recordValue(metadata?.fusionWebSearch); + if (stringRecordValue(fusionWebSearch, "toolName")) { + return true; + } + + if (recordValue(profile.execution)?.matchWebSearch === true) { + return true; + } + + return (profile.tools ?? []).some((tool) => { + const name = tool.name.trim(); + return fusionWebSearchToolNameMatches(name); + }); +} + +function fusionWebSearchToolNameMatches(name: string): boolean { + const normalized = name.toLowerCase().replace(/[-.]/g, "_"); + return normalized === BUILTIN_FUSION_WEB_SEARCH_TOOL_NAME || + normalized.startsWith(`${BUILTIN_FUSION_WEB_SEARCH_TOOL_NAME}_`) || + normalized.endsWith(`_${BUILTIN_FUSION_WEB_SEARCH_TOOL_NAME}`) || + normalized.includes("search_web"); +} + +function recordValue(value: unknown): Record | undefined { + return typeof value === "object" && value !== null && !Array.isArray(value) + ? value as Record + : undefined; +} + +function stringRecordValue(record: Record | undefined, key: string): string { + const value = record?.[key]; + return typeof value === "string" ? value.trim() : ""; +} + +function virtualModelIsCatalogVisible(profile: VirtualModelProfileConfig): boolean { + return profile.enabled !== false && + profile.materialization?.enabled !== false && + profile.materialization?.includeInGatewayModels !== false; +} + +function virtualModelRawCatalogNames(profile: VirtualModelProfileConfig): string[] { + const exactAliases = uniqueStrings(profile.match?.exactAliases ?? []); + if (exactAliases.length > 0) { + return exactAliases; + } + return [profile.key || profile.displayName].filter(Boolean); +} + +function fusionModelSelector(model: string): string { + const normalized = fusionModelNameFromSelector(model); + return normalized ? `${fusionModelProviderName}/${normalized}` : ""; +} + +function fusionModelNameFromSelector(model: string): string { + const trimmed = model.trim(); + const prefix = `${fusionModelProviderName}/`; + return trimmed.toLowerCase().startsWith(prefix.toLowerCase()) + ? trimmed.slice(prefix.length).trim() + : trimmed; +} + +function normalizeModelSelector(value: string | undefined): string { + const trimmed = value?.trim(); + if (!trimmed) { + return ""; + } + const commaIndex = trimmed.indexOf(","); + if (commaIndex > 0 && commaIndex < trimmed.length - 1) { + const provider = trimmed.slice(0, commaIndex).trim(); + const model = trimmed.slice(commaIndex + 1).trim(); + return provider && model ? `${provider}/${model}` : ""; + } + return trimmed; +} + +function pushUniqueModel(models: string[], model: string | undefined): void { + const normalized = model?.trim(); + if (normalized && !models.includes(normalized)) { + models.push(normalized); + } +} + +function uniqueStrings(values: string[]): string[] { + const seen = new Set(); + const output: string[] = []; + for (const value of values) { + const normalized = value.trim(); + if (!normalized || seen.has(normalized)) { + continue; + } + seen.add(normalized); + output.push(normalized); + } + return output; +} diff --git a/packages/core/src/agents/local-providers/claude-code.ts b/packages/core/src/agents/local-providers/claude-code.ts new file mode 100644 index 0000000..bdae4e2 --- /dev/null +++ b/packages/core/src/agents/local-providers/claude-code.ts @@ -0,0 +1,197 @@ +import { execFileSync } from "node:child_process"; +import os from "node:os"; +import path from "node:path"; +import type { + LocalAgentProviderCandidate, + LocalAgentProviderImportResult, + ProviderAccountConfig, + ProviderAccountMappingConfig +} from "@ccr/core/contracts/app"; +import { + bearerAuthPlugin, + findOauthTokenSet, + isRecord, + missingCandidate, + providerInternalNamePlaceholder, + providerPayload, + readJsonRecord, + uniqueProviderName, + uniqueStrings, + type OAuthTokenSet +} from "@ccr/core/agents/local-providers/shared"; + +const claudeDefaultModels = ["claude-sonnet-5"]; +const claudeCodeKeychainService = "Claude Code-credentials"; + +const percentLimitMapping = (id: string, label: string, path: string, window: string) => ({ + id, + kind: "quota" as const, + label, + limit: 100, + remaining: `100 - ${path}.utilization`, + resetAt: `${path}.resets_at`, + unit: "%", + used: `${path}.utilization`, + window +}); + +const claudeCodeAccountMapping: ProviderAccountMappingConfig = { + meters: [ + percentLimitMapping("claude_five_hour_quota", "5h quota", "$.five_hour", "5h"), + percentLimitMapping("claude_seven_day_quota", "7d quota", "$.seven_day", "7d"), + percentLimitMapping("claude_oauth_apps_quota", "OAuth apps quota", "$.seven_day_oauth_apps", "7d"), + percentLimitMapping("claude_opus_quota", "Opus quota", "$.seven_day_opus", "7d"), + percentLimitMapping("claude_sonnet_quota", "Sonnet quota", "$.seven_day_sonnet", "7d"), + { + id: "claude_extra_usage", + kind: "quota", + label: "Extra usage", + limit: 100, + remaining: "100 - $.extra_usage.utilization", + unit: "%", + used: "$.extra_usage.utilization", + window: "monthly" + }, + { + id: "claude_extra_usage_credits", + kind: "balance", + label: "Extra usage credits", + limit: "$.extra_usage.monthly_limit", + unit: "credits", + used: "$.extra_usage.used_credits", + window: "monthly" + } + ] +}; + +export function claudeCodeCandidate(): LocalAgentProviderCandidate { + const oauth = readClaudeCodeOauth(); + if (oauth?.accessToken) { + return { + detail: "Claude Code login detected. Click Import to add it as a gateway provider.", + id: "claude-code-api", + importable: true, + kind: "claude-code", + models: claudeDefaultModels, + name: "Claude Code API", + protocol: "anthropic_messages", + sourceFile: oauth.sourceFile, + status: "available" + }; + } + if (oauth?.refreshToken) { + return { + detail: "Claude Code login was detected, but no usable access token was found.", + id: "claude-code-api", + importable: false, + kind: "claude-code", + models: claudeDefaultModels, + name: "Claude Code API", + protocol: "anthropic_messages", + sourceFile: oauth.sourceFile, + status: "locked" + }; + } + return missingCandidate("claude-code", "claude-code-api", "Claude Code API", "anthropic_messages", claudeDefaultModels); +} + +export function importClaudeCodeProvider(candidate: LocalAgentProviderCandidate, providerNames: string[]): LocalAgentProviderImportResult { + const oauth = readClaudeCodeOauth(); + const token = oauth?.accessToken; + if (!token) { + throw new Error("Claude Code access token was not found."); + } + const provider = providerPayload( + candidate, + uniqueProviderName(providerNames, "Claude Code API"), + "https://api.anthropic.com", + claudeCodeProviderAccountConfig() + ); + const auth = bearerAuthPlugin("claude-code-oauth", token, { + "anthropic-beta": "oauth-2025-04-20" + }); + const internalAuth = bearerAuthPlugin("claude-code-oauth-internal", token, { + "anthropic-beta": "oauth-2025-04-20" + }, providerInternalNamePlaceholder); + return { + candidate, + provider, + providerPlugins: [auth, internalAuth] + }; +} + +function claudeCodeProviderAccountConfig(): ProviderAccountConfig { + return { + connectors: [ + { + auth: "provider-api-key", + endpoint: "https://api.anthropic.com/api/oauth/usage", + headers: { + "Content-Type": "application/json", + "anthropic-beta": "oauth-2025-04-20" + }, + mapping: claudeCodeAccountMapping, + type: "http-json" + } + ], + enabled: true + }; +} + +function readClaudeCodeOauth(): OAuthTokenSet | undefined { + for (const sourceFile of claudeCredentialFiles()) { + const record = readJsonRecord(sourceFile); + if (!record) { + continue; + } + const credential = findOauthTokenSet(record); + return { + accessToken: credential?.accessToken, + refreshToken: credential?.refreshToken, + sourceFile + }; + } + + const keychainRecord = readClaudeCodeKeychainRecord(); + if (keychainRecord) { + const credential = findOauthTokenSet(keychainRecord); + if (credential) { + return { + accessToken: credential.accessToken, + refreshToken: credential.refreshToken, + sourceFile: `keychain:${claudeCodeKeychainService}` + }; + } + } + + return undefined; +} + +function claudeCredentialFiles(): string[] { + return uniqueStrings([ + path.join(os.homedir(), ".claude", ".credentials.json"), + path.join(os.homedir(), ".claude", "credentials.json"), + path.join(os.homedir(), ".config", "claude", "credentials.json") + ]); +} + +// Newer macOS builds of the Claude Code CLI store credentials in the +// Keychain instead of ~/.claude/.credentials.json. Reading it triggers the +// standard macOS keychain access prompt (Allow / Always Allow); the user +// declining or the item not existing both surface as a non-zero exit here. +function readClaudeCodeKeychainRecord(): Record | undefined { + if (process.platform !== "darwin") { + return undefined; + } + try { + const output = execFileSync( + "security", + ["find-generic-password", "-s", claudeCodeKeychainService, "-w"], + { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] } + ); + const parsed = JSON.parse(output.trim()) as unknown; + return isRecord(parsed) ? parsed : undefined; + } catch { + return undefined; + } +} diff --git a/packages/core/src/agents/local-providers/codex.ts b/packages/core/src/agents/local-providers/codex.ts new file mode 100644 index 0000000..b6ba7dd --- /dev/null +++ b/packages/core/src/agents/local-providers/codex.ts @@ -0,0 +1,860 @@ +import os from "node:os"; +import path from "node:path"; +import type { + LocalAgentProviderCandidate, + LocalAgentProviderImportResult, + LocalAgentProviderProbeResult, + GatewayProviderConfig, + ProviderAccountConfig, + ProviderAccountConnectorConfig, + ProviderAccountMappingConfig, + ProviderAccountMeter, + ProviderAccountMeterDetail, + ProviderModelMetadata, + ProviderReasoningLevel +} from "@ccr/core/contracts/app"; +import { normalizeProviderBaseUrl } from "@ccr/core/providers/url"; +import { fetchWithSystemProxy } from "@ccr/core/proxy/system-proxy-fetch"; +import { + isRecord, + localAgentProviderApiKey, + missingCandidate, + modelMetadataForModels, + modelDisplayNamesForModels, + providerInternalNamePlaceholder, + providerNamePlaceholder, + providerNameSlugPlaceholder, + providerPayload, + readBoolean, + readJsonRecord, + readString, + uniqueProviderName, + uniqueStrings, + type OAuthTokenSet +} from "@ccr/core/agents/local-providers/shared"; + +export const codexDefaultBaseUrl = "https://chatgpt.com/backend-api/codex"; + +const codexAccountBaseUrl = "https://chatgpt.com/backend-api"; +const codexDefaultModels = ["gpt-5-codex"]; +const codexProbeTimeoutMs = 8_000; + +export type LocalAgentModelCatalog = { + modelDisplayNames?: Record; + modelMetadata?: Record; + models: string[]; +}; + +const codexAccountRateLimitMapping: ProviderAccountMappingConfig = { + meters: [ + { + id: "codex_primary_quota", + kind: "quota", + label: "Primary quota", + limit: 100, + remaining: [ + "100 - $.rate_limit.primary_window.used_percent", + "100 - $.rate_limits.primary.used_percent" + ], + resetAt: [ + "$.rate_limit.primary_window.reset_at", + "$.rate_limit.primary_window.resets_at", + "$.rate_limits.primary.resets_at" + ], + unit: "%", + used: [ + "$.rate_limit.primary_window.used_percent", + "$.rate_limits.primary.used_percent" + ], + window: "primary" + }, + { + id: "codex_manual_resets", + kind: "requests", + label: "Manual resets", + remaining: [ + "$.resetsAvailable", + "$.availableRateLimitResetCount", + "$.rate_limit_reset_credits.available_count", + "$.rate_limit.resetsAvailable", + "$.rate_limits.resetsAvailable", + "$.rate_limit.manual_resets.remaining", + "$.rate_limit.manual_resets.resetsAvailable", + "$.rate_limit.manual_reset.remaining", + "$.rate_limit.manual_reset.resetsAvailable", + "$.rate_limits.manual_resets.remaining", + "$.rate_limits.manual_resets.resetsAvailable", + "$.rate_limits.manual_reset.remaining", + "$.rate_limits.manual_reset.resetsAvailable", + "$.manual_resets.remaining", + "$.manual_resets.resetsAvailable", + "$.manual_reset.remaining", + "$.manual_reset.resetsAvailable", + "$.resets.remaining", + "$.resets.resetsAvailable", + "$.rate_limit.manual_resets.available", + "$.rate_limit.manual_reset.available", + "$.rate_limit.resets.available", + "$.rate_limits.resets.available", + "$.manual_resets.available", + "$.manual_reset.available", + "$.resets.available", + 0 + ], + resetAt: [ + "$.resetExpires", + "$.expires_at", + "$.resets_at", + "$.rate_limit.manual_resets.expires_at", + "$.rate_limit.manual_resets.expire_at", + "$.rate_limit.manual_resets.reset_at", + "$.rate_limit.manual_resets.resets_at", + "$.rate_limit.manual_reset.expires_at", + "$.rate_limit.manual_reset.expire_at", + "$.rate_limit.manual_reset.reset_at", + "$.rate_limit.manual_reset.resets_at", + "$.rate_limits.manual_resets.expires_at", + "$.rate_limits.manual_resets.expire_at", + "$.rate_limits.manual_resets.reset_at", + "$.rate_limits.manual_resets.resets_at", + "$.rate_limits.manual_reset.expires_at", + "$.rate_limits.manual_reset.expire_at", + "$.rate_limits.manual_reset.reset_at", + "$.rate_limits.manual_reset.resets_at", + "$.rate_limit.resets.expires_at", + "$.rate_limit.resets.expire_at", + "$.rate_limit.resets.reset_at", + "$.rate_limit.resets.resets_at", + "$.rate_limits.resets.expires_at", + "$.rate_limits.resets.expire_at", + "$.rate_limits.resets.reset_at", + "$.rate_limits.resets.resets_at", + "$.manual_resets.expires_at", + "$.manual_resets.expire_at", + "$.manual_resets.reset_at", + "$.manual_resets.resets_at", + "$.manual_reset.expires_at", + "$.manual_reset.expire_at", + "$.manual_reset.reset_at", + "$.manual_reset.resets_at", + "$.resets.expires_at", + "$.resets.expire_at", + "$.resets.reset_at", + "$.resets.resets_at" + ], + unit: "resets", + used: [ + "$.rate_limit.manual_resets.used", + "$.rate_limit.manual_reset.used", + "$.rate_limits.manual_resets.used", + "$.manual_resets.used", + "$.manual_reset.used", + "$.resets.used" + ], + window: "manual-reset" + }, + { + id: "codex_secondary_quota", + kind: "quota", + label: "Secondary quota", + limit: 100, + remaining: [ + "100 - $.rate_limit.secondary_window.used_percent", + "100 - $.rate_limits.secondary.used_percent" + ], + resetAt: [ + "$.rate_limit.secondary_window.reset_at", + "$.rate_limit.secondary_window.resets_at", + "$.rate_limits.secondary.resets_at" + ], + unit: "%", + used: [ + "$.rate_limit.secondary_window.used_percent", + "$.rate_limits.secondary.used_percent" + ], + window: "secondary" + }, + { + id: "codex_individual_limit", + kind: "quota", + label: "Individual limit", + limit: "$.spend_control.individual_limit.limit", + remaining: "$.spend_control.individual_limit.remaining", + resetAt: "$.spend_control.individual_limit.reset_at", + unit: "credits", + used: "$.spend_control.individual_limit.used", + window: "monthly" + }, + { + id: "codex_credit_balance", + kind: "balance", + label: "Credit balance", + remaining: "$.credits.balance", + unit: "credits" + } + ] +}; + +const codexAccountRateLimitResetCreditsMapping: ProviderAccountMappingConfig = { + meters: [ + { + id: "codex_manual_resets", + kind: "requests", + label: "Manual resets", + remaining: [ + "$.available_count", + "$.rate_limit_reset_credits.available_count", + 0 + ], + resetAt: [ + "$.expires_at", + "$.expiresAt", + "$.reset_at", + "$.resetAt" + ], + unit: "resets", + window: "manual-reset" + } + ] +}; + +const codexAccountTokenUsageMapping: ProviderAccountMappingConfig = { + meters: [ + { + id: "codex_lifetime_tokens", + kind: "tokens", + label: "Lifetime tokens", + unit: "tokens", + used: "$.stats.lifetime_tokens" + }, + { + id: "codex_peak_daily_tokens", + kind: "tokens", + label: "Peak daily tokens", + unit: "tokens", + used: "$.stats.peak_daily_tokens", + window: "daily" + } + ] +}; + +export function codexCandidate(): LocalAgentProviderCandidate { + const auth = readCodexAuth(); + const catalog = readCodexLocalModelCatalog(); + if (auth?.refreshToken || auth?.accessToken) { + return { + detail: "ChatGPT login detected. Click Import to add it as a gateway provider.", + id: "codex-api", + importable: true, + kind: "codex", + modelDisplayNames: catalog.modelDisplayNames, + modelMetadata: catalog.modelMetadata, + models: catalog.models, + name: "Codex API", + protocol: "openai_responses", + sourceFile: auth.sourceFile, + status: "available" + }; + } + return missingCandidate("codex", "codex-api", "Codex API", "openai_responses", catalog.models, catalog.modelDisplayNames); +} + +export async function importCodexProvider(candidate: LocalAgentProviderCandidate, providerNames: string[]): Promise { + const auth = readCodexAuth(); + if (!auth?.refreshToken && !auth?.accessToken) { + throw new Error("Codex login token was not found."); + } + const probedCandidate = await codexCandidateWithProbedModels(candidate).catch(() => candidate); + const provider = providerPayload(probedCandidate, uniqueProviderName(providerNames, "Codex API"), codexDefaultBaseUrl, codexProviderAccountConfig()); + return { + candidate: probedCandidate, + provider, + providerPlugins: [ + codexOauthPlugin("codex-oauth"), + codexOauthPlugin("codex-oauth-internal", providerInternalNamePlaceholder) + ].map((plugin) => ({ + ...plugin, + ...(auth.isFedrampAccount ? { auth: { headers: { "X-OpenAI-Fedramp": "true" } } } : {}), + codexOauth: { + accessToken: auth.accessToken, + ...(auth.accountId ? { accountId: auth.accountId } : {}), + refreshIfMissingAccessToken: true, + refreshToken: auth.refreshToken, + required: true + } + })) + }; +} + +export async function probeCodexProvider(candidate: LocalAgentProviderCandidate): Promise { + const probedCandidate = await codexCandidateWithProbedModels(candidate).catch(() => candidate); + return { + candidate: probedCandidate, + probe: codexProviderProbe(probedCandidate) + }; +} + +export function readCodexAuth(): OAuthTokenSet | undefined { + const sourceFile = path.join(codexHomeDir(), ".codex", "auth.json"); + const record = readJsonRecord(sourceFile); + if (!record) { + return undefined; + } + const tokens = isRecord(record.tokens) ? record.tokens : {}; + const idToken = readString(tokens.id_token) || readString(tokens.idToken); + const idTokenClaims = readCodexIdTokenClaims(idToken); + return { + accountId: + readString(tokens.account_id) || + readString(tokens.accountId) || + idTokenClaims.accountId, + accessToken: readString(tokens.access_token) || readString(tokens.accessToken), + isFedrampAccount: idTokenClaims.isFedrampAccount, + refreshToken: readString(tokens.refresh_token) || readString(tokens.refreshToken), + sourceFile + }; +} + +export function codexProviderAccountConfig(): ProviderAccountConfig { + return { + connectors: [ + { + auth: "provider-api-key", + endpoint: `${codexAccountBaseUrl}/wham/usage`, + headers: { + "User-Agent": "codex-cli" + }, + mapping: codexAccountRateLimitMapping, + type: "http-json" + }, + { + auth: "provider-api-key", + endpoint: `${codexAccountBaseUrl}/wham/rate-limit-reset-credits`, + headers: { + "User-Agent": "codex-cli" + }, + mapping: codexAccountRateLimitResetCreditsMapping, + type: "http-json" + }, + { + auth: "provider-api-key", + endpoint: `${codexAccountBaseUrl}/wham/profiles/me`, + headers: { + "User-Agent": "codex-cli" + }, + mapping: codexAccountTokenUsageMapping, + type: "http-json" + } + ], + enabled: true + }; +} + +export function attachCodexRateLimitResetCreditDetails(meters: ProviderAccountMeter[], payload: unknown): ProviderAccountMeter[] { + const details = codexRateLimitResetCreditDetails(payload); + if (details.length === 0) { + return meters; + } + const resetAt = firstCodexResetCreditExpiry(details); + return meters.map((meter) => { + if (!isCodexManualResetMeter(meter)) { + return meter; + } + return { + ...meter, + details, + resetAt: meter.resetAt ?? resetAt + }; + }); +} + +export function codexRateLimitResetCreditDetails(payload: unknown): ProviderAccountMeterDetail[] { + const records = codexRateLimitResetCreditRecords(payload); + if (records.length === 0) { + return []; + } + const availableRecords = records.filter(isAvailableCodexResetCreditRecord); + const sourceRecords = availableRecords.length > 0 ? availableRecords : records; + return sourceRecords + .map(codexRateLimitResetCreditDetail) + .filter((detail): detail is ProviderAccountMeterDetail => Boolean(detail)) + .sort(compareCodexResetCreditDetails); +} + +export function normalizeCodexProviderAccountConfig(provider: GatewayProviderConfig): GatewayProviderConfig { + if (!isLocalCodexProvider(provider) || !shouldUseCurrentCodexAccountConfig(provider.account)) { + return provider; + } + const account = codexProviderAccountConfig(); + return { + ...provider, + account: { + ...account, + refreshIntervalMs: provider.account?.refreshIntervalMs ?? account.refreshIntervalMs + } + }; +} + +function isLocalCodexProvider(provider: GatewayProviderConfig): boolean { + return ( + providerApiKey(provider) === localAgentProviderApiKey && + normalizeProviderBaseUrl(providerBaseUrl(provider)) === normalizeProviderBaseUrl(codexDefaultBaseUrl) + ); +} + +function shouldUseCurrentCodexAccountConfig(account: ProviderAccountConfig | undefined): boolean { + if (account?.enabled === false) { + return false; + } + const connectors = account?.connectors ?? []; + if (connectors.length === 0) { + return true; + } + return connectors.every(isCodexAccountConnector); +} + +function isCodexAccountConnector(connector: ProviderAccountConnectorConfig): boolean { + if (connector.type === "standard") { + return !connector.endpoint?.trim() && !connector.endpoints?.length && !connector.headers && !connector.id; + } + if (connector.type !== "http-json") { + return false; + } + return /^https:\/\/chatgpt\.com\/backend-api\/wham\//i.test(connector.endpoint.trim()); +} + +function codexRateLimitResetCreditRecords(payload: unknown): Record[] { + if (!isRecord(payload)) { + return []; + } + const containers = [ + payload.rate_limit_reset_credits, + payload.rateLimitResetCredits, + payload + ].filter(isRecord); + for (const container of containers) { + const candidates = [ + container.credits, + container.items, + container.data, + container.available, + container.available_credits, + container.availableCredits, + container.reset_credits, + container.resetCredits + ]; + for (const candidate of candidates) { + const records = readCodexResetCreditRecordArray(candidate); + if (records.length > 0) { + return records; + } + } + } + return []; +} + +function readCodexResetCreditRecordArray(value: unknown): Record[] { + if (Array.isArray(value)) { + return value.filter(isRecord); + } + if (!isRecord(value)) { + return []; + } + const nested = [value.credits, value.items, value.data]; + for (const candidate of nested) { + if (Array.isArray(candidate)) { + return candidate.filter(isRecord); + } + } + return []; +} + +function isAvailableCodexResetCreditRecord(record: Record): boolean { + const status = readCodexStringFromKeys(record, ["status", "state"])?.toLowerCase(); + return !status || status === "available" || status === "active"; +} + +function codexRateLimitResetCreditDetail(record: Record, index: number): ProviderAccountMeterDetail | undefined { + const id = readCodexStringFromKeys(record, ["id", "credit_id", "creditId"]); + const status = readCodexStringFromKeys(record, ["status", "state"]); + const effectiveAt = readCodexDateFromKeys(record, [ + "effective_at", + "effectiveAt", + "start_date", + "startDate", + "valid_from", + "validFrom", + "starts_at", + "startsAt", + "start_at", + "startAt", + "available_at", + "availableAt", + "granted_at", + "grantedAt", + "created_at", + "createdAt" + ]); + const expiresAt = readCodexDateFromKeys(record, [ + "expires_at", + "expiresAt", + "expire_at", + "expireAt", + "expiration_at", + "expirationAt", + "valid_until", + "validUntil", + "end_date", + "endDate", + "ends_at", + "endsAt", + "end_at", + "endAt" + ]); + if (!effectiveAt && !expiresAt) { + return undefined; + } + return { + description: readCodexStringFromKeys(record, ["description", "message"]), + effectiveAt, + expiresAt, + id: id ?? `codex-reset-credit-${index + 1}`, + label: readCodexStringFromKeys(record, ["label", "name", "title"]), + redeemable: Boolean(id) && isAvailableCodexResetCreditRecord(record), + status + }; +} + +function readCodexStringFromKeys(record: Record, keys: string[]): string | undefined { + for (const key of keys) { + const value = readString(record[key]); + if (value) { + return value; + } + } + return undefined; +} + +function readCodexDateFromKeys(record: Record, keys: string[]): string | undefined { + for (const key of keys) { + const value = codexDateString(record[key]); + if (value) { + return value; + } + } + return undefined; +} + +function codexDateString(value: unknown): string | undefined { + if (typeof value === "number" && Number.isFinite(value)) { + const timestamp = value > 1_000_000_000_000 ? value : value * 1000; + return new Date(timestamp).toISOString(); + } + const text = readString(value); + if (!text) { + return undefined; + } + const timestamp = new Date(text).getTime(); + return Number.isFinite(timestamp) ? new Date(timestamp).toISOString() : text; +} + +function compareCodexResetCreditDetails(a: ProviderAccountMeterDetail, b: ProviderAccountMeterDetail): number { + return codexDetailTimestamp(a.expiresAt) - codexDetailTimestamp(b.expiresAt) + || codexDetailTimestamp(a.effectiveAt) - codexDetailTimestamp(b.effectiveAt); +} + +function codexDetailTimestamp(value: string | undefined): number { + if (!value) { + return Number.MAX_SAFE_INTEGER; + } + const timestamp = new Date(value).getTime(); + return Number.isFinite(timestamp) ? timestamp : Number.MAX_SAFE_INTEGER; +} + +function firstCodexResetCreditExpiry(details: ProviderAccountMeterDetail[]): string | undefined { + return [...details] + .sort(compareCodexResetCreditDetails) + .find((detail) => detail.expiresAt) + ?.expiresAt; +} + +function isCodexManualResetMeter(meter: ProviderAccountMeter): boolean { + const text = `${meter.id} ${meter.label} ${meter.window ?? ""}`.toLowerCase(); + return text.includes("manual_reset") || text.includes("manual reset") || text.includes("manual-reset"); +} + +function providerBaseUrl(provider: GatewayProviderConfig): string { + return provider.api_base_url || provider.baseUrl || provider.baseurl || ""; +} + +function providerApiKey(provider: GatewayProviderConfig): string { + return provider.api_key || provider.apiKey || provider.apikey || ""; +} + +function codexOauthPlugin(suffix: string, providerName = providerNamePlaceholder): Record { + return { + key: `ccr-local-agent-${providerNameSlugPlaceholder}-${suffix}`, + providerName, + request: codexBackendRequestTransform() + }; +} + +function codexBackendRequestTransform(): Record { + return { + bodyRemove: ["max_output_tokens"] + }; +} + +export function readCodexLocalModelCatalog(): LocalAgentModelCatalog { + const modelsFile = path.join(codexHomeDir(), ".codex", "models_cache.json"); + const record = readJsonRecord(modelsFile); + const catalog = codexModelCatalogFromPayload(record); + const uniqueModels = uniqueStrings([...catalog.models, ...codexDefaultModels]); + return { + modelDisplayNames: modelDisplayNamesForModels(catalog.modelDisplayNames, uniqueModels), + modelMetadata: modelMetadataForModels(catalog.modelMetadata, uniqueModels), + models: uniqueModels + }; +} + +async function codexCandidateWithProbedModels(candidate: LocalAgentProviderCandidate): Promise { + const catalog = await fetchCodexModelCatalog(); + if (catalog.models.length === 0) { + return candidate; + } + return { + ...candidate, + modelDisplayNames: catalog.modelDisplayNames, + modelMetadata: catalog.modelMetadata, + models: catalog.models + }; +} + +async function fetchCodexModelCatalog(): Promise { + const auth = readCodexAuth(); + if (!auth?.accessToken) { + throw new Error("Codex access token was not found."); + } + + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), codexProbeTimeoutMs); + try { + const response = await fetchWithSystemProxy(`${codexDefaultBaseUrl}/models`, { + headers: { + accept: "application/json", + authorization: `Bearer ${auth.accessToken}`, + "User-Agent": "codex-cli", + ...(auth.accountId ? { "ChatGPT-Account-Id": auth.accountId } : {}), + ...(auth.isFedrampAccount ? { "X-OpenAI-Fedramp": "true" } : {}) + }, + method: "GET", + signal: controller.signal + }); + const text = await response.text(); + if (!response.ok) { + throw new Error(`Codex model probe returned HTTP ${response.status}.`); + } + const payload = parseJson(text); + const catalog = codexModelCatalogFromPayload(payload); + if (catalog.models.length === 0) { + throw new Error("Codex model probe returned no models."); + } + return catalog; + } finally { + clearTimeout(timer); + } +} + +function codexProviderProbe(candidate: LocalAgentProviderCandidate) { + return { + capabilities: [ + { + baseUrl: codexDefaultBaseUrl, + source: "detected" as const, + type: "openai_responses" as const + } + ], + detectedProtocol: "openai_responses" as const, + modelDisplayNames: candidate.modelDisplayNames, + modelMetadata: candidate.modelMetadata, + modelSource: "openai" as const, + models: candidate.models, + normalizedBaseUrl: codexDefaultBaseUrl, + protocols: [ + { + baseUrl: codexDefaultBaseUrl, + endpoint: `${codexDefaultBaseUrl}/responses`, + message: "", + protocol: "openai_responses" as const, + supported: true + } + ] + }; +} + +function codexModelCatalogFromPayload(payload: unknown): LocalAgentModelCatalog { + const models: string[] = []; + const modelDisplayNames: Record = {}; + const modelMetadata: Record = {}; + for (const item of codexModelCatalogItems(payload)) { + const model = isRecord(item) + ? readString(item.slug) || readString(item.id) || readString(item.model) || readString(item.name) + : readString(item); + if (!model) { + continue; + } + models.push(model); + if (isRecord(item)) { + const displayName = readString(item.display_name) || readString(item.displayName) || readString(item.label) || readString(item.title) || readString(item.name); + if (displayName && displayName !== model) { + modelDisplayNames[model] = displayName; + } + const metadata = codexModelMetadataFromItem(item); + if (metadata) { + modelMetadata[model] = metadata; + } + } + } + const uniqueModels = uniqueStrings(models); + return { + modelDisplayNames: modelDisplayNamesForModels(modelDisplayNames, uniqueModels), + modelMetadata: modelMetadataForModels(modelMetadata, uniqueModels), + models: uniqueModels + }; +} + +function codexModelMetadataFromItem(item: Record): ProviderModelMetadata | undefined { + const additionalSpeedTiers = readArray(item.additional_speed_tiers) ?? readArray(item.additionalSpeedTiers) ?? readArray(item.speed_tiers) ?? readArray(item.speedTiers); + const serviceTiers = readArray(item.service_tiers) ?? readArray(item.serviceTiers); + const supportedReasoningLevels = + readReasoningLevels(item.supported_reasoning_levels) ?? + readReasoningLevels(item.supportedReasoningLevels) ?? + readReasoningEfforts(item.supported_reasoning_efforts) ?? + readReasoningEfforts(item.supportedReasoningEfforts) ?? + readReasoningEfforts(item.reasoning_efforts) ?? + readReasoningEfforts(item.reasoningEfforts); + const defaultReasoningLevel = readNullableString(item.default_reasoning_level) ?? readNullableString(item.defaultReasoningLevel); + const defaultReasoningSummary = readString(item.default_reasoning_summary) || readString(item.defaultReasoningSummary); + const supportsReasoningSummaries = readBoolean(item.supports_reasoning_summaries) ?? readBoolean(item.supportsReasoningSummaries); + const metadata: ProviderModelMetadata = { + ...(additionalSpeedTiers ? { additionalSpeedTiers } : {}), + ...(defaultReasoningLevel !== undefined ? { defaultReasoningLevel } : {}), + ...(defaultReasoningSummary ? { defaultReasoningSummary } : {}), + ...(serviceTiers ? { serviceTiers } : {}), + ...(supportedReasoningLevels ? { supportedReasoningLevels } : {}), + ...(supportsReasoningSummaries !== undefined ? { supportsReasoningSummaries } : {}) + }; + return Object.keys(metadata).length > 0 ? metadata : undefined; +} + +function readArray(value: unknown): unknown[] | undefined { + return Array.isArray(value) ? value : undefined; +} + +function readNullableString(value: unknown): string | null | undefined { + if (value === null) { + return null; + } + const text = readString(value); + return text || undefined; +} + +function readReasoningLevels(value: unknown): ProviderReasoningLevel[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + const levels = value + .map((item): ProviderReasoningLevel | undefined => { + if (!isRecord(item)) { + const effort = readString(item); + return effort ? { description: effortDescription(effort), effort } : undefined; + } + const effort = readString(item.effort) || readString(item.name) || readString(item.id) || readString(item.value); + if (!effort) { + return undefined; + } + return { + description: readString(item.description) || readString(item.label) || effortDescription(effort), + effort + }; + }) + .filter((item): item is ProviderReasoningLevel => Boolean(item)); + return levels.length > 0 ? levels : undefined; +} + +function readReasoningEfforts(value: unknown): ProviderReasoningLevel[] | undefined { + if (Array.isArray(value)) { + return readReasoningLevels(value); + } + if (!isRecord(value)) { + return undefined; + } + return readReasoningLevels(Object.values(value)); +} + +function effortDescription(effort: string): string { + const normalized = effort.trim().toLowerCase(); + if (normalized === "xhigh") { + return "Extra high reasoning"; + } + return `${effort.slice(0, 1).toUpperCase()}${effort.slice(1)} reasoning`; +} + +function codexModelCatalogItems(payload: unknown): unknown[] { + if (Array.isArray(payload)) { + return payload; + } + if (!isRecord(payload)) { + return []; + } + + const items: unknown[] = []; + for (const candidate of [payload.data, payload.models]) { + if (Array.isArray(candidate)) { + items.push(...candidate); + } + } + return items; +} + +function parseJson(text: string): unknown { + try { + return JSON.parse(text) as unknown; + } catch { + return undefined; + } +} + +export function codexModelCatalogFromPayloadForTest(payload: unknown): LocalAgentModelCatalog { + return codexModelCatalogFromPayload(payload); +} + +function codexHomeDir(): string { + return process.env.CCR_INTERNAL_HOME_DIR?.trim() || process.env.HOME?.trim() || process.env.USERPROFILE?.trim() || os.homedir(); +} + +function readCodexIdTokenClaims(idToken: string | undefined): { accountId?: string; isFedrampAccount?: boolean } { + const payload = readJwtPayload(idToken); + const auth = isRecord(payload?.["https://api.openai.com/auth"]) + ? payload["https://api.openai.com/auth"] + : {}; + return { + accountId: readString(auth.chatgpt_account_id) || readString(auth.account_id) || readString(auth.accountId), + isFedrampAccount: readBoolean(auth.chatgpt_account_is_fedramp) + }; +} + +function readJwtPayload(jwt: string | undefined): Record | undefined { + const encoded = jwt?.split(".")[1]; + if (!encoded) { + return undefined; + } + try { + const padded = encoded.padEnd(encoded.length + ((4 - encoded.length % 4) % 4), "="); + const decoded = Buffer.from(padded.replace(/-/g, "+").replace(/_/g, "/"), "base64").toString("utf8"); + const payload = JSON.parse(decoded) as unknown; + return isRecord(payload) ? payload : undefined; + } catch { + return undefined; + } +} diff --git a/packages/core/src/agents/local-providers/service.ts b/packages/core/src/agents/local-providers/service.ts new file mode 100644 index 0000000..6f1ab13 --- /dev/null +++ b/packages/core/src/agents/local-providers/service.ts @@ -0,0 +1,50 @@ +import type { + LocalAgentProviderCandidate, + LocalAgentProviderImportRequest, + LocalAgentProviderImportResult, + LocalAgentProviderProbeRequest, + LocalAgentProviderProbeResult +} from "@ccr/core/contracts/app"; +import { claudeCodeCandidate, importClaudeCodeProvider } from "@ccr/core/agents/local-providers/claude-code"; +import { codexCandidate, importCodexProvider, probeCodexProvider } from "@ccr/core/agents/local-providers/codex"; +import { importZcodeProvider, zcodeCandidate } from "@ccr/core/agents/local-providers/zcode"; + +export { codexDefaultBaseUrl, readCodexAuth } from "@ccr/core/agents/local-providers/codex"; +export { localAgentProviderApiKey, type OAuthTokenSet } from "@ccr/core/agents/local-providers/shared"; + +export function getLocalAgentProviderCandidates(): LocalAgentProviderCandidate[] { + return [ + codexCandidate(), + claudeCodeCandidate(), + zcodeCandidate() + ].filter((candidate) => candidate.status !== "missing"); +} + +export async function importLocalAgentProvider(request: LocalAgentProviderImportRequest): Promise { + const candidate = getLocalAgentProviderCandidates().find((item) => item.id === request.id); + if (!candidate) { + throw new Error("Local agent provider was not found."); + } + if (!candidate.importable) { + throw new Error(candidate.detail || "Local agent login is not importable."); + } + + if (candidate.kind === "codex") { + return importCodexProvider(candidate, request.providerNames ?? []); + } + if (candidate.kind === "claude-code") { + return importClaudeCodeProvider(candidate, request.providerNames ?? []); + } + return importZcodeProvider(candidate, request.providerNames ?? []); +} + +export async function probeLocalAgentProvider(request: LocalAgentProviderProbeRequest): Promise { + const candidate = getLocalAgentProviderCandidates().find((item) => item.id === request.id); + if (!candidate) { + throw new Error("Local agent provider was not found."); + } + if (candidate.kind === "codex") { + return probeCodexProvider(candidate); + } + throw new Error("Local agent provider model probing is not supported."); +} diff --git a/packages/core/src/agents/local-providers/shared.ts b/packages/core/src/agents/local-providers/shared.ts new file mode 100644 index 0000000..1432c01 --- /dev/null +++ b/packages/core/src/agents/local-providers/shared.ts @@ -0,0 +1,220 @@ +import { existsSync, readFileSync } from "node:fs"; +import type { + GatewayProviderProtocol, + LocalAgentProviderCandidate, + LocalAgentProviderKind, + ProviderAccountConfig, + ProviderDeepLinkPayload, + ProviderModelMetadata +} from "@ccr/core/contracts/app"; + +export type OAuthTokenSet = { + accountId?: string; + accessToken?: string; + isFedrampAccount?: boolean; + refreshToken?: string; + sourceFile: string; +}; + +export type ApiTokenSet = { + sourceFile: string; + hasSharedLogin?: boolean; +}; + +export const providerNamePlaceholder = "__CCR_PROVIDER_NAME__"; +export const providerNameSlugPlaceholder = "__CCR_PROVIDER_NAME_SLUG__"; +export const providerInternalNamePlaceholder = "__CCR_PROVIDER_INTERNAL_NAME__"; +export const localAgentProviderApiKey = "ccr-local-agent-login"; + +export function missingCandidate( + kind: LocalAgentProviderKind, + id: string, + name: string, + protocol: GatewayProviderProtocol, + models: string[], + modelDisplayNames?: Record +): LocalAgentProviderCandidate { + return { + detail: "No local login state was found for this agent.", + id, + importable: false, + kind, + modelDisplayNames: modelDisplayNamesForModels(modelDisplayNames, models), + models, + name, + protocol, + status: "missing" + }; +} + +export function providerPayload( + candidate: LocalAgentProviderCandidate, + name: string, + baseUrl: string, + account?: ProviderAccountConfig +): ProviderDeepLinkPayload { + const models = uniqueStrings(candidate.models).slice(0, 24); + return { + account, + apiKey: localAgentProviderApiKey, + baseUrl, + modelDisplayNames: modelDisplayNamesForModels(candidate.modelDisplayNames, models), + modelMetadata: modelMetadataForModels(candidate.modelMetadata, models), + models, + name, + protocol: candidate.protocol + }; +} + +export function modelMetadataForModels( + value: Record | undefined, + models: string[] +): Record | undefined { + const modelIds = new Set(models); + const entries = Object.entries(value ?? {}) + .map(([rawModel, metadata]) => [rawModel.trim(), metadata] as const) + .filter(([model, metadata]) => model && modelIds.has(model) && metadata && typeof metadata === "object"); + return entries.length > 0 ? Object.fromEntries(entries) : undefined; +} + +export function modelDisplayNamesForModels( + value: Record | undefined, + models: string[] +): Record | undefined { + const modelIds = new Set(models); + const entries = Object.entries(value ?? {}) + .map(([rawModel, rawDisplayName]) => [rawModel.trim(), rawDisplayName.trim()] as const) + .filter(([model, displayName]) => model && displayName && model !== displayName && modelIds.has(model)); + return entries.length > 0 ? Object.fromEntries(entries) : undefined; +} + +export function bearerAuthPlugin( + suffix: string, + token: string, + headers: Record = {}, + providerName = providerNamePlaceholder +): Record { + return { + auth: { + headers: { + authorization: `Bearer ${token}`, + ...headers + }, + removeHeaders: ["x-api-key"], + strict: true + }, + key: `ccr-local-agent-${providerNameSlugPlaceholder}-${suffix}`, + providerName + }; +} + +export function apiKeyAuthPlugin( + suffix: string, + apiKey: string, + providerName = providerNamePlaceholder +): Record { + return { + auth: { + headers: { + "x-api-key": apiKey + }, + removeHeaders: ["authorization"], + strict: true + }, + key: `ccr-local-agent-${providerNameSlugPlaceholder}-${suffix}`, + providerName + }; +} + +export function cloneProviderAccountConfig(account: ProviderAccountConfig | undefined): ProviderAccountConfig | undefined { + return account ? JSON.parse(JSON.stringify(account)) as ProviderAccountConfig : undefined; +} + +export function findOauthTokenSet(value: unknown, depth = 0): { accessToken?: string; refreshToken?: string } | undefined { + if (!isRecord(value) || depth > 5) { + return undefined; + } + const accessToken = + readString(value.accessToken) || + readString(value.access_token) || + readString(value.anthropicAccessToken); + const refreshToken = + readString(value.refreshToken) || + readString(value.refresh_token) || + readString(value.anthropicRefreshToken); + if (accessToken || refreshToken) { + return { accessToken, refreshToken }; + } + for (const child of Object.values(value)) { + const found = findOauthTokenSet(child, depth + 1); + if (found) { + return found; + } + } + return undefined; +} + +export function readJsonRecord(file: string): Record | undefined { + if (!existsSync(file)) { + return undefined; + } + try { + const parsed = JSON.parse(readFileSync(file, "utf8")) as unknown; + return isRecord(parsed) ? parsed : undefined; + } catch { + return undefined; + } +} + +export function uniqueProviderName(existingNames: string[], baseName: string): string { + const existing = new Set(existingNames.map((name) => name.trim().toLowerCase()).filter(Boolean)); + if (!existing.has(baseName.toLowerCase())) { + return baseName; + } + for (let index = 2; index < 1000; index += 1) { + const candidate = `${baseName} ${index}`; + if (!existing.has(candidate.toLowerCase())) { + return candidate; + } + } + return `${baseName} ${Date.now()}`; +} + +export function readString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +export function readBoolean(value: unknown): boolean | undefined { + return typeof value === "boolean" ? value : undefined; +} + +export function firstString(values: Array): string { + return values.find((value): value is string => Boolean(value)) ?? ""; +} + +export function uniqueStrings(values: Array): string[] { + const seen = new Set(); + const result: string[] = []; + for (const value of values) { + const item = value?.trim(); + if (!item || seen.has(item)) { + continue; + } + seen.add(item); + result.push(item); + } + return result; +} + +export function isLoopbackUrl(value: string): boolean { + try { + const hostname = new URL(value).hostname.toLowerCase(); + return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1" || hostname === "[::1]"; + } catch { + return false; + } +} + +export function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} diff --git a/packages/core/src/agents/local-providers/zcode.ts b/packages/core/src/agents/local-providers/zcode.ts new file mode 100644 index 0000000..f32f3c0 --- /dev/null +++ b/packages/core/src/agents/local-providers/zcode.ts @@ -0,0 +1,306 @@ +import os from "node:os"; +import path from "node:path"; +import type { + LocalAgentProviderCandidate, + LocalAgentProviderImportResult, + ProviderAccountConfig +} from "@ccr/core/contracts/app"; +import { findProviderPresetByBaseUrl } from "@ccr/core/providers/presets/index"; +import { + apiKeyAuthPlugin, + cloneProviderAccountConfig, + firstString, + isLoopbackUrl, + isRecord, + missingCandidate, + modelDisplayNamesForModels, + providerInternalNamePlaceholder, + providerPayload, + readJsonRecord, + readString, + uniqueProviderName, + uniqueStrings, + type ApiTokenSet +} from "@ccr/core/agents/local-providers/shared"; + +type ZcodeConfiguredProvider = { + apiKey: string; + baseUrl: string; + modelDisplayNames?: Record; + models: string[]; + name: string; + providerId: string; + sourceFile: string; +}; + +type LocalAgentModelCatalog = { + modelDisplayNames?: Record; + models: string[]; +}; + +const zcodeDefaultModels = ["GLM-5.2", "GLM-5-Turbo"]; +const zcodeDefaultBaseUrl = "https://zcode.z.ai/api/v1/zcode-plan/anthropic"; + +export function zcodeCandidate(): LocalAgentProviderCandidate { + const configuredProvider = readZcodeConfiguredProvider(); + const zcodeRuntime = readZcodeRuntime(); + const models = configuredProvider?.models.length + ? configuredProvider.models + : zcodeRuntime.models.length > 0 ? zcodeRuntime.models : zcodeDefaultModels; + const modelDisplayNames = configuredProvider?.models.length + ? configuredProvider.modelDisplayNames + : zcodeRuntime.modelDisplayNames; + if (configuredProvider) { + return { + detail: "ZCode provider API key detected in local ZCode config. Click Import to add it as a gateway provider.", + id: "zcode-api", + importable: true, + kind: "zcode", + modelDisplayNames, + models, + name: "ZCode API", + protocol: "anthropic_messages", + sourceFile: configuredProvider.sourceFile, + status: "available" + }; + } + + const credentials = readZcodeSharedLogin(); + if (credentials?.hasSharedLogin) { + return { + detail: "ZCode login was detected, but no usable provider API key was found in ZCode config.", + id: "zcode-api", + importable: false, + kind: "zcode", + modelDisplayNames, + models, + name: "ZCode API", + protocol: "anthropic_messages", + sourceFile: credentials.sourceFile, + status: "locked" + }; + } + return missingCandidate("zcode", "zcode-api", "ZCode API", "anthropic_messages", models, modelDisplayNames); +} + +export function importZcodeProvider(candidate: LocalAgentProviderCandidate, providerNames: string[]): LocalAgentProviderImportResult { + const configuredProvider = readZcodeConfiguredProvider(); + if (!configuredProvider) { + throw new Error("ZCode provider API key was not found in ZCode config."); + } + const provider = providerPayload( + { + ...candidate, + modelDisplayNames: configuredProvider.models.length > 0 ? configuredProvider.modelDisplayNames : candidate.modelDisplayNames, + models: configuredProvider.models.length > 0 ? configuredProvider.models : candidate.models + }, + uniqueProviderName(providerNames, "ZCode API"), + configuredProvider.baseUrl, + zcodeProviderAccountConfig(configuredProvider.baseUrl) + ); + return { + candidate, + provider, + providerPlugins: [ + apiKeyAuthPlugin("zcode-api-key", configuredProvider.apiKey), + apiKeyAuthPlugin("zcode-api-key-internal", configuredProvider.apiKey, providerInternalNamePlaceholder) + ] + }; +} + +function zcodeProviderAccountConfig(baseUrl: string): ProviderAccountConfig | undefined { + return cloneProviderAccountConfig(findProviderPresetByBaseUrl(baseUrl)?.account); +} + +function readZcodeSharedLogin(): ApiTokenSet | undefined { + for (const sourceFile of zcodeCredentialFiles()) { + const record = readJsonRecord(sourceFile); + if (!record) { + continue; + } + const rawToken = + readString(record.zcodejwttoken) || + readString(record["oauth:zai:access_token"]) || + readString(record["oauth:zai:refresh_token"]) || + readString(record["oauth:bigmodel:access_token"]) || + readString(record["oauth:bigmodel:refresh_token"]) || + readString(record["oauth:active_provider"]) || + readString(record.access_token) || + readString(record.accessToken); + if (rawToken) { + return { + sourceFile, + hasSharedLogin: true + }; + } + } + return undefined; +} + +function readZcodeConfiguredProvider(): ZcodeConfiguredProvider | undefined { + const candidates = zcodeConfigFiles() + .flatMap((sourceFile) => readZcodeConfiguredProviders(sourceFile)); + return candidates.find((provider) => provider.apiKey.trim() && provider.baseUrl.trim()); +} + +function readZcodeConfiguredProviders(sourceFile: string): ZcodeConfiguredProvider[] { + const record = readJsonRecord(sourceFile); + const providers = isRecord(record?.provider) ? record.provider : undefined; + if (!providers) { + return []; + } + + return Object.entries(providers) + .flatMap(([providerId, value]) => { + if (!isRecord(value) || !isZcodeModelProvider(providerId, value)) { + return []; + } + const options = isRecord(value.options) ? value.options : {}; + const apiKey = readString(options.apiKey) || readString(options.api_key) || readString(value.apiKey) || readString(value.api_key); + const baseUrl = + readString(options.baseURL) || + readString(options.baseUrl) || + readString(isRecord(value.endpoints) ? value.endpoints.baseURL : undefined) || + readString(isRecord(value.endpoints) ? value.endpoints.baseUrl : undefined); + if (!apiKey || !baseUrl) { + return []; + } + return [{ + apiKey, + baseUrl, + ...zcodeProviderModelCatalog(value), + name: readString(value.name) || providerId, + providerId, + sourceFile + }]; + }); +} + +function readZcodeRuntime(): { baseUrl: string } & LocalAgentModelCatalog { + const cache = readJsonRecord(path.join(os.homedir(), ".zcode", "v2", "bots-model-cache.v2.json")); + const providers = Array.isArray(cache?.providers) + ? cache.providers.filter((provider): provider is Record => isRecord(provider)) + : []; + const provider = providers.find((item) => { + const text = [ + readString(item.id), + readString(item.name), + readString(isRecord(item.endpoints) ? item.endpoints.baseURL : undefined) + ].join(" ").toLowerCase(); + return text.includes("zcode") || text.includes("z.ai") || text.includes("bigmodel"); + }); + const baseUrl = readString(isRecord(provider?.endpoints) ? provider?.endpoints.baseURL : undefined) || zcodeDefaultBaseUrl; + const catalog = zcodeProviderModelCatalog(provider ?? {}); + const models = uniqueStrings([...catalog.models, ...zcodeDefaultModels]); + return { + baseUrl, + modelDisplayNames: modelDisplayNamesForModels(catalog.modelDisplayNames, models), + models + }; +} + +function zcodeProviderModelCatalog(provider: Record): LocalAgentModelCatalog { + const models: string[] = []; + const modelDisplayNames: Record = {}; + if (Array.isArray(provider.models)) { + for (const item of provider.models) { + const model = isRecord(item) + ? readString(item.id) || readString(item.name) + : readString(item); + if (!model) { + continue; + } + models.push(model); + if (isRecord(item)) { + const displayName = readString(item.displayName) || readString(item.display_name) || readString(item.label) || readString(item.name); + if (displayName && displayName !== model) { + modelDisplayNames[model] = displayName; + } + } + } + const uniqueModels = uniqueStrings(models); + return { + modelDisplayNames: modelDisplayNamesForModels(modelDisplayNames, uniqueModels), + models: uniqueModels + }; + } + if (isRecord(provider.models)) { + for (const [key, value] of Object.entries(provider.models)) { + const model = isRecord(value) ? readString(value.id) || key : key; + if (!model) { + continue; + } + models.push(model); + if (isRecord(value)) { + const displayName = readString(value.displayName) || readString(value.display_name) || readString(value.label) || readString(value.name); + if (displayName && displayName !== model) { + modelDisplayNames[model] = displayName; + } + } + } + const uniqueModels = uniqueStrings(models); + return { + modelDisplayNames: modelDisplayNamesForModels(modelDisplayNames, uniqueModels), + models: uniqueModels + }; + } + return { + models: [] + }; +} + +function isZcodeModelProvider(providerId: string, provider: Record): boolean { + if (provider.enabled === false || readString(provider.systemDisabledReason)) { + return false; + } + + const options = isRecord(provider.options) ? provider.options : {}; + const endpoints = isRecord(provider.endpoints) ? provider.endpoints : {}; + const baseUrl = firstString([ + readString(options.baseURL), + readString(options.baseUrl), + readString(endpoints.baseURL), + readString(endpoints.baseUrl) + ]); + const baseUrlText = baseUrl.toLowerCase(); + if (isLoopbackUrl(baseUrl)) { + return false; + } + + const text = [ + providerId, + readString(provider.name), + baseUrlText + ].join(" ").toLowerCase(); + const matchesZcodeProvider = + text.includes("z.ai") || + text.includes("zai") || + text.includes("zcode") || + text.includes("bigmodel") || + text.includes("open.bigmodel.cn"); + if (!matchesZcodeProvider || text.includes("claude-code-router")) { + return false; + } + + const kind = [ + readString(provider.kind), + readString(provider.apiFormat), + readString(provider.defaultKind), + readString(isRecord(endpoints.paths) ? endpoints.paths.anthropic : undefined) + ].join(" ").toLowerCase(); + return kind.includes("anthropic") || baseUrlText.includes("/anthropic"); +} + +function zcodeCredentialFiles(): string[] { + return uniqueStrings([ + path.join(os.homedir(), ".zcode", "v2", "credentials.json"), + path.join(os.homedir(), ".zcode", "credentials.json") + ]); +} + +function zcodeConfigFiles(): string[] { + return uniqueStrings([ + path.join(os.homedir(), ".zcode", "v2", "config.json"), + path.join(os.homedir(), ".zcode", "cli", "config.json") + ]); +} diff --git a/packages/core/src/agents/zcode/profile-config.ts b/packages/core/src/agents/zcode/profile-config.ts new file mode 100644 index 0000000..c8ebb35 --- /dev/null +++ b/packages/core/src/agents/zcode/profile-config.ts @@ -0,0 +1,331 @@ +import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import type { AppConfig, ProfileConfig } from "@ccr/core/contracts/app"; +import { normalizeRouteSelector } from "@ccr/core/gateway/claude-code-router-plugin"; +import { buildCodexModelCatalogIds } from "@ccr/core/agents/codex/model-catalog"; + +export type ZcodeProfileConfigWriteResult = { + backupFile?: string; + changed: boolean; + file: string; + files?: string[]; +}; + +type ZcodeGatewayConfigValues = { + baseUrl: string; + model: string; + providerId: string; + providerName: string; + token: string; + models: string[]; +}; + +const legacyZcodeTomlConfigFile = "~/.zcode/config.toml"; +const defaultZcodeConfigFile = "~/.zcode/cli/config.json"; +const originalBackupSuffix = ".ccr-original"; +const originalMissingSuffix = ".ccr-original-missing"; + +export function resolveZcodeConfigFile(profile: Pick): string { + const configured = profile.configFile?.trim(); + if (configured && !isLegacyZcodeTomlConfigFile(configured)) { + return resolveUserPath(configured); + } + const zcodeHome = profile.codexHome?.trim() || "~/.zcode"; + return path.join(resolveUserPath(zcodeHome), "cli", "config.json"); +} + +export function zcodeHomeFromConfigFile(configFile: string): string { + const dir = path.dirname(configFile); + return path.basename(configFile) === "config.json" && path.basename(dir) === "cli" + ? path.dirname(dir) + : dir; +} + +export function writeZcodeGatewayConfig( + config: AppConfig, + profile: ProfileConfig, + token: string, + options: { backup?: boolean } = {} +): ZcodeProfileConfigWriteResult { + const file = resolveZcodeConfigFile(profile); + const model = normalizeClientModel(profile.model) || defaultClientModel(config); + const providerId = sanitizeZcodeProviderId(profile.providerId || "") || "claude-code-router"; + const values: ZcodeGatewayConfigValues = { + baseUrl: gatewayEndpoint(config), + model, + models: buildCodexModelCatalogIds(config, model), + providerId, + providerName: profile.providerName?.trim() || "Claude Code Router", + token + }; + const cliResult = writeJsonFile(file, buildZcodeGatewayConfig(readJsonObject(file), values), options); + const storageRoot = zcodeHomeFromConfigFile(file); + const v2ConfigFile = path.join(storageRoot, "v2", "config.json"); + const v2ConfigResult = writeJsonFile(v2ConfigFile, buildZcodeV2Config(readJsonObject(v2ConfigFile), values), options); + const v2CacheFile = path.join(storageRoot, "v2", "bots-model-cache.v2.json"); + const v2CacheResult = writeJsonFile(v2CacheFile, buildZcodeV2ModelCache(readJsonObject(v2CacheFile), values), options); + return { + backupFile: cliResult.backupFile ?? v2ConfigResult.backupFile ?? v2CacheResult.backupFile, + changed: cliResult.changed || v2ConfigResult.changed || v2CacheResult.changed, + file, + files: [cliResult.file, v2ConfigResult.file, v2CacheResult.file] + }; +} + +function buildZcodeGatewayConfig(source: Record, values: ZcodeGatewayConfigValues): Record { + const providers = isRecord(source.provider) ? { ...source.provider } : {}; + const modelRef = `${values.providerId}/${values.model}`; + providers[values.providerId] = zcodeConfigProvider(values); + + return { + ...source, + $schema: typeof source.$schema === "string" && source.$schema.trim() ? source.$schema : "https://opencode.ai/config.json", + model: { + ...(isRecord(source.model) ? source.model : {}), + main: modelRef + }, + provider: providers + }; +} + +function buildZcodeV2Config(source: Record, values: ZcodeGatewayConfigValues): Record { + const providers = isRecord(source.provider) ? { ...source.provider } : {}; + const modelRef = `${values.providerId}/${values.model}`; + providers[values.providerId] = { + ...zcodeConfigProvider(values), + enabled: true, + source: "custom" + }; + return { + ...source, + $schema: typeof source.$schema === "string" && source.$schema.trim() ? source.$schema : "https://opencode.ai/config.json", + model: { + ...(isRecord(source.model) ? source.model : {}), + main: modelRef + }, + provider: providers + }; +} + +function zcodeConfigProvider(values: ZcodeGatewayConfigValues): Record { + return { + kind: "anthropic", + name: values.providerName, + options: { + apiKey: values.token, + apiKeyRequired: true, + baseURL: values.baseUrl + }, + models: Object.fromEntries(uniqueStrings(values.models).map((model) => [model, zcodeModelConfig(model)])) + }; +} + +function buildZcodeV2ModelCache(source: Record, values: ZcodeGatewayConfigValues): Record { + const providers = Array.isArray(source.providers) ? source.providers.filter((provider) => { + return !isRecord(provider) || provider.id !== values.providerId; + }) : []; + const previousProvider = Array.isArray(source.providers) + ? source.providers.find((provider) => isRecord(provider) && provider.id === values.providerId) + : undefined; + const now = Date.now(); + const modelRef = zcodeProtocolModelRef(values); + return { + ...source, + defaultModel: modelRef, + lastUsed: modelRef, + lastUsedModel: modelRef, + providers: [ + ...providers, + zcodeV2ModelCacheProvider(values, isRecord(previousProvider) ? previousProvider : undefined, now) + ], + revision: zcodeV2CacheRevision(source), + updatedAt: now, + version: typeof source.version === "number" ? source.version : 2 + }; +} + +function zcodeModelConfig(model: string): Record { + return { + id: model, + name: model, + limit: { + context: 128_000, + output: 8_192 + }, + modalities: { + input: ["text", "image"], + output: ["text"] + }, + structured_output: true, + supportsImages: true, + supportsStructuredOutput: true, + supportsToolCall: true, + tool_call: true + }; +} + +function zcodeV2ModelCacheProvider( + values: ZcodeGatewayConfigValues, + previousProvider: Record | undefined, + now: number +): Record { + return { + id: values.providerId, + name: values.providerName, + enabled: true, + endpoints: { + baseURL: values.baseUrl, + paths: { + anthropic: "/v1/messages" + } + }, + apiFormat: "anthropic-messages", + source: "custom", + apiKey: "__zcode_cached_api_key_present__", + apiKeyRequired: true, + defaultKind: "anthropic", + models: uniqueStrings(values.models).map((model) => zcodeV2ModelCacheModel(model)), + createdAt: positiveNumber(previousProvider?.createdAt) ?? now, + updatedAt: now + }; +} + +function zcodeV2ModelCacheModel(model: string): Record { + return { + id: model, + name: model, + kinds: ["anthropic"], + defaultKind: "anthropic", + modalities: { + input: ["text", "image"], + output: ["text"] + }, + contextWindow: 128_000, + maxOutputTokens: 8_192, + supportsStructuredOutput: true, + supportsTools: true + }; +} + +function zcodeProtocolModelRef(values: ZcodeGatewayConfigValues): Record { + return { + providerId: values.providerId, + modelId: values.model + }; +} + +function zcodeV2CacheRevision(source: Record): number { + const revision = typeof source.revision === "number" && Number.isFinite(source.revision) + ? Math.floor(source.revision) + : 0; + return Math.max(0, revision) + 1; +} + +function writeJsonFile(file: string, value: Record, options: { backup?: boolean }): ZcodeProfileConfigWriteResult { + const content = `${JSON.stringify(value, null, 2)}\n`; + mkdirSync(path.dirname(file), { recursive: true }); + const previous = existsSync(file) ? readFileSync(file, "utf8") : undefined; + if (previous === content) { + return { changed: false, file }; + } + if (options.backup !== false) { + ensureOriginalSnapshot(file, previous); + } + const backupFile = options.backup === false || previous === undefined ? undefined : backupFilePath(file); + if (backupFile) { + copyFileSync(file, backupFile); + } + writeFileSync(file, content, "utf8"); + return { backupFile, changed: true, file }; +} + +function readJsonObject(file: string): Record { + if (!existsSync(file)) { + return {}; + } + try { + const parsed = JSON.parse(readFileSync(file, "utf8")) as unknown; + return isRecord(parsed) ? parsed : {}; + } catch { + return {}; + } +} + +function backupFilePath(file: string): string { + const timestamp = new Date().toISOString().replace(/[:.]/g, "-"); + return `${file}.ccr-backup-${timestamp}`; +} + +function ensureOriginalSnapshot(file: string, previous: string | undefined): void { + const originalBackup = `${file}${originalBackupSuffix}`; + const originalMissing = `${file}${originalMissingSuffix}`; + if (existsSync(originalBackup) || existsSync(originalMissing)) { + return; + } + if (previous === undefined) { + writeFileSync(originalMissing, "", "utf8"); + return; + } + copyFileSync(file, originalBackup); +} + +function isLegacyZcodeTomlConfigFile(value: string): boolean { + return value === legacyZcodeTomlConfigFile || + resolveUserPath(value) === path.join(os.homedir(), ".zcode", "config.toml"); +} + +function gatewayEndpoint(config: AppConfig): string { + const host = config.gateway.host === "0.0.0.0" ? "127.0.0.1" : config.gateway.host || "127.0.0.1"; + const formattedHost = host.includes(":") && !host.startsWith("[") ? `[${host}]` : host; + return `http://${formattedHost}:${config.gateway.port}`; +} + +function defaultClientModel(config: AppConfig): string { + const preferred = config.Providers.find((provider) => provider.name === config.preferredProvider) ?? config.Providers[0]; + if (preferred?.name && preferred.models[0]) { + return `${preferred.name}/${preferred.models[0]}`; + } + return "gpt-5-codex"; +} + +function normalizeClientModel(value: string | undefined): string { + return normalizeRouteSelector(value)?.trim() || ""; +} + +function sanitizeZcodeProviderId(value: string): string { + return value.trim().replace(/[^a-zA-Z0-9_.-]+/g, "-").replace(/^-+|-+$/g, ""); +} + +function uniqueStrings(values: string[]): string[] { + const seen = new Set(); + const output: string[] = []; + for (const value of values) { + const normalized = value.trim(); + if (!normalized || seen.has(normalized)) { + continue; + } + seen.add(normalized); + output.push(normalized); + } + return output; +} + +function positiveNumber(value: unknown): number | undefined { + return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : undefined; +} + +function resolveUserPath(value: string): string { + const trimmed = value.trim(); + if (trimmed === "~") { + return os.homedir(); + } + if (trimmed.startsWith("~/") || trimmed.startsWith("~\\")) { + return path.join(os.homedir(), trimmed.slice(2)); + } + return path.resolve(trimmed || "."); +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} diff --git a/packages/core/src/config/api-key-store.ts b/packages/core/src/config/api-key-store.ts new file mode 100644 index 0000000..76fca9c --- /dev/null +++ b/packages/core/src/config/api-key-store.ts @@ -0,0 +1,327 @@ +import { chmodSync, existsSync, mkdirSync } from "node:fs"; +import { dirname } from "node:path"; +import { API_KEYS_DB_FILE, LEGACY_API_KEYS_DB_FILES } from "@ccr/core/config/constants"; +import { createBetterSqliteDatabase, type BetterSqliteDatabase } from "@ccr/core/storage/sqlite-native"; +import type { ApiKeyConfig, ApiKeyLimitConfig } from "@ccr/core/contracts/app"; + +type SqlDatabase = BetterSqliteDatabase; +type SqlValue = bigint | Buffer | number | string | null; + +type StoredApiKeyRow = { + createdAt: string; + encryption: string; + expiresAt: string; + id: string; + limitsJson: string; + name: string; + storedKey: string; +}; + +const plainStorage = "plain"; +const privateDirMode = 0o700; +const privateFileMode = 0o600; + +class ApiKeyStore { + private database?: SqlDatabase; + private initPromise?: Promise; + + constructor(private readonly dbFile: string) {} + + async list(): Promise { + const database = await this.getDatabase(); + const rows = queryRows( + database, + ` + SELECT + id, + name, + encrypted_key, + encryption, + created_at, + expires_at, + limits_json + FROM api_keys + ORDER BY rowid + ` + ); + + return uniqueApiKeyConfigs(rows.map(toApiKeyConfig)); + } + + async replace(apiKeys: ApiKeyConfig[]): Promise { + const normalized = uniqueApiKeyConfigs(apiKeys); + const database = await this.getDatabase(); + const statement = database.prepare(` + INSERT INTO api_keys ( + id, + name, + encrypted_key, + encryption, + created_at, + expires_at, + limits_json + ) VALUES (?, ?, ?, ?, ?, ?, ?) + `); + + try { + database.exec("BEGIN TRANSACTION"); + database.exec("DELETE FROM api_keys"); + for (const apiKey of normalized) { + const stored = storeApiKey(apiKey.key); + statement.run( + apiKey.id, + apiKey.name ?? "", + stored.value, + stored.encryption, + apiKey.createdAt, + apiKey.expiresAt ?? "", + apiKey.limits ? JSON.stringify(apiKey.limits) : "" + ); + } + database.exec("COMMIT"); + secureDatabaseFilePermissions(this.dbFile); + return normalized; + } catch (error) { + try { + database.exec("ROLLBACK"); + } catch { + // Ignore rollback errors; the original write error is more useful. + } + secureDatabaseFilePermissions(this.dbFile); + throw error; + } + } + + private async getDatabase(): Promise { + if (this.database) { + return this.database; + } + + this.initPromise ??= this.open(); + return this.initPromise; + } + + private async open(): Promise { + const dbDir = dirname(this.dbFile); + mkdirSync(dbDir, { mode: privateDirMode, recursive: true }); + securePathPermissions(dbDir, privateDirMode); + const database = createBetterSqliteDatabase(this.dbFile); + configureSqliteDatabase(database); + + database.exec(` + CREATE TABLE IF NOT EXISTS api_keys ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL DEFAULT '', + encrypted_key TEXT NOT NULL, + encryption TEXT NOT NULL DEFAULT '${plainStorage}', + created_at TEXT NOT NULL, + expires_at TEXT NOT NULL DEFAULT '', + limits_json TEXT NOT NULL DEFAULT '' + ); + CREATE INDEX IF NOT EXISTS api_keys_created_at_idx ON api_keys(created_at); + `); + + this.database = database; + secureDatabaseFilePermissions(this.dbFile); + return database; + } +} + +export const apiKeyStore = new ApiKeyStore(API_KEYS_DB_FILE); + +export async function loadPersistedApiKeys(): Promise { + if (!existsSync(API_KEYS_DB_FILE)) { + const legacyApiKeys = await readLegacyApiKeys(); + if (legacyApiKeys.length > 0) { + return legacyApiKeys; + } + } + return apiKeyStore.list(); +} + +export async function replacePersistedApiKeys(apiKeys: ApiKeyConfig[]): Promise { + return apiKeyStore.replace(apiKeys); +} + +async function readLegacyApiKeys(): Promise { + for (const dbFile of LEGACY_API_KEYS_DB_FILES) { + if (!existsSync(dbFile) || samePath(dbFile, API_KEYS_DB_FILE)) { + continue; + } + try { + const store = new ApiKeyStore(dbFile); + const apiKeys = await store.list(); + if (apiKeys.length > 0) { + return apiKeys; + } + } catch (error) { + console.warn(`[config] Failed to read legacy API key database ${dbFile}: ${formatError(error)}`); + } + } + return []; +} + +function toApiKeyConfig(row: Record): ApiKeyConfig | undefined { + const stored = toStoredApiKeyRow(row); + if (!stored) { + return undefined; + } + + const key = readStoredApiKey(stored.storedKey, stored.encryption); + if (!key) { + return undefined; + } + + const limits = parseApiKeyLimits(stored.limitsJson); + return { + createdAt: stored.createdAt, + ...(stored.expiresAt ? { expiresAt: stored.expiresAt } : {}), + id: stored.id, + key, + ...(limits ? { limits } : {}), + ...(stored.name ? { name: stored.name } : {}) + }; +} + +function toStoredApiKeyRow(row: Record): StoredApiKeyRow | undefined { + const id = readString(row.id); + const storedKey = readString(row.encrypted_key); + const createdAt = readString(row.created_at) || new Date(0).toISOString(); + if (!id || !storedKey) { + return undefined; + } + + return { + createdAt, + encryption: readString(row.encryption) || plainStorage, + expiresAt: readString(row.expires_at) || "", + id, + limitsJson: readString(row.limits_json) || "", + name: readString(row.name) || "", + storedKey + }; +} + +function storeApiKey(key: string): { encryption: string; value: string } { + return { + encryption: plainStorage, + value: key + }; +} + +function readStoredApiKey(value: string, encryption: string): string | undefined { + if (encryption !== plainStorage) { + console.warn(`[api-keys] Stored API key uses unsupported storage "${encryption}". Re-save the API key to migrate it.`); + return undefined; + } + return value.trim() || undefined; +} + +function secureDatabaseFilePermissions(file: string): void { + securePathPermissions(file, privateFileMode); + securePathPermissions(`${file}-wal`, privateFileMode); + securePathPermissions(`${file}-shm`, privateFileMode); +} + +function securePathPermissions(file: string, mode: number): void { + if (process.platform === "win32") { + return; + } + if (!existsSync(file)) { + return; + } + try { + chmodSync(file, mode); + } catch { + // Best effort for filesystems that do not support chmod. + } +} + +function parseApiKeyLimits(value: string): ApiKeyLimitConfig | undefined { + if (!value) { + return undefined; + } + + try { + const parsed = JSON.parse(value) as unknown; + if (!isObject(parsed)) { + return undefined; + } + const limits: ApiKeyLimitConfig = {}; + for (const key of ["ipd", "iph", "ipm", "maxRequests", "maxTokens", "quotaWindowMs", "rpd", "rph", "rpm", "tpd", "tph", "tpm", "windowMs"] as const) { + const limit = readPositiveInteger(parsed[key]); + if (limit) { + limits[key] = limit; + } + } + return Object.keys(limits).length ? limits : undefined; + } catch { + return undefined; + } +} + +function configureSqliteDatabase(database: SqlDatabase): void { + database.pragma("journal_mode = WAL"); + database.pragma("synchronous = NORMAL"); + database.pragma("busy_timeout = 5000"); +} + +function queryRows(database: SqlDatabase, sql: string, params: SqlValue[] = []): Array> { + return database.prepare(sql).all(...params) as Array>; +} + +function uniqueApiKeyConfigs(values: Array): ApiKeyConfig[] { + const seenKeys = new Set(); + const seenIds = new Set(); + const result: ApiKeyConfig[] = []; + for (const [index, value] of values.entries()) { + const key = value?.key.trim(); + if (!value || !key || seenKeys.has(key)) { + continue; + } + seenKeys.add(key); + const id = uniqueApiKeyId(value.id || `key-${index + 1}`, seenIds, index); + result.push({ + createdAt: value.createdAt || new Date(0).toISOString(), + ...(value.expiresAt ? { expiresAt: value.expiresAt } : {}), + id, + key, + ...(value.limits ? { limits: value.limits } : {}), + ...(value.name ? { name: value.name } : {}) + }); + } + return result; +} + +function uniqueApiKeyId(id: string, seenIds: Set, index: number): string { + const base = id.trim() || `key-${index + 1}`; + let candidate = base; + let suffix = 2; + while (seenIds.has(candidate)) { + candidate = `${base}-${suffix}`; + suffix += 1; + } + seenIds.add(candidate); + return candidate; +} + +function readPositiveInteger(value: unknown): number | undefined { + const number = Number(value); + return Number.isFinite(number) && number > 0 ? Math.ceil(number) : undefined; +} + +function readString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function samePath(left: string, right: string): boolean { + return left.toLowerCase() === right.toLowerCase(); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + +function isObject(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} diff --git a/packages/core/src/config/app-config-store.ts b/packages/core/src/config/app-config-store.ts new file mode 100644 index 0000000..13e1209 --- /dev/null +++ b/packages/core/src/config/app-config-store.ts @@ -0,0 +1,164 @@ +import { chmodSync, existsSync, mkdirSync } from "node:fs"; +import { dirname } from "node:path"; +import { APP_CONFIG_DB_FILE, LEGACY_APP_CONFIG_DB_FILES } from "@ccr/core/config/constants"; +import { createBetterSqliteDatabase, type BetterSqliteDatabase } from "@ccr/core/storage/sqlite-native"; + +type SqlDatabase = BetterSqliteDatabase; +type SqlValue = bigint | Buffer | number | string | null; + +const appConfigKey = "default"; +const privateDirMode = 0o700; +const privateFileMode = 0o600; + +class AppConfigStore { + private database?: SqlDatabase; + private initPromise?: Promise; + + constructor(private readonly dbFile: string) {} + + async read(): Promise { + return this.readKey(appConfigKey); + } + + async readKey(key: string): Promise { + const database = await this.getDatabase(); + const row = queryRows(database, "SELECT value_json FROM app_config WHERE key = ? LIMIT 1", [key])[0]; + const valueJson = readString(row?.value_json); + if (!valueJson) { + return undefined; + } + return JSON.parse(valueJson) as unknown; + } + + async replace(value: unknown): Promise { + await this.replaceKey(appConfigKey, value); + } + + async replaceKey(key: string, value: unknown): Promise { + const database = await this.getDatabase(); + database.prepare(` + INSERT INTO app_config (key, value_json, updated_at) + VALUES (?, ?, ?) + ON CONFLICT(key) DO UPDATE SET + value_json = excluded.value_json, + updated_at = excluded.updated_at + `).run(key, JSON.stringify(value), new Date().toISOString()); + secureDatabaseFilePermissions(this.dbFile); + } + + private async getDatabase(): Promise { + if (this.database) { + return this.database; + } + + this.initPromise ??= this.open(); + return this.initPromise; + } + + private async open(): Promise { + const dbDir = dirname(this.dbFile); + mkdirSync(dbDir, { mode: privateDirMode, recursive: true }); + securePathPermissions(dbDir, privateDirMode); + const database = createBetterSqliteDatabase(this.dbFile); + configureSqliteDatabase(database); + + database.exec(` + CREATE TABLE IF NOT EXISTS app_config ( + key TEXT PRIMARY KEY, + value_json TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + `); + + this.database = database; + secureDatabaseFilePermissions(this.dbFile); + return database; + } +} + +export const appConfigStore = new AppConfigStore(APP_CONFIG_DB_FILE); + +export async function loadPersistedAppConfig(): Promise { + if (!existsSync(APP_CONFIG_DB_FILE)) { + const legacyValue = await readLegacyAppConfigKey(appConfigKey); + if (legacyValue !== undefined) { + return legacyValue; + } + } + return appConfigStore.read(); +} + +export async function loadPersistedAppSetting(key: string): Promise { + if (!existsSync(APP_CONFIG_DB_FILE)) { + const legacyValue = await readLegacyAppConfigKey(key); + if (legacyValue !== undefined) { + return legacyValue; + } + } + return appConfigStore.readKey(key); +} + +export async function replacePersistedAppConfig(value: unknown): Promise { + await appConfigStore.replace(value); +} + +export async function replacePersistedAppSetting(key: string, value: unknown): Promise { + await appConfigStore.replaceKey(key, value); +} + +async function readLegacyAppConfigKey(key: string): Promise { + for (const dbFile of LEGACY_APP_CONFIG_DB_FILES) { + if (!existsSync(dbFile) || samePath(dbFile, APP_CONFIG_DB_FILE)) { + continue; + } + try { + const store = new AppConfigStore(dbFile); + const value = await store.readKey(key); + if (value !== undefined) { + return value; + } + } catch (error) { + console.warn(`[config] Failed to read legacy app config database ${dbFile}: ${formatError(error)}`); + } + } + return undefined; +} + +function configureSqliteDatabase(database: SqlDatabase): void { + database.pragma("journal_mode = WAL"); + database.pragma("synchronous = NORMAL"); + database.pragma("busy_timeout = 5000"); +} + +function queryRows(database: SqlDatabase, sql: string, params: SqlValue[] = []): Array> { + return database.prepare(sql).all(...params) as Array>; +} + +function readString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function secureDatabaseFilePermissions(file: string): void { + securePathPermissions(file, privateFileMode); + securePathPermissions(`${file}-wal`, privateFileMode); + securePathPermissions(`${file}-shm`, privateFileMode); +} + +function securePathPermissions(file: string, mode: number): void { + if (process.platform === "win32" || !existsSync(file)) { + return; + } + try { + chmodSync(file, mode); + } catch { + // Best effort for filesystems that do not support chmod. + } +} + +function samePath(left: string, right: string): boolean { + return left.toLowerCase() === right.toLowerCase(); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/core/src/config/config.ts b/packages/core/src/config/config.ts new file mode 100644 index 0000000..4e93f9c --- /dev/null +++ b/packages/core/src/config/config.ts @@ -0,0 +1,2729 @@ +import { createHash, randomBytes } from "node:crypto"; +import { existsSync, readFileSync } from "node:fs"; +import { loadPersistedAppConfig, replacePersistedAppConfig } from "@ccr/core/config/app-config-store"; +import { loadPersistedApiKeys, replacePersistedApiKeys } from "@ccr/core/config/api-key-store"; +import { CONFIG_FILE, GATEWAY_CONFIG_FILE, LEGACY_CONFIG_FILE, LEGACY_WINDOWS_CONFIG_FILE } from "@ccr/core/config/constants"; +import { normalizeCodexProviderAccountConfig } from "@ccr/core/agents/local-providers/codex"; +import { CLAUDE_CODE_DEFAULT_ENV, CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV, DEFAULT_OVERVIEW_WIDGETS, DEFAULT_TRAY_COMPONENT_VARIANTS, DEFAULT_TRAY_WIDGETS, DEFAULT_TRAY_WINDOW_MODULES, OVERVIEW_WIDGET_SIZE_VALUES, ROUTER_FALLBACK_MAX_RETRY_COUNT, TRAY_SINGLETON_WIDGET_TYPES, TRAY_TOP_WIDGET_TYPES, TRAY_WINDOW_MODULE_IDS, enforceSingleEnabledGlobalProfilePerAgent } from "@ccr/core/contracts/app"; +import { createDefaultAppConfig } from "@ccr/core/config/default-config"; +import { findProviderPresetByBaseUrl, providerApiKeySafetyIssue, providerEndpointCanReceiveProviderApiKey } from "@ccr/core/providers/presets/index"; +import type { + AppConfig, + ApiKeyConfig, + ApiKeyLimitConfig, + BotGatewayRuntimeConfig, + BotGatewaySavedConfig, + ClaudeCodeProfileConfig, + CodexProfileConfig, + GatewayAgentConfig, + GatewayMcpServerConfig, + GatewayMcpServerTransport, + GatewayPluginConfig, + GatewayPluginAppConfig, + GatewayPluginProxyRouteConfig, + GatewayProviderCapability, + GatewayProviderConfig, + GatewayProviderProtocol, + ObservabilityConfig, + OverviewMetricKind, + OverviewWidgetConfig, + OverviewWidgetSize, + OverviewWidgetType, + OverviewWidgetVariant, + ProviderAccountConfig, + ProviderAccountConnectorConfig, + ProviderCredentialConfig, + ProviderModelMetadata, + ProviderReasoningLevel, + ProfileConfig, + ProfileRuntimeConfig, + ProxyRouteTarget, + ProxyRuntimeConfig, + RouterBuiltInRulesConfig, + RouterConfig, + RouterFallbackConfig, + RouterFallbackMode, + RouterRule, + RouterRuleCondition, + RouterRuleOperator, + RouterRuleRewrite, + RouterRuleRewriteOperation, + RouterRuleType, + TrayBalanceProgressConfig, + TrayComponentVariants, + TrayIconPreference, + ToolHubConfig, + TrayWidgetConfig, + TrayWidgetType, + TrayWidgetVariant, + TrayWindowModuleId +} from "@ccr/core/contracts/app"; + +type LoadedProfileConfig = Partial> & { + claudeCode?: Partial; + codex?: Partial; + profiles?: ProfileConfig[]; +}; + +type LoadedBotGatewayConfig = Partial> & { + handoff?: Partial; +}; + +type LoadedAppConfig = Partial> & { + Router?: Partial; + agent?: Partial; + botConfigs?: BotGatewaySavedConfig[]; + botGateway?: LoadedBotGatewayConfig; + gateway?: Partial; + observability?: Partial; + profile?: LoadedProfileConfig; + proxy?: Partial; + toolHub?: Partial; +}; + +export type RawAppConfigSource = "default" | "legacy-json" | "sqlite"; + +type RawAppConfigLoadResult = { + source: RawAppConfigSource; + value: Partial; +}; + +const REMOVED_LEGACY_ROUTER_RULE_IDS = new Set([ + "legacy-subagent", + "legacy-background", + "legacy-thinking", + "legacy-web-search", + "legacy-image" +]); +const INTERNAL_GATEWAY_CORE_HOST = "127.0.0.1"; +const GENERATED_GATEWAY_API_KEY_ID = "local-gateway"; + +const DEFAULT_CONFIG: AppConfig = createDefaultAppConfig({ + coreHost: INTERNAL_GATEWAY_CORE_HOST, + generatedConfigFile: GATEWAY_CONFIG_FILE +}); + +function completeBotGatewayConfig(config: LoadedBotGatewayConfig | undefined): BotGatewayRuntimeConfig { + const platform = normalizeBotGatewayPlatform(config?.platform ?? DEFAULT_CONFIG.botGateway.platform); + return { + ...DEFAULT_CONFIG.botGateway, + ...(config ?? {}), + authType: normalizeBotGatewayAuthType(platform, config?.authType ?? DEFAULT_CONFIG.botGateway.authType), + credentials: sanitizeBotGatewayRecord(config?.credentials ?? DEFAULT_CONFIG.botGateway.credentials), + handoff: { + ...DEFAULT_CONFIG.botGateway.handoff, + ...(config?.handoff ?? {}) + }, + integrationConfig: websocketBotGatewayIntegrationConfig(platform, config?.integrationConfig ?? DEFAULT_CONFIG.botGateway.integrationConfig), + platform + }; +} + +function normalizeBotGatewayPlatform(value: unknown): string { + const normalized = typeof value === "string" ? value.trim().toLowerCase() : ""; + if (!normalized || normalized === "off" || normalized === "disabled") { + return "none"; + } + if (normalized === "lark") { + return "feishu"; + } + if (normalized === "dingding") { + return "dingtalk"; + } + if (["wechat", "weixin", "wx", "weixin-ilink", "weixin_ilink", "ilink"].includes(normalized)) { + return "weixin-ilink"; + } + if (["wecom", "wework", "wechat-work", "work-weixin", "enterprise-wechat"].includes(normalized)) { + return "wecom"; + } + return normalized; +} + +function normalizeBotGatewayAuthType(platform: string, value: unknown): string { + const normalized = typeof value === "string" ? value.trim().toLowerCase().replace(/-/g, "_") : ""; + if (!platform || platform === "none") { + return ""; + } + if (!normalized || normalized === "default" || normalized === "auto" || normalized === "webhook" || normalized === "webhook_secret" || normalized === "outgoing_webhook") { + return defaultBotGatewayAuthType(platform); + } + if (normalized === "appsecret") { + return "app_secret"; + } + if (normalized === "bottoken" || normalized === "token") { + return "bot_token"; + } + if (normalized === "oauth" || normalized === "oauth_2") { + return "oauth2"; + } + if (["qr", "qr_login", "qrcode", "qr_code"].includes(normalized)) { + return "qr_login"; + } + return normalized; +} + +function defaultBotGatewayAuthType(platform: string): string { + if (platform === "weixin-ilink") { + return "qr_login"; + } + if (platform === "feishu" || platform === "dingtalk" || platform === "wecom") { + return "app_secret"; + } + if (platform === "slack" || platform === "discord" || platform === "telegram" || platform === "line") { + return "bot_token"; + } + return ""; +} + +function websocketBotGatewayIntegrationConfig(platform: string, value: Record): Record { + const config = sanitizeBotGatewayRecord(value); + delete config.transport; + delete config.sendMode; + const transport = botGatewayWebSocketTransport(platform); + return transport ? { ...config, transport } : config; +} + +function botGatewayWebSocketTransport(platform: string): string { + if (!platform || platform === "none") { + return ""; + } + return platform === "slack" ? "socket" : "websocket"; +} + +function sanitizeBotGatewayRecord(value: Record | undefined): Record { + const result: Record = {}; + if (!isObject(value)) { + return result; + } + for (const [key, rawValue] of Object.entries(value)) { + if (!key.trim() || isWebhookRelatedBotGatewayKey(key)) { + continue; + } + result[key] = rawValue; + } + return result; +} + +function isWebhookRelatedBotGatewayKey(key: string): boolean { + const normalized = key.trim().toLowerCase().replace(/[_-]+/g, ""); + return normalized.includes("webhook") || normalized === "sendmode"; +} + +export async function loadAppConfig(): Promise { + try { + const loadedRawConfig = await loadRawAppConfig(); + const rawValue = loadedRawConfig.value; + const value = interpolateRawAppConfigEnvVars(rawValue, loadedRawConfig.source) as Partial; + const picked = pickConfig(value); + const providers = picked.Providers ?? DEFAULT_CONFIG.Providers; + const port = picked.PORT ?? endpointPort(picked.routerEndpoint) ?? DEFAULT_CONFIG.PORT; + const host = picked.HOST ?? DEFAULT_CONFIG.HOST; + const endpoint = picked.routerEndpoint ?? `http://${normalizeEndpointHost(host)}:${port}`; + const gatewayConfig = picked.gateway ?? {}; + const corePort = gatewayConfig.corePort ?? nextPort(port); + const configFileApiKeys = normalizeApiKeys(picked.APIKEYS, picked.APIKEY).filter((apiKey) => !isDefaultSeedApiKey(apiKey)); + const persistedApiKeys = (await loadPersistedApiKeys()).filter((apiKey) => !isDefaultSeedApiKey(apiKey)); + const loadedApiKeys = uniqueApiKeyConfigs([...persistedApiKeys, ...configFileApiKeys]); + const apiKeys = ensureGatewayApiKeys(loadedApiKeys); + const config: AppConfig = withSingleEnabledGlobalProfiles({ + ...DEFAULT_CONFIG, + ...picked, + APIKEY: apiKeys[0]?.key ?? "", + APIKEYS: apiKeys, + HOST: host, + PORT: port, + Providers: providers, + Router: { + ...DEFAULT_CONFIG.Router, + ...picked.Router + }, + agent: { + ...DEFAULT_CONFIG.agent, + ...(picked.agent ?? {}), + mcpServers: picked.agent?.mcpServers ?? DEFAULT_CONFIG.agent.mcpServers + }, + botConfigs: picked.botConfigs ?? DEFAULT_CONFIG.botConfigs, + botGateway: completeBotGatewayConfig(picked.botGateway), + gateway: { + ...DEFAULT_CONFIG.gateway, + ...gatewayConfig, + coreHost: INTERNAL_GATEWAY_CORE_HOST, + corePort, + generatedConfigFile: GATEWAY_CONFIG_FILE, + host: gatewayConfig.host ?? host, + port: gatewayConfig.port ?? port + }, + observability: { + ...DEFAULT_CONFIG.observability, + ...(picked.observability ?? {}) + }, + preferredProvider: + picked.preferredProvider || providers[0]?.name || DEFAULT_CONFIG.preferredProvider, + profile: { + ...DEFAULT_CONFIG.profile, + ...(picked.profile ?? {}), + claudeCode: { + ...DEFAULT_CONFIG.profile.claudeCode, + ...(picked.profile?.claudeCode ?? {}) + }, + codex: { + ...DEFAULT_CONFIG.profile.codex, + ...(picked.profile?.codex ?? {}), + cliMiddleware: true + }, + profiles: picked.profile?.profiles ?? DEFAULT_CONFIG.profile.profiles + }, + proxy: { + ...DEFAULT_CONFIG.proxy, + ...(picked.proxy ?? {}), + targets: picked.proxy?.targets?.length ? picked.proxy.targets : DEFAULT_CONFIG.proxy.targets + }, + routerEndpoint: endpoint, + toolHub: { + ...DEFAULT_CONFIG.toolHub, + ...(picked.toolHub ?? {}), + llm: { + ...DEFAULT_CONFIG.toolHub.llm, + ...(picked.toolHub?.llm ?? {}) + }, + mcpServers: picked.toolHub?.mcpServers ?? DEFAULT_CONFIG.toolHub.mcpServers + } + }); + const shouldPersistApiKeys = loadedApiKeys.length === 0 || hasConfigFileApiKeys(rawValue) || configFileApiKeys.length > 0; + if (shouldPersistApiKeys) { + await replacePersistedApiKeys(apiKeys); + } + if (loadedRawConfig.source !== "sqlite" || shouldPersistApiKeys) { + await writeSanitizedConfig(config); + } + return config; + } catch (error) { + console.warn(`[config] Failed to load config: ${formatError(error)}`); + const persistedApiKeys = await loadPersistedApiKeys().catch((storeError) => { + console.warn(`[config] Failed to load API keys: ${formatError(storeError)}`); + return [] as ApiKeyConfig[]; + }); + const apiKeys = ensureGatewayApiKeys(persistedApiKeys.filter((apiKey) => !isDefaultSeedApiKey(apiKey))); + if (persistedApiKeys.length === 0) { + await replacePersistedApiKeys(apiKeys).catch((storeError) => { + console.warn(`[config] Failed to persist generated API key: ${formatError(storeError)}`); + }); + } + return { + ...DEFAULT_CONFIG, + APIKEY: apiKeys[0]?.key ?? "", + APIKEYS: apiKeys + }; + } +} + +export async function saveAppConfig(config: AppConfig): Promise { + const normalizedConfig = withSingleEnabledGlobalProfiles(config); + assertProviderApiKeysAreSafe(normalizedConfig); + const apiKeys = ensureGatewayApiKeys(normalizeApiKeys(normalizedConfig.APIKEYS, normalizedConfig.APIKEY).filter((apiKey) => !isDefaultSeedApiKey(apiKey))); + await replacePersistedApiKeys(apiKeys); + await writeSanitizedConfig({ + ...normalizedConfig, + APIKEY: apiKeys[0]?.key ?? "", + APIKEYS: apiKeys + }); + return loadAppConfig(); +} + +function withSingleEnabledGlobalProfiles(config: AppConfig): AppConfig { + return { + ...config, + profile: { + ...config.profile, + profiles: enforceSingleEnabledGlobalProfilePerAgent(config.profile.profiles) + } + }; +} + +function assertProviderApiKeysAreSafe(config: AppConfig): void { + for (const provider of config.Providers ?? []) { + const apiKey = providerApiKey(provider); + const baseUrl = providerBaseUrl(provider); + const issue = providerApiKeySafetyIssue({ + apiKey, + baseUrl, + name: provider.name + }); + if (issue) { + throw new Error(issue.message); + } + assertProviderAccountApiKeyTargetsAreSafe(provider, apiKey, baseUrl); + for (const credential of provider.credentials ?? []) { + const credentialApiKey = providerCredentialApiKey(credential); + const credentialIssue = providerApiKeySafetyIssue({ + apiKey: credentialApiKey, + baseUrl, + name: provider.name + }); + if (credentialIssue) { + throw new Error(credentialIssue.message); + } + assertProviderCredentialAccountApiKeyTargetsAreSafe(provider, credential, credentialApiKey, baseUrl); + } + } +} + +function assertProviderAccountApiKeyTargetsAreSafe(provider: GatewayProviderConfig, apiKey: string, baseUrl: string): void { + if (!apiKey || provider.account?.enabled === false) { + return; + } + + const presetId = findProviderPresetByBaseUrl(baseUrl)?.id; + for (const connector of provider.account?.connectors ?? []) { + const endpoints = providerAccountConnectorApiKeyEndpoints(connector); + for (const endpoint of endpoints) { + const issue = providerEndpointCanReceiveProviderApiKey({ + apiKey, + endpoint, + providerName: provider.name, + providerPresetId: presetId + }); + if (issue) { + throw new Error(issue.message); + } + } + } +} + +function assertProviderCredentialAccountApiKeyTargetsAreSafe( + provider: GatewayProviderConfig, + credential: ProviderCredentialConfig, + apiKey: string, + baseUrl: string +): void { + if (!apiKey || credential.account?.enabled === false) { + return; + } + + const presetId = findProviderPresetByBaseUrl(baseUrl)?.id; + for (const connector of credential.account?.connectors ?? []) { + const endpoints = providerAccountConnectorApiKeyEndpoints(connector); + for (const endpoint of endpoints) { + const issue = providerEndpointCanReceiveProviderApiKey({ + apiKey, + endpoint, + providerName: provider.name, + providerPresetId: presetId + }); + if (issue) { + throw new Error(issue.message); + } + } + } +} + +function providerAccountConnectorApiKeyEndpoints(connector: ProviderAccountConnectorConfig): string[] { + if ("auth" in connector && connector.auth === "none") { + return []; + } + if (connector.type === "http-json") { + return connector.endpoint ? [connector.endpoint] : []; + } + if (connector.type === "standard") { + return [ + connector.endpoint, + ...(connector.endpoints ?? []) + ].filter((endpoint): endpoint is string => Boolean(endpoint?.trim() && /^https?:\/\//i.test(endpoint))); + } + return []; +} + +function providerBaseUrl(provider: GatewayProviderConfig): string { + return provider.api_base_url || provider.baseUrl || provider.baseurl || ""; +} + +function providerApiKey(provider: GatewayProviderConfig): string { + return provider.api_key || provider.apiKey || provider.apikey || ""; +} + +function providerCredentialApiKey(credential: ProviderCredentialConfig): string { + return credential.api_key || credential.apiKey || credential.apikey || ""; +} + +export async function saveApiKeysConfig(apiKeys: ApiKeyConfig[]): Promise { + const normalized = ensureGatewayApiKeys(normalizeApiKeys(apiKeys, undefined).filter((apiKey) => !isDefaultSeedApiKey(apiKey))); + await replacePersistedApiKeys(normalized); + return loadAppConfig(); +} + +async function loadRawAppConfig(): Promise { + const persistedConfig = await loadPersistedAppConfig(); + if (isObject(persistedConfig)) { + return { + source: "sqlite", + value: persistedConfig as Partial + }; + } + + const legacyConfig = readLegacyJsonConfig(); + if (legacyConfig) { + return { + source: "legacy-json", + value: legacyConfig + }; + } + + return { + source: "default", + value: {} + }; +} + +function readLegacyJsonConfig(): Partial | undefined { + const files = uniqueStrings([CONFIG_FILE, LEGACY_WINDOWS_CONFIG_FILE, LEGACY_CONFIG_FILE]); + for (const file of files) { + if (!existsSync(file)) { + continue; + } + try { + const parsed = JSON.parse(readFileSync(file, "utf8")) as unknown; + if (isObject(parsed)) { + return parsed as Partial; + } + console.warn(`[config] Ignoring legacy config with non-object root: ${file}`); + } catch (error) { + console.warn(`[config] Failed to read legacy config ${file}: ${formatError(error)}`); + } + } + return undefined; +} + +async function writeSanitizedConfig(config: AppConfig): Promise { + await replacePersistedAppConfig(sanitizeConfigForDisk(config)); +} + +function sanitizeConfigForDisk(config: AppConfig): AppConfig { + return { + ...config, + APIKEY: "", + APIKEYS: [], + gateway: { + ...config.gateway, + coreHost: INTERNAL_GATEWAY_CORE_HOST + }, + Providers: withProviderIds(config.Providers), + profile: sanitizeProfileConfigForDisk(config.profile) + }; +} + +function sanitizeProfileConfigForDisk(profile: AppConfig["profile"]): AppConfig["profile"] { + const { remoteFrontendMode: _remoteFrontendMode, ...codex } = profile.codex as AppConfig["profile"]["codex"] & { + remoteFrontendMode?: unknown; + }; + return { + ...profile, + codex, + profiles: profile.profiles.map((profileItem) => { + if (profileItem.agent !== "codex" && profileItem.agent !== "zcode") { + return profileItem; + } + const { + coreMode: _coreMode, + frontendMode: _frontendMode, + remoteFrontendMode: _itemRemoteFrontendMode, + ...cleanedProfile + } = profileItem as ProfileConfig & { + coreMode?: unknown; + frontendMode?: unknown; + remoteFrontendMode?: unknown; + }; + return cleanedProfile; + }) + }; +} + +function pickConfig(value: Partial): LoadedAppConfig { + const config: LoadedAppConfig = {}; + + const port = readPort((value as Record).PORT); + if (port) { + config.PORT = port; + } + if (typeof value.HOST === "string" && value.HOST.trim()) { + config.HOST = value.HOST.trim(); + } + if (typeof value.APIKEY === "string") { + config.APIKEY = value.APIKEY; + } + const apiKeys = parseApiKeys((value as Record).APIKEYS ?? (value as Record).apiKeys); + if (apiKeys) { + config.APIKEYS = apiKeys; + } + if (typeof value.API_TIMEOUT_MS === "string" || typeof value.API_TIMEOUT_MS === "number") { + config.API_TIMEOUT_MS = value.API_TIMEOUT_MS; + } + if (typeof value.CUSTOM_ROUTER_PATH === "string") { + config.CUSTOM_ROUTER_PATH = value.CUSTOM_ROUTER_PATH.trim(); + } + const providers = parseProviders((value as Record).Providers ?? (value as Record).providers); + if (providers) { + config.Providers = providers; + } + if (Array.isArray((value as Record).providerPlugins)) { + config.providerPlugins = (value as Record).providerPlugins as unknown[]; + } + if (Array.isArray((value as Record).virtualModelProfiles)) { + config.virtualModelProfiles = (value as Record).virtualModelProfiles as AppConfig["virtualModelProfiles"]; + } + const plugins = parseGatewayPlugins((value as Record).plugins ?? (value as Record).gatewayPlugins); + if (plugins) { + config.plugins = plugins; + } + const router = parseRouter((value as Record).Router); + if (router) { + config.Router = router; + } + const agent = parseAgent((value as Record).agent ?? (value as Record).Agent, (value as Record).mcpServers); + if (agent) { + config.agent = agent; + } + const botGateway = parseBotGateway((value as Record).botGateway ?? (value as Record).bot_gateway ?? (value as Record).bot); + if (botGateway) { + config.botGateway = botGateway; + } + const botConfigs = parseBotGatewaySavedConfigs((value as Record).botConfigs ?? (value as Record).bot_configs); + if (botConfigs) { + config.botConfigs = botConfigs; + } + if (typeof value.autoStart === "boolean") { + config.autoStart = value.autoStart; + } + const launchAtLogin = (value as Record).launchAtLogin; + if (typeof launchAtLogin === "boolean") { + config.launchAtLogin = launchAtLogin; + } + if (isObject(value.gateway)) { + const gateway = value.gateway as Record; + const gatewayConfig: Partial = {}; + if (typeof gateway.enabled === "boolean") { + gatewayConfig.enabled = gateway.enabled; + } + if (typeof gateway.host === "string" && gateway.host.trim()) { + gatewayConfig.host = gateway.host.trim(); + } + const gatewayPort = readPort(gateway.port); + if (gatewayPort) { + gatewayConfig.port = gatewayPort; + } + const gatewayCorePort = readPort(gateway.corePort); + if (gatewayCorePort) { + gatewayConfig.corePort = gatewayCorePort; + } + config.gateway = gatewayConfig; + } + const profile = parseProfile((value as Record).profile); + if (profile) { + config.profile = profile; + } + const proxy = parseProxy((value as Record).proxy); + if (proxy) { + config.proxy = proxy; + } + const observability = parseObservability((value as Record).observability); + if (observability) { + config.observability = observability; + } + const toolHub = parseToolHub((value as Record).toolHub ?? (value as Record).tool_hub); + if (toolHub) { + config.toolHub = toolHub; + } + if (typeof value.preferredProvider === "string" && value.preferredProvider.trim()) { + config.preferredProvider = value.preferredProvider.trim(); + } + if (typeof value.routerEndpoint === "string" && value.routerEndpoint.trim()) { + config.routerEndpoint = value.routerEndpoint.trim(); + } + if (value.theme === "system" || value.theme === "light" || value.theme === "dark") { + config.theme = value.theme; + } + const trayIcon = parseTrayIconPreference((value as Record).trayIcon); + if (trayIcon) { + config.trayIcon = trayIcon; + } + const trayBalanceProgress = parseTrayBalanceProgress((value as Record).trayBalanceProgress); + if (trayBalanceProgress) { + config.trayBalanceProgress = trayBalanceProgress; + } else if (config.trayIcon === "progress") { + config.trayIcon = "random"; + } + const trayProgressTargetTokens = readNumber((value as Record).trayProgressTargetTokens); + if (trayProgressTargetTokens && trayProgressTargetTokens > 0) { + config.trayProgressTargetTokens = clampNumber(trayProgressTargetTokens, 1000, 1_000_000_000); + } + const trayComponentVariants = parseTrayComponentVariants((value as Record).trayComponentVariants); + if (trayComponentVariants) { + config.trayComponentVariants = trayComponentVariants; + } + const resolvedTrayComponentVariants = trayComponentVariants ?? DEFAULT_TRAY_COMPONENT_VARIANTS; + const trayWindowModules = parseTrayWindowModules((value as Record).trayWindowModules); + if (trayWindowModules !== undefined) { + config.trayWindowModules = trayWindowModules; + } + const trayWidgets = parseTrayWidgets((value as Record).trayWidgets); + if (trayWidgets !== undefined) { + config.trayWidgets = trayWidgets; + } else if (trayWindowModules !== undefined) { + config.trayWidgets = trayWidgetsFromModules(trayWindowModules, resolvedTrayComponentVariants); + } + const overviewWidgets = parseOverviewWidgets((value as Record).overviewWidgets); + if (overviewWidgets !== undefined) { + config.overviewWidgets = overviewWidgets; + } + + return config; +} + +function parseObservability(value: unknown): Partial | undefined { + if (!isObject(value)) { + return undefined; + } + + const observability: Partial = {}; + if (typeof value.requestLogs === "boolean") { + observability.requestLogs = value.requestLogs; + } + if (typeof value.agentAnalysis === "boolean") { + observability.agentAnalysis = value.agentAnalysis; + } + return Object.keys(observability).length ? observability : undefined; +} + +function parseToolHub(value: unknown): Partial | undefined { + if (!isObject(value)) { + return undefined; + } + + const toolHub: Partial = {}; + if (typeof value.enabled === "boolean") { + toolHub.enabled = value.enabled; + } + const browserAutomation = value.browserAutomation ?? value.browser_automation; + if (typeof browserAutomation === "boolean") { + toolHub.browserAutomation = browserAutomation; + } + const maxTools = readNumber(value.maxTools ?? value.max_tools); + if (maxTools !== undefined) { + toolHub.maxTools = clampNumber(maxTools, 1, 20); + } + const requestTimeoutMs = readNumber(value.requestTimeoutMs ?? value.request_timeout_ms); + if (requestTimeoutMs !== undefined) { + toolHub.requestTimeoutMs = clampNumber(requestTimeoutMs, 8000, 300000); + } + const mcpServers = parseMcpServers(value.mcpServers ?? value.mcp_servers); + if (mcpServers) { + toolHub.mcpServers = mcpServers; + } + + const rawLlm = isObject(value.llm) ? value.llm : value; + const llm: Partial = {}; + const apiKey = readString(rawLlm.apiKey) || readString(rawLlm.api_key); + if (apiKey !== undefined) { + llm.apiKey = apiKey; + } + const baseUrl = readString(rawLlm.baseUrl) || readString(rawLlm.base_url); + if (baseUrl !== undefined) { + llm.baseUrl = baseUrl; + } + const model = readString(rawLlm.model); + if (model !== undefined) { + llm.model = model; + } + if (Object.keys(llm).length > 0) { + toolHub.llm = llm as ToolHubConfig["llm"]; + } + + return Object.keys(toolHub).length ? toolHub : undefined; +} + +function parseOverviewWidgets(value: unknown): OverviewWidgetConfig[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + const widgets = value + .map(parseOverviewWidget) + .filter((widget): widget is OverviewWidgetConfig => Boolean(widget)); + return widgets; +} + +function parseOverviewWidget(value: unknown): OverviewWidgetConfig | undefined { + if (!isObject(value)) { + return undefined; + } + const type = parseOverviewWidgetType(value.type); + if (!type) { + return undefined; + } + const metric = type === "metric" ? parseOverviewMetricKind(value.metric) ?? "requests" : undefined; + const accountProvider = type === "account-balance" ? readString(value.accountProvider) : undefined; + return { + ...(accountProvider ? { accountProvider } : {}), + enabled: typeof value.enabled === "boolean" ? value.enabled : true, + id: readString(value.id) || overviewWidgetId(type, metric), + ...(metric ? { metric } : {}), + size: parseOverviewWidgetSize(value.size, type) ?? defaultOverviewWidgetSize(type), + type, + variant: parseOverviewWidgetVariant(value.variant) ?? defaultOverviewWidgetVariant(type) + }; +} + +function parseOverviewWidgetType(value: unknown): OverviewWidgetType | undefined { + return parseEnumValue(value, ["account-balance", "client-analysis", "metric", "model-distribution", "provider-analysis", "share-fuel-cockpit", "share-model-leaderboard", "share-route-map", "share-spend-receipt", "share-token-calendar", "share-usage-wrapped", "system-status", "token-activity", "token-mix", "usage-trend"], undefined); +} + +function parseOverviewWidgetSize(value: unknown, type: OverviewWidgetType): OverviewWidgetSize | undefined { + const size = parseEnumValue(value, OVERVIEW_WIDGET_SIZE_VALUES, undefined); + if (size) { + return size; + } + if (value === "small") { + return "1:1"; + } + if (value === "medium" || value === "large") { + return "2:2"; + } + if (value === "wide") { + return "3:2"; + } + if (value === "full") { + return type === "system-status" ? "4:1" : "4:2"; + } + return undefined; +} + +function parseOverviewWidgetVariant(value: unknown): OverviewWidgetVariant | undefined { + return parseEnumValue(value, ["arc", "area", "bar", "bars", "card", "cards", "compact", "composed", "donut", "heatmap", "line", "nested-rings", "pie", "ring", "semicircle", "stacked", "table", "timeline"], undefined); +} + +function parseOverviewMetricKind(value: unknown): OverviewMetricKind | undefined { + return parseEnumValue(value, ["avg-latency", "cache-ratio", "cache-tokens", "errors", "estimated-cost", "input-tokens", "output-tokens", "requests", "success-rate", "total-tokens"], undefined); +} + +function defaultOverviewWidgetSize(type: OverviewWidgetType): OverviewWidgetSize { + if (type === "metric") { + return "1:1"; + } + if (type === "model-distribution") { + return "2:2"; + } + if (type === "token-mix") { + return "1:2"; + } + if (type === "token-activity") { + return "4:2"; + } + if (type === "client-analysis" || type === "provider-analysis") { + return "2:2"; + } + if (type === "usage-trend") { + return "3:2"; + } + if (type === "system-status") { + return "4:1"; + } + if (isShareOverviewWidgetType(type)) { + return "1:4"; + } + return "4:2"; +} + +function defaultOverviewWidgetVariant(type: OverviewWidgetType): OverviewWidgetVariant { + if (type === "account-balance") { + return "cards"; + } + if (type === "metric") { + return "card"; + } + if (type === "model-distribution") { + return "pie"; + } + if (type === "token-mix") { + return "bars"; + } + if (type === "token-activity") { + return "heatmap"; + } + if (type === "usage-trend") { + return "composed"; + } + if (type === "system-status") { + return "timeline"; + } + if (isShareOverviewWidgetType(type)) { + return "card"; + } + return "table"; +} + +function overviewWidgetId(type: OverviewWidgetType, metric?: OverviewMetricKind): string { + return type === "metric" ? `metric-${metric ?? "requests"}` : type; +} + +function isShareOverviewWidgetType(type: OverviewWidgetType): boolean { + return type === "share-fuel-cockpit" || + type === "share-model-leaderboard" || + type === "share-route-map" || + type === "share-spend-receipt" || + type === "share-token-calendar" || + type === "share-usage-wrapped"; +} + +function parseTrayIconPreference(value: unknown): TrayIconPreference | undefined { + if (value === "random" || value === "violet" || value === "orange" || value === "cyan" || value === "progress") { + return value; + } + return undefined; +} + +function parseTrayBalanceProgress(value: unknown): TrayBalanceProgressConfig | undefined { + if (!isObject(value)) { + return undefined; + } + const provider = readString(value.provider); + const meterId = readString(value.meterId); + return provider && meterId ? { meterId, provider } : undefined; +} + +function parseTrayWindowModules(value: unknown): TrayWindowModuleId[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + const allowed = new Set(TRAY_WINDOW_MODULE_IDS); + return uniqueStrings(value.map((item) => readString(item)).filter((item): item is string => Boolean(item))) + .filter((item): item is TrayWindowModuleId => allowed.has(item)); +} + +function parseTrayWidgets(value: unknown): TrayWidgetConfig[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + return orderTrayWidgetsForLayout(dedupeTraySingletonWidgets(value + .map(parseTrayWidget) + .filter((widget): widget is TrayWidgetConfig => Boolean(widget)))); +} + +function parseTrayWidget(value: unknown): TrayWidgetConfig | undefined { + if (!isObject(value)) { + return undefined; + } + const type = parseTrayWidgetType(value.type); + if (!type) { + return undefined; + } + const variant = parseTrayWidgetVariant(type, value.variant); + return { + id: readString(value.id) || trayWidgetId(type), + type, + ...(variant ? { variant } : {}) + }; +} + +function parseTrayWidgetType(value: unknown): TrayWidgetType | undefined { + return parseEnumValue(value, ["account", "activity", "header", "model-share", "rings", "source-tabs", "stats", "token-flow", "token-mix"], undefined); +} + +function parseTrayWidgetVariant(type: TrayWidgetType, value: unknown): TrayWidgetVariant | undefined { + const fallback = defaultTrayWidgetVariant(type); + return fallback === undefined + ? parseEnumValue(value, trayWidgetVariantValues(type), undefined) + : parseEnumValue(value, trayWidgetVariantValues(type), fallback); +} + +function trayWidgetVariantValues(type: TrayWidgetType): TrayWidgetVariant[] { + if (type === "account") return ["bar", "compact", "ring", "arc", "stacked"]; + if (type === "model-share") return ["bars", "list", "donut", "pie"]; + if (type === "rings") return ["rings", "arcs", "gauges"]; + if (type === "stats") return ["cards", "compact", "pills"]; + if (type === "token-flow") return ["line", "area", "bar", "sparkline"]; + if (type === "token-mix") return ["bars", "stacked", "donut", "pie"]; + return []; +} + +function defaultTrayWidgetVariant(type: TrayWidgetType): TrayWidgetVariant | undefined { + if (type === "account") return DEFAULT_TRAY_COMPONENT_VARIANTS.account; + if (type === "model-share") return DEFAULT_TRAY_COMPONENT_VARIANTS.modelShare; + if (type === "rings") return DEFAULT_TRAY_COMPONENT_VARIANTS.rings; + if (type === "stats") return DEFAULT_TRAY_COMPONENT_VARIANTS.stats; + if (type === "token-flow") return DEFAULT_TRAY_COMPONENT_VARIANTS.tokenFlow; + if (type === "token-mix") return DEFAULT_TRAY_COMPONENT_VARIANTS.tokenMix; + return undefined; +} + +function trayWidgetId(type: TrayWidgetType): string { + return type; +} + +function isTraySingletonWidgetType(type: TrayWidgetType): boolean { + return (TRAY_SINGLETON_WIDGET_TYPES as readonly string[]).includes(type); +} + +function isTrayPinnedTopWidgetType(type: TrayWidgetType): boolean { + return (TRAY_TOP_WIDGET_TYPES as readonly string[]).includes(type); +} + +function orderTrayWidgetsForLayout(widgets: TrayWidgetConfig[]): TrayWidgetConfig[] { + return [ + ...widgets.filter((widget) => isTrayPinnedTopWidgetType(widget.type)), + ...widgets.filter((widget) => !isTrayPinnedTopWidgetType(widget.type)) + ]; +} + +function dedupeTraySingletonWidgets(widgets: TrayWidgetConfig[]): TrayWidgetConfig[] { + const seenSingletons = new Set(); + return widgets.filter((widget) => { + if (!isTraySingletonWidgetType(widget.type)) { + return true; + } + if (seenSingletons.has(widget.type)) { + return false; + } + seenSingletons.add(widget.type); + return true; + }); +} + +function trayWidgetsFromModules(modules: TrayWindowModuleId[], variants: TrayComponentVariants): TrayWidgetConfig[] { + return orderTrayWidgetsForLayout(modules + .filter((moduleId): moduleId is TrayWidgetType => moduleId !== "footer") + .map((type) => ({ + id: trayWidgetId(type), + type, + ...((type === "account") ? { variant: variants.account } : {}), + ...((type === "model-share") ? { variant: variants.modelShare } : {}), + ...((type === "rings") ? { variant: variants.rings } : {}), + ...((type === "stats") ? { variant: variants.stats } : {}), + ...((type === "token-flow") ? { variant: variants.tokenFlow } : {}), + ...((type === "token-mix") ? { variant: variants.tokenMix } : {}) + }))); +} + +function parseTrayComponentVariants(value: unknown): TrayComponentVariants | undefined { + if (!isObject(value)) { + return undefined; + } + return { + account: parseEnumValue(value.account, ["bar", "compact", "ring", "arc", "stacked"], DEFAULT_TRAY_COMPONENT_VARIANTS.account), + modelShare: parseEnumValue(value.modelShare, ["bars", "list", "donut", "pie"], DEFAULT_TRAY_COMPONENT_VARIANTS.modelShare), + rings: parseEnumValue(value.rings, ["rings", "arcs", "gauges"], DEFAULT_TRAY_COMPONENT_VARIANTS.rings), + stats: parseEnumValue(value.stats, ["cards", "compact", "pills"], DEFAULT_TRAY_COMPONENT_VARIANTS.stats), + tokenFlow: parseEnumValue(value.tokenFlow, ["line", "area", "bar", "sparkline"], DEFAULT_TRAY_COMPONENT_VARIANTS.tokenFlow), + tokenMix: parseEnumValue(value.tokenMix, ["bars", "stacked", "donut", "pie"], DEFAULT_TRAY_COMPONENT_VARIANTS.tokenMix) + }; +} + +function parseEnumValue(value: unknown, allowed: readonly T[], fallback: T): T; +function parseEnumValue(value: unknown, allowed: readonly T[], fallback: undefined): T | undefined; +function parseEnumValue(value: unknown, allowed: readonly T[], fallback: T | undefined): T | undefined { + return typeof value === "string" && (allowed as readonly string[]).includes(value) ? value as T : fallback; +} + +function parseProviders(value: unknown): GatewayProviderConfig[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + + const providers = value + .map((item): GatewayProviderConfig | undefined => { + if (!isObject(item)) { + return undefined; + } + const name = readString(item.name); + const models = Array.isArray(item.models) + ? item.models.map((model) => readString(model)).filter((model): model is string => Boolean(model)) + : []; + const modelDescriptions = parseModelDescriptions(item.modelDescriptions ?? item.model_descriptions, models); + const modelDisplayNames = parseModelDisplayNames(item.modelDisplayNames ?? item.model_display_names, models); + const modelMetadata = parseModelMetadata(item.modelMetadata ?? item.model_metadata, models); + + if (!name) { + return undefined; + } + + const provider: GatewayProviderConfig = { + account: parseProviderAccount(item.account), + api_base_url: readString(item.api_base_url), + api_key: readString(item.api_key), + apiKey: readString(item.apiKey), + apikey: readString(item.apikey), + baseUrl: readString(item.baseUrl), + baseurl: readString(item.baseurl), + billing: item.billing, + capabilities: parseProviderCapabilities(item.capabilities), + credentials: parseProviderCredentials(item.credentials ?? item.keys ?? item.apiKeys), + extraBody: item.extraBody, + extraHeaders: item.extraHeaders, + icon: readString(item.icon), + id: readString(item.id), + modelDescriptions, + modelDisplayNames, + modelMetadata, + models, + name, + provider: readString(item.provider), + transformer: item.transformer, + type: readString(item.type) + }; + return normalizeCodexProviderAccountConfig(provider); + }) + .filter((item): item is GatewayProviderConfig => Boolean(item)); + + return withProviderIds(providers); +} + +function parseModelDescriptions(value: unknown, models: string[]): Record | undefined { + if (!isObject(value)) { + return undefined; + } + + const modelIds = new Set(models); + const entries = Object.entries(value) + .map(([rawModel, rawDescription]) => [rawModel.trim(), readString(rawDescription)] as const) + .filter((entry): entry is [string, string] => { + const [model, description] = entry; + return Boolean(model && description && modelIds.has(model)); + }); + + return entries.length > 0 ? Object.fromEntries(entries) : undefined; +} + +function parseModelDisplayNames(value: unknown, models: string[]): Record | undefined { + if (!isObject(value)) { + return undefined; + } + + const modelIds = new Set(models); + const entries = Object.entries(value) + .map(([rawModel, rawDisplayName]) => [rawModel.trim(), readString(rawDisplayName)] as const) + .filter((entry): entry is [string, string] => { + const [model, displayName] = entry; + return Boolean(model && displayName && modelIds.has(model) && model !== displayName); + }); + + return entries.length > 0 ? Object.fromEntries(entries) : undefined; +} + +function parseModelMetadata(value: unknown, models: string[]): Record | undefined { + if (!isObject(value)) { + return undefined; + } + + const modelIds = new Set(models); + const entries = Object.entries(value) + .map(([rawModel, rawMetadata]) => [rawModel.trim(), parseProviderModelMetadata(rawMetadata)] as const) + .filter((entry): entry is [string, ProviderModelMetadata] => { + const [model, metadata] = entry; + return Boolean(model && metadata && modelIds.has(model)); + }); + + return entries.length > 0 ? Object.fromEntries(entries) : undefined; +} + +function parseProviderModelMetadata(value: unknown): ProviderModelMetadata | undefined { + if (!isObject(value)) { + return undefined; + } + const supportedReasoningLevels = parseProviderReasoningLevels(value.supportedReasoningLevels ?? value.supported_reasoning_levels); + const metadata: ProviderModelMetadata = { + ...(Array.isArray(value.additionalSpeedTiers) ? { additionalSpeedTiers: value.additionalSpeedTiers } : {}), + ...(Array.isArray(value.additional_speed_tiers) ? { additionalSpeedTiers: value.additional_speed_tiers } : {}), + ...(value.defaultReasoningLevel === null ? { defaultReasoningLevel: null } : {}), + ...(readString(value.defaultReasoningLevel) ? { defaultReasoningLevel: readString(value.defaultReasoningLevel) } : {}), + ...(value.default_reasoning_level === null ? { defaultReasoningLevel: null } : {}), + ...(readString(value.default_reasoning_level) ? { defaultReasoningLevel: readString(value.default_reasoning_level) } : {}), + ...(readString(value.defaultReasoningSummary) ? { defaultReasoningSummary: readString(value.defaultReasoningSummary) } : {}), + ...(readString(value.default_reasoning_summary) ? { defaultReasoningSummary: readString(value.default_reasoning_summary) } : {}), + ...(Array.isArray(value.serviceTiers) ? { serviceTiers: value.serviceTiers } : {}), + ...(Array.isArray(value.service_tiers) ? { serviceTiers: value.service_tiers } : {}), + ...(supportedReasoningLevels ? { supportedReasoningLevels } : {}), + ...(typeof value.supportsReasoningSummaries === "boolean" ? { supportsReasoningSummaries: value.supportsReasoningSummaries } : {}), + ...(typeof value.supports_reasoning_summaries === "boolean" ? { supportsReasoningSummaries: value.supports_reasoning_summaries } : {}) + }; + return Object.keys(metadata).length > 0 ? metadata : undefined; +} + +function parseProviderReasoningLevels(value: unknown): ProviderReasoningLevel[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + const levels = value + .map((item): ProviderReasoningLevel | undefined => { + if (!isObject(item)) { + const effort = readString(item); + return effort ? { description: effort, effort } : undefined; + } + const effort = readString(item.effort); + if (!effort) { + return undefined; + } + return { + description: readString(item.description) || effort, + effort + }; + }) + .filter((item): item is ProviderReasoningLevel => Boolean(item)); + return levels.length > 0 ? levels : undefined; +} + +function withProviderIds(providers: GatewayProviderConfig[]): GatewayProviderConfig[] { + const counts = new Map(); + return providers.map((provider) => { + const baseId = providerRuntimeIdCandidate(provider); + const nextCount = (counts.get(baseId) ?? 0) + 1; + counts.set(baseId, nextCount); + return { + ...provider, + id: nextCount === 1 ? baseId : `${baseId}-${nextCount}` + }; + }); +} + +function providerRuntimeIdCandidate(provider: GatewayProviderConfig): string { + const explicit = sanitizeProviderId(provider.id); + if (explicit) { + return explicit; + } + const slug = sanitizeProviderId(provider.name) || "provider"; + const source = [ + provider.name, + provider.provider ?? "", + providerBaseUrl(provider), + provider.type ?? "" + ].join("\n"); + const hash = createHash("sha256").update(source).digest("hex").slice(0, 10); + return `provider-${slug.slice(0, 48)}-${hash}`; +} + +function sanitizeProviderId(value: string | undefined): string | undefined { + const normalized = value + ?.normalize("NFKD") + .replace(/[\u0300-\u036f]/g, "") + .toLowerCase() + .replace(/[^a-z0-9_.-]+/g, "-") + .replace(/^-+|-+$/g, "") + .slice(0, 72); + return normalized || undefined; +} + +function parseProviderCredentials(value: unknown): ProviderCredentialConfig[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + + const credentials = value + .map((item, index): ProviderCredentialConfig | undefined => { + if (!isObject(item)) { + return undefined; + } + + const apiKey = readString(item.api_key) || readString(item.apiKey) || readString(item.apikey) || readString(item.key) || readString(item.token); + if (!apiKey) { + return undefined; + } + + const legacyLabel = readString(item.label); + const id = readString(item.id); + const name = readString(item.name) || legacyLabel || id || `Key ${index + 1}`; + const priority = readNumber(item.priority); + const weight = readNumber(item.weight); + return { + account: parseProviderAccount(item.account), + api_key: apiKey, + enabled: typeof item.enabled === "boolean" ? item.enabled : undefined, + ...(legacyLabel ? { label: legacyLabel } : {}), + ...(id ? { id } : {}), + name, + limits: parseApiKeyLimits(item.limits), + priority: priority !== undefined ? priority : undefined, + weight: weight !== undefined && weight > 0 ? weight : undefined + }; + }) + .filter((item): item is ProviderCredentialConfig => Boolean(item)); + + return credentials.length > 0 ? credentials : undefined; +} + +function parseProviderAccount(value: unknown): ProviderAccountConfig | undefined { + if (!isObject(value)) { + return undefined; + } + + const refreshIntervalMs = readNumber(value.refreshIntervalMs); + const connectors = Array.isArray(value.connectors) + ? value.connectors + .filter((connector): connector is Record => isObject(connector)) + .map((connector) => ({ ...connector }) as ProviderAccountConnectorConfig) + : undefined; + + if (typeof value.enabled !== "boolean" && !refreshIntervalMs && !connectors?.length) { + return undefined; + } + + return { + connectors, + enabled: typeof value.enabled === "boolean" ? value.enabled : undefined, + refreshIntervalMs: refreshIntervalMs && refreshIntervalMs > 0 ? refreshIntervalMs : undefined + }; +} + +function parseProviderCapabilities(value: unknown): GatewayProviderCapability[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + + const capabilities = value + .map((item): GatewayProviderCapability | undefined => { + if (!isObject(item)) { + return undefined; + } + const type = parseProviderCapabilityProtocol(readString(item.type) || readString(item.protocol)); + const baseUrl = readString(item.baseUrl) || readString(item.baseurl) || readString(item.api_base_url); + if (!type || !baseUrl) { + return undefined; + } + const source = readString(item.source); + return { + baseUrl, + endpoint: readString(item.endpoint), + source: source === "preset" || source === "detected" ? source : undefined, + type + }; + }) + .filter((item): item is GatewayProviderCapability => Boolean(item)); + + return capabilities.length > 0 ? capabilities : undefined; +} + +function parseProviderCapabilityProtocol(value: string | undefined): GatewayProviderProtocol | undefined { + if (!value) { + return undefined; + } + const normalized = value.trim().toLowerCase(); + if (normalized === "openai_responses" || normalized === "openai") { + return "openai_responses"; + } + if (normalized === "openai_chat" || normalized === "openai_chat_completions") { + return "openai_chat_completions"; + } + if (normalized === "anthropic" || normalized === "anthropic_messages") { + return "anthropic_messages"; + } + if (normalized === "gemini" || normalized === "gemini_generate_content") { + return "gemini_generate_content"; + } + if ( + normalized === "gemini_interactions" || + normalized === "gemini-interactions" || + normalized === "google_interactions" || + normalized === "google-interactions" || + normalized === "interactions" || + normalized === "interaction" + ) { + return "gemini_interactions"; + } + return undefined; +} + +function parseRouter(value: unknown): Partial | undefined { + if (!isObject(value)) { + return undefined; + } + + const router: Partial = {}; + const builtInRules = parseRouterBuiltInRules(value.builtInRules ?? value.builtinRules ?? value.agentRules); + if (builtInRules) { + router.builtInRules = builtInRules; + } + const rules = parseRouterRules(value.rules); + if (rules) { + router.rules = rules; + } else { + router.rules = []; + } + const fallback = parseRouterFallback(value.fallback ?? value.failureFallback ?? value.fallbackStrategy); + if (fallback) { + router.fallback = fallback; + } + return router; +} + +function parseRouterBuiltInRules(value: unknown): RouterBuiltInRulesConfig | undefined { + if (!isObject(value)) { + return undefined; + } + + return { + "claude-code": parseRouterBuiltInAgentRule(value["claude-code"] ?? value.claudeCode ?? value.claude), + codex: parseRouterBuiltInAgentRule(value.codex) + }; +} + +function parseRouterBuiltInAgentRule(value: unknown): { enabled: boolean } { + if (typeof value === "boolean") { + return { enabled: value }; + } + if (!isObject(value)) { + return { enabled: true }; + } + return { + enabled: typeof value.enabled === "boolean" ? value.enabled : true + }; +} + +function parseRouterFallback(value: unknown): RouterFallbackConfig | undefined { + if (!isObject(value)) { + return undefined; + } + + const mode = + parseRouterFallbackMode(value.mode) ?? + parseRouterFallbackMode(value.strategy) ?? + inferRouterFallbackMode(value); + const retryCount = clampNumber(readNumber(value.retryCount ?? value.retries ?? value.maxRetries) ?? 1, 0, ROUTER_FALLBACK_MAX_RETRY_COUNT); + const models = parseStringList(value.models ?? value.chain ?? value.fallbackModels) + .map((model) => model.trim()) + .filter(Boolean); + + return { + mode, + models: uniqueStrings(models), + retryCount + }; +} + +function inferRouterFallbackMode(value: Record): RouterFallbackMode { + if (value.enabled === false) { + return "off"; + } + if (parseStringList(value.models ?? value.chain ?? value.fallbackModels).length > 0) { + return "model-chain"; + } + if (value.enabled === true) { + return "retry"; + } + return "off"; +} + +function parseRouterFallbackMode(value: unknown): RouterFallbackMode | undefined { + if (typeof value !== "string") { + return undefined; + } + + const normalized = value.trim().toLowerCase(); + if (normalized === "off" || normalized === "disabled" || normalized === "none") { + return "off"; + } + if (normalized === "retry" || normalized === "retries") { + return "retry"; + } + if ( + normalized === "model-chain" || + normalized === "chain" || + normalized === "fallback-chain" || + normalized === "switch-model" || + normalized === "switch" + ) { + return "model-chain"; + } + return undefined; +} + +function parseStringList(value: unknown): string[] { + if (Array.isArray(value)) { + return value.map((item) => readString(item)).filter((item): item is string => Boolean(item)); + } + if (typeof value === "string") { + return value + .split(/\r?\n|,/g) + .map((item) => item.trim()) + .filter(Boolean); + } + return []; +} + +function parseStringArray(value: unknown): string[] | undefined { + if (!Array.isArray(value) && typeof value !== "string") { + return undefined; + } + const list = parseStringList(value); + return list.length ? list : undefined; +} + +function parseRouterRules(value: unknown): RouterRule[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + + return value + .map((item, index): RouterRule | undefined => { + if (!isObject(item)) { + return undefined; + } + const type = parseRouterRuleType(item.type); + if (!type) { + return undefined; + } + const id = readString(item.id) || `rule-${index + 1}`; + if (REMOVED_LEGACY_ROUTER_RULE_IDS.has(id)) { + return undefined; + } + const name = readString(item.name) || routerRuleTypeLabel(type); + const target = readString(item.target); + const pattern = readString(item.pattern); + const threshold = readNumber(item.threshold); + const condition = parseRouterRuleCondition(item.condition ?? item) ?? routerRuleConditionFromLegacy(type, { + pattern + }); + const rewrites = parseRouterRuleRewrites(item); + const fallback = parseRouterFallback(item.fallback ?? item.failureFallback ?? item.fallbackStrategy); + + return { + ...(condition ? { condition } : {}), + enabled: typeof item.enabled === "boolean" ? item.enabled : true, + ...(fallback ? { fallback } : {}), + id, + name, + ...(pattern ? { pattern } : {}), + ...(rewrites.length === 1 ? { rewrite: rewrites[0] } : {}), + ...(rewrites.length > 0 ? { rewrites } : {}), + ...(target ? { target } : {}), + ...(threshold !== undefined && threshold > 0 ? { threshold } : {}), + type: condition ? "condition" : type + }; + }) + .filter((item): item is RouterRule => Boolean(item)); +} + +function parseRouterRuleType(value: unknown): RouterRuleType | undefined { + if (typeof value !== "string") { + return undefined; + } + + const normalized = value.trim().toLowerCase(); + if ( + normalized === "condition" || + normalized === "model-prefix" + ) { + return normalized; + } + return undefined; +} + +function parseRouterRuleCondition(value: unknown): RouterRuleCondition | undefined { + if (!isObject(value)) { + return undefined; + } + + const left = + readString(value.left) ?? + readString(value.path) ?? + readString(value.field) ?? + readString(value.parameter); + const operator = parseRouterRuleOperator(value.operator ?? value.op); + const right = readConditionValue(value.right ?? value.value); + + return left && operator && right !== undefined + ? { left, operator, right } + : undefined; +} + +function parseRouterRuleOperator(value: unknown): RouterRuleOperator | undefined { + if (typeof value !== "string") { + return undefined; + } + const normalized = value.trim(); + if ( + normalized === "==" || + normalized === "!=" || + normalized === ">" || + normalized === ">=" || + normalized === "<" || + normalized === "<=" || + normalized === "starts-with" || + normalized === "contains" || + normalized === "contains-deep" || + normalized === "not-contains" + ) { + return normalized; + } + return undefined; +} + +function routerRuleConditionFromLegacy( + type: RouterRuleType, + input: { pattern?: string } +): RouterRuleCondition | undefined { + if (type === "model-prefix" && input.pattern) { + return { + left: "request.body.model", + operator: "starts-with", + right: input.pattern + }; + } + return undefined; +} + +function readConditionValue(value: unknown): string | undefined { + if (typeof value === "string") { + return value.trim(); + } + if (typeof value === "number" || typeof value === "boolean") { + return String(value); + } + return undefined; +} + +function parseRouterRuleRewrites(rule: Record): RouterRuleRewrite[] { + if (Array.isArray(rule.rewrites)) { + return rule.rewrites + .map((item) => parseRouterRuleRewrite(item)) + .filter((item): item is RouterRuleRewrite => Boolean(item)); + } + const rewrite = parseRouterRuleRewrite(rule.rewrite ?? rule.action); + const target = readString(rule.target); + return [ + ...(rewrite ? [rewrite] : []), + ...(target ? [{ key: "request.body.model", operation: "set" as const, value: target }] : []) + ]; +} + +function parseRouterRuleRewrite(value: unknown): RouterRuleRewrite | undefined { + if (!isObject(value)) { + return undefined; + } + + const key = + readString(value.key) ?? + readString(value.path) ?? + readString(value.field) ?? + readString(value.parameter); + const operation = parseRouterRewriteOperation(value.operation ?? value.op ?? value.type) ?? "set"; + const rewriteValue = readRewriteValue(value.value); + const match = readRewriteValue(value.match); + + if (!key) { + return undefined; + } + if (operation === "delete") { + return { key, operation }; + } + if (operation === "array-replace") { + return match !== undefined && rewriteValue !== undefined + ? { key, match, operation, value: rewriteValue } + : undefined; + } + return rewriteValue !== undefined + ? { key, operation, value: rewriteValue } + : undefined; +} + +function parseRouterRewriteOperation(value: unknown): RouterRuleRewriteOperation | undefined { + if (typeof value !== "string") { + return undefined; + } + const normalized = value.trim().toLowerCase(); + if ( + normalized === "set" || + normalized === "delete" || + normalized === "array-append" || + normalized === "array-prepend" || + normalized === "array-remove" || + normalized === "array-replace" + ) { + return normalized; + } + return undefined; +} + +function readRewriteValue(value: unknown): string | undefined { + if (typeof value === "string") { + return value.trim(); + } + if (typeof value === "number" || typeof value === "boolean") { + return String(value); + } + return undefined; +} + +function routerRuleTypeLabel(type: RouterRuleType): string { + return type === "condition" ? "Condition" : "Legacy"; +} + +function parseAgent(value: unknown, legacyMcpServers?: unknown): Partial | undefined { + const raw = isObject(value) ? value : {}; + const mcpServers = parseMcpServers(raw.mcpServers ?? legacyMcpServers); + if (!mcpServers) { + return undefined; + } + return { mcpServers }; +} + +function parseBotGateway(value: unknown): LoadedBotGatewayConfig | undefined { + if (!isObject(value)) { + return undefined; + } + + const config: LoadedBotGatewayConfig = {}; + if (typeof value.enabled === "boolean") { + config.enabled = value.enabled; + } + const sourceDir = readString(value.sourceDir) || readString(value.source_dir) || readString(value.projectDir) || readString(value.project_dir); + if (sourceDir) { + config.sourceDir = sourceDir; + } + const command = readString(value.command); + if (command) { + config.command = command; + } + const args = parseStringArray(value.args); + if (args) { + config.args = args; + } + const cwd = readString(value.cwd) || readString(value.rootDir) || readString(value.root_dir); + if (cwd) { + config.cwd = cwd; + } + const stateDir = readString(value.stateDir) || readString(value.state_dir); + if (stateDir) { + config.stateDir = stateDir; + } + const tenantId = readString(value.tenantId) || readString(value.tenant_id); + if (tenantId) { + config.tenantId = tenantId; + } + const integrationId = readString(value.integrationId) || readString(value.integration_id); + if (integrationId) { + config.integrationId = integrationId; + } + const platform = readString(value.platform); + if (platform) { + config.platform = platform; + } + const authType = readString(value.authType) || readString(value.auth_type); + if (authType) { + config.authType = authType; + } + const credentials = parseUnknownRecord(value.credentials) || parseUnknownRecord(value.authFields) || parseUnknownRecord(value.auth_fields); + if (credentials) { + config.credentials = credentials; + } + const integrationConfig = parseUnknownRecord(value.integrationConfig) || parseUnknownRecord(value.config); + if (integrationConfig) { + config.integrationConfig = integrationConfig; + } + const conversationRef = parseBotGatewayConversation(value.conversationRef ?? value.conversation_ref ?? value.conversation); + if (conversationRef) { + config.conversationRef = conversationRef; + } + if (typeof value.createIntegration === "boolean") { + config.createIntegration = value.createIntegration; + } else if (typeof value.create_integration === "boolean") { + config.createIntegration = value.create_integration; + } + if (typeof value.autoStartIntegration === "boolean") { + config.autoStartIntegration = value.autoStartIntegration; + } else if (typeof value.auto_start_integration === "boolean") { + config.autoStartIntegration = value.auto_start_integration; + } + if (typeof value.acknowledgeEvents === "boolean") { + config.acknowledgeEvents = value.acknowledgeEvents; + } else if (typeof value.acknowledge_events === "boolean") { + config.acknowledgeEvents = value.acknowledge_events; + } + if (typeof value.forwardAllAgentMessages === "boolean") { + config.forwardAllAgentMessages = value.forwardAllAgentMessages; + } else if (typeof value.forward_all_agent_messages === "boolean" || typeof value.forward_all_codex_messages === "boolean") { + config.forwardAllAgentMessages = Boolean(value.forward_all_agent_messages ?? value.forward_all_codex_messages); + } + + const requestTimeoutMs = readNumber(value.requestTimeoutMs ?? value.request_timeout_ms); + if (requestTimeoutMs !== undefined) { + config.requestTimeoutMs = clampNumber(requestTimeoutMs, 1000, 3_600_000); + } + const startupTimeoutMs = readNumber(value.startupTimeoutMs ?? value.startup_timeout_ms); + if (startupTimeoutMs !== undefined) { + config.startupTimeoutMs = clampNumber(startupTimeoutMs, 1000, 120_000); + } + const pollIntervalMs = readNumber(value.pollIntervalMs ?? value.poll_interval_ms); + if (pollIntervalMs !== undefined) { + config.pollIntervalMs = clampNumber(pollIntervalMs, 500, 60_000); + } + + const handoff = parseBotGatewayHandoff(value.handoff); + if (handoff) { + config.handoff = handoff; + } + + return config; +} + +function parseBotGatewaySavedConfigs(value: unknown): BotGatewaySavedConfig[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + const result: BotGatewaySavedConfig[] = []; + const seen = new Set(); + value.forEach((item, index) => { + if (!isObject(item)) { + return; + } + const rawBot = item.botGateway ?? item.bot_gateway ?? item.bot ?? item.config; + const parsedBot = parseBotGateway(rawBot); + if (!parsedBot) { + return; + } + const botGateway = completeBotGatewayConfig(parsedBot); + if (!botGateway.enabled || !botGateway.platform || botGateway.platform === "none") { + return; + } + const fallbackId = botGateway.integrationId || `bot-${index + 1}`; + const id = readString(item.id) || readString(item.savedConfigId) || readString(item.saved_config_id) || fallbackId; + if (!id || seen.has(id)) { + return; + } + seen.add(id); + result.push({ + botGateway, + id, + name: readString(item.name) || botGateway.platform || id, + ...(readString(item.updatedAt) || readString(item.updated_at) + ? { updatedAt: readString(item.updatedAt) || readString(item.updated_at) } + : {}) + }); + }); + return result; +} + +function parseBotGatewayHandoff(value: unknown): Partial | undefined { + if (!isObject(value)) { + return undefined; + } + const handoff: Partial = {}; + if (typeof value.enabled === "boolean") { + handoff.enabled = value.enabled; + } + const idleSeconds = readNumber(value.idleSeconds ?? value.idle_seconds); + if (idleSeconds !== undefined) { + handoff.idleSeconds = clampNumber(idleSeconds, 30, 86_400); + } + if (typeof value.screenLock === "boolean") { + handoff.screenLock = value.screenLock; + } else if (typeof value.screen_lock === "boolean") { + handoff.screenLock = value.screen_lock; + } + if (typeof value.userIdle === "boolean") { + handoff.userIdle = value.userIdle; + } else if (typeof value.user_idle === "boolean") { + handoff.userIdle = value.user_idle; + } + const phoneWifiTargets = parseStringArray(value.phoneWifiTargets ?? value.phone_wifi_targets); + if (phoneWifiTargets) { + handoff.phoneWifiTargets = uniqueStrings(phoneWifiTargets).slice(0, 1); + } + const phoneBluetoothTargets = parseStringArray(value.phoneBluetoothTargets ?? value.phone_bluetooth_targets); + if (phoneBluetoothTargets) { + handoff.phoneBluetoothTargets = uniqueStrings(phoneBluetoothTargets).slice(0, 1); + } + return Object.keys(handoff).length ? handoff : undefined; +} + +function parseBotGatewayConversation(value: unknown): BotGatewayRuntimeConfig["conversationRef"] | undefined { + if (!isObject(value)) { + return undefined; + } + const platformConversationId = + readString(value.platformConversationId) || + readString(value.platform_conversation_id) || + readString(value.conversationId) || + readString(value.chatId) || + readString(value.channelId); + const gatewayConversationId = readString(value.gatewayConversationId) || readString(value.gateway_conversation_id); + if (!platformConversationId && !gatewayConversationId) { + return undefined; + } + const type = parseEnumValue(value.type, ["dm", "group", "channel", "thread"], "dm"); + const threadId = readString(value.threadId) || readString(value.thread_id); + return { + ...(gatewayConversationId ? { gatewayConversationId } : {}), + ...(platformConversationId ? { platformConversationId } : {}), + ...(threadId ? { threadId } : {}), + type + }; +} + +function parseMcpServers(value: unknown): GatewayMcpServerConfig[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + + const servers = value + .map((item, index): GatewayMcpServerConfig | undefined => { + if (!isObject(item)) { + return undefined; + } + + const transport = parseMcpServerTransport(item.transport ?? item.type); + const name = readString(item.name) || (transport !== "stdio" ? readString(item.url) : readString(item.command)) || `mcp-${index + 1}`; + const protocolVersion = readString(item.protocolVersion) || "2024-11-05"; + const startupTimeoutMs = clampNumber(readNumber(item.startupTimeoutMs) ?? 600000, 100, 600000); + const requestTimeoutMs = clampNumber(readNumber(item.requestTimeoutMs) ?? 30000, 100, 600000); + + if (transport !== "stdio") { + const url = readString(item.url); + if (!url) { + return undefined; + } + return { + ...(readString(item.apiKey) ? { apiKey: readString(item.apiKey) } : {}), + ...(readString(item.apiKeyEnv) ? { apiKeyEnv: readString(item.apiKeyEnv) } : {}), + headers: parseStringRecord(item.headers) ?? {}, + name, + protocolVersion, + requestTimeoutMs, + startupTimeoutMs, + transport, + url + }; + } + + const command = readString(item.command); + if (!command) { + return undefined; + } + const stdioMessageMode = readString(item.stdioMessageMode) === "newline-json" ? "newline-json" : "content-length"; + return { + args: parseStringList(item.args), + command, + ...(readString(item.cwd) ? { cwd: readString(item.cwd) } : {}), + env: parseStringRecord(item.env) ?? {}, + name, + protocolVersion, + requestTimeoutMs, + startupTimeoutMs, + stdioMessageMode, + transport + }; + }) + .filter((item): item is GatewayMcpServerConfig => Boolean(item)); + + return servers.length ? servers : undefined; +} + +function parseMcpServerTransport(value: unknown): GatewayMcpServerTransport { + const normalized = readString(value) + ?.toLowerCase() + .replace(/_/g, "-") + .replace(/\s+/g, "-"); + if (normalized === "sse") { + return "sse"; + } + if (normalized === "http" || normalized === "streamable-http" || normalized === "streamablehttp" || normalized === "streamble-http" || normalized === "websocket") { + return "streamable-http"; + } + return "stdio"; +} + +function parseProxy(value: unknown): Partial | undefined { + if (!isObject(value)) { + return undefined; + } + + const proxy: Partial = {}; + const captureNetwork = typeof value.captureNetwork === "boolean" + ? value.captureNetwork + : typeof value.networkCaptureEnabled === "boolean" + ? value.networkCaptureEnabled + : undefined; + if (captureNetwork !== undefined) { + proxy.captureNetwork = captureNetwork; + } + const browserMode = typeof value.browserMode === "boolean" + ? value.browserMode + : typeof value.builtInBrowser === "boolean" + ? value.builtInBrowser + : typeof value.builtInBrowserMode === "boolean" + ? value.builtInBrowserMode + : undefined; + if (browserMode !== undefined) { + proxy.browserMode = browserMode; + } + if (typeof value.enabled === "boolean") { + proxy.enabled = value.enabled; + } + if (typeof value.host === "string" && value.host.trim()) { + proxy.host = value.host.trim(); + } + const proxyPort = readPort(value.port); + if (proxyPort) { + proxy.port = proxyPort; + } + if (value.mode === "gateway" || value.mode === "transparent") { + proxy.mode = value.mode; + } + if (typeof value.systemProxy === "boolean") { + proxy.systemProxy = value.systemProxy; + } else if (typeof value.systemProxyEnabled === "boolean") { + proxy.systemProxy = value.systemProxyEnabled; + } + const targets = parseProxyTargets(value.targets); + if (targets) { + proxy.targets = targets; + } + return proxy; +} + +function parseProxyTargets(value: unknown): ProxyRouteTarget[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + + const targets = value + .map((item): ProxyRouteTarget | undefined => { + if (typeof item === "string" && item.trim()) { + return { host: item.trim().toLowerCase() }; + } + if (!isObject(item)) { + return undefined; + } + const host = readString(item.host)?.toLowerCase(); + if (!host) { + return undefined; + } + const paths = Array.isArray(item.paths) + ? item.paths.map((path) => readString(path)).filter((path): path is string => Boolean(path)) + : undefined; + return { + host, + paths: paths?.length ? paths : undefined + }; + }) + .filter((item): item is ProxyRouteTarget => Boolean(item)); + + return targets.length ? targets : undefined; +} + +function parseGatewayPlugins(value: unknown): GatewayPluginConfig[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + + const plugins = value + .map((item, index): GatewayPluginConfig | undefined => { + if (!isObject(item)) { + return undefined; + } + + const id = readString(item.id) || readString(item.key) || `plugin-${index + 1}`; + const modulePath = readString(item.module) || readString(item.path); + const apps = parseGatewayPluginApps(item.apps); + const proxyRoutes = parseGatewayPluginProxyRoutes(isObject(item.proxy) ? item.proxy.routes : undefined); + const coreGateway = parseGatewayPluginCoreGateway(item.coreGateway); + + return { + ...(apps ? { apps } : {}), + ...(item.config !== undefined ? { config: item.config } : {}), + ...(coreGateway ? { coreGateway } : {}), + enabled: typeof item.enabled === "boolean" ? item.enabled : true, + id, + ...(modulePath ? { module: modulePath } : {}), + ...(proxyRoutes ? { proxy: { routes: proxyRoutes } } : {}) + }; + }) + .filter((item): item is GatewayPluginConfig => Boolean(item)); + + return plugins.length ? plugins : undefined; +} + +function parseGatewayPluginApps(value: unknown): GatewayPluginAppConfig[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + + const apps = value + .map((item, index): GatewayPluginAppConfig | undefined => { + if (!isObject(item)) { + return undefined; + } + const name = readString(item.name) || readString(item.title); + const url = readString(item.url) || readString(item.href) || readString(item.target); + if (!name || !url) { + return undefined; + } + return { + ...(readString(item.description) ? { description: readString(item.description) } : {}), + ...(readString(item.icon) ? { icon: readString(item.icon) } : {}), + id: readString(item.id) || `app-${index + 1}`, + name, + url + }; + }) + .filter((item): item is GatewayPluginAppConfig => Boolean(item)); + + return apps.length ? apps : undefined; +} + +function parseGatewayPluginProxyRoutes(value: unknown): GatewayPluginProxyRouteConfig[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + + const routes = value + .map((item, index): GatewayPluginProxyRouteConfig | undefined => { + if (!isObject(item)) { + return undefined; + } + const host = readString(item.host)?.toLowerCase(); + const upstream = readString(item.upstream) || readString(item.target) || readString(item.backend); + if (!host || !upstream) { + return undefined; + } + const paths = Array.isArray(item.paths) + ? item.paths.map((path) => readString(path)).filter((path): path is string => Boolean(path)) + : undefined; + const headers = parseStringRecord(item.headers); + const stripPathPrefix = + typeof item.stripPathPrefix === "boolean" || typeof item.stripPathPrefix === "string" + ? item.stripPathPrefix + : undefined; + const rewritePathPrefix = readString(item.rewritePathPrefix); + + return { + ...(headers ? { headers } : {}), + host, + id: readString(item.id) || `route-${index + 1}`, + ...(paths?.length ? { paths } : {}), + ...(typeof item.preserveHost === "boolean" ? { preserveHost: item.preserveHost } : {}), + ...(rewritePathPrefix ? { rewritePathPrefix } : {}), + ...(stripPathPrefix !== undefined ? { stripPathPrefix } : {}), + upstream + }; + }) + .filter((item): item is GatewayPluginProxyRouteConfig => Boolean(item)); + + return routes.length ? routes : undefined; +} + +function parseGatewayPluginCoreGateway(value: unknown): GatewayPluginConfig["coreGateway"] | undefined { + if (!isObject(value)) { + return undefined; + } + const providerPlugins = Array.isArray(value.providerPlugins) ? value.providerPlugins : undefined; + const virtualModelProfiles = Array.isArray(value.virtualModelProfiles) + ? value.virtualModelProfiles as NonNullable["virtualModelProfiles"] + : undefined; + const config = isObject(value.config) ? { ...(value.config as Record) } : undefined; + + if (!providerPlugins && !virtualModelProfiles && !config) { + return undefined; + } + + return { + ...(config ? { config } : {}), + ...(providerPlugins ? { providerPlugins } : {}), + ...(virtualModelProfiles ? { virtualModelProfiles } : {}) + }; +} + +function parseProfile(value: unknown): LoadedProfileConfig | undefined { + if (!isObject(value)) { + return undefined; + } + + const profile: LoadedProfileConfig = {}; + if (typeof value.enabled === "boolean") { + profile.enabled = value.enabled; + } + + const claudeCode = isObject(value.claudeCode) ? value.claudeCode : isObject(value.claude) ? value.claude : undefined; + if (claudeCode) { + profile.claudeCode = {}; + if (typeof claudeCode.enabled === "boolean") { + profile.claudeCode.enabled = claudeCode.enabled; + } + const settingsFile = readString(claudeCode.settingsFile) || readString(claudeCode.configFile) || readString(claudeCode.path); + if (settingsFile) { + profile.claudeCode.settingsFile = settingsFile; + } + const model = readString(claudeCode.model); + if (model !== undefined) { + profile.claudeCode.model = model; + } + const smallFastModel = readString(claudeCode.smallFastModel) || readString(claudeCode.smallModel); + if (smallFastModel !== undefined) { + profile.claudeCode.smallFastModel = smallFastModel; + } + } + + const codex = isObject(value.codex) ? value.codex : undefined; + if (codex) { + profile.codex = {}; + if (typeof codex.enabled === "boolean") { + profile.codex.enabled = codex.enabled; + } + if (typeof codex.cliMiddleware === "boolean") { + profile.codex.cliMiddleware = codex.cliMiddleware; + } + const codexCliPath = readString(codex.codexCliPath) || readString(codex.cliPath) || readString(codex.codexPath); + if (codexCliPath) { + profile.codex.codexCliPath = codexCliPath; + } + const codexHome = readString(codex.codexHome) || readString(codex.home); + if (codexHome) { + profile.codex.codexHome = codexHome; + } + const configFormat = parseCodexProfileConfigFormat(readString(codex.configFormat) || readString(codex.profileConfigFormat)); + if (configFormat) { + profile.codex.configFormat = configFormat; + } + const remoteFrontendMode = parseCodexRemoteFrontendMode( + readString(codex.remoteFrontendMode) || readString(codex.frontendMode) || readString(codex.coreMode) + ); + if (remoteFrontendMode) { + profile.codex.remoteFrontendMode = remoteFrontendMode; + } + const configFile = readString(codex.configFile) || readString(codex.settingsFile) || readString(codex.path); + if (configFile) { + profile.codex.configFile = configFile; + } + const model = readString(codex.model); + if (model !== undefined) { + profile.codex.model = model; + } + const providerId = readString(codex.providerId) || readString(codex.provider); + if (providerId) { + profile.codex.providerId = providerId; + } + const providerName = readString(codex.providerName) || readString(codex.name); + if (providerName) { + profile.codex.providerName = providerName; + } + const showAllSessions = typeof codex.showAllSessions === "boolean" + ? codex.showAllSessions + : typeof codex.show_all_sessions === "boolean" + ? codex.show_all_sessions + : undefined; + if (showAllSessions !== undefined) { + profile.codex.showAllSessions = showAllSessions; + } + } + + const profiles = parseProfiles(value.profiles); + if (profiles) { + profile.profiles = profiles; + } else { + const legacyProfiles: ProfileConfig[] = []; + if (profile.claudeCode) { + legacyProfiles.push(profileFromClaudeCodeConfig({ + ...DEFAULT_CONFIG.profile.claudeCode, + ...profile.claudeCode + })); + } + if (profile.codex) { + legacyProfiles.push(profileFromCodexConfig({ + ...DEFAULT_CONFIG.profile.codex, + ...profile.codex + })); + } + if (legacyProfiles.length) { + profile.profiles = legacyProfiles; + } + } + + return profile; +} + +function parseProfiles(value: unknown): ProfileConfig[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + + return value + .map((item, index): ProfileConfig | undefined => { + if (!isObject(item)) { + return undefined; + } + const agent = parseProfileAgent(item.agent); + if (!agent) { + return undefined; + } + const enabled = typeof item.enabled === "boolean" ? item.enabled : true; + const id = readString(item.id) || `profile-${index + 1}`; + const name = readString(item.name) || defaultProfileAgentName(agent); + const model = readString(item.model) ?? ""; + const env = parseStringRecord(item.env) ?? {}; + const parsedSurface = parseProfileSurface(readString(item.surface) || readString(item.entry) || readString(item.frontend)) || "auto"; + const surface = agent === "zcode" ? "app" : parsedSurface; + const botConfigId = surface !== "cli" + ? readString(item.botConfigId) || readString(item.bot_config_id) || readString(item.savedBotConfigId) || readString(item.saved_bot_config_id) + : ""; + const parsedBotGateway = parseBotGateway(item.botGateway ?? item.bot_gateway ?? item.bot); + const botGateway = surface !== "cli" && parsedBotGateway ? completeBotGatewayConfig(parsedBotGateway) : undefined; + + if (agent === "claude-code") { + const appPath = readProfileAppPath(item, agent); + return { + agent, + ...(appPath ? { appPath } : {}), + ...(botConfigId ? { botConfigId } : {}), + ...(botGateway ? { botGateway } : {}), + enabled, + env: claudeCodeProfileEnv(env), + id, + model, + name, + scope: parseProfileScope(readString(item.scope) || readString(item.applyScope) || readString(item.effectScope)) || "global", + settingsFile: readString(item.settingsFile) || readString(item.configFile) || "~/.claude/settings.json", + smallFastModel: readString(item.smallFastModel) || readString(item.smallModel) || "", + surface + }; + } + + const appPath = readProfileAppPath(item, agent); + return { + agent, + ...(appPath ? { appPath } : {}), + ...(botConfigId ? { botConfigId } : {}), + ...(botGateway ? { botGateway } : {}), + cliMiddleware: true, + codexCliPath: readString(item.codexCliPath) || readString(item.cliPath) || readString(item.codexPath) || "", + codexHome: readString(item.codexHome) || readString(item.home) || "", + configFormat: parseCodexProfileConfigFormat(readString(item.configFormat) || readString(item.profileConfigFormat)) || "separate_profile_files", + configFile: normalizeCodexConfigFileForAgent(agent, readString(item.configFile) || readString(item.settingsFile)), + enabled, + env: codexCompatibleProfileEnv(env), + id, + model, + name, + providerId: readString(item.providerId) || readString(item.provider) || "claude-code-router", + providerName: readString(item.providerName) || "Claude Code Router", + remoteFrontendMode: parseCodexRemoteFrontendMode(readString(item.remoteFrontendMode) || readString(item.frontendMode) || readString(item.coreMode)) || "app", + scope: parseProfileScope(readString(item.scope) || readString(item.applyScope) || readString(item.effectScope)) || "global", + showAllSessions: agent === "zcode" + ? false + : typeof item.showAllSessions === "boolean" + ? item.showAllSessions + : typeof item.show_all_sessions === "boolean" + ? item.show_all_sessions + : false, + surface + }; + }) + .filter((item): item is ProfileConfig => Boolean(item)); +} + +function readProfileAppPath(item: Record, agent: ProfileConfig["agent"]): string | undefined { + return readString(item.appPath) || + readString(item.app_path) || + readString(item.appExecutablePath) || + readString(item.app_executable_path) || + (agent === "claude-code" + ? readString(item.claudeAppPath) || readString(item.claude_app_path) + : agent === "codex" + ? readString(item.chatgptAppPath) || readString(item.chatgpt_app_path) || readString(item.codexAppPath) || readString(item.codex_app_path) + : readString(item.zcodeAppPath) || readString(item.zcode_app_path)); +} + +function parseProfileAgent(value: unknown): ProfileConfig["agent"] | undefined { + if (typeof value !== "string") { + return undefined; + } + const normalized = value.trim().toLowerCase(); + if (normalized === "claude" || normalized === "claude-code" || normalized === "claude code") { + return "claude-code"; + } + if (normalized === "codex") { + return "codex"; + } + if (normalized === "zcode" || normalized === "z-code" || normalized === "z code") { + return "zcode"; + } + return undefined; +} + +function defaultProfileAgentName(agent: ProfileConfig["agent"]): string { + if (agent === "claude-code") { + return "Claude Code"; + } + if (agent === "zcode") { + return "ZCode"; + } + return "Codex"; +} + +function defaultCodexConfigFile(agent: ProfileConfig["agent"]): string { + return agent === "zcode" ? "~/.zcode/cli/config.json" : "~/.codex/config.toml"; +} + +function normalizeCodexConfigFileForAgent(agent: ProfileConfig["agent"], value: string | undefined): string { + const trimmed = value?.trim(); + if (!trimmed || (agent === "zcode" && trimmed === "~/.zcode/config.toml")) { + return defaultCodexConfigFile(agent); + } + return trimmed; +} + +function profileFromClaudeCodeConfig(config: ClaudeCodeProfileConfig): ProfileConfig { + return { + agent: "claude-code", + enabled: config.enabled, + env: claudeCodeProfileEnv(), + id: "default-claude-code", + model: config.model, + name: "Claude Code", + scope: "global", + settingsFile: config.settingsFile, + smallFastModel: config.smallFastModel, + surface: "auto" + }; +} + +function claudeCodeProfileEnv(env: Record = {}): Record { + return { + ...CLAUDE_CODE_DEFAULT_ENV, + ...env + }; +} + +function codexCompatibleProfileEnv(env: Record): Record { + const { [CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV]: _ignored, ...result } = env; + return result; +} + +function profileFromCodexConfig(config: CodexProfileConfig): ProfileConfig { + return { + agent: "codex", + cliMiddleware: true, + codexCliPath: config.codexCliPath, + codexHome: config.codexHome, + configFormat: config.configFormat, + configFile: config.configFile, + enabled: config.enabled, + env: {}, + id: "default-codex", + model: config.model, + name: "Codex", + providerId: config.providerId, + providerName: config.providerName, + remoteFrontendMode: config.remoteFrontendMode, + scope: "global", + showAllSessions: config.showAllSessions, + surface: "auto" + }; +} + +function parseProfileScope(value: string | undefined): ProfileConfig["scope"] | undefined { + if (!value) { + return undefined; + } + const normalized = value.trim().toLowerCase().replace(/_/g, "-").replace(/\s+/g, "-"); + if (normalized === "ccr" || normalized === "managed" || normalized === "local" || normalized === "ccr-only" || normalized === "only-ccr") { + return "ccr"; + } + if (normalized === "global" || normalized === "system" || normalized === "system-default" || normalized === "default") { + return "global"; + } + if (normalized === "custom" || normalized === "custom-path" || normalized === "custom-config") { + return "custom"; + } + return undefined; +} + +function parseProfileSurface(value: string | undefined): ProfileConfig["surface"] | undefined { + if (!value) { + return undefined; + } + const normalized = value.trim().toLowerCase().replace(/_/g, "-").replace(/\s+/g, "-"); + if (normalized === "auto" || normalized === "automatic") { + return "auto"; + } + if (normalized === "cli" || normalized === "command-line") { + return "cli"; + } + if (normalized === "app" || normalized === "desktop" || normalized === "desktop-app") { + return "app"; + } + return undefined; +} + +function parseCodexProfileConfigFormat(value: string | undefined): "legacy" | "separate_profile_files" | undefined { + if (!value) { + return undefined; + } + const normalized = value.trim().toLowerCase().replace(/-/g, "_").replace(/\s+/g, "_"); + if (normalized === "legacy" || normalized === "profiles" || normalized === "profile_table" || normalized === "profiles_table") { + return "separate_profile_files"; + } + if (normalized === "separate" || normalized === "separate_profile_files" || normalized === "profile_files" || normalized === "profile_file" || normalized === "new") { + return "separate_profile_files"; + } + return undefined; +} + +function parseCodexRemoteFrontendMode(value: string | undefined): "app" | "cli" | "claude-code" | undefined { + if (!value) { + return undefined; + } + const normalized = value.trim().toLowerCase().replace(/_/g, "-").replace(/\s+/g, "-"); + if (normalized === "app" || normalized === "codex-app") { + return "app"; + } + if (normalized === "cli" || normalized === "codex-cli") { + return "cli"; + } + if (normalized === "claude-code" || normalized === "claude") { + return "claude-code"; + } + return undefined; +} + +function parseStringRecord(value: unknown): Record | undefined { + if (!isObject(value)) { + return undefined; + } + const result: Record = {}; + for (const [key, rawValue] of Object.entries(value)) { + const normalizedKey = key.trim(); + const normalizedValue = readString(rawValue); + if (normalizedKey && normalizedValue) { + result[normalizedKey] = normalizedValue; + } + } + return Object.keys(result).length ? result : undefined; +} + +function parseUnknownRecord(value: unknown): Record | undefined { + if (!isObject(value)) { + return undefined; + } + return { ...value }; +} + +function parseApiKeys(value: unknown): ApiKeyConfig[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + + const keys = value + .map((item, index) => parseApiKeyConfig(item, index)) + .filter((item): item is ApiKeyConfig => Boolean(item)); + return uniqueApiKeyConfigs(keys); +} + +function parseApiKeyConfig(value: unknown, index: number): ApiKeyConfig | undefined { + if (typeof value === "string") { + const key = readString(value); + return key ? createApiKeyConfig(key, index) : undefined; + } + if (!isObject(value)) { + return undefined; + } + + const key = readString(value.key) || readString(value.value) || readString(value.APIKEY); + if (!key) { + return undefined; + } + + const createdAt = readString(value.createdAt) || new Date(0).toISOString(); + const expiresAt = readString(value.expiresAt); + const limits = parseApiKeyLimits(value.limits); + const name = readString(value.name); + return { + createdAt, + ...(expiresAt ? { expiresAt } : {}), + id: readString(value.id) || `key-${index + 1}`, + key, + ...(limits ? { limits } : {}), + ...(name ? { name } : {}) + }; +} + +function parseApiKeyLimits(value: unknown): ApiKeyLimitConfig | undefined { + if (!isObject(value)) { + return undefined; + } + + const limits: ApiKeyLimitConfig = {}; + for (const key of ["ipd", "iph", "ipm", "maxRequests", "maxTokens", "quotaWindowMs", "rpd", "rph", "rpm", "tpd", "tph", "tpm", "windowMs"] as const) { + const limit = readNumber(value[key]); + if (limit !== undefined && limit > 0) { + limits[key] = limit; + } + } + return Object.keys(limits).length ? limits : undefined; +} + +function normalizeApiKeys(value: ApiKeyConfig[] | undefined, legacyKey: string | undefined): ApiKeyConfig[] { + return uniqueApiKeyConfigs([...(value ?? []), ...(legacyKey ? [createApiKeyConfig(legacyKey, value?.length ?? 0)] : [])]); +} + +function ensureGatewayApiKeys(apiKeys: ApiKeyConfig[]): ApiKeyConfig[] { + return apiKeys.length ? apiKeys : [createGeneratedGatewayApiKey()]; +} + +function createGeneratedGatewayApiKey(): ApiKeyConfig { + return { + createdAt: new Date().toISOString(), + id: GENERATED_GATEWAY_API_KEY_ID, + key: `sk-ccr-${randomBytes(32).toString("base64url")}`, + name: "Local Gateway" + }; +} + +function createApiKeyConfig(key: string, index: number): ApiKeyConfig { + return { + createdAt: new Date(0).toISOString(), + id: `key-${index + 1}`, + key: key.trim(), + name: `API Key ${index + 1}` + }; +} + +function uniqueApiKeyConfigs(values: Array): ApiKeyConfig[] { + const seen = new Set(); + const result: ApiKeyConfig[] = []; + for (const value of values) { + const trimmed = value?.key.trim(); + if (!value || !trimmed || seen.has(trimmed)) { + continue; + } + seen.add(trimmed); + result.push({ + createdAt: value.createdAt, + ...(value.expiresAt ? { expiresAt: value.expiresAt } : {}), + id: value.id, + key: trimmed, + ...(value.limits ? { limits: value.limits } : {}), + ...(value.name ? { name: value.name } : {}) + }); + } + return result; +} + +function hasConfigFileApiKeys(value: Partial): boolean { + const record = value as Record; + if (typeof record.APIKEY === "string" && record.APIKEY.trim()) { + return true; + } + + const values = record.APIKEYS ?? record.apiKeys; + if (!Array.isArray(values)) { + return false; + } + + return values.some((item) => { + if (typeof item === "string") { + return Boolean(item.trim()); + } + if (!isObject(item)) { + return false; + } + return Boolean(readString(item.key) || readString(item.value) || readString(item.APIKEY)); + }); +} + +function isDefaultSeedApiKey(apiKey: ApiKeyConfig): boolean { + return ( + apiKey.key === "sk-123" && + apiKey.createdAt === new Date(0).toISOString() && + (apiKey.id === "key-1" || apiKey.id === "legacy") && + (!apiKey.name || apiKey.name === "API Key 1") + ); +} + +export function interpolateRawAppConfigEnvVars(value: unknown, source: RawAppConfigSource): unknown { + return source === "legacy-json" ? interpolateEnvVars(value) : value; +} + +function interpolateEnvVars(value: unknown): unknown { + if (typeof value === "string") { + return value.replace(/\$\{([^}]+)\}|\$([A-Z_][A-Z0-9_]*)/g, (match, braced, unbraced) => { + const envName = braced || unbraced; + return process.env[envName] ?? match; + }); + } + + if (Array.isArray(value)) { + return value.map(interpolateEnvVars); + } + + if (isObject(value)) { + const mapped: Record = {}; + for (const [key, item] of Object.entries(value)) { + mapped[key] = interpolateEnvVars(item); + } + return mapped; + } + + return value; +} + +function endpointPort(endpoint: string | undefined): number | undefined { + if (!endpoint) { + return undefined; + } + try { + return readPort(new URL(endpoint).port); + } catch { + return undefined; + } +} + +function isObject(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function nextPort(port: number) { + return port >= 65535 ? port - 1 : port + 1; +} + +function normalizeEndpointHost(host: string) { + return host === "0.0.0.0" ? "127.0.0.1" : host; +} + +function readNumber(value: unknown): number | undefined { + if (typeof value === "number" && Number.isFinite(value)) { + return value; + } + if (typeof value !== "string" || !value.trim()) { + return undefined; + } + const parsed = Number(value); + return Number.isFinite(parsed) ? parsed : undefined; +} + +function clampNumber(value: number, min: number, max: number): number { + return Math.min(max, Math.max(min, Math.trunc(value))); +} + +function readPort(value: unknown): number | undefined { + const parsed = readNumber(value); + if (!parsed || parsed < 1 || parsed > 65535) { + return undefined; + } + return Math.trunc(parsed); +} + +function uniqueStrings(values: string[]): string[] { + const seen = new Set(); + const result: string[] = []; + for (const value of values) { + const key = value.trim(); + if (!key || seen.has(key)) { + continue; + } + seen.add(key); + result.push(key); + } + return result; +} + +function readString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/core/src/config/constants.ts b/packages/core/src/config/constants.ts new file mode 100644 index 0000000..b283061 --- /dev/null +++ b/packages/core/src/config/constants.ts @@ -0,0 +1,32 @@ +import path from "node:path"; +import { APP_NAME, APP_STORAGE_NAME, LEGACY_CONFIGDIR, resolveRuntimeAppPath, resolveRuntimeConfigDir, resolveRuntimeDataDir } from "@ccr/core/runtime/app-paths"; +import { copyMissingDirectoryContents } from "@ccr/core/storage/migration"; + +export { IPC_CHANNELS } from "@ccr/core/contracts/ipc-channels"; +export const LEGACY_CONFIG_FILE = path.join(LEGACY_CONFIGDIR, "config.json"); + +export { APP_NAME, APP_STORAGE_NAME, LEGACY_CONFIGDIR }; + +export const CONFIGDIR = resolveRuntimeConfigDir(); +export const LEGACY_WINDOWS_CONFIGDIR = path.join(resolveRuntimeAppPath("appData"), APP_NAME); +export const LEGACY_WINDOWS_CONFIG_FILE = path.join(LEGACY_WINDOWS_CONFIGDIR, "config.json"); +export const CONFIG_FILE = path.join(CONFIGDIR, "config.json"); +export const ONBOARDING_FINISHED_FILE = path.join(CONFIGDIR, ".onboard_finished"); +export const DATADIR = resolveRuntimeDataDir(); +export const APP_CONFIG_DB_FILE = path.join(CONFIGDIR, "config.sqlite"); +export const API_KEYS_DB_FILE = path.join(DATADIR, "api-keys.sqlite"); +export const LEGACY_APP_CONFIG_DB_FILES = process.platform === "win32" ? [path.join(LEGACY_WINDOWS_CONFIGDIR, "config.sqlite")] : []; +export const LEGACY_API_KEYS_DB_FILES = process.platform === "win32" ? [path.join(LEGACY_WINDOWS_CONFIGDIR, "api-keys.sqlite")] : []; +export const CERTDIR = path.join(DATADIR, "certs"); +export const PROVIDER_ICON_CACHE_DIR = path.join(DATADIR, "provider-icons"); +export const PROXY_CA_CERT_FILE = path.join(CERTDIR, "ca.pem"); +export const PROXY_CA_CERT_DER_FILE = path.join(CERTDIR, "ca.cer"); +export const PROXY_CA_KEY_FILE = path.join(CERTDIR, "key.pem"); +export const GATEWAY_CONFIG_FILE = path.join(CONFIGDIR, "gateway.config.json"); +export const REQUEST_LOGS_DB_FILE = path.join(DATADIR, "request-logs.sqlite"); +export const RAW_TRACE_SPOOL_DIR = path.join(DATADIR, "raw-trace-spool"); +export const USAGE_DB_FILE = path.join(DATADIR, "usage.sqlite"); + +if (process.platform === "win32") { + copyMissingDirectoryContents(LEGACY_WINDOWS_CONFIGDIR, CONFIGDIR, "Windows app data directory"); +} diff --git a/packages/core/src/config/default-config.ts b/packages/core/src/config/default-config.ts new file mode 100644 index 0000000..58a3868 --- /dev/null +++ b/packages/core/src/config/default-config.ts @@ -0,0 +1,186 @@ +import { + CLAUDE_CODE_DEFAULT_ENV, + DEFAULT_OVERVIEW_WIDGETS, + DEFAULT_TRAY_COMPONENT_VARIANTS, + DEFAULT_TRAY_WIDGETS, + DEFAULT_TRAY_WINDOW_MODULES, + type AppConfig, + type ProxyRouteTarget +} from "@ccr/core/contracts/app"; + +export const DEFAULT_PROXY_TARGETS: ProxyRouteTarget[] = [ + { host: "api.anthropic.com", paths: ["/v1/messages", "/v1/messages/count_tokens"] }, + { host: "api.openai.com", paths: ["/v1/chat/completions", "/v1/responses", "/v1/models"] }, + { host: "generativelanguage.googleapis.com", paths: ["/v1beta/models", "/v1/models"] }, + { host: "openrouter.ai", paths: ["/api/v1/chat/completions", "/api/v1/responses", "/api/v1/models"] }, + { host: "api.deepseek.com", paths: ["/chat/completions", "/v1/chat/completions", "/models", "/v1/models"] }, + { host: "api.mistral.ai", paths: ["/v1/chat/completions", "/v1/models"] } +]; + +export type DefaultAppConfigOptions = { + coreHost?: string; + generatedConfigFile: string; +}; + +export function createDefaultAppConfig(options: DefaultAppConfigOptions): AppConfig { + const coreHost = options.coreHost ?? "127.0.0.1"; + return { + APIKEY: "", + APIKEYS: [], + API_TIMEOUT_MS: 600000, + CUSTOM_ROUTER_PATH: "", + HOST: "127.0.0.1", + PORT: 3456, + Providers: [], + Router: { + builtInRules: { + "claude-code": { + enabled: true + }, + codex: { + enabled: true + } + }, + fallback: { + mode: "off", + models: [], + retryCount: 1 + }, + rules: [] + }, + agent: { + mcpServers: [] + }, + autoStart: false, + botConfigs: [], + botGateway: { + acknowledgeEvents: false, + args: [], + authType: "", + autoStartIntegration: true, + command: "", + createIntegration: false, + credentials: {}, + cwd: "", + enabled: false, + forwardAllAgentMessages: true, + handoff: { + enabled: false, + idleSeconds: 30, + phoneBluetoothTargets: [], + phoneWifiTargets: [], + screenLock: true, + userIdle: true + }, + integrationConfig: {}, + integrationId: "", + platform: "none", + pollIntervalMs: 2000, + requestTimeoutMs: 600000, + sourceDir: "", + startupTimeoutMs: 10000, + stateDir: "", + tenantId: "ccr" + }, + gateway: { + coreHost, + corePort: 3457, + enabled: true, + generatedConfigFile: options.generatedConfigFile, + host: "127.0.0.1", + port: 3456 + }, + launchAtLogin: false, + observability: { + agentAnalysis: false, + requestLogs: false + }, + preferredProvider: "", + plugins: [], + profile: { + claudeCode: { + enabled: true, + model: "", + settingsFile: "~/.claude/settings.json", + smallFastModel: "" + }, + codex: { + cliMiddleware: true, + codexCliPath: "", + codexHome: "", + configFormat: "separate_profile_files", + configFile: "~/.codex/config.toml", + enabled: true, + model: "", + providerId: "claude-code-router", + providerName: "Claude Code Router", + showAllSessions: false + }, + enabled: true, + profiles: [ + { + agent: "claude-code", + enabled: true, + env: { ...CLAUDE_CODE_DEFAULT_ENV }, + id: "default-claude-code", + model: "", + name: "Claude Code", + scope: "global", + settingsFile: "~/.claude/settings.json", + smallFastModel: "", + surface: "auto" + }, + { + agent: "codex", + cliMiddleware: true, + codexCliPath: "", + codexHome: "", + configFormat: "separate_profile_files", + configFile: "~/.codex/config.toml", + enabled: true, + env: {}, + id: "default-codex", + model: "", + name: "Codex", + providerId: "claude-code-router", + providerName: "Claude Code Router", + showAllSessions: false, + scope: "global", + surface: "auto" + } + ] + }, + proxy: { + browserMode: true, + captureNetwork: false, + enabled: false, + host: "127.0.0.1", + mode: "gateway", + port: 7890, + systemProxy: false, + targets: DEFAULT_PROXY_TARGETS + }, + providerPlugins: [], + overviewWidgets: DEFAULT_OVERVIEW_WIDGETS, + routerEndpoint: "http://127.0.0.1:3456", + theme: "system", + trayComponentVariants: DEFAULT_TRAY_COMPONENT_VARIANTS, + trayIcon: "random", + trayProgressTargetTokens: 100000, + trayWidgets: DEFAULT_TRAY_WIDGETS, + trayWindowModules: DEFAULT_TRAY_WINDOW_MODULES, + toolHub: { + browserAutomation: false, + enabled: false, + llm: { + apiKey: "", + baseUrl: "https://api.openai.com/v1", + model: "" + }, + mcpServers: [], + maxTools: 10, + requestTimeoutMs: 60000 + }, + virtualModelProfiles: [] + }; +} diff --git a/packages/core/src/contracts/app.ts b/packages/core/src/contracts/app.ts new file mode 100644 index 0000000..1fa0e90 --- /dev/null +++ b/packages/core/src/contracts/app.ts @@ -0,0 +1,2046 @@ +export type AppInfo = { + appConfigDbFile: string; + apiKeysDbFile: string; + configDir: string; + configFile: string; + dataDir: string; + gatewayConfigFile: string; + launchAtLoginSupported: boolean; + requestLogsDbFile: string; + name: string; + platform: string; + usageDbFile: string; + version: string; +}; + +export type AppDataExportResult = { + canceled: boolean; + exportedAt?: string; + file?: string; +}; + +export type AppCaptureElementPngRequest = { + borderRadius?: number; + exportId?: string; + fileName: string; + output?: { + height: number; + width: number; + }; + rect: { + height: number; + width: number; + x: number; + y: number; + }; +}; + +export type AppCaptureElementPngResult = { + canceled: boolean; + file?: string; +}; + +export type AppImageExportTargetRequest = { + fileName: string; +}; + +export type AppImageExportTargetResult = { + canceled: boolean; + exportId?: string; + file?: string; +}; + +export type AppRenderHtmlPngRequest = { + borderRadius?: number; + exportId?: string; + fileName: string; + html: string; + output?: { + height: number; + width: number; + }; + size: { + height: number; + width: number; + }; +}; + +export type AppRenderHtmlPngResult = { + canceled: boolean; + file?: string; +}; + +export type AppUpdateState = + | "idle" + | "checking" + | "available" + | "not-available" + | "downloading" + | "downloaded" + | "installing" + | "error"; + +export type AppUpdateDownloadProgress = { + bytesPerSecond?: number; + percent?: number; + total?: number; + transferred?: number; +}; + +export type AppUpdateStatus = { + availableVersion?: string; + canCheck: boolean; + canDownload: boolean; + canInstall: boolean; + currentVersion: string; + downloadedAt?: string; + feedUrl?: string; + lastCheckedAt?: string; + lastError?: string; + progress?: AppUpdateDownloadProgress; + releaseDate?: string; + releaseName?: string; + releaseNotes?: string; + state: AppUpdateState; + supported: boolean; +}; + +export const BUILTIN_FUSION_TOOL_SERVER_NAME = "ccr-fusion-builtins"; +export const BUILTIN_FUSION_VISION_TOOL_NAME = "vision_understand"; +export const BUILTIN_FUSION_WEB_SEARCH_TOOL_NAME = "web_search"; + +export type GatewayProviderProtocol = + | "openai_responses" + | "openai_chat_completions" + | "anthropic_messages" + | "gemini_generate_content" + | "gemini_interactions"; + +export type GatewayProviderConfig = { + account?: ProviderAccountConfig; + api_base_url?: string; + api_key?: string; + apiKey?: string; + apikey?: string; + baseUrl?: string; + baseurl?: string; + billing?: unknown; + capabilities?: GatewayProviderCapability[]; + credentials?: ProviderCredentialConfig[]; + extraBody?: unknown; + extraHeaders?: unknown; + icon?: string; + id?: string; + modelDescriptions?: Record; + modelDisplayNames?: Record; + modelMetadata?: Record; + models: string[]; + name: string; + provider?: string; + transformer?: unknown; + type?: GatewayProviderProtocol | string; +}; + +export type ProviderReasoningLevel = { + description: string; + effort: string; +}; + +export type ProviderModelMetadata = { + additionalSpeedTiers?: unknown[]; + defaultReasoningLevel?: string | null; + defaultReasoningSummary?: string; + serviceTiers?: unknown[]; + supportedReasoningLevels?: ProviderReasoningLevel[]; + supportsReasoningSummaries?: boolean; +}; + +export type ProviderCredentialConfig = { + account?: ProviderAccountConfig; + api_key?: string; + apiKey?: string; + apikey?: string; + enabled?: boolean; + id?: string; + label?: string; + name?: string; + limits?: ApiKeyLimitConfig; + priority?: number; + weight?: number; +}; + +export type ProviderAccountAuthMode = "provider-api-key" | "provider-api-key-raw" | "none"; +export type ProviderAccountConnectorSource = "standard" | "http-json" | "plugin" | "local-estimate" | "merged" | "unsupported"; +export type ProviderAccountStatus = "ok" | "warning" | "critical" | "error" | "unsupported"; +export type ProviderAccountMeterKind = "balance" | "subscription" | "quota" | "time_window" | "tokens" | "requests"; +export type ProviderAccountMeterUnit = "USD" | "CNY" | "hours" | "minutes" | "tokens" | "requests" | string; +export type ProviderAccountMeterWindow = "5h" | "daily" | "weekly" | "monthly" | string; +export type ProviderAccountHttpJsonParser = "kimi-code-usages" | "new-api-key-usage" | "new-api-user-self"; + +export type ProviderAccountConfig = { + connectors?: ProviderAccountConnectorConfig[]; + enabled?: boolean; + refreshIntervalMs?: number; +}; + +export type ProviderAccountConnectorConfig = + | ProviderAccountStandardConnectorConfig + | ProviderAccountHttpJsonConnectorConfig + | ProviderAccountPluginConnectorConfig + | ProviderAccountLocalEstimateConnectorConfig; + +export type ProviderAccountConnectorBaseConfig = { + id?: string; + type: ProviderAccountConnectorSource; +}; + +export type ProviderAccountStandardConnectorConfig = ProviderAccountConnectorBaseConfig & { + auth?: ProviderAccountAuthMode; + endpoint?: string; + endpoints?: string[]; + headers?: Record; + type: "standard"; +}; + +export type ProviderAccountHttpJsonConnectorConfig = ProviderAccountConnectorBaseConfig & { + auth?: ProviderAccountAuthMode; + body?: unknown; + endpoint: string; + headers?: Record; + mapping: ProviderAccountMappingConfig; + method?: "GET" | "POST"; + parser?: ProviderAccountHttpJsonParser; + type: "http-json"; +}; + +export type ProviderAccountPluginConnectorConfig = ProviderAccountConnectorBaseConfig & { + connectorId: string; + options?: unknown; + pluginId: string; + type: "plugin"; +}; + +export type ProviderAccountLocalEstimateConnectorConfig = ProviderAccountConnectorBaseConfig & { + type: "local-estimate"; + windows: ProviderAccountLocalWindowConfig[]; +}; + +export type ProviderAccountLocalWindowConfig = { + id: string; + label: string; + limit: number; + unit: "hours" | "tokens" | "requests"; + window: ProviderAccountMeterWindow; +}; + +export type ProviderAccountMappingConfig = { + meters: ProviderAccountMappedMeterConfig[]; + message?: string; + status?: string; +}; + +export type ProviderAccountMappedNumberExpression = number | string | Array; +export type ProviderAccountMappedStringExpression = string | string[]; + +export type ProviderAccountMappedMeterConfig = { + id: string; + kind?: ProviderAccountMeterKind; + label: string; + limit?: ProviderAccountMappedNumberExpression; + remaining?: ProviderAccountMappedNumberExpression; + resetAt?: ProviderAccountMappedStringExpression; + unit?: ProviderAccountMeterUnit; + used?: ProviderAccountMappedNumberExpression; + window?: ProviderAccountMeterWindow; +}; + +export type ProviderAccountMeterDetail = { + description?: string; + effectiveAt?: string; + expiresAt?: string; + id?: string; + label?: string; + redeemable?: boolean; + status?: string; +}; + +export type ProviderAccountMeter = { + details?: ProviderAccountMeterDetail[]; + id: string; + kind: ProviderAccountMeterKind; + label: string; + limit?: number; + remaining?: number; + resetAt?: string; + source?: ProviderAccountConnectorSource; + unit: ProviderAccountMeterUnit; + used?: number; + window?: ProviderAccountMeterWindow; +}; + +export type ProviderAccountConnectorError = { + connectorId?: string; + message: string; + source: ProviderAccountConnectorSource; +}; + +export type ProviderAccountSnapshot = { + credentialId?: string; + credentialLabel?: string; + errors?: ProviderAccountConnectorError[]; + message?: string; + meters: ProviderAccountMeter[]; + nextRefreshAt?: string; + provider: string; + source: ProviderAccountConnectorSource; + status: ProviderAccountStatus; + updatedAt: string; +}; + +export type ProviderAccountSnapshotRequestOptions = { + forceRefresh?: boolean; +}; + +export type ProviderDeepLinkPayload = { + account?: ProviderAccountConfig; + apiKey?: string; + baseUrl: string; + icon?: string; + modelDescriptions?: Record; + modelDisplayNames?: Record; + modelMetadata?: Record; + models: string[]; + name?: string; + protocol?: GatewayProviderProtocol; + source?: string; +}; + +export type ProviderManifestDeepLinkPayload = { + url: string; +}; + +export type ProviderManifestFetchRequest = { + url: string; +}; + +export type ProviderManifestFetchResult = { + fetchedAt: string; + provider: ProviderDeepLinkPayload; + url: string; +}; + +export type LocalAgentProviderKind = "claude-code" | "codex" | "zcode"; + +export type LocalAgentProviderStatus = "available" | "locked" | "missing"; + +export type LocalAgentProviderCandidate = { + detail?: string; + id: string; + importable: boolean; + kind: LocalAgentProviderKind; + modelDisplayNames?: Record; + modelMetadata?: Record; + models: string[]; + name: string; + protocol: GatewayProviderProtocol; + sourceFile?: string; + status: LocalAgentProviderStatus; +}; + +export type LocalAgentProviderImportRequest = { + id: string; + providerNames?: string[]; +}; + +export type LocalAgentProviderImportResult = { + candidate: LocalAgentProviderCandidate; + provider: ProviderDeepLinkPayload; + providerPlugins: unknown[]; +}; + +export type LocalAgentProviderProbeRequest = { + forceRefresh?: boolean; + id: string; +}; + +export type LocalAgentProviderProbeResult = { + candidate: LocalAgentProviderCandidate; + probe: GatewayProviderProbeResult; +}; + +export type ProviderCatalogModelsRequest = { + baseUrl?: string; + name?: string; + providerIds?: string[]; + providerPresetId?: string; +}; + +export type ProviderCatalogModelsResult = { + loadedFrom?: string; + matchedBy?: "base-url" | "provider-id" | "provider-name"; + modelDisplayNames?: Record; + modelMetadata?: Record; + models: string[]; + provider?: string; + providerName?: string; +}; + +export type ProviderAccountTestRequest = { + apiKey?: string; + baseUrl: string; + connector: ProviderAccountHttpJsonConnectorConfig; + providerName?: string; +}; + +export type ProviderAccountTestPath = { + path: string; + preview: string; + type: "array" | "boolean" | "null" | "number" | "object" | "string"; +}; + +export type ProviderAccountTestResult = { + message?: string; + meters: ProviderAccountMeter[]; + paths: ProviderAccountTestPath[]; + payload: unknown; + status?: ProviderAccountStatus; +}; + +export type ProviderAccountResetRequest = { + credentialId?: string; + creditId: string; + provider: string; +}; + +export type ProviderAccountResetResult = { + code?: string; + creditId: string; + ok: boolean; +}; + +export type ProviderDeepLinkRequest = { + error?: string; + id: string; + manifest?: ProviderManifestDeepLinkPayload; + provider?: ProviderDeepLinkPayload; + rawUrl: string; + receivedAt: string; +}; + +export type GatewayProviderCapability = { + baseUrl: string; + endpoint?: string; + source?: "detected" | "preset"; + type: GatewayProviderProtocol; +}; + +export type GatewayProviderDetectedProvider = "new-api"; + +export type GatewayProviderProbeRequest = { + apiKey?: string; + baseUrl: string; + forceRefresh?: boolean; + mode?: "connectivity" | "models" | "protocols"; + models?: string[]; + protocols?: GatewayProviderProtocol[]; + skipModelDiscovery?: boolean; +}; + +export type GatewayProviderProbeCandidate = { + baseUrl: string; + declaredProtocols?: GatewayProviderProtocol[]; + label?: string; + protocols: GatewayProviderProtocol[]; + source: "custom" | "preset"; +}; + +export type GatewayProviderProbeCandidatesRequest = { + apiKey?: string; + candidates: GatewayProviderProbeCandidate[]; + forceRefresh?: boolean; + mode?: "connectivity" | "models" | "protocols"; + models?: string[]; + protocols?: GatewayProviderProtocol[]; +}; + +export type ProviderIconDetectionRequest = { + baseUrl: string; + force?: boolean; + sourceUrls?: string[]; +}; + +export type ProviderIconDetectionResult = { + cachedFile?: string; + icon?: string; + sourceUrl?: string; +}; + +export type GatewayProviderProbeProtocolResult = { + baseUrl?: string; + detectedProvider?: GatewayProviderDetectedProvider; + endpoint: string; + message: string; + protocol: GatewayProviderProtocol; + status?: number; + supported: boolean; +}; + +export type GatewayProviderProbeResult = { + account?: ProviderAccountConfig; + capabilities?: GatewayProviderCapability[]; + detectedProvider?: GatewayProviderDetectedProvider; + detectedProtocol?: GatewayProviderProtocol; + modelDisplayNames?: Record; + modelMetadata?: Record; + modelSource?: "anthropic" | "gemini" | "openai"; + models: string[]; + normalizedBaseUrl: string; + protocols: GatewayProviderProbeProtocolResult[]; +}; + +export type GatewayProviderProbeCandidateResult = { + candidate: GatewayProviderProbeCandidate; + probe: GatewayProviderProbeResult; +}; + +export type GatewayProviderConnectivityCheckModelResult = { + message: string; + model: string; + protocols: GatewayProviderProbeProtocolResult[]; + supported: boolean; +}; + +export type GatewayProviderConnectivityCheckRequest = { + apiKey?: string; + candidates: GatewayProviderProbeCandidate[]; + forceRefresh?: boolean; + models: string[]; + protocols?: GatewayProviderProtocol[]; +}; + +export type GatewayProviderConnectivityCheckReport = { + failed: GatewayProviderConnectivityCheckModelResult[]; + passed: GatewayProviderConnectivityCheckModelResult[]; + probe?: GatewayProviderProbeResult; + results: GatewayProviderConnectivityCheckModelResult[]; +}; + +export type RouterRuleType = + | "condition" + | "model-prefix"; + +export type RouterRuleOperator = + | "==" + | "!=" + | ">" + | ">=" + | "<" + | "<=" + | "contains" + | "contains-deep" + | "not-contains" + | "starts-with"; + +export type RouterRuleCondition = { + left: string; + operator: RouterRuleOperator; + right: string; +}; + +export type RouterRuleRewriteOperation = + | "array-append" + | "array-prepend" + | "array-remove" + | "array-replace" + | "delete" + | "set"; + +export type RouterRuleRewrite = { + key: string; + match?: string; + operation?: RouterRuleRewriteOperation; + value?: string; +}; + +export type RouterRule = { + condition?: RouterRuleCondition; + enabled: boolean; + fallback?: RouterFallbackConfig; + id: string; + name: string; + pattern?: string; + rewrite?: RouterRuleRewrite; + rewrites?: RouterRuleRewrite[]; + target?: string; + threshold?: number; + type: RouterRuleType; +}; + +export type RouterFallbackMode = "off" | "retry" | "model-chain"; + +export const ROUTER_FALLBACK_MAX_RETRY_COUNT = 9999; + +export type RouterFallbackConfig = { + mode: RouterFallbackMode; + models: string[]; + retryCount: number; +}; + +export type RouterBuiltInAgentRuleId = "claude-code" | "codex"; + +export type RouterBuiltInAgentRuleConfig = { + enabled: boolean; +}; + +export type RouterBuiltInRulesConfig = Record; + +export type RouterConfig = { + builtInRules: RouterBuiltInRulesConfig; + fallback: RouterFallbackConfig; + rules: RouterRule[]; +}; + +export type GatewayRuntimeConfig = { + coreHost: string; + corePort: number; + enabled: boolean; + generatedConfigFile: string; + host: string; + port: number; +}; + +export type ProxyMode = "gateway" | "transparent"; + +export type ProxyForwardMode = ProxyMode | "plugin"; + +export type ProxyRouteTarget = { + host: string; + paths?: string[]; +}; + +export type GatewayPluginProxyRouteConfig = { + headers?: Record; + host: string; + id?: string; + paths?: string[]; + preserveHost?: boolean; + rewritePathPrefix?: string; + stripPathPrefix?: boolean | string; + upstream: string; +}; + +export type GatewayPluginAppConfig = { + description?: string; + icon?: string; + id?: string; + name: string; + url: string; +}; + +export type GatewayMcpServerTransport = "stdio" | "streamable-http" | "sse"; +export type GatewayMcpStdioMessageMode = "content-length" | "newline-json"; + +export type GatewayMcpServerBaseConfig = { + name: string; + protocolVersion: string; + requestTimeoutMs: number; + startupTimeoutMs: number; + transport: GatewayMcpServerTransport; +}; + +export type GatewayMcpStdioServerConfig = GatewayMcpServerBaseConfig & { + args: string[]; + command: string; + cwd?: string; + env: Record; + stdioMessageMode: GatewayMcpStdioMessageMode; + transport: "stdio"; +}; + +export type GatewayMcpRemoteServerConfig = GatewayMcpServerBaseConfig & { + apiKey?: string; + apiKeyEnv?: string; + headers: Record; + transport: "streamable-http" | "sse"; + url: string; +}; + +export type GatewayMcpServerConfig = GatewayMcpStdioServerConfig | GatewayMcpRemoteServerConfig; + +export type GatewayAgentConfig = { + mcpServers: GatewayMcpServerConfig[]; +}; + +export type ToolHubLlmConfig = { + apiKey: string; + baseUrl: string; + model: string; +}; + +export type ToolHubConfig = { + browserAutomation: boolean; + enabled: boolean; + llm: ToolHubLlmConfig; + mcpServers: GatewayMcpServerConfig[]; + maxTools: number; + requestTimeoutMs: number; +}; + +export const CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV = "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY"; +export const CLAUDE_CODE_DEFAULT_ENV: Record = { + [CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV]: "1" +}; + +export type GatewayMcpToolInfo = { + description?: string; + inputSchema?: Record; + name: string; +}; + +export type VirtualModelMatchConfig = { + exactAliases: string[]; + prefixes: string[]; + suffixes: string[]; +}; + +export type VirtualModelBaseModelMode = "fixed" | "request" | "strip_prefix" | "strip_suffix"; + +export type VirtualModelBaseModelConfig = { + fixedModel?: string; + mode?: VirtualModelBaseModelMode; +}; + +export type VirtualModelInstructionsConfig = { + append?: string; + prepend?: string; + replace?: string; +}; + +export type VirtualModelToolVisibility = "client" | "internal"; + +export type VirtualModelToolConfig = { + description?: string; + inputSchema?: Record; + name: string; + visibility: VirtualModelToolVisibility; +}; + +export type VirtualModelExecutionMode = "decorate_only" | "tool_loop"; + +export type VirtualModelExecutionConfig = { + clientToolsPolicy: "allow" | "deny"; + matchMultimodal?: boolean; + matchWebSearch?: boolean; + maxToolCalls: number; + maxTurns: number; + mode: VirtualModelExecutionMode; + streamMode: "buffered" | "optimistic"; +}; + +export type VirtualModelMaterializationConfig = { + descriptionTemplate?: string; + displayNameTemplate?: string; + enabled: boolean; + includeInGatewayModels: boolean; +}; + +export type VirtualModelFusionVisionConfig = { + apiKey?: string; + baseUrl?: string; + model?: string; + modelSelector?: string; + timeoutMs?: number; + toolName?: string; +}; + +export type VirtualModelFusionWebSearchProvider = + | "browser" + | "brave" + | "bing" + | "google_cse" + | "serper" + | "serpapi" + | "tavily" + | "exa"; + +export type VirtualModelFusionWebSearchConfig = { + env?: Record; + provider?: VirtualModelFusionWebSearchProvider; + resultCount?: number; + timeoutMs?: number; + toolName?: string; +}; + +export type VirtualModelFusionCustomToolConfig = { + env?: Record; + mcpServerName?: string; +}; + +export type VirtualModelProfileConfig = { + baseModel?: VirtualModelBaseModelConfig; + description?: string; + displayName: string; + enabled: boolean; + execution: VirtualModelExecutionConfig; + id: string; + instructions?: VirtualModelInstructionsConfig; + key: string; + match: VirtualModelMatchConfig; + materialization: VirtualModelMaterializationConfig; + metadata?: Record; + toolChoice?: unknown; + tools: VirtualModelToolConfig[]; +}; + +export const NO_AVAILABLE_GATEWAY_MODELS_MESSAGE = + "No available models. Configure at least one provider with a model before starting CCR Gateway or opening an agent through CCR."; + +export function assertAvailableGatewayModels(config: Pick): void { + if (!hasAvailableGatewayModels(config)) { + throw new Error(NO_AVAILABLE_GATEWAY_MODELS_MESSAGE); + } +} + +export function hasAvailableGatewayModels(config: Pick): boolean { + return availableGatewayModelIds(config).length > 0; +} + +export function availableGatewayModelIds(config: Pick): string[] { + const baseEntries = availableGatewayBaseModelEntries(config.Providers); + const ids = baseEntries.map((entry) => `${entry.providerName}/${entry.modelName}`); + + for (const profile of config.virtualModelProfiles ?? []) { + if (!isGatewayModelVisibleVirtualProfile(profile)) { + continue; + } + + for (const entry of baseEntries) { + for (const prefix of profile.match?.prefixes ?? []) { + const normalizedPrefix = prefix.trim(); + if (normalizedPrefix) { + ids.push(`${entry.providerName}/${normalizedPrefix}${entry.modelName}`); + } + } + for (const suffix of profile.match?.suffixes ?? []) { + const normalizedSuffix = suffix.trim(); + if (normalizedSuffix) { + ids.push(`${entry.providerName}/${entry.modelName}${normalizedSuffix}`); + } + } + } + + for (const alias of profile.match?.exactAliases ?? []) { + const normalizedAlias = alias.trim(); + if (normalizedAlias && baseEntries.length > 0) { + ids.push(normalizedAlias.toLowerCase().startsWith("fusion/") ? normalizedAlias : `Fusion/${normalizedAlias}`); + } + } + } + + return uniqueGatewayModelIds(ids); +} + +function availableGatewayBaseModelEntries(providers: GatewayProviderConfig[]): Array<{ modelName: string; providerName: string }> { + return providers.flatMap((provider) => { + const providerName = provider.name?.trim(); + if (!providerName || !Array.isArray(provider.models)) { + return []; + } + return provider.models.flatMap((rawModel) => { + const modelName = rawModel.trim(); + return modelName ? [{ modelName, providerName }] : []; + }); + }); +} + +function isGatewayModelVisibleVirtualProfile(profile: VirtualModelProfileConfig): boolean { + return profile.enabled !== false && + profile.materialization?.enabled !== false && + profile.materialization?.includeInGatewayModels !== false; +} + +function uniqueGatewayModelIds(values: string[]): string[] { + const seen = new Set(); + const result: string[] = []; + for (const value of values) { + const normalized = value.trim(); + const key = normalized.toLowerCase(); + if (!normalized || seen.has(key)) { + continue; + } + seen.add(key); + result.push(normalized); + } + return result; +} + +export type InstalledBrowserApp = GatewayPluginAppConfig & { + id: string; + pluginId: string; +}; + +export type GatewayPluginConfig = { + apps?: GatewayPluginAppConfig[]; + config?: unknown; + coreGateway?: { + config?: Record; + providerPlugins?: unknown[]; + virtualModelProfiles?: VirtualModelProfileConfig[]; + }; + enabled?: boolean; + id: string; + module?: string; + proxy?: { + routes?: GatewayPluginProxyRouteConfig[]; + }; +}; + +export type PluginDependency = { + id: string; + modulePath?: string; + name?: string; +}; + +export type PluginDirectorySelection = { + apps?: GatewayPluginAppConfig[]; + dependencies: PluginDependency[]; + directory: string; + id: string; + modulePath: string; + name?: string; +}; + +export type PluginMarketplaceEntry = { + apps?: GatewayPluginAppConfig[]; + capabilities: string[]; + dependencies: PluginDependency[]; + description: string; + id: string; + modulePath: string; + name: string; +}; + +export type ProxyRuntimeConfig = { + browserMode: boolean; + captureNetwork: boolean; + enabled: boolean; + host: string; + mode: ProxyMode; + port: number; + systemProxy: boolean; + targets: ProxyRouteTarget[]; +}; + +export type ObservabilityConfig = { + agentAnalysis: boolean; + requestLogs: boolean; +}; + +export type TrayIconPreference = "random" | "violet" | "orange" | "cyan" | "progress"; + +export type TrayBalanceProgressConfig = { + meterId: string; + provider: string; +}; + +export type TrayAccountComponentVariant = "bar" | "compact" | "ring" | "arc" | "stacked"; +export type TrayFlowComponentVariant = "line" | "area" | "bar" | "sparkline"; +export type TrayStatsComponentVariant = "cards" | "compact" | "pills"; +export type TrayTokenMixComponentVariant = "bars" | "stacked" | "donut" | "pie"; +export type TrayRingsComponentVariant = "rings" | "arcs" | "gauges"; +export type TrayModelShareComponentVariant = "bars" | "list" | "donut" | "pie"; +export type TrayWidgetVariant = + | TrayAccountComponentVariant + | TrayFlowComponentVariant + | TrayStatsComponentVariant + | TrayTokenMixComponentVariant + | TrayRingsComponentVariant + | TrayModelShareComponentVariant; + +export type TrayComponentVariants = { + account: TrayAccountComponentVariant; + modelShare: TrayModelShareComponentVariant; + rings: TrayRingsComponentVariant; + stats: TrayStatsComponentVariant; + tokenFlow: TrayFlowComponentVariant; + tokenMix: TrayTokenMixComponentVariant; +}; + +export const DEFAULT_TRAY_COMPONENT_VARIANTS: TrayComponentVariants = { + account: "bar", + modelShare: "bars", + rings: "rings", + stats: "cards", + tokenFlow: "line", + tokenMix: "bars" +}; + +export type OverviewWidgetType = + | "account-balance" + | "client-analysis" + | "metric" + | "model-distribution" + | "provider-analysis" + | "share-fuel-cockpit" + | "share-model-leaderboard" + | "share-route-map" + | "share-spend-receipt" + | "share-token-calendar" + | "share-usage-wrapped" + | "system-status" + | "token-activity" + | "token-mix" + | "usage-trend"; + +export const OVERVIEW_WIDGET_SIZE_VALUES = [ + "1:1", + "2:1", + "3:1", + "4:1", + "1:2", + "2:2", + "3:2", + "4:2", + "1:3", + "2:3", + "3:3", + "4:3", + "1:4", + "2:4", + "3:4", + "4:4" +] as const; + +export type OverviewWidgetSize = typeof OVERVIEW_WIDGET_SIZE_VALUES[number]; +export type OverviewWidgetVariant = + | "area" + | "bar" + | "bars" + | "card" + | "cards" + | "compact" + | "composed" + | "donut" + | "heatmap" + | "line" + | "arc" + | "nested-rings" + | "pie" + | "ring" + | "semicircle" + | "stacked" + | "table" + | "timeline"; + +export type OverviewMetricKind = + | "avg-latency" + | "cache-ratio" + | "cache-tokens" + | "errors" + | "estimated-cost" + | "input-tokens" + | "output-tokens" + | "requests" + | "success-rate" + | "total-tokens"; + +export type OverviewWidgetConfig = { + accountProvider?: string; + enabled: boolean; + id: string; + metric?: OverviewMetricKind; + size: OverviewWidgetSize; + type: OverviewWidgetType; + variant: OverviewWidgetVariant; +}; + +export const DEFAULT_OVERVIEW_WIDGETS: OverviewWidgetConfig[] = [ + { enabled: true, id: "system-status", size: "4:1", type: "system-status", variant: "timeline" }, + { enabled: true, id: "account-balance", size: "4:2", type: "account-balance", variant: "cards" }, + { enabled: true, id: "metric-requests", metric: "requests", size: "1:1", type: "metric", variant: "card" }, + { enabled: true, id: "metric-input-tokens", metric: "input-tokens", size: "1:1", type: "metric", variant: "card" }, + { enabled: true, id: "metric-output-tokens", metric: "output-tokens", size: "1:1", type: "metric", variant: "card" }, + { enabled: true, id: "metric-cache-tokens", metric: "cache-tokens", size: "1:1", type: "metric", variant: "card" }, + { enabled: true, id: "metric-cache-ratio", metric: "cache-ratio", size: "1:1", type: "metric", variant: "card" }, + { enabled: true, id: "metric-estimated-cost", metric: "estimated-cost", size: "1:1", type: "metric", variant: "card" }, + { enabled: true, id: "usage-trend", size: "3:2", type: "usage-trend", variant: "composed" }, + { enabled: true, id: "token-activity", size: "4:2", type: "token-activity", variant: "heatmap" }, + { enabled: true, id: "token-mix", size: "1:2", type: "token-mix", variant: "bars" }, + { enabled: true, id: "client-analysis", size: "2:2", type: "client-analysis", variant: "table" }, + { enabled: true, id: "provider-analysis", size: "2:2", type: "provider-analysis", variant: "table" } +]; + +export const TRAY_WINDOW_MODULE_IDS = [ + "source-tabs", + "header", + "account", + "token-flow", + "activity", + "stats", + "token-mix", + "rings", + "model-share", + "footer" +] as const; + +export type TrayWindowModuleId = (typeof TRAY_WINDOW_MODULE_IDS)[number]; +export type TrayWidgetType = Exclude; +export const TRAY_SINGLETON_WIDGET_TYPES = ["source-tabs", "header"] as const satisfies readonly TrayWidgetType[]; +export const TRAY_TOP_WIDGET_TYPES = ["source-tabs", "header"] as const satisfies readonly TrayWidgetType[]; + +export type TrayWidgetConfig = { + id: string; + type: TrayWidgetType; + variant?: TrayWidgetVariant; +}; + +export const DEFAULT_TRAY_WINDOW_MODULES: TrayWindowModuleId[] = [...TRAY_WINDOW_MODULE_IDS]; +export const DEFAULT_TRAY_WIDGETS: TrayWidgetConfig[] = [ + { id: "source-tabs", type: "source-tabs" }, + { id: "header", type: "header" }, + { id: "account", type: "account", variant: DEFAULT_TRAY_COMPONENT_VARIANTS.account }, + { id: "token-flow", type: "token-flow", variant: DEFAULT_TRAY_COMPONENT_VARIANTS.tokenFlow }, + { id: "activity", type: "activity" }, + { id: "stats", type: "stats", variant: DEFAULT_TRAY_COMPONENT_VARIANTS.stats }, + { id: "token-mix", type: "token-mix", variant: DEFAULT_TRAY_COMPONENT_VARIANTS.tokenMix }, + { id: "rings", type: "rings", variant: DEFAULT_TRAY_COMPONENT_VARIANTS.rings }, + { id: "model-share", type: "model-share", variant: DEFAULT_TRAY_COMPONENT_VARIANTS.modelShare } +]; + +export type ProfileClientKind = "claude-code" | "codex" | "zcode"; +export type CodexProfileConfigFormat = "legacy" | "separate_profile_files"; +export type CodexRemoteFrontendMode = "app" | "cli" | "claude-code"; +export type ProfileScope = "ccr" | "global" | "custom"; +export type ProfileSurface = "auto" | "cli" | "app"; +export type ProfileOpenSurface = "cli" | "app"; + +export type ClaudeCodeProfileConfig = { + enabled: boolean; + model: string; + settingsFile: string; + smallFastModel: string; +}; + +export type CodexProfileConfig = { + cliMiddleware: boolean; + codexCliPath: string; + codexHome: string; + configFormat: CodexProfileConfigFormat; + configFile: string; + enabled: boolean; + model: string; + providerId: string; + providerName: string; + remoteFrontendMode?: CodexRemoteFrontendMode; + showAllSessions: boolean; +}; + +export type ProfileConfig = { + agent: ProfileClientKind; + appPath?: string; + botConfigId?: string; + botGateway?: BotGatewayRuntimeConfig; + configFile?: string; + cliMiddleware?: boolean; + codexCliPath?: string; + codexHome?: string; + configFormat?: CodexProfileConfigFormat; + enabled: boolean; + env?: Record; + id: string; + model: string; + name: string; + providerId?: string; + providerName?: string; + remoteFrontendMode?: CodexRemoteFrontendMode; + scope?: ProfileScope; + showAllSessions?: boolean; + settingsFile?: string; + smallFastModel?: string; + surface?: ProfileSurface; +}; + +export type ProfileRuntimeConfig = { + claudeCode: ClaudeCodeProfileConfig; + codex: CodexProfileConfig; + enabled: boolean; + profiles: ProfileConfig[]; +}; + +export function normalizeProfileScopeValue(value: unknown): ProfileScope { + return value === "ccr" || value === "custom" ? value : "global"; +} + +export function isEnabledGlobalProfile(profile: Pick): boolean { + return profile.enabled && normalizeProfileScopeValue(profile.scope) === "global"; +} + +export function enforceSingleEnabledGlobalProfilePerAgent( + profiles: ProfileConfig[], + preferredIndex?: number +): ProfileConfig[] { + const activeGlobalProfileByAgent = new Map(); + const preferredProfileIndex = typeof preferredIndex === "number" ? preferredIndex : undefined; + const preferredProfile = preferredProfileIndex !== undefined ? profiles[preferredProfileIndex] : undefined; + if (preferredProfileIndex !== undefined && preferredProfile && isEnabledGlobalProfile(preferredProfile)) { + activeGlobalProfileByAgent.set(preferredProfile.agent, preferredProfileIndex); + } + + return profiles.map((profile, index) => { + if (!isEnabledGlobalProfile(profile)) { + return profile; + } + const activeIndex = activeGlobalProfileByAgent.get(profile.agent); + if (activeIndex === undefined) { + activeGlobalProfileByAgent.set(profile.agent, index); + return profile; + } + return activeIndex === index ? profile : { ...profile, enabled: false }; + }); +} + +export type ProfileClientApplyStatus = { + appliedAt?: string; + backupFile?: string; + client: ProfileClientKind; + enabled: boolean; + message: string; + ok: boolean; + path: string; +}; + +export type ProfileApplyResult = { + appliedAt: string; + clients: ProfileClientApplyStatus[]; + enabled: boolean; +}; + +export type ProfileOpenRequest = { + profileId: string; + surface: ProfileOpenSurface; +}; + +export type ProfileOpenCommandResult = { + command: string; + profileId: string; + profileName: string; + surface: ProfileOpenSurface; +}; + +export type ProfileOpenResult = { + message: string; + profileId: string; + profileName: string; + surface: ProfileOpenSurface; +}; + +export type ProfileRuntimeEntry = { + agent: AgentKind; + pid?: number; + profileId: string; + profileName: string; + startedAt: string; + state: "running"; + surface: ProfileOpenSurface; +}; + +export type ProfileRuntimeStatus = { + profiles: ProfileRuntimeEntry[]; +}; + +export type ProfileStopResult = { + message: string; + profileId: string; + profileName: string; + stopped: boolean; + surface: ProfileOpenSurface; +}; + +export type ApiKeyLimitConfig = { + ipd?: number; + iph?: number; + ipm?: number; + maxRequests?: number; + maxTokens?: number; + quotaWindowMs?: number; + rpd?: number; + rph?: number; + rpm?: number; + tpd?: number; + tph?: number; + tpm?: number; + windowMs?: number; +}; + +export type ApiKeyConfig = { + createdAt: string; + expiresAt?: string; + id: string; + key: string; + limits?: ApiKeyLimitConfig; + name?: string; +}; + +export type ProxySystemStatus = { + lastError?: string; + state: "active" | "error" | "inactive" | "restored" | "unsupported"; + upstream?: string; +}; + +export type ProxyCertificateTrustState = "missing" | "trusted" | "unknown" | "unsupported" | "untrusted"; + +export type ProxyCertificateStatus = { + caCertFile: string; + caFingerprintSha256?: string; + canInstall: boolean; + message: string; + platform: string; + state: ProxyCertificateTrustState; + trusted: boolean; +}; + +export type BotGatewayHandoffConfig = { + enabled: boolean; + idleSeconds: number; + phoneBluetoothTargets: string[]; + phoneWifiTargets: string[]; + screenLock: boolean; + userIdle: boolean; +}; + +export type BotHandoffScanTarget = { + detail: string; + id: string; + label: string; + source: "bluetooth" | "selected" | "wifi" | string; + target: string; +}; + +export type BotGatewayConversationConfig = { + gatewayConversationId?: string; + platformConversationId?: string; + threadId?: string; + type: "dm" | "group" | "channel" | "thread"; +}; + +export type BotGatewayRuntimeConfig = { + acknowledgeEvents: boolean; + args: string[]; + authType: string; + autoStartIntegration: boolean; + command: string; + conversationRef?: BotGatewayConversationConfig; + createIntegration: boolean; + credentials: Record; + cwd: string; + enabled: boolean; + forwardAllAgentMessages: boolean; + handoff: BotGatewayHandoffConfig; + integrationConfig: Record; + integrationId: string; + platform: string; + pollIntervalMs: number; + requestTimeoutMs: number; + sourceDir: string; + startupTimeoutMs: number; + stateDir: string; + tenantId: string; +}; + +export type BotGatewaySavedConfig = { + botGateway: BotGatewayRuntimeConfig; + id: string; + name: string; + updatedAt?: string; +}; + +export type BotGatewayQrLoginStartRequest = { + config: BotGatewaySavedConfig; + force?: boolean; +}; + +export type BotGatewayQrLoginStartResult = { + botConfigId: string; + expiresAt: string; + integrationId: string; + message: string; + platform: string; + qrCodeUrl: string; + sessionId: string; + stateDir: string; + tenantId: string; +}; + +export type BotGatewayQrLoginWaitRequest = { + sessionId: string; + timeoutMs?: number; + verifyCode?: string; +}; + +export type BotGatewayQrLoginWaitResult = { + confirmed: boolean; + integrationId: string; + message: string; + sessionId: string; + stateDir: string; + status: string; + tenantId: string; +}; + +export type BotGatewayQrLoginCancelRequest = { + sessionId: string; +}; + +export type BotGatewayQrLoginCancelResult = { + canceled: boolean; +}; + +export type BotGatewayQrWindowOpenRequest = { + scanTimeoutMs?: number; + sessionId: string; + title?: string; + url: string; + waitForScan?: boolean; +}; + +export type BotGatewayQrWindowOpenResult = { + message?: string; + observed?: boolean; + opened: boolean; + reason?: "closed" | "error" | "scan_detected" | "timeout"; +}; + +export type BotGatewayQrWindowCloseRequest = { + sessionId: string; +}; + +export type BotGatewayQrWindowCloseResult = { + closed: boolean; +}; + +export type AppConfig = { + APIKEY: string; + APIKEYS: ApiKeyConfig[]; + API_TIMEOUT_MS: number | string; + CUSTOM_ROUTER_PATH: string; + HOST: string; + PORT: number; + Providers: GatewayProviderConfig[]; + Router: RouterConfig; + agent: GatewayAgentConfig; + autoStart: boolean; + botConfigs: BotGatewaySavedConfig[]; + botGateway: BotGatewayRuntimeConfig; + gateway: GatewayRuntimeConfig; + launchAtLogin: boolean; + observability: ObservabilityConfig; + preferredProvider: string; + plugins: GatewayPluginConfig[]; + profile: ProfileRuntimeConfig; + proxy: ProxyRuntimeConfig; + providerPlugins?: unknown[]; + overviewWidgets: OverviewWidgetConfig[]; + routerEndpoint: string; + theme: "system" | "light" | "dark"; + trayBalanceProgress?: TrayBalanceProgressConfig; + trayProgressTargetTokens: number; + trayComponentVariants: TrayComponentVariants; + trayIcon: TrayIconPreference; + trayWidgets: TrayWidgetConfig[]; + trayWindowModules: TrayWindowModuleId[]; + toolHub: ToolHubConfig; + virtualModelProfiles?: VirtualModelProfileConfig[]; +}; + +export type AppSaveConfigOptions = { + applyProfile?: boolean; +}; + +export type ClaudeAppGatewayApplyResult = { + apiKeyGenerated: boolean; + configFile: string; + configLibraryFile: string; + dataDir: string; + endpoint: string; + message: string; + model: string; + requiresRestart: boolean; +}; + +export type GatewayNetworkEndpoint = { + address: string; + interfaceName: string; + endpoint: string; +}; + +export type GatewayStatus = { + coreEndpoint: string; + coreManagedExternally?: boolean; + endpoint: string; + generatedConfigFile: string; + lastError?: string; + lastStartedAt?: string; + networkEndpoints: GatewayNetworkEndpoint[]; + pid?: number; + state: "stopped" | "starting" | "running" | "error"; +}; + +export type ProxyStatus = { + caCertFile: string; + endpoint: string; + lastError?: string; + lastStartedAt?: string; + mode: ProxyMode; + port: number; + state: "stopped" | "starting" | "running" | "error"; + systemProxy: ProxySystemStatus; + targetHosts: string[]; +}; + +export type BuiltInBrowserTabState = { + canGoBack: boolean; + canGoForward: boolean; + id: string; + isLoading: boolean; + title: string; + url: string; +}; + +export type BuiltInBrowserAutomationHandoffKind = + | "blocked" + | "human_verification" + | "login_required" + | "other" + | "verification_code"; + +export type BuiltInBrowserAutomationHandoff = { + id: string; + kind: BuiltInBrowserAutomationHandoffKind; + message: string; + reason?: string; + requestedAt: number; + sessionId?: string; + status: "pending"; + tabId?: string; +}; + +export type BuiltInBrowserState = { + activeTabId?: string; + apps: InstalledBrowserApp[]; + automationHandoff?: BuiltInBrowserAutomationHandoff; + tabs: BuiltInBrowserTabState[]; +}; + +export type ChromeLoginImportTarget = "browser" | "browser-and-web-search"; + +export type ChromeLoginImportStatus = + | "completed" + | "expired" + | "failed" + | "pending"; + +export type ChromeLoginImportRequest = { + domains: string[]; + openConfirmationPage?: boolean; + target?: ChromeLoginImportTarget; +}; + +export type ChromeLoginImportResult = { + completedAt: number; + cookieImported: number; + cookieSkipped: number; + domains: string[]; + errors?: string[]; + imported: number; + localStorageImported: number; + localStorageSkipped: number; + partitions: string[]; + skipped: number; +}; + +export type ChromeLoginImportJob = { + confirmUrl: string; + createdAt: number; + domains: string[]; + endpointUrl: string; + expiresAt: number; + id: string; + importUrl: string; + result?: ChromeLoginImportResult; + status: ChromeLoginImportStatus; + target: ChromeLoginImportTarget; +}; + +export type ChromeLoginImportCookie = { + domain: string; + expirationDate?: number; + hostOnly?: boolean; + httpOnly?: boolean; + name: string; + partitionKey?: unknown; + path?: string; + sameSite?: "lax" | "no_restriction" | "strict" | "unspecified"; + secure?: boolean; + session?: boolean; + storeId?: string; + value: string; +}; + +export type ChromeLoginImportLocalStorage = { + items: Record; + origin: string; +}; + +export type ProxyCertificateInstallResult = { + caCertFile: string; + manualCommand?: string; + message: string; + ok: boolean; + status: ProxyCertificateStatus; +}; + +export type ProxyNetworkCaptureState = "complete" | "error" | "pending"; + +export type ProxyNetworkBody = { + contentType?: string; + decodedFrom?: string; + encoding: "base64" | "utf8"; + error?: string; + sizeBytes: number; + text: string; + truncated: boolean; +}; + +export type ProxyNetworkExchange = { + client: string; + completedAt?: string; + durationMs?: number; + error?: string; + host: string; + id: string; + method: string; + mode: ProxyForwardMode; + path: string; + protocol: "http" | "https"; + requestBody: ProxyNetworkBody; + requestHeaders: Record; + responseBody?: ProxyNetworkBody; + responseHeaders?: Record; + routedToGateway: boolean; + startedAt: string; + state: ProxyNetworkCaptureState; + statusCode?: number; + upstreamUrl: string; + url: string; +}; + +export type ProxyNetworkSnapshot = { + capturedAt: string; + captureEnabled: boolean; + items: ProxyNetworkExchange[]; + maxBodyBytes: number; + maxEntries: number; +}; + +export type RequestLogStatusFilter = "all" | "error" | "success"; + +export type RequestLogListFilter = { + credential?: string; + model?: string; + page?: number; + pageSize?: number; + provider?: string; + query?: string; + status?: RequestLogStatusFilter; +}; + +export type RequestLogDetailRequest = { + id: number; +}; + +export type RequestLogBody = ProxyNetworkBody; + +export type RequestLogRetryAttempt = { + attempt: number; + delayMs: number; + final: boolean; + status?: string; +}; + +export type RequestLogEntry = { + cacheReadTokens: number; + cacheWriteTokens: number; + client: string; + completedAt?: string; + costUsd?: number; + createdAt: string; + credentialChain: string[]; + credentialId?: string; + credentialSaturated: boolean; + durationMs: number; + error?: string; + id: number; + inputTokens: number; + isStream: boolean; + method: string; + model: string; + ok: boolean; + outputTokens: number; + path: string; + provider: string; + reasoningTokens: number; + requestBody: RequestLogBody; + requestHeaders: Record; + requestId: string; + retryAttempts: RequestLogRetryAttempt[]; + responseBody?: RequestLogBody; + responseHeaders: Record; + statusCode: number; + totalTokens: number; + url: string; +}; + +export type RequestLogFilterOptions = { + credentials: string[]; + models: string[]; + providers: string[]; +}; + +export type RequestLogPage = { + generatedAt: string; + items: RequestLogEntry[]; + options: RequestLogFilterOptions; + page: number; + pageSize: number; + total: number; + totalPages: number; +}; + +export type UsageStatsRange = "today" | "24h" | "7d" | "30d"; + +export type UsageStatsFilter = { + credential?: string; + includeProxy?: boolean; + model?: string; + provider?: string; +}; + +export type UsageTotals = { + avgDurationMs: number; + cacheRatio: number; + cacheTokens: number; + costUsd: number; + errorCount: number; + inputTokens: number; + outputTokens: number; + requestCount: number; + successRate: number; + totalTokens: number; +}; + +export type UsageSeriesPoint = UsageTotals & { + bucket: string; + label: string; +}; + +export type UsageComparisonRow = UsageTotals & { + caption: string; + client?: string; + credentialId?: string; + key: string; + label: string; + maxShare: number; + model?: string; + provider?: string; +}; + +export type UsageStatsSnapshot = { + clientModels: UsageComparisonRow[]; + generatedAt: string; + models: UsageComparisonRow[]; + providerModels: UsageComparisonRow[]; + range: UsageStatsRange; + recentRequests: UsageComparisonRow[]; + series: UsageSeriesPoint[]; + totals: UsageTotals; +}; + +export type AgentKind = "claude-code" | "codex" | "zcode" | "claude-design" | "unknown"; + +export type AgentAnalysisFilter = { + agent?: AgentKind | "all"; + range?: UsageStatsRange; + sessionAgent?: AgentKind; + sessionId?: string; +}; + +export type AgentAnalysisTotals = UsageTotals & { + cacheReadTokens: number; + cacheWriteTokens: number; + errorCount: number; + maxConcurrentRequests: number; + maxDurationMs: number; + p50DurationMs: number; + p95DurationMs: number; + p99DurationMs: number; + sessionCount: number; + subagentCallCount: number; + toolCallCount: number; +}; + +export type AgentAnalysisAgentRow = AgentAnalysisTotals & { + agent: AgentKind; + key: AgentKind; + label: string; + maxShare: number; +}; + +export type AgentAnalysisConcurrencyPoint = { + bucket: string; + label: string; + maxConcurrentRequests: number; + requestCount: number; +}; + +export type AgentAnalysisRequestRow = { + agent: AgentKind; + cacheReadTokens: number; + cacheWriteTokens: number; + client: string; + concurrentRequests: number; + costUsd?: number; + createdAt: string; + durationMs: number; + error?: string; + id: number; + inputTokens: number; + method: string; + model: string; + ok: boolean; + outputTokens: number; + path: string; + provider: string; + requestId: string; + routeReason?: string; + sessionId: string; + statusCode: number; + subagentModel?: string; + toolCallCount: number; + tools: string[]; + totalTokens: number; + userAgent?: string; +}; + +export type AgentAnalysisSessionRow = AgentAnalysisTotals & { + agent: AgentKind; + client: string; + durationMs: number; + id: string; + lastRequestId?: string; + lastSeenAt: string; + models: string[]; + providers: string[]; + startedAt: string; + topTools: Array<{ count: number; name: string }>; + userAgent?: string; +}; + +export type AgentAnalysisSessionSelection = { + agent: AgentKind; + id: string; +}; + +export type AgentAnalysisSessionModelRow = AgentAnalysisTotals & { + key: string; + lastSeenAt: string; + model: string; + provider: string; +}; + +export type AgentAnalysisToolRow = { + agents: AgentKind[]; + count: number; + lastSeenAt: string; + name: string; + requestCount: number; + sessions: number; +}; + +export type AgentAnalysisSubagentRow = { + agent: AgentKind; + cacheReadTokens: number; + cacheWriteTokens: number; + count: number; + lastSeenAt: string; + model: string; + provider: string; + sessionId: string; + totalTokens: number; +}; + +export type AgentAnalysisTraceRunKind = "agent" | "llm" | "route" | "subagent" | "tool"; + +export type AgentAnalysisTraceRunStatus = "error" | "success"; + +export type AgentAnalysisTracePayloadPreview = { + kind: "empty" | "json" | "text"; + preview: string; + sizeBytes: number; + truncated: boolean; +}; + +export type AgentAnalysisTracePayloadPart = "tool-input" | "tool-result"; + +export type AgentAnalysisTracePayloadRequest = { + callId?: string; + part: AgentAnalysisTracePayloadPart; + requestLogId: number; +}; + +export type AgentAnalysisTracePayloadFullResult = { + content: string; + found: boolean; + kind: "empty" | "json" | "text"; + sizeBytes: number; + sourceTruncated: boolean; +}; + +export type AgentAnalysisTraceToolDetail = { + callId?: string; + input?: AgentAnalysisTracePayloadPreview; + result?: AgentAnalysisTracePayloadPreview; + resultRequestId?: string; + resultRequestLogId?: number; +}; + +export type AgentAnalysisTraceRun = { + agent: AgentKind; + cacheReadTokens: number; + cacheWriteTokens: number; + concurrentRequests: number; + depth: number; + durationMs: number; + endedAt: string; + error?: string; + id: string; + inputTokens: number; + kind: AgentAnalysisTraceRunKind; + model?: string; + name: string; + offsetMs: number; + outputTokens: number; + parentId?: string; + path?: string; + provider?: string; + requestId?: string; + requestLogId?: number; + routeReason?: string; + sessionId: string; + startedAt: string; + status: AgentAnalysisTraceRunStatus; + statusCode?: number; + tool?: AgentAnalysisTraceToolDetail; + toolName?: string; + totalTokens: number; +}; + +export type AgentAnalysisTrace = { + agent: AgentKind; + durationMs: number; + endedAt: string; + errorCount: number; + id: string; + llmRunCount: number; + maxDepth: number; + rootRunId: string; + runCount: number; + runs: AgentAnalysisTraceRun[]; + sessionId: string; + startedAt: string; + subagentRunCount: number; + toolRunCount: number; +}; + +export type AgentObservabilityClientRow = AgentAnalysisTotals & { + agent: AgentKind; + key: string; + label: string; + lastSeenAt: string; + userAgent?: string; +}; + +export type AgentObservabilityEndpointRow = AgentAnalysisTotals & { + agent: AgentKind; + key: string; + lastSeenAt: string; + method: string; + model: string; + path: string; + provider: string; + statusCodes: Array<{ count: number; statusCode: number }>; +}; + +export type AgentObservabilityRouteRow = { + agent: AgentKind; + cacheRatio: number; + errorCount: number; + key: string; + lastSeenAt: string; + model: string; + p95DurationMs: number; + provider: string; + requestCount: number; + routeReason: string; + successRate: number; + totalTokens: number; +}; + +export type AgentObservabilityErrorRow = { + agent: AgentKind; + client: string; + createdAt: string; + durationMs: number; + error?: string; + id: number; + method: string; + model: string; + path: string; + provider: string; + requestId: string; + routeReason?: string; + sessionId: string; + statusCode: number; + userAgent?: string; +}; + +export type AgentAnalysisSessionDetail = { + endpoints: AgentObservabilityEndpointRow[]; + errors: AgentObservabilityErrorRow[]; + models: AgentAnalysisSessionModelRow[]; + requests: AgentAnalysisRequestRow[]; + routes: AgentObservabilityRouteRow[]; + session: AgentAnalysisSessionRow; + statusCodes: Array<{ count: number; statusCode: number }>; + subagents: AgentAnalysisSubagentRow[]; + tools: AgentAnalysisToolRow[]; + totals: AgentAnalysisTotals; + trace: AgentAnalysisTrace; +}; + +export type AgentAnalysisSnapshot = { + agents: AgentAnalysisAgentRow[]; + clients: AgentObservabilityClientRow[]; + concurrency: AgentAnalysisConcurrencyPoint[]; + endpoints: AgentObservabilityEndpointRow[]; + errors: AgentObservabilityErrorRow[]; + generatedAt: string; + range: UsageStatsRange; + recentRequests: AgentAnalysisRequestRow[]; + routes: AgentObservabilityRouteRow[]; + scannedRequestCount: number; + selectedSession?: AgentAnalysisSessionDetail; + sessions: AgentAnalysisSessionRow[]; + subagents: AgentAnalysisSubagentRow[]; + tools: AgentAnalysisToolRow[]; + totals: AgentAnalysisTotals; +}; diff --git a/packages/core/src/contracts/deep-link.ts b/packages/core/src/contracts/deep-link.ts new file mode 100644 index 0000000..b8bb98a --- /dev/null +++ b/packages/core/src/contracts/deep-link.ts @@ -0,0 +1,667 @@ +import type { + GatewayProviderProtocol, + ProviderAccountConfig, + ProviderAccountConnectorConfig, + ProviderAccountMappedMeterConfig, + ProviderDeepLinkPayload, + ProviderDeepLinkRequest, + ProviderManifestDeepLinkPayload +} from "@ccr/core/contracts/app"; +import { providerUrlWithDefaultScheme } from "@ccr/core/providers/url"; + +export const appDeepLinkProtocol = "ccr"; +export const providerDeepLinkHost = "provider"; + +const maxDeepLinkLength = 32_000; +const maxNameLength = 120; +const maxBaseUrlLength = 2_048; +const maxApiKeyLength = 8_192; +const maxIconLength = 8_192; +const maxManifestUrlLength = 2_048; +const maxSourceLength = 2_048; +const maxModelLength = 256; +const maxModelDescriptionLength = 1_000; +const maxModels = 300; + +const providerProtocols = new Set([ + "anthropic_messages", + "gemini_generate_content", + "gemini_interactions", + "openai_chat_completions", + "openai_responses" +]); + +export function isAppDeepLinkUrl(value: string): boolean { + return value.trim().toLowerCase().startsWith(`${appDeepLinkProtocol}://`); +} + +export function createProviderDeepLinkRequest(rawUrl: string, receivedAt = new Date()): ProviderDeepLinkRequest { + const id = `${receivedAt.getTime()}-${Math.random().toString(36).slice(2, 10)}`; + try { + const manifest = parseProviderManifestDeepLinkPayload(rawUrl); + if (manifest) { + return { + id, + manifest, + rawUrl, + receivedAt: receivedAt.toISOString() + }; + } + + return { + id, + provider: parseProviderDeepLinkPayload(rawUrl), + rawUrl, + receivedAt: receivedAt.toISOString() + }; + } catch (error) { + return { + error: error instanceof Error ? error.message : String(error), + id, + rawUrl, + receivedAt: receivedAt.toISOString() + }; + } +} + +export function parseProviderManifestDeepLinkPayload(rawUrl: string): ProviderManifestDeepLinkPayload | undefined { + const value = rawUrl.trim(); + if (value.length > maxDeepLinkLength) { + throw new Error("Provider link is too long."); + } + + const url = new URL(value); + if (url.protocol !== `${appDeepLinkProtocol}:`) { + throw new Error("Unsupported link protocol."); + } + + const host = url.hostname.toLowerCase(); + const firstPathSegment = url.pathname.split("/").filter(Boolean)[0]?.toLowerCase(); + if (host !== providerDeepLinkHost && firstPathSegment !== providerDeepLinkHost) { + throw new Error("Unsupported CCR link target."); + } + + const payload = readPayloadRecord(url.searchParams); + const manifestUrl = boundedString( + firstStringParam(url.searchParams, ["manifest"]) ?? + firstPayloadString(payload, ["manifest"]), + maxManifestUrlLength, + "Manifest URL" + ); + if (!manifestUrl) { + return undefined; + } + validateManifestUrl(manifestUrl); + return { + url: manifestUrl + }; +} + +export function parseProviderDeepLinkPayload(rawUrl: string): ProviderDeepLinkPayload { + const value = rawUrl.trim(); + if (value.length > maxDeepLinkLength) { + throw new Error("Provider link is too long."); + } + + const url = new URL(value); + if (url.protocol !== `${appDeepLinkProtocol}:`) { + throw new Error("Unsupported link protocol."); + } + + const host = url.hostname.toLowerCase(); + const firstPathSegment = url.pathname.split("/").filter(Boolean)[0]?.toLowerCase(); + if (host !== providerDeepLinkHost && firstPathSegment !== providerDeepLinkHost) { + throw new Error("Unsupported CCR link target."); + } + + const params = url.searchParams; + const payload = readPayloadRecord(params); + const name = boundedString( + firstStringParam(params, ["name"]) ?? + firstPayloadString(payload, ["name"]), + maxNameLength, + "Provider name" + ); + const baseUrl = boundedString( + firstStringParam(params, ["base_url"]) ?? + firstPayloadString(payload, ["base_url"]), + maxBaseUrlLength, + "Base URL" + ); + if (!baseUrl) { + throw new Error("Base URL is required."); + } + validateProviderBaseUrl(baseUrl); + + const apiKey = boundedString( + firstStringParam(params, ["api_key"]) ?? + firstPayloadString(payload, ["api_key"]), + maxApiKeyLength, + "API key" + ); + const icon = boundedString( + firstStringParam(params, ["icon"]) ?? + firstPayloadString(payload, ["icon"]), + maxIconLength, + "Provider icon" + ); + const protocol = normalizeProviderProtocol( + firstStringParam(params, ["protocol"]) ?? firstPayloadString(payload, ["protocol"]) + ); + const models = readDeepLinkModels(params, payload); + const modelDescriptions = readDeepLinkModelDescriptions(params, payload, models); + const modelDisplayNames = readDeepLinkModelDisplayNames(params, payload, models); + const account = readDeepLinkAccount(params, payload); + const source = boundedString( + firstStringParam(params, ["source"]) ?? + firstPayloadString(payload, ["source"]), + maxSourceLength, + "Source URL" + ); + return { + ...(account ? { account } : {}), + ...(apiKey ? { apiKey } : {}), + baseUrl, + ...(icon ? { icon } : {}), + ...(modelDescriptions ? { modelDescriptions } : {}), + ...(modelDisplayNames ? { modelDisplayNames } : {}), + models, + ...(name ? { name } : {}), + ...(protocol ? { protocol } : {}), + ...(source ? { source } : {}) + }; +} + +export function parseProviderManifestPayload(value: unknown, sourceUrl?: string): ProviderDeepLinkPayload { + if (!isRecord(value)) { + throw new Error("Provider manifest must be a JSON object."); + } + const providerValue = isRecord(value.provider) + ? value.provider + : isRecord(value.ccrProvider) + ? value.ccrProvider + : value; + return parseProviderPayloadFields(new URLSearchParams(), providerValue, sourceUrl); +} + +function parseProviderPayloadFields( + params: URLSearchParams, + payload: Record | undefined, + sourceFallback?: string +): ProviderDeepLinkPayload { + const name = boundedString( + firstStringParam(params, ["name"]) ?? + firstPayloadString(payload, ["name"]), + maxNameLength, + "Provider name" + ); + const baseUrl = boundedString( + firstStringParam(params, ["base_url"]) ?? + firstPayloadString(payload, ["base_url"]), + maxBaseUrlLength, + "Base URL" + ); + if (!baseUrl) { + throw new Error("Base URL is required."); + } + validateProviderBaseUrl(baseUrl); + + const apiKey = boundedString( + firstStringParam(params, ["api_key"]) ?? + firstPayloadString(payload, ["api_key"]), + maxApiKeyLength, + "API key" + ); + const icon = boundedString( + firstStringParam(params, ["icon"]) ?? + firstPayloadString(payload, ["icon"]), + maxIconLength, + "Provider icon" + ); + const protocol = normalizeProviderProtocol( + firstStringParam(params, ["protocol"]) ?? firstPayloadString(payload, ["protocol"]) + ); + const models = readDeepLinkModels(params, payload); + const modelDescriptions = readDeepLinkModelDescriptions(params, payload, models); + const modelDisplayNames = readDeepLinkModelDisplayNames(params, payload, models); + const account = readDeepLinkAccount(params, payload); + const source = boundedString( + firstStringParam(params, ["source"]) ?? + firstPayloadString(payload, ["source"]) ?? + sourceFallback, + maxSourceLength, + "Source URL" + ); + + return { + ...(account ? { account } : {}), + ...(apiKey ? { apiKey } : {}), + baseUrl, + ...(icon ? { icon } : {}), + ...(modelDescriptions ? { modelDescriptions } : {}), + ...(modelDisplayNames ? { modelDisplayNames } : {}), + models, + ...(name ? { name } : {}), + ...(protocol ? { protocol } : {}), + ...(source ? { source } : {}) + }; +} + +function readDeepLinkAccount(params: URLSearchParams, payload: Record | undefined): ProviderAccountConfig | undefined { + const fetchUsage = readDeepLinkBoolean(params, payload, [ + "fetch_usage" + ]); + if (fetchUsage === false) { + return { enabled: false }; + } + + const payloadAccount = normalizeProviderAccountConfig(payload?.account); + if (payloadAccount) { + return payloadAccount; + } + + const endpoint = boundedString( + firstStringParam(params, ["usage_url"]) ?? + firstPayloadString(payload, ["usage_url"]), + maxBaseUrlLength, + "Usage URL" + ); + if (!endpoint) { + return undefined; + } + validateProviderBaseUrl(endpoint); + + const method = normalizeUsageMethod( + firstStringParam(params, ["usage_method"]) ?? + firstPayloadString(payload, ["usage_method"]) + ); + const headers = parseJsonRecordParam(params, payload, ["usage_headers"]); + const body = parseJsonValueParam(params, payload, ["usage_body"]); + const balancePath = + firstStringParam(params, ["balance"]) ?? + firstPayloadString(payload, ["balance"]); + const subscriptionRemaining = + firstStringParam(params, ["subscription"]) ?? + firstPayloadString(payload, ["subscription"]); + const subscriptionLimit = + firstStringParam(params, ["subscription_limit"]) ?? + firstPayloadString(payload, ["subscription_limit"]); + const subscriptionReset = + firstStringParam(params, ["subscription_reset"]) ?? + firstPayloadString(payload, ["subscription_reset"]); + + const meters: ProviderAccountMappedMeterConfig[] = []; + if (balancePath) { + meters.push({ + id: "balance", + kind: "balance", + label: "Balance", + remaining: balancePath, + unit: firstStringParam(params, ["balance_unit"]) ?? firstPayloadString(payload, ["balance_unit"]) ?? "USD" + }); + } + if (subscriptionRemaining || subscriptionLimit) { + meters.push({ + id: "subscription", + kind: "subscription", + label: "Subscription", + limit: subscriptionLimit, + remaining: subscriptionRemaining, + resetAt: subscriptionReset, + unit: firstStringParam(params, ["subscription_unit"]) ?? firstPayloadString(payload, ["subscription_unit"]) ?? "tokens", + window: firstStringParam(params, ["subscription_window"]) ?? firstPayloadString(payload, ["subscription_window"]) ?? "monthly" + }); + } + + return { + connectors: [ + { + auth: "provider-api-key", + ...(body !== undefined ? { body } : {}), + endpoint, + ...(headers ? { headers } : {}), + mapping: { + meters + }, + method, + type: "http-json" + } + ], + enabled: true + }; +} + +function normalizeProviderAccountConfig(value: unknown): ProviderAccountConfig | undefined { + if (!isRecord(value)) { + return undefined; + } + + const connectorsValue = value.connectors ?? value.connector; + const connectors = Array.isArray(connectorsValue) + ? connectorsValue.filter(isRecord).map((connector) => ({ ...connector }) as ProviderAccountConnectorConfig) + : isRecord(connectorsValue) + ? [{ ...connectorsValue } as ProviderAccountConnectorConfig] + : undefined; + const refreshIntervalMs = typeof value.refreshIntervalMs === "number" && Number.isFinite(value.refreshIntervalMs) + ? value.refreshIntervalMs + : undefined; + + if (typeof value.enabled !== "boolean" && !connectors?.length && !refreshIntervalMs) { + return undefined; + } + + return { + ...(connectors?.length ? { connectors } : {}), + enabled: typeof value.enabled === "boolean" ? value.enabled : true, + ...(refreshIntervalMs && refreshIntervalMs > 0 ? { refreshIntervalMs } : {}) + }; +} + +function normalizeUsageMethod(value: string | undefined): "GET" | "POST" { + return value?.trim().toUpperCase() === "POST" ? "POST" : "GET"; +} + +function parseJsonRecordParam( + params: URLSearchParams, + payload: Record | undefined, + names: string[] +): Record | undefined { + const value = parseJsonValueParam(params, payload, names); + if (!isRecord(value)) { + return undefined; + } + const record: Record = {}; + for (const [key, item] of Object.entries(value)) { + if (key.trim() && typeof item === "string") { + record[key.trim()] = item; + } + } + return Object.keys(record).length > 0 ? record : undefined; +} + +function parseJsonValueParam( + params: URLSearchParams, + payload: Record | undefined, + names: string[] +): unknown { + for (const name of names) { + const payloadValue = payload?.[name]; + if (payloadValue !== undefined) { + return payloadValue; + } + const paramValue = params.get(name); + if (typeof paramValue === "string" && paramValue.trim()) { + try { + return JSON.parse(paramValue); + } catch { + return paramValue; + } + } + } + return undefined; +} + +function readPayloadRecord(params: URLSearchParams): Record | undefined { + const value = firstStringParam(params, ["payload"]); + if (!value) { + return undefined; + } + + const jsonText = value.trim().startsWith("{") ? value : decodeBase64Url(value); + const parsed = JSON.parse(jsonText) as unknown; + if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) { + throw new Error("Provider payload must be a JSON object."); + } + return parsed as Record; +} + +function decodeBase64Url(value: string): string { + const padded = value.replace(/-/g, "+").replace(/_/g, "/").padEnd(Math.ceil(value.length / 4) * 4, "="); + const binary = typeof atob === "function" + ? atob(padded) + : Buffer.from(padded, "base64").toString("binary"); + const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0)); + return new TextDecoder().decode(bytes); +} + +function firstStringParam(params: URLSearchParams, names: string[]): string | undefined { + for (const name of names) { + const value = params.get(name); + if (typeof value === "string" && value.trim()) { + return value.trim(); + } + } + return undefined; +} + +function firstPayloadString(payload: Record | undefined, names: string[]): string | undefined { + if (!payload) { + return undefined; + } + + for (const name of names) { + const value = payload[name]; + if (typeof value === "string" && value.trim()) { + return value.trim(); + } + } + return undefined; +} + +function boundedString(value: string | undefined, maxLength: number, label: string): string | undefined { + if (!value) { + return undefined; + } + if (value.length > maxLength) { + throw new Error(`${label} is too long.`); + } + return value; +} + +function validateProviderBaseUrl(value: string): void { + const url = new URL(providerUrlWithDefaultScheme(value)); + if (!["http:", "https:"].includes(url.protocol)) { + throw new Error("Provider Base URL must use http or https."); + } + if (!url.hostname) { + throw new Error("Provider Base URL is invalid."); + } +} + +function validateManifestUrl(value: string): void { + const url = new URL(value); + if (url.protocol !== "https:") { + throw new Error("Provider manifest URL must use https."); + } + if (url.username || url.password) { + throw new Error("Provider manifest URL cannot include credentials."); + } + if (!url.hostname) { + throw new Error("Provider manifest URL is invalid."); + } +} + +function normalizeProviderProtocol(value: string | undefined): GatewayProviderProtocol | undefined { + if (!value) { + return undefined; + } + const protocol = value.trim(); + if (!providerProtocols.has(protocol as GatewayProviderProtocol)) { + throw new Error(`Unsupported provider protocol: ${value}`); + } + return protocol as GatewayProviderProtocol; +} + +function readDeepLinkModels(params: URLSearchParams, payload: Record | undefined): string[] { + const values = [ + ...params.getAll("models"), + ...payloadModels(payload) + ]; + const seen = new Set(); + const models: string[] = []; + + for (const value of values) { + for (const model of splitModelValue(value)) { + if (model.length > maxModelLength) { + throw new Error("Model name is too long."); + } + if (seen.has(model)) { + continue; + } + seen.add(model); + models.push(model); + if (models.length > maxModels) { + throw new Error("Too many models in provider link."); + } + } + } + + return models; +} + +function payloadModels(payload: Record | undefined): string[] { + if (!payload) { + return []; + } + const value = payload.models; + if (Array.isArray(value)) { + return value + .map((item) => typeof item === "string" ? item : readPayloadModelId(item)) + .filter((item): item is string => Boolean(item)); + } + return typeof value === "string" ? [value] : []; +} + +function readDeepLinkModelDisplayNames( + params: URLSearchParams, + payload: Record | undefined, + models: string[] +): Record | undefined { + const modelIds = new Set(models); + const displayNames: Record = {}; + const addDisplayName = (rawModel: unknown, rawDisplayName: unknown) => { + const model = typeof rawModel === "string" ? rawModel.trim() : ""; + const displayName = typeof rawDisplayName === "string" ? rawDisplayName.trim() : ""; + if (!model || !displayName || model === displayName || !modelIds.has(model)) { + return; + } + if (displayName.length > maxModelLength) { + throw new Error("Model display name is too long."); + } + displayNames[model] = displayName; + }; + + const explicit = parseJsonValueParam(params, payload, ["modelDisplayNames", "model_display_names"]); + if (isRecord(explicit)) { + for (const [model, displayName] of Object.entries(explicit)) { + addDisplayName(model, displayName); + } + } + + const payloadModelList = Array.isArray(payload?.models) ? payload.models : []; + for (const item of payloadModelList) { + if (!isRecord(item)) { + continue; + } + addDisplayName(readPayloadModelId(item), readPayloadModelDisplayName(item)); + } + + return Object.keys(displayNames).length > 0 ? displayNames : undefined; +} + +function readDeepLinkModelDescriptions( + params: URLSearchParams, + payload: Record | undefined, + models: string[] +): Record | undefined { + const modelIds = new Set(models); + const descriptions: Record = {}; + const addDescription = (rawModel: unknown, rawDescription: unknown) => { + const model = typeof rawModel === "string" ? rawModel.trim() : ""; + const description = typeof rawDescription === "string" ? rawDescription.trim() : ""; + if (!model || !description || !modelIds.has(model)) { + return; + } + if (description.length > maxModelDescriptionLength) { + throw new Error("Model description is too long."); + } + descriptions[model] = description; + }; + + const explicit = parseJsonValueParam(params, payload, ["modelDescriptions", "model_descriptions"]); + if (isRecord(explicit)) { + for (const [model, description] of Object.entries(explicit)) { + addDescription(model, description); + } + } + + const payloadModelList = Array.isArray(payload?.models) ? payload.models : []; + for (const item of payloadModelList) { + if (!isRecord(item)) { + continue; + } + addDescription(readPayloadModelId(item), firstPayloadString(item, ["description", "desc", "summary"])); + } + + return Object.keys(descriptions).length > 0 ? descriptions : undefined; +} + +function readPayloadModelId(value: unknown): string | undefined { + if (!isRecord(value)) { + return undefined; + } + return firstPayloadString(value, ["id", "slug", "model", "name"]); +} + +function readPayloadModelDisplayName(value: Record): string | undefined { + return firstPayloadString(value, ["display_name", "displayName", "label", "name"]); +} + +function splitModelValue(value: string): string[] { + return value + .split(/[\n,]+/) + .map((item) => item.trim()) + .filter(Boolean); +} + +function readDeepLinkBoolean(params: URLSearchParams, payload: Record | undefined, names: string[]): boolean { + for (const name of names) { + if (!params.has(name)) { + continue; + } + const parsedParam = parseBoolean(params.get(name)); + return parsedParam ?? true; + } + + if (!payload) { + return false; + } + for (const name of names) { + const parsedPayload = parseBoolean(payload[name]); + if (parsedPayload !== undefined) { + return parsedPayload; + } + } + return false; +} + +function parseBoolean(value: unknown): boolean | undefined { + if (typeof value === "boolean") { + return value; + } + if (typeof value !== "string") { + return undefined; + } + const normalized = value.trim().toLowerCase(); + if (["1", "true", "yes", "y", "on"].includes(normalized)) { + return true; + } + if (["0", "false", "no", "n", "off"].includes(normalized)) { + return false; + } + return undefined; +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} diff --git a/packages/core/src/contracts/i18n.ts b/packages/core/src/contracts/i18n.ts new file mode 100644 index 0000000..4cc9c57 --- /dev/null +++ b/packages/core/src/contracts/i18n.ts @@ -0,0 +1,380 @@ +export type ErrorI18nLanguage = "en" | "zh"; + +const languagePreferenceStorageKey = "ccr.ui.language"; + +type PatternTranslator = { + pattern: RegExp; + translate: (...matches: string[]) => string; +}; + +const zhExactErrorMessages: Record = { + "Account endpoint returned a non-object payload.": "账户端点返回的内容不是对象。", + "Account endpoint returned malformed JSON.": "账户端点返回了格式错误的 JSON。", + "Base URL is required.": "Base URL 不能为空。", + "Browser controls are only available from the built-in browser window.": "浏览器控制仅可在内置浏览器窗口中使用。", + "Bot Gateway QR start response missing qrCodeUrl.": "Bot Gateway 扫码登录启动响应缺少 qrCodeUrl。", + "Bot Gateway QR start response missing sessionId.": "Bot Gateway 扫码登录启动响应缺少 sessionId。", + "Bot Gateway SDK client does not expose request().": "Bot Gateway SDK client 未暴露 request()。", + "CCR gateway did not start.": "CCR 网关未能启动。", + "Claude App opening is available from the CCR desktop app.": "Claude App 打开功能仅可在 CCR 桌面端使用。", + "Claude Code access token was not found.": "未找到 Claude Code access token。", + "Codex login token was not found.": "未找到 Codex 登录 token。", + "CONNECT target is missing.": "缺少 CONNECT 目标。", + "Core gateway auth token is not initialized.": "核心网关认证 token 尚未初始化。", + "Failed to start proxy mode.": "未能启动代理模式。", + "Gateway plugin service is not configured.": "网关插件服务尚未配置。", + "Local agent account credential was not found. Sign in again, then re-import the local login provider.": "未找到本机 Agent 账户凭据。请重新登录,然后重新导入本机登录供应商。", + "Local agent login is not importable.": "本机 Agent 登录态不可导入。", + "Local agent provider was not found.": "未找到本机 Agent 供应商。", + "MCP server must be saved before tool discovery.": "需要先保存 MCP 服务器后才能发现工具。", + "MCP server name is required.": "MCP 服务器名称不能为空。", + "Missing vision API key. Set VISION_API_KEY.": "缺少视觉 API Key。请设置 VISION_API_KEY。", + "Model name is too long.": "模型名称过长。", + "Network capture MCP is disabled.": "网络捕获 MCP 已禁用。", + "No available models": "没有可用模型", + "No available models. Configure at least one provider with a model before starting CCR Gateway or opening an agent through CCR.": "没有可用模型。请先配置至少一个包含模型的供应商,再启动 CCR 网关或通过 CCR 打开 Agent。", + "No Bot Gateway conversationRef is available for inbound bot response.": "没有可用于入站 Bot 响应的 Bot Gateway conversationRef。", + "No Bot Gateway conversationRef is configured and no inbound bot event context is available.": "未配置 Bot Gateway conversationRef,且没有可用的入站 Bot 事件上下文。", + "No endpoint candidates available.": "没有可用的端点候选项。", + "No search provider configured. Set SEARCH_PROVIDER and its API key.": "未配置搜索供应商。请设置 SEARCH_PROVIDER 及其 API Key。", + "No Wi-Fi/LAN targets found.": "未找到 Wi-Fi/LAN 目标。", + "Only http and https QR login URLs can be opened.": "只能打开 http 或 https 的扫码登录 URL。", + "Only http and https URLs can be opened.": "只能打开 http 或 https URL。", + "Plugin module must export a function, default plugin, or plugin object.": "插件模块必须导出函数、默认插件或插件对象。", + "Provider Base URL is invalid.": "供应商 Base URL 无效。", + "Provider Base URL must use http or https.": "供应商 Base URL 必须使用 http 或 https。", + "Provider link is too long.": "供应商链接过长。", + "Provider manifest must be a JSON object.": "供应商 manifest 必须是 JSON 对象。", + "Provider manifest URL cannot include credentials.": "供应商 manifest URL 不能包含凭据。", + "Provider manifest URL is invalid.": "供应商 manifest URL 无效。", + "Provider manifest URL must use https.": "供应商 manifest URL 必须使用 https。", + "Provider payload must be a JSON object.": "供应商载荷必须是 JSON 对象。", + "Proxy mode is not running.": "代理模式未运行。", + "Proxy request is missing Host header.": "代理请求缺少 Host 头。", + "Proxy service failed to start.": "代理服务未能启动。", + "QR window sessionId is required.": "二维码窗口 sessionId 不能为空。", + "Remote provider manifests cannot define sensitive Fetch usage headers.": "远程供应商 manifest 不能定义敏感的 Fetch 用量请求头。", + "Request body must be a JSON object.": "请求体必须是 JSON 对象。", + "Service did not start.": "服务未能启动。", + "Service paused.": "服务已暂停。", + "Service started.": "服务已启动。", + "Proxy is stopped.": "代理已停止。", + "Proxy restarted.": "代理已重启。", + "Too many models in provider link.": "供应商链接中的模型数量过多。", + "tools/call params must include a tool name.": "tools/call 参数必须包含工具名称。", + "This app build does not expose API key persistence. Rebuild and restart the Electron app.": "当前应用构建未暴露 API Key 持久化能力。请重新构建并重启 Electron App。", + "Unable to load @the-next-ai/bot-gateway-sdk.": "无法加载 @the-next-ai/bot-gateway-sdk。", + "Unsupported CCR link target.": "不支持的 CCR 链接目标。", + "Unsupported link protocol.": "不支持的链接协议。", + "Unknown error": "未知错误", + "ZCode profiles can only open the app; agent arguments are not supported.": "ZCode 配置档案只能打开 App,不支持 Agent 参数。", + "ZCode provider API key was not found in ZCode config.": "未在 ZCode 配置中找到供应商 API Key。" +}; + +const zhPatternErrorMessages: PatternTranslator[] = [ + { + pattern: /^(.+ App) was not found\. Install \1 or set ([A-Z0-9_]+) to its executable, then try again\.$/, + translate: (appName, envKey) => `${appName} 未找到。请安装 ${appName},或将 ${envKey} 设置为它的可执行文件后重试。` + }, + { + pattern: /^Profile launcher was not found: (.+)\. Re-save the profile and try again\.$/, + translate: (command) => `未找到配置档案启动器:${command}。请重新保存配置档案后重试。` + }, + { + pattern: /^Profile launcher was not found: (.+)\. Open CCR once or re-save the profile\.$/, + translate: (command) => `未找到配置档案启动器:${command}。请打开一次 CCR,或重新保存配置档案。` + }, + { + pattern: /^CCR CLI runtime was not found\. Rebuild or reinstall CCR and try again\.$/, + translate: () => "未找到 CCR CLI 运行时。请重新构建或重新安装 CCR 后重试。" + }, + { + pattern: /^CCR config was not found: (.+)$/, + translate: (file) => `未找到 CCR 配置:${file}` + }, + { + pattern: /^CCR config has no profiles: (.+)$/, + translate: (file) => `CCR 配置中没有配置档案:${file}` + }, + { + pattern: /^Profile "(.+)" is ambiguous\. Use the profile ID instead\.$/, + translate: (profile) => `配置档案 "${profile}" 不唯一。请改用配置档案 ID。` + }, + { + pattern: /^Profile "(.+)" was not found or is disabled\.$/, + translate: (profile) => `配置档案 "${profile}" 未找到或已禁用。` + }, + { + pattern: /^(.+) does not support ([A-Z]+) opening\.$/, + translate: (profile, surface) => `${profile} 不支持以 ${surface} 方式打开。` + }, + { + pattern: /^(.+) does not support stopping ([A-Z]+) from CCR\.$/, + translate: (profile, surface) => `${profile} 不支持从 CCR 停止 ${surface}。` + }, + { + pattern: /^No CCR API key was found for profile "(.+)"\. Re-save the profile and try again\.$/, + translate: (profile) => `未找到配置档案 "${profile}" 的 CCR API Key。请重新保存配置档案后重试。` + }, + { + pattern: /^(.+ App) did not open a window for (.+)\. Command: (.+) User data: (.+)$/, + translate: (appName, profile, command, userData) => `${appName} 没有为 ${profile} 打开窗口。命令:${command} 用户数据:${userData}` + }, + { + pattern: /^(.+ App) is already running with (.+)\.$/, + translate: (appName, profile) => `${appName} 已使用 ${profile} 运行。` + }, + { + pattern: /^Opened (.+ App) with (.+)\.$/, + translate: (appName, profile) => `已使用 ${profile} 打开 ${appName}。` + }, + { + pattern: /^Opened (.+)\.$/, + translate: (profile) => `已打开 ${profile}。` + }, + { + pattern: /^CCR gateway did not start for (.+)\.$/, + translate: (appName) => `${appName} 的 CCR 网关未能启动。` + }, + { + pattern: /^Core gateway endpoint is already in use: (.+)$/, + translate: (endpoint) => `核心网关端点已被占用:${endpoint}` + }, + { + pattern: /^Proxy restarted, but system proxy switching failed: (.+)$/, + translate: (detail) => `代理已重启,但系统代理切换失败:${translateErrorMessage("zh", detail)}` + }, + { + pattern: /^Proxy mode is running at (.+), but HTTPS CONNECT is not available(.*)\.$/, + translate: (endpoint, detail) => `代理模式正在 ${endpoint} 运行,但 HTTPS CONNECT 不可用${detail}。` + }, + { + pattern: /^Failed to start the dedicated proxy endpoint for the built-in browser\.$/, + translate: () => "未能启动内置浏览器专用代理端点。" + }, + { + pattern: /^Account endpoint returned HTTP ([0-9]+)(?:: ([\s\S]+))?\.$/, + translate: (status, detail = "") => `账户端点返回 HTTP ${status}${detail ? `:${detail}` : ""}。` + }, + { + pattern: /^Account endpoint returned non-JSON response(?: \((.+)\))?\.$/, + translate: (contentType = "") => `账户端点返回了非 JSON 响应${contentType ? `(${contentType})` : ""}。` + }, + { + pattern: /^Account connectors JSON is invalid: ([\s\S]+)$/, + translate: (detail) => `账户连接器 JSON 无效:${detail}` + }, + { + pattern: /^Usage request body JSON is invalid: ([\s\S]+)$/, + translate: (detail) => `用量请求体 JSON 无效:${detail}` + }, + { + pattern: /^Unsupported provider protocol: (.+)$/, + translate: (protocol) => `不支持的供应商协议:${protocol}` + }, + { + pattern: /^(.+) is too long\.$/, + translate: (label) => `${label} 过长。` + }, + { + pattern: /^(.+) from a remote manifest must use https\.$/, + translate: (label) => `远程 manifest 中的 ${label} 必须使用 https。` + }, + { + pattern: /^(.+) cannot include credentials\.$/, + translate: (label) => `${label} 不能包含凭据。` + }, + { + pattern: /^(.+) cannot target a local or internal host\.$/, + translate: (label) => `${label} 不能指向本机或内网主机。` + }, + { + pattern: /^(.+) is invalid\.$/, + translate: (label) => `${label} 无效。` + }, + { + pattern: /^Could not resolve host: (.+)$/, + translate: (hostname) => `无法解析主机:${hostname}` + }, + { + pattern: /^Remote manifest host resolved to a private or reserved address: (.+)$/, + translate: (address) => `远程 manifest 主机解析到了私有或保留地址:${address}` + }, + { + pattern: /^Invalid proxy endpoint: (.+)$/, + translate: (endpoint) => `代理端点无效:${endpoint}` + }, + { + pattern: /^Failed to start MITM server for (.+)$/, + translate: (hostname) => `未能为 ${hostname} 启动 MITM 服务。` + }, + { + pattern: /^MCP tools discovery timed out after ([0-9]+) ms\.$/, + translate: (timeout) => `MCP 工具发现超时(${timeout} ms)。` + }, + { + pattern: /^SSE MCP discovery failed with HTTP ([0-9]+)\.$/, + translate: (status) => `SSE MCP 发现失败,HTTP ${status}。` + }, + { + pattern: /^MCP discovery request failed with HTTP ([0-9]+)(?:: ([\s\S]+))?$/, + translate: (status, detail = "") => `MCP 发现请求失败,HTTP ${status}${detail ? `:${detail}` : ""}` + }, + { + pattern: /^Unknown network capture tool: (.+)$/, + translate: (tool) => `未知的网络捕获工具:${tool}` + }, + { + pattern: /^Network capture not found: (.+)$/, + translate: (id) => `未找到网络捕获:${id}` + }, + { + pattern: /^network_capture_get requires id\.$/, + translate: () => "network_capture_get 需要 id。" + }, + { + pattern: /^network_capture_set_enabled requires boolean enabled\.$/, + translate: () => "network_capture_set_enabled 需要布尔值 enabled。" + }, + { + pattern: /^Unknown fusion tool: (.+)$/, + translate: (tool) => `未知的 Fusion 工具:${tool}` + }, + { + pattern: /^(.+) requires prompt\.$/, + translate: (tool) => `${tool} 需要 prompt。` + }, + { + pattern: /^(.+) requires imageUrl, imagePath, imageBase64, or images\.$/, + translate: (tool) => `${tool} 需要 imageUrl、imagePath、imageBase64 或 images。` + }, + { + pattern: /^Missing (.+)\. Set (.+)\.$/, + translate: (label, envKey) => `缺少 ${label}。请设置 ${envKey}。` + }, + { + pattern: /^(Vision|Search) request failed \(([0-9]+)\): ([\s\S]+)$/, + translate: (kind, status, detail) => `${kind === "Vision" ? "视觉" : "搜索"}请求失败(${status}):${detail}` + }, + { + pattern: /^Invalid JSON from provider: ([\s\S]+)$/, + translate: (detail) => `供应商返回了无效 JSON:${detail}` + }, + { + pattern: /^Local image exceeds ([0-9]+) bytes: (.+)$/, + translate: (bytes, file) => `本地图片超过 ${bytes} 字节:${file}` + }, + { + pattern: /^Claude App CDP page target was not available on port ([0-9]+)(?:: ([\s\S]+))?\.$/, + translate: (port, detail = "") => `端口 ${port} 上没有可用的 Claude App CDP 页面目标${detail ? `:${detail}` : ""}。` + }, + { + pattern: /^CDP (.+) returned HTTP ([0-9]+)$/, + translate: (endpoint, status) => `CDP ${endpoint} 返回 HTTP ${status}` + }, + { + pattern: /^Timed out waiting for (?:ChatGPT|Codex App) response: (.+)$/, + translate: (requestId) => `等待 ChatGPT 响应超时:${requestId}` + }, + { + pattern: /^No active turn for thread (.+)$/, + translate: (threadId) => `线程 ${threadId} 没有活跃回合。` + }, + { + pattern: /^thread not found: (.+)$/, + translate: (threadId) => `未找到线程:${threadId}` + }, + { + pattern: /^Backend (.+) failed to start\.$/, + translate: (backend) => `后端 ${backend} 未能启动。` + }, + { + pattern: /^Plugin (.+) registered a gateway route without path or pathPrefix\.$/, + translate: (pluginId) => `插件 ${pluginId} 注册了缺少 path 或 pathPrefix 的网关路由。` + }, + { + pattern: /^Plugin (.+) registered a proxy route without host\.$/, + translate: (pluginId) => `插件 ${pluginId} 注册了缺少 host 的代理路由。` + }, + { + pattern: /^Plugin (.+) registered an invalid provider account connector\.$/, + translate: (pluginId) => `插件 ${pluginId} 注册了无效的供应商账户连接器。` + }, + { + pattern: /^HTTP ([0-9]+)$/, + translate: (status) => `HTTP ${status}` + } +]; + +export function resolveErrorI18nLanguage( + preference: string | undefined | null, + languages: readonly string[] = [] +): ErrorI18nLanguage { + if (preference === "en" || preference === "zh") { + return preference; + } + return languages.some((language) => language.toLowerCase().startsWith("zh")) ? "zh" : "en"; +} + +export function browserErrorI18nLanguage(): ErrorI18nLanguage { + const preference = readBrowserLanguagePreference(); + const languages = typeof navigator !== "undefined" + ? (navigator.languages?.length ? navigator.languages : [navigator.language]) + : []; + return resolveErrorI18nLanguage(preference, languages); +} + +export function formatLocalizedErrorMessage(language: ErrorI18nLanguage, error: unknown): string { + return translateErrorMessage(language, error instanceof Error ? error.message : String(error)); +} + +export function translateErrorMessage(language: ErrorI18nLanguage, message: string): string { + const trimmed = message.trim(); + if (!trimmed) { + return message; + } + + const invokingRemoteMethod = trimmed.match(/^Error invoking remote method '([^']+)': Error: ([\s\S]+)$/); + if (invokingRemoteMethod) { + return translateErrorMessage(language, invokingRemoteMethod[2]); + } + + const invokingRemoteMethodWithoutError = trimmed.match(/^Error invoking remote method '([^']+)': ([\s\S]+)$/); + if (invokingRemoteMethodWithoutError) { + return translateErrorMessage(language, invokingRemoteMethodWithoutError[2]); + } + + const withChecked = trimmed.match(/^([\s\S]*?)\s+Checked:\s+([\s\S]+)$/); + if (withChecked) { + return translateErrorMessage(language, withChecked[1]); + } + + if (language !== "zh") { + return trimmed; + } + + const exact = zhExactErrorMessages[trimmed]; + if (exact) { + return exact; + } + + for (const translator of zhPatternErrorMessages) { + const match = trimmed.match(translator.pattern); + if (match) { + return translator.translate(...match.slice(1)); + } + } + + return message; +} + +function readBrowserLanguagePreference(): string | undefined { + if (typeof window === "undefined") { + return undefined; + } + try { + return window.localStorage.getItem(languagePreferenceStorageKey) ?? undefined; + } catch { + return undefined; + } +} diff --git a/packages/core/src/contracts/ipc-channels.ts b/packages/core/src/contracts/ipc-channels.ts new file mode 100644 index 0000000..6a89c08 --- /dev/null +++ b/packages/core/src/contracts/ipc-channels.ts @@ -0,0 +1,86 @@ +export const IPC_CHANNELS = { + appBeforeQuit: "ccr:app:before-quit", + appCaptureElementPng: "ccr:app:capture-element-png", + appCloseTray: "ccr:app:close-tray", + appDetectProviderIcon: "ccr:app:detect-provider-icon", + appExportData: "ccr:app:export-data", + appGetConfig: "ccr:app:get-config", + appGetAgentAnalysis: "ccr:app:get-agent-analysis", + appGetAgentTracePayload: "ccr:app:get-agent-trace-payload", + appGetGatewayStatus: "ccr:app:get-gateway-status", + appGetInfo: "ccr:app:get-info", + appGetOnboardingFinished: "ccr:app:get-onboarding-finished", + appGetPendingProviderDeepLinks: "ccr:app:get-pending-provider-deep-links", + appGetProfileOpenCommand: "ccr:app:get-profile-open-command", + appGetProfileRuntimeStatus: "ccr:app:get-profile-runtime-status", + appGetLocalAgentProviderCandidates: "ccr:app:get-local-agent-provider-candidates", + appGetProviderAccountSnapshots: "ccr:app:get-provider-account-snapshots", + appGetProviderCatalogModels: "ccr:app:get-provider-catalog-models", + appGetProviderPresets: "ccr:app:get-provider-presets", + appGetProxyCertificateStatus: "ccr:app:get-proxy-certificate-status", + appGetProxyNetworkCaptures: "ccr:app:get-proxy-network-captures", + appGetProxyStatus: "ccr:app:get-proxy-status", + appGetRequestLogDetail: "ccr:app:get-request-log-detail", + appGetRequestLogs: "ccr:app:get-request-logs", + appGetUpdateStatus: "ccr:app:get-update-status", + appGetUsageStats: "ccr:app:get-usage-stats", + appFetchProviderManifest: "ccr:app:fetch-provider-manifest", + appInstallProxyCertificate: "ccr:app:install-proxy-certificate", + appImportLocalAgentProvider: "ccr:app:import-local-agent-provider", + appListMcpServerTools: "ccr:app:list-mcp-server-tools", + appOpenBuiltInBrowser: "ccr:app:open-built-in-browser", + appOpenExternal: "ccr:app:open-external", + appOpenSettings: "ccr:app:open-settings", + appOpenUpdate: "ccr:app:open-update", + appOpenProfile: "ccr:app:open-profile", + appApplyClaudeAppGateway: "ccr:app:apply-claude-app-gateway", + appApplyProfile: "ccr:app:apply-profile", + appBotGatewayQrLoginCancel: "ccr:app:bot-gateway-qr-login-cancel", + appBotGatewayQrLoginStart: "ccr:app:bot-gateway-qr-login-start", + appBotGatewayQrLoginWait: "ccr:app:bot-gateway-qr-login-wait", + appBotGatewayQrWindowClose: "ccr:app:bot-gateway-qr-window-close", + appBotGatewayQrWindowOpen: "ccr:app:bot-gateway-qr-window-open", + appBotHandoffBluetoothTargetsScan: "ccr:app:bot-handoff-bluetooth-targets-scan", + appBotHandoffWifiTargetsScan: "ccr:app:bot-handoff-wifi-targets-scan", + appCheckProviderConnectivity: "ccr:app:check-provider-connectivity", + appProbeLocalAgentProvider: "ccr:app:probe-local-agent-provider", + appProbeProvider: "ccr:app:probe-provider", + appProbeProviderCandidates: "ccr:app:probe-provider-candidates", + appProviderDeepLink: "ccr:app:provider-deep-link", + appGetPluginMarketplace: "ccr:app:get-plugin-marketplace", + appPrepareImageExportTarget: "ccr:app:prepare-image-export-target", + appQuit: "ccr:app:quit", + appRevealProxyCertificate: "ccr:app:reveal-proxy-certificate", + appRenderHtmlPng: "ccr:app:render-html-png", + appRestartProxy: "ccr:app:restart-proxy", + appRestartGateway: "ccr:app:restart-gateway", + appResetCodexRateLimitCredit: "ccr:app:reset-codex-rate-limit-credit", + appSaveApiKeys: "ccr:app:save-api-keys", + appClearProxyNetworkCaptures: "ccr:app:clear-proxy-network-captures", + appStartGateway: "ccr:app:start-gateway", + appStopGateway: "ccr:app:stop-gateway", + appStopProfile: "ccr:app:stop-profile", + appSaveConfig: "ccr:app:save-config", + appSetOnboardingFinished: "ccr:app:set-onboarding-finished", + appSetTrayDetailOpen: "ccr:app:set-tray-detail-open", + appSetProxyNetworkCaptureEnabled: "ccr:app:set-proxy-network-capture-enabled", + appSelectPluginDirectory: "ccr:app:select-plugin-directory", + appShowMainWindow: "ccr:app:show-main-window", + appTestProviderAccountConnector: "ccr:app:test-provider-account-connector", + appUpdateCheck: "ccr:app:update-check", + appUpdateDownload: "ccr:app:update-download", + appUpdateInstall: "ccr:app:update-install", + appUpdateStatusChanged: "ccr:app:update-status-changed", + browserBack: "ccr:browser:back", + browserCloseTab: "ccr:browser:close-tab", + browserForward: "ccr:browser:forward", + browserGetChromeLoginImport: "ccr:browser:get-chrome-login-import", + browserGetState: "ccr:browser:get-state", + browserNavigate: "ccr:browser:navigate", + browserNewTab: "ccr:browser:new-tab", + browserReload: "ccr:browser:reload", + browserResolveAutomationHandoff: "ccr:browser:resolve-automation-handoff", + browserSelectTab: "ccr:browser:select-tab", + browserStartChromeLoginImport: "ccr:browser:start-chrome-login-import", + browserStateChanged: "ccr:browser:state-changed" +} as const; diff --git a/packages/core/src/entrypoints/server.ts b/packages/core/src/entrypoints/server.ts new file mode 100644 index 0000000..2059d8a --- /dev/null +++ b/packages/core/src/entrypoints/server.ts @@ -0,0 +1,129 @@ +#!/usr/bin/env node +import { startWebManagementServer } from "@ccr/core/web/management-server"; + +type CoreServerOptions = { + help: boolean; + host?: string; + open: boolean; + port?: number; + startGateway: boolean; +}; + +export async function runCoreServer(args = process.argv.slice(2)): Promise { + const options = parseCoreServerArgs(args); + if (options.help) { + printHelp(); + return; + } + + const runtime = await startWebManagementServer({ + host: options.host, + open: options.open, + port: options.port, + startGateway: options.startGateway + }); + process.stdout.write(`CCR core server is running at ${runtime.url}\n`); + + let closing = false; + const shutdown = (signal: NodeJS.Signals) => { + if (closing) { + return; + } + closing = true; + void runtime.close().finally(() => { + process.exit(signal === "SIGINT" ? 130 : 143); + }); + }; + process.once("SIGINT", shutdown); + process.once("SIGTERM", shutdown); + await new Promise(() => undefined); +} + +function parseCoreServerArgs(args: string[]): CoreServerOptions { + const options: CoreServerOptions = { + help: false, + open: false, + startGateway: true + }; + + for (let index = 0; index < args.length; index += 1) { + const arg = args[index]; + if (arg === "--help" || arg === "-h") { + options.help = true; + continue; + } + if (arg === "--open") { + options.open = true; + continue; + } + if (arg === "--no-open") { + options.open = false; + continue; + } + if (arg === "--gateway") { + options.startGateway = true; + continue; + } + if (arg === "--no-gateway") { + options.startGateway = false; + continue; + } + if (arg === "--host") { + index += 1; + options.host = requiredArg(args[index], "--host"); + continue; + } + if (arg.startsWith("--host=")) { + options.host = requiredArg(arg.slice("--host=".length), "--host"); + continue; + } + if (arg === "--port") { + index += 1; + options.port = parsePort(requiredArg(args[index], "--port")); + continue; + } + if (arg.startsWith("--port=")) { + options.port = parsePort(requiredArg(arg.slice("--port=".length), "--port")); + continue; + } + throw new Error(`Unknown core server option: ${arg}`); + } + + return options; +} + +function printHelp(): void { + process.stdout.write([ + "Usage:", + " ccr-core-server [--host ] [--port ] [--no-gateway]", + "", + "Options:", + " --host Management server host. Defaults to CCR_WEB_HOST or 127.0.0.1.", + " --port Management server port. Defaults to CCR_WEB_PORT or 3458.", + " --no-gateway Start only the web management server.", + "", + "Environment:", + " CCR_WEB_AUTH_TOKEN Use this token for management UI and RPC authentication." + ].join("\n") + "\n"); +} + +function requiredArg(value: string | undefined, flag: string): string { + if (!value) { + throw new Error(`Missing value for ${flag}`); + } + return value; +} + +function parsePort(value: string): number { + const port = Number(value); + if (!Number.isInteger(port) || port <= 0 || port > 65535) { + throw new Error(`Invalid port: ${value}`); + } + return port; +} + +runCoreServer().catch((error) => { + const message = error instanceof Error ? error.message : String(error); + process.stderr.write(`${message}\n`); + process.exitCode = 1; +}); diff --git a/packages/core/src/gateway/claude-code-router-plugin.ts b/packages/core/src/gateway/claude-code-router-plugin.ts new file mode 100644 index 0000000..579ea5d --- /dev/null +++ b/packages/core/src/gateway/claude-code-router-plugin.ts @@ -0,0 +1,1310 @@ +import { createRequire } from "node:module"; +import { EventEmitter } from "node:events"; +import os from "node:os"; +import path from "node:path"; +import { availableGatewayModelIds, type AppConfig, type RouterBuiltInAgentRuleId, type RouterConfig, type RouterFallbackConfig, type RouterRule, type RouterRuleCondition, type RouterRuleRewrite } from "@ccr/core/contracts/app"; +import { CONFIGDIR } from "@ccr/core/config/constants"; + +type HeaderValue = string | string[] | undefined; + +export type MutableRequestLike = { + builtInSubagentModel?: string; + body: Record; + headers: Record; + log: Pick; + method: string; + sessionId?: string; + tokenCount?: number; + url: string; +}; + +export type ClaudeCodeRouteDecision = { + fallback?: RouterFallbackConfig; + model?: string; + reason: string; + sessionId?: string; + tokenCount: number; +}; + +type ConfiguredRouteDecision = { + fallback?: RouterFallbackConfig; + model?: string; + reason: string; + rewrite?: RouterRuleRewrite; + rewrites?: RouterRuleRewrite[]; +}; + +const requireFromHere = createRequire(__filename); + +export class ClaudeCodeRouterPlugin { + private readonly event = new EventEmitter(); + + constructor(private readonly config: AppConfig) {} + + async routeRequest(input: { + body: Record; + headers: Record; + method: string; + url: string; + }): Promise<{ body: Record; decision: ClaudeCodeRouteDecision }> { + const body = cloneRecord(input.body); + const request: MutableRequestLike = { + body, + headers: input.headers, + log: console, + method: input.method, + url: input.url + }; + if (builtInAgentRouteMatches(request, this.config, "claude-code")) { + injectClaudeCodeAgentToolDescription(body, this.config); + injectClaudeCodeToolHubInstructions(body, this.config); + removeClaudeCodeBillingSystemHeader(body); + request.builtInSubagentModel = extractAndRemoveClaudeCodeSubagentModelTag(body); + } + const sessionId = resolveSessionId(body, input.headers); + const tokenCount = calculateTokenCount(body.messages, body.system, body.tools); + request.sessionId = sessionId; + request.tokenCount = tokenCount; + + const customModel = await this.resolveCustomRoute(request); + const configuredDecision = resolveConfiguredRouteDecision(request, this.config); + if (customModel) { + body.model = customModel; + } else { + if (configuredDecision.rewrites?.length) { + for (const rewrite of configuredDecision.rewrites) { + applyRouterRewrite(rewrite, request); + } + } else if (configuredDecision.rewrite) { + applyRouterRewrite(configuredDecision.rewrite, request); + } + if (configuredDecision.model) { + body.model = configuredDecision.model; + } + } + const routedModel = customModel ?? configuredDecision.model ?? readString(body.model); + + return { + body, + decision: { + fallback: customModel ? this.config.Router.fallback : configuredDecision.fallback, + model: routedModel, + reason: customModel ? "custom-router" : configuredDecision.reason, + sessionId, + tokenCount + } + }; + } + + countTokens(body: Record) { + return { + input_tokens: calculateTokenCount(body.messages, body.system, body.tools) + }; + } + + private async resolveCustomRoute(request: MutableRequestLike): Promise { + const routerPath = this.config.CUSTOM_ROUTER_PATH; + if (!routerPath) { + return undefined; + } + + try { + const resolvedRouterPath = resolveCustomRouterModule(routerPath); + delete requireFromHere.cache[resolvedRouterPath]; + const loaded = requireFromHere(resolvedRouterPath) as unknown; + const customRouter = typeof loaded === "function" ? loaded : readDefaultFunction(loaded); + if (!customRouter) { + request.log.warn(`Custom router does not export a function: ${routerPath}`); + return undefined; + } + const result = await customRouter(request, this.config, { event: this.event }); + return normalizeRouteSelector(typeof result === "string" ? result : undefined); + } catch (error) { + request.log.error(`Failed to load custom router "${routerPath}": ${formatError(error)}`); + return undefined; + } + } +} + +function resolveCustomRouterModule(routerPath: string): string { + const resolved = requireFromHere.resolve(resolveLocalModulePath(routerPath, "Custom router")); + assertJavaScriptModulePath(resolved, "Custom router"); + return resolved; +} + +function resolveLocalModulePath(value: string, label: string): string { + const trimmed = value.trim(); + if (!trimmed) { + throw new Error(`${label} path is required.`); + } + + const expanded = expandHome(trimmed); + if (path.isAbsolute(expanded)) { + return expanded; + } + if (isProtocolSpecifier(expanded)) { + throw new Error(`${label} must be a local JavaScript file path, not a URL or protocol specifier.`); + } + if (!expanded.startsWith(".")) { + throw new Error(`${label} must be an explicit local JavaScript path. Package specifiers are not loaded from configuration.`); + } + + const resolved = path.resolve(CONFIGDIR, expanded); + if (!isPathInside(resolved, CONFIGDIR)) { + throw new Error(`${label} relative paths must stay inside the CCR config directory.`); + } + return resolved; +} + +function assertJavaScriptModulePath(resolved: string, label: string): void { + const extension = path.extname(resolved).toLowerCase(); + if (![".cjs", ".js", ".mjs"].includes(extension)) { + throw new Error(`${label} must resolve to a JavaScript module file.`); + } +} + +function expandHome(value: string): string { + if (value === "~") { + return os.homedir(); + } + if (value.startsWith("~/")) { + return path.join(os.homedir(), value.slice(2)); + } + return value; +} + +function isProtocolSpecifier(value: string): boolean { + return /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(value); +} + +function isPathInside(file: string, root: string): boolean { + const relative = path.relative(root, file); + return relative === "" || (Boolean(relative) && !relative.startsWith("..") && !path.isAbsolute(relative)); +} + +function resolveConfiguredRouteDecision( + request: MutableRequestLike, + config: AppConfig +): ConfiguredRouteDecision { + const builtInSubagentDecision = resolveBuiltInClaudeCodeSubagentRouteDecision(request, config); + if (builtInSubagentDecision) { + return builtInSubagentDecision; + } + + const requestedModel = readString(request.body.model); + const explicitModel = normalizeRouteSelector(requestedModel); + if (explicitModel && isKnownInlineRoute(explicitModel, config)) { + return { fallback: config.Router.fallback, model: explicitModel, reason: "inline-model" }; + } + + const router = config.Router; + const builtInDecision = resolveBuiltInAgentRouteDecision(request, config); + const rules = router.rules ?? []; + for (const rule of rules) { + const decision = resolveRouterRule(rule, request, router); + if (decision) { + return builtInDecision ? mergeConfiguredRouteDecisions(builtInDecision, decision) : decision; + } + } + + if (builtInDecision) { + return builtInDecision; + } + + return { fallback: router.fallback, model: explicitModel, reason: "default" }; +} + +function mergeConfiguredRouteDecisions( + base: ConfiguredRouteDecision, + override: ConfiguredRouteDecision +): ConfiguredRouteDecision { + const rewrites = [ + ...configuredRouteDecisionRewrites(base), + ...configuredRouteDecisionRewrites(override) + ]; + return { + fallback: override.fallback ?? base.fallback, + model: override.model ?? base.model, + reason: override.reason, + ...(rewrites.length === 1 ? { rewrite: rewrites[0] } : {}), + ...(rewrites.length > 0 ? { rewrites } : {}) + }; +} + +function configuredRouteDecisionRewrites(decision: ConfiguredRouteDecision): RouterRuleRewrite[] { + if (decision.rewrites?.length) { + return decision.rewrites; + } + return decision.rewrite ? [decision.rewrite] : []; +} + +function resolveBuiltInClaudeCodeSubagentRouteDecision( + request: MutableRequestLike, + config: AppConfig +): ConfiguredRouteDecision | undefined { + if (!builtInAgentRouteMatches(request, config, "claude-code")) { + return undefined; + } + const target = normalizeRouteSelector(request.builtInSubagentModel); + if (!target || isSubagentModelPlaceholder(target) || !isKnownInlineRoute(target, config)) { + return undefined; + } + return { + fallback: config.Router.fallback, + model: target, + reason: "builtin:claude-code-subagent", + rewrite: { + key: "request.body.model", + operation: "set", + value: target + } + }; +} + +function resolveBuiltInAgentRouteDecision( + request: MutableRequestLike, + config: AppConfig +): ConfiguredRouteDecision | undefined { + for (const agent of builtInAgentRuleIds) { + if (!builtInAgentRouteMatches(request, config, agent)) { + continue; + } + const target = resolveBuiltInAgentRouteTarget(config, agent); + if (!target) { + continue; + } + return { + fallback: config.Router.fallback, + model: target, + reason: `builtin:${agent}`, + rewrite: { + key: "request.body.model", + operation: "set", + value: target + } + }; + } + return undefined; +} + +const builtInAgentRuleIds: RouterBuiltInAgentRuleId[] = ["claude-code", "codex"]; + +function builtInAgentRouteMatches( + request: MutableRequestLike, + config: AppConfig, + agent: RouterBuiltInAgentRuleId +): boolean { + if (config.Router.builtInRules?.[agent]?.enabled === false) { + return false; + } + if (!resolveBuiltInAgentProfile(config, agent)) { + return false; + } + const userAgent = readRequestHeader(request.headers, "user-agent")?.toLowerCase() ?? ""; + return userAgent.includes(builtInAgentUserAgentNeedle(agent)); +} + +function resolveBuiltInAgentProfile(config: AppConfig, agent: RouterBuiltInAgentRuleId) { + if (config.profile.enabled === false) { + return undefined; + } + return config.profile.profiles.find((profile) => profile.enabled && profile.agent === agent); +} + +function resolveBuiltInAgentRouteTarget(config: AppConfig, agent: RouterBuiltInAgentRuleId): string | undefined { + return normalizeRouteSelector(resolveBuiltInAgentProfile(config, agent)?.model); +} + +function builtInAgentUserAgentNeedle(agent: RouterBuiltInAgentRuleId): string { + return agent === "claude-code" ? "claude" : "codex"; +} + +const ccrSubagentModelOpenTag = ""; +const ccrSubagentModelCloseTag = ""; +const ccrSubagentModelTagExample = `${ccrSubagentModelOpenTag}Provider/model${ccrSubagentModelCloseTag}`; +const ccrSubagentModelPlaceholder = "provider/model"; +const claudeCodeBillingSystemHeaderPrefix = "x-anthropic-billing-header"; +const ccrSubagentToolModelInstruction = + `CCR subagent routing is enabled. When calling this tool, the prompt parameter MUST start with ` + + `${ccrSubagentModelTagExample} on its own first line, replacing Provider/model with the best configured CCR gateway model. ` + + `CCR consumes the tag, removes it from the prompt, and routes the spawned agent request to that model. ` + + `Do not omit the tag, do not put it in description or subagent_type, and do not rely on the tool model enum for CCR-specific models. ` + + `中文要求:调用该工具时,prompt 参数第一行必须写入 ${ccrSubagentModelTagExample},并将 Provider/model 替换成最适合的 CCR 模型。`; +const ccrWorkflowSubagentModelInstruction = + `CCR workflow subagent routing is enabled. When this workflow creates Agent/Task subagents, each spawned agent prompt MUST start with ` + + `${ccrSubagentModelTagExample} on its own first line, replacing Provider/model with the best configured CCR gateway model. ` + + `Put the tag inside the Agent/Task prompt created by the workflow, not in the workflow description or subagent_type. ` + + `CCR consumes the tag from the spawned agent request, removes it, and routes that request to the selected model. ` + + `Do not rely on the Agent/Task model enum for CCR-specific models. ` + + `中文要求:Workflow 中创建 Agent/Task 时,每个被创建 agent 的 prompt 第一行必须写入 ${ccrSubagentModelTagExample},并替换成最适合的 CCR 模型。`; +const ccrSubagentPromptFieldInstruction = + `CCR subagent routing is enabled. This prompt string MUST start with ${ccrSubagentModelTagExample} on its own first line, ` + + `with Provider/model replaced by one configured CCR gateway model. Put the subagent task after that line; CCR removes the tag before the subagent runs. ` + + `中文要求:这个 prompt 字符串第一行必须是替换后的模型标签,后面再写 subagent 任务正文。`; +type ClaudeCodeSubagentToolKind = "subagent" | "workflow"; +const claudeCodeAgentToolNames = new Set(["agent", "task"]); +const claudeCodeWorkflowToolNames = new Set(["workflow"]); +const ccrToolHubSystemInstructionMarker = "CCR ToolHub tool resolution is enabled."; + +function claudeCodeToolName(tool: Record): string | undefined { + const functionSpec = isRecord(tool.function) ? tool.function : undefined; + return readString(tool.name) ?? readString(functionSpec?.name); +} + +function normalizeClaudeCodeToolName(toolName: string | undefined): string { + return toolName?.toLowerCase().replace(/[-._]/g, "") ?? ""; +} + +function injectClaudeCodeToolHubInstructions(body: Record, config: AppConfig): void { + if (!config.toolHub?.enabled || !Array.isArray(body.tools)) { + return; + } + const toolNames = claudeCodeToolHubToolNames(body.tools); + if (!toolNames.resolve) { + return; + } + const invokeName = toolNames.invoke ?? "tool_hub.invoke"; + appendSystemInstruction(body, [ + ccrToolHubSystemInstructionMarker, + `The ToolHub search/resolution tool is ${toolNames.resolve}; call this actual tool, do not merely mention its name in text.`, + `You MUST call the ToolHub search/resolution tool ${toolNames.resolve} before answering any request that asks about external services, installed MCP capabilities, business APIs, orders, coupons, stores, accounts, available tools, or capabilities that are not already obvious from the eager tools.`, + `Do this even if the user did not mention ToolHub or ${toolNames.resolve}. Only skip the ToolHub search/resolution tool when the request is clearly local code/file/shell work or simple conversation that does not need an external or MCP capability.`, + `If ${toolNames.resolve} returns selected tools, call the ToolHub invocation tool ${invokeName} to run the selected tool instead of telling the user that no such capability is available.`, + "When the ToolHub resolve result includes executionPlanJs or workflowSketch, treat that JavaScript as the invocation dependency plan: await means serial order, and only callTool calls grouped inside the same Promise.all may be issued in parallel.", + "Use the user's request as the task and include concise context when resolving. Do not ask the user to name the MCP tool unless the task is genuinely ambiguous after resolution." + ].join("\n")); +} + +function claudeCodeToolHubToolNames(tools: unknown[]): { invoke?: string; resolve?: string } { + const names: { invoke?: string; resolve?: string } = {}; + for (const tool of tools) { + if (!isRecord(tool)) { + continue; + } + const name = claudeCodeToolName(tool); + const normalized = normalizeClaudeCodeToolName(name); + if (normalized.endsWith("toolhubresolve") && shouldUseClaudeCodeToolHubName(names.resolve, name)) { + names.resolve = name; + } + if (normalized.endsWith("toolhubinvoke") && shouldUseClaudeCodeToolHubName(names.invoke, name)) { + names.invoke = name; + } + } + return names; +} + +function shouldUseClaudeCodeToolHubName(current: string | undefined, candidate: string | undefined): boolean { + if (!candidate) { + return false; + } + if (!current) { + return true; + } + return claudeCodeToolHubNameScore(candidate) > claudeCodeToolHubNameScore(current); +} + +function claudeCodeToolHubNameScore(name: string): number { + const normalized = name.toLowerCase(); + if (normalized.startsWith("mcp__ccr-toolhub__") || normalized.startsWith("mcp__ccr_toolhub__")) { + return 3; + } + if (normalized.startsWith("mcp__") && normalized.includes("toolhub")) { + return 2; + } + if (normalized.startsWith("mcp__")) { + return 1; + } + return 0; +} + +function appendSystemInstruction(body: Record, instruction: string): void { + if (systemContainsInstruction(body.system, ccrToolHubSystemInstructionMarker)) { + return; + } + if (typeof body.system === "string") { + body.system = body.system.trim() ? `${body.system}\n\n${instruction}` : instruction; + return; + } + if (Array.isArray(body.system)) { + body.system.push({ text: instruction, type: "text" }); + return; + } + if (body.system === undefined) { + body.system = [{ text: instruction, type: "text" }]; + } +} + +function systemContainsInstruction(system: unknown, marker: string): boolean { + if (typeof system === "string") { + return system.includes(marker); + } + if (!Array.isArray(system)) { + return false; + } + return system.some((block) => typeof block === "string" + ? block.includes(marker) + : isRecord(block) && typeof block.text === "string" && block.text.includes(marker)); +} + +function injectClaudeCodeAgentToolDescription(body: Record, config: AppConfig): void { + if (!Array.isArray(body.tools)) { + return; + } + + const instructions = claudeCodeAgentToolInstructions(config); + if (!instructions) { + return; + } + for (const tool of body.tools) { + if (!isRecord(tool)) { + continue; + } + const toolKind = claudeCodeSubagentToolKind(tool); + if (!toolKind) { + continue; + } + appendToolDescriptionInstruction(tool, toolKind === "workflow" ? instructions.workflow : instructions.tool); + if (toolKind === "subagent") { + appendPromptSchemaDescriptionInstruction(tool, instructions.prompt); + } + } +} + +function claudeCodeSubagentToolKind(tool: Record): ClaudeCodeSubagentToolKind | undefined { + const functionSpec = isRecord(tool.function) ? tool.function : undefined; + const name = readString(tool.name)?.toLowerCase() ?? readString(functionSpec?.name)?.toLowerCase(); + if (!name) { + return undefined; + } + if (claudeCodeAgentToolNames.has(name)) { + return "subagent"; + } + if (claudeCodeWorkflowToolNames.has(name)) { + return "workflow"; + } + return undefined; +} + +function appendToolDescriptionInstruction(tool: Record, instruction: string): void { + if (isRecord(tool.function)) { + tool.function.description = appendDescriptionInstruction(readOptionalString(tool.function.description), instruction); + return; + } + tool.description = appendDescriptionInstruction(readOptionalString(tool.description), instruction); +} + +function appendPromptSchemaDescriptionInstruction(tool: Record, instruction: string): void { + const functionSpec = isRecord(tool.function) ? tool.function : undefined; + const schema = isRecord(tool.input_schema) + ? tool.input_schema + : isRecord(tool.inputSchema) + ? tool.inputSchema + : isRecord(functionSpec?.parameters) + ? functionSpec.parameters + : undefined; + const properties = isRecord(schema?.properties) ? schema.properties : undefined; + const prompt = isRecord(properties?.prompt) ? properties.prompt : undefined; + if (!prompt) { + return; + } + prompt.description = appendDescriptionInstruction(readOptionalString(prompt.description), instruction); +} + +function appendDescriptionInstruction(description: string | undefined, instruction: string): string { + const existing = description?.trim() ?? ""; + if (existing.includes(ccrSubagentModelOpenTag)) { + return existing; + } + return existing ? `${existing}\n\n${instruction}` : instruction; +} + +function claudeCodeAgentToolInstructions(config: AppConfig): { prompt: string; tool: string; workflow: string } | undefined { + const modelRows = configuredSubagentModelDescriptionRows(config); + if (modelRows.length === 0) { + return undefined; + } + const modelList = [ + "Configured CCR gateway models:", + ...modelRows + ].join("\n"); + return { + prompt: [ + ccrSubagentPromptFieldInstruction, + "", + modelList + ].join("\n"), + tool: [ + ccrSubagentToolModelInstruction, + "", + modelList + ].join("\n"), + workflow: [ + ccrWorkflowSubagentModelInstruction, + "", + modelList + ].join("\n") + }; +} + +function configuredSubagentModelDescriptionRows(config: AppConfig): string[] { + const candidates: Array<{ key: string; row: string; selector: string }> = []; + for (const provider of config.Providers) { + const providerName = provider.name?.trim(); + if (!providerName || !Array.isArray(provider.models)) { + continue; + } + for (const rawModel of provider.models) { + const model = rawModel.trim(); + const description = provider.modelDescriptions?.[model]?.trim(); + if (!model || !description) { + continue; + } + const selector = `${providerName}/${model}`; + const key = selector.toLowerCase(); + const displayName = provider.modelDisplayNames?.[model]?.trim(); + const label = displayName && displayName !== model ? `${selector} (${displayName})` : selector; + candidates.push({ + key, + row: `- ${label}: ${singleLineText(description, 320)}`, + selector + }); + } + } + candidates.sort(compareSubagentModelDescriptionRows); + + const rows: string[] = []; + const seen = new Set(); + for (const candidate of candidates) { + if (seen.has(candidate.key)) { + continue; + } + seen.add(candidate.key); + rows.push(candidate.row); + } + return rows; +} + +function compareSubagentModelDescriptionRows( + left: { key: string; row: string; selector: string }, + right: { key: string; row: string; selector: string } +): number { + return compareCodeUnitStrings(left.key, right.key) || + compareCodeUnitStrings(left.selector, right.selector) || + compareCodeUnitStrings(left.row, right.row); +} + +function compareCodeUnitStrings(left: string, right: string): number { + return left < right ? -1 : left > right ? 1 : 0; +} + +function removeClaudeCodeBillingSystemHeader(body: Record): void { + const system = body.system; + if (!Array.isArray(system) || system.length === 0) { + return; + } + const firstBlock = system[0]; + const firstText = typeof firstBlock === "string" + ? firstBlock + : isRecord(firstBlock) && firstBlock.type === "text" && typeof firstBlock.text === "string" + ? firstBlock.text + : undefined; + if (!firstText?.startsWith(claudeCodeBillingSystemHeaderPrefix)) { + return; + } + system.shift(); + if (system.length === 0) { + delete body.system; + } +} + +function extractAndRemoveClaudeCodeSubagentModelTag(body: Record): string | undefined { + const systemModel = extractAndRemoveSystemSubagentModelTag(body); + if (systemModel) { + return systemModel; + } + return extractAndRemoveMessageSubagentModelTag(body); +} + +function extractAndRemoveSystemSubagentModelTag(body: Record): string | undefined { + const system = body.system; + if (typeof system === "string") { + return extractAndRemoveSubagentModelTagFromText(system, (text) => { + body.system = text; + }); + } + if (!Array.isArray(system)) { + return undefined; + } + for (let index = 0; index < system.length; index += 1) { + const block = system[index]; + const model = extractAndRemoveSubagentModelTagFromContentBlock(block, (text) => { + if (typeof block === "string") { + system[index] = text; + } else if (isRecord(block)) { + block.text = text; + } + }); + if (model) { + return model; + } + } + return undefined; +} + +function extractAndRemoveMessageSubagentModelTag(body: Record): string | undefined { + if (!Array.isArray(body.messages)) { + return undefined; + } + const limit = Math.min(body.messages.length, 2); + for (let index = 0; index < limit; index += 1) { + const message = body.messages[index]; + if (!isRecord(message) || message.role !== "user") { + continue; + } + const model = extractAndRemoveSubagentModelTagFromMessage(message); + if (model) { + return model; + } + } + return undefined; +} + +function extractAndRemoveSubagentModelTagFromMessage(message: Record): string | undefined { + if (typeof message.content === "string") { + return extractAndRemoveSubagentModelTagFromText(message.content, (text) => { + message.content = text; + }); + } + if (!Array.isArray(message.content)) { + return undefined; + } + const content = message.content; + for (let index = 0; index < content.length; index += 1) { + const block = content[index]; + const model = extractAndRemoveSubagentModelTagFromContentBlock(block, (text) => { + if (typeof block === "string") { + content[index] = text; + } else if (isRecord(block)) { + block.text = text; + } + }); + if (model) { + return model; + } + } + return undefined; +} + +function extractAndRemoveSubagentModelTagFromContentBlock( + block: unknown, + replace: (text: string) => void +): string | undefined { + if (typeof block === "string") { + return extractAndRemoveSubagentModelTagFromText(block, replace); + } + if (!isRecord(block) || typeof block.text !== "string") { + return undefined; + } + return extractAndRemoveSubagentModelTagFromText(block.text, replace); +} + +function extractAndRemoveSubagentModelTagFromText( + text: string, + replace: (text: string) => void +): string | undefined { + const openIndex = text.indexOf(ccrSubagentModelOpenTag); + if (openIndex < 0) { + return undefined; + } + const modelStart = openIndex + ccrSubagentModelOpenTag.length; + const closeIndex = text.indexOf(ccrSubagentModelCloseTag, modelStart); + if (closeIndex < 0) { + return undefined; + } + const model = normalizeRouteSelector(text.slice(modelStart, closeIndex)); + if (!model) { + return undefined; + } + const nextText = `${text.slice(0, openIndex)}${text.slice(closeIndex + ccrSubagentModelCloseTag.length)}`; + replace(nextText); + return model; +} + +function resolveRouterRule( + rule: RouterRule, + request: MutableRequestLike, + router: RouterConfig +): ConfiguredRouteDecision | undefined { + if (!rule.enabled) { + return undefined; + } + const fallback = rule.fallback ?? router.fallback; + + const rewrites = routerRuleRewritesFromRule(rule); + if (rewrites.length === 0) { + return undefined; + } + + if (rule.type === "condition") { + return rule.condition && routerRuleConditionMatches(rule.condition, request) + ? routerRuleRewriteDecision(rule, rewrites, fallback) + : undefined; + } + + if (rule.type === "model-prefix") { + const pattern = readString(rule.pattern); + const requestedModel = readString(request.body.model); + return pattern && requestedModel?.startsWith(pattern) + ? routerRuleRewriteDecision(rule, rewrites, fallback) + : undefined; + } + + return undefined; +} + +function routerRuleRewriteDecision( + rule: RouterRule, + rewrites: RouterRuleRewrite[], + fallback: RouterFallbackConfig +): ConfiguredRouteDecision { + const modelRewrite = rewrites.find((rewrite) => (rewrite.operation ?? "set") === "set" && rewrite.key === "request.body.model"); + return { + fallback, + model: modelRewrite?.value ? normalizeRouteSelector(modelRewrite.value) : undefined, + reason: routerRuleReason(rule), + rewrite: rewrites[0], + rewrites + }; +} + +function routerRuleRewritesFromRule(rule: RouterRule): RouterRuleRewrite[] { + if (rule.rewrites?.length) { + return rule.rewrites; + } + if (rule.rewrite) { + return [rule.rewrite]; + } + return rule.target + ? [{ key: "request.body.model", operation: "set", value: rule.target }] + : []; +} + +function applyRouterRewrite(rewrite: RouterRuleRewrite, request: MutableRequestLike): void { + const parts = rewrite.key + .split(".") + .map((part) => part.trim()) + .filter(Boolean); + const [scope, section, ...rest] = parts; + if (scope !== "request") { + return; + } + + if (section === "header" || section === "headers") { + const name = rest.join(".").trim().toLowerCase(); + if (!name) { + return; + } + if ((rewrite.operation ?? "set") === "delete") { + delete request.headers[name]; + } else if (rewrite.value !== undefined) { + request.headers[name] = rewrite.value; + } + return; + } + + if (section === "body") { + applyBodyRewrite(request.body, rest, rewrite); + } +} + +function applyBodyRewrite(body: Record, path: string[], rewrite: RouterRuleRewrite): void { + const operation = rewrite.operation ?? "set"; + if (operation === "delete") { + deletePathValue(body, path); + return; + } + + const value = rewrite.key === "request.body.model" && rewrite.value !== undefined + ? normalizeRouteSelector(rewrite.value) ?? rewrite.value + : rewrite.value !== undefined + ? parseRewriteLiteral(rewrite.value) + : undefined; + + if (operation === "set") { + setPathValue(body, path, value); + return; + } + + const current = readPathValue(body, path); + const array = Array.isArray(current) ? [...current] : []; + if (operation === "array-append") { + array.push(value); + setPathValue(body, path, array); + return; + } + if (operation === "array-prepend") { + array.unshift(value); + setPathValue(body, path, array); + return; + } + if (operation === "array-remove") { + setPathValue(body, path, array.filter((item) => !arrayElementMatches(item, value))); + return; + } + if (operation === "array-replace" && rewrite.match !== undefined) { + const match = parseRewriteLiteral(rewrite.match); + setPathValue(body, path, array.map((item) => arrayElementMatches(item, match) ? value : item)); + } +} + +function setPathValue(target: Record, path: string[], value: unknown): void { + if (path.length === 0) { + return; + } + + let current: unknown = target; + for (let index = 0; index < path.length - 1; index += 1) { + const key = path[index]; + const nextKey = path[index + 1]; + if (Array.isArray(current)) { + const arrayIndex = Number(key); + if (!Number.isInteger(arrayIndex)) { + return; + } + if (!isRecord(current[arrayIndex]) && !Array.isArray(current[arrayIndex])) { + current[arrayIndex] = numericPathSegment(nextKey) ? [] : {}; + } + current = current[arrayIndex]; + continue; + } + if (!isRecord(current)) { + return; + } + if (!isRecord(current[key]) && !Array.isArray(current[key])) { + current[key] = numericPathSegment(nextKey) ? [] : {}; + } + current = current[key]; + } + + const lastKey = path[path.length - 1]; + if (Array.isArray(current)) { + const arrayIndex = Number(lastKey); + if (Number.isInteger(arrayIndex)) { + current[arrayIndex] = value; + } + return; + } + if (isRecord(current)) { + current[lastKey] = value; + } +} + +function deletePathValue(target: Record, path: string[]): void { + if (path.length === 0) { + return; + } + const parent = readPathValue(target, path.slice(0, -1)); + const key = path[path.length - 1]; + if (Array.isArray(parent)) { + const index = Number(key); + if (Number.isInteger(index)) { + parent.splice(index, 1); + } + return; + } + if (isRecord(parent)) { + delete parent[key]; + } +} + +function numericPathSegment(value: string): boolean { + return /^\d+$/.test(value); +} + +function parseRewriteLiteral(value: string): unknown { + const trimmed = value.trim(); + if (trimmed === "true") return true; + if (trimmed === "false") return false; + if (trimmed === "null") return null; + const json = parseJsonLiteral(trimmed); + if (json.ok) return json.value; + if ( + (trimmed.startsWith("\"") && trimmed.endsWith("\"")) || + (trimmed.startsWith("'") && trimmed.endsWith("'")) + ) { + return trimmed.slice(1, -1); + } + const parsedNumber = Number(trimmed); + return trimmed && Number.isFinite(parsedNumber) ? parsedNumber : trimmed; +} + +function routerRuleConditionMatches(condition: RouterRuleCondition, request: MutableRequestLike): boolean { + if (condition.left.trim().startsWith("response.")) { + return false; + } + const actual = resolveRouterConditionValue(condition.left, request); + const expected = parseConditionLiteral(condition.right); + + if (condition.operator === "starts-with") { + const actualText = conditionComparableText(actual); + const expectedText = conditionComparableText(expected); + return actualText !== undefined && expectedText !== undefined && actualText.startsWith(expectedText); + } + + if (condition.operator === "contains" || condition.operator === "not-contains" || condition.operator === "contains-deep") { + const matched = condition.operator === "contains-deep" + ? valueContainsDeep(actual, expected) + : valueContains(actual, expected); + return condition.operator === "not-contains" ? !matched : matched; + } + + if (condition.operator === "==" || condition.operator === "!=") { + const matched = valuesEqual(actual, expected); + return condition.operator === "==" ? matched : !matched; + } + + const actualNumber = numberValue(actual); + const expectedNumber = numberValue(expected); + if (actualNumber !== undefined && expectedNumber !== undefined) { + if (condition.operator === ">") return actualNumber > expectedNumber; + if (condition.operator === ">=") return actualNumber >= expectedNumber; + if (condition.operator === "<") return actualNumber < expectedNumber; + if (condition.operator === "<=") return actualNumber <= expectedNumber; + } + + const actualText = conditionComparableText(actual); + const expectedText = conditionComparableText(expected); + if (actualText === undefined || expectedText === undefined) { + return false; + } + if (condition.operator === ">") return actualText > expectedText; + if (condition.operator === ">=") return actualText >= expectedText; + if (condition.operator === "<") return actualText < expectedText; + if (condition.operator === "<=") return actualText <= expectedText; + return false; +} + +function resolveRouterConditionValue(path: string, request: MutableRequestLike): unknown { + const parts = path + .split(".") + .map((part) => part.trim()) + .filter(Boolean); + if (parts.length === 0) { + return undefined; + } + + const [scope, section, ...rest] = parts; + if (scope === "response") { + return undefined; + } + if (scope !== "request") { + return undefined; + } + + if (section === "header" || section === "headers") { + return readRequestHeader(request.headers, rest.join(".")); + } + if (section === "body") { + return readPathValue(request.body, rest); + } + if (section === "method") { + return request.method; + } + if (section === "url") { + return request.url; + } + if (section === "tokenCount" || section === "token_count") { + return request.tokenCount; + } + if (section === "sessionId" || section === "session_id") { + return request.sessionId; + } + + return readPathValue(request.body, [section, ...rest].filter(Boolean)); +} + +function readRequestHeader(headers: Record, name: string): string | undefined { + const normalized = name.trim().toLowerCase(); + if (!normalized) { + return undefined; + } + const direct = readHeader(headers[normalized]); + if (direct !== undefined) { + return direct; + } + const matchedKey = Object.keys(headers).find((key) => key.toLowerCase() === normalized); + return matchedKey ? readHeader(headers[matchedKey]) : undefined; +} + +function readPathValue(value: unknown, path: string[]): unknown { + return path.reduce((current, part) => { + if (Array.isArray(current)) { + const index = Number(part); + return Number.isInteger(index) ? current[index] : undefined; + } + return isRecord(current) ? current[part] : undefined; + }, value); +} + +function parseConditionLiteral(value: string): unknown { + const trimmed = value.trim(); + if (trimmed === "true") return true; + if (trimmed === "false") return false; + if (trimmed === "null") return null; + if (trimmed === "undefined") return undefined; + const json = parseJsonLiteral(trimmed); + if (json.ok) return json.value; + if ( + (trimmed.startsWith("\"") && trimmed.endsWith("\"")) || + (trimmed.startsWith("'") && trimmed.endsWith("'")) + ) { + return trimmed.slice(1, -1); + } + const parsedNumber = Number(trimmed); + return trimmed && Number.isFinite(parsedNumber) ? parsedNumber : trimmed; +} + +function valuesEqual(actual: unknown, expected: unknown): boolean { + if (actual === expected) { + return true; + } + const actualNumber = numberValue(actual); + const expectedNumber = numberValue(expected); + if (actualNumber !== undefined && expectedNumber !== undefined) { + return actualNumber === expectedNumber; + } + return conditionComparableText(actual) === conditionComparableText(expected); +} + +function valueContains(actual: unknown, expected: unknown): boolean { + if (Array.isArray(actual)) { + return actual.some((item) => arrayElementMatches(item, expected)); + } + if (typeof actual === "string") { + const expectedText = conditionComparableText(expected); + return expectedText !== undefined && actual.includes(expectedText); + } + return false; +} + +function valueContainsDeep(actual: unknown, expected: unknown): boolean { + if (valueContains(actual, expected) || valuesEqual(actual, expected)) { + return true; + } + if (Array.isArray(actual)) { + return actual.some((item) => valueContainsDeep(item, expected)); + } + if (isRecord(actual)) { + return Object.values(actual).some((item) => valueContainsDeep(item, expected)); + } + const actualText = conditionComparableText(actual); + const expectedText = conditionComparableText(expected); + return actualText !== undefined && expectedText !== undefined && actualText.includes(expectedText); +} + +function arrayElementMatches(actual: unknown, expected: unknown): boolean { + if (isRecord(expected) && isRecord(actual)) { + return Object.entries(expected).every(([key, expectedValue]) => arrayElementMatches(actual[key], expectedValue)); + } + if (Array.isArray(expected) && Array.isArray(actual)) { + return expected.length === actual.length && expected.every((item, index) => arrayElementMatches(actual[index], item)); + } + return valuesEqual(actual, expected); +} + +function parseJsonLiteral(value: string): { ok: true; value: unknown } | { ok: false } { + if (!value || (!value.startsWith("{") && !value.startsWith("["))) { + return { ok: false }; + } + try { + return { ok: true, value: JSON.parse(value) as unknown }; + } catch { + return { ok: false }; + } +} + +function numberValue(value: unknown): number | undefined { + if (typeof value === "number" && Number.isFinite(value)) { + return value; + } + if (typeof value !== "string" || !value.trim()) { + return undefined; + } + const parsed = Number(value); + return Number.isFinite(parsed) ? parsed : undefined; +} + +function conditionComparableText(value: unknown): string | undefined { + if (value === undefined) { + return undefined; + } + if (value === null) { + return "null"; + } + if (Array.isArray(value)) { + return value.map((item) => conditionComparableText(item)).filter((item): item is string => item !== undefined).join(","); + } + if (typeof value === "object") { + return JSON.stringify(value); + } + return String(value); +} + +function singleLineText(value: string, maxLength: number): string { + const normalized = value.replace(/\s+/g, " ").trim(); + if (normalized.length <= maxLength) { + return normalized; + } + return `${normalized.slice(0, Math.max(0, maxLength - 1)).trimEnd()}...`; +} + +function routerRuleReason(rule: RouterRule): string { + if (rule.id.startsWith("legacy-")) { + return rule.id.replace(/^legacy-/, ""); + } + return `rule:${rule.id}`; +} + +export function normalizeRouteSelector(value: string | undefined): string | undefined { + const trimmed = value?.trim(); + if (!trimmed) { + return undefined; + } + + const commaIndex = trimmed.indexOf(","); + if (commaIndex > 0 && commaIndex < trimmed.length - 1) { + const provider = trimmed.slice(0, commaIndex).trim(); + const model = trimmed.slice(commaIndex + 1).trim(); + return provider && model ? `${provider}/${model}` : undefined; + } + + return trimmed; +} + +function isKnownInlineRoute(model: string | undefined, config: AppConfig): boolean { + const normalizedModel = normalizeRouteSelector(model); + if (!normalizedModel) { + return false; + } + + const normalizedModelLower = normalizedModel.toLowerCase(); + if (availableGatewayModelIds(config).some((id) => id.toLowerCase() === normalizedModelLower)) { + return true; + } + + const separator = normalizedModel.indexOf("/"); + if (separator <= 0) { + return false; + } + + const providerName = normalizedModel.slice(0, separator).trim().toLowerCase(); + return config.Providers.some((provider) => provider.name.trim().toLowerCase() === providerName); +} + +function isSubagentModelPlaceholder(model: string): boolean { + return model.trim().toLowerCase() === ccrSubagentModelPlaceholder; +} + +function calculateTokenCount(messages: unknown, system: unknown, tools: unknown): number { + return countMessageTokens(messages) + countSystemTokens(system) + countToolTokens(tools); +} + +function countMessageTokens(messages: unknown): number { + if (!Array.isArray(messages)) { + return 0; + } + return messages.reduce((total, message) => total + countUnknownTokens(message), 0); +} + +function countSystemTokens(system: unknown): number { + return countUnknownTokens(system); +} + +function countToolTokens(tools: unknown): number { + if (!Array.isArray(tools)) { + return 0; + } + return tools.reduce((total, tool) => total + countUnknownTokens(tool), 0); +} + +function countUnknownTokens(value: unknown): number { + if (typeof value === "string") { + return estimateTextTokens(value); + } + + if (typeof value === "number" || typeof value === "boolean") { + return 1; + } + + if (Array.isArray(value)) { + return value.reduce((total, item) => total + countUnknownTokens(item), 0); + } + + if (!isRecord(value)) { + return 0; + } + + let total = 0; + for (const [key, item] of Object.entries(value)) { + total += estimateTextTokens(key); + total += countUnknownTokens(item); + } + return total; +} + +function estimateTextTokens(text: string): number { + const asciiWords = text.match(/[A-Za-z0-9_]+|[^\sA-Za-z0-9_]/g)?.length ?? 0; + const cjkChars = text.match(/[\u3400-\u9fff]/g)?.length ?? 0; + return Math.max(1, Math.ceil((asciiWords + cjkChars) * 1.15)); +} + +function resolveSessionId(body: Record, headers: Record): string | undefined { + const fromHeader = readHeader(headers["x-claude-code-session-id"]) || readHeader(headers["x-claude-session-id"]); + if (fromHeader) { + return fromHeader; + } + + const metadata = body.metadata; + if (isRecord(metadata) && typeof metadata.user_id === "string") { + const parts = metadata.user_id.split("_session_"); + if (parts.length > 1) { + return parts.at(-1); + } + } + + return undefined; +} + +function cloneRecord(value: Record): Record { + return JSON.parse(JSON.stringify(value)) as Record; +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function readDefaultFunction(value: unknown): ((...args: unknown[]) => unknown) | undefined { + if (isRecord(value) && typeof value.default === "function") { + return value.default as (...args: unknown[]) => unknown; + } + return undefined; +} + +function readHeader(value: HeaderValue): string | undefined { + if (Array.isArray(value)) { + return value[0]?.trim(); + } + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function readString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function readOptionalString(value: unknown): string | undefined { + return typeof value === "string" ? value : undefined; +} diff --git a/packages/core/src/gateway/model-catalog.ts b/packages/core/src/gateway/model-catalog.ts new file mode 100644 index 0000000..b32e2e6 --- /dev/null +++ b/packages/core/src/gateway/model-catalog.ts @@ -0,0 +1,270 @@ +import { loadModelCatalogPayload } from "@ccr/core/models/catalog-file"; + +const claudeCodeDefaultContextTokens = 200_000; +let modelCatalogIndex: ModelCatalogIndex | undefined; + +export type ModelCatalogCapabilities = Record; + +type ModelCatalogLimits = { + contextTokens?: number; + inputTokens?: number; + maxTokens?: number; + outputTokens?: number; + supports1MContext?: boolean; +}; + +type ModelCatalogModalities = { + input?: string[]; + output?: string[]; +}; + +export type ModelCatalogEntry = { + aliases: string[]; + capabilities?: ModelCatalogCapabilities; + displayName?: string; + family?: string; + id: string; + limits?: ModelCatalogLimits; + modalities?: ModelCatalogModalities; + model?: string; + providers?: string[]; +}; + +type ModelCatalogIndex = { + byKey: Map; + byModelKey: Map; + loadedFrom?: string; +}; + +export function findModelCatalogEntry(model: string): ModelCatalogEntry | undefined { + const index = loadModelCatalogIndex(); + const candidates = modelCatalogLookupKeys(model); + for (const key of candidates) { + const entry = index.byKey.get(key); + if (entry) { + return entry; + } + } + + for (const key of candidates) { + const modelKey = modelCatalogLastSegmentKey(key); + if (!modelKey) { + continue; + } + const entry = index.byModelKey.get(modelKey); + if (entry) { + return entry; + } + } + + return undefined; +} + +export function modelCatalogMaxInputTokens(entry: ModelCatalogEntry | undefined): number { + return Math.max( + 0, + entry?.limits?.contextTokens ?? 0, + entry?.limits?.inputTokens ?? 0 + ); +} + +export function claudeCodeEffectiveMaxInputTokens(entry: ModelCatalogEntry | undefined, oneMillionContext: boolean): number { + const maxInputTokens = modelCatalogMaxInputTokens(entry); + if (oneMillionContext) { + return maxInputTokens || 1_000_000; + } + return maxInputTokens > 0 ? Math.min(maxInputTokens, claudeCodeDefaultContextTokens) : 0; +} + +export function modelCatalogMaxOutputTokens(entry: ModelCatalogEntry | undefined): number { + return Math.max( + 0, + entry?.limits?.outputTokens ?? 0, + entry?.limits?.maxTokens ?? 0 + ); +} + +export function readCatalogCapability(capabilities: ModelCatalogCapabilities, key: string): boolean { + return capabilities[key] === true; +} + +function loadModelCatalogIndex(): ModelCatalogIndex { + if (modelCatalogIndex) { + return modelCatalogIndex; + } + + try { + const loaded = loadModelCatalogPayload(); + if (loaded) { + modelCatalogIndex = buildModelCatalogIndex(loaded.payload, loaded.loadedFrom); + return modelCatalogIndex; + } + } catch (error) { + console.warn("Failed to load model catalog:", error); + } + + modelCatalogIndex = { + byKey: new Map(), + byModelKey: new Map() + }; + return modelCatalogIndex; +} + +function buildModelCatalogIndex(payload: unknown, loadedFrom: string): ModelCatalogIndex { + const byKey = new Map(); + const byModelKey = new Map(); + const models = isRecord(payload) && Array.isArray(payload.models) ? payload.models : []; + + for (const item of models) { + const entry = parseModelCatalogEntry(item); + if (!entry) { + continue; + } + + for (const key of modelCatalogEntryKeys(entry)) { + byKey.set(key, entry); + } + + const shortKeys = uniqueStrings([ + entry.model ? normalizeModelCatalogToken(entry.model) : "", + ...entry.aliases.map((alias) => modelCatalogLastSegmentKey(normalizeModelCatalogKey(alias))) + ]); + for (const key of shortKeys) { + if (!key) { + continue; + } + if (byModelKey.has(key) && byModelKey.get(key) !== entry) { + byModelKey.set(key, undefined); + } else { + byModelKey.set(key, entry); + } + } + } + + return { byKey, byModelKey, loadedFrom }; +} + +function parseModelCatalogEntry(value: unknown): ModelCatalogEntry | undefined { + if (!isRecord(value)) { + return undefined; + } + const id = stringValue(value.id); + if (!id) { + return undefined; + } + const aliases = uniqueStrings([id, ...stringListValue(value.aliases)]); + const limits = parseModelCatalogLimits(value.limits); + const modalities = parseModelCatalogModalities(value.modalities); + return { + aliases, + capabilities: isRecord(value.capabilities) ? value.capabilities : undefined, + displayName: stringValue(value.displayName), + family: stringValue(value.family), + id, + limits, + modalities, + model: stringValue(value.model), + providers: stringListValue(value.providers) + }; +} + +function parseModelCatalogLimits(value: unknown): ModelCatalogLimits | undefined { + if (!isRecord(value)) { + return undefined; + } + const limits: ModelCatalogLimits = { + contextTokens: readCatalogPositiveInteger(value.contextTokens), + inputTokens: readCatalogPositiveInteger(value.inputTokens), + maxTokens: readCatalogPositiveInteger(value.maxTokens), + outputTokens: readCatalogPositiveInteger(value.outputTokens), + supports1MContext: typeof value.supports1MContext === "boolean" ? value.supports1MContext : undefined + }; + return Object.values(limits).some((item) => item !== undefined) ? limits : undefined; +} + +function parseModelCatalogModalities(value: unknown): ModelCatalogModalities | undefined { + if (!isRecord(value)) { + return undefined; + } + const modalities: ModelCatalogModalities = { + input: stringListValue(value.input), + output: stringListValue(value.output) + }; + return (modalities.input?.length || modalities.output?.length) ? modalities : undefined; +} + +function modelCatalogEntryKeys(entry: ModelCatalogEntry): string[] { + return uniqueStrings([ + normalizeModelCatalogKey(entry.id), + ...entry.aliases.map(normalizeModelCatalogKey), + ...((entry.providers ?? []).map((provider) => entry.model ? normalizeModelCatalogKey(`${provider}/${entry.model}`) : "")) + ]); +} + +function modelCatalogLookupKeys(value: string): string[] { + const raw = String(value || "").trim(); + const normalized = normalizeModelCatalogKey(raw); + const withoutClaudePrefix = raw.toLowerCase().startsWith("claude-") && raw.includes("/") + ? normalizeModelCatalogKey(raw.replace(/^claude-/i, "")) + : ""; + return uniqueStrings([normalized, withoutClaudePrefix]); +} + +function normalizeModelCatalogKey(value: string): string { + return String(value || "") + .trim() + .split("/") + .map(normalizeModelCatalogToken) + .filter(Boolean) + .join("/"); +} + +function normalizeModelCatalogToken(value: string): string { + return String(value || "") + .trim() + .replace(/^hf:/i, "") + .replace(/^@/, "") + .replace(/[_\s]+/g, "-") + .replace(/-+/g, "-") + .toLowerCase(); +} + +function modelCatalogLastSegmentKey(value: string): string { + return value.split("/").filter(Boolean).at(-1) ?? ""; +} + +function readCatalogPositiveInteger(value: unknown): number | undefined { + const parsed = numberValue(value); + return parsed !== undefined && parsed > 0 ? parsed : undefined; +} + +function uniqueStrings(values: Array): string[] { + const seen = new Set(); + const strings: string[] = []; + for (const value of values) { + const trimmed = value?.trim(); + if (!trimmed || seen.has(trimmed)) { + continue; + } + seen.add(trimmed); + strings.push(trimmed); + } + return strings; +} + +function stringValue(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function stringListValue(value: unknown): string[] { + return Array.isArray(value) ? value.map((item) => stringValue(item)).filter((item): item is string => Boolean(item)) : []; +} + +function numberValue(value: unknown): number | undefined { + const parsed = typeof value === "number" ? value : typeof value === "string" ? Number(value) : Number.NaN; + return Number.isFinite(parsed) ? parsed : undefined; +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} diff --git a/packages/core/src/gateway/remote-control-service.ts b/packages/core/src/gateway/remote-control-service.ts new file mode 100644 index 0000000..b3a7e70 --- /dev/null +++ b/packages/core/src/gateway/remote-control-service.ts @@ -0,0 +1,627 @@ +import { randomUUID } from "node:crypto"; +import type { IncomingMessage, ServerResponse } from "node:http"; + +export const ccrRemoteControlPathPrefix = "/__ccr/remote"; + +type RemoteDirection = "inbound" | "local" | "remote" | "system"; + +export type CcrRemoteControlRequestContext = { + endpoint: string; + path: string; + readBody: (request: IncomingMessage) => Promise; + request: IncomingMessage; + response: ServerResponse; + sendJson: (response: ServerResponse, statusCode: number, payload: unknown) => void; +}; + +type RemoteSession = { + archivedAt?: string; + createdAt: string; + events: RemoteEvent[]; + id: string; + inboundEvents: RemoteEvent[]; + lastSeq: number; + metadata: Record; + presence: Record; + seenDedupeKeys: Map; + subscribers: Set; + title: string; + updatedAt: string; +}; + +type RemoteEvent = { + createdAt: string; + dedupeKey?: string; + direction: RemoteDirection; + id: string; + payload: unknown; + role?: string; + seq: number; + sessionId: string; + source?: string; + text?: string; + type: string; +}; + +type RemotePresence = { + lastSeenAt: string; + metadata: Record; + name: string; + role: string; +}; + +type RemoteSubscriber = { + close: () => void; + id: string; + kind: "events" | "inbound"; + response: ServerResponse; +}; + +const maxSessions = 100; +const maxEventsPerSession = 2_000; +const maxInboundEventsPerSession = 500; +const sseHeartbeatMs = 15_000; + +class CcrRemoteControlService { + private readonly sessions = new Map(); + + async handleRequest(context: CcrRemoteControlRequestContext): Promise { + const segments = remotePathSegments(context.path); + const [root, sessionId, resource] = segments; + + if (segments.length === 0 || context.path === ccrRemoteControlPathPrefix) { + this.sendCapabilities(context); + return; + } + + if (root === "capabilities") { + this.sendCapabilities(context); + return; + } + + if (root !== "sessions") { + context.sendJson(context.response, 404, { error: { message: "Remote control endpoint not found." } }); + return; + } + + if (!sessionId) { + await this.handleSessionsRequest(context); + return; + } + + if (!resource) { + await this.handleSessionRequest(context, sessionId); + return; + } + + if (resource === "events") { + await this.handleEventsRequest(context, sessionId); + return; + } + + if (resource === "inbound") { + await this.handleInboundRequest(context, sessionId); + return; + } + + if (resource === "presence") { + await this.handlePresenceRequest(context, sessionId); + return; + } + + context.sendJson(context.response, 404, { error: { message: "Remote control session endpoint not found." } }); + } + + private sendCapabilities(context: CcrRemoteControlRequestContext): void { + context.sendJson(context.response, 200, { + endpoints: { + createSession: `${context.endpoint}${ccrRemoteControlPathPrefix}/sessions`, + inbound: `${context.endpoint}${ccrRemoteControlPathPrefix}/sessions/{sessionId}/inbound`, + sessionEvents: `${context.endpoint}${ccrRemoteControlPathPrefix}/sessions/{sessionId}/events` + }, + name: "ccr-remote-control", + protocol: "ccr.remote.v1", + transport: ["json", "sse"], + capabilities: { + catchupReplay: true, + fanout: true, + inboundQueue: true, + presence: true + } + }); + } + + private async handleSessionsRequest(context: CcrRemoteControlRequestContext): Promise { + if (context.request.method === "GET") { + context.sendJson(context.response, 200, { + sessions: [...this.sessions.values()].map((session) => this.sessionSummary(session, context.endpoint)) + }); + return; + } + + if (context.request.method !== "POST") { + context.sendJson(context.response, 405, { error: { message: "Method not allowed." } }); + return; + } + + const body = await this.readJsonBody(context); + if (!body) { + return; + } + const id = sanitizeSessionId(readString(body.id) || readString(body.sessionId)) || randomUUID(); + const title = readString(body.title) || readString(body.name) || `CCR Remote ${id.slice(0, 8)}`; + const metadata = readRecord(body.metadata) ?? {}; + const session = this.ensureSession(id, title, metadata); + this.appendEvent(session, { + direction: "system", + payload: { title }, + source: "ccr-gateway", + type: "session.created" + }); + + context.sendJson(context.response, 201, { + session: this.sessionSnapshot(session, context.endpoint) + }); + } + + private async handleSessionRequest(context: CcrRemoteControlRequestContext, sessionId: string): Promise { + const session = this.sessions.get(sessionId); + if (!session) { + context.sendJson(context.response, 404, { error: { message: "Remote session not found." } }); + return; + } + + if (context.request.method === "GET") { + context.sendJson(context.response, 200, { session: this.sessionSnapshot(session, context.endpoint) }); + return; + } + + if (context.request.method === "PATCH") { + const body = await this.readJsonBody(context); + if (!body) { + return; + } + const title = readString(body.title) || readString(body.name); + if (title) { + session.title = title; + } + const metadata = readRecord(body.metadata); + if (metadata) { + session.metadata = { ...session.metadata, ...metadata }; + } + session.updatedAt = new Date().toISOString(); + this.appendEvent(session, { + direction: "system", + payload: { metadata: metadata ?? {}, title: title ?? session.title }, + source: "ccr-gateway", + type: "session.updated" + }); + context.sendJson(context.response, 200, { session: this.sessionSnapshot(session, context.endpoint) }); + return; + } + + if (context.request.method === "DELETE") { + session.archivedAt = new Date().toISOString(); + session.updatedAt = session.archivedAt; + this.appendEvent(session, { + direction: "system", + payload: { archivedAt: session.archivedAt }, + source: "ccr-gateway", + type: "session.archived" + }); + context.sendJson(context.response, 200, { archived: true, session: this.sessionSummary(session, context.endpoint) }); + return; + } + + context.sendJson(context.response, 405, { error: { message: "Method not allowed." } }); + } + + private async handleEventsRequest(context: CcrRemoteControlRequestContext, sessionId: string): Promise { + const session = this.sessions.get(sessionId); + if (!session) { + context.sendJson(context.response, 404, { error: { message: "Remote session not found." } }); + return; + } + + if (context.request.method === "GET") { + const after = remoteAfterSeq(context.request); + if (wantsSse(context.request)) { + this.openSse(context, session, "events", after); + return; + } + context.sendJson(context.response, 200, { + events: session.events.filter((event) => event.seq > after), + session: this.sessionSummary(session, context.endpoint) + }); + return; + } + + if (context.request.method !== "POST") { + context.sendJson(context.response, 405, { error: { message: "Method not allowed." } }); + return; + } + + const body = await this.readJsonBody(context); + if (!body) { + return; + } + const events = normalizeEventInputs(body).map((event) => + this.appendEvent(session, { + ...event, + direction: event.direction ?? "local", + type: event.type || "message" + }) + ); + context.sendJson(context.response, 202, { + accepted: events.length, + events, + session: this.sessionSummary(session, context.endpoint) + }); + } + + private async handleInboundRequest(context: CcrRemoteControlRequestContext, sessionId: string): Promise { + const session = this.sessions.get(sessionId); + if (!session) { + context.sendJson(context.response, 404, { error: { message: "Remote session not found." } }); + return; + } + + if (context.request.method === "GET") { + const after = remoteAfterSeq(context.request); + if (wantsSse(context.request)) { + this.openSse(context, session, "inbound", after); + return; + } + context.sendJson(context.response, 200, { + events: session.inboundEvents.filter((event) => event.seq > after), + session: this.sessionSummary(session, context.endpoint) + }); + return; + } + + if (context.request.method !== "POST") { + context.sendJson(context.response, 405, { error: { message: "Method not allowed." } }); + return; + } + + const body = await this.readJsonBody(context); + if (!body) { + return; + } + const events = normalizeEventInputs(body).map((event) => + this.appendEvent(session, { + ...event, + direction: "remote", + type: event.type || "user.message" + }, true) + ); + context.sendJson(context.response, 202, { + accepted: events.length, + events, + session: this.sessionSummary(session, context.endpoint) + }); + } + + private async handlePresenceRequest(context: CcrRemoteControlRequestContext, sessionId: string): Promise { + const session = this.sessions.get(sessionId); + if (!session) { + context.sendJson(context.response, 404, { error: { message: "Remote session not found." } }); + return; + } + + if (context.request.method === "GET") { + context.sendJson(context.response, 200, { presence: session.presence }); + return; + } + + if (context.request.method !== "POST") { + context.sendJson(context.response, 405, { error: { message: "Method not allowed." } }); + return; + } + + const body = await this.readJsonBody(context); + if (!body) { + return; + } + const clientId = sanitizeSessionId(readString(body.clientId) || readString(body.id)) || randomUUID(); + const presence: RemotePresence = { + lastSeenAt: new Date().toISOString(), + metadata: readRecord(body.metadata) ?? {}, + name: readString(body.name) || clientId, + role: readString(body.role) || "client" + }; + session.presence[clientId] = presence; + const event = this.appendEvent(session, { + direction: "system", + payload: { clientId, presence }, + source: "ccr-gateway", + type: "presence.updated" + }); + context.sendJson(context.response, 202, { event, presence: session.presence }); + } + + private ensureSession(id: string, title: string, metadata: Record): RemoteSession { + const existing = this.sessions.get(id); + if (existing) { + existing.metadata = { ...existing.metadata, ...metadata }; + existing.title = title || existing.title; + existing.updatedAt = new Date().toISOString(); + return existing; + } + + this.pruneSessions(); + const now = new Date().toISOString(); + const session: RemoteSession = { + createdAt: now, + events: [], + id, + inboundEvents: [], + lastSeq: 0, + metadata, + presence: {}, + seenDedupeKeys: new Map(), + subscribers: new Set(), + title, + updatedAt: now + }; + this.sessions.set(id, session); + return session; + } + + private appendEvent( + session: RemoteSession, + input: RemoteEventInput, + inbound = false + ): RemoteEvent { + const dedupeKey = input.dedupeKey || input.id; + if (dedupeKey) { + const duplicate = session.seenDedupeKeys.get(dedupeKey); + if (duplicate) { + return duplicate; + } + } + + const event: RemoteEvent = { + createdAt: new Date().toISOString(), + ...(dedupeKey ? { dedupeKey } : {}), + direction: input.direction ?? "local", + id: input.id || randomUUID(), + payload: input.payload ?? {}, + ...(input.role ? { role: input.role } : {}), + seq: ++session.lastSeq, + sessionId: session.id, + ...(input.source ? { source: input.source } : {}), + ...(input.text ? { text: input.text } : {}), + type: input.type || "message" + }; + + session.events.push(event); + trimArray(session.events, maxEventsPerSession); + if (inbound || event.direction === "remote" || event.direction === "inbound") { + session.inboundEvents.push(event); + trimArray(session.inboundEvents, maxInboundEventsPerSession); + } + if (dedupeKey) { + session.seenDedupeKeys.set(dedupeKey, event); + while (session.seenDedupeKeys.size > maxEventsPerSession) { + const oldest = session.seenDedupeKeys.keys().next().value; + if (!oldest) { + break; + } + session.seenDedupeKeys.delete(oldest); + } + } + session.updatedAt = event.createdAt; + this.broadcast(session, event); + return event; + } + + private openSse( + context: CcrRemoteControlRequestContext, + session: RemoteSession, + kind: RemoteSubscriber["kind"], + after: number + ): void { + context.response.writeHead(200, { + "cache-control": "no-cache, no-transform", + "connection": "keep-alive", + "content-type": "text/event-stream; charset=utf-8", + "x-accel-buffering": "no" + }); + context.response.write(": connected\n\n"); + const source = kind === "events" ? session.events : session.inboundEvents; + for (const event of source.filter((item) => item.seq > after)) { + writeSseEvent(context.response, event); + } + + const heartbeat = setInterval(() => { + if (!context.response.destroyed) { + context.response.write(": keepalive\n\n"); + } + }, sseHeartbeatMs); + const subscriber: RemoteSubscriber = { + close: () => clearInterval(heartbeat), + id: randomUUID(), + kind, + response: context.response + }; + session.subscribers.add(subscriber); + context.request.once("close", () => { + subscriber.close(); + session.subscribers.delete(subscriber); + }); + } + + private broadcast(session: RemoteSession, event: RemoteEvent): void { + for (const subscriber of session.subscribers) { + if (subscriber.kind === "inbound" && !(event.direction === "remote" || event.direction === "inbound")) { + continue; + } + if (subscriber.response.destroyed) { + subscriber.close(); + session.subscribers.delete(subscriber); + continue; + } + writeSseEvent(subscriber.response, event); + } + } + + private sessionSnapshot(session: RemoteSession, endpoint: string) { + return { + ...this.sessionSummary(session, endpoint), + events: session.events, + inboundEvents: session.inboundEvents, + metadata: session.metadata, + presence: session.presence + }; + } + + private sessionSummary(session: RemoteSession, endpoint: string) { + return { + ...(session.archivedAt ? { archivedAt: session.archivedAt } : {}), + createdAt: session.createdAt, + endpoints: { + events: `${endpoint}${ccrRemoteControlPathPrefix}/sessions/${encodeURIComponent(session.id)}/events`, + inbound: `${endpoint}${ccrRemoteControlPathPrefix}/sessions/${encodeURIComponent(session.id)}/inbound`, + presence: `${endpoint}${ccrRemoteControlPathPrefix}/sessions/${encodeURIComponent(session.id)}/presence` + }, + eventCount: session.events.length, + id: session.id, + inboundCount: session.inboundEvents.length, + lastSeq: session.lastSeq, + subscriberCount: session.subscribers.size, + title: session.title, + updatedAt: session.updatedAt + }; + } + + private pruneSessions(): void { + while (this.sessions.size >= maxSessions) { + const oldest = [...this.sessions.values()] + .sort((left, right) => Date.parse(left.updatedAt) - Date.parse(right.updatedAt))[0]; + if (!oldest) { + return; + } + for (const subscriber of oldest.subscribers) { + subscriber.close(); + subscriber.response.end(); + } + this.sessions.delete(oldest.id); + } + } + + private async readJsonBody(context: CcrRemoteControlRequestContext): Promise | undefined> { + const body = await context.readBody(context.request); + if (body.length === 0) { + return {}; + } + try { + const parsed = JSON.parse(body.toString("utf8")) as unknown; + if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) { + return parsed as Record; + } + context.sendJson(context.response, 400, { error: { message: "Request body must be a JSON object." } }); + return undefined; + } catch { + context.sendJson(context.response, 400, { error: { message: "Request body must be valid JSON." } }); + return undefined; + } + } +} + +type RemoteEventInput = { + dedupeKey?: string; + direction?: RemoteDirection; + id?: string; + payload?: unknown; + role?: string; + source?: string; + text?: string; + type?: string; +}; + +export const ccrRemoteControlService = new CcrRemoteControlService(); + +function normalizeEventInputs(body: Record): RemoteEventInput[] { + const rawEvents = Array.isArray(body.events) ? body.events : [body]; + return rawEvents + .filter((event): event is Record => typeof event === "object" && event !== null && !Array.isArray(event)) + .map((event) => { + const payload = Object.prototype.hasOwnProperty.call(event, "payload") + ? event.payload + : Object.prototype.hasOwnProperty.call(event, "message") + ? event.message + : {}; + return { + dedupeKey: readString(event.dedupeKey) || readString(event.uuid) || readString(event.requestId), + direction: readDirection(event.direction), + id: readString(event.id), + payload, + role: readString(event.role), + source: readString(event.source), + text: readString(event.text) || readString(event.content), + type: readString(event.type) + }; + }); +} + +function writeSseEvent(response: ServerResponse, event: RemoteEvent): void { + response.write(`id: ${event.seq}\n`); + response.write(`event: ${event.type.replace(/[\r\n]+/g, "") || "message"}\n`); + response.write(`data: ${JSON.stringify(event)}\n\n`); +} + +function wantsSse(request: IncomingMessage): boolean { + const url = new URL(request.url || "/", "http://127.0.0.1"); + return url.searchParams.get("stream") === "1" || + url.searchParams.get("stream") === "true" || + readHeader(request.headers.accept)?.toLowerCase().includes("text/event-stream") === true; +} + +function remoteAfterSeq(request: IncomingMessage): number { + const url = new URL(request.url || "/", "http://127.0.0.1"); + const after = Number(url.searchParams.get("after") ?? readHeader(request.headers["last-event-id"]) ?? 0); + return Number.isFinite(after) && after > 0 ? Math.floor(after) : 0; +} + +function remotePathSegments(path: string): string[] { + const suffix = path.slice(ccrRemoteControlPathPrefix.length).replace(/^\/+|\/+$/g, ""); + if (!suffix) { + return []; + } + return suffix.split("/").map((segment) => decodeURIComponent(segment)).filter(Boolean); +} + +function readDirection(value: unknown): RemoteDirection | undefined { + return value === "inbound" || value === "local" || value === "remote" || value === "system" + ? value + : undefined; +} + +function readHeader(value: string | string[] | undefined): string | undefined { + if (Array.isArray(value)) { + return value[0]?.trim(); + } + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function readRecord(value: unknown): Record | undefined { + return typeof value === "object" && value !== null && !Array.isArray(value) + ? value as Record + : undefined; +} + +function readString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function sanitizeSessionId(value: string | undefined): string | undefined { + const sanitized = value?.trim().replace(/[^a-zA-Z0-9:._-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 128); + return sanitized || undefined; +} + +function trimArray(items: T[], maxLength: number): void { + if (items.length > maxLength) { + items.splice(0, items.length - maxLength); + } +} diff --git a/packages/core/src/gateway/runtime-change.ts b/packages/core/src/gateway/runtime-change.ts new file mode 100644 index 0000000..1097362 --- /dev/null +++ b/packages/core/src/gateway/runtime-change.ts @@ -0,0 +1,23 @@ +import type { AppConfig } from "@ccr/core/contracts/app"; + +export function shouldRestartGatewayForRuntimeConfigChange(previousConfig: AppConfig, nextConfig: AppConfig): boolean { + return ( + previousConfig.gateway.enabled !== nextConfig.gateway.enabled || + previousConfig.gateway.host !== nextConfig.gateway.host || + previousConfig.gateway.port !== nextConfig.gateway.port || + previousConfig.gateway.coreHost !== nextConfig.gateway.coreHost || + previousConfig.gateway.corePort !== nextConfig.gateway.corePort || + previousConfig.proxy.enabled !== nextConfig.proxy.enabled || + previousConfig.proxy.host !== nextConfig.proxy.host || + previousConfig.proxy.mode !== nextConfig.proxy.mode || + previousConfig.proxy.port !== nextConfig.proxy.port || + previousConfig.proxy.systemProxy !== nextConfig.proxy.systemProxy || + JSON.stringify(previousConfig.proxy.targets) !== JSON.stringify(nextConfig.proxy.targets) || + JSON.stringify(previousConfig.agent) !== JSON.stringify(nextConfig.agent) || + JSON.stringify(previousConfig.Providers) !== JSON.stringify(nextConfig.Providers) || + JSON.stringify(previousConfig.plugins) !== JSON.stringify(nextConfig.plugins) || + JSON.stringify(previousConfig.providerPlugins) !== JSON.stringify(nextConfig.providerPlugins) || + JSON.stringify(previousConfig.toolHub) !== JSON.stringify(nextConfig.toolHub) || + JSON.stringify(previousConfig.virtualModelProfiles) !== JSON.stringify(nextConfig.virtualModelProfiles) + ); +} diff --git a/packages/core/src/gateway/service.ts b/packages/core/src/gateway/service.ts new file mode 100644 index 0000000..b2a5eb6 --- /dev/null +++ b/packages/core/src/gateway/service.ts @@ -0,0 +1,8727 @@ +import { spawn, type ChildProcess } from "node:child_process"; +import { createHash, randomBytes, randomUUID } from "node:crypto"; +import { createServer, type IncomingHttpHeaders, type IncomingMessage, type Server, type ServerResponse } from "node:http"; +import { createRequire } from "node:module"; +import { networkInterfaces } from "node:os"; +import { Readable, Transform } from "node:stream"; +import { chmodSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import { dirname, join as pathJoin, resolve as pathResolve, sep as pathSep } from "node:path"; +import type { + ApiKeyConfig, + ApiKeyLimitConfig, + AppConfig, + GatewayMcpServerConfig, + GatewayNetworkEndpoint, + GatewayProviderCapability, + GatewayProviderConfig, + GatewayProviderProtocol, + ProviderCredentialConfig, + GatewayStatus, + RouterFallbackConfig, + RouterFallbackMode, + VirtualModelFusionVisionConfig, + VirtualModelFusionWebSearchConfig, + VirtualModelFusionWebSearchProvider +} from "@ccr/core/contracts/app"; +import { + CLAUDE_APP_FALLBACK_MODEL, + buildClaudeAppGatewayModelRoutes, + inferClaudeAppGatewayTargetModel, + resolveClaudeAppGatewayRouteModel, + type ClaudeAppGatewayModelRouteOptions +} from "@ccr/core/agents/claude-app/gateway-routes"; +import { + BUILTIN_FUSION_VISION_TOOL_NAME, + BUILTIN_FUSION_WEB_SEARCH_TOOL_NAME, + NO_AVAILABLE_GATEWAY_MODELS_MESSAGE, + ROUTER_FALLBACK_MAX_RETRY_COUNT, + hasAvailableGatewayModels +} from "@ccr/core/contracts/app"; +import { findProviderPresetByBaseUrl, providerApiKeySafetyIssue } from "@ccr/core/providers/presets/index"; +import { normalizeProviderBaseUrl as normalizeProviderBaseUrlInput } from "@ccr/core/providers/url"; +import { backendService } from "@ccr/core/plugins/backend-service"; +import { RAW_TRACE_SPOOL_DIR } from "@ccr/core/config/constants"; +import { loadPersistedApiKeys } from "@ccr/core/config/api-key-store"; +import { codexDefaultBaseUrl, readCodexAuth } from "@ccr/core/agents/local-providers/service"; +import { fetchWithSystemProxy, getSystemProxyUrlForProtocol } from "@ccr/core/proxy/system-proxy-fetch"; +import { handleNetworkCaptureMcpRequest, isNetworkCaptureMcpPath } from "@ccr/core/mcp/network-capture-mcp"; +import { BROWSER_AUTOMATION_MCP_PATH, TOOL_HUB_MCP_SERVER_NAME, browserAutomationMcpEnabled, toolHubBuiltInBackendServers, toolHubMcpRuntimeConfig, toolHubRequestTimeoutMs } from "@ccr/core/mcp/toolhub-config"; +import { pluginService } from "@ccr/core/plugins/service"; +import { proxyService } from "@ccr/core/proxy/service"; +import { createSseErrorDetector, recordGatewayRequestLog, updateGatewayRequestLogFromRawTrace, type RequestLogRawTraceUpdateInput } from "@ccr/core/observability/request-log-store"; +import { recordGatewayUsageCapture } from "@ccr/core/usage/store"; +import { ClaudeCodeRouterPlugin, normalizeRouteSelector } from "@ccr/core/gateway/claude-code-router-plugin"; +import { ccrRemoteControlPathPrefix, ccrRemoteControlService } from "@ccr/core/gateway/remote-control-service"; +import { + claudeCodeEffectiveMaxInputTokens, + findModelCatalogEntry, + modelCatalogMaxInputTokens, + modelCatalogMaxOutputTokens, + readCatalogCapability, + type ModelCatalogCapabilities, + type ModelCatalogEntry +} from "@ccr/core/gateway/model-catalog"; + +type CoreGatewayProvider = { + apikey?: string; + baseurl?: string; + billing?: unknown; + extraBody?: unknown; + extraHeaders?: unknown; + models: string[]; + name: string; + type: GatewayProviderProtocol; +}; + +const defaultFusionWebSearchProvider: VirtualModelFusionWebSearchProvider = "brave"; +const fusionModelProviderName = "Fusion"; +const claudeCodeOneMillionContextSuffix = "[1m]"; +const claudeAppGatewayModelRouteOptions: ClaudeAppGatewayModelRouteOptions = { + displayName: (model) => findModelCatalogEntry(model)?.displayName, + supportsOneMillionContext: (model) => Boolean(findModelCatalogEntry(model)?.limits?.supports1MContext) +}; + +type ApiKeyAuthorizationResult = + | { ok: true; apiKey?: ApiKeyConfig } + | { ok: false }; + +type ApiKeyLimitUsage = { + imageCount: number; + totalTokens: number; +}; + +type ApiKeyLimitRule = { + limit: number; + metric: "images" | "requests" | "tokens"; + name: string; + requested: number; + windowMs: number; +}; + +type GatewayStopOptions = { + proxyRestoreTimeoutMs?: number; +}; + +type HostedWebSearchProtocolContext = { + maxUses?: number; + protocol: GatewayProviderProtocol; + queryHint?: string; + records?: BrowserWebSearchProtocolRecord[]; + requestId: string; + sinceMs: number; + toolName: string; +}; + +type AnthropicWebSearchProtocolContext = HostedWebSearchProtocolContext; + +type ClaudeCodeWebSearchContinuationContext = { + queryHint?: string; + sinceMs: number; + toolName: string; +}; + +export type BrowserWebSearchMcpRegistration = { + env?: Record; + name: string; + resultCount?: number; + timeoutMs?: number; + toolName: string; +}; + +export type BrowserWebSearchProtocolResult = { + content?: string; + diagnostics?: string[]; + snippet?: string; + title: string; + url: string; +}; + +export type BrowserWebSearchProtocolRecord = { + completedAtMs: number; + engine: string; + query: string; + results: BrowserWebSearchProtocolResult[]; + searchUrl: string; + toolName: string; +}; + +export type BrowserWebSearchMcpIntegration = { + registerBrowserWebSearchMcpServer: (options: BrowserWebSearchMcpRegistration) => Promise; + recentBrowserWebSearchResults?: (options: { sinceMs: number; toolName?: string }) => BrowserWebSearchProtocolRecord[]; + runBrowserWebSearch?: (options: { count?: number; prompt: string; timeoutMs?: number; toolName?: string }) => Promise; + stopBrowserWebSearchMcpServers: () => Promise; +}; + +export type BrowserAutomationMcpIntegration = { + handleBrowserAutomationMcpRequest: (request: IncomingMessage, response: ServerResponse) => Promise; + stopBrowserAutomationMcpServer: () => Promise; +}; + +type CoreGatewayHealth = { + runtimeId?: string; + status?: string; +}; + +type ManagedGatewayRuntimeMarker = { + generatedConfigFile?: unknown; + gatewayEntry?: unknown; + pid?: unknown; + runtimeId?: unknown; + startedAt?: unknown; +}; + +type ApiKeyWindowCounter = { + expiresAt: number; + value: number; + windowStart: number; +}; + +type PendingRawTraceUpdate = RequestLogRawTraceUpdateInput & { + receivedAt: number; +}; + +type RawTracePartText = { + contentType?: string; + text: string; +}; + +type CursorOpenAICompatContext = { + systemPrompt?: string; + toolChoice?: unknown; + tools: unknown[]; +}; + +type CursorOpenAICompatPreparation = { + body?: Buffer; + diagnostic: "fallback-injected" | "simplified-missing-context"; +}; + +type ClaudeCodeDiscoverableModel = { + id: string; + oneMillionContext: boolean; +}; + +type UpstreamAttempt = { + body?: Buffer; + credentialChain?: string[]; + credentialIds?: string[]; + credentialProtocol?: GatewayProviderProtocol; + headers?: Record; + index: number; + logicalProvider?: string; + model?: string; +}; + +type UpstreamFailedAttempt = { + credentialChain?: string[]; + credentialIds?: string[]; + delayMs?: number; + error?: string; + model?: string; + statusCode?: number; +}; + +type UpstreamFetchResult = { + attempt: UpstreamAttempt; + failedAttempts: UpstreamFailedAttempt[]; + response: Response; +}; + +class UpstreamRequestError extends Error { + readonly attempt?: UpstreamAttempt; + readonly failedAttempts: UpstreamFailedAttempt[]; + + constructor(message: string, options: { attempt?: UpstreamAttempt; cause?: unknown; failedAttempts: UpstreamFailedAttempt[] }) { + super(message); + this.name = "UpstreamRequestError"; + this.attempt = options.attempt; + this.cause = options.cause; + this.failedAttempts = options.failedAttempts; + } +} + +const requireFromHere = createRequire(__filename); +const coreGatewayAuthHeader = "x-ccr-core-auth"; +const coreGatewayAuthTokenEnv = "CCR_CORE_GATEWAY_AUTH_TOKEN"; +const clientClosedRequestStatusCode = 499; +const clientDisconnectMessage = "Client connection closed before response completed."; +const localObservabilityHeaderNames = new Set([ + "x-ccr-claude-app-model-rewrite", + "x-ccr-codex-patch-bridge", + "x-ccr-claude-model-discovery", + "x-ccr-cursor-openai-compat", + "x-ccr-logical-provider", + "x-ccr-provider-credential-chain", + "x-ccr-provider-credential-saturated" +]); +const proxyHeaderDenyList = new Set(["connection", coreGatewayAuthHeader, "host", "upgrade"]); +const responseHeaderDenyList = new Set(["connection", "content-encoding", "transfer-encoding"]); +const maxUsageCaptureBytes = 8 * 1024 * 1024; +const maxPendingRawTraceUpdates = 200; +const pendingRawTraceMaxAgeMs = 5 * 60 * 1000; +const apiKeyLimitCounterRetentionWindows = 2; +const gatewayRuntimeMarkerFile = "gateway-runtime.json"; +const rawTraceSyncHeader = "x-ccr-raw-trace-token"; +const virtualApplyPatchToolName = "virtual_apply_patch"; +let warnedMissingCursorOpenAICompatContext = false; +const rawTraceSyncPath = "/__ccr/raw-trace-sync"; +const gatewayEntryOverrideEnv = "CCR_GATEWAY_ENTRY"; +const gatewayPackageCandidates = ["@the-next-ai/ai-gateway", "gateway"]; +const codexPatchBridgeInstructionText = [ + "When modifying files, call virtual_apply_patch.", + "Do not use exec_command or write_stdin to edit files, including shell redirection, heredocs, cat >, tee, sed -i, perl -i, python, node scripts, or similar shell-based edits.", + "Use exec_command only for reading files, listing/searching, running builds/tests, starting servers, and other commands that are not manual file edits." +].join(" "); +const codexPatchBridgeShellToolGuidance = [ + "When virtual_apply_patch is available, do not use this tool to edit files.", + "Do not write files with shell redirection, heredocs, cat >, tee, sed -i, perl -i, python, node scripts, or similar commands.", + "Use virtual_apply_patch for manual file changes." +].join(" "); +const virtualApplyPatchLarkGrammar = [ + "start: begin_patch hunk+ end_patch", + "begin_patch: \"*** Begin Patch\" LF", + "end_patch: \"*** End Patch\" LF?", + "", + "hunk: add_hunk | delete_hunk | update_hunk", + "add_hunk: \"*** Add File: \" filename LF add_line+", + "delete_hunk: \"*** Delete File: \" filename LF", + "update_hunk: \"*** Update File: \" filename LF change_move? change?", + "", + "filename: /(.+)/", + "add_line: \"+\" /(.*)/ LF -> line", + "", + "change_move: \"*** Move to: \" filename LF", + "change: (change_context | change_line)+ eof_line?", + "change_context: (\"@@\" | \"@@ \" /(.+)/) LF", + "change_line: (\"+\" | \"-\" | \" \") /(.*)/ LF", + "eof_line: \"*** End of File\" LF", + "", + "%import common.LF" +].join("\n"); +const apiKeyLimitCounters = new Map(); +const providerCredentialCooldowns = new Map(); +const providerCredentialCooldownMs = 60_000; +const providerCredentialSpilloverThreshold = 0.8; +const upstreamRetryBackoffBaseMs = 1_000; +const upstreamRetryBackoffMaxMs = 30_000; +const upstreamRetryAfterMaxMs = 60_000; +const gatewayProviderProtocolFallbackOrder: GatewayProviderProtocol[] = [ + "anthropic_messages", + "openai_chat_completions", + "openai_responses", + "gemini_generate_content", + "gemini_interactions" +]; +const privateDirMode = 0o700; +const privateFileMode = 0o600; +const persistedApiKeyCacheTtlMs = 1000; +let persistedApiKeyCache: { loadedAt: number; values: ApiKeyConfig[] } | undefined; + +class GatewayService { + private browserAutomationMcpIntegration?: BrowserAutomationMcpIntegration; + private browserWebSearchMcpIntegration?: BrowserWebSearchMcpIntegration; + private child?: ChildProcess; + private config?: AppConfig; + private coreAuthToken = ""; + private plugin?: ClaudeCodeRouterPlugin; + private readonly pendingRawTraceUpdates = new Map(); + private readonly rawTraceSyncToken = randomUUID(); + private server?: Server; + private status: GatewayStatus = { + coreEndpoint: "", + endpoint: "", + generatedConfigFile: "", + networkEndpoints: [], + state: "stopped" + }; + + setBrowserWebSearchMcpIntegration(integration: BrowserWebSearchMcpIntegration): void { + this.browserWebSearchMcpIntegration = integration; + } + + setBrowserAutomationMcpIntegration(integration: BrowserAutomationMcpIntegration): void { + this.browserAutomationMcpIntegration = integration; + } + + async start(config: AppConfig): Promise { + const coreHostError = loopbackCoreHostError(config.gateway.coreHost); + if (coreHostError) { + this.status = { + ...this.getStatus(), + lastError: coreHostError, + state: "error" + }; + return this.status; + } + await this.stop(); + this.config = config; + this.coreAuthToken = generateCoreGatewayAuthToken(); + this.plugin = new ClaudeCodeRouterPlugin(config); + this.status = { + coreEndpoint: endpoint(config.gateway.coreHost, config.gateway.corePort), + endpoint: endpoint(config.gateway.host, config.gateway.port), + generatedConfigFile: config.gateway.generatedConfigFile, + networkEndpoints: gatewayNetworkEndpoints(config.gateway.host, config.gateway.port), + state: "starting" + }; + + try { + await pluginService.start(config); + const shouldRunServer = shouldRunUnifiedServer(config) || pluginService.hasGatewayRoutes(); + const shouldRunGateway = shouldRunGatewayRuntime(config); + if (shouldRunGateway && !hasAvailableGatewayModels(config)) { + throw new Error(NO_AVAILABLE_GATEWAY_MODELS_MESSAGE); + } + if (!shouldRunServer) { + await pluginService.stop(); + await backendService.stopAll(); + this.coreAuthToken = ""; + this.status = { + ...this.status, + state: "stopped" + }; + return this.status; + } + + await this.listen(config); + if (this.server) { + const proxyStatus = await proxyService.attach(config, this.server); + if (proxyStatus.state === "error" && !config.gateway.enabled) { + throw new Error(proxyStatus.lastError || "Proxy service failed to start."); + } + } + + if (shouldRunGateway) { + await writeCoreGatewayConfig(config, this.rawTraceSyncToken, this.coreAuthToken, this.browserWebSearchMcpIntegration); + await stopPreviousManagedCoreGateway(config, this.status.coreEndpoint); + if (await isCoreGatewayHealthy(this.status.coreEndpoint)) { + throw new Error(`Core gateway endpoint is already in use: ${this.status.coreEndpoint}`); + } + await proxyService.refreshUpstreamProxyFromCurrentSystem(); + const runtimeId = randomUUID(); + const upstreamProxyUrl = proxyService.getUpstreamProxyUrl("https") ?? await getSystemProxyUrlForProtocol("https"); + this.child = spawnGatewayProcess(config, upstreamProxyUrl, runtimeId, this.coreAuthToken); + const managedChild = this.child; + writeManagedCoreGatewayMarker(config, this.child, runtimeId); + this.child.stdout?.on("data", (chunk) => console.info(`[gateway] ${chunk.toString().trimEnd()}`)); + this.child.stderr?.on("data", (chunk) => console.warn(`[gateway] ${chunk.toString().trimEnd()}`)); + this.child.on("exit", (code, signal) => { + void this.handleCoreGatewayExit(managedChild, code, signal); + }); + } + + this.status = { + ...this.status, + coreManagedExternally: this.status.coreManagedExternally, + lastStartedAt: new Date().toISOString(), + pid: this.child?.pid, + state: "running" + }; + return this.status; + } catch (error) { + await this.stop(); + this.status = { + ...this.status, + lastError: formatError(error), + state: "error" + }; + return this.status; + } + } + + async stop(options: GatewayStopOptions = {}): Promise { + const child = this.child; + const config = this.config; + this.child = undefined; + this.coreAuthToken = ""; + if (child && !child.killed) { + child.kill(); + } + removeManagedCoreGatewayMarker(config); + + const server = this.server; + this.server = undefined; + if (server) { + await closeServer(server); + } + + await proxyService.stop(options.proxyRestoreTimeoutMs); + await pluginService.stop(); + await backendService.stopAll(); + await this.browserWebSearchMcpIntegration?.stopBrowserWebSearchMcpServers().catch((error) => { + console.warn(`[gateway] Failed to stop browser web search MCP: ${formatError(error)}`); + }); + await this.browserAutomationMcpIntegration?.stopBrowserAutomationMcpServer().catch((error) => { + console.warn(`[gateway] Failed to stop browser automation MCP: ${formatError(error)}`); + }); + + this.status = { + ...this.status, + coreManagedExternally: undefined, + pid: undefined, + state: "stopped" + }; + return this.getStatus(); + } + + getStatus(): GatewayStatus { + return { + ...this.status, + networkEndpoints: this.config + ? gatewayNetworkEndpoints(this.config.gateway.host, this.config.gateway.port) + : this.status.networkEndpoints + }; + } + + updateConfig(config: AppConfig): void { + assertLoopbackCoreHost(config.gateway.coreHost); + this.config = config; + this.plugin = new ClaudeCodeRouterPlugin(config); + proxyService.updateConfig(config); + this.status = { + ...this.status, + coreEndpoint: endpoint(config.gateway.coreHost, config.gateway.corePort), + endpoint: endpoint(config.gateway.host, config.gateway.port), + generatedConfigFile: config.gateway.generatedConfigFile, + networkEndpoints: gatewayNetworkEndpoints(config.gateway.host, config.gateway.port) + }; + } + + private async listen(config: AppConfig): Promise { + this.server = createServer((request, response) => { + if (proxyService.shouldHandleHttpRequest(request)) { + void proxyService.handleHttpRequest(request, response).catch((error) => { + response.writeHead(502, { "content-type": "application/json" }); + response.end(JSON.stringify({ error: { message: formatError(error) } })); + }); + return; + } + + void this.handleRequest(request, response).catch((error) => { + response.writeHead(502, { "content-type": "application/json" }); + response.end(JSON.stringify({ error: { message: formatError(error) } })); + }); + }); + + await new Promise((resolve, reject) => { + this.server?.once("error", reject); + this.server?.listen(config.gateway.port, config.gateway.host, () => { + this.server?.off("error", reject); + resolve(); + }); + }); + } + + private async handleCoreGatewayExit(child: ChildProcess, code: number | null, signal: NodeJS.Signals | null): Promise { + if (this.child !== child || this.status.state === "stopped") { + return; + } + removeManagedCoreGatewayMarker(this.config); + this.status = { + ...this.status, + coreManagedExternally: undefined, + lastError: `Core gateway exited with ${signal ?? code ?? "unknown status"}`, + pid: undefined, + state: "error" + }; + } + + private async handleRequest(request: IncomingMessage, response: ServerResponse): Promise { + applyCors(response, this.config); + + if (request.method === "OPTIONS") { + response.writeHead(204); + response.end(); + return; + } + + if (!this.config || !this.plugin) { + sendJson(response, 503, { error: { message: "Gateway service is not configured." } }); + return; + } + + const path = request.url ? new URL(request.url, this.status.endpoint || "http://127.0.0.1").pathname : "/"; + if (path === rawTraceSyncPath) { + if (!shouldRecordRequestLogs(this.config)) { + sendJson(response, 202, { applied: false, disabled: true, ok: true }); + return; + } + await this.handleRawTraceSync(request, response); + return; + } + + if (path === ccrRemoteControlPathPrefix || path.startsWith(`${ccrRemoteControlPathPrefix}/`)) { + const authorization = await authorize(request, response, this.config); + if (!authorization.ok) { + return; + } + await ccrRemoteControlService.handleRequest({ + endpoint: this.status.endpoint, + path, + readBody: readRequestBody, + request, + response, + sendJson + }); + return; + } + + if (path === BROWSER_AUTOMATION_MCP_PATH || path === `${BROWSER_AUTOMATION_MCP_PATH}/`) { + if (!browserAutomationMcpEnabled(this.config)) { + sendJson(response, 404, { + error: { + message: "CCR browser automation MCP is disabled." + } + }); + return; + } + const authorization = await authorize(request, response, this.config); + if (!authorization.ok) { + return; + } + if (!this.browserAutomationMcpIntegration) { + sendJson(response, 503, { + error: { + message: "CCR browser automation MCP is only available in the Electron desktop app." + } + }); + return; + } + await this.browserAutomationMcpIntegration.handleBrowserAutomationMcpRequest(request, response); + return; + } + + if (isNetworkCaptureMcpPath(path)) { + if (!this.config.proxy.captureNetwork) { + sendJson(response, 404, { error: { message: "Network capture MCP is disabled." } }); + return; + } + const authorization = await authorize(request, response, this.config); + if (!authorization.ok) { + return; + } + await handleNetworkCaptureMcpRequest(request, response); + return; + } + + const pluginRoute = pluginService.matchGatewayRoute(request.method, path); + if (pluginRoute) { + if (pluginRoute.auth !== "none") { + const authorization = await authorize(request, response, this.config); + if (!authorization.ok) { + return; + } + } + await pluginService.handleGatewayRoute(pluginRoute, request, response); + return; + } + + if (!shouldServeGatewayRequest(this.config, request)) { + sendJson(response, 503, { error: { message: "Gateway runtime is disabled." } }); + return; + } + + if (path === "/health") { + sendJson(response, 200, { + core: this.status.coreEndpoint, + coreManagedExternally: this.status.coreManagedExternally || undefined, + status: this.status.state, + timestamp: new Date().toISOString() + }); + return; + } + + if (path === "/") { + sendJson(response, 200, { + core: "next-ai-gateway", + endpoints: ["POST /mcp", "POST /v1/messages", "POST /v1/messages/count_tokens", "GET /v1/models"], + name: "claude-code-router", + plugin: "claude-code-router", + wrapperPlugins: this.config.plugins.filter((plugin) => plugin.enabled !== false).map((plugin) => plugin.id) + }); + return; + } + + const authorization = await authorize(request, response, this.config); + if (!authorization.ok) { + return; + } + + if (request.method === "POST" && path === "/v1/messages/count_tokens") { + const requestBody = await readRequestBody(request); + const body = parseJsonObject(requestBody); + if (!reserveApiKeyLimits(authorization.apiKey, request, response, requestBody)) { + return; + } + sendJson(response, 200, this.plugin.countTokens(body)); + return; + } + + await this.proxyRequest(request, response, path, authorization.apiKey); + } + + private async proxyRequest(request: IncomingMessage, response: ServerResponse, path: string, apiKey?: ApiKeyConfig): Promise { + if (!this.config || !this.plugin) { + sendJson(response, 503, { error: { message: "Gateway service is not configured." } }); + return; + } + + const headers = forwardHeaders(request.headers); + if (apiKey) { + stripLocalGatewayAuthHeaders(headers); + headers["x-auth-api-key-id"] = apiKey.id; + headers["x-auth-sub"] = apiKey.id; + } + const method = request.method ?? "GET"; + const requestBody = await readRequestBody(request); + const client = inferGatewayClient(apiKey, request.headers); + const cursorCompatPreparation = prepareCursorOpenAICompatChatBody(this.config, client, method, path, requestBody); + if (cursorCompatPreparation) { + headers["x-ccr-cursor-openai-compat"] = sanitizeHeaderValue(cursorCompatPreparation.diagnostic); + } + let bodyToForward: Buffer | undefined = cursorCompatPreparation?.body ?? requestBody; + let routeFallback = this.config.Router.fallback; + let routedModel: string | undefined; + let codexApplyPatchBridgeActive = false; + const claudeModelRewrite = prepareClaudeCodeDiscoveredModelRequest(this.config, request.headers, method, path, bodyToForward); + if (claudeModelRewrite) { + headers["x-ccr-claude-model-discovery"] = sanitizeHeaderValue(claudeModelRewrite.diagnostic); + bodyToForward = claudeModelRewrite.body; + } + const claudeAppModelRewrite = prepareClaudeAppFallbackModelRequest(this.config, method, path, bodyToForward); + if (claudeAppModelRewrite) { + headers["x-ccr-claude-app-model-rewrite"] = sanitizeHeaderValue(claudeAppModelRewrite.diagnostic); + bodyToForward = claudeAppModelRewrite.body; + routedModel = claudeAppModelRewrite.routedModel; + } + if (!reserveApiKeyLimits(apiKey, request, response, bodyToForward)) { + return; + } + const startedAt = Date.now(); + const startedAtIso = new Date(startedAt).toISOString(); + const requestId = randomUUID(); + headers["x-client-request-id"] = requestId; + const requestUrl = new URL(request.url || path, this.status.endpoint || "http://127.0.0.1").toString(); + const upstreamAbortController = new AbortController(); + let clientDisconnected = false; + let responseCompleted = false; + let onClientDisconnect: (() => void) | undefined; + let onResponseFinish: (() => void) | undefined; + const handleClientDisconnect = () => { + if (responseCompleted || response.writableEnded) { + return; + } + if (!clientDisconnected) { + clientDisconnected = true; + upstreamAbortController.abort(new Error(clientDisconnectMessage)); + } + onClientDisconnect?.(); + }; + + response.once("finish", () => { + responseCompleted = true; + onResponseFinish?.(); + }); + response.once("close", handleClientDisconnect); + response.on("error", () => { + // Client-side write failures (EPIPE / ECONNRESET when the client closes + // mid-stream, common during tool execution) must not crash the main + // process as an Uncaught Exception. Swallow them here; the close handler + // above already records the disconnect via writeStreamLog. + handleClientDisconnect(); + }); + + const writeRequestLog = ( + statusCode: number, + responseHeaders: Headers, + responseBodyText = "", + responseBodyTruncated = false, + error?: string + ) => { + const config = this.config; + if (!config || !shouldRecordRequestLogs(config)) { + return; + } + void (async () => { + await recordGatewayRequestLog({ + client, + completedAt: new Date().toISOString(), + durationMs: Date.now() - startedAt, + error, + fallbackModel: routedModel, + method, + path, + providerName: resolveProviderLogName(responseHeaders, config, routedModel), + providerProtocol: resolveResponseProviderProtocol(responseHeaders, this.config), + requestBody: shouldSendBody(method) ? bodyToForward ?? Buffer.alloc(0) : Buffer.alloc(0), + requestHeaders: headers, + requestId, + responseBodyText, + responseBodyTruncated, + responseHeaders, + startedAt: startedAtIso, + statusCode, + url: requestUrl + }); + const pendingRawTraceUpdate = this.takePendingRawTraceUpdate(requestId); + if (pendingRawTraceUpdate) { + await updateGatewayRequestLogFromRawTrace(pendingRawTraceUpdate); + } + })(); + }; + + const shouldCaptureUsage = shouldCaptureGatewayUsage(method, path); + if (shouldServeGatewayModelsResponse(method, path)) { + const responseText = `${JSON.stringify(createGatewayModelsResponse(this.config, request.headers, apiKey))}\n`; + const modelHeaders = new Headers({ + "cache-control": "no-store, max-age=0", + "content-length": String(Buffer.byteLength(responseText)), + "content-type": "application/json; charset=utf-8", + "expires": "0", + "pragma": "no-cache" + }); + response.writeHead(200, Object.fromEntries(filteredResponseHeaders(modelHeaders))); + response.end(responseText); + return; + } + + if (method === "POST" && path === "/v1/messages") { + const body = parseJsonObject(bodyToForward ?? requestBody); + const routed = await this.plugin.routeRequest({ + body, + headers: headers as Record, + method, + url: request.url ?? path + }); + const serialized = Buffer.from(`${JSON.stringify(routed.body)}\n`, "utf8"); + headers["content-type"] = "application/json"; + headers["x-ccr-route-reason"] = sanitizeHeaderValue(routed.decision.reason); + routeFallback = routed.decision.fallback ?? routeFallback; + if (routed.decision.model) { + headers["x-ccr-routed-model"] = sanitizeHeaderValue(routed.decision.model); + routedModel = routed.decision.model; + } + bodyToForward = serialized; + } + if (method === "POST" && requestProtocolForPath(path) === "openai_responses" && isCodexUserAgent(request.headers)) { + const body = parseJsonObject(bodyToForward ?? requestBody); + const routed = await this.plugin.routeRequest({ + body, + headers: headers as Record, + method, + url: request.url ?? path + }); + const serialized = Buffer.from(`${JSON.stringify(routed.body)}\n`, "utf8"); + headers["content-type"] = "application/json"; + headers["x-ccr-route-reason"] = sanitizeHeaderValue(routed.decision.reason); + routeFallback = routed.decision.fallback ?? routeFallback; + if (routed.decision.model) { + headers["x-ccr-routed-model"] = sanitizeHeaderValue(routed.decision.model); + routedModel = routed.decision.model; + } + bodyToForward = serialized; + } + + const codexApplyPatchBridgeRequest = prepareCodexApplyPatchBridgeRequest({ + body: bodyToForward, + config: this.config, + headers: request.headers, + method, + path, + routedModel + }); + if (codexApplyPatchBridgeRequest) { + bodyToForward = codexApplyPatchBridgeRequest.body; + codexApplyPatchBridgeActive = true; + headers["x-ccr-codex-patch-bridge"] = sanitizeHeaderValue(codexApplyPatchBridgeRequest.diagnostic); + headers["content-type"] = "application/json"; + } + + const providerCapabilityRouting = applyProviderCapabilityRouting({ + body: bodyToForward, + config: this.config, + fallback: routeFallback, + headers, + path, + routedModel + }); + bodyToForward = providerCapabilityRouting.body; + routeFallback = providerCapabilityRouting.fallback; + routedModel = providerCapabilityRouting.routedModel; + + const hostedWebSearchProtocolContext = createHostedWebSearchProtocolContext({ + body: bodyToForward, + config: this.config, + method, + path, + requestId, + routedModel, + sinceMs: startedAt - 1_000 + }); + + if (hostedWebSearchProtocolContext && !this.browserWebSearchMcpIntegration) { + const body = parseJsonObjectSafe(bodyToForward); + if (body) { + const queryHint = extractHostedWebSearchQueryHint(body, hostedWebSearchProtocolContext.protocol); + if (queryHint) { + const provider = fusionWebSearchProviderForToolName(this.config, hostedWebSearchProtocolContext.toolName); + const records = provider ? await runWebSearch(queryHint, provider) : []; + if (records.length > 0) { + // Short-circuit: return synthetic response (LiteLLM-style). + // Use server_tool_use + web_search_tool_result (nested) format + // matching https://docs.anthropic.com/en/api/web-search-tool + const toolUseId = `srvtoolu_${randomUUID().replace(/-/g, "").slice(0, 24)}`; + const content: Record[] = []; + content.push({ + type: "server_tool_use", + id: toolUseId, + name: "web_search", + input: { query: queryHint } + }); + const resultItems: Record[] = []; + const textParts: string[] = []; + for (const record of records) { + for (const result of record.results) { + resultItems.push({ + type: "web_search_result", + url: result.url, + title: result.title, + page_age: null, + encrypted_content: "" + }); + const snippet = (result.snippet || result.content || "").slice(0, 500); + textParts.push(`Title: ${result.title}\nURL: ${result.url}\nSnippet: ${snippet}`); + } + } + content.push({ + type: "web_search_tool_result", + tool_use_id: toolUseId, + content: resultItems + }); + if (textParts.length > 0) { + content.push({ type: "text", text: textParts.join("\n\n") }); + } + const syntheticPayload: Record = { + id: `msg_${randomUUID().replace(/-/g, "").slice(0, 24)}`, + type: "message", + role: "assistant", + model: routedModel, + content, + stop_reason: "end_turn", + stop_sequence: null, + usage: { input_tokens: 0, output_tokens: 0, server_tool_use: { web_search_requests: records.length } } + }; + const responseBody = JSON.stringify(syntheticPayload); + writeRequestLog(200, new Headers({ "content-type": "application/json" }), responseBody, false); + sendJson(response, 200, syntheticPayload); + return; + } + } + } + if (!hostedWebSearchProtocolContext.records) { + const message = browserWebSearchUnavailableMessage(hostedWebSearchProtocolContext.toolName); + const responseHeaders = new Headers({ "content-type": "application/json; charset=utf-8" }); + const responseBody = JSON.stringify({ error: { message } }); + writeRequestLog(503, responseHeaders, responseBody, false, message); + sendJson(response, 503, { error: { message } }); + return; + } + } + + if (hostedWebSearchProtocolContext && this.browserWebSearchMcpIntegration) { + const records = await selectHostedWebSearchProtocolRecords( + hostedWebSearchProtocolContext, + this.browserWebSearchMcpIntegration + ).catch((error) => { + console.warn(`[gateway] Failed to prefetch hosted web search results: ${formatError(error)}`); + return [] as BrowserWebSearchProtocolRecord[]; + }); + if (records.length > 0) { + hostedWebSearchProtocolContext.records = records; + const webSearchContextBody = prepareHostedWebSearchProtocolRequestBody( + bodyToForward, + records, + hostedWebSearchProtocolContext + ); + if (webSearchContextBody) { + bodyToForward = webSearchContextBody; + headers["content-type"] = "application/json"; + headers["x-ccr-hosted-web-search-context"] = hostedWebSearchProtocolContext.protocol; + } + } + } + + const claudeCodeWebSearchContinuationContext = !hostedWebSearchProtocolContext && this.browserWebSearchMcpIntegration + ? createClaudeCodeWebSearchContinuationContext({ + body: bodyToForward, + config: this.config, + method, + path, + routedModel, + sinceMs: startedAt - 5 * 60_000 + }) + : undefined; + if (claudeCodeWebSearchContinuationContext && this.browserWebSearchMcpIntegration) { + const records = selectClaudeCodeWebSearchContinuationRecords( + claudeCodeWebSearchContinuationContext, + this.browserWebSearchMcpIntegration + ); + const webSearchContinuationBody = prepareClaudeCodeWebSearchContinuationRequestBody( + bodyToForward, + records, + claudeCodeWebSearchContinuationContext + ); + if (webSearchContinuationBody) { + bodyToForward = webSearchContinuationBody; + headers["content-type"] = "application/json"; + headers["x-ccr-claude-code-web-search-continuation"] = records.length > 0 ? "in-app-browser-evidence" : "tool-result-evidence"; + } + } + + delete headers["content-length"]; + const upstreamUrl = new URL(request.url || "/", this.status.coreEndpoint).toString(); + let upstreamResult: UpstreamFetchResult; + + try { + upstreamResult = await fetchUpstreamWithFallback({ + body: bodyToForward, + config: this.config, + fallback: routeFallback, + headers, + method, + path, + routedModel, + coreAuthToken: this.coreAuthToken, + signal: upstreamAbortController.signal, + upstreamUrl + }); + } catch (error) { + const message = formatError(error); + if (error instanceof UpstreamRequestError) { + bodyToForward = error.attempt?.body ?? bodyToForward; + routedModel = error.attempt?.model ?? routedModel; + } + if (clientDisconnected || upstreamAbortController.signal.aborted) { + writeRequestLog(clientClosedRequestStatusCode, new Headers(), "", false, clientDisconnectMessage); + return; + } + if (shouldCaptureUsage) { + void recordGatewayUsageCapture({ + bodyText: "", + client, + durationMs: Date.now() - startedAt, + fallbackModel: routedModel, + method, + path, + providerName: resolveProviderLogName(new Headers(), this.config, routedModel), + providerProtocol: resolveResponseProviderProtocol(new Headers(), this.config), + requestId, + responseHeaders: new Headers(), + statusCode: 502 + }); + } + writeRequestLog(502, new Headers(), "", false, message); + throw error; + } + + bodyToForward = upstreamResult.attempt.body ?? bodyToForward; + routedModel = upstreamResult.attempt.model ?? routedModel; + const responseHeaders = rewriteCapabilityResponseHeaders( + // Copy into a mutable Headers instance: upstream fetch Response.headers + // can be immutable (TypeError: immutable on .delete/.set), and + // mergeFallbackResponseHeaders returns the original object as-is when + // no fallback occurred. Codex apply_patch / web-search paths call + // .delete("content-length") below, which would otherwise throw and + // surface as a 502. + new Headers(mergeFallbackResponseHeaders(upstreamResponseHeaders(upstreamResult), upstreamResult)), + this.config + ); + const upstreamResponse = upstreamResult.response; + if (clientDisconnected || upstreamAbortController.signal.aborted) { + await cancelResponseBody(upstreamResponse); + writeRequestLog(clientClosedRequestStatusCode, responseHeaders, "", false, clientDisconnectMessage); + return; + } + if (codexApplyPatchBridgeActive) { + responseHeaders.delete("content-length"); + } + const hostedWebSearchResponseContentType = responseHeaders.get("content-type")?.toLowerCase() ?? ""; + if ( + hostedWebSearchProtocolContext && + (hostedWebSearchResponseContentType.includes("application/json") || + hostedWebSearchResponseContentType.includes("text/event-stream")) && + (this.browserWebSearchMcpIntegration?.recentBrowserWebSearchResults || this.browserWebSearchMcpIntegration?.runBrowserWebSearch) + ) { + responseHeaders.delete("content-length"); + } + recordProviderCredentialOutcome(this.config, method, upstreamResult.attempt, upstreamResponse.status, responseHeaders); + if (clientDisconnected || response.destroyed) { + await cancelResponseBody(upstreamResponse); + writeRequestLog(clientClosedRequestStatusCode, responseHeaders, "", false, clientDisconnectMessage); + return; + } + response.writeHead(upstreamResponse.status, Object.fromEntries(filteredResponseHeaders(responseHeaders))); + if (!upstreamResponse.body) { + if (shouldCaptureUsage) { + void recordGatewayUsageCapture({ + bodyText: "", + client, + durationMs: Date.now() - startedAt, + fallbackModel: routedModel, + method, + path, + providerName: resolveProviderLogName(responseHeaders, this.config, routedModel), + providerProtocol: resolveResponseProviderProtocol(responseHeaders, this.config), + requestId, + responseHeaders, + statusCode: upstreamResponse.status + }); + } + writeRequestLog(upstreamResponse.status, responseHeaders); + response.end(); + return; + } + + const upstreamBody = Readable.fromWeb(upstreamResponse.body as unknown as import("node:stream/web").ReadableStream); + const patchedResponseBody = codexApplyPatchBridgeActive + ? codexApplyPatchBridgeResponseStream(upstreamBody, responseHeaders) + : upstreamBody; + const responseBody = hostedWebSearchProtocolContext + ? hostedWebSearchProtocolResponseStream( + patchedResponseBody, + responseHeaders, + hostedWebSearchProtocolContext, + this.browserWebSearchMcpIntegration + ) + : patchedResponseBody; + const responseStreams = uniqueStreams([upstreamBody, patchedResponseBody, responseBody]); + const sampler = createBodySampler(); + const sseErrorDetector = createSseErrorDetector(responseHeaders.get("content-type") ?? undefined); + let streamDetectedError: string | undefined; + let upstreamStreamEnded = false; + let logRecorded = false; + const writeStreamLog = (error?: string) => { + if (logRecorded) { + return; + } + logRecorded = true; + writeRequestLog( + clientDisconnected ? clientClosedRequestStatusCode : upstreamResponse.status, + responseHeaders, + sampler.read(), + sampler.isTruncated(), + error ?? streamDetectedError + ); + }; + onClientDisconnect = () => { + writeStreamLog(clientDisconnectMessage); + responseBody.unpipe(response); + destroyResponseStreams(responseStreams); + }; + onResponseFinish = () => { + if (upstreamStreamEnded) { + writeStreamLog(); + } + }; + const onResponseStreamError = (error: Error) => { + streamDetectedError ??= sseErrorDetector.finish(); + writeStreamLog(clientDisconnected ? clientDisconnectMessage : formatError(error)); + }; + for (const stream of responseStreams) { + stream.on("error", onResponseStreamError); + } + responseBody.on("data", (chunk) => { + sampler.append(chunk); + streamDetectedError ??= sseErrorDetector.append(chunk); + }); + responseBody.once("end", () => { + upstreamStreamEnded = true; + streamDetectedError ??= sseErrorDetector.finish(); + if (responseCompleted || response.writableEnded) { + writeStreamLog(); + } + }); + if (shouldCaptureUsage) { + responseBody.once("end", () => { + void recordGatewayUsageCapture({ + bodyText: sampler.read(), + client, + durationMs: Date.now() - startedAt, + fallbackModel: routedModel, + method, + path, + providerName: resolveProviderLogName(responseHeaders, this.config, routedModel), + providerProtocol: resolveResponseProviderProtocol(responseHeaders, this.config), + requestId, + responseHeaders, + statusCode: upstreamResponse.status + }); + }); + } + if (clientDisconnected || response.destroyed) { + onClientDisconnect(); + return; + } + responseBody.pipe(response); + } + + private async handleRawTraceSync(request: IncomingMessage, response: ServerResponse): Promise { + if (request.method !== "POST") { + sendJson(response, 405, { error: { message: "Method not allowed." } }); + return; + } + if (readHeader(request.headers[rawTraceSyncHeader]) !== this.rawTraceSyncToken) { + sendJson(response, 401, { error: { message: "Unauthorized raw trace sync." } }); + return; + } + + const manifest = parseJsonObject(await readRequestBody(request)); + const update = readRawTraceRequestLogUpdate(manifest); + cleanupRawTraceBundle(manifest); + if (!update) { + sendJson(response, 202, { applied: false, ok: true }); + return; + } + + const applied = await updateGatewayRequestLogFromRawTrace(update); + if (!applied) { + this.storePendingRawTraceUpdate(update); + } + sendJson(response, 200, { applied, ok: true }); + } + + private storePendingRawTraceUpdate(update: RequestLogRawTraceUpdateInput): void { + this.prunePendingRawTraceUpdates(); + this.pendingRawTraceUpdates.set(update.requestId, { + ...update, + receivedAt: Date.now() + }); + while (this.pendingRawTraceUpdates.size > maxPendingRawTraceUpdates) { + const oldestKey = this.pendingRawTraceUpdates.keys().next().value; + if (!oldestKey) { + break; + } + this.pendingRawTraceUpdates.delete(oldestKey); + } + } + + private takePendingRawTraceUpdate(requestId: string): RequestLogRawTraceUpdateInput | undefined { + const update = this.pendingRawTraceUpdates.get(requestId); + if (!update) { + return undefined; + } + this.pendingRawTraceUpdates.delete(requestId); + const { receivedAt: _receivedAt, ...input } = update; + return input; + } + + private prunePendingRawTraceUpdates(): void { + const cutoff = Date.now() - pendingRawTraceMaxAgeMs; + for (const [requestId, update] of this.pendingRawTraceUpdates) { + if (update.receivedAt < cutoff) { + this.pendingRawTraceUpdates.delete(requestId); + } + } + } +} + +export const gatewayService = new GatewayService(); + +async function writeCoreGatewayConfig( + config: AppConfig, + rawTraceSyncToken: string, + coreAuthToken: string, + browserWebSearchMcpIntegration?: BrowserWebSearchMcpIntegration +): Promise { + assertLoopbackCoreHost(config.gateway.coreHost); + mkdirSync(dirname(config.gateway.generatedConfigFile), { mode: privateDirMode, recursive: true }); + const pluginCoreGatewayConfig = pluginService.getCoreGatewayConfig(); + const providerPlugins = withCodexOauthRuntimeDefaults([ + ...(config.providerPlugins ?? []).filter(providerPluginEnabled), + ...pluginService.getCoreProviderPlugins().filter(providerPluginEnabled) + ]); + const codexOauthProviderNames = codexOauthLocalProviderNames(providerPlugins); + const virtualModelProfiles = normalizeCoreGatewayVirtualModelProfiles(withCodexCompatibleVirtualModelProfiles(withFusionVirtualModelAliases([ + ...(config.virtualModelProfiles ?? []), + ...pluginService.getVirtualModelProfiles() + ])), config); + const coreEndpoint = endpoint(config.gateway.coreHost, config.gateway.corePort); + const proxyUrl = process.env.CCR_UPSTREAM_PROXY_URL || process.env.HTTPS_PROXY || process.env.https_proxy; + const proxyPreloadFile = proxyUrl + ? pathJoin(dirname(config.gateway.generatedConfigFile), "gateway-proxy-preload.cjs") + : undefined; + const proxyEnv = proxyUrl ? { CCR_UPSTREAM_PROXY_URL: proxyUrl, CCR_UNDICI_MODULE: resolveUndiciProxyAgentModule() } : undefined; + const builtinToolArtifacts = await fusionBuiltinToolArtifacts( + virtualModelProfiles, coreEndpoint, coreAuthToken, browserWebSearchMcpIntegration, proxyPreloadFile, proxyEnv + ); + const providers = [ + ...config.Providers + .flatMap((provider) => toCoreGatewayProviders(withCodexOauthProviderBaseUrl(provider, codexOauthProviderNames))) + .filter((provider): provider is CoreGatewayProvider => Boolean(provider)), + ...builtinToolArtifacts.providers + ]; + const pluginAgentConfig = isRecord(pluginCoreGatewayConfig.agent) ? pluginCoreGatewayConfig.agent : {}; + const pluginMcpServers = Array.isArray(pluginAgentConfig.mcpServers) ? pluginAgentConfig.mcpServers : []; + const externalMcpServers = [ + ...pluginMcpServers, + ...(config.agent?.mcpServers ?? []), + ...(config.toolHub?.mcpServers ?? []) + ]; + const toolHubServer = toolHubMcpServer(config, externalMcpServers); + const mcpServers = [ + ...builtinToolArtifacts.mcpServers, + ...(toolHubServer ? [toolHubServer] : externalMcpServers) + ]; + const fallbackMcpServer = fusionToolFallbackMcpServer(virtualModelProfiles, [ + ...builtinToolArtifacts.mcpServers, + ...externalMcpServers + ]); + if (fallbackMcpServer) { + mcpServers.push(fallbackMcpServer); + } + const payload = { + ...pluginCoreGatewayConfig, + auth: { + enabled: true, + mode: "static_api_key", + required: true, + staticApiKeys: { + keyBearerOnly: false, + keyEnv: coreGatewayAuthTokenEnv, + keyHeader: coreGatewayAuthHeader + } + }, + billing: { + enabled: true + }, + billingQueue: { + enabled: false + }, + billingWebhook: { + enabled: false + }, + bodyLimitBytes: 50 * 1024 * 1024, + host: config.gateway.coreHost, + mcpGateway: { + enabled: false + }, + port: config.gateway.corePort, + upstreamTimeoutMs: Number(config.API_TIMEOUT_MS) || 0, + agent: { + ...pluginAgentConfig, + mcpServers + }, + rawTrace: buildRawTraceConfig(config, rawTraceSyncToken), + providerPlugins, + providers, + virtualModelProfiles + }; + + writePrivateTextFile(config.gateway.generatedConfigFile, `${JSON.stringify(payload, null, 2)}\n`); +} + +function writePrivateTextFile(file: string, content: string): void { + writeFileSync(file, content, { encoding: "utf8", mode: privateFileMode }); + if (process.platform !== "win32") { + try { + chmodSync(file, privateFileMode); + } catch { + // Best effort for filesystems that do not support chmod. + } + } +} + +function providerPluginEnabled(plugin: unknown): boolean { + return !isRecord(plugin) || plugin.enabled !== false; +} + +export function normalizeCoreGatewayVirtualModelProfiles(profiles: unknown[], config: AppConfig): unknown[] { + return profiles.map((profile) => normalizeCoreGatewayVirtualModelProfile(profile, config)); +} + +function normalizeCoreGatewayVirtualModelProfile(profile: unknown, config: AppConfig): unknown { + if (!isRecord(profile)) { + return profile; + } + + let nextProfile: Record | undefined; + const baseModel = isRecord(profile.baseModel) ? profile.baseModel : undefined; + const fixedModel = stringValue(baseModel?.fixedModel); + const rewrittenFixedModel = fixedModel + ? rewriteModelSelectorForCoreGatewayProfile(fixedModel, config, "anthropic_messages") + : undefined; + if (baseModel && rewrittenFixedModel && rewrittenFixedModel !== fixedModel) { + nextProfile = { + ...profile, + baseModel: { + ...baseModel, + fixedModel: rewrittenFixedModel + } + }; + } + + const sourceProfile = nextProfile ?? profile; + const metadata = isRecord(sourceProfile.metadata) ? sourceProfile.metadata : undefined; + const fusionVision = isRecord(metadata?.fusionVision) ? metadata.fusionVision : undefined; + const visionBaseUrl = stringValue(fusionVision?.baseUrl); + const visionSelectorField = stringValue(fusionVision?.modelSelector) ? "modelSelector" : stringValue(fusionVision?.model) ? "model" : undefined; + const visionSelector = visionSelectorField ? stringValue(fusionVision?.[visionSelectorField]) : undefined; + const rewrittenVisionSelector = fusionVision && !visionBaseUrl && visionSelector + ? rewriteModelSelectorForCoreGatewayProfile(visionSelector, config, "openai_chat_completions") + : undefined; + + if (metadata && fusionVision && visionSelectorField && rewrittenVisionSelector && rewrittenVisionSelector !== visionSelector) { + nextProfile = { + ...sourceProfile, + metadata: { + ...metadata, + fusionVision: { + ...fusionVision, + [visionSelectorField]: rewrittenVisionSelector + } + } + }; + } + + const profileAfterVision = nextProfile ?? profile; + const profileAfterWebSearchToolName = normalizeFusionWebSearchProfileToolName(profileAfterVision) ?? profileAfterVision; + return withFusionWebSearchToolInstructions(profileAfterWebSearchToolName) ?? profileAfterWebSearchToolName; +} + +function rewriteModelSelectorForCoreGatewayProfile( + model: string, + config: AppConfig, + clientProtocol: GatewayProviderProtocol +): string | undefined { + const normalized = normalizeRouteSelector(model); + if (!normalized) { + return undefined; + } + + const publicModel = resolveGatewayPublicModelId(normalized, config) ?? normalized; + const selector = + resolveConfiguredProviderModelSelector(publicModel, config) ?? + resolveUniqueConfiguredProviderModelSelector(publicModel, config); + if (!selector) { + return publicModel; + } + + const providerName = coreGatewayProviderSelectorName(selector.provider, clientProtocol); + return providerName ? `${providerName}/${selector.model}` : publicModel; +} + +function coreGatewayProviderSelectorName( + provider: GatewayProviderConfig, + clientProtocol: GatewayProviderProtocol +): string | undefined { + const capability = providerCapabilityForClientProtocol(provider, clientProtocol); + const explicitCapabilities = normalizedProviderCapabilities(provider); + const protocol = capability?.type ?? (explicitCapabilities.length === 0 ? providerProtocolForClientProtocol(provider, clientProtocol) : undefined); + if (!protocol) { + return undefined; + } + + const credentials = sortProviderCredentialsForConfig(activeProviderCredentials(provider)); + if (credentials.length > 0) { + return providerCredentialInternalName(provider, protocol, credentials[0]); + } + + return capability ? providerCapabilityInternalName(provider, protocol) : providerRuntimeId(provider); +} + +function withCodexOauthRuntimeDefaults(providerPlugins: unknown[]): unknown[] { + const codexAuth = readCodexAuth(); + return providerPlugins.map((plugin) => { + if (!isLocalCodexOauthProviderPlugin(plugin)) { + return plugin; + } + + const codexOauth = plugin.codexOauth; + const nextCodexOauth = { + ...codexOauth, + ...(!hasOwn(codexOauth, "accountId") && !hasOwn(codexOauth, "account_id") && codexAuth?.accountId + ? { accountId: codexAuth.accountId } + : {}) + }; + const nextPlugin: Record = { + ...plugin, + codexOauth: nextCodexOauth, + request: withCodexBackendRequestTransform(plugin.request) + }; + + if (codexAuth?.isFedrampAccount) { + const currentAuth = isRecord(plugin.auth) ? plugin.auth : {}; + const currentHeaders = isRecord(currentAuth.headers) ? currentAuth.headers : {}; + nextPlugin.auth = { + ...currentAuth, + headers: { + ...currentHeaders, + "X-OpenAI-Fedramp": "true" + } + }; + } + + return nextPlugin; + }); +} + +function codexOauthLocalProviderNames(providerPlugins: unknown[]): Set { + const names = new Set(); + for (const plugin of providerPlugins) { + if (!isLocalCodexOauthProviderPlugin(plugin)) { + continue; + } + addProviderNameVariants(names, stringValue(plugin.providerName)); + } + return names; +} + +function withCodexOauthProviderBaseUrl( + provider: GatewayProviderConfig, + codexOauthProviderNames: Set +): GatewayProviderConfig { + if (!codexOauthProviderNames.has(provider.name)) { + return provider; + } + + const protocol = + normalizeProviderProtocol(provider.type) ?? + normalizeProviderProtocol(provider.provider) ?? + inferProtocol(provider); + if (protocol !== "openai_responses") { + return provider; + } + + const capabilities = Array.isArray(provider.capabilities) + ? provider.capabilities.map((capability) => { + const capabilityProtocol = normalizeProviderProtocol(capability.type); + if (capabilityProtocol !== "openai_responses") { + return capability; + } + return { + ...capability, + baseUrl: codexDefaultBaseUrl + }; + }) + : provider.capabilities; + + return { + ...provider, + api_base_url: codexDefaultBaseUrl, + baseUrl: codexDefaultBaseUrl, + baseurl: codexDefaultBaseUrl, + capabilities + }; +} + +function isLocalCodexOauthProviderPlugin(value: unknown): value is Record & { codexOauth: Record } { + if (!isRecord(value) || !isRecord(value.codexOauth)) { + return false; + } + const key = stringValue(value.key)?.toLowerCase() ?? ""; + return key.startsWith("ccr-local-agent-") && key.includes("codex-oauth"); +} + +function withCodexBackendRequestTransform(request: unknown): Record { + const currentRequest = isRecord(request) ? request : {}; + const bodyRemove = Array.isArray(currentRequest.bodyRemove) + ? currentRequest.bodyRemove.map((item) => stringValue(item)).filter((item): item is string => Boolean(item)) + : []; + return { + ...currentRequest, + bodyRemove: uniqueStrings([...bodyRemove, "max_output_tokens"]) + }; +} + +function addProviderNameVariants(names: Set, providerName: string | undefined): void { + if (!providerName) { + return; + } + names.add(providerName); + const capabilitySeparatorIndex = providerName.indexOf("::"); + if (capabilitySeparatorIndex > 0) { + names.add(providerName.slice(0, capabilitySeparatorIndex)); + } +} + +function hasOwn(value: Record, key: string): boolean { + return Object.prototype.hasOwnProperty.call(value, key); +} + +async function fusionBuiltinToolArtifacts( + profiles: unknown[], + coreEndpoint: string, + coreAuthToken: string, + browserWebSearchMcpIntegration?: BrowserWebSearchMcpIntegration, + proxyPreloadFile?: string, + proxyEnv?: Record +): Promise<{ mcpServers: GatewayMcpServerConfig[]; providers: CoreGatewayProvider[] }> { + const providers: CoreGatewayProvider[] = []; + const mcpServers: GatewayMcpServerConfig[] = []; + const toolServerKeys = new Set(); + const entry = bundledFusionBuiltinMcpEntryPath(); + + for (const [index, profile] of profiles.entries()) { + if (!isRecord(profile) || profile.enabled === false) { + continue; + } + const metadata = isRecord(profile.metadata) ? profile.metadata : undefined; + const profileId = stringValue(profile.id) || stringValue(profile.key) || `fusion-${index + 1}`; + const sanitizedProfileId = sanitizeMcpServerName(profileId); + + const visionConfig = readFusionVisionConfig(metadata?.fusionVision) ?? legacyFusionVisionConfig(profile); + if (visionConfig?.toolName) { + const resolvedVision = resolveFusionVisionRuntime(visionConfig); + providers.push(...resolvedVision.providers); + const toolServerKey = `vision:${visionConfig.toolName}`; + if (!toolServerKeys.has(toolServerKey)) { + toolServerKeys.add(toolServerKey); + const useGatewayVisionRuntime = !visionConfig.baseUrl; + mcpServers.push(fusionBuiltinMcpServer({ + entry, + env: { + FUSION_BUILTIN_TOOL_KIND: "vision", + FUSION_TOOL_NAME: visionConfig.toolName, + ...(useGatewayVisionRuntime ? { VISION_GATEWAY_BASE_URL: `${coreEndpoint}/v1` } : { VISION_BASE_URL: visionConfig.baseUrl || "" }), + ...(useGatewayVisionRuntime && coreAuthToken ? { VISION_GATEWAY_API_KEY: coreAuthToken } : {}), + ...(resolvedVision.model ? { VISION_MODEL: resolvedVision.model } : {}), + ...(visionConfig.baseUrl && visionConfig.apiKey ? { VISION_API_KEY: visionConfig.apiKey } : {}), + ...(visionConfig.timeoutMs ? { VISION_TIMEOUT_MS: String(visionConfig.timeoutMs) } : {}) + }, + name: `fusion-vision-${sanitizedProfileId}`, + proxyPreloadFile, + proxyEnv + })); + } + } + + const webSearchConfig = readFusionWebSearchConfig(metadata?.fusionWebSearch) ?? legacyFusionWebSearchConfig(profile); + if (webSearchConfig?.toolName) { + const toolServerKey = `web_search:${webSearchConfig.toolName}`; + if (!toolServerKeys.has(toolServerKey)) { + toolServerKeys.add(toolServerKey); + const provider = webSearchConfig.provider ?? defaultFusionWebSearchProvider; + if (provider === "browser") { + const browserMcpServer = await browserWebSearchMcpIntegration?.registerBrowserWebSearchMcpServer({ + env: webSearchConfig.env ?? {}, + name: `fusion-browser-web-search-${sanitizedProfileId}`, + resultCount: webSearchConfig.resultCount, + timeoutMs: webSearchConfig.timeoutMs, + toolName: webSearchConfig.toolName + }); + if (browserMcpServer) { + mcpServers.push(browserMcpServer); + } + } else { + mcpServers.push(fusionBuiltinMcpServer({ + entry, + env: { + FUSION_BUILTIN_TOOL_KIND: "web_search", + FUSION_TOOL_NAME: webSearchConfig.toolName, + SEARCH_PROVIDER: provider, + ...(webSearchConfig.resultCount ? { SEARCH_RESULT_COUNT: String(webSearchConfig.resultCount) } : {}), + ...(webSearchConfig.timeoutMs ? { SEARCH_TIMEOUT_MS: String(webSearchConfig.timeoutMs) } : {}), + ...(webSearchConfig.env ?? {}) + }, + name: `fusion-web-search-${sanitizedProfileId}`, + proxyPreloadFile, + proxyEnv + })); + } + } + } + } + + return { mcpServers, providers }; +} + +export async function fusionBuiltinToolArtifactsForTest( + profiles: unknown[], + coreEndpoint: string, + coreAuthToken: string, + browserWebSearchMcpIntegration?: BrowserWebSearchMcpIntegration, + proxyPreloadFile?: string, + proxyEnv?: Record +): Promise<{ mcpServers: GatewayMcpServerConfig[]; providers: unknown[] }> { + return fusionBuiltinToolArtifacts(profiles, coreEndpoint, coreAuthToken, browserWebSearchMcpIntegration, proxyPreloadFile, proxyEnv); +} + +function fusionBuiltinMcpServer({ + entry, + env, + name, + proxyPreloadFile, + proxyEnv +}: { + entry: string; + env: Record; + name: string; + proxyPreloadFile?: string; + proxyEnv?: Record; +}): GatewayMcpServerConfig { + return { + args: proxyPreloadFile ? ["--require", proxyPreloadFile, entry] : [entry], + command: process.execPath, + env: { + ELECTRON_RUN_AS_NODE: "1", + ...(proxyEnv ?? {}), + ...env + }, + name, + protocolVersion: "2024-11-05", + requestTimeoutMs: 600000, + startupTimeoutMs: 600000, + stdioMessageMode: "content-length", + transport: "stdio" + }; +} + +function bundledFusionBuiltinMcpEntryPath(): string { + return pathJoin(__dirname, "fusion-vision-mcp.js"); +} + +function fusionToolFallbackMcpServer( + profiles: unknown[], + existingServers: unknown[] +): GatewayMcpServerConfig | undefined { + const tools = fusionFallbackToolDefinitions(profiles, fusionToolNamesBackedByMcpServers(existingServers)); + if (tools.length === 0) { + return undefined; + } + + return { + args: [bundledFusionToolFallbackMcpEntryPath()], + command: process.execPath, + env: { + ELECTRON_RUN_AS_NODE: "1", + FUSION_FALLBACK_TOOLS_JSON: JSON.stringify(tools) + }, + name: uniqueMcpServerName("ccr-fusion-tool-fallback", existingServers), + protocolVersion: "2024-11-05", + requestTimeoutMs: 600000, + startupTimeoutMs: 600000, + stdioMessageMode: "content-length", + transport: "stdio" + }; +} + +function bundledFusionToolFallbackMcpEntryPath(): string { + return pathJoin(__dirname, "fusion-tool-fallback-mcp.js"); +} + +function toolHubMcpServer(config: AppConfig, backendServers: unknown[]): GatewayMcpServerConfig | undefined { + const toolHub = config.toolHub; + const runtimeBackendServers = [ + ...toolHubBuiltInBackendServers(config), + ...backendServers + ]; + const runtimeConfig = toolHubMcpRuntimeConfig(config, runtimeBackendServers); + if (!toolHub?.enabled || !runtimeConfig) { + return undefined; + } + + return { + ...runtimeConfig, + name: uniqueMcpServerName(TOOL_HUB_MCP_SERVER_NAME, runtimeBackendServers), + protocolVersion: "2024-11-05", + requestTimeoutMs: toolHubRequestTimeoutMs(config, runtimeBackendServers), + startupTimeoutMs: 600000, + stdioMessageMode: "content-length", + transport: "stdio" + }; +} + +export function fusionFallbackToolDefinitions( + profiles: unknown[], + backedToolNames: Set = new Set() +): FusionFallbackToolDefinition[] { + const byName = new Map(); + + for (const profile of profiles) { + if (!isRecord(profile) || profile.enabled === false) { + continue; + } + + if (Array.isArray(profile.tools)) { + for (const tool of profile.tools) { + if (!isRecord(tool)) { + continue; + } + const name = stringValue(tool.name); + if (!name) { + continue; + } + if (backedToolNames.has(name)) { + continue; + } + + const existing = byName.get(name); + const description = stringValue(tool.description); + const inputSchema = isRecord(tool.inputSchema) + ? tool.inputSchema + : isRecord(tool.input_schema) + ? tool.input_schema + : undefined; + const unavailableMessage = fusionFallbackToolUnavailableMessage(profile, name); + if (existing) { + if (!existing.description && description) { + existing.description = description; + } + if (!existing.inputSchema && inputSchema) { + existing.inputSchema = inputSchema; + } + if (!existing.unavailableMessage && unavailableMessage) { + existing.unavailableMessage = unavailableMessage; + } + continue; + } + + byName.set(name, { + ...(description ? { description } : {}), + ...(inputSchema ? { inputSchema } : {}), + ...(unavailableMessage ? { unavailableMessage } : {}), + name + }); + } + } + + const browserFallback = browserWebSearchFallbackToolDefinition(profile, backedToolNames); + if (browserFallback && !byName.has(browserFallback.name)) { + byName.set(browserFallback.name, browserFallback); + } + } + + return [...byName.values()]; +} + +type FusionFallbackToolDefinition = { + description?: string; + inputSchema?: Record; + name: string; + unavailableMessage?: string; +}; + +function fusionFallbackToolUnavailableMessage(profile: unknown, toolName: string): string | undefined { + if (!isRecord(profile)) { + return undefined; + } + const metadata = isRecord(profile.metadata) ? profile.metadata : undefined; + const fusionWebSearch = isRecord(metadata?.fusionWebSearch) ? metadata.fusionWebSearch : undefined; + const webSearchConfig = readFusionWebSearchConfig(fusionWebSearch); + if (webSearchConfig?.provider !== "browser" || webSearchConfig.toolName !== toolName) { + return undefined; + } + return browserWebSearchUnavailableMessage(toolName); +} + +function browserWebSearchUnavailableMessage(toolName: string): string { + return [ + `Fusion MCP tool "${toolName}" is unavailable because In-app Browser web search requires CCR Desktop.`, + "This runtime did not register the Electron browser web search integration, so the hidden browser search tool cannot run here.", + "Run the profile in CCR Desktop or switch the Fusion web search provider to Brave, Bing, Google CSE, Serper, SerpAPI, Tavily, or Exa." + ].join(" "); +} + +function browserWebSearchFallbackToolDefinition( + profile: Record, + backedToolNames: Set +): FusionFallbackToolDefinition | undefined { + const metadata = isRecord(profile.metadata) ? profile.metadata : undefined; + const fusionWebSearch = isRecord(metadata?.fusionWebSearch) ? metadata.fusionWebSearch : undefined; + const webSearchConfig = readFusionWebSearchConfig(fusionWebSearch); + if (webSearchConfig?.provider !== "browser" || !webSearchConfig.toolName || backedToolNames.has(webSearchConfig.toolName)) { + return undefined; + } + return { + description: "Fallback registration for CCR In-app Browser web search when the Electron browser integration is unavailable.", + inputSchema: { + additionalProperties: true, + properties: { + count: { maximum: 20, minimum: 1, type: "number" }, + prompt: { type: "string" }, + query: { type: "string" } + }, + required: ["prompt"], + type: "object" + }, + name: webSearchConfig.toolName, + unavailableMessage: fusionFallbackToolUnavailableMessage(profile, webSearchConfig.toolName) + }; +} + +export function fusionToolNamesBackedByMcpServers(servers: unknown[]): Set { + const names = new Set(); + for (const server of servers) { + if (!isRecord(server)) { + continue; + } + const serverName = stringValue(server.name); + if (serverName) { + names.add(serverName); + } + + const env = isRecord(server.env) ? server.env : undefined; + const fusionToolName = stringValue(env?.FUSION_TOOL_NAME); + if (fusionToolName) { + names.add(fusionToolName); + } + } + return names; +} + +function uniqueMcpServerName(baseName: string, servers: unknown[]): string { + const used = new Set( + servers + .map((server) => isRecord(server) ? stringValue(server.name)?.toLowerCase() : undefined) + .filter((name): name is string => Boolean(name)) + ); + if (!used.has(baseName.toLowerCase())) { + return baseName; + } + for (let index = 2; ; index += 1) { + const candidate = `${baseName}-${index}`; + if (!used.has(candidate.toLowerCase())) { + return candidate; + } + } +} + +function withFusionVirtualModelAliases(profiles: unknown[]): unknown[] { + return profiles.map((profile) => { + if (!isRecord(profile)) { + return profile; + } + const match = isRecord(profile.match) ? profile.match : {}; + const exactAliases = stringListValue(match.exactAliases); + const catalogNames = exactAliases.length > 0 + ? exactAliases + : [stringValue(profile.key) || stringValue(profile.displayName)].filter((value): value is string => Boolean(value)); + const fusionAliases = catalogNames.flatMap(fusionModelSelectors).filter(Boolean); + if (fusionAliases.length === 0) { + return profile; + } + return { + ...profile, + match: { + ...match, + exactAliases: uniqueStrings([...exactAliases, ...fusionAliases]) + } + }; + }); +} + +function withCodexCompatibleVirtualModelProfiles(profiles: unknown[]): unknown[] { + return profiles.map((profile) => { + if (!isRecord(profile) || profile.enabled === false) { + return profile; + } + const materialization = isRecord(profile.materialization) ? profile.materialization : {}; + if (materialization.enabled === false || materialization.includeInGatewayModels === false) { + return profile; + } + const execution = isRecord(profile.execution) ? profile.execution : {}; + if (execution.clientToolsPolicy === "allow") { + return profile; + } + return { + ...profile, + execution: { + ...execution, + clientToolsPolicy: "allow" + } + }; + }); +} + +function fusionModelSelector(model: string): string { + const normalized = fusionModelNameFromSelector(model); + return normalized ? `${fusionModelProviderName}/${normalized}` : ""; +} + +function fusionModelSelectors(model: string): string[] { + const normalized = fusionModelNameFromSelector(model); + if (!normalized) { + return []; + } + const lowerModel = normalized.toLowerCase(); + return uniqueStrings([ + fusionModelSelector(normalized), + lowerModel, + `${fusionModelProviderName}/${lowerModel}`, + `${fusionModelProviderName.toLowerCase()}/${lowerModel}` + ]); +} + +function fusionModelNameFromSelector(model: string): string { + const trimmed = model.trim(); + const prefix = `${fusionModelProviderName}/`; + return trimmed.toLowerCase().startsWith(prefix.toLowerCase()) + ? trimmed.slice(prefix.length).trim() + : trimmed; +} + +function legacyFusionVisionConfig(profile: Record): VirtualModelFusionVisionConfig | undefined { + const toolName = legacyFusionBuiltinToolName(profile, BUILTIN_FUSION_VISION_TOOL_NAME, "matchMultimodal"); + return toolName ? { toolName } : undefined; +} + +function legacyFusionWebSearchConfig(profile: Record): VirtualModelFusionWebSearchConfig | undefined { + const toolName = legacyFusionBuiltinToolName(profile, BUILTIN_FUSION_WEB_SEARCH_TOOL_NAME, "matchWebSearch"); + return toolName ? { provider: defaultFusionWebSearchProvider, toolName } : undefined; +} + +function legacyFusionBuiltinToolName( + profile: Record, + baseToolName: string, + executionFlag: "matchMultimodal" | "matchWebSearch" +): string | undefined { + const tools = Array.isArray(profile.tools) ? profile.tools : []; + const toolName = tools + .map((tool) => isRecord(tool) ? stringValue(tool.name) ?? "" : "") + .find((name) => fusionBuiltinToolNameMatches(name, baseToolName)); + if (toolName) { + return toolName; + } + const execution = isRecord(profile.execution) ? profile.execution : {}; + return execution[executionFlag] === true ? baseToolName : undefined; +} + +function fusionBuiltinToolNameMatches(name: string, baseToolName: string): boolean { + if (name === baseToolName || name.startsWith(`${baseToolName}_`)) { + return true; + } + if (baseToolName !== BUILTIN_FUSION_WEB_SEARCH_TOOL_NAME) { + return false; + } + return coreGatewayWebSearchToolNameMatches(name); +} + +function normalizeFusionWebSearchProfileToolName(profile: Record): Record | undefined { + const metadata = isRecord(profile.metadata) ? profile.metadata : undefined; + const fusionWebSearch = isRecord(metadata?.fusionWebSearch) ? metadata.fusionWebSearch : undefined; + const configuredToolName = stringValue(fusionWebSearch?.toolName); + const legacyToolName = configuredToolName ? undefined : legacyFusionWebSearchConfig(profile)?.toolName; + const toolName = configuredToolName || legacyToolName; + if (!toolName) { + return undefined; + } + + const nextToolName = coreGatewayCompatibleWebSearchToolName(toolName, stringValue(profile.key) || stringValue(profile.id)); + if (nextToolName === toolName) { + return undefined; + } + + const tools = Array.isArray(profile.tools) + ? profile.tools.map((tool) => { + if (!isRecord(tool) || stringValue(tool.name) !== toolName) { + return tool; + } + return { + ...tool, + name: nextToolName + }; + }) + : profile.tools; + + return { + ...profile, + ...(metadata && fusionWebSearch + ? { + metadata: { + ...metadata, + fusionWebSearch: { + ...fusionWebSearch, + toolName: nextToolName + } + } + } + : {}), + ...(tools ? { tools } : {}) + }; +} + +function withFusionWebSearchToolInstructions(profile: Record): Record | undefined { + const metadata = isRecord(profile.metadata) ? profile.metadata : undefined; + const fusionWebSearch = isRecord(metadata?.fusionWebSearch) ? metadata.fusionWebSearch : undefined; + const toolName = stringValue(fusionWebSearch?.toolName) || legacyFusionWebSearchConfig(profile)?.toolName; + if (!toolName) { + return undefined; + } + const execution = isRecord(profile.execution) ? profile.execution : {}; + if (execution.matchWebSearch !== true) { + return undefined; + } + + const instruction = [ + `When the client request includes a hosted web_search tool declaration, call the ${toolName} function tool before answering.`, + "Pass the user's search query in the prompt field.", + "Do not use provider-native web search or claim that web search is unavailable unless this function tool returns an error." + ].join(" "); + const instructions = isRecord(profile.instructions) ? profile.instructions : {}; + if ([instructions.prepend, instructions.append, instructions.replace].some((value) => stringValue(value)?.includes(instruction))) { + return undefined; + } + const replace = stringValue(instructions.replace); + const append = stringValue(instructions.append); + return { + ...profile, + instructions: { + ...instructions, + ...(replace + ? { replace: `${replace.trim()}\n\n${instruction}` } + : { append: [append, instruction].filter(Boolean).join("\n\n") }) + } + }; +} + +function coreGatewayCompatibleWebSearchToolName(toolName: string, fallbackName?: string): string { + if (coreGatewayWebSearchToolNameMatches(toolName)) { + return toolName; + } + + const normalized = sanitizeFusionToolName(toolName); + const prefix = `${BUILTIN_FUSION_WEB_SEARCH_TOOL_NAME}_`; + if (normalized.startsWith(prefix) && normalized.length > prefix.length) { + return truncateFusionToolName(`${normalized.slice(prefix.length)}_${BUILTIN_FUSION_WEB_SEARCH_TOOL_NAME}`); + } + + const fallback = sanitizeFusionToolName(fallbackName || normalized || "fusion"); + return truncateFusionToolName(`${fallback}_${BUILTIN_FUSION_WEB_SEARCH_TOOL_NAME}`); +} + +function coreGatewayWebSearchToolNameMatches(name: string): boolean { + const normalized = name.toLowerCase().replace(/[-.]/g, "_"); + return normalized === BUILTIN_FUSION_WEB_SEARCH_TOOL_NAME || + normalized.endsWith(`_${BUILTIN_FUSION_WEB_SEARCH_TOOL_NAME}`) || + normalized.includes("search_web"); +} + +function sanitizeFusionToolName(value: string): string { + return value + .toLowerCase() + .replace(/[^a-z0-9_]+/g, "_") + .replace(/^_+|_+$/g, "") || "fusion"; +} + +function truncateFusionToolName(value: string): string { + const maxToolNameLength = 64; + if (value.length <= maxToolNameLength) { + return value; + } + const suffix = `_${BUILTIN_FUSION_WEB_SEARCH_TOOL_NAME}`; + const available = Math.max(1, maxToolNameLength - suffix.length); + return `${value.slice(0, available).replace(/_+$/g, "")}${suffix}`; +} + +function readFusionVisionConfig(value: unknown): VirtualModelFusionVisionConfig | undefined { + if (!isRecord(value)) { + return undefined; + } + const toolName = stringValue(value.toolName); + if (!toolName) { + return undefined; + } + const config: VirtualModelFusionVisionConfig = { + toolName, + apiKey: stringValue(value.apiKey), + baseUrl: stringValue(value.baseUrl), + model: stringValue(value.model), + modelSelector: stringValue(value.modelSelector) + }; + const timeoutMs = numberValue(value.timeoutMs); + if (timeoutMs) { + config.timeoutMs = timeoutMs; + } + return config; +} + +function readFusionWebSearchConfig(value: unknown): VirtualModelFusionWebSearchConfig | undefined { + if (!isRecord(value)) { + return undefined; + } + const toolName = stringValue(value.toolName); + if (!toolName) { + return undefined; + } + const config: VirtualModelFusionWebSearchConfig = { + toolName, + env: isRecord(value.env) ? stringRecordFromUnknown(value.env) : undefined, + provider: parseFusionWebSearchProvider(value.provider) + }; + const resultCount = numberValue(value.resultCount); + if (resultCount) { + config.resultCount = resultCount; + } + const timeoutMs = numberValue(value.timeoutMs); + if (timeoutMs) { + config.timeoutMs = timeoutMs; + } + return config; +} + +function resolveFusionVisionRuntime( + config: VirtualModelFusionVisionConfig +): { model?: string; providers: CoreGatewayProvider[] } { + const selector = config.modelSelector || config.model; + if (config.baseUrl) { + return { + model: config.model || config.modelSelector, + providers: [] + }; + } + + const parsed = parseFusionModelSelector(selector); + if (!parsed) { + return { + model: selector ? normalizeGatewayModelSelector(selector) : undefined, + providers: [] + }; + } + + return { + model: `${parsed.providerName}/${parsed.model}`, + providers: [] + }; +} + +function parseFusionModelSelector(value: string | undefined): { model: string; providerName: string } | undefined { + const trimmed = value?.trim(); + if (!trimmed) { + return undefined; + } + const commaIndex = trimmed.indexOf(","); + if (commaIndex > 0 && commaIndex < trimmed.length - 1) { + const providerName = trimmed.slice(0, commaIndex).trim(); + const model = trimmed.slice(commaIndex + 1).trim(); + return providerName && model ? { model, providerName } : undefined; + } + const slashIndex = trimmed.indexOf("/"); + if (slashIndex > 0 && slashIndex < trimmed.length - 1) { + const providerName = trimmed.slice(0, slashIndex).trim(); + const model = trimmed.slice(slashIndex + 1).trim(); + return providerName && model ? { model, providerName } : undefined; + } + return undefined; +} + +function normalizeGatewayModelSelector(value: string): string { + const parsed = parseFusionModelSelector(value); + return parsed ? `${parsed.providerName}/${parsed.model}` : value.trim(); +} + +function parseFusionWebSearchProvider(value: unknown): VirtualModelFusionWebSearchProvider | undefined { + const normalized = stringValue(value)?.toLowerCase(); + if ( + normalized === "brave" || + normalized === "bing" || + normalized === "google_cse" || + normalized === "serper" || + normalized === "serpapi" || + normalized === "tavily" || + normalized === "exa" || + normalized === "browser" + ) { + return normalized; + } + return undefined; +} + +function stringRecordFromUnknown(value: Record): Record | undefined { + const result: Record = {}; + for (const [key, rawValue] of Object.entries(value)) { + const normalizedKey = key.trim(); + const normalizedValue = stringValue(rawValue); + if (normalizedKey && normalizedValue) { + result[normalizedKey] = normalizedValue; + } + } + return Object.keys(result).length ? result : undefined; +} + +function sanitizeMcpServerName(value: string): string { + return value + .toLowerCase() + .replace(/[^a-z0-9_.-]+/g, "-") + .replace(/^-+|-+$/g, "") + .slice(0, 80) || "fusion"; +} + +function buildRawTraceConfig(config: AppConfig, rawTraceSyncToken: string): Record { + const enabled = rawTraceEnabledFromEnv() && shouldRecordRequestLogs(config); + return { + deleteLocalAfterUpload: false, + enabled, + maxPartBytes: maxUsageCaptureBytes, + mode: "wire_raw", + spoolDir: RAW_TRACE_SPOOL_DIR, + sync: { + enabled, + endpoint: `${endpoint(config.gateway.host, config.gateway.port)}${rawTraceSyncPath}`, + headers: { + [rawTraceSyncHeader]: rawTraceSyncToken + }, + timeoutMs: 5000 + } + }; +} + +function shouldRecordRequestLogs(config: AppConfig): boolean { + return Boolean(config.observability?.requestLogs || config.observability?.agentAnalysis); +} + +function rawTraceEnabledFromEnv(): boolean { + const value = (process.env.CCR_RAW_TRACE_ENABLED ?? process.env.CCR_RAW_TRACE ?? "").trim().toLowerCase(); + return value === "1" || value === "true" || value === "yes" || value === "on"; +} + +function readRawTraceRequestLogUpdate(manifest: Record): RequestLogRawTraceUpdateInput | undefined { + const requestId = stringValue(manifest.turnKey); + const parts = Array.isArray(manifest.parts) + ? manifest.parts.filter((part): part is Record => isRecord(part)) + : []; + if (!requestId || parts.length === 0) { + return undefined; + } + + const upstreamRequestMetadata = readRawTraceJsonPart(parts, "upstream_request_metadata"); + const upstreamResponseMetadata = readRawTraceJsonPart(parts, "upstream_response_metadata"); + const upstreamRequestBody = readRawTraceTextPart(parts, "upstream_request"); + const upstreamResponseStream = readRawTraceTextPart(parts, "response_stream"); + const upstreamResponseBody = upstreamResponseStream ?? readRawTraceTextPart(parts, "upstream_response"); + const target = isRecord(manifest.target) ? manifest.target : {}; + const rawUrl = stringValue(upstreamRequestMetadata?.url); + const url = sanitizeUrlForLog(rawUrl); + + return { + method: stringValue(upstreamRequestMetadata?.method) || "POST", + model: stringValue(target.model), + path: pathFromUrl(url), + provider: stringValue(target.providerName) || stringValue(target.provider), + requestBodyContentType: upstreamRequestBody?.contentType, + requestBodyText: upstreamRequestBody?.text, + requestHeaders: headerRecordFromUnknown(upstreamRequestMetadata?.headers), + requestId, + isStream: upstreamResponseStream !== undefined, + responseBodyContentType: upstreamResponseBody?.contentType, + responseBodyText: upstreamResponseBody?.text, + responseHeaders: headerRecordFromUnknown(upstreamResponseMetadata?.headers), + statusCode: numberValue(upstreamResponseMetadata?.statusCode), + url + }; +} + +function readRawTraceJsonPart(parts: Record[], partType: string): Record | undefined { + const text = readRawTraceTextPart(parts, partType)?.text; + if (!text) { + return undefined; + } + try { + const parsed = JSON.parse(text) as unknown; + return isRecord(parsed) ? parsed : undefined; + } catch { + return undefined; + } +} + +function readRawTraceTextPart(parts: Record[], partType: string): RawTracePartText | undefined { + const part = parts.find((candidate) => stringValue(candidate.partType) === partType); + const filePath = stringValue(part?.filePath); + if (!filePath || !isRawTraceSpoolFile(filePath)) { + return undefined; + } + try { + return { + contentType: stringValue(part?.contentType), + text: readFileSync(filePath, "utf8") + }; + } catch (error) { + console.warn(`[gateway] Failed to read raw trace part ${partType}: ${formatError(error)}`); + return undefined; + } +} + +function cleanupRawTraceBundle(manifest: Record): void { + const parts = Array.isArray(manifest.parts) + ? manifest.parts.filter((part): part is Record => isRecord(part)) + : []; + const firstFilePath = parts.map((part) => stringValue(part.filePath)).find((value): value is string => Boolean(value)); + if (!firstFilePath || !isRawTraceSpoolFile(firstFilePath)) { + return; + } + try { + rmSync(dirname(firstFilePath), { force: true, recursive: true }); + } catch (error) { + console.warn(`[gateway] Failed to clean raw trace bundle: ${formatError(error)}`); + } +} + +function isRawTraceSpoolFile(filePath: string): boolean { + const spoolDir = pathResolve(RAW_TRACE_SPOOL_DIR); + const resolvedFile = pathResolve(filePath); + return dirname(resolvedFile) !== spoolDir && resolvedFile.startsWith(`${spoolDir}${pathSep}`); +} + +function headerRecordFromUnknown(value: unknown): Record | undefined { + if (!isRecord(value)) { + return undefined; + } + const headers: Record = {}; + for (const [key, headerValue] of Object.entries(value)) { + if (headerValue === undefined || headerValue === null) { + continue; + } + headers[key] = Array.isArray(headerValue) + ? headerValue.map((item) => String(item)).join(", ") + : String(headerValue); + } + return headers; +} + +function sanitizeUrlForLog(value: string | undefined): string | undefined { + if (!value) { + return undefined; + } + try { + const url = new URL(value); + for (const key of [...url.searchParams.keys()]) { + if (isSensitiveQueryParam(key)) { + url.searchParams.set(key, "[redacted]"); + } + } + return url.toString(); + } catch { + return value; + } +} + +function isSensitiveQueryParam(value: string): boolean { + const normalized = value.trim().toLowerCase(); + return normalized === "key" || normalized === "api_key" || normalized === "apikey" || normalized === "access_token"; +} + +function pathFromUrl(value: string | undefined): string | undefined { + if (!value) { + return undefined; + } + try { + return new URL(value).pathname || undefined; + } catch { + return undefined; + } +} + +function createBodySampler() { + const chunks: Buffer[] = []; + let totalBytes = 0; + let truncated = false; + + return { + append(chunk: Buffer | string) { + if (truncated) { + return; + } + const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); + if (totalBytes + buffer.byteLength > maxUsageCaptureBytes) { + const remaining = Math.max(0, maxUsageCaptureBytes - totalBytes); + if (remaining > 0) { + chunks.push(buffer.subarray(0, remaining)); + totalBytes += remaining; + } + truncated = true; + return; + } + chunks.push(buffer); + totalBytes += buffer.byteLength; + }, + isTruncated() { + return truncated; + }, + read() { + return Buffer.concat(chunks, totalBytes).toString("utf8"); + } + }; +} + +function applyProviderCapabilityRouting(input: { + body?: Buffer; + config: AppConfig; + fallback: RouterFallbackConfig; + headers: Record; + path: string; + routedModel?: string; +}): { body?: Buffer; fallback: RouterFallbackConfig; routedModel?: string } { + const protocol = requestProtocolForPath(input.path); + if (!protocol) { + return { + body: input.body, + fallback: input.fallback, + routedModel: input.routedModel + }; + } + + rewriteProviderHeader(input.headers, "x-target-provider", input.config, protocol); + rewriteProviderListHeader(input.headers, "x-target-providers", input.config, protocol); + rewriteProviderHeader(input.headers, "x-gateway-target-provider", input.config, protocol); + + const routedModel = rewriteModelSelectorForProtocol(input.routedModel, input.config, protocol); + const fallback = rewriteFallbackForProtocol(input.fallback, input.config, protocol); + const body = rewriteBodyModelForProtocol(input.body, input.config, protocol); + clearTargetProviderHeadersForModelSelector(input.headers, input.config, body, routedModel); + + return { + body, + fallback, + routedModel + }; +} + +export function prepareGatewayUpstreamAttemptForTest(input: { + body: Record; + config: AppConfig; + fallback?: RouterFallbackConfig; + headers: Record; + method: string; + path: string; + routedModel?: string; +}): { + body?: Record; + credentialChain?: string[]; + credentialIds?: string[]; + credentialProtocol?: GatewayProviderProtocol; + fallback: RouterFallbackConfig; + headers?: Record; + logicalProvider?: string; + model?: string; + routedModel?: string; +} { + const headers = { ...input.headers }; + const providerCapabilityRouting = applyProviderCapabilityRouting({ + body: Buffer.from(`${JSON.stringify(input.body)}\n`, "utf8"), + config: input.config, + fallback: input.fallback ?? input.config.Router.fallback, + headers, + path: input.path, + routedModel: input.routedModel + }); + const attempt = prepareUpstreamCredentialAttempt({ + attempt: { + body: providerCapabilityRouting.body, + index: 0, + model: normalizeRouteSelector(providerCapabilityRouting.routedModel) + }, + config: input.config, + headers, + method: input.method, + path: input.path + }); + return { + body: parseJsonObjectSafe(attempt.body), + credentialChain: attempt.credentialChain, + credentialIds: attempt.credentialIds, + credentialProtocol: attempt.credentialProtocol, + fallback: providerCapabilityRouting.fallback, + headers: attempt.headers, + logicalProvider: attempt.logicalProvider, + model: attempt.model, + routedModel: providerCapabilityRouting.routedModel + }; +} + +export function prepareCodexApplyPatchBridgeRequest(input: { + body?: Buffer; + config: AppConfig; + headers: IncomingHttpHeaders; + method: string; + path: string; + routedModel?: string; +}): { body: Buffer; diagnostic: string } | undefined { + if (!codexApplyPatchBridgeEnabled(input.config, input.headers, input.method, input.path)) { + return undefined; + } + const parsedBody = parseJsonObjectSafe(input.body); + if (!parsedBody) { + return undefined; + } + const model = input.routedModel || stringValue(parsedBody.model); + if (!codexPatchBridgeModelEligible(model)) { + return undefined; + } + const transformed = transformCodexApplyPatchBridgeRequestBody(parsedBody); + if (!transformed.changed) { + return undefined; + } + return { + body: Buffer.from(`${JSON.stringify(transformed.body)}\n`, "utf8"), + diagnostic: `${model ?? "unknown"}:${transformed.changedParts.join(",")}` + }; +} + +export function transformCodexApplyPatchBridgeRequestBody(body: Record): { + body: Record; + changed: boolean; + changedParts: string[]; +} { + const next = { ...body }; + const changedParts: string[] = []; + const tools = transformCodexApplyPatchBridgeTools(body.tools); + if (tools.changed) { + next.tools = tools.value; + changedParts.push("tools"); + const instructions = transformCodexApplyPatchBridgeInstructions(body.instructions); + if (instructions.changed) { + next.instructions = instructions.value; + changedParts.push("instructions"); + } + const input = transformCodexApplyPatchBridgeInput(body.input); + if (input.changed) { + next.input = input.value; + changedParts.push("input"); + } + } + return { + body: next, + changed: changedParts.length > 0, + changedParts + }; +} + +function transformCodexApplyPatchBridgeTools(value: unknown): { value: unknown; changed: boolean } { + if (!Array.isArray(value)) { + return { value, changed: false }; + } + const hasApplyPatchTool = value.some((tool) => isRecord(tool) && tool.type === "custom" && tool.name === "apply_patch"); + if (!hasApplyPatchTool) { + return { value, changed: false }; + } + let changed = false; + const tools = value.map((tool) => { + if (isRecord(tool) && tool.type === "custom" && tool.name === "apply_patch") { + changed = true; + return virtualApplyPatchToolSpec(); + } + const shellTool = transformCodexPatchBridgeShellTool(tool); + if (shellTool.changed) { + changed = true; + return shellTool.value; + } + return tool; + }); + return { value: tools, changed }; +} + +function transformCodexApplyPatchBridgeInstructions(value: unknown): { value: unknown; changed: boolean } { + const text = rawStringValue(value); + if (text === undefined) { + return value === undefined + ? { value: codexPatchBridgeInstructionText, changed: true } + : { value, changed: false }; + } + if (text.includes(codexPatchBridgeInstructionText)) { + return { value, changed: false }; + } + return { + value: `${text.trimEnd()}\n\n${codexPatchBridgeInstructionText}`, + changed: true + }; +} + +function transformCodexPatchBridgeShellTool(value: unknown): { value: unknown; changed: boolean } { + if (!isRecord(value) || value.type !== "function") { + return { value, changed: false }; + } + const name = stringValue(value.name); + if (name !== "exec_command" && name !== "write_stdin") { + return { value, changed: false }; + } + let changed = false; + const next: Record = { ...value }; + const description = rawStringValue(value.description) ?? ""; + if (!description.includes(codexPatchBridgeShellToolGuidance)) { + next.description = description + ? `${description} ${codexPatchBridgeShellToolGuidance}` + : codexPatchBridgeShellToolGuidance; + changed = true; + } + if (name === "exec_command") { + const parameters = transformCodexPatchBridgeExecCommandParameters(value.parameters); + if (parameters.changed) { + next.parameters = parameters.value; + changed = true; + } + } + return { value: changed ? next : value, changed }; +} + +function transformCodexPatchBridgeExecCommandParameters(value: unknown): { value: unknown; changed: boolean } { + if (!isRecord(value) || !isRecord(value.properties) || !isRecord(value.properties.cmd)) { + return { value, changed: false }; + } + const cmd = value.properties.cmd; + const description = rawStringValue(cmd.description) ?? ""; + if (description.includes(codexPatchBridgeShellToolGuidance)) { + return { value, changed: false }; + } + return { + value: { + ...value, + properties: { + ...value.properties, + cmd: { + ...cmd, + description: description + ? `${description} ${codexPatchBridgeShellToolGuidance}` + : codexPatchBridgeShellToolGuidance + } + } + }, + changed: true + }; +} + +function transformCodexApplyPatchBridgeInput(value: unknown): { value: unknown; changed: boolean } { + if (!Array.isArray(value)) { + return { value, changed: false }; + } + const applyPatchCallIds = new Set(); + for (const item of value) { + if (isRecord(item) && item.type === "custom_tool_call" && item.name === "apply_patch") { + const callId = stringValue(item.call_id); + if (callId) { + applyPatchCallIds.add(callId); + } + } + } + let changed = false; + const items = value.map((item) => { + const transformed = transformCodexApplyPatchBridgeInputItem(item, applyPatchCallIds); + changed ||= transformed.changed; + return transformed.value; + }); + return { value: items, changed }; +} + +function transformCodexApplyPatchBridgeInputItem(value: unknown, applyPatchCallIds: Set): { value: unknown; changed: boolean } { + if (!isRecord(value)) { + return { value, changed: false }; + } + if (value.type === "custom_tool_call" && value.name === "apply_patch") { + const { input: patchInput, name: _name, type: _type, ...rest } = value; + return { + value: { + ...rest, + type: "function_call", + name: virtualApplyPatchToolName, + arguments: JSON.stringify({ patch: rawStringValue(patchInput) ?? "" }) + }, + changed: true + }; + } + if ( + value.type === "custom_tool_call_output" && + (applyPatchCallIds.has(stringValue(value.call_id) ?? "") || value.name === "apply_patch") + ) { + const { name: _name, type: _type, ...rest } = value; + return { + value: { + ...rest, + type: "function_call_output" + }, + changed: true + }; + } + return { value, changed: false }; +} + +function virtualApplyPatchToolSpec(): Record { + return { + type: "function", + name: virtualApplyPatchToolName, + description: [ + "Edit files by returning exactly one complete apply_patch patch.", + "The patch field must be raw patch grammar text starting with *** Begin Patch and ending with *** End Patch.", + "Do not wrap the patch in JSON, markdown fences, shell commands, cat, sed, perl, or python.", + "The patch field must match this Lark grammar:", + virtualApplyPatchLarkGrammar + ].join("\n\n"), + strict: true, + parameters: { + type: "object", + additionalProperties: false, + required: ["patch"], + properties: { + patch: { + type: "string", + description: [ + "Raw apply_patch grammar text matching this Lark grammar:", + virtualApplyPatchLarkGrammar + ].join("\n\n") + } + } + } + }; +} + +function codexApplyPatchBridgeEnabled(config: AppConfig, headers: IncomingHttpHeaders, method: string, path: string): boolean { + const codexRule = config.Router.builtInRules?.codex; + return (method || "GET").toUpperCase() === "POST" && + requestProtocolForPath(path) === "openai_responses" && + isCodexUserAgent(headers) && + codexRule?.enabled !== false; +} + +function isCodexUserAgent(headers: IncomingHttpHeaders): boolean { + return readHeader(headers["user-agent"])?.toLowerCase().includes("codex") ?? false; +} + +function codexPatchBridgeModelEligible(model: string | undefined): boolean { + const modelName = modelNameForPatchBridge(model); + return Boolean(modelName) && !modelName.toLowerCase().includes("gpt"); +} + +function modelNameForPatchBridge(model: string | undefined): string { + const normalized = normalizeRouteSelector(model) ?? ""; + const slashIndex = normalized.lastIndexOf("/"); + return slashIndex >= 0 ? normalized.slice(slashIndex + 1) : normalized; +} + +function codexApplyPatchBridgeResponseStream(input: Readable, headers: Headers): Readable { + const contentType = headers.get("content-type")?.toLowerCase() ?? ""; + if (contentType.includes("text/event-stream")) { + return input.pipe(new Transform({ + transform(chunk, _encoding, callback) { + transformSseChunk(this, chunk); + callback(); + }, + flush(callback) { + flushSseTransform(this); + callback(); + } + })); + } + if (contentType.includes("application/json")) { + const chunks: Buffer[] = []; + return input.pipe(new Transform({ + transform(chunk, _encoding, callback) { + chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)); + callback(); + }, + flush(callback) { + const raw = Buffer.concat(chunks).toString("utf8"); + try { + const parsed = JSON.parse(raw); + const transformed = transformCodexApplyPatchBridgeResponseValue(parsed); + this.push(Buffer.from(`${JSON.stringify(transformed.value)}\n`, "utf8")); + } catch { + this.push(Buffer.from(raw, "utf8")); + } + callback(); + } + })); + } + return input; +} + +export function transformCodexApplyPatchBridgeResponseValue(value: unknown): { value: unknown; changed: boolean } { + if (!isRecord(value)) { + return { value, changed: false }; + } + let changed = false; + const next = { ...value }; + if (isRecord(value.item)) { + const item = transformVirtualApplyPatchFunctionCall(value.item, value.type === "response.output_item.added"); + if (item.changed) { + next.item = item.value; + changed = true; + } + } + if (Array.isArray(value.output)) { + const output = transformCodexApplyPatchBridgeResponseItems(value.output); + if (output.changed) { + next.output = output.value; + changed = true; + } + } + if (isRecord(value.response) && Array.isArray(value.response.output)) { + const output = transformCodexApplyPatchBridgeResponseItems(value.response.output); + if (output.changed) { + next.response = { + ...value.response, + output: output.value + }; + changed = true; + } + } + const item = transformVirtualApplyPatchFunctionCall(next, false); + if (item.changed) { + return item; + } + return { value: next, changed }; +} + +function transformCodexApplyPatchBridgeResponseItems(items: unknown[]): { value: unknown[]; changed: boolean } { + let changed = false; + const value = items.map((item) => { + const transformed = isRecord(item) + ? transformVirtualApplyPatchFunctionCall(item, false) + : { value: item, changed: false }; + changed ||= transformed.changed; + return transformed.value; + }); + return { value, changed }; +} + +function transformVirtualApplyPatchFunctionCall(item: Record, allowEmptyInput: boolean): { value: unknown; changed: boolean } { + if (item.type !== "function_call" || item.name !== virtualApplyPatchToolName) { + return { value: item, changed: false }; + } + const patch = patchInputFromVirtualApplyPatchArguments(item.arguments); + if (patch === undefined && !allowEmptyInput) { + return { value: item, changed: false }; + } + const { arguments: _arguments, name: _name, type: _type, ...rest } = item; + return { + value: { + ...rest, + type: "custom_tool_call", + name: "apply_patch", + input: patch ?? "" + }, + changed: true + }; +} + +function patchInputFromVirtualApplyPatchArguments(value: unknown): string | undefined { + if (isRecord(value)) { + return rawStringValue(value.patch); + } + const text = rawStringValue(value); + if (text === undefined) { + return undefined; + } + try { + const parsed = JSON.parse(text); + return isRecord(parsed) ? rawStringValue(parsed.patch) : undefined; + } catch { + return undefined; + } +} + +function transformSseChunk(stream: Transform, chunk: Buffer | string): void { + const state = stream as Transform & { __ccrCodexPatchBridgeSsePending?: string }; + state.__ccrCodexPatchBridgeSsePending = (state.__ccrCodexPatchBridgeSsePending ?? "") + chunk.toString(); + while (state.__ccrCodexPatchBridgeSsePending) { + const match = /\r?\n\r?\n/.exec(state.__ccrCodexPatchBridgeSsePending); + if (!match || match.index === undefined) { + break; + } + const block = state.__ccrCodexPatchBridgeSsePending.slice(0, match.index); + const delimiter = match[0]; + state.__ccrCodexPatchBridgeSsePending = state.__ccrCodexPatchBridgeSsePending.slice(match.index + delimiter.length); + stream.push(transformCodexApplyPatchBridgeSseEvent(block) + delimiter); + } +} + +function flushSseTransform(stream: Transform): void { + const state = stream as Transform & { __ccrCodexPatchBridgeSsePending?: string }; + if (state.__ccrCodexPatchBridgeSsePending) { + stream.push(transformCodexApplyPatchBridgeSseEvent(state.__ccrCodexPatchBridgeSsePending)); + state.__ccrCodexPatchBridgeSsePending = ""; + } +} + +export function transformCodexApplyPatchBridgeSseEvent(block: string): string { + const lines = block.split(/\r?\n/g); + const data = lines + .filter((line) => line.startsWith("data:")) + .map((line) => line.slice(5).replace(/^ /, "")) + .join("\n"); + if (!data || data === "[DONE]") { + return block; + } + try { + const parsed = JSON.parse(data); + const transformed = transformCodexApplyPatchBridgeResponseValue(parsed); + if (!transformed.changed) { + return block; + } + const event = stringValue((transformed.value as Record).type) || stringValue(parsed.type); + return [ + event ? `event: ${event}` : undefined, + `data: ${JSON.stringify(transformed.value)}` + ].filter(Boolean).join("\n"); + } catch { + return block; + } +} + +function createHostedWebSearchProtocolContext(input: { + body: Buffer | undefined; + config: AppConfig; + method: string; + path: string; + requestId: string; + routedModel?: string; + sinceMs: number; +}): HostedWebSearchProtocolContext | undefined { + const protocol = requestProtocolForPath(input.path); + if (input.method !== "POST" || !protocol) { + return undefined; + } + const body = parseJsonObjectSafe(input.body); + if (!body || !hasHostedWebSearchDeclaration(body, protocol)) { + return undefined; + } + const toolName = fusionWebSearchToolNameForRequest(input.config, stringValue(body.model) || input.routedModel); + if (!toolName) { + return undefined; + } + return { + maxUses: readHostedWebSearchMaxUses(body, protocol), + protocol, + queryHint: extractHostedWebSearchQueryHint(body, protocol), + requestId: input.requestId, + sinceMs: input.sinceMs, + toolName + }; +} + +function createAnthropicWebSearchProtocolContext(input: { + body: Buffer | undefined; + config: AppConfig; + method: string; + path: string; + requestId: string; + sinceMs: number; +}): AnthropicWebSearchProtocolContext | undefined { + const context = createHostedWebSearchProtocolContext(input); + return context?.protocol === "anthropic_messages" ? context : undefined; +} + +function createClaudeCodeWebSearchContinuationContext(input: { + body: Buffer | undefined; + config: AppConfig; + method: string; + path: string; + routedModel?: string; + sinceMs: number; +}): ClaudeCodeWebSearchContinuationContext | undefined { + if (input.method !== "POST" || requestProtocolForPath(input.path) !== "anthropic_messages") { + return undefined; + } + const body = parseJsonObjectSafe(input.body); + if (!body || claudeCodeWebSearchToolResultTexts(body).length === 0) { + return undefined; + } + const toolName = fusionWebSearchToolNameForRequest(input.config, stringValue(body.model) || input.routedModel); + if (!toolName) { + return undefined; + } + return { + queryHint: extractClaudeCodeWebSearchToolResultQuery(body) || extractAnthropicWebSearchQueryHint(body), + sinceMs: input.sinceMs, + toolName + }; +} + +export function prepareHostedWebSearchProtocolRequestBody( + body: Buffer | undefined, + records: BrowserWebSearchProtocolRecord[], + context: Pick +): Buffer | undefined { + if (context.protocol === "anthropic_messages") { + return prepareAnthropicWebSearchProtocolRequestBody(body, records, context); + } + const parsed = parseJsonObjectSafe(body); + if (!parsed || records.length === 0) { + return undefined; + } + const evidence = hostedWebSearchEvidenceText(records, context.queryHint); + if (!evidence) { + return undefined; + } + let next: Record | undefined; + if (context.protocol === "openai_chat_completions") { + next = prepareOpenAiChatHostedWebSearchRequestBody(parsed, evidence); + } else if (context.protocol === "openai_responses") { + next = prepareOpenAiResponsesHostedWebSearchRequestBody(parsed, evidence); + } else if (context.protocol === "gemini_generate_content") { + next = prepareGeminiHostedWebSearchRequestBody(parsed, evidence); + } + return next ? Buffer.from(`${JSON.stringify(next)}\n`, "utf8") : undefined; +} + +export function prepareAnthropicWebSearchProtocolRequestBody( + body: Buffer | undefined, + records: BrowserWebSearchProtocolRecord[], + context: Pick +): Buffer | undefined { + const parsed = parseJsonObjectSafe(body); + if (!parsed || records.length === 0) { + return undefined; + } + const evidence = hostedWebSearchEvidenceText(records, context.queryHint); + if (!evidence) { + return undefined; + } + const next = applyAnthropicWebSearchSynthesisControls(stripAnthropicHostedWebSearchTools({ + ...parsed, + system: appendAnthropicSystemText(parsed.system, evidence) + })); + return Buffer.from(`${JSON.stringify(next)}\n`, "utf8"); +} + +export function prepareClaudeCodeWebSearchContinuationRequestBody( + body: Buffer | undefined, + records: BrowserWebSearchProtocolRecord[], + context: Pick +): Buffer | undefined { + const parsed = parseJsonObjectSafe(body); + if (!parsed) { + return undefined; + } + const toolResultTexts = claudeCodeWebSearchToolResultTexts(parsed); + if (toolResultTexts.length === 0) { + return undefined; + } + const queryHint = context.queryHint || extractClaudeCodeWebSearchToolResultQuery(parsed) || extractAnthropicWebSearchQueryHint(parsed); + const evidence = claudeCodeWebSearchContinuationEvidenceText(records, queryHint, toolResultTexts); + if (!evidence) { + return undefined; + } + const next = applyAnthropicWebSearchSynthesisControls(stripClaudeCodeWebSearchContinuationTools({ + ...parsed, + system: appendAnthropicSystemText(parsed.system, evidence) + })); + return Buffer.from(`${JSON.stringify(next)}\n`, "utf8"); +} + +function applyAnthropicWebSearchSynthesisControls(body: Record): Record { + const next = { ...body }; + const outputConfig = isRecord(next.output_config) ? { ...next.output_config } : {}; + outputConfig.effort = "low"; + next.output_config = outputConfig; + delete next.thinking; + delete next.reasoning; + return next; +} + +function prepareOpenAiChatHostedWebSearchRequestBody(body: Record, evidence: string): Record { + const next = stripOpenAiHostedWebSearchTools({ + ...body, + messages: appendOpenAiChatSystemText(body.messages, evidence) + }); + return applyOpenAiHostedWebSearchSynthesisControls(next); +} + +function prepareOpenAiResponsesHostedWebSearchRequestBody(body: Record, evidence: string): Record { + const next = stripOpenAiHostedWebSearchTools({ + ...body, + instructions: appendStringInstruction(body.instructions, evidence) + }); + return applyOpenAiHostedWebSearchSynthesisControls(next); +} + +function prepareGeminiHostedWebSearchRequestBody(body: Record, evidence: string): Record { + return stripGeminiHostedWebSearchTools({ + ...body, + systemInstruction: appendGeminiSystemInstruction(body.systemInstruction, evidence) + }); +} + +function applyOpenAiHostedWebSearchSynthesisControls(body: Record): Record { + const next = { ...body }; + if (typeof next.reasoning_effort === "string") { + next.reasoning_effort = "low"; + } + if (isRecord(next.reasoning)) { + next.reasoning = { ...next.reasoning, effort: "low" }; + } + return next; +} + +function stripAnthropicHostedWebSearchTools(body: Record): Record { + if (!Array.isArray(body.tools)) { + return body; + } + const tools = body.tools.filter((tool) => !isAnthropicHostedWebSearchTool(tool)); + if (tools.length === body.tools.length) { + return body; + } + const next = { ...body }; + if (tools.length > 0) { + next.tools = tools; + } else { + delete next.tools; + } + const toolChoice = isRecord(next.tool_choice) ? next.tool_choice : undefined; + const toolChoiceName = stringValue(toolChoice?.name); + if (tools.length === 0 || toolChoiceName === "web_search") { + delete next.tool_choice; + } + return next; +} + +function stripClaudeCodeWebSearchContinuationTools(body: Record): Record { + if (!Array.isArray(body.tools)) { + return body; + } + const next = { ...body }; + delete next.tools; + delete next.tool_choice; + return next; +} + +function stripOpenAiHostedWebSearchTools(body: Record): Record { + const next = { ...body }; + let removedTools = false; + if (Array.isArray(body.tools)) { + const tools = body.tools.filter((tool) => !isOpenAiHostedWebSearchTool(tool)); + removedTools = tools.length !== body.tools.length; + if (tools.length > 0) { + next.tools = tools; + } else { + delete next.tools; + } + } + if (next.web_search_options !== undefined || next.webSearchOptions !== undefined) { + delete next.web_search_options; + delete next.webSearchOptions; + removedTools = true; + } + if (removedTools && (!Array.isArray(next.tools) || next.tools.length === 0 || openAiToolChoiceNamesWebSearch(next.tool_choice))) { + delete next.tool_choice; + delete next.parallel_tool_calls; + } + return next; +} + +function stripGeminiHostedWebSearchTools(body: Record): Record { + if (!Array.isArray(body.tools)) { + return body; + } + let changed = false; + const tools = body.tools.flatMap((tool) => { + const transformed = stripGeminiHostedWebSearchTool(tool); + changed ||= transformed.changed; + return transformed.value ? [transformed.value] : []; + }); + if (!changed) { + return body; + } + const next = { ...body }; + if (tools.length > 0) { + next.tools = tools; + } else { + delete next.tools; + } + return next; +} + +function stripGeminiHostedWebSearchTool(tool: unknown): { changed: boolean; value?: unknown } { + if (!isRecord(tool)) { + return { changed: false, value: tool }; + } + let changed = false; + const next: Record = { ...tool }; + for (const key of ["google_search", "googleSearch", "google_search_retrieval", "googleSearchRetrieval"]) { + if (key in next) { + delete next[key]; + changed = true; + } + } + return Object.keys(next).length === 0 ? { changed, value: undefined } : { changed, value: next }; +} + +function appendAnthropicSystemText(system: unknown, text: string): unknown { + if (typeof system === "string") { + return `${system.trimEnd()}\n\n${text}`; + } + const block = { text, type: "text" }; + if (Array.isArray(system)) { + return [...system, block]; + } + return [block]; +} + +function appendOpenAiChatSystemText(messages: unknown, text: string): unknown[] { + const message = { content: text, role: "system" }; + return Array.isArray(messages) ? [message, ...messages] : [message]; +} + +function appendStringInstruction(value: unknown, text: string): string { + const existing = rawStringValue(value); + return existing ? `${existing.trimEnd()}\n\n${text}` : text; +} + +function appendGeminiSystemInstruction(value: unknown, text: string): Record { + const part = { text }; + if (typeof value === "string") { + return { parts: [{ text: value }, part] }; + } + if (isRecord(value)) { + const parts = Array.isArray(value.parts) ? value.parts : []; + return { + ...value, + parts: [...parts, part] + }; + } + return { parts: [part] }; +} + +function hostedWebSearchEvidenceText(records: BrowserWebSearchProtocolRecord[], queryHint: string | undefined): string { + const sections = records.flatMap((record, recordIndex) => { + const resultLines = record.results.slice(0, 8).map((result, resultIndex) => { + const content = focusedWebSearchContent(result.content, queryHint); + const details = [ + result.snippet ? `Search snippet: ${result.snippet}` : "", + content ? `Extracted page content: ${content}` : "", + result.diagnostics?.length ? `Diagnostics: ${result.diagnostics.join("; ")}` : "" + ].filter(Boolean).join("\n"); + return [ + `${resultIndex + 1}. ${result.title}`, + `URL: ${result.url}`, + details + ].filter(Boolean).join("\n"); + }); + if (resultLines.length === 0) { + return []; + } + return [ + [ + `Search ${recordIndex + 1}`, + `Query: ${record.query}`, + `Engine: ${record.engine}`, + `Search URL: ${record.searchUrl}`, + ...resultLines + ].join("\n\n") + ]; + }); + if (sections.length === 0) { + return ""; + } + return [ + "A hidden in-app browser web search has already been performed for this request.", + "Use the evidence below to answer the user's question directly in the visible final response, within 5 concise sentences. Do not call another web search tool, do not merely list links, do not expose hidden reasoning, and do not ask the user to open links. If the evidence is insufficient for an exact value, say that clearly and summarize the most relevant findings with source names.", + queryHint ? `Original search intent: ${queryHint}` : "", + "Web search evidence:", + ...sections + ].filter(Boolean).join("\n\n").slice(0, 10_000); +} + +function claudeCodeWebSearchContinuationEvidenceText( + records: BrowserWebSearchProtocolRecord[], + queryHint: string | undefined, + toolResultTexts: string[] +): string { + const browserEvidence = records.length > 0 ? hostedWebSearchEvidenceText(records, queryHint) : ""; + const toolResultEvidence = toolResultTexts + .map((text) => text.trim()) + .filter(Boolean) + .join("\n\n---\n\n") + .slice(0, 12_000); + if (!browserEvidence && !toolResultEvidence) { + return ""; + } + return [ + "A Claude Code WebSearch tool result has already been returned for this turn.", + "Answer the user's search question directly in the visible final response. Do not call any tool. Do not merely list links or ask the user to open links. Include the sources you used as markdown links.", + queryHint ? `Original search intent: ${queryHint}` : "", + browserEvidence ? `In-app browser extracted evidence:\n\n${browserEvidence}` : "", + toolResultEvidence ? `Previous WebSearch tool result:\n\n${toolResultEvidence}` : "" + ].filter(Boolean).join("\n\n"); +} + +function focusedWebSearchContent(content: string | undefined, queryHint: string | undefined): string | undefined { + const text = content?.replace(/\s+/g, " ").trim(); + if (!text) { + return undefined; + } + const queryTerms = normalizeSearchComparisonText(queryHint ?? "") + .split(" ") + .filter((term) => term.length >= 2); + const weatherTerms = /天气|weather/i.test(queryHint ?? "") + ? ["天气", "气温", "温度", "体感", "空气质量", "湿度", "风", "降水", "℃", "晴", "多云", "阴", "雨"] + : []; + const terms = uniqueStrings([...queryTerms, ...weatherTerms]); + const indexes = terms.flatMap((term) => { + const index = text.toLowerCase().indexOf(term.toLowerCase()); + return index >= 0 ? [index] : []; + }); + if (indexes.length === 0) { + return text.slice(0, 1_000); + } + const center = Math.min(...indexes); + const start = Math.max(0, center - 300); + return `${start > 0 ? "..." : ""}${text.slice(start, start + 1_200)}${start + 1_200 < text.length ? "..." : ""}`; +} + +export function hostedWebSearchProtocolResponseStream( + input: Readable, + headers: Headers, + context: HostedWebSearchProtocolContext, + integration: BrowserWebSearchMcpIntegration | undefined +): Readable { + const hasIntegration = integration?.recentBrowserWebSearchResults !== undefined || integration?.runBrowserWebSearch !== undefined; + if (!hasIntegration && !context.records?.length) { + return input; + } + const contentType = headers.get("content-type")?.toLowerCase() ?? ""; + if (contentType.includes("text/event-stream")) { + if (context.protocol === "anthropic_messages") { + return anthropicHostedWebSearchProtocolSseStream(input, context, integration!); + } + return hostedWebSearchProtocolSseStream(input, context, integration!); + } + if (!contentType.includes("application/json")) { + return input; + } + + const chunks: Buffer[] = []; + return input.pipe(new Transform({ + transform(chunk, _encoding, callback) { + chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)); + callback(); + }, + flush(callback) { + const body = Buffer.concat(chunks).toString("utf8"); + void (async () => { + const records = context.records?.length ? context.records : await selectHostedWebSearchProtocolRecords(context, integration!); + if (records.length === 0) { + this.push(body); + return; + } + + const parsed = JSON.parse(body) as unknown; + const transformed = transformHostedWebSearchProtocolResponseValue(parsed, records, context); + this.push(transformed.changed ? JSON.stringify(transformed.value) : body); + })().catch((error) => { + console.warn(`[gateway] Hosted web search protocol bridge failed: ${formatError(error)}`); + this.push(body); + }).finally(() => callback()); + } + })); +} + +function hostedWebSearchProtocolSseStream( + input: Readable, + context: HostedWebSearchProtocolContext, + integration: BrowserWebSearchMcpIntegration +): Readable { + const recordsPromise = context.records?.length + ? Promise.resolve(context.records) + : selectHostedWebSearchProtocolRecords(context, integration); + let records: BrowserWebSearchProtocolRecord[] | undefined; + let pending = ""; + let passThrough = false; + const state: HostedWebSearchSseState = { + done: false, + maxOutputIndex: -1, + visibleText: false + }; + + async function ensureRecords() { + if (records || passThrough) { + return; + } + records = await recordsPromise; + passThrough = records.length === 0; + } + + return input.pipe(new Transform({ + transform(chunk, _encoding, callback) { + const text = chunk.toString(); + const rawText = pending + text; + void (async () => { + await ensureRecords(); + if (passThrough || !records) { + this.push(text); + return; + } + pending += text; + drainHostedWebSearchSseBlocks(this, pending, state, records, context, false); + pending = sseTrailingPartialBlock(pending); + })().catch((error) => { + console.warn(`[gateway] Hosted web search protocol bridge failed: ${formatError(error)}`); + this.push(rawText); + pending = ""; + passThrough = true; + }).finally(() => callback()); + }, + flush(callback) { + void (async () => { + await ensureRecords(); + if (passThrough || !records) { + if (pending) { + this.push(pending); + } + return; + } + drainHostedWebSearchSseBlocks(this, pending, state, records, context, true); + pending = ""; + })().catch((error) => { + console.warn(`[gateway] Hosted web search protocol bridge failed: ${formatError(error)}`); + if (pending) { + this.push(pending); + } + }).finally(() => callback()); + } + })); +} + +type HostedWebSearchSseState = { + done: boolean; + maxOutputIndex: number; + visibleText: boolean; +}; + +function drainHostedWebSearchSseBlocks( + stream: Transform, + text: string, + state: HostedWebSearchSseState, + records: BrowserWebSearchProtocolRecord[], + context: Pick, + flush: boolean +): void { + let cursor = 0; + for (const match of text.matchAll(/\r?\n\r?\n/g)) { + const index = match.index ?? 0; + const delimiter = match[0]; + const block = text.slice(cursor, index); + cursor = index + delimiter.length; + if (!block.trim()) { + stream.push(delimiter); + continue; + } + writeHostedWebSearchSseEvent(stream, parseSseEventBlock(block), delimiter, state, records, context); + } + if (flush) { + const block = text.slice(cursor); + if (block.trim()) { + writeHostedWebSearchSseEvent(stream, parseSseEventBlock(block), "", state, records, context); + } else if (block) { + stream.push(block); + } + writeHostedWebSearchSseFallback(stream, state, records, context); + } +} + +function writeHostedWebSearchSseEvent( + stream: Transform, + event: ParsedSseEvent, + delimiter: string, + state: HostedWebSearchSseState, + records: BrowserWebSearchProtocolRecord[], + context: Pick +): void { + updateHostedWebSearchSseState(event, state, context.protocol); + const isDone = sseEventIsDone(event); + const isOpenAiResponsesCompleted = context.protocol === "openai_responses" && + isRecord(event.data) && + stringValue(event.data.type) === "response.completed"; + if ((isDone || isOpenAiResponsesCompleted) && !state.done) { + writeHostedWebSearchSseFallback(stream, state, records, context); + } + const nextEvent = context.protocol === "openai_chat_completions" + ? updateOpenAiChatSseFinishReason(event) + : context.protocol === "openai_responses" + ? updateOpenAiResponsesCompletedStatus(event) + : event; + stream.push(`${serializeSseEvent(nextEvent)}${delimiter}`); +} + +function updateHostedWebSearchSseState( + event: ParsedSseEvent, + state: HostedWebSearchSseState, + protocol: GatewayProviderProtocol +): void { + if (protocol === "openai_chat_completions") { + state.visibleText ||= openAiChatSseContainsVisibleText([event]); + return; + } + if (protocol === "openai_responses") { + state.visibleText ||= openAiResponsesSseContainsVisibleText([event]); + if (isRecord(event.data)) { + const outputIndex = numberValue(event.data.output_index); + if (outputIndex !== undefined) { + state.maxOutputIndex = Math.max(state.maxOutputIndex, outputIndex); + } + } + return; + } + if (protocol === "gemini_generate_content") { + state.visibleText ||= geminiSseContainsVisibleText([event]); + } +} + +function writeHostedWebSearchSseFallback( + stream: Transform, + state: HostedWebSearchSseState, + records: BrowserWebSearchProtocolRecord[], + context: Pick +): void { + if (state.done || state.visibleText) { + return; + } + const answer = synthesizeWebSearchAnswer(records, context.queryHint); + if (!answer) { + state.done = true; + return; + } + for (const event of hostedWebSearchSseFallbackEvents(answer, state, context)) { + stream.push(`${serializeSseEvent(event)}\n\n`); + } + state.visibleText = true; + state.done = true; +} + +function hostedWebSearchSseFallbackEvents( + answer: string, + state: HostedWebSearchSseState, + context: Pick +): ParsedSseEvent[] { + if (context.protocol === "openai_chat_completions") { + return [sseEventFromValue({ + object: "chat.completion.chunk", + choices: [ + { + delta: { content: answer }, + finish_reason: null, + index: 0 + } + ] + })]; + } + if (context.protocol === "openai_responses") { + return openAiResponsesSseAnswerEvents(answer, context.requestId, state.maxOutputIndex + 1); + } + if (context.protocol === "gemini_generate_content") { + return [sseEventFromValue(geminiAnswerCandidateChunk(answer))]; + } + return []; +} + +function anthropicHostedWebSearchProtocolSseStream( + input: Readable, + context: HostedWebSearchProtocolContext, + integration: BrowserWebSearchMcpIntegration +): Readable { + const recordsPromise = context.records?.length + ? Promise.resolve(context.records) + : selectHostedWebSearchProtocolRecords(context, integration); + let records: BrowserWebSearchProtocolRecord[] | undefined; + let pending = ""; + let passThrough = false; + const state: AnthropicHostedWebSearchSseState = { + answerInjected: false, + hasClientToolUse: false, + hasWebSearchBlocks: false, + injectedBlockCount: 0, + insertedSearchBlocks: false, + maxIndex: -1, + visibleText: false + }; + + async function ensureRecords() { + if (records || passThrough) { + return; + } + records = await recordsPromise; + passThrough = records.length === 0; + } + + return input.pipe(new Transform({ + transform(chunk, _encoding, callback) { + const text = chunk.toString(); + const rawText = pending + text; + void (async () => { + await ensureRecords(); + if (passThrough || !records) { + this.push(text); + return; + } + pending += text; + drainAnthropicHostedWebSearchSseBlocks(this, pending, state, records, context, false); + pending = sseTrailingPartialBlock(pending); + })().catch((error) => { + console.warn(`[gateway] Hosted web search protocol bridge failed: ${formatError(error)}`); + this.push(rawText); + pending = ""; + passThrough = true; + }).finally(() => callback()); + }, + flush(callback) { + void (async () => { + await ensureRecords(); + if (passThrough || !records) { + if (pending) { + this.push(pending); + } + return; + } + drainAnthropicHostedWebSearchSseBlocks(this, pending, state, records, context, true); + pending = ""; + })().catch((error) => { + console.warn(`[gateway] Hosted web search protocol bridge failed: ${formatError(error)}`); + if (pending) { + this.push(pending); + } + }).finally(() => callback()); + } + })); +} + +type AnthropicHostedWebSearchSseState = { + answerInjected: boolean; + hasClientToolUse: boolean; + hasWebSearchBlocks: boolean; + injectedBlockCount: number; + insertedSearchBlocks: boolean; + insertIndex?: number; + maxIndex: number; + visibleText: boolean; +}; + +function drainAnthropicHostedWebSearchSseBlocks( + stream: Transform, + text: string, + state: AnthropicHostedWebSearchSseState, + records: BrowserWebSearchProtocolRecord[], + context: Pick, + flush: boolean +): void { + let cursor = 0; + for (const match of text.matchAll(/\r?\n\r?\n/g)) { + const index = match.index ?? 0; + const delimiter = match[0]; + const block = text.slice(cursor, index); + cursor = index + delimiter.length; + if (!block.trim()) { + stream.push(delimiter); + continue; + } + writeAnthropicHostedWebSearchSseEvent( + stream, + parseSseEventBlock(block), + delimiter, + state, + records, + context + ); + } + if (flush) { + const block = text.slice(cursor); + if (block.trim()) { + writeAnthropicHostedWebSearchSseEvent( + stream, + parseSseEventBlock(block), + "", + state, + records, + context + ); + } else if (block) { + stream.push(block); + } + } +} + +function sseTrailingPartialBlock(text: string): string { + let cursor = 0; + for (const match of text.matchAll(/\r?\n\r?\n/g)) { + cursor = (match.index ?? 0) + match[0].length; + } + return text.slice(cursor); +} + +function writeAnthropicHostedWebSearchSseEvent( + stream: Transform, + event: ParsedSseEvent, + delimiter: string, + state: AnthropicHostedWebSearchSseState, + records: BrowserWebSearchProtocolRecord[], + context: Pick +): void { + updateAnthropicHostedWebSearchSseState(event, state); + const textStartIndex = anthropicSseTextBlockStartIndex(event); + const isMessageEnd = sseEventIsAnthropicMessageEnd(event); + const answer = !state.hasClientToolUse && !state.visibleText && !state.answerInjected && isMessageEnd + ? synthesizeWebSearchAnswer(records, context.queryHint) + : undefined; + + if (!state.insertedSearchBlocks && (textStartIndex !== undefined || isMessageEnd)) { + const insertIndex = textStartIndex ?? state.maxIndex + 1; + insertAnthropicHostedWebSearchSseBlocks(stream, state, records, context.requestId, insertIndex); + } + if (answer && isMessageEnd) { + const answerIndex = state.maxIndex + state.injectedBlockCount + 1; + insertAnthropicHostedWebSearchSseAnswer(stream, state, answer, answerIndex); + } + + const nextEvent = updateAnthropicWebSearchSseUsage( + shiftAnthropicHostedWebSearchSseEvent(event, state), + records.length, + Boolean(answer), + state.hasClientToolUse + ); + stream.push(`${serializeSseEvent(nextEvent)}${delimiter}`); +} + +function updateAnthropicHostedWebSearchSseState(event: ParsedSseEvent, state: AnthropicHostedWebSearchSseState): void { + if (isRecord(event.data) && Number.isFinite(event.data.index)) { + state.maxIndex = Math.max(state.maxIndex, Number(event.data.index)); + } + state.hasWebSearchBlocks ||= sseEventContainsAnthropicWebSearchBlock(event); + state.hasClientToolUse ||= sseEventContainsAnthropicClientToolUse(event); + state.visibleText ||= sseEventContainsVisibleText(event); +} + +function insertAnthropicHostedWebSearchSseBlocks( + stream: Transform, + state: AnthropicHostedWebSearchSseState, + records: BrowserWebSearchProtocolRecord[], + requestId: string, + insertIndex: number +): void { + state.insertedSearchBlocks = true; + state.insertIndex = insertIndex; + if (state.hasWebSearchBlocks) { + return; + } + const blocks = anthropicWebSearchProtocolBlocks(records, requestId); + for (const event of blocks.flatMap((block, offset) => anthropicWebSearchSseEventsForBlock(block, insertIndex + offset))) { + stream.push(`${serializeSseEvent(event)}\n\n`); + } + state.injectedBlockCount += blocks.length; +} + +function insertAnthropicHostedWebSearchSseAnswer( + stream: Transform, + state: AnthropicHostedWebSearchSseState, + answer: string, + answerIndex: number +): void { + state.answerInjected = true; + for (const event of anthropicWebSearchSseEventsForBlock({ text: answer, type: "text" }, answerIndex)) { + stream.push(`${serializeSseEvent(event)}\n\n`); + } +} + +function shiftAnthropicHostedWebSearchSseEvent( + event: ParsedSseEvent, + state: AnthropicHostedWebSearchSseState +): ParsedSseEvent { + if (!state.insertedSearchBlocks || state.insertIndex === undefined || state.injectedBlockCount === 0) { + return event; + } + return shiftSseContentBlockIndex(event, state.insertIndex, state.injectedBlockCount); +} + +function transformHostedWebSearchProtocolResponseValue( + value: unknown, + records: BrowserWebSearchProtocolRecord[], + context: Pick +): { changed: boolean; value: unknown } { + if (context.protocol === "anthropic_messages") { + return transformAnthropicWebSearchProtocolResponseValue(value, records, context.requestId, context.queryHint); + } + if (context.protocol === "openai_chat_completions") { + return transformOpenAiChatHostedWebSearchResponseValue(value, records, context.queryHint); + } + if (context.protocol === "openai_responses") { + return transformOpenAiResponsesHostedWebSearchResponseValue(value, records, context.requestId, context.queryHint); + } + if (context.protocol === "gemini_generate_content") { + return transformGeminiHostedWebSearchResponseValue(value, records, context.queryHint); + } + return { changed: false, value }; +} + +function transformHostedWebSearchProtocolSseText( + body: string, + records: BrowserWebSearchProtocolRecord[], + context: Pick +): string { + if (context.protocol === "anthropic_messages") { + return transformAnthropicWebSearchProtocolSseText(body, records, context.requestId, context.queryHint); + } + if (context.protocol === "openai_chat_completions") { + return transformOpenAiChatHostedWebSearchSseText(body, records, context.queryHint); + } + if (context.protocol === "openai_responses") { + return transformOpenAiResponsesHostedWebSearchSseText(body, records, context.requestId, context.queryHint); + } + if (context.protocol === "gemini_generate_content") { + return transformGeminiHostedWebSearchSseText(body, records, context.queryHint); + } + return body; +} + +export function transformAnthropicWebSearchProtocolResponseValue( + value: unknown, + records: BrowserWebSearchProtocolRecord[], + requestId: string, + queryHint?: string +): { changed: boolean; value: unknown } { + if (!isRecord(value) || !Array.isArray(value.content)) { + return { changed: false, value }; + } + const hasWebSearchBlocks = responseValueContainsAnthropicWebSearchBlocks(value); + const blocks = hasWebSearchBlocks ? [] : anthropicWebSearchProtocolBlocks(records, requestId); + const hasClientToolUse = responseValueContainsAnthropicClientToolUse(value); + const answer = hasClientToolUse || responseValueContainsVisibleText(value) + ? undefined + : synthesizeWebSearchAnswer(records, queryHint); + const injectedBlocks = [ + ...blocks, + ...(answer ? [{ text: answer, type: "text" }] : []) + ]; + const shouldUpdateUsage = hasWebSearchBlocks || blocks.length > 0; + if (injectedBlocks.length === 0 && !shouldUpdateUsage) { + return { changed: false, value }; + } + const insertAt = webSearchProtocolInsertIndex(value.content, hasWebSearchBlocks); + const nextValue = { + ...value, + ...(shouldUpdateUsage ? { usage: mergeAnthropicWebSearchUsage(value.usage, records.length) } : {}), + ...(shouldEndAnthropicHostedWebSearchTurn(value.stop_reason, Boolean(answer), hasClientToolUse) ? { stop_reason: "end_turn" } : {}), + content: injectedBlocks.length > 0 + ? [ + ...value.content.slice(0, insertAt), + ...injectedBlocks, + ...value.content.slice(insertAt) + ] + : value.content + }; + return { + changed: true, + value: nextValue + }; +} + +export function transformAnthropicWebSearchProtocolSseText( + body: string, + records: BrowserWebSearchProtocolRecord[], + requestId: string, + queryHint?: string +): string { + const events = parseSseEvents(body); + if (events.length === 0) { + return body; + } + const hasWebSearchBlocks = sseEventsContainAnthropicWebSearchBlocks(events); + const blocks = hasWebSearchBlocks ? [] : anthropicWebSearchProtocolBlocks(records, requestId); + const hasClientToolUse = sseEventsContainAnthropicClientToolUse(events); + const answer = hasClientToolUse || sseEventsContainVisibleText(events) + ? undefined + : synthesizeWebSearchAnswer(records, queryHint); + const injectedBlocks = [ + ...blocks, + ...(answer ? [{ text: answer, type: "text" }] : []) + ]; + const shouldUpdateUsage = hasWebSearchBlocks || blocks.length > 0; + if (injectedBlocks.length === 0 && !shouldUpdateUsage) { + return body; + } + + let maxIndex = -1; + for (const event of events) { + if (isRecord(event.data) && Number.isFinite(event.data.index)) { + maxIndex = Math.max(maxIndex, Number(event.data.index)); + } + } + + const firstTextIndex = events.findIndex((event) => { + const data = isRecord(event.data) ? event.data : undefined; + const contentBlock = isRecord(data?.content_block) ? data.content_block : undefined; + return data?.type === "content_block_start" && contentBlock?.type === "text"; + }); + const messageEndIndex = events.findIndex((event) => { + const type = isRecord(event.data) ? stringValue(event.data.type) : undefined; + return type === "message_delta" || type === "message_stop"; + }); + const insertPosition = firstTextIndex >= 0 + ? firstTextIndex + : messageEndIndex >= 0 + ? messageEndIndex + : events.length; + const insertIndex = firstTextIndex >= 0 && isRecord(events[firstTextIndex].data) && Number.isFinite(events[firstTextIndex].data.index) + ? Number(events[firstTextIndex].data.index) + : maxIndex + 1; + + const shiftedEvents = events + .map((event) => shiftSseContentBlockIndex(event, insertIndex, injectedBlocks.length)) + .map((event) => updateAnthropicWebSearchSseUsage(event, records.length, Boolean(answer), hasClientToolUse)); + const injectedEvents = injectedBlocks.flatMap((block, offset) => anthropicWebSearchSseEventsForBlock(block, insertIndex + offset)); + shiftedEvents.splice(insertPosition, 0, ...injectedEvents); + return `${shiftedEvents.map(serializeSseEvent).join("\n\n")}\n\n`; +} + +export function transformOpenAiChatHostedWebSearchResponseValue( + value: unknown, + records: BrowserWebSearchProtocolRecord[], + queryHint?: string +): { changed: boolean; value: unknown } { + if (!isRecord(value) || openAiChatResponseContainsVisibleText(value)) { + return { changed: false, value }; + } + const answer = synthesizeWebSearchAnswer(records, queryHint); + if (!answer || !Array.isArray(value.choices) || value.choices.length === 0) { + return { changed: false, value }; + } + const choices = value.choices.map((choice, index) => { + if (!isRecord(choice) || index !== 0) { + return choice; + } + const message = isRecord(choice.message) ? choice.message : {}; + return { + ...choice, + finish_reason: stringValue(choice.finish_reason) === "length" ? "stop" : choice.finish_reason, + message: { + ...message, + content: answer, + role: stringValue(message.role) || "assistant" + } + }; + }); + return { + changed: true, + value: { + ...value, + choices + } + }; +} + +export function transformOpenAiChatHostedWebSearchSseText( + body: string, + records: BrowserWebSearchProtocolRecord[], + queryHint?: string +): string { + const events = parseSseEvents(body); + if (events.length === 0 || openAiChatSseContainsVisibleText(events)) { + return body; + } + const answer = synthesizeWebSearchAnswer(records, queryHint); + if (!answer) { + return body; + } + const template = firstSseDataRecord(events); + const injected = sseEventFromValue({ + ...(template?.id ? { id: template.id } : {}), + ...(template?.model ? { model: template.model } : {}), + object: stringValue(template?.object) || "chat.completion.chunk", + choices: [ + { + delta: { content: answer }, + finish_reason: null, + index: 0 + } + ] + }); + const shifted = events.map((event) => updateOpenAiChatSseFinishReason(event)); + const insertAt = doneSseEventIndex(shifted); + shifted.splice(insertAt >= 0 ? insertAt : shifted.length, 0, injected); + return `${shifted.map(serializeSseEvent).join("\n\n")}\n\n`; +} + +export function transformOpenAiResponsesHostedWebSearchResponseValue( + value: unknown, + records: BrowserWebSearchProtocolRecord[], + requestId: string, + queryHint?: string +): { changed: boolean; value: unknown } { + if (!isRecord(value)) { + return { changed: false, value }; + } + const output = Array.isArray(value.output) ? value.output : []; + const hasSearchCall = output.some((item) => isRecord(item) && stringValue(item.type) === "web_search_call"); + const answer = openAiResponsesValueContainsVisibleText(value) ? undefined : synthesizeWebSearchAnswer(records, queryHint); + const injected = [ + ...(hasSearchCall ? [] : openAiResponsesWebSearchCallItems(records, requestId)), + ...(answer ? [openAiResponsesMessageItem(answer, requestId)] : []) + ]; + if (injected.length === 0) { + return { changed: false, value }; + } + const next: Record = { + ...value, + output: [...injected, ...output] + }; + if (answer && stringValue(next.status) === "incomplete") { + next.status = "completed"; + delete next.incomplete_details; + } + return { changed: true, value: next }; +} + +export function transformOpenAiResponsesHostedWebSearchSseText( + body: string, + records: BrowserWebSearchProtocolRecord[], + requestId: string, + queryHint?: string +): string { + const events = parseSseEvents(body); + if (events.length === 0) { + return body; + } + const visibleText = openAiResponsesSseVisibleText(events); + if (visibleText) { + return serializeOpenAiResponsesSseEvents(normalizeOpenAiResponsesSseEvents(events, visibleText)); + } + const answer = synthesizeWebSearchAnswer(records, queryHint); + if (!answer) { + return serializeOpenAiResponsesSseEvents(normalizeOpenAiResponsesSseEvents(events)); + } + const outputIndex = nextOpenAiResponsesOutputIndex(events); + const injected = openAiResponsesSseAnswerEvents(answer, requestId, outputIndex); + const shifted = events.map(updateOpenAiResponsesCompletedStatus); + const insertAt = shifted.findIndex((event) => isRecord(event.data) && stringValue(event.data.type) === "response.completed"); + shifted.splice(insertAt >= 0 ? insertAt : doneSseEventIndex(shifted) >= 0 ? doneSseEventIndex(shifted) : shifted.length, 0, ...injected); + return serializeOpenAiResponsesSseEvents(normalizeOpenAiResponsesSseEvents(shifted, answer)); +} + +export function transformGeminiHostedWebSearchResponseValue( + value: unknown, + records: BrowserWebSearchProtocolRecord[], + queryHint?: string +): { changed: boolean; value: unknown } { + if (Array.isArray(value)) { + if (geminiResponseArrayContainsVisibleText(value)) { + return { changed: false, value }; + } + const answer = synthesizeWebSearchAnswer(records, queryHint); + return answer + ? { changed: true, value: [...value, geminiAnswerCandidateChunk(answer)] } + : { changed: false, value }; + } + if (!isRecord(value) || geminiResponseValueContainsVisibleText(value)) { + return { changed: false, value }; + } + const answer = synthesizeWebSearchAnswer(records, queryHint); + if (!answer) { + return { changed: false, value }; + } + const candidates = Array.isArray(value.candidates) ? value.candidates : []; + const nextCandidate = candidates.length > 0 && isRecord(candidates[0]) + ? { + ...candidates[0], + content: { + ...(isRecord(candidates[0].content) ? candidates[0].content : {}), + parts: [{ text: answer }], + role: "model" + }, + finishReason: stringValue(candidates[0].finishReason) === "MAX_TOKENS" ? "STOP" : candidates[0].finishReason + } + : geminiAnswerCandidate(answer); + return { + changed: true, + value: { + ...value, + candidates: [nextCandidate, ...candidates.slice(1)] + } + }; +} + +export function transformGeminiHostedWebSearchSseText( + body: string, + records: BrowserWebSearchProtocolRecord[], + queryHint?: string +): string { + const events = parseSseEvents(body); + if (events.length === 0 || geminiSseContainsVisibleText(events)) { + return body; + } + const answer = synthesizeWebSearchAnswer(records, queryHint); + if (!answer) { + return body; + } + const injected = sseEventFromValue(geminiAnswerCandidateChunk(answer)); + const insertAt = doneSseEventIndex(events); + events.splice(insertAt >= 0 ? insertAt : events.length, 0, injected); + return `${events.map(serializeSseEvent).join("\n\n")}\n\n`; +} + +function openAiChatResponseContainsVisibleText(value: Record): boolean { + if (!Array.isArray(value.choices)) { + return false; + } + return value.choices.some((choice) => { + const message = isRecord(choice) && isRecord(choice.message) ? choice.message : undefined; + return Boolean(stringValue(message?.content)?.trim()); + }); +} + +function openAiChatSseContainsVisibleText(events: ParsedSseEvent[]): boolean { + return events.some((event) => { + const choices = isRecord(event.data) && Array.isArray(event.data.choices) ? event.data.choices : []; + return choices.some((choice) => { + const delta = isRecord(choice) && isRecord(choice.delta) ? choice.delta : undefined; + return Boolean(stringValue(delta?.content)?.trim()); + }); + }); +} + +function updateOpenAiChatSseFinishReason(event: ParsedSseEvent): ParsedSseEvent { + if (!isRecord(event.data) || !Array.isArray(event.data.choices)) { + return event; + } + let changed = false; + const choices = event.data.choices.map((choice) => { + if (!isRecord(choice) || stringValue(choice.finish_reason) !== "length") { + return choice; + } + changed = true; + return { ...choice, finish_reason: "stop" }; + }); + return changed ? { ...event, data: { ...event.data, choices } } : event; +} + +function openAiResponsesValueContainsVisibleText(value: Record): boolean { + return Array.isArray(value.output) && value.output.some(openAiResponsesItemContainsVisibleText); +} + +function openAiResponsesItemContainsVisibleText(item: unknown): boolean { + if (!isRecord(item)) { + return false; + } + if (stringValue(item.type) === "message" && Array.isArray(item.content)) { + return item.content.some((part) => isRecord(part) && Boolean(stringValue(part.text)?.trim())); + } + return Boolean(stringValue(item.text)?.trim()); +} + +function openAiResponsesSseContainsVisibleText(events: ParsedSseEvent[]): boolean { + return Boolean(openAiResponsesSseVisibleText(events)); +} + +function openAiResponsesSseVisibleText(events: ParsedSseEvent[]): string | undefined { + let deltaText = ""; + let doneText = ""; + let itemText = ""; + for (const event of events) { + const data = isRecord(event.data) ? event.data : undefined; + if (!data) { + continue; + } + const type = stringValue(data.type); + if (type === "response.output_text.delta") { + deltaText += stringValue(data.delta) ?? ""; + continue; + } + if (type === "response.output_text.done") { + doneText = stringValue(data.text) ?? doneText; + continue; + } + const item = isRecord(data.item) ? data.item : undefined; + if (item && openAiResponsesItemContainsVisibleText(item)) { + itemText = openAiResponsesItemText(item) ?? itemText; + } + } + return nonEmptyText(deltaText) ?? nonEmptyText(doneText) ?? nonEmptyText(itemText); +} + +function openAiResponsesItemText(item: unknown): string | undefined { + if (!isRecord(item)) { + return undefined; + } + if (stringValue(item.type) === "message" && Array.isArray(item.content)) { + const text = item.content + .flatMap((part) => isRecord(part) ? [stringValue(part.text) ?? ""] : []) + .join(""); + return text.trim() ? text : undefined; + } + return stringValue(item.text); +} + +function nonEmptyText(value: string | undefined): string | undefined { + return value && value.trim() ? value : undefined; +} + +function openAiResponsesWebSearchCallItems(records: BrowserWebSearchProtocolRecord[], requestId: string): Record[] { + return records.map((record, index) => ({ + action: { + query: record.query, + type: "search" + }, + id: `ws_${sanitizeAnthropicToolUseId(requestId)}_${index + 1}`, + status: "completed", + type: "web_search_call" + })); +} + +function openAiResponsesMessageItem(answer: string, requestId: string): Record { + return { + content: [{ annotations: [], text: answer, type: "output_text" }], + id: `msg_${sanitizeAnthropicToolUseId(requestId)}_web_search_answer`, + role: "assistant", + status: "completed", + type: "message" + }; +} + +function nextOpenAiResponsesOutputIndex(events: ParsedSseEvent[]): number { + const indexes = events.flatMap((event) => { + const data = isRecord(event.data) ? event.data : undefined; + const index = numberValue(data?.output_index); + return index === undefined ? [] : [index]; + }); + return indexes.length === 0 ? 0 : Math.max(...indexes) + 1; +} + +function openAiResponsesSseAnswerEvents(answer: string, requestId: string, outputIndex: number): ParsedSseEvent[] { + const itemId = `msg_${sanitizeAnthropicToolUseId(requestId)}_web_search_answer`; + const contentIndex = 0; + return [ + sseEventFromValue({ + item: { + id: itemId, + role: "assistant", + status: "in_progress", + type: "message" + }, + output_index: outputIndex, + type: "response.output_item.added" + }), + sseEventFromValue({ + content_index: contentIndex, + item_id: itemId, + output_index: outputIndex, + part: { annotations: [], text: "", type: "output_text" }, + type: "response.content_part.added" + }), + sseEventFromValue({ + content_index: contentIndex, + delta: answer, + item_id: itemId, + output_index: outputIndex, + type: "response.output_text.delta" + }), + sseEventFromValue({ + content_index: contentIndex, + item_id: itemId, + output_index: outputIndex, + text: answer, + type: "response.output_text.done" + }), + sseEventFromValue({ + content_index: contentIndex, + item_id: itemId, + output_index: outputIndex, + part: { annotations: [], text: answer, type: "output_text" }, + type: "response.content_part.done" + }), + sseEventFromValue({ + item: { + content: [{ annotations: [], text: answer, type: "output_text" }], + id: itemId, + role: "assistant", + status: "completed", + type: "message" + }, + output_index: outputIndex, + type: "response.output_item.done" + }) + ]; +} + +function updateOpenAiResponsesCompletedStatus(event: ParsedSseEvent): ParsedSseEvent { + if (!isRecord(event.data) || stringValue(event.data.type) !== "response.completed") { + return event; + } + const response = isRecord(event.data.response) ? event.data.response : undefined; + if (!response || stringValue(response.status) !== "incomplete") { + return event; + } + const nextResponse: Record = { ...response, status: "completed" }; + delete nextResponse.incomplete_details; + return { + ...event, + data: { + ...event.data, + response: nextResponse + } + }; +} + +function normalizeOpenAiResponsesSseEvents(events: ParsedSseEvent[], visibleText?: string): ParsedSseEvent[] { + const outputIndexMap = openAiResponsesOutputIndexMap(events); + return events.flatMap((event) => { + if (isOpenAiResponsesReasoningSseEvent(event)) { + return []; + } + return [updateOpenAiResponsesCompletedOutput( + remapOpenAiResponsesOutputIndex(event, outputIndexMap), + visibleText + )]; + }); +} + +function serializeOpenAiResponsesSseEvents(events: ParsedSseEvent[]): string { + return `${events.map(serializeSseEvent).join("\n\n")}\n\n`; +} + +function openAiResponsesOutputIndexMap(events: ParsedSseEvent[]): Map { + const indexes: number[] = []; + for (const event of events) { + if (isOpenAiResponsesReasoningSseEvent(event)) { + continue; + } + const data = isRecord(event.data) ? event.data : undefined; + const index = numberValue(data?.output_index); + if (index !== undefined && !indexes.includes(index)) { + indexes.push(index); + } + } + return new Map(indexes.sort((left, right) => left - right).map((index, nextIndex) => [index, nextIndex])); +} + +function remapOpenAiResponsesOutputIndex(event: ParsedSseEvent, outputIndexMap: Map): ParsedSseEvent { + if (!isRecord(event.data)) { + return event; + } + const index = numberValue(event.data.output_index); + if (index === undefined || !outputIndexMap.has(index)) { + return event; + } + return { + ...event, + data: { + ...event.data, + output_index: outputIndexMap.get(index) + } + }; +} + +function updateOpenAiResponsesCompletedOutput(event: ParsedSseEvent, visibleText?: string): ParsedSseEvent { + if (!isRecord(event.data) || stringValue(event.data.type) !== "response.completed") { + return event; + } + const response = isRecord(event.data.response) ? event.data.response : undefined; + if (!response) { + return event; + } + const nextResponse: Record = { ...response }; + if (Array.isArray(response.output)) { + nextResponse.output = response.output.filter((item) => !(isRecord(item) && stringValue(item.type) === "reasoning")); + } + if (visibleText) { + nextResponse.output_text = visibleText; + } + if (visibleText && stringValue(nextResponse.status) === "incomplete") { + nextResponse.status = "completed"; + delete nextResponse.incomplete_details; + } + return { + ...event, + data: { + ...event.data, + response: nextResponse + } + }; +} + +function isOpenAiResponsesReasoningSseEvent(event: ParsedSseEvent): boolean { + const data = isRecord(event.data) ? event.data : undefined; + if (!data) { + return false; + } + const type = stringValue(data.type); + if (type?.startsWith("response.reasoning")) { + return true; + } + const item = isRecord(data.item) ? data.item : undefined; + if (stringValue(item?.type) === "reasoning") { + return true; + } + const part = isRecord(data.part) ? data.part : undefined; + return stringValue(part?.type) === "reasoning_text"; +} + +function geminiResponseValueContainsVisibleText(value: Record): boolean { + return Array.isArray(value.candidates) && value.candidates.some(geminiCandidateContainsVisibleText); +} + +function geminiResponseArrayContainsVisibleText(values: unknown[]): boolean { + return values.some((value) => isRecord(value) && geminiResponseValueContainsVisibleText(value)); +} + +function geminiCandidateContainsVisibleText(candidate: unknown): boolean { + const content = isRecord(candidate) && isRecord(candidate.content) ? candidate.content : undefined; + const parts = Array.isArray(content?.parts) ? content.parts : []; + return parts.some((part) => isRecord(part) && Boolean(stringValue(part.text)?.trim())); +} + +function geminiSseContainsVisibleText(events: ParsedSseEvent[]): boolean { + return events.some((event) => isRecord(event.data) && geminiResponseValueContainsVisibleText(event.data)); +} + +function geminiAnswerCandidate(answer: string): Record { + return { + content: { + parts: [{ text: answer }], + role: "model" + }, + finishReason: "STOP", + index: 0 + }; +} + +function geminiAnswerCandidateChunk(answer: string): Record { + return { + candidates: [geminiAnswerCandidate(answer)] + }; +} + +function firstSseDataRecord(events: ParsedSseEvent[]): Record | undefined { + return events.map((event) => isRecord(event.data) ? event.data : undefined).find(Boolean); +} + +function doneSseEventIndex(events: ParsedSseEvent[]): number { + return events.findIndex((event) => event.raw?.includes("[DONE]")); +} + +function sseEventIsDone(event: ParsedSseEvent): boolean { + return Boolean(event.raw?.includes("[DONE]")); +} + +function hasAnthropicHostedWebSearchTool(tools: unknown): boolean { + if (!Array.isArray(tools)) { + return false; + } + return tools.some(isAnthropicHostedWebSearchTool); +} + +function hasHostedWebSearchDeclaration(body: Record, protocol: GatewayProviderProtocol): boolean { + if (protocol === "anthropic_messages") { + return hasAnthropicHostedWebSearchTool(body.tools); + } + if (protocol === "openai_chat_completions" || protocol === "openai_responses") { + return hasOpenAiHostedWebSearchDeclaration(body); + } + if (protocol === "gemini_generate_content") { + return hasGeminiHostedWebSearchTool(body.tools); + } + return false; +} + +function hasOpenAiHostedWebSearchDeclaration(body: Record): boolean { + if (body.web_search_options !== undefined || body.webSearchOptions !== undefined) { + return true; + } + return Array.isArray(body.tools) && body.tools.some(isOpenAiHostedWebSearchTool); +} + +function hasGeminiHostedWebSearchTool(tools: unknown): boolean { + if (!Array.isArray(tools)) { + return false; + } + return tools.some((tool) => { + if (!isRecord(tool)) { + return false; + } + if (tool.google_search !== undefined || tool.googleSearch !== undefined || tool.google_search_retrieval !== undefined || tool.googleSearchRetrieval !== undefined) { + return true; + } + return false; + }); +} + +function isAnthropicHostedWebSearchTool(tool: unknown): boolean { + if (!isRecord(tool)) { + return false; + } + return anthropicHostedWebSearchType(stringValue(tool.type)); +} + +function isOpenAiHostedWebSearchTool(tool: unknown): boolean { + if (!isRecord(tool)) { + return false; + } + return openAiHostedWebSearchType(stringValue(tool.type)); +} + +function openAiToolChoiceNamesWebSearch(value: unknown): boolean { + if (typeof value === "string") { + return openAiHostedWebSearchType(value); + } + if (!isRecord(value)) { + return false; + } + return openAiHostedWebSearchType(stringValue(value.type)); +} + +function anthropicHostedWebSearchType(value: string | undefined): boolean { + const normalized = normalizedToolProtocolName(value); + return normalized === "web_search" || normalized === "web_search_20250305"; +} + +function openAiHostedWebSearchType(value: string | undefined): boolean { + const normalized = normalizedToolProtocolName(value); + return normalized === "web_search" || + normalized === "web_search_preview" || + normalized.startsWith("web_search_preview_"); +} + +function normalizedToolProtocolName(value: string | undefined): string { + return value?.trim().toLowerCase().replace(/[-.]/g, "_") ?? ""; +} + +function readAnthropicWebSearchMaxUses(tools: unknown): number | undefined { + if (!Array.isArray(tools)) { + return undefined; + } + const tool = tools.find((item) => isRecord(item) && stringValue(item.type)?.toLowerCase() === "web_search_20250305"); + return isRecord(tool) ? numberValue(tool.max_uses ?? tool.maxUses) : undefined; +} + +function readHostedWebSearchMaxUses(body: Record, protocol: GatewayProviderProtocol): number | undefined { + if (protocol === "anthropic_messages") { + return readAnthropicWebSearchMaxUses(body.tools); + } + if (protocol === "openai_chat_completions" || protocol === "openai_responses") { + const tool = Array.isArray(body.tools) ? body.tools.find(isOpenAiHostedWebSearchTool) : undefined; + return isRecord(tool) ? numberValue(tool.max_uses ?? tool.maxUses) : undefined; + } + return undefined; +} + +export function extractHostedWebSearchQueryHint(body: Record, protocol: GatewayProviderProtocol): string | undefined { + if (protocol === "anthropic_messages") { + return extractAnthropicWebSearchQueryHint(body); + } + if (protocol === "openai_chat_completions") { + return normalizedWebSearchQueryHintFromParts(textPartsFromOpenAiChatMessages(body.messages)); + } + if (protocol === "openai_responses") { + return normalizedWebSearchQueryHintFromParts(textPartsFromOpenAiResponsesInput(body.input)); + } + if (protocol === "gemini_generate_content") { + return normalizedWebSearchQueryHintFromParts(textPartsFromGeminiContents(body.contents)); + } + return undefined; +} + +function extractAnthropicWebSearchQueryHint(body: Record): string | undefined { + const userTexts = Array.isArray(body.messages) + ? body.messages.flatMap((message) => { + if (!isRecord(message) || stringValue(message.role) !== "user") { + return []; + } + return textPartsFromAnthropicContent(message.content); + }) + : []; + return normalizedWebSearchQueryHintFromParts(userTexts); +} + +function extractClaudeCodeWebSearchToolResultQuery(body: Record): string | undefined { + for (const text of claudeCodeWebSearchToolResultTexts(body)) { + const quoted = /Web search results for query:\s*"([^"]+)"/i.exec(text); + if (quoted?.[1]) { + return normalizedWebSearchQueryHint(quoted[1]); + } + const unquoted = /Web search results for query:\s*([^\n]+)/i.exec(text); + if (unquoted?.[1]) { + return normalizedWebSearchQueryHint(unquoted[1].replace(/^["']|["']$/g, "")); + } + } + return undefined; +} + +function normalizedWebSearchQueryHintFromParts(parts: string[]): string | undefined { + const candidates = parts + .map((part) => part.trim()) + .filter(Boolean); + for (const candidate of [...candidates].reverse()) { + const explicit = extractExplicitWebSearchQuery(candidate); + if (explicit) { + return normalizedWebSearchQueryHint(explicit); + } + } + for (const candidate of [...candidates].reverse()) { + if (isRuntimeContextText(candidate)) { + continue; + } + return normalizedWebSearchQueryHint(stripSearchIntentPrefix(candidate)); + } + return normalizedWebSearchQueryHint(candidates.join("\n")); +} + +function normalizedWebSearchQueryHint(value: string | undefined): string | undefined { + if (!value) { + return undefined; + } + const joined = value.trim(); + if (!joined) { + return undefined; + } + return joined.trim().slice(0, 500); +} + +function extractExplicitWebSearchQuery(value: string): string | undefined { + const explicit = /perform\s+a\s+web\s+search\s+for\s+the\s+query:\s*([\s\S]+)$/i.exec(value.trim()); + return normalizedWebSearchQueryHint(explicit?.[1]); +} + +function stripSearchIntentPrefix(value: string): string { + const trimmed = value.trim(); + const match = /^(?:请)?(?:帮我)?(?:搜索|查询|查一下|帮我查一下|搜一下)\s*[::]?\s*([\s\S]+)$/i.exec(trimmed); + return (match?.[1] || trimmed).trim(); +} + +function isRuntimeContextText(value: string): boolean { + const trimmed = value.trim(); + if (!trimmed) { + return false; + } + if (/^<(?:environment_context|permissions instructions|collaboration_mode|skills_instructions|plugins_instructions|apps_instructions)>/i.test(trimmed)) { + return true; + } + return ( + trimmed.includes("") || + trimmed.includes("") || + trimmed.includes("") || + trimmed.includes("") + ); +} + +function textPartsFromAnthropicContent(content: unknown): string[] { + if (typeof content === "string") { + return [content]; + } + if (!Array.isArray(content)) { + return []; + } + return content.flatMap((part) => isRecord(part) && typeof part.text === "string" ? [part.text] : []); +} + +function claudeCodeWebSearchToolResultTexts(body: Record): string[] { + if (!Array.isArray(body.messages)) { + return []; + } + const lastMessage = body.messages.at(-1); + if (!isRecord(lastMessage) || stringValue(lastMessage.role) !== "user" || !Array.isArray(lastMessage.content)) { + return []; + } + const latestToolResults = lastMessage.content.filter((part) => isRecord(part) && stringValue(part.type) === "tool_result"); + if (latestToolResults.length === 0) { + return []; + } + const webSearchToolUseIds = new Set(); + for (let index = body.messages.length - 2; index >= 0; index -= 1) { + const message = body.messages[index]; + if (!isRecord(message) || stringValue(message.role) !== "assistant" || !Array.isArray(message.content)) { + continue; + } + for (const part of message.content) { + if (!isRecord(part) || stringValue(part.type) !== "tool_use" || stringValue(part.name)?.toLowerCase() !== "websearch") { + continue; + } + const id = stringValue(part.id); + if (id) { + webSearchToolUseIds.add(id); + } + } + break; + } + if (webSearchToolUseIds.size === 0) { + return []; + } + const texts: string[] = []; + for (const part of latestToolResults) { + if (!isRecord(part)) { + continue; + } + const toolUseId = stringValue(part.tool_use_id); + if (!toolUseId || !webSearchToolUseIds.has(toolUseId)) { + continue; + } + const text = anthropicToolResultContentText(part.content); + if (text) { + texts.push(text); + } + } + return texts; +} + +function anthropicToolResultContentText(content: unknown): string { + if (typeof content === "string") { + return content; + } + if (!Array.isArray(content)) { + return ""; + } + return content.flatMap((part) => { + if (!isRecord(part)) { + return []; + } + const type = stringValue(part.type); + if (type === "text" || type === "input_text" || type === "output_text") { + const text = stringValue(part.text); + return text ? [text] : []; + } + return []; + }).join("\n"); +} + +function textPartsFromOpenAiChatMessages(messages: unknown): string[] { + if (!Array.isArray(messages)) { + return []; + } + return messages.flatMap((message) => { + if (!isRecord(message) || stringValue(message.role)?.toLowerCase() !== "user") { + return []; + } + return textPartsFromOpenAiContent(message.content); + }); +} + +function textPartsFromOpenAiContent(content: unknown): string[] { + if (typeof content === "string") { + return [content]; + } + if (!Array.isArray(content)) { + return []; + } + return content.flatMap((part) => { + if (!isRecord(part)) { + return []; + } + const type = stringValue(part.type); + if (type === "text" || type === "input_text" || type === "output_text") { + return stringValue(part.text) ? [stringValue(part.text) as string] : []; + } + return []; + }); +} + +function textPartsFromOpenAiResponsesInput(input: unknown): string[] { + if (typeof input === "string") { + return [input]; + } + if (!Array.isArray(input)) { + return []; + } + return input.flatMap((item) => { + if (!isRecord(item)) { + return []; + } + const role = stringValue(item.role)?.toLowerCase(); + if (role && role !== "user") { + return []; + } + return textPartsFromOpenAiContent(item.content); + }); +} + +function textPartsFromGeminiContents(contents: unknown): string[] { + if (!Array.isArray(contents)) { + return []; + } + return contents.flatMap((content) => { + if (!isRecord(content)) { + return []; + } + const role = stringValue(content.role)?.toLowerCase(); + if (role && role !== "user") { + return []; + } + const parts = Array.isArray(content.parts) ? content.parts : []; + return parts.flatMap((part) => isRecord(part) && typeof part.text === "string" ? [part.text] : []); + }); +} + +export function fusionWebSearchToolNameForRequest(config: AppConfig, model: string | undefined): string | undefined { + // Router already determines which Fusion profile handles web search. + // Match the requested model against all web search candidates (browser + non-browser). + const normalizedModel = model ? fusionModelNameFromSelector(model) : ""; + for (const candidate of allWebSearchToolCandidates(config)) { + if (!normalizedModel || candidate.aliases.some((alias) => fusionModelNameFromSelector(alias).toLowerCase() === normalizedModel.toLowerCase())) { + return candidate.toolName; + } + } + return undefined; +} + +function allWebSearchToolCandidates(config: AppConfig): Array<{ aliases: string[]; toolName: string; provider: string | undefined }> { + const browser = fusionBrowserWebSearchToolCandidates(config).map((c) => ({ ...c, provider: "browser" as const })); + const nonBrowser = fusionWebSearchToolCandidates(config); + return [...browser, ...nonBrowser]; +} + +function fusionWebSearchToolCandidates(config: AppConfig): Array<{ aliases: string[]; toolName: string; provider: string | undefined }> { + const rawProfiles = Array.isArray(config.virtualModelProfiles) ? config.virtualModelProfiles : []; + const profiles = normalizeCoreGatewayVirtualModelProfiles( + withCodexCompatibleVirtualModelProfiles(withFusionVirtualModelAliases(rawProfiles)), + config + ); + const candidates: Array<{ aliases: string[]; toolName: string; provider: string | undefined }> = []; + for (const profile of profiles) { + if (!isRecord(profile) || profile.enabled === false) { + continue; + } + const metadata = isRecord(profile.metadata) ? profile.metadata : undefined; + const fusionWebSearch = isRecord(metadata?.fusionWebSearch) ? metadata.fusionWebSearch : undefined; + const webSearchConfig = readFusionWebSearchConfig(fusionWebSearch); + if (!webSearchConfig?.toolName) { + continue; + } + const match = isRecord(profile.match) ? profile.match : undefined; + const aliases = uniqueStrings([ + stringValue(profile.id), + stringValue(profile.key), + stringValue(profile.displayName), + ...stringListValue(match?.exactAliases) + ].filter((item): item is string => Boolean(item))); + candidates.push({ aliases, provider: webSearchConfig.provider, toolName: webSearchConfig.toolName }); + } + return candidates; +} + +function fusionBrowserWebSearchToolCandidates(config: AppConfig): Array<{ aliases: string[]; toolName: string }> { + const rawProfiles = Array.isArray(config.virtualModelProfiles) ? config.virtualModelProfiles : []; + const profiles = normalizeCoreGatewayVirtualModelProfiles( + withCodexCompatibleVirtualModelProfiles(withFusionVirtualModelAliases(rawProfiles)), + config + ); + const candidates: Array<{ aliases: string[]; toolName: string }> = []; + for (const profile of profiles) { + if (!isRecord(profile) || profile.enabled === false) { + continue; + } + const metadata = isRecord(profile.metadata) ? profile.metadata : undefined; + const fusionWebSearch = isRecord(metadata?.fusionWebSearch) ? metadata.fusionWebSearch : undefined; + const webSearchConfig = readFusionWebSearchConfig(fusionWebSearch); + if (!webSearchConfig?.toolName || webSearchConfig.provider !== "browser") { + continue; + } + const match = isRecord(profile.match) ? profile.match : undefined; + const aliases = uniqueStrings([ + stringValue(profile.id), + stringValue(profile.key), + stringValue(profile.displayName), + ...stringListValue(match?.exactAliases) + ].filter((item): item is string => Boolean(item))); + candidates.push({ aliases, toolName: webSearchConfig.toolName }); + } + return candidates; +} + +function fusionWebSearchProviderForToolName(config: AppConfig, toolName: string): string | undefined { + const candidate = fusionWebSearchToolCandidates(config).find((c) => c.toolName === toolName); + return candidate && candidate.provider !== "browser" ? candidate.provider : undefined; +} + +async function runWebSearch(query: string, provider: string): Promise { + switch (provider) { + case "tavily": return searchTavily(query); + case "brave": return searchBrave(query); + case "bing": return searchBing(query); + case "google_cse": return searchGoogleCse(query); + case "serper": return searchSerper(query); + case "serpapi": return searchSerpApi(query); + case "exa": return searchExa(query); + default: + console.log(`[gateway] Unknown search provider: ${provider}`); + return []; + } +} + +async function searchTavily(query: string): Promise { + const apiKey = process.env.TAVILY_API_KEY; + if (!apiKey) { console.log(`[gateway] Tavily: API key not set`); return []; } + try { + const response = await fetchWithSystemProxy("https://api.tavily.com/search", { + body: JSON.stringify({ api_key: apiKey, query, max_results: 5, search_depth: "basic" }), + headers: { "content-type": "application/json" }, + method: "POST", signal: AbortSignal.timeout(15000) + }); + if (!response.ok) { console.log(`[gateway] Tavily returned ${response.status}`); return []; } + const data: Record = await response.json() as Record; + const items = Array.isArray(data.results) ? data.results : []; + if (items.length === 0) return []; + return [{ completedAtMs: Date.now(), engine: "tavily", query, + results: items.map((item: unknown) => { const r = item as Record; return { snippet: stringValue(r.content), title: stringValue(r.title) || "", url: stringValue(r.url) || "" }; }).filter((r) => r.title || r.url), + searchUrl: "https://tavily.com", toolName: "web_search" }]; + } catch (error) { console.log(`[gateway] Tavily error: ${formatError(error)}`); return []; } +} + +async function searchBrave(query: string): Promise { + const apiKey = process.env.BRAVE_SEARCH_API_KEY; + if (!apiKey) { console.log(`[gateway] Brave: API key not set`); return []; } + try { + const url = new URL("https://api.search.brave.com/res/v1/web/search"); + url.searchParams.set("q", query); url.searchParams.set("count", "5"); + const response = await fetchWithSystemProxy(url.toString(), { headers: { "x-subscription-token": apiKey }, signal: AbortSignal.timeout(15000) }); + if (!response.ok) { console.log(`[gateway] Brave returned ${response.status}`); return []; } + const data: Record = await response.json() as Record; + const items = isRecord(data.web) && Array.isArray(data.web.results) ? data.web.results : []; + if (items.length === 0) return []; + return [{ completedAtMs: Date.now(), engine: "brave", query, + results: items.map((item: unknown) => { const r = item as Record; return { snippet: stringValue(r.description), title: stringValue(r.title) || "", url: stringValue(r.url) || "" }; }).filter((r) => r.title || r.url), + searchUrl: "https://search.brave.com", toolName: "web_search" }]; + } catch (error) { console.log(`[gateway] Brave error: ${formatError(error)}`); return []; } +} + +async function searchBing(query: string): Promise { + const apiKey = process.env.BING_SEARCH_API_KEY; + if (!apiKey) { console.log(`[gateway] Bing: API key not set`); return []; } + try { + const url = new URL("https://api.bing.microsoft.com/v7.0/search"); + url.searchParams.set("q", query); url.searchParams.set("count", "5"); url.searchParams.set("mkt", "en-US"); + const response = await fetchWithSystemProxy(url.toString(), { headers: { "ocp-apim-subscription-key": apiKey }, signal: AbortSignal.timeout(15000) }); + if (!response.ok) { console.log(`[gateway] Bing returned ${response.status}`); return []; } + const data: Record = await response.json() as Record; + const items = isRecord(data.webPages) && Array.isArray(data.webPages.value) ? data.webPages.value : []; + if (items.length === 0) return []; + return [{ completedAtMs: Date.now(), engine: "bing", query, + results: items.map((item: unknown) => { const r = item as Record; return { snippet: stringValue(r.snippet), title: stringValue(r.name) || "", url: stringValue(r.url) || "" }; }).filter((r) => r.title || r.url), + searchUrl: "https://www.bing.com", toolName: "web_search" }]; + } catch (error) { console.log(`[gateway] Bing error: ${formatError(error)}`); return []; } +} + +async function searchGoogleCse(query: string): Promise { + const apiKey = process.env.GOOGLE_SEARCH_API_KEY; const cx = process.env.GOOGLE_SEARCH_CX; + if (!apiKey || !cx) { console.log(`[gateway] Google CSE: API key or CX not set`); return []; } + try { + const url = new URL("https://www.googleapis.com/customsearch/v1"); + url.searchParams.set("key", apiKey); url.searchParams.set("cx", cx); url.searchParams.set("q", query); url.searchParams.set("num", "5"); + const response = await fetchWithSystemProxy(url.toString(), { signal: AbortSignal.timeout(15000) }); + if (!response.ok) { console.log(`[gateway] Google CSE returned ${response.status}`); return []; } + const data: Record = await response.json() as Record; + const items = Array.isArray(data.items) ? data.items : []; + if (items.length === 0) return []; + return [{ completedAtMs: Date.now(), engine: "google_cse", query, + results: items.map((item: unknown) => { const r = item as Record; return { snippet: stringValue(r.snippet), title: stringValue(r.title) || "", url: stringValue(r.link) || "" }; }).filter((r) => r.title || r.url), + searchUrl: "https://cse.google.com", toolName: "web_search" }]; + } catch (error) { console.log(`[gateway] Google CSE error: ${formatError(error)}`); return []; } +} + +async function searchSerper(query: string): Promise { + const apiKey = process.env.SERPER_API_KEY; + if (!apiKey) { console.log(`[gateway] Serper: API key not set`); return []; } + try { + const response = await fetchWithSystemProxy("https://google.serper.dev/search", { + body: JSON.stringify({ q: query, num: 5 }), headers: { "content-type": "application/json", "x-api-key": apiKey }, + method: "POST", signal: AbortSignal.timeout(15000) + }); + if (!response.ok) { console.log(`[gateway] Serper returned ${response.status}`); return []; } + const data: Record = await response.json() as Record; + const items = Array.isArray(data.organic) ? data.organic : []; + if (items.length === 0) return []; + return [{ completedAtMs: Date.now(), engine: "serper", query, + results: items.map((item: unknown) => { const r = item as Record; return { snippet: stringValue(r.snippet), title: stringValue(r.title) || "", url: stringValue(r.link) || "" }; }).filter((r) => r.title || r.url), + searchUrl: "https://serper.dev", toolName: "web_search" }]; + } catch (error) { console.log(`[gateway] Serper error: ${formatError(error)}`); return []; } +} + +async function searchSerpApi(query: string): Promise { + const apiKey = process.env.SERPAPI_API_KEY; + if (!apiKey) { console.log(`[gateway] SerpAPI: API key not set`); return []; } + try { + const url = new URL("https://serpapi.com/search.json"); + url.searchParams.set("api_key", apiKey); url.searchParams.set("engine", "google"); url.searchParams.set("q", query); url.searchParams.set("num", "5"); + const response = await fetchWithSystemProxy(url.toString(), { signal: AbortSignal.timeout(15000) }); + if (!response.ok) { console.log(`[gateway] SerpAPI returned ${response.status}`); return []; } + const data: Record = await response.json() as Record; + const items = Array.isArray(data.organic_results) ? data.organic_results : []; + if (items.length === 0) return []; + return [{ completedAtMs: Date.now(), engine: "serpapi", query, + results: items.map((item: unknown) => { const r = item as Record; return { snippet: stringValue(r.snippet), title: stringValue(r.title) || "", url: stringValue(r.link) || "" }; }).filter((r) => r.title || r.url), + searchUrl: "https://serpapi.com", toolName: "web_search" }]; + } catch (error) { console.log(`[gateway] SerpAPI error: ${formatError(error)}`); return []; } +} + +async function searchExa(query: string): Promise { + const apiKey = process.env.EXA_API_KEY; + if (!apiKey) { console.log(`[gateway] Exa: API key not set`); return []; } + try { + const response = await fetchWithSystemProxy("https://api.exa.ai/search", { + body: JSON.stringify({ query, numResults: 5 }), headers: { authorization: `Bearer ${apiKey}`, "content-type": "application/json" }, + method: "POST", signal: AbortSignal.timeout(15000) + }); + if (!response.ok) { console.log(`[gateway] Exa returned ${response.status}`); return []; } + const data: Record = await response.json() as Record; + const items = Array.isArray(data.results) ? data.results : []; + if (items.length === 0) return []; + return [{ completedAtMs: Date.now(), engine: "exa", query, + results: items.map((item: unknown) => { const r = item as Record; return { snippet: stringValue(r.text), title: stringValue(r.title) || "", url: stringValue(r.url) || "" }; }).filter((r) => r.title || r.url), + searchUrl: "https://exa.ai", toolName: "web_search" }]; + } catch (error) { console.log(`[gateway] Exa error: ${formatError(error)}`); return []; } +} + +async function selectHostedWebSearchProtocolRecords( + context: HostedWebSearchProtocolContext, + integration: BrowserWebSearchMcpIntegration +): Promise { + const records = [ + ...(context.records ?? []), + ...(integration.recentBrowserWebSearchResults?.({ sinceMs: context.sinceMs, toolName: context.toolName }) ?? []) + ] + .filter((record) => record.results.length > 0) + .filter(uniqueSearchRecordFilter()) + .sort((left, right) => { + const queryScoreDelta = queryMatchScore(context.queryHint, right.query) - queryMatchScore(context.queryHint, left.query); + return queryScoreDelta || left.completedAtMs - right.completedAtMs; + }); + if (records.length > 0) { + return records.slice(0, 8); + } + if (!context.queryHint || !integration.runBrowserWebSearch) { + return []; + } + const record = await integration.runBrowserWebSearch({ + count: Math.trunc(clampNumber(context.maxUses ?? 5, 1, 10)), + prompt: context.queryHint, + timeoutMs: 30_000, + toolName: context.toolName + }); + return record?.results.length ? [record] : []; +} + +function selectClaudeCodeWebSearchContinuationRecords( + context: ClaudeCodeWebSearchContinuationContext, + integration: BrowserWebSearchMcpIntegration +): BrowserWebSearchProtocolRecord[] { + const records = integration.recentBrowserWebSearchResults?.({ + sinceMs: context.sinceMs, + toolName: context.toolName + }) ?? []; + return records + .filter((record) => record.results.length > 0) + .filter(uniqueSearchRecordFilter()) + .sort((left, right) => { + const queryScoreDelta = queryMatchScore(context.queryHint, right.query) - queryMatchScore(context.queryHint, left.query); + return queryScoreDelta || right.completedAtMs - left.completedAtMs; + }) + .slice(0, 3); +} + +async function selectAnthropicWebSearchProtocolRecords( + context: AnthropicWebSearchProtocolContext, + integration: BrowserWebSearchMcpIntegration +): Promise { + return selectHostedWebSearchProtocolRecords(context, integration); +} + +function uniqueSearchRecordFilter(): (record: BrowserWebSearchProtocolRecord) => boolean { + const seen = new Set(); + return (record) => { + const key = `${record.toolName}\n${record.query}\n${record.searchUrl}`; + if (seen.has(key)) { + return false; + } + seen.add(key); + return true; + }; +} + +function queryMatchScore(queryHint: string | undefined, query: string): number { + if (!queryHint) { + return 0; + } + const left = normalizeSearchComparisonText(queryHint); + const right = normalizeSearchComparisonText(query); + if (!left || !right) { + return 0; + } + if (left === right) { + return 4; + } + if (left.includes(right) || right.includes(left)) { + return 3; + } + const leftTerms = new Set(left.split(" ").filter((item) => item.length > 2)); + const rightTerms = right.split(" ").filter((item) => item.length > 2); + return rightTerms.reduce((score, term) => score + (leftTerms.has(term) ? 1 : 0), 0); +} + +function normalizeSearchComparisonText(value: string): string { + return value.toLowerCase().replace(/[^\p{L}\p{N}]+/gu, " ").replace(/\s+/g, " ").trim(); +} + +function responseValueContainsAnthropicWebSearchBlocks(value: Record): boolean { + return Array.isArray(value.content) && value.content.some((block) => { + const type = isRecord(block) ? stringValue(block.type) : undefined; + return type === "server_tool_use" || type === "web_search_tool_result"; + }); +} + +function responseValueContainsVisibleText(value: Record): boolean { + return Array.isArray(value.content) && value.content.some((block) => { + if (!isRecord(block) || stringValue(block.type) !== "text") { + return false; + } + return Boolean(stringValue(block.text)?.trim()); + }); +} + +function responseValueContainsAnthropicClientToolUse(value: Record): boolean { + return Array.isArray(value.content) && value.content.some((block) => { + return isRecord(block) && stringValue(block.type) === "tool_use"; + }); +} + +function leadingThinkingBlockCount(content: unknown[]): number { + let index = 0; + while (index < content.length) { + const block = content[index]; + if (!isRecord(block) || stringValue(block.type) !== "thinking") { + break; + } + index += 1; + } + return index; +} + +function webSearchProtocolInsertIndex(content: unknown[], hasWebSearchBlocks: boolean): number { + let index = leadingThinkingBlockCount(content); + if (!hasWebSearchBlocks) { + return index; + } + while (index < content.length) { + const block = content[index]; + const type = isRecord(block) ? stringValue(block.type) : undefined; + if (type !== "server_tool_use" && type !== "web_search_tool_result") { + break; + } + index += 1; + } + return index; +} + +function mergeAnthropicWebSearchUsage(usage: unknown, searchCount: number): Record { + const nextUsage = isRecord(usage) ? { ...usage } : {}; + const serverToolUse = isRecord(nextUsage.server_tool_use) ? { ...nextUsage.server_tool_use } : {}; + const webSearchRequests = Math.max(1, Math.trunc(searchCount)); + serverToolUse.web_search_requests = Math.max(numberValue(serverToolUse.web_search_requests) ?? 0, webSearchRequests); + nextUsage.server_tool_use = serverToolUse; + return nextUsage; +} + +function sseEventsContainAnthropicWebSearchBlocks(events: ParsedSseEvent[]): boolean { + return events.some((event) => { + return sseEventContainsAnthropicWebSearchBlock(event); + }); +} + +function sseEventsContainVisibleText(events: ParsedSseEvent[]): boolean { + return events.some(sseEventContainsVisibleText); +} + +function sseEventContainsAnthropicWebSearchBlock(event: ParsedSseEvent): boolean { + const data = isRecord(event.data) ? event.data : undefined; + const block = isRecord(data?.content_block) ? data.content_block : undefined; + const type = stringValue(block?.type) || stringValue(data?.type); + return type === "server_tool_use" || type === "web_search_tool_result"; +} + +function sseEventContainsVisibleText(event: ParsedSseEvent): boolean { + const data = isRecord(event.data) ? event.data : undefined; + if (!data) { + return false; + } + const block = isRecord(data.content_block) ? data.content_block : undefined; + if (stringValue(data.type) === "content_block_start" && stringValue(block?.type) === "text") { + return Boolean(stringValue(block?.text)?.trim()); + } + const delta = isRecord(data.delta) ? data.delta : undefined; + return stringValue(data.type) === "content_block_delta" && + stringValue(delta?.type) === "text_delta" && + Boolean(stringValue(delta?.text)?.trim()); +} + +function sseEventsContainAnthropicClientToolUse(events: ParsedSseEvent[]): boolean { + return events.some(sseEventContainsAnthropicClientToolUse); +} + +function sseEventContainsAnthropicClientToolUse(event: ParsedSseEvent): boolean { + const data = isRecord(event.data) ? event.data : undefined; + const block = isRecord(data?.content_block) ? data.content_block : undefined; + return stringValue(data?.type) === "content_block_start" && stringValue(block?.type) === "tool_use"; +} + +function anthropicSseTextBlockStartIndex(event: ParsedSseEvent): number | undefined { + const data = isRecord(event.data) ? event.data : undefined; + const block = isRecord(data?.content_block) ? data.content_block : undefined; + if (stringValue(data?.type) !== "content_block_start" || stringValue(block?.type) !== "text") { + return undefined; + } + const index = numberValue(data?.index); + return index === undefined ? undefined : index; +} + +function sseEventIsAnthropicMessageEnd(event: ParsedSseEvent): boolean { + const type = isRecord(event.data) ? stringValue(event.data.type) : undefined; + return type === "message_delta" || type === "message_stop"; +} + +function anthropicWebSearchSseEventsForBlock(block: Record, index: number): ParsedSseEvent[] { + if (stringValue(block.type) === "text") { + const text = stringValue(block.text) ?? ""; + return [ + sseEventFromValue({ + content_block: { text: "", type: "text" }, + index, + type: "content_block_start" + }), + sseEventFromValue({ + delta: { text, type: "text_delta" }, + index, + type: "content_block_delta" + }), + sseEventFromValue({ + index, + type: "content_block_stop" + }) + ]; + } + return [ + sseEventFromValue({ + content_block: block, + index, + type: "content_block_start" + }), + sseEventFromValue({ + index, + type: "content_block_stop" + }) + ]; +} + +function updateAnthropicWebSearchSseUsage( + event: ParsedSseEvent, + searchCount: number, + didSynthesizeAnswer: boolean, + hasClientToolUse: boolean +): ParsedSseEvent { + if (!isRecord(event.data) || stringValue(event.data.type) !== "message_delta") { + return event; + } + const delta = isRecord(event.data.delta) ? { ...event.data.delta } : event.data.delta; + const nextData: Record = { + ...event.data, + usage: mergeAnthropicWebSearchUsage(event.data.usage, searchCount) + }; + if (isRecord(delta) && shouldEndAnthropicHostedWebSearchTurn(delta.stop_reason, didSynthesizeAnswer, hasClientToolUse)) { + nextData.delta = { ...delta, stop_reason: "end_turn" }; + } + return { + ...event, + data: nextData + }; +} + +function shouldEndAnthropicHostedWebSearchTurn( + stopReason: unknown, + didSynthesizeAnswer: boolean, + hasClientToolUse: boolean +): boolean { + if (hasClientToolUse) { + return false; + } + const normalized = stringValue(stopReason); + return normalized === "tool_use" || (didSynthesizeAnswer && normalized === "max_tokens"); +} + +function synthesizeWebSearchAnswer(records: BrowserWebSearchProtocolRecord[], queryHint: string | undefined): string | undefined { + const query = queryHint || records.map((record) => record.query).find(Boolean) || ""; + const weatherAnswer = synthesizeWeatherWebSearchAnswer(records, query); + if (weatherAnswer) { + return weatherAnswer; + } + const componentChangelogAnswer = synthesizeComponentChangelogWebSearchAnswer(records, query); + if (componentChangelogAnswer) { + return componentChangelogAnswer; + } + const evidence = topWebSearchEvidenceSentences(records, query, 3); + if (evidence.length === 0) { + const sources = webSearchSourceNames(records, 3); + if (!sources) { + return undefined; + } + return containsCjkText(query) + ? `搜索已完成,但页面可提取正文不足。较相关的来源包括:${sources}。` + : `The search completed, but the pages did not expose enough extractable text. The most relevant sources are: ${sources}.`; + } + const sources = webSearchSourceNames(records, 3); + return containsCjkText(query) + ? `根据搜索结果,${evidence.join(";")}。${sources ? `来源:${sources}。` : ""}` + : `Based on the search results, ${evidence.join("; ")}.${sources ? ` Sources: ${sources}.` : ""}`; +} + +function synthesizeComponentChangelogWebSearchAnswer(records: BrowserWebSearchProtocolRecord[], query: string): string | undefined { + const normalizedQuery = normalizeSearchComparisonText(query); + const asksForComponents = /component|components|组件/i.test(query); + const asksForNewOrChangelog = /new|latest|recent|changelog|release|新增|新组件|最新|更新|官方/i.test(query); + if (!asksForComponents || !asksForNewOrChangelog) { + return undefined; + } + const items = webSearchEvidenceItems(records); + const preferred = items.find((item) => { + const normalized = normalizeSearchComparisonText(`${item.source} ${item.url} ${item.text.slice(0, 500)}`); + return normalized.includes("changelog") || normalized.includes("official") || normalized.includes("docs") || normalizedQuery.includes("official"); + }) ?? items[0]; + if (!preferred) { + return undefined; + } + const release = extractComponentReleaseTitle(preferred.text); + const components = extractLikelyComponentNames(preferred.text); + const sources = webSearchSourceNames(records, 2); + const cjk = containsCjkText(query); + if (!release && components.length === 0) { + return undefined; + } + if (cjk) { + return [ + release ? `官方相关条目是 ${release}` : "官方页面包含新增组件相关内容", + components.length > 0 ? `可提取到的相关组件包括 ${components.join("、")}` : "", + sources ? `来源:${sources}。` : "" + ].filter(Boolean).join(";"); + } + return [ + release ? `The relevant official entry is ${release}` : "The official page contains new component information", + components.length > 0 ? `extractable related components include ${components.join(", ")}` : "", + sources ? `Sources: ${sources}.` : "" + ].filter(Boolean).join("; "); +} + +function extractComponentReleaseTitle(text: string): string | undefined { + const patterns = [ + /((?:January|February|March|April|May|June|July|August|September|October|November|December)\s+\d{4}\s*-\s*Components?[^.。!?]{0,90})/i, + /(\d{4}[-/]\d{1,2}[^.。!?]{0,60}Components?[^.。!?]{0,60})/i + ]; + for (const pattern of patterns) { + const match = pattern.exec(text); + const title = match?.[1]?.replace(/\s+/g, " ").trim(); + if (title) { + return title; + } + } + return undefined; +} + +function extractLikelyComponentNames(text: string): string[] { + const knownNames = [ + "Message Scroller", + "Message", + "Attachment", + "Bubble", + "Marker", + "Empty", + "Item", + "Field", + "Input OTP", + "Button Group" + ]; + const lower = text.toLowerCase(); + return knownNames.filter((name) => lower.includes(name.toLowerCase())).slice(0, 10); +} + +function synthesizeWeatherWebSearchAnswer(records: BrowserWebSearchProtocolRecord[], query: string): string | undefined { + if (!/天气|气温|温度|weather|forecast|temperature/i.test(query)) { + return undefined; + } + const items = webSearchEvidenceItems(records); + const text = items.map((item) => item.text).join(" "); + if (!text) { + return undefined; + } + const cjk = containsCjkText(query); + const location = extractWeatherLocation(query); + const temperatureRange = weatherTemperatureRange(text); + const currentTemperature = firstRegexGroup(text, [ + /(?:当前|现在|实时|实况|气温|温度)[^。;,,\d-]{0,12}(-?\d{1,2}(?:\.\d+)?)\s*℃/i, + location ? new RegExp(`${escapeRegExp(location)}\\s+(-?\\d{1,2}(?:\\.\\d+)?)\\s*℃`) : undefined + ]); + const feelsLike = firstRegexGroup(text, [/体感温度[::\s]*(-?\d{1,2}(?:\.\d+)?)\s*℃/]); + const high = firstRegexGroup(text, [/最高气温[::\s]*(-?\d{1,2}(?:\.\d+)?)\s*℃/]); + const low = firstRegexGroup(text, [/最低气温[::\s]*(-?\d{1,2}(?:\.\d+)?)\s*℃/]); + const humidity = firstRegexGroup(text, [/(?:最大相对湿度|相对湿度)[::\s]*(-?\d{1,3}(?:\.\d+)?%)/]); + const aqi = firstRegexGroup(text, [/AQI最高值[::\s]*(\d{1,3})/i]); + const airQuality = firstRegexGroup(text, [/空气质量[::\s]*([^\s,。;,;]{1,12})/]); + const rain = firstRegexGroup(text, [/(?:过去24小时总降水量|总降水量|降水量)[::\s]*(-?\d+(?:\.\d+)?mm)/i]); + const wind = firstRegexGroup(text, [/最大风力[::\s]*([<>]?\d+级|微风)/, /(东风|东南风|南风|西南风|西风|西北风|北风|东北风)\s*([<>]?\d+级|微风)/]); + + const facts = [ + currentTemperature ? (cjk ? `当前约 ${currentTemperature}℃` : `currently about ${currentTemperature}°C`) : undefined, + !currentTemperature && temperatureRange ? (cjk ? `气温约 ${temperatureRange}` : `temperatures are around ${temperatureRange}`) : undefined, + feelsLike ? (cjk ? `体感约 ${feelsLike}℃` : `feels like about ${feelsLike}°C`) : undefined, + high || low ? (cjk + ? `过去24小时${high ? `最高 ${high}℃` : ""}${high && low ? "、" : ""}${low ? `最低 ${low}℃` : ""}` + : `over the past 24 hours ${high ? `the high was ${high}°C` : ""}${high && low ? " and " : ""}${low ? `the low was ${low}°C` : ""}`) : undefined, + humidity ? (cjk ? `相对湿度最高 ${humidity}` : `relative humidity reached ${humidity}`) : undefined, + aqi ? (cjk ? `AQI 最高 ${aqi}` : `AQI reached ${aqi}`) : undefined, + airQuality && !aqi ? (cjk ? `空气质量 ${airQuality}` : `air quality is ${airQuality}`) : undefined, + rain ? (cjk ? `过去24小时降水量 ${rain}` : `24-hour rainfall is ${rain}`) : undefined, + wind ? (cjk ? `风力 ${wind}` : `wind ${wind}`) : undefined + ].filter((item): item is string => Boolean(item)); + + if (facts.length === 0) { + return undefined; + } + const sources = webSearchSourceNames(records, 2); + if (cjk) { + return `${location ? `${location}天气` : "天气"}:${facts.slice(0, 6).join(",")}。${sources ? `来源:${sources}。` : ""}`; + } + return `${location ? `${location} weather` : "Weather"}: ${facts.slice(0, 6).join(", ")}.${sources ? ` Sources: ${sources}.` : ""}`; +} + +function webSearchEvidenceItems(records: BrowserWebSearchProtocolRecord[]): Array<{ source: string; text: string; url: string }> { + return records.flatMap((record) => record.results.map((result) => ({ + source: result.title || hostnameFromUrl(result.url) || record.engine, + text: sanitizeWebSearchEvidenceText(result.content || result.snippet || ""), + url: result.url + }))).filter((item) => item.text); +} + +function topWebSearchEvidenceSentences(records: BrowserWebSearchProtocolRecord[], query: string, limit: number): string[] { + const terms = relevantSearchTerms(query); + const scored = webSearchEvidenceItems(records).flatMap((item, itemIndex) => { + const sentences = splitEvidenceSentences(item.text).slice(0, 12); + return sentences.map((sentence, sentenceIndex) => { + const normalizedSentence = normalizeSearchComparisonText(sentence); + const termScore = terms.reduce((score, term) => score + (normalizedSentence.includes(term) ? 2 : 0), 0); + const sourceBonus = itemIndex === 0 ? 2 : itemIndex === 1 ? 1 : 0; + const positionBonus = Math.max(0, 4 - sentenceIndex) / 4; + return { + score: termScore + sourceBonus + positionBonus, + sentence + }; + }); + }).filter((item) => item.sentence.length >= 12 && item.sentence.length <= 260); + scored.sort((left, right) => right.score - left.score || left.sentence.length - right.sentence.length); + const seen = new Set(); + return scored.flatMap((item) => { + const key = normalizeSearchComparisonText(item.sentence).slice(0, 120); + if (!key || seen.has(key)) { + return []; + } + seen.add(key); + return [item.sentence]; + }).slice(0, limit); +} + +function splitEvidenceSentences(text: string): string[] { + return text + .replace(/\s+/g, " ") + .split(/[。!?!?]\s*|\n+/g) + .map((sentence) => sentence.trim().replace(/[,,;;::]\s*$/, "")) + .filter((sentence) => sentence && !looksLikeNavigationText(sentence)); +} + +function looksLikeNavigationText(text: string): boolean { + const punctuationCount = (text.match(/[,,。;;::]/g) ?? []).length; + const digitCount = (text.match(/\d/g) ?? []).length; + return text.length > 160 && punctuationCount < 2 && digitCount < 2; +} + +function relevantSearchTerms(query: string): string[] { + const normalizedTerms = normalizeSearchComparisonText(query) + .split(" ") + .filter((term) => term.length >= 2); + const cjkTerms = query.match(/[\p{Script=Han}]{2,}/gu) ?? []; + return uniqueStrings([...normalizedTerms, ...cjkTerms].map((term) => term.toLowerCase())); +} + +function weatherTemperatureRange(text: string): string | undefined { + const values = Array.from(text.matchAll(/(-?\d{1,2}(?:\.\d+)?)\s*℃/g)) + .map((match) => Number(match[1])) + .filter((value) => Number.isFinite(value) && value > -80 && value < 60) + .slice(0, 8); + if (values.length === 0) { + return undefined; + } + const min = Math.min(...values); + const max = Math.max(...values); + const format = (value: number) => Number.isInteger(value) ? String(value) : value.toFixed(1); + return min === max ? `${format(min)}℃` : `${format(min)}-${format(max)}℃`; +} + +function extractWeatherLocation(query: string): string | undefined { + const cleaned = query + .replace(/perform\s+a\s+web\s+search\s+for\s+the\s+query:\s*/i, "") + .replace(/天气预报|天气|气温|温度|怎么样|如何|查询|搜索|今天|今日|现在|当前|请问|weather|forecast|temperature/gi, " ") + .replace(/\s+/g, " ") + .trim(); + if (!cleaned || cleaned.length > 24) { + return undefined; + } + return cleaned; +} + +function firstRegexGroup(text: string, patterns: Array): string | undefined { + for (const pattern of patterns) { + if (!pattern) { + continue; + } + const match = pattern.exec(text); + const value = match?.[1]; + if (value) { + return value.trim(); + } + } + return undefined; +} + +function sanitizeWebSearchEvidenceText(text: string): string { + return text.replace(/\s+/g, " ").trim(); +} + +function containsCjkText(text: string): boolean { + return /\p{Script=Han}/u.test(text); +} + +function webSearchSourceNames(records: BrowserWebSearchProtocolRecord[], limit: number): string { + return uniqueStrings(records.flatMap((record) => record.results.map((result) => { + const title = result.title?.trim(); + return title || hostnameFromUrl(result.url) || record.engine; + }))).slice(0, limit).join("、"); +} + +function hostnameFromUrl(value: string): string | undefined { + try { + return new URL(value).hostname.replace(/^www\./, ""); + } catch { + return undefined; + } +} + +function escapeRegExp(value: string): string { + return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); +} + +function anthropicWebSearchProtocolBlocks(records: BrowserWebSearchProtocolRecord[], requestId: string): Record[] { + const blocks: Record[] = []; + records.forEach((record, index) => { + const toolUseId = `srvtoolu_${sanitizeAnthropicToolUseId(requestId)}_${index + 1}`; + blocks.push({ + id: toolUseId, + input: { query: record.query }, + name: "web_search", + type: "server_tool_use" + }); + blocks.push({ + content: record.results.map(anthropicWebSearchResultBlock), + tool_use_id: toolUseId, + type: "web_search_tool_result" + }); + }); + return blocks; +} + +function anthropicWebSearchResultBlock(result: BrowserWebSearchProtocolResult): Record { + const snippet = anthropicWebSearchResultSnippet(result); + return { + encrypted_content: "", + ...(snippet ? { snippet: snippet.slice(0, 1_200) } : {}), + title: result.title, + type: "web_search_result", + url: result.url + }; +} + +function anthropicWebSearchResultSnippet(result: BrowserWebSearchProtocolResult): string | undefined { + const parts = [ + result.snippet ? `Search snippet: ${sanitizeWebSearchEvidenceText(result.snippet)}` : "", + result.content ? `Extracted page content: ${sanitizeWebSearchEvidenceText(result.content)}` : "", + result.diagnostics?.length ? `Diagnostics: ${result.diagnostics.join("; ")}` : "" + ].filter(Boolean); + return parts.length > 0 ? parts.join("\n") : undefined; +} + +function sanitizeAnthropicToolUseId(value: string): string { + return value.replace(/[^a-zA-Z0-9]/g, "").slice(0, 24) || randomBytes(8).toString("hex"); +} + +type ParsedSseEvent = { + data?: unknown; + event?: string; + raw?: string; +}; + +function parseSseEvents(body: string): ParsedSseEvent[] { + return body + .split(/\r?\n\r?\n/g) + .filter((block) => block.trim()) + .map(parseSseEventBlock); +} + +function parseSseEventBlock(raw: string): ParsedSseEvent { + const lines = raw.split(/\r?\n/g); + const event = lines + .filter((line) => line.startsWith("event:")) + .map((line) => line.slice(6).trim()) + .find(Boolean); + const data = lines + .filter((line) => line.startsWith("data:")) + .map((line) => line.slice(5).replace(/^ /, "")) + .join("\n"); + if (!data || data === "[DONE]") { + return { event, raw }; + } + try { + return { data: JSON.parse(data) as unknown, event, raw }; + } catch { + return { event, raw }; + } +} + +function shiftSseContentBlockIndex(event: ParsedSseEvent, startIndex: number, delta: number): ParsedSseEvent { + if (!isRecord(event.data) || !Number.isFinite(event.data.index) || Number(event.data.index) < startIndex) { + return event; + } + return { + ...event, + data: { + ...event.data, + index: Number(event.data.index) + delta + } + }; +} + +function sseEventFromValue(data: Record): ParsedSseEvent { + return { + data, + event: stringValue(data.type) + }; +} + +function serializeSseEvent(event: ParsedSseEvent): string { + if (event.data === undefined) { + return event.raw ?? ""; + } + const type = isRecord(event.data) ? stringValue(event.data.type) : undefined; + return [ + event.event || type ? `event: ${event.event || type}` : undefined, + `data: ${JSON.stringify(event.data)}` + ].filter(Boolean).join("\n"); +} + +function requestProtocolForPath(path: string): GatewayProviderProtocol | undefined { + const normalized = path.toLowerCase(); + if (normalized === "/v1/messages" || normalized === "/messages" || normalized.endsWith("/v1/messages")) { + return "anthropic_messages"; + } + if (normalized === "/v1/chat/completions" || normalized === "/chat/completions" || normalized.endsWith("/chat/completions")) { + return "openai_chat_completions"; + } + if (normalized === "/v1/responses" || normalized === "/responses" || normalized.endsWith("/responses")) { + return "openai_responses"; + } + if (/\/v1(?:beta)?\/models\/[^/]+:(?:generatecontent|streamgeneratecontent)$/i.test(normalized)) { + return "gemini_generate_content"; + } + if (/\/v1(?:beta)?\/interactions(?:\/[^/]+(?:\/cancel)?)?$/i.test(normalized)) { + return "gemini_interactions"; + } + return undefined; +} + +function rewriteProviderHeader( + headers: Record, + headerName: string, + config: AppConfig, + protocol: GatewayProviderProtocol +): void { + const value = headers[headerName]; + if (!value) { + return; + } + headers[headerName] = rewriteProviderSelectorForProtocol(value, config, protocol); +} + +function rewriteProviderListHeader( + headers: Record, + headerName: string, + config: AppConfig, + protocol: GatewayProviderProtocol +): void { + const value = headers[headerName]; + if (!value) { + return; + } + headers[headerName] = value + .split(",") + .map((item) => rewriteProviderSelectorForProtocol(item.trim(), config, protocol)) + .filter(Boolean) + .join(","); +} + +function rewriteProviderSelectorForProtocol(value: string, config: AppConfig, protocol: GatewayProviderProtocol): string { + const provider = findProviderByPublicOrInternalName(config, value); + const capability = provider ? providerCapabilityForClientProtocol(provider, protocol) : undefined; + return provider && capability ? providerCapabilityInternalName(provider, capability.type) : value; +} + +function rewriteFallbackForProtocol(fallback: RouterFallbackConfig, config: AppConfig, protocol: GatewayProviderProtocol): RouterFallbackConfig { + const models = fallback.models.map((model) => rewriteModelSelectorForProtocol(model, config, protocol) ?? model); + return models.every((model, index) => model === fallback.models[index]) + ? fallback + : { + ...fallback, + models + }; +} + +function rewriteBodyModelForProtocol(body: Buffer | undefined, config: AppConfig, protocol: GatewayProviderProtocol): Buffer | undefined { + const parsedBody = parseJsonObjectSafe(body); + if (!parsedBody) { + return body; + } + const model = stringValue(parsedBody.model); + const rewrittenModel = rewriteModelSelectorForProtocol(model, config, protocol); + if (!rewrittenModel || rewrittenModel === model) { + return body; + } + return Buffer.from(`${JSON.stringify({ ...parsedBody, model: rewrittenModel })}\n`, "utf8"); +} + +function clearTargetProviderHeadersForModelSelector( + headers: Record, + config: AppConfig, + body: Buffer | undefined, + routedModel: string | undefined +): void { + const parsedBody = parseJsonObjectSafe(body); + const model = stringValue(parsedBody?.model) || routedModel; + if (!resolveConfiguredProviderModelSelector(model, config)) { + return; + } + + delete headers["x-target-provider"]; + delete headers["x-target-providers"]; + delete headers["x-gateway-target-provider"]; +} + +function rewriteModelSelectorForProtocol( + model: string | undefined, + config: AppConfig, + protocol: GatewayProviderProtocol +): string | undefined { + const normalized = normalizeRouteSelector(model); + if (!normalized) { + return model; + } + const publicModel = resolveGatewayPublicModelId(normalized, config) ?? normalized; + const selector = + resolveConfiguredProviderModelSelector(publicModel, config) ?? + resolveUniqueConfiguredProviderModelSelector(publicModel, config); + const capability = selector ? providerCapabilityForClientProtocol(selector.provider, protocol) : undefined; + return selector && capability + ? `${providerCapabilityInternalName(selector.provider, capability.type)}/${selector.model}` + : publicModel; +} + +function providerCapabilityForClientProtocol( + provider: GatewayProviderConfig, + clientProtocol: GatewayProviderProtocol +): GatewayProviderCapability | undefined { + const capabilities = normalizedProviderCapabilities(provider); + for (const protocol of providerProtocolPreferenceForClient(clientProtocol)) { + const capability = capabilities.find((item) => item.type === protocol); + if (capability) { + return capability; + } + } + return undefined; +} + +function providerProtocolForClientProtocol( + provider: GatewayProviderConfig, + clientProtocol: GatewayProviderProtocol +): GatewayProviderProtocol | undefined { + const capability = providerCapabilityForClientProtocol(provider, clientProtocol); + if (capability) { + return capability.type; + } + const directProtocol = + normalizeProviderProtocol(provider.type) ?? + normalizeProviderProtocol(provider.provider) ?? + inferProtocol(provider); + return providerProtocolPreferenceForClient(clientProtocol).includes(directProtocol) + ? directProtocol + : undefined; +} + +function providerProtocolPreferenceForClient(clientProtocol: GatewayProviderProtocol): GatewayProviderProtocol[] { + if (clientProtocol === "openai_responses") { + return ["openai_responses", "openai_chat_completions", "anthropic_messages", "gemini_interactions"]; + } + if (clientProtocol === "anthropic_messages") { + return uniqueProviderProtocols([clientProtocol, ...gatewayProviderProtocolFallbackOrder]); + } + return [clientProtocol]; +} + +function uniqueProviderProtocols(protocols: GatewayProviderProtocol[]): GatewayProviderProtocol[] { + const seen = new Set(); + const output: GatewayProviderProtocol[] = []; + for (const protocol of protocols) { + if (seen.has(protocol)) { + continue; + } + seen.add(protocol); + output.push(protocol); + } + return output; +} + +function findProviderByPublicOrInternalName(config: AppConfig, name: string): GatewayProviderConfig | undefined { + const normalized = name.trim().toLowerCase(); + if (!normalized) { + return undefined; + } + const credentialInternalName = parseProviderCredentialInternalName(name); + if (credentialInternalName) { + const internalProviderId = credentialInternalName.providerId.toLowerCase(); + return config.Providers.find((provider) => + provider.name.trim().toLowerCase() === internalProviderId || + providerRuntimeId(provider).toLowerCase() === internalProviderId + ); + } + return config.Providers.find((provider) => + provider.name.trim().toLowerCase() === normalized || + provider.id?.trim().toLowerCase() === normalized || + provider.provider?.trim().toLowerCase() === normalized || + providerRuntimeId(provider).toLowerCase() === normalized || + normalizedProviderCapabilities(provider).some((capability) => + providerCapabilityNameMatches(provider, capability.type, normalized) + ) + ); +} + +function rewriteCapabilityResponseHeaders(headers: Headers, config: AppConfig): Headers { + const providerName = headers.get("x-gateway-target-provider-name")?.trim(); + if (!providerName) { + return headers; + } + const credentialInternalName = parseProviderCredentialInternalName(providerName); + if (credentialInternalName) { + const provider = findProviderByPublicOrInternalName(config, credentialInternalName.providerId); + if (!provider) { + return headers; + } + const credential = findProviderCredentialBySlug(provider, credentialInternalName.credentialSlug); + const rewritten = new Headers(headers); + rewritten.set("x-gateway-target-provider-name", providerRuntimeId(provider)); + rewritten.set("x-ccr-provider-protocol", credentialInternalName.protocol); + rewritten.set("x-ccr-provider-credential-provider", providerRuntimeId(provider)); + rewritten.set("x-ccr-provider-credential-id", providerCredentialSlug(credential ? providerCredentialRuntimeId(provider, credential) : credentialInternalName.credentialSlug)); + return rewritten; + } + const provider = findProviderByPublicOrInternalName(config, providerName); + if (!provider) { + return headers; + } + const capability = normalizedProviderCapabilities(provider).find((item) => + providerCapabilityNameMatches(provider, item.type, providerName) + ); + const rewritten = new Headers(headers); + rewritten.set("x-gateway-target-provider-name", providerRuntimeId(provider)); + if (capability) { + rewritten.set("x-ccr-provider-protocol", capability.type); + } + return rewritten; +} + +async function fetchUpstreamWithFallback(input: { + body?: Buffer; + config: AppConfig; + coreAuthToken: string; + fallback: RouterFallbackConfig; + headers: Record; + method: string; + path: string; + routedModel?: string; + signal?: AbortSignal; + upstreamUrl: string; +}): Promise { + const fallbackMode = input.fallback.mode; + const attempts = buildUpstreamAttempts(input.fallback, input.method, input.body, input.routedModel); + const failedAttempts: UpstreamFailedAttempt[] = []; + + for (let index = 0; index < attempts.length; index += 1) { + if (input.signal?.aborted) { + throw new UpstreamRequestError(abortSignalMessage(input.signal), { + failedAttempts + }); + } + + const attempt = prepareUpstreamCredentialAttempt({ + attempt: attempts[index], + config: input.config, + headers: input.headers, + method: input.method, + path: input.path + }); + const hasNextAttempt = index < attempts.length - 1; + + try { + const response = await fetchWithSystemProxy(input.upstreamUrl, { + body: shouldSendBody(input.method) ? attempt.body?.toString("utf8") : undefined, + headers: withCoreGatewayAuthHeader(omitLocalObservabilityHeaders(attempt.headers ?? input.headers), input.coreAuthToken), + method: input.method, + signal: input.signal + }); + + if (hasNextAttempt && shouldFallbackAfterStatus(response.status, fallbackMode)) { + const delayMs = retryDelayAfterStatus(response.status, response.headers, failedAttempts.length); + failedAttempts.push({ + credentialChain: attempt.credentialChain, + credentialIds: attempt.credentialIds, + delayMs, + model: attempt.model, + statusCode: response.status + }); + recordProviderCredentialOutcome(input.config, input.method, attempt, response.status, response.headers); + await drainResponseBody(response); + if (delayMs > 0) { + await delay(delayMs); + } + continue; + } + + return { + attempt, + failedAttempts, + response + }; + } catch (error) { + const message = formatError(error); + const delayMs = hasNextAttempt && !input.signal?.aborted + ? retryDelayAfterNetworkError(failedAttempts.length) + : 0; + failedAttempts.push({ + credentialChain: attempt.credentialChain, + credentialIds: attempt.credentialIds, + delayMs, + error: message, + model: attempt.model + }); + if (input.signal?.aborted) { + throw new UpstreamRequestError(abortSignalMessage(input.signal), { + attempt, + cause: error, + failedAttempts + }); + } + if (hasNextAttempt) { + if (delayMs > 0) { + await delay(delayMs); + } + continue; + } + throw new UpstreamRequestError(message, { + attempt, + cause: error, + failedAttempts + }); + } + } + + throw new UpstreamRequestError("Gateway request failed before reaching an upstream provider.", { + failedAttempts + }); +} + +function prepareUpstreamCredentialAttempt(input: { + attempt: UpstreamAttempt; + config: AppConfig; + headers: Record; + method: string; + path: string; +}): UpstreamAttempt { + const normalizedBody = normalizeConfiguredProviderModelBody(input.attempt.body, input.config); + const target = resolveProviderCredentialRoutingTarget(input.config, input.headers, input.path, input.attempt.body); + const attemptBody = (body: Buffer | undefined) => usageAwareOpenAiChatAttemptBody({ + body, + config: input.config, + path: input.path, + target + }); + if (!target) { + const body = bodyHasConfiguredProviderModelSelector(input.attempt.body, input.config) + ? input.attempt.body + : normalizedBody?.body ?? input.attempt.body; + return { + ...input.attempt, + body: attemptBody(body), + headers: input.headers + }; + } + + const credentials = activeProviderCredentials(target.provider); + if (credentials.length === 0) { + return { + ...input.attempt, + body: attemptBody(target.body ?? normalizedBody?.body ?? input.attempt.body), + headers: input.headers + }; + } + + const usage = estimateLimitUsage(input.method, input.attempt.body ?? Buffer.alloc(0)); + const selection = selectProviderCredentials(target.provider, target.protocol, credentials, usage); + if (selection.credentials.length === 0) { + return { + ...input.attempt, + body: attemptBody(target.body ?? normalizedBody?.body ?? input.attempt.body), + headers: input.headers + }; + } + + const headers: Record = { + ...input.headers, + "x-target-providers": selection.credentials.map((candidate) => candidate.internalName).join(","), + "x-ccr-logical-provider": providerRuntimeId(target.provider), + "x-ccr-provider-credential-chain": selection.credentials.map((candidate) => candidate.credentialId).join(",") + }; + delete headers["x-target-provider"]; + if (selection.saturated) { + headers["x-ccr-provider-credential-saturated"] = "true"; + } + + return { + ...input.attempt, + body: attemptBody(target.body ?? normalizedBody?.body ?? input.attempt.body), + credentialChain: selection.credentials.map((candidate) => candidate.internalName), + credentialIds: selection.credentials.map((candidate) => candidate.credentialId), + credentialProtocol: target.protocol, + headers, + logicalProvider: target.provider.name + }; +} + +function usageAwareOpenAiChatAttemptBody(input: { + body: Buffer | undefined; + config: AppConfig; + path: string; + target?: { protocol: GatewayProviderProtocol }; +}): Buffer | undefined { + if (input.target?.protocol === "openai_chat_completions") { + return usageAwareOpenAiChatBody(input.body); + } + + const protocol = requestProtocolForPath(input.path); + if (!protocol) { + return input.body; + } + + const parsedBody = parseJsonObjectSafe(input.body); + const modelSelector = resolveConfiguredProviderModelSelector(stringValue(parsedBody?.model), input.config); + const providerProtocol = modelSelector + ? providerProtocolForClientProtocol(modelSelector.provider, protocol) + : undefined; + return providerProtocol === "openai_chat_completions" + ? usageAwareOpenAiChatBody(input.body) + : input.body; +} + +function usageAwareOpenAiChatBody(body: Buffer | undefined): Buffer | undefined { + const parsedBody = parseJsonObjectSafe(body); + if (!parsedBody || parsedBody.stream !== true) { + return body; + } + const streamOptions = isRecord(parsedBody.stream_options) + ? parsedBody.stream_options + : isRecord(parsedBody.streamOptions) + ? parsedBody.streamOptions + : {}; + if (streamOptions.include_usage === true || streamOptions.includeUsage === true) { + return body; + } + return Buffer.from(`${JSON.stringify({ + ...parsedBody, + stream_options: { + ...streamOptions, + include_usage: true + } + })}\n`, "utf8"); +} + +function normalizeConfiguredProviderModelBody( + body: Buffer | undefined, + config: AppConfig +): { body: Buffer; model: string } | undefined { + const parsedBody = parseJsonObjectSafe(body); + const model = stringValue(parsedBody?.model); + const selector = resolveConfiguredProviderModelSelector(model, config); + if (!parsedBody || !selector || selector.model === model) { + return undefined; + } + return { + body: serializeJsonBodyWithModel(parsedBody, selector.model), + model: selector.model + }; +} + +function bodyHasConfiguredProviderModelSelector(body: Buffer | undefined, config: AppConfig): boolean { + const parsedBody = parseJsonObjectSafe(body); + const model = stringValue(parsedBody?.model); + return Boolean(resolveConfiguredProviderModelSelector(model, config)); +} + +function resolveProviderCredentialRoutingTarget( + config: AppConfig, + headers: Record, + path: string, + body: Buffer | undefined +): { body?: Buffer; model?: string; provider: GatewayProviderConfig; protocol: GatewayProviderProtocol } | undefined { + const protocol = requestProtocolForPath(path); + if (!protocol) { + return undefined; + } + + const parsedBody = parseJsonObjectSafe(body); + const bodyModel = stringValue(parsedBody?.model); + const modelSelector = resolveConfiguredProviderModelSelector(bodyModel, config); + if (modelSelector) { + const provider = modelSelector.provider; + const providerProtocol = provider ? providerProtocolForClientProtocol(provider, protocol) : undefined; + if (provider && providerProtocol && activeProviderCredentials(provider).length > 0) { + return { + body: parsedBody ? serializeJsonBodyWithModel(parsedBody, modelSelector.model) : body, + model: modelSelector.model, + provider, + protocol: providerProtocol + }; + } + } + + const targetProviderName = firstTargetProviderHeader(headers); + if (!targetProviderName) { + return undefined; + } + + const provider = findProviderByPublicOrInternalName(config, targetProviderName); + if (!provider || activeProviderCredentials(provider).length === 0) { + return undefined; + } + const providerProtocol = providerProtocolForClientProtocol(provider, protocol); + if (!providerProtocol) { + return undefined; + } + const providerModel = resolveModelForProvider(bodyModel, provider); + + return { + body: parsedBody && providerModel && providerModel !== bodyModel + ? serializeJsonBodyWithModel(parsedBody, providerModel) + : body, + model: providerModel ?? bodyModel, + provider, + protocol: providerProtocol + }; +} + +function resolveModelForProvider( + value: string | undefined, + provider: GatewayProviderConfig +): string | undefined { + const normalized = normalizeRouteSelector(value); + if (!normalized) { + return undefined; + } + if (providerHasModel(provider, normalized)) { + return normalized; + } + const parsed = parseProviderModelSelector(normalized); + return parsed && providerHasModel(provider, parsed.model) ? parsed.model : undefined; +} + +function providerHasModel(provider: GatewayProviderConfig, model: string): boolean { + const normalized = model.trim().toLowerCase(); + return Boolean(normalized) && provider.models.some((candidate) => candidate.trim().toLowerCase() === normalized); +} + +function parseProviderModelSelector(value: string | undefined): { model: string; provider: string } | undefined { + const normalized = normalizeRouteSelector(value); + if (!normalized) { + return undefined; + } + const separator = normalized.indexOf("/"); + if (separator <= 0 || separator >= normalized.length - 1) { + return undefined; + } + const provider = normalized.slice(0, separator).trim(); + const model = normalized.slice(separator + 1).trim(); + return provider && model ? { model, provider } : undefined; +} + +function resolveConfiguredProviderModelSelector( + value: string | undefined, + config: AppConfig +): { model: string; provider: GatewayProviderConfig } | undefined { + let current = normalizeRouteSelector(value); + if (!current) { + return undefined; + } + + let selectedProvider: GatewayProviderConfig | undefined; + for (let depth = 0; depth < 4; depth += 1) { + const parsed = parseProviderModelSelector(current); + if (!parsed) { + break; + } + + const provider = findProviderByPublicOrInternalName(config, parsed.provider); + if (!provider) { + break; + } + + selectedProvider = provider; + current = parsed.model; + + const nested = parseProviderModelSelector(current); + if (!nested) { + return current ? { model: current, provider } : undefined; + } + + const nestedProvider = findProviderByPublicOrInternalName(config, nested.provider); + if (!nestedProvider || providerRuntimeId(nestedProvider) !== providerRuntimeId(provider)) { + return current ? { model: current, provider } : undefined; + } + } + + return selectedProvider && current ? { model: current, provider: selectedProvider } : undefined; +} + +function resolveUniqueConfiguredProviderModelSelector( + value: string | undefined, + config: AppConfig +): { model: string; provider: GatewayProviderConfig } | undefined { + const model = normalizeRouteSelector(value); + if (!model) { + return undefined; + } + + const exactMatches = configuredProviderModelMatches(model, config, false); + if (exactMatches.length === 1) { + return exactMatches[0]; + } + if (exactMatches.length > 1) { + return undefined; + } + + const caseInsensitiveMatches = configuredProviderModelMatches(model, config, true); + return caseInsensitiveMatches.length === 1 ? caseInsensitiveMatches[0] : undefined; +} + +function configuredProviderModelMatches( + model: string, + config: AppConfig, + caseInsensitive: boolean +): Array<{ model: string; provider: GatewayProviderConfig }> { + const normalized = caseInsensitive ? model.toLowerCase() : model; + const matches: Array<{ model: string; provider: GatewayProviderConfig }> = []; + for (const provider of config.Providers) { + for (const candidate of provider.models) { + const configuredModel = candidate.trim(); + if (!configuredModel) { + continue; + } + const comparable = caseInsensitive ? configuredModel.toLowerCase() : configuredModel; + if (comparable === normalized) { + matches.push({ model: configuredModel, provider }); + } + } + } + return matches; +} + +function firstTargetProviderHeader(headers: Record): string | undefined { + const provider = headers["x-target-provider"] || headers["x-gateway-target-provider"]; + if (provider?.trim()) { + return provider.trim(); + } + const providers = headers["x-target-providers"]; + return providers + ?.split(",") + .map((item) => item.trim()) + .find(Boolean); +} + +function activeProviderCredentials(provider: GatewayProviderConfig): ProviderCredentialConfig[] { + return (provider.credentials ?? []).filter((credential) => + credential.enabled !== false && + Boolean(providerCredentialApiKey(credential)) + ); +} + +function selectProviderCredentials( + provider: GatewayProviderConfig, + protocol: GatewayProviderProtocol, + credentials: ProviderCredentialConfig[], + usage: ApiKeyLimitUsage +): { credentials: Array<{ credential: ProviderCredentialConfig; credentialId: string; internalName: string }>; saturated: boolean } { + const candidates = credentials.map((credential, index) => { + const providerIndex = provider.credentials?.indexOf(credential) ?? index; + const limitState = providerCredentialLimitState(provider, credential, usage); + const cooldown = readProviderCredentialCooldown(provider, credential); + return { + cooldown, + credential, + credentialId: providerCredentialSlug(providerCredentialRuntimeId(provider, credential, providerIndex)), + index: providerIndex, + internalName: providerCredentialInternalName(provider, protocol, credential), + limitState, + priority: providerCredentialPriority(credential, providerIndex), + weight: Math.max(1, credential.weight ?? 1) + }; + }); + const available = candidates.filter((candidate) => !candidate.cooldown && !candidate.limitState.blocked); + const sorted = sortProviderCredentialCandidates(available.length > 0 ? available : candidates); + return { + credentials: sorted.map((candidate) => ({ + credential: candidate.credential, + credentialId: candidate.credentialId, + internalName: candidate.internalName + })), + saturated: available.length === 0 && candidates.length > 0 + }; +} + +function sortProviderCredentialCandidates(candidates: T[]): T[] { + const prioritySorted = [...candidates].sort((left, right) => + left.priority - right.priority || + left.limitState.utilization - right.limitState.utilization || + right.weight - left.weight || + left.index - right.index + ); + const primaryPriority = prioritySorted[0]?.priority; + const primaryCandidates = prioritySorted.filter((candidate) => candidate.priority === primaryPriority); + const shouldSpillOver = primaryCandidates.length > 0 && + primaryCandidates.every((candidate) => candidate.limitState.utilization >= providerCredentialSpilloverThreshold); + + if (shouldSpillOver) { + return prioritySorted.sort((left, right) => + left.limitState.utilization - right.limitState.utilization || + left.priority - right.priority || + right.weight - left.weight || + left.index - right.index + ); + } + + return prioritySorted; +} + +function providerCredentialPriority(credential: ProviderCredentialConfig, index: number): number { + return Number.isFinite(credential.priority) ? Number(credential.priority) : index + 1; +} + +function buildUpstreamAttempts(fallback: RouterFallbackConfig, method: string, body: Buffer | undefined, routedModel: string | undefined): UpstreamAttempt[] { + const initialAttempt: UpstreamAttempt = { + body, + index: 0, + model: normalizeRouteSelector(routedModel) + }; + if (fallback.mode === "off" || !shouldSendBody(method)) { + return [initialAttempt]; + } + + if (fallback.mode === "retry") { + const retryCount = clampNumber(fallback.retryCount, 0, ROUTER_FALLBACK_MAX_RETRY_COUNT); + return Array.from({ length: retryCount + 1 }, (_unused, index) => ({ + body, + index, + model: initialAttempt.model + })); + } + + const parsedBody = parseJsonObjectSafe(body); + const currentModel = normalizeRouteSelector(stringValue(parsedBody?.model)) ?? initialAttempt.model; + const configuredModels = uniqueStrings( + fallback.models + .map((model) => normalizeRouteSelector(model)) + .filter((model): model is string => Boolean(model)) + ); + const modelChain = uniqueStrings([currentModel, ...configuredModels].filter((model): model is string => Boolean(model))); + if (modelChain.length === 0 || !parsedBody) { + return [initialAttempt]; + } + + return modelChain.map((model, index) => ({ + body: serializeJsonBodyWithModel(parsedBody, model), + index, + model + })); +} + +function shouldFallbackAfterStatus(statusCode: number, mode: RouterFallbackMode): boolean { + if (mode === "model-chain" && statusCode >= 400) { + return true; + } + if (statusCode === 408 || statusCode === 409 || statusCode === 429 || statusCode >= 500) { + return true; + } + return false; +} + +function retryDelayAfterStatus(_statusCode: number, headers: Headers, failedAttemptIndex: number): number { + const retryAfterMs = parseRetryAfterHeaderMs(headers.get("retry-after")); + if (retryAfterMs !== undefined && retryAfterMs > 0) { + return clampNumber(retryAfterMs, 1, upstreamRetryAfterMaxMs); + } + return exponentialRetryBackoffMs(failedAttemptIndex); +} + +function retryDelayAfterNetworkError(failedAttemptIndex: number): number { + return exponentialRetryBackoffMs(failedAttemptIndex); +} + +export function fallbackRetryDelayAfterStatusForTest(input: { failedAttemptIndex?: number; retryAfter?: string | null; statusCode: number }): number { + const headers = new Headers(); + if (input.retryAfter !== undefined && input.retryAfter !== null) { + headers.set("retry-after", input.retryAfter); + } + return retryDelayAfterStatus(input.statusCode, headers, input.failedAttemptIndex ?? 0); +} + +export function fallbackRetryDelayAfterNetworkErrorForTest(failedAttemptIndex = 0): number { + return retryDelayAfterNetworkError(failedAttemptIndex); +} + +function parseRetryAfterHeaderMs(value: string | null): number | undefined { + const trimmed = value?.trim(); + if (!trimmed) { + return undefined; + } + + const seconds = Number(trimmed); + if (Number.isFinite(seconds) && seconds >= 0) { + return seconds * 1000; + } + + const retryAt = Date.parse(trimmed); + return Number.isFinite(retryAt) ? Math.max(0, retryAt - Date.now()) : undefined; +} + +function exponentialRetryBackoffMs(failedAttemptIndex: number): number { + const exponent = Math.min(10, Math.max(0, failedAttemptIndex)); + return Math.min(upstreamRetryBackoffMaxMs, upstreamRetryBackoffBaseMs * 2 ** exponent); +} + +async function drainResponseBody(response: Response): Promise { + try { + await response.arrayBuffer(); + } catch { + // The failed attempt is already being skipped; body drain errors should not block the next attempt. + } +} + +async function cancelResponseBody(response: Response): Promise { + try { + await response.body?.cancel(); + } catch { + // The client already disconnected; best-effort upstream cleanup must not mask that expected path. + } +} + +function uniqueStreams(streams: Readable[]): Readable[] { + return [...new Set(streams)]; +} + +function destroyResponseStreams(streams: Readable[]): void { + for (const stream of streams) { + if (!stream.destroyed) { + // A downstream client close is an expected abort path. Destroying with + // an Error would emit another error event on Readable/Transform stages, + // and intermediate stages may not be the final responseBody listener. + stream.destroy(); + } + } +} + +function parseJsonObjectSafe(buffer: Buffer | undefined): Record | undefined { + if (!buffer || buffer.byteLength === 0) { + return undefined; + } + try { + return parseJsonObject(buffer); + } catch { + return undefined; + } +} + +function serializeJsonBodyWithModel(body: Record, model: string): Buffer { + return Buffer.from(`${JSON.stringify({ ...body, model })}\n`, "utf8"); +} + +function mergeFallbackResponseHeaders(headers: Headers, result: UpstreamFetchResult): Headers { + const credentialIds = result.attempt.credentialIds ?? []; + const credentialSaturated = result.attempt.headers?.["x-ccr-provider-credential-saturated"] === "true"; + if (result.failedAttempts.length === 0 && credentialIds.length === 0 && !credentialSaturated) { + return headers; + } + + const merged = new Headers(headers); + if (result.failedAttempts.length > 0) { + merged.set("x-ccr-fallback-attempts", String(result.failedAttempts.length + 1)); + merged.set("x-ccr-fallback-failures", formatFallbackFailures(result.failedAttempts)); + if (result.failedAttempts.some((attempt) => (attempt.delayMs ?? 0) > 0)) { + merged.set("x-ccr-fallback-delays-ms", formatFallbackDelays(result.failedAttempts)); + } + if (result.attempt.model) { + merged.set("x-ccr-fallback-model", sanitizeHeaderValue(result.attempt.model)); + } + } + if (credentialIds.length) { + merged.set("x-ccr-provider-credential-chain", credentialIds.join(",")); + } + if (credentialSaturated) { + merged.set("x-ccr-provider-credential-saturated", "true"); + } + return merged; +} + +function upstreamResponseHeaders(result: UpstreamFetchResult): Headers { + return result.response.headers; +} + +function formatFallbackFailures(failedAttempts: UpstreamFailedAttempt[]): string { + return failedAttempts + .map((attempt) => attempt.statusCode ? String(attempt.statusCode) : attempt.error ? "network" : "failed") + .join(","); +} + +function formatFallbackDelays(failedAttempts: UpstreamFailedAttempt[]): string { + return failedAttempts + .map((attempt) => String(Math.max(0, attempt.delayMs ?? 0))) + .join(","); +} + +function clampNumber(value: number, min: number, max: number): number { + return Math.min(max, Math.max(min, Math.trunc(Number.isFinite(value) ? value : min))); +} + +function uniqueStrings(values: Array): string[] { + const seen = new Set(); + const result: string[] = []; + for (const value of values) { + const item = value?.trim(); + if (!item || seen.has(item)) { + continue; + } + seen.add(item); + result.push(item); + } + return result; +} + +function spawnGatewayProcess(config: AppConfig, upstreamProxyUrl: string | undefined, runtimeId: string, coreAuthToken: string): ChildProcess { + const gatewayEntry = resolveGatewayEntry(); + const proxyPreloadFile = upstreamProxyUrl ? writeGatewayProxyPreloadFile(config, upstreamProxyUrl) : undefined; + const env = createGatewayProcessEnv(config, upstreamProxyUrl, runtimeId, coreAuthToken); + const args = proxyPreloadFile ? ["--require", proxyPreloadFile, gatewayEntry] : [gatewayEntry]; + return spawn(process.execPath, args, { + cwd: dirname(config.gateway.generatedConfigFile), + env, + stdio: ["ignore", "pipe", "pipe"] + }); +} + +function resolveGatewayEntry(): string { + const override = process.env[gatewayEntryOverrideEnv]?.trim(); + if (override) { + const entry = pathResolve(override); + if (!existsSync(entry)) { + throw new Error(`${gatewayEntryOverrideEnv} points to a missing gateway entry: ${entry}`); + } + return entry; + } + + const bundledEntry = resolveBundledGatewayEntry(); + if (bundledEntry) { + return bundledEntry; + } + + for (const packageName of gatewayPackageCandidates) { + try { + return requireFromHere.resolve(packageName); + } catch { + // Try the next known package name. + } + } + return requireFromHere.resolve(gatewayPackageCandidates[0]); +} + +function resolveBundledGatewayEntry(): string | undefined { + const resourcesPath = (process as NodeJS.Process & { resourcesPath?: string }).resourcesPath; + return [ + pathJoin(__dirname, "next-ai-gateway.js"), + ...(resourcesPath + ? [ + pathJoin(resourcesPath, "app.asar", "dist", "main", "next-ai-gateway.js"), + pathJoin(resourcesPath, "app", "dist", "main", "next-ai-gateway.js") + ] + : []) + ].find((candidate) => existsSync(candidate)); +} + +function resolveUndiciProxyAgentModule(): string { + const bundled = resolveBundledUndiciProxyAgentModule(); + if (bundled) { + return bundled; + } + + try { + return requireFromHere.resolve("undici"); + } catch (error) { + throw new Error(`Unable to resolve undici ProxyAgent module for gateway proxy preload: ${formatError(error)}`); + } +} + +function resolveBundledUndiciProxyAgentModule(): string | undefined { + const resourcesPath = (process as NodeJS.Process & { resourcesPath?: string }).resourcesPath; + return [ + pathJoin(__dirname, "undici-proxy-agent.js"), + ...(resourcesPath + ? [ + pathJoin(resourcesPath, "app.asar", "dist", "main", "undici-proxy-agent.js"), + pathJoin(resourcesPath, "app", "dist", "main", "undici-proxy-agent.js") + ] + : []) + ].find((candidate) => existsSync(candidate)); +} + +function createGatewayProcessEnv(config: AppConfig, upstreamProxyUrl: string | undefined, runtimeId: string, coreAuthToken: string): NodeJS.ProcessEnv { + const env: NodeJS.ProcessEnv = { + ...process.env, + AUTH_ENABLED: "true", + AUTH_MODE: "static_api_key", + AUTH_REQUIRED: "true", + AUTH_STATIC_API_KEY_BEARER_ONLY: "false", + AUTH_STATIC_API_KEY_ENV: coreGatewayAuthTokenEnv, + AUTH_STATIC_API_KEY_HEADER: coreGatewayAuthHeader, + CCR_GATEWAY_RUNTIME_ID: runtimeId, + [coreGatewayAuthTokenEnv]: coreAuthToken, + ELECTRON_RUN_AS_NODE: "1", + GATEWAY_CONFIG_PATH: config.gateway.generatedConfigFile, + HOST: config.gateway.coreHost, + PORT: String(config.gateway.corePort) + }; + + const noProxy = mergeNoProxy(env.NO_PROXY || env.no_proxy, [ + "127.0.0.1", + "localhost", + "::1", + config.gateway.host, + config.gateway.coreHost + ]); + env.NO_PROXY = noProxy; + env.no_proxy = noProxy; + + if (!upstreamProxyUrl) { + return env; + } + + env.HTTP_PROXY = upstreamProxyUrl; + env.HTTPS_PROXY = upstreamProxyUrl; + env.ALL_PROXY = upstreamProxyUrl; + env.http_proxy = upstreamProxyUrl; + env.https_proxy = upstreamProxyUrl; + env.all_proxy = upstreamProxyUrl; + env.CCR_UPSTREAM_PROXY_URL = upstreamProxyUrl; + env.CCR_UNDICI_MODULE = resolveUndiciProxyAgentModule(); + return env; +} + +function writeGatewayProxyPreloadFile(config: AppConfig, upstreamProxyUrl: string): string { + const file = pathJoin(dirname(config.gateway.generatedConfigFile), "gateway-proxy-preload.cjs"); + writeFileSync( + file, + [ + "\"use strict\";", + "const up = process.env.CCR_UPSTREAM_PROXY_URL;", + "const um = process.env.CCR_UNDICI_MODULE;", + "if (up && um) {", + " const { ProxyAgent } = require(um);", + " const agent = new ProxyAgent(up);", + " const realFetch = globalThis.fetch.bind(globalThis);", + " const raw = (process.env.NO_PROXY || process.env.no_proxy || '').toLowerCase();", + " const byp = raw.split(',').map((s) => s.trim()).filter(Boolean);", + " const norm = (h) => h.replace(/^\\[/, '').replace(/\\]$/, '').replace(/\\.$/, '');", + " const isLP = (h) => h === 'localhost' || h === '127.0.0.1' || h === '::1' || h === '0:0:0:0:0:0:0:1' || h === '0.0.0.0' || h.startsWith('127.');", + " const shouldBypass = (input) => {", + " let h;", + " try {", + " const u = typeof input === 'string' ? new URL(input) : input instanceof URL ? input : new URL(input && input.url ? input.url : String(input));", + " h = norm(u.hostname);", + " } catch { return true; }", + " if (!h) return false;", + " if (isLP(h)) return true;", + " return byp.some((p) => {", + " if (p === '*') return true;", + " const s = p.split(':');", + " const ph = norm(s[0]);", + " if (s.length === 2 && s[1]) {", + " if (h !== ph) return false;", + " try { return new URL(input).port === s[1]; } catch { return false; }", + " }", + " if (ph.startsWith('*.')) return h.endsWith(ph.slice(1));", + " if (ph.startsWith('.')) return h.endsWith(ph) || h === ph.slice(1);", + " return h === ph;", + " });", + " };", + " const patched = function(input, init) {", + " if (init && init.dispatcher) return realFetch(input, init);", + " if (shouldBypass(input)) return realFetch(input, init);", + " return realFetch(input, Object.assign({}, init, { dispatcher: agent }));", + " };", + " if (Object.getOwnPropertyDescriptor(globalThis, 'fetch')?.writable) {", + " globalThis.fetch = patched;", + " }", + "}" + ].join("\n"), + "utf8" + ); + return file; +} + +function mergeNoProxy(current: string | undefined, values: string[]): string { + const merged = new Set(); + for (const value of [...(current || "").split(","), ...values]) { + const trimmed = value.trim(); + if (trimmed) { + merged.add(trimmed); + } + } + return [...merged].join(","); +} + +function toCoreGatewayProviders(provider: GatewayProviderConfig): CoreGatewayProvider[] { + const capabilities = normalizedProviderCapabilities(provider); + if (capabilities.length === 0) { + return toCoreGatewayProvidersForCapability(provider); + } + + return capabilities + .flatMap((capability) => toCoreGatewayProvidersForCapability(provider, capability)) + .filter((item): item is CoreGatewayProvider => Boolean(item)); +} + +function toCoreGatewayProvidersForCapability( + provider: GatewayProviderConfig, + capability?: GatewayProviderCapability +): CoreGatewayProvider[] { + const credentials = activeProviderCredentials(provider); + if (credentials.length === 0) { + const coreProvider = toCoreGatewayProvider(provider, capability); + return coreProvider ? [coreProvider] : []; + } + + return sortProviderCredentialsForConfig(credentials) + .map((credential) => toCoreGatewayProvider(provider, capability, credential)) + .filter((item): item is CoreGatewayProvider => Boolean(item)); +} + +function toCoreGatewayProvider( + provider: GatewayProviderConfig, + capability?: GatewayProviderCapability, + credential?: ProviderCredentialConfig +): CoreGatewayProvider | undefined { + const type = + capability?.type ?? + normalizeProviderProtocol(provider.type) ?? + normalizeProviderProtocol(provider.provider) ?? + inferProtocol(provider); + const baseurl = normalizeProviderRuntimeBaseUrl(capability?.baseUrl ?? readBaseUrl(provider), type); + const apikey = credential ? providerCredentialApiKey(credential) : provider.apikey || provider.apiKey || provider.api_key; + + if (!provider.name || provider.models.length === 0) { + return undefined; + } + const safetyIssue = providerApiKeySafetyIssue({ + apiKey: apikey, + baseUrl: baseurl ?? "", + name: provider.name + }); + if (safetyIssue) { + throw new Error(safetyIssue.message); + } + + return { + apikey, + baseurl, + billing: provider.billing, + extraBody: provider.extraBody, + extraHeaders: provider.extraHeaders, + models: provider.models, + name: credential + ? providerCredentialInternalName(provider, type, credential) + : capability + ? providerCapabilityInternalName(provider, type) + : providerRuntimeId(provider), + type + }; +} + +function sortProviderCredentialsForConfig(credentials: ProviderCredentialConfig[]): ProviderCredentialConfig[] { + return [...credentials].sort((left, right) => + providerCredentialPriority(left, 0) - providerCredentialPriority(right, 0) || + providerCredentialSortKey(left).localeCompare(providerCredentialSortKey(right)) + ); +} + +function normalizedProviderCapabilities(provider: GatewayProviderConfig): GatewayProviderCapability[] { + const capabilities = Array.isArray(provider.capabilities) ? provider.capabilities : []; + const normalized: GatewayProviderCapability[] = []; + const byProtocol = new Map(); + for (const capability of capabilities) { + const type = normalizeProviderProtocol(capability.type); + const baseUrl = capability.baseUrl?.trim(); + if (!type || !baseUrl) { + continue; + } + const item = { + ...capability, + baseUrl, + type + }; + const existing = byProtocol.get(type); + if (!existing || providerCapabilityPriority(item) < providerCapabilityPriority(existing)) { + byProtocol.set(type, item); + } + } + for (const capability of capabilities) { + const type = normalizeProviderProtocol(capability.type); + const selected = type ? byProtocol.get(type) : undefined; + if (selected && !normalized.includes(selected)) { + normalized.push(selected); + } + } + return applyPresetProtocolLock(provider, normalized); +} + +function applyPresetProtocolLock( + provider: GatewayProviderConfig, + capabilities: GatewayProviderCapability[] +): GatewayProviderCapability[] { + const lockedProtocols = lockedProviderPresetProtocols(provider, capabilities); + if (lockedProtocols.length === 0) { + return capabilities; + } + + const lockedProtocolSet = new Set(lockedProtocols); + const lockedCapabilities = capabilities.filter((capability) => lockedProtocolSet.has(capability.type)); + if (lockedCapabilities.length > 0) { + return lockedCapabilities; + } + + const lockedProtocol = lockedProtocols[0]; + const baseUrl = readBaseUrl(provider); + const normalizedBaseUrl = normalizeProviderRuntimeBaseUrl(baseUrl, lockedProtocol); + return normalizedBaseUrl + ? [{ baseUrl: normalizedBaseUrl, source: "preset", type: lockedProtocol }] + : []; +} + +function lockedProviderPresetProtocols( + provider: GatewayProviderConfig, + capabilities: GatewayProviderCapability[] +): GatewayProviderProtocol[] { + const baseUrls = [ + readBaseUrl(provider), + ...capabilities.map((capability) => capability.baseUrl) + ].filter((value): value is string => Boolean(value?.trim())); + + for (const baseUrl of baseUrls) { + if (findProviderPresetByBaseUrl(baseUrl)?.id === "gemini") { + return ["gemini_generate_content", "gemini_interactions"]; + } + } + + return []; +} + +function providerCapabilityPriority(capability: GatewayProviderCapability): number { + if (capability.source === "preset") { + return 0; + } + if (capability.source === "detected") { + return 2; + } + return 1; +} + +function providerCapabilityInternalName(provider: GatewayProviderConfig, protocol: GatewayProviderProtocol): string { + return `${providerRuntimeId(provider)}::${protocol}`; +} + +function providerCapabilityLegacyInternalName(providerName: string, protocol: GatewayProviderProtocol): string { + return `${providerName}::${protocol}`; +} + +function providerCapabilityNameMatches(provider: GatewayProviderConfig, protocol: GatewayProviderProtocol, value: string): boolean { + const normalized = value.trim().toLowerCase(); + return providerCapabilityInternalName(provider, protocol).toLowerCase() === normalized || + providerCapabilityLegacyInternalName(provider.name, protocol).toLowerCase() === normalized; +} + +function providerRuntimeId(provider: GatewayProviderConfig): string { + const explicit = sanitizeProviderHeaderId(provider.id); + if (explicit) { + return explicit; + } + const normalized = provider.name + .normalize("NFKD") + .replace(/[\u0300-\u036f]/g, "") + .toLowerCase() + .replace(/[^a-z0-9_.-]+/g, "-") + .replace(/^-+|-+$/g, "") + .slice(0, 48); + const hash = createHash("sha256").update(`${provider.name}\n${readBaseUrl(provider) ?? ""}`).digest("hex").slice(0, 10); + return `provider-${normalized || "provider"}-${hash}`; +} + +function sanitizeProviderHeaderId(value: string | undefined): string | undefined { + const normalized = value + ?.trim() + .toLowerCase() + .replace(/[^a-z0-9_.-]+/g, "-") + .replace(/^-+|-+$/g, ""); + return normalized || undefined; +} + +function sanitizeHeaderValue(value: unknown): string { + // HTTP header values must be ByteString (code point <= 255). Values derived + // from user-facing names — model selectors like "小米mimo/...", provider + // names, route reasons — can contain non-ASCII characters that crash Node's + // fetch/undici with "Cannot convert argument to a ByteString" (surfaced as + // 502). Normalize to ASCII while preserving case and printable punctuation. + const text = typeof value === "string" && value.trim() ? value : "unknown"; + const sanitized = text + .replace(/[^\x20-\x7E]+/g, "-") + .replace(/-{2,}/g, "-") + .replace(/^-+|-+$/g, ""); + return sanitized || "unknown"; +} + +function providerCredentialInternalName( + provider: GatewayProviderConfig, + protocol: GatewayProviderProtocol, + credential: ProviderCredentialConfig +): string { + return `${providerCapabilityInternalName(provider, protocol)}::cred:${providerCredentialSlug(providerCredentialRuntimeId(provider, credential))}`; +} + +function parseProviderCredentialInternalName(value: string | undefined): { + credentialSlug: string; + providerId: string; + protocol: GatewayProviderProtocol; +} | undefined { + const marker = "::cred:"; + const markerIndex = value?.lastIndexOf(marker) ?? -1; + if (!value || markerIndex <= 0) { + return undefined; + } + const baseName = value.slice(0, markerIndex); + const credentialSlug = value.slice(markerIndex + marker.length).trim(); + const protocolSeparator = baseName.lastIndexOf("::"); + if (!credentialSlug || protocolSeparator <= 0) { + return undefined; + } + const protocol = normalizeProviderProtocol(baseName.slice(protocolSeparator + 2)); + const providerId = baseName.slice(0, protocolSeparator).trim(); + return protocol && providerId ? { credentialSlug, providerId, protocol } : undefined; +} + +function providerCredentialSlug(value: string | undefined): string { + return (value ?? "") + .trim() + .toLowerCase() + .replace(/[^a-z0-9_.-]+/g, "-") + .replace(/^-+|-+$/g, "") || "key"; +} + +function providerCredentialRuntimeId( + provider: GatewayProviderConfig, + credential: ProviderCredentialConfig, + index = provider.credentials?.indexOf(credential) ?? -1 +): string { + const explicitId = credential.id?.trim(); + if (explicitId) { + return explicitId; + } + const oneBasedIndex = index >= 0 ? index + 1 : 1; + const label = credential.name?.trim() || credential.label?.trim(); + return label ? `${providerCredentialSlug(label)}-${oneBasedIndex}` : `key-${oneBasedIndex}`; +} + +function providerCredentialSortKey(credential: ProviderCredentialConfig): string { + return providerCredentialSlug(credential.id || credential.name || credential.label); +} + +function providerCredentialApiKey(credential: ProviderCredentialConfig): string { + return credential.api_key || credential.apiKey || credential.apikey || ""; +} + +function findProviderCredentialByRuntimeId( + provider: GatewayProviderConfig, + credentialId: string +): ProviderCredentialConfig | undefined { + const normalizedId = credentialId.trim(); + const normalizedSlug = providerCredentialSlug(normalizedId); + return (provider.credentials ?? []).find((credential, index) => { + const runtimeId = providerCredentialRuntimeId(provider, credential, index); + return runtimeId === normalizedId || providerCredentialSlug(runtimeId) === normalizedSlug || credential.id?.trim() === normalizedId; + }); +} + +function findProviderCredentialBySlug( + provider: GatewayProviderConfig, + credentialSlug: string +): ProviderCredentialConfig | undefined { + const normalizedSlug = providerCredentialSlug(credentialSlug); + return (provider.credentials ?? []).find((credential, index) => providerCredentialSlug(providerCredentialRuntimeId(provider, credential, index)) === normalizedSlug); +} + +function normalizeProviderProtocol(value: unknown): GatewayProviderProtocol | undefined { + if (typeof value !== "string") { + return undefined; + } + const normalized = value.trim().toLowerCase(); + if (normalized === "openai" || normalized === "openai_responses") { + return "openai_responses"; + } + if (normalized === "openai_chat" || normalized === "openai_chat_completions") { + return "openai_chat_completions"; + } + if (normalized === "anthropic" || normalized === "anthropic_messages") { + return "anthropic_messages"; + } + if (normalized === "gemini" || normalized === "gemini_generate_content") { + return "gemini_generate_content"; + } + if ( + normalized === "gemini_interactions" || + normalized === "gemini-interactions" || + normalized === "google_interactions" || + normalized === "google-interactions" || + normalized === "interactions" || + normalized === "interaction" + ) { + return "gemini_interactions"; + } + return undefined; +} + +function inferProtocol(provider: GatewayProviderConfig): GatewayProviderProtocol { + const url = readBaseUrl(provider)?.toLowerCase() ?? ""; + const transformerNames = JSON.stringify(provider.transformer ?? "").toLowerCase(); + if (url.includes("/interactions") || transformerNames.includes("gemini_interactions")) { + return "gemini_interactions"; + } + if (url.includes("generativelanguage.googleapis.com") || transformerNames.includes("gemini")) { + return "gemini_generate_content"; + } + if (url.includes("anthropic") || transformerNames.includes("anthropic")) { + return "anthropic_messages"; + } + return "openai_chat_completions"; +} + +function resolveResponseProviderProtocol(headers: Headers, config: AppConfig | undefined): GatewayProviderProtocol | undefined { + const ccrProtocol = normalizeProviderProtocol(headers.get("x-ccr-provider-protocol")); + if (ccrProtocol) { + return ccrProtocol; + } + const providerName = + headers.get("x-gateway-target-provider-name")?.trim() || + headers.get("x-gateway-target-provider")?.trim(); + if (!providerName) { + return undefined; + } + const credentialInternalName = parseProviderCredentialInternalName(providerName); + if (credentialInternalName) { + return credentialInternalName.protocol; + } + const provider = config ? findProviderByPublicOrInternalName(config, providerName) : undefined; + if (!provider) { + return normalizeProviderProtocol(providerName); + } + const capability = normalizedProviderCapabilities(provider).find((item) => + providerCapabilityNameMatches(provider, item.type, providerName) + ); + if (capability) { + return capability.type; + } + return normalizeProviderProtocol(provider.type) ?? normalizeProviderProtocol(provider.provider) ?? inferProtocol(provider); +} + +function resolveProviderLogName(headers: Headers, config: AppConfig | undefined, fallbackModel?: string): string | undefined { + const providerSelector = + headers.get("x-gateway-target-provider-name")?.trim() || + headers.get("x-gateway-target-provider")?.trim(); + const headerProvider = providerSelector && config + ? findProviderByPublicOrInternalName(config, providerSelector) + : undefined; + if (headerProvider) { + return headerProvider.name; + } + + const routeProvider = parseProviderModelSelector(fallbackModel)?.provider; + const modelProvider = routeProvider && config + ? findProviderByPublicOrInternalName(config, routeProvider) + : undefined; + return modelProvider?.name; +} + +function providerMatchesName(provider: GatewayProviderConfig, name: string): boolean { + const normalizedName = name.trim().toLowerCase(); + return [provider.id, provider.name, provider.provider] + .filter((value): value is string => typeof value === "string" && value.trim().length > 0) + .some((value) => value.trim().toLowerCase() === normalizedName); +} + +function normalizeProviderRuntimeBaseUrl(value: string | undefined, type: GatewayProviderProtocol): string | undefined { + if (!value) { + return undefined; + } + return normalizeProviderBaseUrlInput(value, type) || undefined; +} + +function readBaseUrl(provider: GatewayProviderConfig): string | undefined { + return provider.baseurl || provider.baseUrl || provider.api_base_url; +} + +function endpoint(host: string, port: number): string { + const endpointHost = host === "0.0.0.0" ? "127.0.0.1" : host; + return `http://${endpointHost}:${port}`; +} + +function gatewayNetworkEndpoints(host: string, port: number): GatewayNetworkEndpoint[] { + const normalizedHost = normalizeBindHost(host); + const lanAddresses = physicalLanAddresses(); + const addresses = isWildcardBindHost(normalizedHost) + ? lanAddresses + : lanAddresses.filter((entry) => entry.address === normalizedHost); + + return addresses.map((entry) => ({ + address: entry.address, + endpoint: endpoint(entry.address, port), + interfaceName: entry.interfaceName + })); +} + +function physicalLanAddresses(): Array<{ address: string; interfaceName: string }> { + const seen = new Set(); + const result: Array<{ address: string; interfaceName: string }> = []; + + for (const [interfaceName, entries] of Object.entries(networkInterfaces())) { + if (!entries || isVirtualNetworkInterface(interfaceName)) { + continue; + } + + for (const entry of entries) { + if (entry.internal || entry.family !== "IPv4" || !isPrivateIpv4(entry.address)) { + continue; + } + + const key = `${interfaceName}:${entry.address}`; + if (seen.has(key)) { + continue; + } + + seen.add(key); + result.push({ address: entry.address, interfaceName }); + } + } + + return result.sort((left, right) => + left.interfaceName.localeCompare(right.interfaceName) || + left.address.localeCompare(right.address, undefined, { numeric: true }) + ); +} + +function normalizeBindHost(host: string): string { + return host.trim().replace(/^\[|\]$/g, "").toLowerCase(); +} + +function isLoopbackBindHost(host: string): boolean { + const normalized = normalizeBindHost(host).replace(/\.$/, ""); + return normalized === "localhost" || + normalized === "127.0.0.1" || + normalized === "::1" || + normalized === "0:0:0:0:0:0:0:1" || + /^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(normalized); +} + +function isWildcardBindHost(host: string): boolean { + return host === "" || host === "0.0.0.0" || host === "::" || host === "::0"; +} + +function isPrivateIpv4(address: string): boolean { + const parts = address.split(".").map((part) => Number(part)); + if (parts.length !== 4 || parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255)) { + return false; + } + + return parts[0] === 10 || + (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31) || + (parts[0] === 192 && parts[1] === 168); +} + +function isVirtualNetworkInterface(interfaceName: string): boolean { + const normalized = interfaceName.toLowerCase(); + return [ + /^lo\d*$/, + /^awdl\d*$/, + /^llw\d*$/, + /^utun\d*$/, + /^gif\d*$/, + /^stf\d*$/, + /^bridge\d*$/, + /^br-/, + /^docker/, + /^veth/, + /^vmnet/, + /^vbox/, + /^tun\d*$/, + /^tap\d*$/, + /^wg\d*$/, + /\bloopback\b/, + /\bvirtual\b/, + /\bvirtualbox\b/, + /\bvmware\b/, + /\bhyper-v\b/, + /\bvethernet\b/, + /\bwsl\b/, + /\btunnel\b/, + /\btailscale\b/, + /\bzerotier\b/, + /\bwireguard\b/, + /\bhamachi\b/, + /\bparallels\b/, + /\bvpn\b/ + ].some((pattern) => pattern.test(normalized)); +} + +async function stopPreviousManagedCoreGateway(config: AppConfig, coreEndpoint: string): Promise { + const marker = readManagedCoreGatewayMarker(config); + const markerRuntimeId = stringValue(marker?.runtimeId); + const pid = numberValue(marker?.pid); + if (!markerRuntimeId || !pid) { + return; + } + + const health = await readCoreGatewayHealth(coreEndpoint); + if (health?.runtimeId !== markerRuntimeId) { + return; + } + + if (!isProcessAlive(pid)) { + removeManagedCoreGatewayMarker(config); + return; + } + + try { + process.kill(pid, "SIGTERM"); + } catch { + removeManagedCoreGatewayMarker(config); + return; + } + + if (await waitForCoreGatewayStop(coreEndpoint)) { + removeManagedCoreGatewayMarker(config); + return; + } + + try { + process.kill(pid, "SIGKILL"); + } catch { + // Process may have exited between the health check and SIGKILL. + } + await waitForCoreGatewayStop(coreEndpoint); + removeManagedCoreGatewayMarker(config); +} + +function readManagedCoreGatewayMarker(config: AppConfig): ManagedGatewayRuntimeMarker | undefined { + const file = managedCoreGatewayMarkerPath(config); + if (!existsSync(file)) { + return undefined; + } + try { + const parsed = JSON.parse(readFileSync(file, "utf8")) as unknown; + return isRecord(parsed) ? parsed : undefined; + } catch { + return undefined; + } +} + +function writeManagedCoreGatewayMarker(config: AppConfig, child: ChildProcess, runtimeId: string): void { + if (!child.pid) { + return; + } + try { + writeFileSync( + managedCoreGatewayMarkerPath(config), + `${JSON.stringify( + { + generatedConfigFile: config.gateway.generatedConfigFile, + gatewayEntry: resolveGatewayEntry(), + pid: child.pid, + runtimeId, + startedAt: new Date().toISOString() + }, + null, + 2 + )}\n`, + "utf8" + ); + } catch (error) { + console.warn(`[gateway] Failed to write gateway runtime marker: ${formatError(error)}`); + } +} + +function removeManagedCoreGatewayMarker(config: AppConfig | undefined): void { + if (!config) { + return; + } + try { + rmSync(managedCoreGatewayMarkerPath(config), { force: true }); + } catch (error) { + console.warn(`[gateway] Failed to remove gateway runtime marker: ${formatError(error)}`); + } +} + +function managedCoreGatewayMarkerPath(config: AppConfig): string { + return pathJoin(dirname(config.gateway.generatedConfigFile), gatewayRuntimeMarkerFile); +} + +async function waitForCoreGatewayStop(coreEndpoint: string): Promise { + for (let index = 0; index < 20; index += 1) { + if (!(await isCoreGatewayHealthy(coreEndpoint))) { + return true; + } + await delay(100); + } + return false; +} + +function isProcessAlive(pid: number): boolean { + try { + process.kill(pid, 0); + return true; + } catch { + return false; + } +} + +function delay(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +function assertLoopbackCoreHost(host: string): void { + const error = loopbackCoreHostError(host); + if (error) { + throw new Error(error); + } +} + +function loopbackCoreHostError(host: string): string | undefined { + const normalized = host.trim().toLowerCase(); + return normalized === "127.0.0.1" || normalized === "::1" + ? undefined + : "Core gateway host must be 127.0.0.1 or ::1."; +} + +function generateCoreGatewayAuthToken(): string { + return randomBytes(32).toString("base64url"); +} + +async function isCoreGatewayHealthy(coreEndpoint: string): Promise { + const health = await readCoreGatewayHealth(coreEndpoint); + return health?.status === "ok"; +} + +async function readCoreGatewayHealth(coreEndpoint: string): Promise { + if (!coreEndpoint) { + return undefined; + } + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), 500); + try { + const healthUrl = new URL("/health", coreEndpoint); + const response = await fetchWithSystemProxy(healthUrl, { signal: controller.signal }); + if (!response.ok) { + return undefined; + } + const body = await response.json().catch(() => undefined); + if (!isRecord(body)) { + return undefined; + } + return { + runtimeId: stringValue(body.runtimeId), + status: stringValue(body.status) + }; + } catch { + return undefined; + } finally { + clearTimeout(timer); + } +} + +function shouldRunUnifiedServer(config: AppConfig): boolean { + return config.gateway.enabled || config.proxy.enabled; +} + +function shouldRunGatewayRuntime(config: AppConfig): boolean { + return config.gateway.enabled || (config.proxy.enabled && config.proxy.mode === "gateway"); +} + +function shouldServeGatewayRequest(config: AppConfig, request: IncomingMessage): boolean { + if (config.gateway.enabled) { + return true; + } + return config.proxy.enabled && config.proxy.mode === "gateway" && readHeader(request.headers["x-ccr-proxy-mode"]) === "gateway"; +} + +function applyCors(response: ServerResponse, config?: AppConfig): void { + const origin = config ? endpoint(config.gateway.host, config.gateway.port) : "*"; + response.setHeader("Access-Control-Allow-Origin", origin); + response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, X-API-Key, Last-Event-ID, Anthropic-Version, Anthropic-Beta, Mcp-Session-Id, MCP-Protocol-Version"); + response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,PATCH,DELETE,OPTIONS"); + response.setHeader("Access-Control-Expose-Headers", "Mcp-Session-Id"); +} + +async function authorize(request: IncomingMessage, response: ServerResponse, config: AppConfig): Promise { + let apiKeys = await configuredApiKeys(config); + if (apiKeys.length === 0) { + sendJson(response, 403, { + error: { + message: "CCR API key is not initialized. Save a gateway API key or restart CCR to generate one." + } + }); + return { ok: false }; + } + + const token = readAuthToken(request.headers) || readRemoteControlQueryAuthToken(request); + let apiKey = token ? apiKeys.find((item) => item.key === token) : undefined; + if (!apiKey && token) { + apiKeys = await configuredApiKeys(config, { refresh: true }); + apiKey = apiKeys.find((item) => item.key === token); + } + if (apiKey) { + if (isApiKeyExpired(apiKey)) { + sendJson(response, 401, { error: { message: "API key is expired." } }); + return { ok: false }; + } + return { ok: true, apiKey }; + } + + sendJson(response, 401, { error: { message: token ? "Invalid API key." : "API key is missing." } }); + return { ok: false }; +} + +async function configuredApiKeys(config: AppConfig, options: { refresh?: boolean } = {}): Promise { + const persistedApiKeys = await loadPersistedApiKeysCached(options); + const values = [ + ...persistedApiKeys, + ...(Array.isArray(config.APIKEYS) ? config.APIKEYS : []), + ...(config.APIKEY ? [{ createdAt: new Date(0).toISOString(), id: "legacy", key: config.APIKEY }] : []) + ]; + const seen = new Set(); + const result: ApiKeyConfig[] = []; + for (const value of values) { + const key = value?.key?.trim(); + if (!key || seen.has(key)) { + continue; + } + seen.add(key); + result.push({ ...value, key }); + } + return result; +} + +async function loadPersistedApiKeysCached(options: { refresh?: boolean } = {}): Promise { + const now = Date.now(); + if (!options.refresh && persistedApiKeyCache && now - persistedApiKeyCache.loadedAt < persistedApiKeyCacheTtlMs) { + return persistedApiKeyCache.values; + } + try { + const values = await loadPersistedApiKeys(); + persistedApiKeyCache = { + loadedAt: now, + values + }; + return values; + } catch (error) { + console.warn(`[gateway] Failed to load persisted API keys: ${formatError(error)}`); + return []; + } +} + +function isApiKeyExpired(apiKey: ApiKeyConfig): boolean { + if (!apiKey.expiresAt) { + return false; + } + const expiresAt = Date.parse(apiKey.expiresAt); + return Number.isFinite(expiresAt) && expiresAt <= Date.now(); +} + +function reserveApiKeyLimits(apiKey: ApiKeyConfig | undefined, request: IncomingMessage, response: ServerResponse, requestBody: Buffer): boolean { + if (!apiKey?.limits) { + return true; + } + + const usage = estimateApiKeyLimitUsage(request, requestBody); + const rules = apiKeyLimitRules(apiKey, usage); + const now = Date.now(); + const checks = rules.map((rule) => { + const windowStart = Math.floor(now / rule.windowMs) * rule.windowMs; + return { + counterKey: ["api-key", apiKey.id, rule.name, rule.metric, rule.windowMs, windowStart].join("|"), + rule, + windowStart + }; + }); + + for (const check of checks) { + const counter = readApiKeyWindowCounter(check.counterKey, check.windowStart, check.rule.windowMs, now); + if (counter.value + check.rule.requested > check.rule.limit) { + sendJson(response, 429, { + error: { + code: "rate_limit_exceeded", + message: `API key ${check.rule.name} limit exceeded.`, + details: { + limit: check.rule.limit, + limit_name: check.rule.name, + metric: check.rule.metric, + requested: check.rule.requested, + used: counter.value, + window_ms: check.rule.windowMs + } + } + }); + return false; + } + } + + for (const check of checks) { + readApiKeyWindowCounter(check.counterKey, check.windowStart, check.rule.windowMs, now).value += check.rule.requested; + } + return true; +} + +function apiKeyLimitRules(apiKey: ApiKeyConfig, usage: ApiKeyLimitUsage): ApiKeyLimitRule[] { + return limitRules(apiKey.limits, usage); +} + +function limitRules(limits: ApiKeyLimitConfig | undefined, usage: ApiKeyLimitUsage): ApiKeyLimitRule[] { + if (!limits) { + return []; + } + const rules: ApiKeyLimitRule[] = []; + addApiKeyLimitRule(rules, "requests", "requests", limits.windowMs ?? 60_000, limits.maxRequests, 1); + addApiKeyLimitRule(rules, "rpm", "requests", 60_000, limits.rpm, 1); + addApiKeyLimitRule(rules, "rph", "requests", 3_600_000, limits.rph, 1); + addApiKeyLimitRule(rules, "rpd", "requests", 86_400_000, limits.rpd, 1); + addApiKeyLimitRule(rules, "tpm", "tokens", 60_000, limits.tpm, usage.totalTokens); + addApiKeyLimitRule(rules, "tph", "tokens", 3_600_000, limits.tph, usage.totalTokens); + addApiKeyLimitRule(rules, "tpd", "tokens", 86_400_000, limits.tpd, usage.totalTokens); + addApiKeyLimitRule(rules, "ipm", "images", 60_000, limits.ipm, usage.imageCount); + addApiKeyLimitRule(rules, "iph", "images", 3_600_000, limits.iph, usage.imageCount); + addApiKeyLimitRule(rules, "ipd", "images", 86_400_000, limits.ipd, usage.imageCount); + addApiKeyLimitRule(rules, "quota", "tokens", limits.quotaWindowMs ?? 86_400_000, limits.maxTokens, usage.totalTokens); + return rules; +} + +function providerCredentialLimitState( + provider: GatewayProviderConfig, + credential: ProviderCredentialConfig, + usage: ApiKeyLimitUsage +): { blocked: boolean; utilization: number } { + const rules = limitRules(credential.limits, usage); + if (rules.length === 0) { + return { + blocked: false, + utilization: 0 + }; + } + + const now = Date.now(); + let blocked = false; + let utilization = 0; + for (const rule of rules) { + const windowStart = Math.floor(now / rule.windowMs) * rule.windowMs; + const counter = readApiKeyWindowCounter(providerCredentialCounterKey(provider, credential, rule, windowStart), windowStart, rule.windowMs, now); + blocked = blocked || counter.value + rule.requested > rule.limit; + utilization = Math.max(utilization, (counter.value + rule.requested) / rule.limit); + } + + return { + blocked, + utilization + }; +} + +function recordProviderCredentialOutcome( + config: AppConfig, + method: string, + attempt: UpstreamAttempt, + statusCode: number, + responseHeaders: Headers +): void { + if (!attempt.logicalProvider || !attempt.credentialProtocol || !attempt.credentialChain?.length) { + return; + } + + const provider = findProviderByPublicOrInternalName(config, attempt.logicalProvider); + if (!provider) { + return; + } + + const responseCredentialId = responseHeaders.get("x-ccr-provider-credential-id")?.trim(); + const responseCredential = responseCredentialId + ? findProviderCredentialByRuntimeId(provider, responseCredentialId) + : undefined; + const fallbackCredential = providerCredentialFromInternalName(provider, attempt.credentialChain[0]); + const credential = responseCredential ?? fallbackCredential; + if (!credential) { + return; + } + + if (statusCode >= 200 && statusCode < 500 && statusCode !== 401 && statusCode !== 403 && statusCode !== 429) { + incrementProviderCredentialCounters(provider, credential, estimateLimitUsage(method, attempt.body ?? Buffer.alloc(0))); + clearProviderCredentialCooldown(provider, credential); + return; + } + + if (statusCode === 401 || statusCode === 403 || statusCode === 429 || statusCode >= 500) { + setProviderCredentialCooldown(provider, credential, providerCredentialCooldownMs, `HTTP ${statusCode}`); + } +} + +function providerCredentialFromInternalName( + provider: GatewayProviderConfig, + internalName: string | undefined +): ProviderCredentialConfig | undefined { + const parsed = parseProviderCredentialInternalName(internalName); + return parsed ? findProviderCredentialBySlug(provider, parsed.credentialSlug) : undefined; +} + +function incrementProviderCredentialCounters( + provider: GatewayProviderConfig, + credential: ProviderCredentialConfig, + usage: ApiKeyLimitUsage +): void { + const rules = limitRules(credential.limits, usage); + const now = Date.now(); + for (const rule of rules) { + const windowStart = Math.floor(now / rule.windowMs) * rule.windowMs; + readApiKeyWindowCounter(providerCredentialCounterKey(provider, credential, rule, windowStart), windowStart, rule.windowMs, now).value += rule.requested; + } +} + +function providerCredentialCounterKey( + provider: GatewayProviderConfig, + credential: ProviderCredentialConfig, + rule: ApiKeyLimitRule, + windowStart: number +): string { + return ["provider-credential", provider.name, providerCredentialRuntimeId(provider, credential), rule.name, rule.metric, rule.windowMs, windowStart].join("|"); +} + +function readProviderCredentialCooldown(provider: GatewayProviderConfig, credential: ProviderCredentialConfig): { reason: string; until: number } | undefined { + const key = providerCredentialStateKey(provider, credential); + const cooldown = providerCredentialCooldowns.get(key); + if (!cooldown) { + return undefined; + } + if (cooldown.until > Date.now()) { + return cooldown; + } + providerCredentialCooldowns.delete(key); + return undefined; +} + +function setProviderCredentialCooldown(provider: GatewayProviderConfig, credential: ProviderCredentialConfig, cooldownMs: number, reason: string): void { + providerCredentialCooldowns.set(providerCredentialStateKey(provider, credential), { + reason, + until: Date.now() + cooldownMs + }); +} + +function clearProviderCredentialCooldown(provider: GatewayProviderConfig, credential: ProviderCredentialConfig): void { + providerCredentialCooldowns.delete(providerCredentialStateKey(provider, credential)); +} + +function providerCredentialStateKey(provider: GatewayProviderConfig, credential: ProviderCredentialConfig): string { + return `${provider.name}::${providerCredentialRuntimeId(provider, credential)}`; +} + +function addApiKeyLimitRule( + rules: ApiKeyLimitRule[], + name: string, + metric: ApiKeyLimitRule["metric"], + windowMs: number, + limit: number | undefined, + requested: number +): void { + if (!limit || limit <= 0 || windowMs <= 0) { + return; + } + rules.push({ + limit, + metric, + name, + requested, + windowMs + }); +} + +function readApiKeyWindowCounter(key: string, windowStart: number, windowMs: number, now = Date.now()): ApiKeyWindowCounter { + pruneExpiredApiKeyLimitCounters(now); + const existing = apiKeyLimitCounters.get(key); + if (existing && existing.windowStart === windowStart) { + return existing; + } + const fresh = { + expiresAt: windowStart + windowMs * apiKeyLimitCounterRetentionWindows, + value: 0, + windowStart + }; + apiKeyLimitCounters.set(key, fresh); + return fresh; +} + +function pruneExpiredApiKeyLimitCounters(now: number): void { + for (const [key, counter] of apiKeyLimitCounters) { + if (counter.expiresAt <= now) { + apiKeyLimitCounters.delete(key); + } + } +} + +function estimateApiKeyLimitUsage(request: IncomingMessage, requestBody: Buffer): ApiKeyLimitUsage { + return estimateLimitUsage(request.method ?? "GET", requestBody); +} + +function estimateLimitUsage(method: string, requestBody: Buffer): ApiKeyLimitUsage { + if (method.toUpperCase() !== "POST" || requestBody.byteLength === 0) { + return { + imageCount: 0, + totalTokens: 0 + }; + } + + const body = parseJsonObject(requestBody); + const inputCharacters = countUnknownCharacters(body.messages) + countUnknownCharacters(body.system) + countUnknownCharacters(body.tools); + const inputTokens = Math.ceil(inputCharacters / 4); + const outputTokens = readPositiveNumber(body.max_tokens) ?? readPositiveNumber(body.max_output_tokens) ?? 1024; + return { + imageCount: countImageInputs(body), + totalTokens: Math.max(1, inputTokens + outputTokens) + }; +} + +function countUnknownCharacters(value: unknown): number { + if (value === undefined || value === null) { + return 0; + } + if (typeof value === "string") { + return value.length; + } + try { + return JSON.stringify(value)?.length || 0; + } catch { + return String(value).length; + } +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function stringValue(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function rawStringValue(value: unknown): string | undefined { + return typeof value === "string" ? value : undefined; +} + +function stringListValue(value: unknown): string[] { + return Array.isArray(value) ? value.map((item) => stringValue(item)).filter((item): item is string => Boolean(item)) : []; +} + +function numberValue(value: unknown): number | undefined { + const number = Number(value); + return Number.isFinite(number) ? Math.trunc(number) : undefined; +} + +function countImageInputs(value: unknown): number { + if (Array.isArray(value)) { + return value.reduce((sum, item) => sum + countImageInputs(item), 0); + } + if (!isRecord(value)) { + return 0; + } + const type = typeof value.type === "string" ? value.type.toLowerCase() : ""; + const isImage = type === "image" || type === "image_url" || type === "input_image" || value.image_url !== undefined || value.input_image !== undefined; + return (isImage ? 1 : 0) + Object.values(value).reduce((sum, item) => sum + countImageInputs(item), 0); +} + +function readPositiveNumber(value: unknown): number | undefined { + const number = Number(value); + return Number.isFinite(number) && number > 0 ? Math.ceil(number) : undefined; +} + +function shouldServeGatewayModelsResponse(method: string, path: string): boolean { + return (method || "GET").toUpperCase() === "GET" && + normalizeGatewayPathname(path) === "/v1/models"; +} + +function prepareClaudeCodeDiscoveredModelRequest( + config: AppConfig, + headers: IncomingHttpHeaders, + method: string, + path: string, + body: Buffer | undefined +): { body: Buffer; diagnostic: string } | undefined { + if ( + (method || "GET").toUpperCase() !== "POST" || + normalizeGatewayPathname(path) !== "/v1/messages" || + !isClaudeCodeUserAgent(headers) + ) { + return undefined; + } + + const parsedBody = parseJsonObjectSafe(body); + const model = stringValue(parsedBody?.model); + const rewrittenModel = resolveClaudeCodeDiscoveredModelId(model, config); + if (!parsedBody || !rewrittenModel || rewrittenModel === model) { + return undefined; + } + + return { + body: serializeJsonBodyWithModel(parsedBody, rewrittenModel), + diagnostic: `${model}->${rewrittenModel}` + }; +} + +function prepareClaudeAppFallbackModelRequest( + config: AppConfig, + method: string, + path: string, + body: Buffer | undefined +): { body: Buffer; diagnostic: string; routedModel: string } | undefined { + if ( + (method || "GET").toUpperCase() !== "POST" || + normalizeGatewayPathname(path) !== "/v1/messages" + ) { + return undefined; + } + + const parsedBody = parseJsonObjectSafe(body); + const model = stringValue(parsedBody?.model); + const normalizedModel = normalizeRouteSelector(model); + if (!parsedBody || !normalizedModel) { + return undefined; + } + + const routeModel = resolveClaudeAppGatewayRouteModel(normalizedModel, config, claudeAppGatewayModelRouteOptions); + const routedModel = routeModel ?? + (normalizedModel.toLowerCase() === CLAUDE_APP_FALLBACK_MODEL ? inferClaudeAppGatewayTargetModel(config) : undefined); + if (!routedModel || routedModel.toLowerCase() === normalizedModel.toLowerCase()) { + return undefined; + } + if (isConfiguredGatewayModelSelector(normalizedModel, config) && !routeModel) { + return undefined; + } + + return { + body: serializeJsonBodyWithModel(parsedBody, routedModel), + diagnostic: `${model}->${routedModel}`, + routedModel + }; +} + +function createGatewayModelsResponse(config: AppConfig, headers: IncomingHttpHeaders, apiKey?: ApiKeyConfig): Record { + if (isClaudeAppApiKey(apiKey) || isClaudeCodeUserAgent(headers)) { + return createClaudeAppGatewayModelsResponse(config); + } + return createOpenAICompatibleGatewayModelsResponse(config); +} + +function createOpenAICompatibleGatewayModelsResponse(config: AppConfig): Record { + const data = buildGatewayDiscoverableModelIds(config).map((id) => { + const catalogEntry = findModelCatalogEntry(id); + return { + id, + object: "model", + created: 0, + owned_by: gatewayModelOwner(id), + type: "model", + ...(catalogEntry?.displayName ? { display_name: catalogEntry.displayName } : {}) + }; + }); + + return { + object: "list", + data + }; +} + +function createClaudeAppGatewayModelsResponse(config: AppConfig): Record { + const routes = buildClaudeAppGatewayModelRoutes(config, claudeAppGatewayModelRouteOptions); + const data = routes.map((route) => { + const catalogId = stripClaudeCodeOneMillionContextSuffix(route.targetModel); + const catalogEntry = findModelCatalogEntry(catalogId); + const maxInputTokens = claudeGatewayModelContextWindow(catalogEntry, route.oneMillionContext); + const maxOutputTokens = modelCatalogMaxOutputTokens(catalogEntry); + return { + id: route.id, + capabilities: createClaudeCodeModelCapabilities(catalogEntry, { + maxInputTokens, + oneMillionContext: route.oneMillionContext + }), + created_at: "1970-01-01T00:00:00Z", + display_name: route.displayName, + max_input_tokens: maxInputTokens, + max_tokens: maxOutputTokens, + type: "model" + }; + }); + + return { + data, + first_id: data[0]?.id ?? null, + has_more: false, + last_id: data[data.length - 1]?.id ?? null + }; +} + +function createClaudeCodeModelsResponse(config: AppConfig): Record { + const models = buildClaudeCodeDiscoverableModels(config); + const data = models.map((model) => { + const claudeId = claudeCodeDiscoveryModelId(model.id); + const catalogId = stripClaudeCodeOneMillionContextSuffix(model.id); + const catalogEntry = findModelCatalogEntry(catalogId); + const maxInputTokens = claudeGatewayModelContextWindow(catalogEntry, model.oneMillionContext); + const maxOutputTokens = modelCatalogMaxOutputTokens(catalogEntry); + return { + id: claudeId, + capabilities: createClaudeCodeModelCapabilities(catalogEntry, { + maxInputTokens, + oneMillionContext: model.oneMillionContext + }), + created_at: "1970-01-01T00:00:00Z", + display_name: formatClaudeCodeModelDisplayName(claudeId, catalogEntry, model.oneMillionContext), + max_input_tokens: maxInputTokens, + max_tokens: maxOutputTokens, + type: "model" + }; + }); + + return { + data, + first_id: data[0]?.id ?? null, + has_more: false, + last_id: data[data.length - 1]?.id ?? null + }; +} + +function claudeGatewayModelContextWindow(entry: ModelCatalogEntry | undefined, oneMillionContext: boolean): number { + const contextWindow = modelCatalogMaxInputTokens(entry); + if (contextWindow > 0) { + return contextWindow; + } + return oneMillionContext ? 1_000_000 : 0; +} + +function buildClaudeCodeDiscoverableModelIds(config: AppConfig): string[] { + return buildGatewayDiscoverableModelIds(config); +} + +function buildGatewayDiscoverableModelIds(config: AppConfig): string[] { + const baseEntries: Array<{ modelName: string; providerName: string }> = []; + for (const provider of config.Providers) { + const providerName = provider.name?.trim(); + if (!providerName || !Array.isArray(provider.models)) { + continue; + } + for (const rawModel of provider.models) { + const modelName = rawModel.trim(); + if (!modelName) { + continue; + } + baseEntries.push({ modelName, providerName }); + } + } + + const ids = baseEntries.map((entry) => `${entry.providerName}/${entry.modelName}`); + for (const profile of config.virtualModelProfiles ?? []) { + if (!isVisibleVirtualModelProfile(profile)) { + continue; + } + + for (const entry of baseEntries) { + for (const prefix of profile.match?.prefixes ?? []) { + const normalizedPrefix = prefix.trim(); + if (normalizedPrefix) { + ids.push(`${entry.providerName}/${normalizedPrefix}${entry.modelName}`); + } + } + for (const suffix of profile.match?.suffixes ?? []) { + const normalizedSuffix = suffix.trim(); + if (normalizedSuffix) { + ids.push(`${entry.providerName}/${entry.modelName}${normalizedSuffix}`); + } + } + } + + for (const alias of profile.match?.exactAliases ?? []) { + const normalizedAlias = alias.trim(); + if (!normalizedAlias) { + continue; + } + ids.push(fusionModelSelector(normalizedAlias)); + } + } + + return uniqueStrings(ids); +} + +function gatewayModelOwner(id: string): string { + const separator = id.indexOf("/"); + return separator > 0 ? id.slice(0, separator).trim() || "ccr" : "ccr"; +} + +function buildClaudeCodeDiscoverableModels(config: AppConfig): ClaudeCodeDiscoverableModel[] { + const seen = new Set(); + const models: ClaudeCodeDiscoverableModel[] = []; + + const pushModel = (id: string, oneMillionContext: boolean) => { + const normalized = id.trim(); + if (!normalized) { + return; + } + const key = normalized.toLowerCase(); + if (seen.has(key)) { + return; + } + seen.add(key); + models.push({ id: normalized, oneMillionContext }); + }; + + for (const id of buildClaudeCodeDiscoverableModelIds(config)) { + pushModel(id, hasClaudeCodeOneMillionContextSuffix(id)); + const baseId = stripClaudeCodeOneMillionContextSuffix(id); + if (!hasClaudeCodeOneMillionContextSuffix(id) && findModelCatalogEntry(baseId)?.limits?.supports1MContext) { + pushModel(claudeCodeOneMillionContextModelId(baseId), true); + } + } + + return models; +} + +function isVisibleVirtualModelProfile(profile: NonNullable[number]): boolean { + return profile.enabled !== false && + profile.materialization?.enabled !== false && + profile.materialization?.includeInGatewayModels !== false; +} + +function resolveClaudeCodeDiscoveredModelId(model: string | undefined, config: AppConfig): string | undefined { + const normalized = normalizeRouteSelector(model); + if (!normalized || !normalized.toLowerCase().startsWith("claude-")) { + return undefined; + } + + if (isConfiguredGatewayModelSelector(normalized, config)) { + return undefined; + } + + const unprefixed = normalized.slice("claude-".length); + if (isConfiguredGatewayModelSelector(unprefixed, config)) { + return unprefixed; + } + + const withoutOneMillionContextSuffix = stripClaudeCodeOneMillionContextSuffix(unprefixed); + return withoutOneMillionContextSuffix !== unprefixed && + isConfiguredGatewayModelSelector(withoutOneMillionContextSuffix, config) + ? withoutOneMillionContextSuffix + : undefined; +} + +function resolveGatewayPublicModelId(model: string | undefined, config: AppConfig): string | undefined { + const normalized = normalizeRouteSelector(model); + if (!normalized || !normalized.toLowerCase().startsWith("claude-")) { + return undefined; + } + if (isConfiguredGatewayModelSelector(normalized, config)) { + return undefined; + } + return resolveClaudeCodeDiscoveredModelId(normalized, config) ?? + resolveClaudeAppGatewayRouteModel(normalized, config, claudeAppGatewayModelRouteOptions); +} + +function isConfiguredGatewayModelSelector(model: string, config: AppConfig): boolean { + const normalized = normalizeRouteSelector(model)?.toLowerCase(); + if (!normalized) { + return false; + } + + for (const id of buildClaudeCodeDiscoverableModelIds(config)) { + if (id.toLowerCase() === normalized) { + return true; + } + } + + for (const provider of config.Providers) { + if (provider.models.some((candidate) => candidate.trim().toLowerCase() === normalized)) { + return true; + } + } + + return false; +} + +function claudeCodeDiscoveryModelId(value: string): string { + return value.toLowerCase().startsWith("claude-") ? value : `claude-${value}`; +} + +function claudeCodeOneMillionContextModelId(id: string): string { + return hasClaudeCodeOneMillionContextSuffix(id) ? id : `${id}${claudeCodeOneMillionContextSuffix}`; +} + +function hasClaudeCodeOneMillionContextSuffix(id: string): boolean { + return id.trim().toLowerCase().endsWith(claudeCodeOneMillionContextSuffix); +} + +function stripClaudeCodeOneMillionContextSuffix(id: string): string { + return id.trim().replace(/\[1m\]$/i, "").trim(); +} + +function formatClaudeCodeModelDisplayName( + id: string, + entry?: ModelCatalogEntry, + oneMillionContext = hasClaudeCodeOneMillionContextSuffix(id) +): string { + if (entry?.displayName) { + return oneMillionContext ? `${entry.displayName} (1M context)` : entry.displayName; + } + + const normalized = stripClaudeCodeOneMillionContextSuffix(id.replace(/^claude-/i, "")); + const model = normalized.includes("/") ? normalized.slice(normalized.lastIndexOf("/") + 1) : normalized; + const words = model + .split(/[-_]+/) + .map((part) => part.trim()) + .filter(Boolean) + .map((part) => (/^\d+$/.test(part) ? part : part.slice(0, 1).toUpperCase() + part.slice(1))); + const displayName = ["Claude", ...words].filter(Boolean).join(" "); + return oneMillionContext ? `${displayName} (1M context)` : displayName; +} + +function createClaudeCodeModelCapabilities( + entry?: ModelCatalogEntry, + options: { maxInputTokens?: number; oneMillionContext?: boolean } = {} +): Record { + if (!entry) { + return createDefaultClaudeCodeModelCapabilities(); + } + + const capabilities = entry.capabilities ?? {}; + const inputModalities = new Set((entry.modalities?.input ?? []).map((item) => item.toLowerCase())); + const outputModalities = new Set((entry.modalities?.output ?? []).map((item) => item.toLowerCase())); + const supportsReasoning = readCatalogCapability(capabilities, "reasoning"); + const supportsImageInput = readCatalogCapability(capabilities, "imageInput") || inputModalities.has("image"); + const supportsPdfInput = readCatalogCapability(capabilities, "pdfInput") || inputModalities.has("pdf"); + const supportsStructuredOutput = + readCatalogCapability(capabilities, "structuredOutput") || + readCatalogCapability(capabilities, "nativeStructuredOutput") || + readCatalogCapability(capabilities, "responseSchema"); + const supportsCodeExecution = readCatalogCapability(capabilities, "codeExecution"); + const supportsAdaptiveThinking = readCatalogCapability(capabilities, "adaptiveThinking"); + const supportsToolUse = + readCatalogCapability(capabilities, "toolCalling") || + readCatalogCapability(capabilities, "functionCalling"); + const supportsBatch = readCatalogCapability(capabilities, "batch"); + const supportsCitations = readCatalogCapability(capabilities, "citations"); + const supportsAudioInput = readCatalogCapability(capabilities, "audioInput") || inputModalities.has("audio"); + const supportsAudioOutput = readCatalogCapability(capabilities, "audioOutput") || outputModalities.has("audio"); + const supportsVideoInput = readCatalogCapability(capabilities, "videoInput") || inputModalities.has("video"); + const maxInputTokens = options.maxInputTokens ?? modelCatalogMaxInputTokens(entry); + const supportsOneMillionContext = Boolean(entry.limits?.supports1MContext); + + return { + audio_input: { supported: supportsAudioInput }, + audio_output: { supported: supportsAudioOutput }, + batch: { supported: supportsBatch }, + citations: { supported: supportsCitations }, + code_execution: { supported: supportsCodeExecution }, + context_management: { + clear_thinking_20251015: { supported: supportsReasoning }, + clear_tool_uses_20250919: { supported: supportsToolUse }, + compact_20260112: { supported: maxInputTokens > 0 }, + max_input_tokens: maxInputTokens, + supported: maxInputTokens > 0 + }, + context_window: { + max_input_tokens: maxInputTokens, + supported: maxInputTokens > 0, + supports_1m_context: supportsOneMillionContext, + one_million_context_variant: options.oneMillionContext === true + }, + effort: { + high: { supported: supportsReasoning }, + low: { supported: supportsReasoning }, + max: { supported: supportsReasoning }, + medium: { supported: supportsReasoning }, + supported: supportsReasoning, + xhigh: { supported: supportsReasoning } + }, + image_input: { supported: supportsImageInput }, + pdf_input: { supported: supportsPdfInput }, + structured_outputs: { supported: supportsStructuredOutput }, + thinking: { + supported: supportsReasoning, + types: { + adaptive: { supported: supportsAdaptiveThinking }, + enabled: { supported: supportsReasoning } + } + }, + tool_use: { supported: supportsToolUse }, + video_input: { supported: supportsVideoInput } + }; +} + +function createDefaultClaudeCodeModelCapabilities(): Record { + return { + batch: { supported: true }, + citations: { supported: true }, + code_execution: { supported: true }, + context_management: { + clear_thinking_20251015: { supported: true }, + clear_tool_uses_20250919: { supported: true }, + compact_20260112: { supported: true }, + supported: true + }, + effort: { + high: { supported: true }, + low: { supported: true }, + max: { supported: true }, + medium: { supported: true }, + supported: true, + xhigh: { supported: true } + }, + image_input: { supported: true }, + pdf_input: { supported: true }, + structured_outputs: { supported: true }, + thinking: { + supported: true, + types: { + adaptive: { supported: true }, + enabled: { supported: true } + } + } + }; +} + +function normalizeGatewayPathname(path: string): string { + const normalized = path.trim().replace(/\/+$/, ""); + return normalized || "/"; +} + +function isClaudeCodeUserAgent(headers: IncomingHttpHeaders): boolean { + const userAgent = readHeader(headers["user-agent"]); + if (!userAgent) { + return false; + } + const normalized = userAgent.toLowerCase(); + return normalized.includes("claude"); +} + +function isClaudeAppApiKey(apiKey: ApiKeyConfig | undefined): boolean { + const name = apiKey?.name?.trim().toLowerCase(); + return name === "claude app"; +} + +function prepareCursorOpenAICompatChatBody( + config: AppConfig, + client: string | undefined, + method: string, + path: string, + requestBody: Buffer +): CursorOpenAICompatPreparation | undefined { + if ((method || "GET").toUpperCase() !== "POST" || !isOpenAICompatChatCompletionsPath(path) || client !== "Cursor") { + return undefined; + } + + let body: Record; + try { + body = parseJsonObject(requestBody); + } catch { + return undefined; + } + if (!isSimplifiedCursorOpenAICompatChat(body)) { + return undefined; + } + + const context = readCursorOpenAICompatContext(config); + let changed = false; + if (context.systemPrompt) { + body.messages = [ + { content: context.systemPrompt, role: "system" }, + ...(Array.isArray(body.messages) ? body.messages : []) + ]; + changed = true; + } + if (context.tools.length > 0) { + body.tools = context.tools; + changed = true; + } + if (context.toolChoice !== undefined && context.tools.length > 0) { + body.tool_choice = context.toolChoice; + changed = true; + } + + if (!changed) { + if (!warnedMissingCursorOpenAICompatContext) { + warnedMissingCursorOpenAICompatContext = true; + console.warn( + "[gateway] Cursor sent an OpenAI-compatible chat request with only user messages and no system/tools. " + + "Configure plugins[].id=\"cursor-proxy\" config.systemPrompt/config.tools to inject fallback context, " + + "or route Cursor native Agent traffic through the proxy." + ); + } + return { diagnostic: "simplified-missing-context" }; + } + + return { + body: Buffer.from(`${JSON.stringify(body)}\n`, "utf8"), + diagnostic: "fallback-injected" + }; +} + +function isOpenAICompatChatCompletionsPath(path: string): boolean { + return path === "/chat/completions" || + path === "/v1/chat/completions" || + path.endsWith("/chat/completions"); +} + +function isSimplifiedCursorOpenAICompatChat(body: Record): boolean { + if (body.system !== undefined || body.systemPrompt !== undefined || body.instructions !== undefined) { + return false; + } + if (Array.isArray(body.tools) && body.tools.length > 0) { + return false; + } + if (!Array.isArray(body.messages) || body.messages.length === 0) { + return false; + } + return body.messages.every((message) => + isRecord(message) && + stringValue(message.role)?.toLowerCase() === "user" + ); +} + +function readCursorOpenAICompatContext(config: AppConfig): CursorOpenAICompatContext { + const plugin = config.plugins.find((item) => item.enabled !== false && item.id === "cursor-proxy"); + const pluginConfig = isRecord(plugin?.config) ? plugin.config : {}; + return { + systemPrompt: + stringValue(pluginConfig.systemPrompt) || + stringValue(pluginConfig.openaiSystemPrompt) || + stringValue(pluginConfig.defaultSystemPrompt), + toolChoice: normalizeCursorToolChoice( + pluginConfig.toolChoice ?? pluginConfig.openaiToolChoice ?? pluginConfig.defaultToolChoice + ), + tools: normalizeCursorTools(pluginConfig.tools ?? pluginConfig.openaiTools ?? pluginConfig.defaultTools) + }; +} + +function normalizeCursorTools(value: unknown): unknown[] { + if (Array.isArray(value)) { + return value.map(normalizeCursorTool).filter((tool): tool is Record => Boolean(tool)); + } + if (isRecord(value)) { + if (Array.isArray(value.tools) || isRecord(value.tools)) { + return normalizeCursorTools(value.tools); + } + return Object.entries(value) + .map(([name, item]) => normalizeCursorTool(isRecord(item) ? { ...item, name: stringValue(item.name) || name } : { description: stringValue(item), name })) + .filter((tool): tool is Record => Boolean(tool)); + } + return []; +} + +function normalizeCursorTool(value: unknown): Record | undefined { + if (!isRecord(value)) { + return undefined; + } + const type = stringValue(value.type); + if (type && type.toLowerCase().startsWith("web_search")) { + return { ...value, type }; + } + + const fn = isRecord(value.function) ? value.function : value; + const name = + stringValue(fn.name) || + stringValue(value.name) || + stringValue(value.toolName) || + stringValue(value.functionName); + if (!name) { + return undefined; + } + return { + function: compactRecord({ + description: stringValue(fn.description) || stringValue(value.description), + name, + parameters: normalizeCursorToolParameters( + fn.parameters ?? + value.parameters ?? + fn.input_schema ?? + value.input_schema ?? + fn.inputSchema ?? + value.inputSchema ?? + fn.schema ?? + value.schema + ) + }), + type: "function" + }; +} + +function normalizeCursorToolParameters(value: unknown): Record { + if (isRecord(value)) { + return value; + } + if (typeof value === "string") { + try { + const parsed = JSON.parse(value) as unknown; + if (isRecord(parsed)) { + return parsed; + } + } catch { + // Fall through to an empty object schema. + } + } + return { properties: {}, type: "object" }; +} + +function normalizeCursorToolChoice(value: unknown): unknown { + if (typeof value === "string" && value.trim()) { + const normalized = value.trim().toLowerCase(); + if (normalized === "auto" || normalized === "none" || normalized === "required") { + return normalized; + } + return { function: { name: value.trim() }, type: "function" }; + } + if (!isRecord(value)) { + return undefined; + } + const type = stringValue(value.type); + if (type && ["auto", "none", "required"].includes(type.toLowerCase())) { + return type.toLowerCase(); + } + const fn = isRecord(value.function) ? value.function : value; + const name = stringValue(fn.name) || stringValue(value.name) || stringValue(value.toolName); + return name ? { function: { name }, type: "function" } : undefined; +} + +function compactRecord(value: Record): Record { + return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined)); +} + +function inferGatewayClient(apiKey: ApiKeyConfig | undefined, headers: IncomingHttpHeaders): string | undefined { + const explicit = + readHeader(headers["x-ccr-client"]) ?? + readHeader(headers["x-client-name"]) ?? + readHeader(headers["x-forwarded-client-cert"]); + if (explicit) { + return explicit; + } + + const apiKeyClient = apiKey?.name?.trim() || apiKey?.id?.trim(); + const userAgentClient = inferClientFromUserAgent(headers); + if (readHeader(headers["x-ccr-proxy-mode"]) === "gateway") { + return userAgentClient ?? apiKeyClient; + } + return apiKeyClient ?? userAgentClient; +} + +function inferClientFromUserAgent(headers: IncomingHttpHeaders): string | undefined { + const userAgent = readHeader(headers["user-agent"]); + if (!userAgent) { + return undefined; + } + + const normalized = userAgent.toLowerCase(); + if (normalized.includes("codex")) { + return "Codex"; + } + if (normalized.includes("@anthropic-ai/claude-code") || normalized.includes("claude-code") || normalized.includes("claude code")) { + return "Claude Code"; + } + if (normalized.includes("claude")) { + return "Claude"; + } + if (normalized.includes("curl")) { + return "curl"; + } + if (normalized.includes("python")) { + return "Python"; + } + if (normalized.includes("node")) { + return "Node.js"; + } + if (normalized.includes("chrome")) { + return "Google Chrome"; + } + if (normalized.includes("safari") && !normalized.includes("chrome")) { + return "Safari"; + } + return userAgent.split(/[ /]/)[0]?.trim() || undefined; +} + +function readAuthToken(headers: IncomingHttpHeaders): string | undefined { + const raw = readHeader(headers.authorization) || readHeader(headers["x-api-key"]); + if (!raw) { + return undefined; + } + return raw.toLowerCase().startsWith("bearer ") ? raw.slice(7).trim() : raw; +} + +function readRemoteControlQueryAuthToken(request: IncomingMessage): string | undefined { + const url = new URL(request.url || "/", "http://127.0.0.1"); + if (url.pathname !== ccrRemoteControlPathPrefix && !url.pathname.startsWith(`${ccrRemoteControlPathPrefix}/`)) { + return undefined; + } + return url.searchParams.get("api_key")?.trim() || url.searchParams.get("key")?.trim() || undefined; +} + +function forwardHeaders(headers: IncomingHttpHeaders): Record { + const forwarded: Record = {}; + for (const [key, value] of Object.entries(headers)) { + const normalized = key.toLowerCase(); + if (proxyHeaderDenyList.has(normalized) || value === undefined) { + continue; + } + forwarded[normalized] = Array.isArray(value) ? value.join(",") : String(value); + } + return forwarded; +} + +function stripLocalGatewayAuthHeaders(headers: Record): void { + delete headers.authorization; + delete headers["x-api-key"]; + delete headers["api-key"]; +} + +function omitLocalObservabilityHeaders(headers: Record): Record { + const forwarded = { ...headers }; + for (const name of localObservabilityHeaderNames) { + delete forwarded[name]; + } + return forwarded; +} + +function withCoreGatewayAuthHeader(headers: Record, token: string): Record { + if (!token) { + throw new Error("Core gateway auth token is not initialized."); + } + return { + ...headers, + [coreGatewayAuthHeader]: token + }; +} + +function filteredResponseHeaders(headers: Headers): Array<[string, string]> { + const entries: Array<[string, string]> = []; + headers.forEach((value, key) => { + if (!responseHeaderDenyList.has(key.toLowerCase())) { + entries.push([key, value]); + } + }); + return entries; +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + +function abortSignalMessage(signal: AbortSignal): string { + const reason = signal.reason as unknown; + if (reason instanceof Error && reason.message) { + return reason.message; + } + if (typeof reason === "string" && reason.trim()) { + return reason.trim(); + } + return "Upstream request was aborted."; +} + +function parseJsonObject(buffer: Buffer): Record { + if (buffer.length === 0) { + return {}; + } + const parsed = JSON.parse(buffer.toString("utf8")) as unknown; + if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) { + return parsed as Record; + } + throw new Error("Request body must be a JSON object."); +} + +function readHeader(value: string | string[] | undefined): string | undefined { + if (Array.isArray(value)) { + return value[0]?.trim(); + } + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function readRequestBody(request: IncomingMessage): Promise { + return new Promise((resolve, reject) => { + const chunks: Buffer[] = []; + request.on("data", (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))); + request.on("end", () => resolve(Buffer.concat(chunks))); + request.on("error", reject); + }); +} + +function sendJson(response: ServerResponse, statusCode: number, payload: unknown): void { + response.writeHead(statusCode, { "content-type": "application/json" }); + response.end(`${JSON.stringify(payload)}\n`); +} + +function closeServer(server: Server): Promise { + return new Promise((resolve) => { + let settled = false; + let timeout: NodeJS.Timeout | undefined; + const finish = () => { + if (settled) { + return; + } + settled = true; + if (timeout) { + clearTimeout(timeout); + } + resolve(); + }; + + try { + server.closeIdleConnections?.(); + timeout = setTimeout(() => { + server.closeAllConnections?.(); + finish(); + }, 800); + server.close(() => finish()); + } catch { + finish(); + } + }); +} + +function shouldSendBody(method: string | undefined): boolean { + const normalized = method?.toUpperCase(); + return normalized !== "GET" && normalized !== "HEAD"; +} + +function shouldCaptureGatewayUsage(method: string, _path: string): boolean { + return shouldSendBody(method); +} diff --git a/packages/core/src/mcp/browser-web-search-proxy-mcp.ts b/packages/core/src/mcp/browser-web-search-proxy-mcp.ts new file mode 100644 index 0000000..d034adf --- /dev/null +++ b/packages/core/src/mcp/browser-web-search-proxy-mcp.ts @@ -0,0 +1,146 @@ +const targetUrl = process.env.BROWSER_WEB_SEARCH_MCP_URL?.trim(); +const requestTimeoutMs = clampInteger(Number(process.env.BROWSER_WEB_SEARCH_PROXY_TIMEOUT_MS), 1_000, 600_000, 120_000); + +let stdinBuffer = Buffer.alloc(0); + +if (!targetUrl) { + process.stderr.write("BROWSER_WEB_SEARCH_MCP_URL is required.\n"); + process.exit(1); +} + +process.stdin.on("data", (chunk: Buffer | string) => { + stdinBuffer = Buffer.concat([stdinBuffer, typeof chunk === "string" ? Buffer.from(chunk) : chunk]); + void drainFrames(); +}); + +process.stdin.on("end", () => { + process.exit(0); +}); + +async function drainFrames(): Promise { + while (true) { + const headerEnd = stdinBuffer.indexOf("\r\n\r\n"); + if (headerEnd < 0) { + return; + } + + const headerText = stdinBuffer.slice(0, headerEnd).toString("utf8"); + const contentLength = readContentLength(headerText); + if (contentLength === undefined || contentLength < 0) { + stdinBuffer = Buffer.alloc(0); + writeFrame(jsonRpcError(null, -32600, "Invalid MCP frame header.")); + return; + } + + const payloadStart = headerEnd + 4; + const payloadEnd = payloadStart + contentLength; + if (stdinBuffer.length < payloadEnd) { + return; + } + + const body = stdinBuffer.slice(payloadStart, payloadEnd).toString("utf8"); + stdinBuffer = stdinBuffer.slice(payloadEnd); + await forwardPayload(body); + } +} + +async function forwardPayload(body: string): Promise { + const requestId = readJsonRpcId(body); + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), requestTimeoutMs); + try { + const response = await fetch(targetUrl!, { + body, + headers: { + accept: "application/json, text/event-stream", + "content-type": "application/json" + }, + method: "POST", + signal: controller.signal + }); + + if (response.status === 204) { + return; + } + + const text = await response.text(); + if (!response.ok) { + writeFrame(jsonRpcError(requestId, -32603, text || `In-app browser MCP returned HTTP ${response.status}.`)); + return; + } + if (text.trim()) { + writeRawFrame(text); + } + } catch (error) { + writeFrame(jsonRpcError(requestId, -32603, formatError(error))); + } finally { + clearTimeout(timeout); + } +} + +function readContentLength(headerText: string): number | undefined { + for (const line of headerText.split(/\r?\n/)) { + const match = /^content-length\s*:\s*(\d+)\s*$/i.exec(line); + if (match) { + return Number(match[1]); + } + } + return undefined; +} + +function readJsonRpcId(body: string): null | number | string { + try { + const payload = JSON.parse(body) as unknown; + if (isRecord(payload)) { + return isJsonRpcId(payload.id) ? payload.id : null; + } + if (Array.isArray(payload)) { + const first = payload.find((item) => isRecord(item) && isJsonRpcId(item.id)); + return isRecord(first) && isJsonRpcId(first.id) ? first.id : null; + } + } catch { + // The upstream MCP endpoint will return the parse error for valid JSON-RPC framing. + } + return null; +} + +function isJsonRpcId(value: unknown): value is null | number | string { + return value === null || typeof value === "number" || typeof value === "string"; +} + +function jsonRpcError(id: null | number | string, code: number, message: string): Record { + return { + error: { + code, + message + }, + id, + jsonrpc: "2.0" + }; +} + +function writeFrame(payload: Record): void { + writeRawFrame(JSON.stringify(payload)); +} + +function writeRawFrame(body: string): void { + process.stdout.write(`Content-Length: ${Buffer.byteLength(body, "utf8")}\r\n\r\n${body}`); +} + +function clampInteger(value: number, min: number, max: number, fallback: number): number { + if (!Number.isFinite(value)) { + return fallback; + } + return Math.min(max, Math.max(min, Math.trunc(value))); +} + +function isRecord(value: unknown): value is Record { + return Boolean(value && typeof value === "object" && !Array.isArray(value)); +} + +function formatError(error: unknown): string { + if (error instanceof Error) { + return error.name === "AbortError" ? "In-app browser MCP proxy request timed out." : error.message; + } + return String(error); +} diff --git a/packages/core/src/mcp/fusion-tool-fallback-mcp.ts b/packages/core/src/mcp/fusion-tool-fallback-mcp.ts new file mode 100644 index 0000000..87c9b62 --- /dev/null +++ b/packages/core/src/mcp/fusion-tool-fallback-mcp.ts @@ -0,0 +1,238 @@ +type JsonPrimitive = boolean | null | number | string; +type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue }; + +type JsonRpcRequest = { + id?: null | number | string; + jsonrpc?: string; + method?: string; + params?: unknown; +}; + +type JsonRpcResponse = + | { + id: null | number | string; + jsonrpc: "2.0"; + result: JsonValue; + } + | { + error: { + code: number; + data?: JsonValue; + message: string; + }; + id: null | number | string; + jsonrpc: "2.0"; + }; + +type McpTool = { + description: string; + inputSchema: JsonValue; + name: string; + unavailableMessage?: string; +}; + +type ToolCallResult = { + content: Array<{ text: string; type: "text" }>; + isError?: boolean; +}; + +const protocolVersion = "2024-11-05"; +const tools = readFallbackTools(); +const toolNames = new Set(tools.map((tool) => tool.name)); + +let inputBuffer = Buffer.alloc(0); + +process.stdin.on("data", (chunk) => { + inputBuffer = Buffer.concat([inputBuffer, Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)]); + drainInputBuffer().catch((error) => { + writeJsonRpc(jsonRpcError(null, -32603, formatError(error))); + }); +}); + +process.stdin.resume(); + +async function drainInputBuffer(): Promise { + while (true) { + const headerEnd = inputBuffer.indexOf("\r\n\r\n"); + if (headerEnd < 0) { + return; + } + + const headerText = inputBuffer.subarray(0, headerEnd).toString("utf8"); + const lengthMatch = headerText.match(/content-length:\s*(\d+)/i); + if (!lengthMatch) { + inputBuffer = inputBuffer.subarray(headerEnd + 4); + writeJsonRpc(jsonRpcError(null, -32600, "Missing Content-Length header.")); + continue; + } + + const contentLength = Number(lengthMatch[1]); + const messageStart = headerEnd + 4; + const messageEnd = messageStart + contentLength; + if (inputBuffer.length < messageEnd) { + return; + } + + const message = inputBuffer.subarray(messageStart, messageEnd).toString("utf8"); + inputBuffer = inputBuffer.subarray(messageEnd); + let payload: unknown; + try { + payload = JSON.parse(message) as unknown; + } catch (error) { + writeJsonRpc(jsonRpcError(null, -32700, `Invalid JSON-RPC request: ${formatError(error)}`)); + continue; + } + + const response = await handleJsonRpcRequest(payload); + if (response) { + writeJsonRpc(response); + } + } +} + +async function handleJsonRpcRequest(payload: unknown): Promise { + if (!isRecord(payload)) { + return jsonRpcError(null, -32600, "JSON-RPC request must be an object."); + } + + const request = payload as JsonRpcRequest; + const id = request.id ?? null; + if (request.id === undefined && request.method?.startsWith("notifications/")) { + return undefined; + } + if (request.jsonrpc !== "2.0" || !request.method) { + return jsonRpcError(id, -32600, "Invalid JSON-RPC 2.0 request."); + } + + try { + switch (request.method) { + case "initialize": + return jsonRpcResult(id, { + capabilities: { + tools: {} + }, + protocolVersion, + serverInfo: { + name: "ccr-fusion-tool-fallback", + title: "CCR Fusion Tool Fallback", + version: "1.0.0" + } + }); + case "ping": + return jsonRpcResult(id, {}); + case "tools/list": + return jsonRpcResult(id, { tools: tools as unknown as JsonValue }); + case "tools/call": + return jsonRpcResult(id, callTool(request.params) as unknown as JsonValue); + default: + return jsonRpcError(id, -32601, `Unsupported MCP method: ${request.method}`); + } + } catch (error) { + return jsonRpcError(id, -32603, formatError(error)); + } +} + +function callTool(params: unknown): ToolCallResult { + const name = isRecord(params) && typeof params.name === "string" ? params.name.trim() : ""; + const toolLabel = name || "unknown"; + const tool = tools.find((item) => item.name === toolLabel); + const knownSuffix = toolNames.has(toolLabel) ? "" : " The requested tool was not in the fallback catalog."; + return { + content: [{ + text: tool?.unavailableMessage || + `Fusion MCP tool "${toolLabel}" is temporarily unavailable. ` + + "CCR registered a fallback definition because the real MCP server did not provide the tool during discovery. " + + `Check the Fusion MCP server logs and retry.${knownSuffix}`, + type: "text" + }], + isError: true + }; +} + +function readFallbackTools(): McpTool[] { + const raw = env("FUSION_FALLBACK_TOOLS_JSON"); + if (!raw) { + return []; + } + + let parsed: unknown; + try { + parsed = JSON.parse(raw) as unknown; + } catch { + return []; + } + if (!Array.isArray(parsed)) { + return []; + } + + const seen = new Set(); + const result: McpTool[] = []; + for (const item of parsed) { + if (!isRecord(item)) { + continue; + } + const name = readString(item.name); + if (!name || seen.has(name)) { + continue; + } + seen.add(name); + result.push({ + description: + readString(item.description) || + `Fallback registration for Fusion MCP tool "${name}". The real MCP server should handle successful calls.`, + inputSchema: isRecord(item.inputSchema) ? item.inputSchema as JsonValue : objectSchema({}), + name, + unavailableMessage: readString(item.unavailableMessage) + }); + } + return result; +} + +function objectSchema(properties: Record, required: string[] = []): JsonValue { + return { + additionalProperties: true, + properties, + ...(required.length ? { required } : {}), + type: "object" + }; +} + +function jsonRpcResult(id: null | number | string, result: JsonValue): JsonRpcResponse { + return { + id, + jsonrpc: "2.0", + result + }; +} + +function jsonRpcError(id: null | number | string, code: number, message: string): JsonRpcResponse { + return { + error: { + code, + message + }, + id, + jsonrpc: "2.0" + }; +} + +function writeJsonRpc(response: JsonRpcResponse): void { + const text = JSON.stringify(response); + process.stdout.write(`Content-Length: ${Buffer.byteLength(text, "utf8")}\r\n\r\n${text}`); +} + +function env(name: string): string { + return process.env[name]?.trim() ?? ""; +} + +function readString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/core/src/mcp/fusion-vision-mcp.ts b/packages/core/src/mcp/fusion-vision-mcp.ts new file mode 100644 index 0000000..956866c --- /dev/null +++ b/packages/core/src/mcp/fusion-vision-mcp.ts @@ -0,0 +1,748 @@ +import { readFile } from "node:fs/promises"; +import { extname } from "node:path"; + +type JsonPrimitive = boolean | null | number | string; +type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue }; + +type JsonRpcRequest = { + id?: null | number | string; + jsonrpc?: string; + method?: string; + params?: unknown; +}; + +type JsonRpcResponse = + | { + id: null | number | string; + jsonrpc: "2.0"; + result: JsonValue; + } + | { + error: { + code: number; + data?: JsonValue; + message: string; + }; + id: null | number | string; + jsonrpc: "2.0"; + }; + +type ToolCallResult = { + content: Array<{ text: string; type: "text" }>; + isError?: boolean; +}; + +type FusionBuiltinToolKind = "vision" | "web_search"; +type SearchProvider = "auto" | "bing" | "brave" | "exa" | "google_cse" | "serpapi" | "serper" | "tavily"; +type SearchInput = { + count: number; + country?: string; + excludeDomains: string[]; + freshness?: string; + includeDomains: string[]; + includeRaw: boolean; + language?: string; + prompt: string; + safeSearch?: string; + timeoutMs: number; +}; +type SearchResult = { + snippet?: string; + title?: string; + url?: string; +}; + +const protocolVersion = "2024-11-05"; +const defaultVisionBaseUrl = "https://api.openai.com/v1"; +const defaultVisionModel = "gpt-4o-mini"; +const defaultTimeoutMs = 30000; +const maxLocalImageBytes = 20 * 1024 * 1024; + +const toolKind = parseToolKind(env("FUSION_BUILTIN_TOOL_KIND")); +const toolName = env("FUSION_TOOL_NAME") || env("FUSION_VISION_TOOL_NAME") || (toolKind === "web_search" ? "web_search" : "vision_understand"); +const toolTitle = env("FUSION_TOOL_TITLE") || env("FUSION_VISION_TOOL_TITLE") || (toolKind === "web_search" ? "Fusion Web Search" : "Fusion Vision Understand"); + +const visionTool = { + description: "Analyze one or more images with this Fusion profile's configured OpenAI-compatible vision model.", + inputSchema: objectSchema({ + detail: { enum: ["auto", "low", "high"], type: "string" }, + imageBase64: { description: "Single raw base64 image payload or data URL.", type: "string" }, + imagePath: { description: "Single local image path.", type: "string" }, + imageUrl: { description: "Single HTTP(S) image URL or data URL.", type: "string" }, + images: { + items: objectSchema({ + base64: { type: "string" }, + label: { type: "string" }, + mimeType: { type: "string" }, + path: { type: "string" }, + url: { type: "string" } + }), + type: "array" + }, + prompt: { description: "Task instruction for image analysis.", type: "string" }, + systemPrompt: { type: "string" }, + timeoutMs: { minimum: 100, type: "number" } + }, ["prompt"]), + name: toolName, + title: toolTitle +}; + +const webSearchTool = { + description: "Search the web with this Fusion profile's configured search provider.", + inputSchema: objectSchema({ + allowedDomains: { items: { type: "string" }, type: "array" }, + allowed_domains: { items: { type: "string" }, type: "array" }, + blockedDomains: { items: { type: "string" }, type: "array" }, + blocked_domains: { items: { type: "string" }, type: "array" }, + count: { maximum: 20, minimum: 1, type: "number" }, + country: { type: "string" }, + excludeDomains: { items: { type: "string" }, type: "array" }, + freshness: { enum: ["day", "week", "month"], type: "string" }, + includeDomains: { items: { type: "string" }, type: "array" }, + includeRaw: { type: "boolean" }, + language: { type: "string" }, + prompt: { description: "Natural-language search query.", type: "string" }, + safeSearch: { enum: ["off", "moderate", "strict"], type: "string" }, + timeoutMs: { minimum: 100, type: "number" } + }, ["prompt"]), + name: toolName, + title: toolTitle +}; + +const activeTool = toolKind === "web_search" ? webSearchTool : visionTool; + +let inputBuffer = Buffer.alloc(0); + +process.stdin.on("data", (chunk) => { + inputBuffer = Buffer.concat([inputBuffer, Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)]); + drainInputBuffer().catch((error) => { + writeJsonRpc(jsonRpcError(null, -32603, formatError(error))); + }); +}); + +process.stdin.resume(); + +async function drainInputBuffer(): Promise { + while (true) { + const headerEnd = inputBuffer.indexOf("\r\n\r\n"); + if (headerEnd < 0) { + return; + } + + const headerText = inputBuffer.subarray(0, headerEnd).toString("utf8"); + const lengthMatch = headerText.match(/content-length:\s*(\d+)/i); + if (!lengthMatch) { + inputBuffer = inputBuffer.subarray(headerEnd + 4); + writeJsonRpc(jsonRpcError(null, -32600, "Missing Content-Length header.")); + continue; + } + + const contentLength = Number(lengthMatch[1]); + const messageStart = headerEnd + 4; + const messageEnd = messageStart + contentLength; + if (inputBuffer.length < messageEnd) { + return; + } + + const message = inputBuffer.subarray(messageStart, messageEnd).toString("utf8"); + inputBuffer = inputBuffer.subarray(messageEnd); + let payload: unknown; + try { + payload = JSON.parse(message) as unknown; + } catch (error) { + writeJsonRpc(jsonRpcError(null, -32700, `Invalid JSON-RPC request: ${formatError(error)}`)); + continue; + } + + const response = await handleJsonRpcRequest(payload); + if (response) { + writeJsonRpc(response); + } + } +} + +async function handleJsonRpcRequest(payload: unknown): Promise { + if (!isRecord(payload)) { + return jsonRpcError(null, -32600, "JSON-RPC request must be an object."); + } + + const request = payload as JsonRpcRequest; + const id = request.id ?? null; + if (request.id === undefined && request.method?.startsWith("notifications/")) { + return undefined; + } + if (request.jsonrpc !== "2.0" || !request.method) { + return jsonRpcError(id, -32600, "Invalid JSON-RPC 2.0 request."); + } + + try { + switch (request.method) { + case "initialize": + return jsonRpcResult(id, { + capabilities: { + tools: {} + }, + protocolVersion, + serverInfo: { + name: "ccr-fusion-builtins", + title: "CCR Fusion Builtins", + version: "1.0.0" + } + }); + case "ping": + return jsonRpcResult(id, {}); + case "tools/list": + return jsonRpcResult(id, { tools: [activeTool] as unknown as JsonValue }); + case "tools/call": + return jsonRpcResult(id, await callTool(request.params) as unknown as JsonValue); + default: + return jsonRpcError(id, -32601, `Unsupported MCP method: ${request.method}`); + } + } catch (error) { + return jsonRpcError(id, -32603, formatError(error)); + } +} + +async function callTool(params: unknown): Promise { + if (!isRecord(params) || typeof params.name !== "string") { + throw new Error("tools/call params must include a tool name."); + } + if (params.name !== toolName) { + throw new Error(`Unknown fusion tool: ${params.name}`); + } + + const args = isRecord(params.arguments) ? params.arguments : {}; + try { + const text = toolKind === "web_search" ? await analyzeWebSearch(args) : await analyzeVision(args); + return textResult(text); + } catch (error) { + return { + ...textResult(formatError(error)), + isError: true + }; + } +} + +async function analyzeVision(args: Record): Promise { + const prompt = readString(args.prompt); + if (!prompt) { + throw new Error(`${toolName} requires prompt.`); + } + + const gatewayBaseUrl = env("VISION_GATEWAY_BASE_URL"); + const baseUrl = gatewayBaseUrl || env("VISION_BASE_URL") || env("OPENAI_BASE_URL") || defaultVisionBaseUrl; + const apiKey = gatewayBaseUrl ? env("VISION_GATEWAY_API_KEY") : env("VISION_API_KEY") || env("OPENAI_API_KEY"); + if (!gatewayBaseUrl && !apiKey) { + throw new Error("Missing vision API key. Set VISION_API_KEY."); + } + const model = env("VISION_MODEL") || env("OPENAI_MODEL") || defaultVisionModel; + const detail = readString(args.detail); + const imageParts = await buildImageParts(args, detail === "low" || detail === "high" ? detail : "auto"); + if (imageParts.length === 0) { + throw new Error(`${toolName} requires imageUrl, imagePath, imageBase64, or images.`); + } + + const systemPrompt = readString(args.systemPrompt); + const messages = [ + ...(systemPrompt ? [{ role: "system", content: systemPrompt }] : []), + { + role: "user", + content: [ + { type: "text", text: prompt }, + ...imageParts + ] + } + ]; + const timeoutMs = clampInteger(readNumber(args.timeoutMs) ?? readNumber(env("VISION_TIMEOUT_MS")) ?? defaultTimeoutMs, 100, 600000); + const response = await fetch(resolveChatCompletionsUrl(baseUrl), { + body: JSON.stringify({ model, messages }), + headers: { + ...(apiKey ? { authorization: `Bearer ${apiKey}` } : {}), + "content-type": "application/json" + }, + method: "POST", + signal: AbortSignal.timeout(timeoutMs) + }); + const rawText = await response.text(); + const payload = parseJson(rawText); + if (!response.ok) { + throw new Error(`Vision request failed (${response.status}): ${extractProviderError(rawText, payload)}`); + } + + return extractResponseText(payload) || rawText; +} + +async function analyzeWebSearch(args: Record): Promise { + const prompt = readString(args.prompt); + if (!prompt) { + throw new Error(`${toolName} requires prompt.`); + } + + const provider = resolveSearchProvider(); + const count = clampInteger(readNumber(args.count) ?? readNumber(env("SEARCH_RESULT_COUNT")) ?? 5, 1, 20); + const timeoutMs = clampInteger(readNumber(args.timeoutMs) ?? readNumber(env("SEARCH_TIMEOUT_MS")) ?? defaultTimeoutMs, 100, 600000); + const input = { + count, + country: readString(args.country), + excludeDomains: uniqueStrings([ + ...readStringArray(args.excludeDomains), + ...readStringArray(args.blockedDomains), + ...readStringArray(args.blocked_domains) + ]), + freshness: readString(args.freshness), + includeDomains: uniqueStrings([ + ...readStringArray(args.includeDomains), + ...readStringArray(args.allowedDomains), + ...readStringArray(args.allowed_domains) + ]), + includeRaw: args.includeRaw === true, + language: readString(args.language), + prompt, + safeSearch: readString(args.safeSearch), + timeoutMs + }; + const results = await searchWithProvider(provider, input); + if (results.length === 0) { + return `Search provider: ${provider}\nNo results.`; + } + return [ + `Search provider: ${provider}`, + ...results.slice(0, count).map((result, index) => [ + `${index + 1}. ${result.title || result.url || "Untitled"}`, + result.url ? `URL: ${result.url}` : "", + result.snippet ? `Snippet: ${result.snippet}` : "" + ].filter(Boolean).join("\n")) + ].join("\n\n"); +} + +async function searchWithProvider( + provider: Exclude, + input: { + count: number; + country?: string; + excludeDomains: string[]; + freshness?: string; + includeDomains: string[]; + includeRaw: boolean; + language?: string; + prompt: string; + safeSearch?: string; + timeoutMs: number; + } +): Promise> { + if (provider === "brave") return searchBrave(input); + if (provider === "bing") return searchBing(input); + if (provider === "google_cse") return searchGoogleCse(input); + if (provider === "serper") return searchSerper(input); + if (provider === "serpapi") return searchSerpApi(input); + if (provider === "tavily") return searchTavily(input); + return searchExa(input); +} + +async function searchBrave(input: SearchInput): Promise { + const apiKey = requireEnv("BRAVE_SEARCH_API_KEY", "Brave Search API key"); + const url = new URL(env("BRAVE_SEARCH_ENDPOINT") || "https://api.search.brave.com/res/v1/web/search"); + url.searchParams.set("q", scopedSearchQuery(input)); + url.searchParams.set("count", String(input.count)); + if (input.country) url.searchParams.set("country", input.country); + if (input.language) url.searchParams.set("search_lang", input.language); + if (input.safeSearch) url.searchParams.set("safesearch", input.safeSearch); + const raw = await fetchJson(url.toString(), { + headers: { "x-subscription-token": apiKey }, + signal: AbortSignal.timeout(input.timeoutMs) + }); + const items = isRecord(raw) && isRecord(raw.web) && Array.isArray(raw.web.results) ? raw.web.results : []; + return items.map((item) => normalizeSearchResult(item, "title", "url", "description")).filter(isSearchResult); +} + +async function searchBing(input: SearchInput): Promise { + const apiKey = requireEnv("BING_SEARCH_API_KEY", "Bing Web Search API key"); + const url = new URL(env("BING_SEARCH_ENDPOINT") || "https://api.bing.microsoft.com/v7.0/search"); + url.searchParams.set("q", scopedSearchQuery(input)); + url.searchParams.set("count", String(input.count)); + if (input.country || input.language) url.searchParams.set("mkt", [input.language, input.country].filter(Boolean).join("-")); + if (input.safeSearch) url.searchParams.set("safeSearch", input.safeSearch); + const raw = await fetchJson(url.toString(), { + headers: { "ocp-apim-subscription-key": apiKey }, + signal: AbortSignal.timeout(input.timeoutMs) + }); + const items = isRecord(raw) && isRecord(raw.webPages) && Array.isArray(raw.webPages.value) ? raw.webPages.value : []; + return items.map((item) => normalizeSearchResult(item, "name", "url", "snippet")).filter(isSearchResult); +} + +async function searchGoogleCse(input: SearchInput): Promise { + const apiKey = requireEnv("GOOGLE_SEARCH_API_KEY", "Google Programmable Search API key"); + const cx = requireEnv("GOOGLE_SEARCH_CX", "Google Programmable Search Engine ID"); + const url = new URL(env("GOOGLE_SEARCH_ENDPOINT") || "https://www.googleapis.com/customsearch/v1"); + url.searchParams.set("key", apiKey); + url.searchParams.set("cx", cx); + url.searchParams.set("q", scopedSearchQuery(input)); + url.searchParams.set("num", String(Math.min(input.count, 10))); + if (input.country) url.searchParams.set("gl", input.country); + if (input.language) url.searchParams.set("hl", input.language); + const raw = await fetchJson(url.toString(), { signal: AbortSignal.timeout(input.timeoutMs) }); + const items = isRecord(raw) && Array.isArray(raw.items) ? raw.items : []; + return items.map((item) => normalizeSearchResult(item, "title", "link", "snippet")).filter(isSearchResult); +} + +async function searchSerper(input: SearchInput): Promise { + const apiKey = requireEnv("SERPER_API_KEY", "Serper API key"); + const raw = await fetchJson(env("SERPER_SEARCH_ENDPOINT") || "https://google.serper.dev/search", { + body: JSON.stringify({ + gl: input.country, + hl: input.language, + num: input.count, + q: scopedSearchQuery(input), + tbs: freshnessToGoogleTbs(input.freshness) + }), + headers: { + "content-type": "application/json", + "x-api-key": apiKey + }, + method: "POST", + signal: AbortSignal.timeout(input.timeoutMs) + }); + const items = isRecord(raw) && Array.isArray(raw.organic) ? raw.organic : []; + return items.map((item) => normalizeSearchResult(item, "title", "link", "snippet")).filter(isSearchResult); +} + +async function searchSerpApi(input: SearchInput): Promise { + const apiKey = requireEnv("SERPAPI_API_KEY", "SerpAPI key"); + const url = new URL(env("SERPAPI_SEARCH_ENDPOINT") || "https://serpapi.com/search.json"); + url.searchParams.set("api_key", apiKey); + url.searchParams.set("engine", "google"); + url.searchParams.set("q", scopedSearchQuery(input)); + url.searchParams.set("num", String(input.count)); + if (input.country) url.searchParams.set("gl", input.country); + if (input.language) url.searchParams.set("hl", input.language); + if (input.safeSearch) url.searchParams.set("safe", input.safeSearch === "off" ? "off" : "active"); + const raw = await fetchJson(url.toString(), { signal: AbortSignal.timeout(input.timeoutMs) }); + const items = isRecord(raw) && Array.isArray(raw.organic_results) ? raw.organic_results : []; + return items.map((item) => normalizeSearchResult(item, "title", "link", "snippet")).filter(isSearchResult); +} + +async function searchTavily(input: SearchInput): Promise { + const apiKey = requireEnv("TAVILY_API_KEY", "Tavily API key"); + const raw = await fetchJson(env("TAVILY_SEARCH_ENDPOINT") || "https://api.tavily.com/search", { + body: JSON.stringify({ + api_key: apiKey, + include_raw_content: input.includeRaw, + max_results: input.count, + query: scopedSearchQuery(input), + search_depth: "basic" + }), + headers: { "content-type": "application/json" }, + method: "POST", + signal: AbortSignal.timeout(input.timeoutMs) + }); + const items = isRecord(raw) && Array.isArray(raw.results) ? raw.results : []; + return items.map((item) => normalizeSearchResult(item, "title", "url", "content")).filter(isSearchResult); +} + +async function searchExa(input: SearchInput): Promise { + const apiKey = requireEnv("EXA_API_KEY", "Exa API key"); + const raw = await fetchJson(env("EXA_SEARCH_ENDPOINT") || "https://api.exa.ai/search", { + body: JSON.stringify({ + numResults: input.count, + query: scopedSearchQuery(input) + }), + headers: { + authorization: `Bearer ${apiKey}`, + "content-type": "application/json" + }, + method: "POST", + signal: AbortSignal.timeout(input.timeoutMs) + }); + const items = isRecord(raw) && Array.isArray(raw.results) ? raw.results : []; + return items.map((item) => normalizeSearchResult(item, "title", "url", "text")).filter(isSearchResult); +} + +async function buildImageParts(args: Record, detail: "auto" | "high" | "low"): Promise { + const inputs: Array<{ base64?: string; label?: string; mimeType?: string; path?: string; url?: string }> = []; + const imageUrl = readString(args.imageUrl); + const imagePath = readString(args.imagePath); + const imageBase64 = readString(args.imageBase64); + if (imageUrl) inputs.push({ url: imageUrl }); + if (imagePath) inputs.push({ path: imagePath }); + if (imageBase64) inputs.push({ base64: imageBase64, mimeType: readString(args.mimeType) }); + + const images = Array.isArray(args.images) ? args.images : []; + for (const item of images) { + if (!isRecord(item)) { + continue; + } + inputs.push({ + base64: readString(item.base64), + label: readString(item.label), + mimeType: readString(item.mimeType), + path: readString(item.path), + url: readString(item.url) + }); + } + + const parts: JsonValue[] = []; + for (const input of inputs) { + const url = await imageInputToUrl(input); + if (!url) { + continue; + } + if (input.label) { + parts.push({ text: `Image: ${input.label}`, type: "text" }); + } + parts.push({ + image_url: { + detail, + url + }, + type: "image_url" + }); + } + return parts; +} + +async function imageInputToUrl(input: { base64?: string; mimeType?: string; path?: string; url?: string }): Promise { + if (input.url) { + return input.url; + } + if (input.base64) { + return toDataUrl(input.base64, input.mimeType || "image/png"); + } + if (!input.path) { + return undefined; + } + const buffer = await readFile(input.path); + if (buffer.byteLength > maxLocalImageBytes) { + throw new Error(`Local image exceeds ${maxLocalImageBytes} bytes: ${input.path}`); + } + return toDataUrl(buffer.toString("base64"), input.mimeType || mimeTypeFromPath(input.path)); +} + +function toDataUrl(value: string, mimeType: string): string { + return value.startsWith("data:") ? value : `data:${mimeType};base64,${value}`; +} + +function mimeTypeFromPath(path: string): string { + const ext = extname(path).toLowerCase(); + if (ext === ".jpg" || ext === ".jpeg") return "image/jpeg"; + if (ext === ".webp") return "image/webp"; + if (ext === ".gif") return "image/gif"; + return "image/png"; +} + +function resolveChatCompletionsUrl(baseUrl: string): string { + const trimmed = baseUrl.trim().replace(/\/+$/, ""); + return trimmed.endsWith("/chat/completions") ? trimmed : `${trimmed}/chat/completions`; +} + +function extractResponseText(value: unknown): string | undefined { + if (!isRecord(value)) { + return undefined; + } + const choices = Array.isArray(value.choices) ? value.choices : []; + const first = isRecord(choices[0]) ? choices[0] : undefined; + const message = isRecord(first?.message) ? first.message : undefined; + const content = message?.content; + if (typeof content === "string") { + return content; + } + if (Array.isArray(content)) { + const text = content + .map((item) => isRecord(item) ? readString(item.text) : undefined) + .filter((item): item is string => Boolean(item)) + .join("\n"); + return text || undefined; + } + return readString(value.output_text); +} + +function extractProviderError(rawText: string, json: unknown): string { + if (isRecord(json)) { + const error = json.error; + if (typeof error === "string") return error; + if (isRecord(error) && typeof error.message === "string") return error.message; + if (typeof json.message === "string") return json.message; + } + return rawText.slice(0, 500); +} + +function parseJson(rawText: string): unknown { + try { + return JSON.parse(rawText) as unknown; + } catch { + throw new Error(`Invalid JSON from provider: ${rawText.slice(0, 500)}`); + } +} + +function parseToolKind(value: string | undefined): FusionBuiltinToolKind { + return value === "web_search" ? "web_search" : "vision"; +} + +function resolveSearchProvider(): Exclude { + const configured = parseSearchProvider(env("SEARCH_PROVIDER")) ?? "auto"; + if (configured !== "auto") { + return configured; + } + const candidates: Array> = ["brave", "bing", "google_cse", "serper", "serpapi", "tavily", "exa"]; + const provider = candidates.find(searchProviderIsConfigured); + if (!provider) { + throw new Error("No search provider configured. Set SEARCH_PROVIDER and its API key."); + } + return provider; +} + +function parseSearchProvider(value: string | undefined): SearchProvider | undefined { + if ( + value === "auto" || + value === "brave" || + value === "bing" || + value === "google_cse" || + value === "serper" || + value === "serpapi" || + value === "tavily" || + value === "exa" + ) { + return value; + } + return undefined; +} + +function searchProviderIsConfigured(provider: Exclude): boolean { + if (provider === "brave") return Boolean(env("BRAVE_SEARCH_API_KEY")); + if (provider === "bing") return Boolean(env("BING_SEARCH_API_KEY")); + if (provider === "google_cse") return Boolean(env("GOOGLE_SEARCH_API_KEY") && env("GOOGLE_SEARCH_CX")); + if (provider === "serper") return Boolean(env("SERPER_API_KEY")); + if (provider === "serpapi") return Boolean(env("SERPAPI_API_KEY")); + if (provider === "tavily") return Boolean(env("TAVILY_API_KEY")); + return Boolean(env("EXA_API_KEY")); +} + +function requireEnv(name: string, label: string): string { + const value = env(name); + if (!value) { + throw new Error(`Missing ${label}. Set ${name}.`); + } + return value; +} + +async function fetchJson(url: string, init: RequestInit): Promise { + const response = await fetch(url, init); + const rawText = await response.text(); + const payload = rawText ? parseJson(rawText) : {}; + if (!response.ok) { + throw new Error(`Search request failed (${response.status}): ${extractProviderError(rawText, payload)}`); + } + return payload; +} + +function scopedSearchQuery(input: SearchInput): string { + const include = input.includeDomains.map((domain) => `site:${domain}`).join(" "); + const exclude = input.excludeDomains.map((domain) => `-site:${domain}`).join(" "); + return [input.prompt, include, exclude].filter(Boolean).join(" "); +} + +function freshnessToGoogleTbs(value: string | undefined): string | undefined { + if (value === "day") return "qdr:d"; + if (value === "week") return "qdr:w"; + if (value === "month") return "qdr:m"; + return undefined; +} + +function normalizeSearchResult(value: unknown, titleKey: string, urlKey: string, snippetKey: string): SearchResult { + if (!isRecord(value)) { + return {}; + } + return { + snippet: readString(value[snippetKey]), + title: readString(value[titleKey]), + url: readString(value[urlKey]) + }; +} + +function isSearchResult(value: SearchResult): value is Required> & SearchResult { + return Boolean(value.title || value.url || value.snippet); +} + +function readStringArray(value: unknown): string[] { + if (typeof value === "string") { + return value.split(",").map((item) => item.trim()).filter(Boolean); + } + if (!Array.isArray(value)) { + return []; + } + return value.map(readString).filter((item): item is string => Boolean(item)); +} + +function uniqueStrings(values: string[]): string[] { + return [...new Set(values.filter(Boolean))]; +} + +function textResult(text: string): ToolCallResult { + return { + content: [{ text, type: "text" }] + }; +} + +function objectSchema(properties: Record, required: string[] = []): JsonValue { + return { + additionalProperties: false, + properties, + required, + type: "object" + }; +} + +function jsonRpcResult(id: null | number | string, result: JsonValue): JsonRpcResponse { + return { + id, + jsonrpc: "2.0", + result + }; +} + +function jsonRpcError(id: null | number | string, code: number, message: string, data?: JsonValue): JsonRpcResponse { + return { + error: { + code, + ...(data === undefined ? {} : { data }), + message + }, + id, + jsonrpc: "2.0" + }; +} + +function writeJsonRpc(response: JsonRpcResponse): void { + const payload = JSON.stringify(response); + process.stdout.write(`Content-Length: ${Buffer.byteLength(payload, "utf8")}\r\n\r\n${payload}`); +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function readString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function readNumber(value: unknown): number | undefined { + if (typeof value === "number" && Number.isFinite(value)) { + return value; + } + if (typeof value === "string" && value.trim()) { + const parsed = Number(value); + return Number.isFinite(parsed) ? parsed : undefined; + } + return undefined; +} + +function clampInteger(value: number, min: number, max: number): number { + return Math.min(max, Math.max(min, Math.trunc(value))); +} + +function env(name: string): string | undefined { + return readString(process.env[name]); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/core/src/mcp/network-capture-mcp.ts b/packages/core/src/mcp/network-capture-mcp.ts new file mode 100644 index 0000000..15dd6dc --- /dev/null +++ b/packages/core/src/mcp/network-capture-mcp.ts @@ -0,0 +1,413 @@ +import packageJson from "../../package.json"; +import type { IncomingMessage, ServerResponse } from "node:http"; +import type { ProxyNetworkExchange } from "@ccr/core/contracts/app"; +import { proxyService } from "@ccr/core/proxy/service"; + +type JsonPrimitive = boolean | null | number | string; +type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue }; + +type JsonRpcRequest = { + id?: null | number | string; + jsonrpc?: string; + method?: string; + params?: unknown; +}; + +type JsonRpcResponse = + | { + id: null | number | string; + jsonrpc: "2.0"; + result: JsonValue; + } + | { + error: { + code: number; + data?: JsonValue; + message: string; + }; + id: null | number | string; + jsonrpc: "2.0"; + }; + +type McpTool = { + description: string; + inputSchema: JsonValue; + name: string; +}; + +type ToolCallResult = { + content: Array<{ text: string; type: "text" }>; + isError?: boolean; +}; + +const protocolVersion = "2024-11-05"; +const maxMcpRequestBytes = 2 * 1024 * 1024; + +const networkCaptureTools: McpTool[] = [ + { + description: "Return CCR proxy capture status, proxy status, capture limits, and current capture count.", + inputSchema: objectSchema({}), + name: "network_capture_status" + }, + { + description: "List captured network exchanges. Bodies are omitted by default to keep responses compact.", + inputSchema: objectSchema({ + includeBodies: { description: "Include captured request and response bodies.", type: "boolean" }, + limit: { description: "Maximum number of exchanges to return.", maximum: 200, minimum: 1, type: "number" }, + query: { description: "Filter by URL, host, client, method, state, status code, or error text.", type: "string" } + }), + name: "network_capture_list" + }, + { + description: "Get one captured network exchange by id, including captured request and response bodies.", + inputSchema: objectSchema({ + id: { description: "Capture id returned by network_capture_list.", type: "string" } + }, ["id"]), + name: "network_capture_get" + }, + { + description: "Clear all captured network exchanges.", + inputSchema: objectSchema({}), + name: "network_capture_clear" + }, + { + description: "Enable or pause future network capture recording. Traffic continues to proxy while recording is paused.", + inputSchema: objectSchema({ + enabled: { description: "true to record future captures, false to pause recording.", type: "boolean" } + }, ["enabled"]), + name: "network_capture_set_enabled" + } +]; + +export function isNetworkCaptureMcpPath(path: string): boolean { + return path === "/mcp" || path === "/mcp/"; +} + +export async function handleNetworkCaptureMcpRequest(request: IncomingMessage, response: ServerResponse): Promise { + response.setHeader("MCP-Protocol-Version", protocolVersion); + + if (!proxyService.isNetworkCaptureEnabled()) { + sendJson(response, 404, { error: { message: "Network capture MCP is disabled." } }); + return; + } + + if (request.method === "GET") { + sendJson(response, 200, { + name: "ccr-network-capture", + protocol: "mcp", + transport: "streamable-http", + endpoint: "/mcp" + }); + return; + } + + if (request.method !== "POST") { + sendJson(response, 405, { error: { message: "MCP endpoint only supports GET and POST." } }); + return; + } + + let payload: unknown; + try { + payload = JSON.parse((await readRequestBody(request, maxMcpRequestBytes)).toString("utf8")) as unknown; + } catch (error) { + sendJson(response, 400, jsonRpcError(null, -32700, `Invalid JSON-RPC request: ${formatError(error)}`)); + return; + } + + const requests = Array.isArray(payload) ? payload : [payload]; + const responses = await Promise.all(requests.map((item) => handleJsonRpcRequest(item))); + const filtered = responses.filter((item): item is JsonRpcResponse => Boolean(item)); + if (filtered.length === 0) { + response.writeHead(204); + response.end(); + return; + } + + sendJson(response, 200, Array.isArray(payload) ? filtered : filtered[0]); +} + +async function handleJsonRpcRequest(payload: unknown): Promise { + if (!isRecord(payload)) { + return jsonRpcError(null, -32600, "JSON-RPC request must be an object."); + } + + const request = payload as JsonRpcRequest; + const id = request.id ?? null; + if (request.id === undefined && request.method?.startsWith("notifications/")) { + return undefined; + } + if (request.jsonrpc !== "2.0" || !request.method) { + return jsonRpcError(id, -32600, "Invalid JSON-RPC 2.0 request."); + } + + try { + switch (request.method) { + case "initialize": + return jsonRpcResult(id, { + capabilities: { + tools: {} + }, + protocolVersion, + serverInfo: { + name: "ccr-network-capture", + title: "CCR Network Capture", + version: appVersion() + } + }); + case "ping": + return jsonRpcResult(id, {}); + case "tools/list": + return jsonRpcResult(id, { tools: proxyService.isNetworkCaptureEnabled() ? networkCaptureTools : [] }); + case "tools/call": + return jsonRpcResult(id, await callTool(request.params)); + default: + return jsonRpcError(id, -32601, `Unsupported MCP method: ${request.method}`); + } + } catch (error) { + return jsonRpcError(id, -32603, formatError(error)); + } +} + +function appVersion(): string { + return packageJson.version; +} + +async function callTool(params: unknown): Promise { + if (!proxyService.isNetworkCaptureEnabled()) { + throw new Error("Network capture MCP is disabled."); + } + + if (!isRecord(params) || typeof params.name !== "string") { + throw new Error("tools/call params must include a tool name."); + } + + const args = isRecord(params.arguments) ? params.arguments : {}; + switch (params.name) { + case "network_capture_status": + return toolResult(captureStatus()); + case "network_capture_list": + return toolResult(listCaptures(args)); + case "network_capture_get": + return toolResult(getCapture(args)); + case "network_capture_clear": + return toolResult(clearCaptures()); + case "network_capture_set_enabled": + return toolResult(setCaptureEnabled(args)); + default: + throw new Error(`Unknown network capture tool: ${params.name}`); + } +} + +function captureStatus(): JsonValue { + const snapshot = proxyService.getNetworkCaptures(); + const status = proxyService.getStatus(); + return { + captureEnabled: snapshot.captureEnabled, + capturedAt: snapshot.capturedAt, + count: snapshot.items.length, + maxBodyBytes: snapshot.maxBodyBytes, + maxEntries: snapshot.maxEntries, + proxy: { + endpoint: status.endpoint, + mode: status.mode, + state: status.state, + systemProxy: status.systemProxy + } + } as JsonValue; +} + +function listCaptures(args: Record): JsonValue { + const snapshot = proxyService.getNetworkCaptures(); + const query = readString(args.query)?.trim().toLowerCase(); + const limit = clampInteger(readNumber(args.limit) ?? 50, 1, Math.min(snapshot.maxEntries, 200)); + const includeBodies = args.includeBodies === true; + const items = snapshot.items + .filter((item) => !query || captureMatchesQuery(item, query)) + .slice(0, limit) + .map((item) => includeBodies ? item : summarizeCapture(item)); + return { + captureEnabled: snapshot.captureEnabled, + capturedAt: snapshot.capturedAt, + count: items.length, + items, + total: snapshot.items.length + } as JsonValue; +} + +function getCapture(args: Record): JsonValue { + const id = readString(args.id); + if (!id) { + throw new Error("network_capture_get requires id."); + } + + const item = proxyService.getNetworkCaptures().items.find((capture) => capture.id === id); + if (!item) { + throw new Error(`Network capture not found: ${id}`); + } + return item as unknown as JsonValue; +} + +function clearCaptures(): JsonValue { + const snapshot = proxyService.clearNetworkCaptures(); + return { + captureEnabled: snapshot.captureEnabled, + cleared: true, + count: snapshot.items.length + }; +} + +function setCaptureEnabled(args: Record): JsonValue { + if (typeof args.enabled !== "boolean") { + throw new Error("network_capture_set_enabled requires boolean enabled."); + } + const snapshot = proxyService.setNetworkCaptureEnabled(args.enabled); + return { + captureEnabled: snapshot.captureEnabled, + count: snapshot.items.length + }; +} + +function summarizeCapture(item: ProxyNetworkExchange): JsonValue { + return { + client: item.client, + completedAt: item.completedAt, + durationMs: item.durationMs, + error: item.error, + host: item.host, + id: item.id, + method: item.method, + mode: item.mode, + path: item.path, + protocol: item.protocol, + requestBody: summarizeBody(item.requestBody), + requestHeaders: item.requestHeaders, + responseBody: item.responseBody ? summarizeBody(item.responseBody) : undefined, + responseHeaders: item.responseHeaders, + routedToGateway: item.routedToGateway, + startedAt: item.startedAt, + state: item.state, + statusCode: item.statusCode, + upstreamUrl: item.upstreamUrl, + url: item.url + } as JsonValue; +} + +function summarizeBody(body: ProxyNetworkExchange["requestBody"]): JsonValue { + const summary: Record = { + encoding: body.encoding, + sizeBytes: body.sizeBytes, + truncated: body.truncated + }; + if (body.contentType) { + summary.contentType = body.contentType; + } + if (body.decodedFrom) { + summary.decodedFrom = body.decodedFrom; + } + if (body.error) { + summary.error = body.error; + } + return summary; +} + +function captureMatchesQuery(item: ProxyNetworkExchange, query: string): boolean { + return [ + item.client, + item.error, + item.host, + item.method, + item.mode, + item.path, + item.protocol, + item.state, + item.statusCode === undefined ? undefined : String(item.statusCode), + item.upstreamUrl, + item.url + ] + .filter((value): value is string => Boolean(value)) + .some((value) => value.toLowerCase().includes(query)); +} + +function toolResult(value: JsonValue): ToolCallResult { + return { + content: [ + { + text: JSON.stringify(value, null, 2), + type: "text" + } + ] + }; +} + +function objectSchema(properties: Record, required: string[] = []): JsonValue { + return { + additionalProperties: false, + properties, + required, + type: "object" + }; +} + +function jsonRpcResult(id: null | number | string, result: JsonValue): JsonRpcResponse { + return { + id, + jsonrpc: "2.0", + result + }; +} + +function jsonRpcError(id: null | number | string, code: number, message: string, data?: JsonValue): JsonRpcResponse { + return { + error: { + code, + ...(data === undefined ? {} : { data }), + message + }, + id, + jsonrpc: "2.0" + }; +} + +function readRequestBody(request: IncomingMessage, maxBytes: number): Promise { + return new Promise((resolve, reject) => { + const chunks: Buffer[] = []; + let totalBytes = 0; + request.on("data", (chunk) => { + const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); + totalBytes += buffer.length; + if (totalBytes > maxBytes) { + reject(new Error(`Request body exceeds ${maxBytes} bytes.`)); + request.destroy(); + return; + } + chunks.push(buffer); + }); + request.on("end", () => resolve(Buffer.concat(chunks, totalBytes))); + request.on("error", reject); + }); +} + +function sendJson(response: ServerResponse, statusCode: number, payload: unknown): void { + response.writeHead(statusCode, { "content-type": "application/json" }); + response.end(`${JSON.stringify(payload)}\n`); +} + +function readNumber(value: unknown): number | undefined { + return typeof value === "number" && Number.isFinite(value) ? value : undefined; +} + +function readString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value : undefined; +} + +function clampInteger(value: number, minimum: number, maximum: number): number { + return Math.max(minimum, Math.min(maximum, Math.trunc(value))); +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/core/src/mcp/tool-discovery.ts b/packages/core/src/mcp/tool-discovery.ts new file mode 100644 index 0000000..efe2b41 --- /dev/null +++ b/packages/core/src/mcp/tool-discovery.ts @@ -0,0 +1,587 @@ +import { spawn, type ChildProcessWithoutNullStreams } from "node:child_process"; +import { fetchWithSystemProxy } from "@ccr/core/proxy/system-proxy-fetch"; +import type { + GatewayMcpRemoteServerConfig, + GatewayMcpServerConfig, + GatewayMcpStdioServerConfig, + GatewayMcpToolInfo +} from "@ccr/core/contracts/app"; + +type JsonRpcMessage = { + error?: unknown; + id?: number | string | null; + jsonrpc?: string; + method?: string; + params?: unknown; + result?: unknown; +}; + +type PendingRequest = { + reject: (error: Error) => void; + resolve: (message: JsonRpcMessage) => void; +}; + +type SseEvent = { + data: string; + event: string; +}; + +const mcpClientInfo = { + name: "CCR", + version: "3.0.0" +}; + +export async function listMcpServerTools(server: GatewayMcpServerConfig): Promise { + if (server.transport === "stdio") { + return listStdioMcpServerTools(server); + } + + try { + return await listStreamableHttpMcpServerTools(server); + } catch (error) { + if (server.transport !== "sse") { + throw error; + } + return listLegacySseMcpServerTools(server, error); + } +} + +async function listStdioMcpServerTools(server: GatewayMcpStdioServerConfig): Promise { + return new Promise((resolve, reject) => { + const child = spawn(server.command, server.args, { + cwd: server.cwd || undefined, + env: { + ...process.env, + ...server.env + }, + stdio: ["pipe", "pipe", "pipe"] + }) as ChildProcessWithoutNullStreams; + const pending = new Map(); + const timeout = setTimeout(() => finish(new Error(`MCP tools discovery timed out after ${mcpTimeoutMs(server)} ms.`)), mcpTimeoutMs(server)); + const readMessage = createStdioMessageReader(server.stdioMessageMode, routeMessage); + let nextId = 1; + let settled = false; + let stderr = ""; + + child.stdout.on("data", (chunk: Buffer) => readMessage(chunk)); + child.stderr.on("data", (chunk: Buffer) => { + stderr = `${stderr}${chunk.toString("utf8")}`.slice(-4000); + }); + child.on("error", (error) => finish(error)); + child.on("exit", (code, signal) => { + if (!settled) { + const detail = stderr.trim() ? ` ${stderr.trim()}` : ""; + finish(new Error(`MCP server exited before tools/list completed (${signal ?? code ?? "unknown"}).${detail}`)); + } + }); + + run().catch((error: unknown) => finish(error)); + + async function run() { + await request("initialize", { + capabilities: {}, + clientInfo: mcpClientInfo, + protocolVersion: server.protocolVersion || "2024-11-05" + }); + notify("notifications/initialized", {}); + const response = await request("tools/list", {}); + finish(undefined, normalizeToolList(response.result)); + } + + function request(method: string, params: unknown): Promise { + const id = nextId++; + const message: JsonRpcMessage = { + id, + jsonrpc: "2.0", + method, + params + }; + return new Promise((resolveRequest, rejectRequest) => { + pending.set(String(id), { + reject: rejectRequest, + resolve: resolveRequest + }); + writeStdioMessage(child, server.stdioMessageMode, message); + }); + } + + function notify(method: string, params: unknown) { + writeStdioMessage(child, server.stdioMessageMode, { + jsonrpc: "2.0", + method, + params + }); + } + + function routeMessage(message: JsonRpcMessage) { + const key = message.id === undefined || message.id === null ? "" : String(message.id); + const request = key ? pending.get(key) : undefined; + if (!request) { + return; + } + pending.delete(key); + if (message.error) { + request.reject(new Error(jsonRpcErrorMessage(message.error))); + return; + } + request.resolve(message); + } + + function finish(error?: unknown, tools: GatewayMcpToolInfo[] = []) { + if (settled) { + return; + } + settled = true; + clearTimeout(timeout); + for (const request of pending.values()) { + request.reject(toError(error ?? "MCP tools discovery stopped.")); + } + pending.clear(); + if (!child.killed) { + child.kill(); + } + if (error) { + reject(toError(error)); + return; + } + resolve(tools); + } + }); +} + +async function listStreamableHttpMcpServerTools(server: GatewayMcpRemoteServerConfig): Promise { + let nextId = 1; + let sessionId = ""; + + async function send(message: JsonRpcMessage): Promise { + const response = await postJsonRpc(server, server.url, message, sessionId); + sessionId = response.sessionId || sessionId; + return response.message; + } + + await send({ + id: nextId++, + jsonrpc: "2.0", + method: "initialize", + params: { + capabilities: {}, + clientInfo: mcpClientInfo, + protocolVersion: server.protocolVersion || "2024-11-05" + } + }); + await send({ + jsonrpc: "2.0", + method: "notifications/initialized", + params: {} + }); + const response = await send({ + id: nextId++, + jsonrpc: "2.0", + method: "tools/list", + params: {} + }); + + return normalizeToolList(response?.result); +} + +async function listLegacySseMcpServerTools( + server: GatewayMcpRemoteServerConfig, + originalError: unknown +): Promise { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), mcpTimeoutMs(server)); + const pending = new Map(); + let endpointResolve: (endpoint: string) => void = () => {}; + let endpointReject: (error: Error) => void = () => {}; + const endpointPromise = new Promise((resolve, reject) => { + endpointResolve = resolve; + endpointReject = reject; + }); + let streamBuffer = ""; + let nextId = 1; + + try { + const response = await fetchWithSystemProxy(server.url, { + headers: mcpHttpHeaders(server, "", false), + method: "GET", + signal: controller.signal + }); + if (!response.ok || !response.body) { + throw new Error(`SSE MCP discovery failed with HTTP ${response.status}.`); + } + + const reader = response.body.getReader(); + const readLoop = (async () => { + const decoder = new TextDecoder(); + for (;;) { + const { done, value } = await reader.read(); + if (done) { + break; + } + streamBuffer += decoder.decode(value, { stream: true }); + streamBuffer = consumeSseEvents(streamBuffer, routeSseEvent); + } + })(); + readLoop.catch((error: unknown) => rejectPending(error)); + + const endpoint = await endpointPromise; + const messageUrl = new URL(endpoint, server.url).toString(); + + await request(messageUrl, "initialize", { + capabilities: {}, + clientInfo: mcpClientInfo, + protocolVersion: server.protocolVersion || "2024-11-05" + }); + await postJsonRpc(server, messageUrl, { + jsonrpc: "2.0", + method: "notifications/initialized", + params: {} + }); + const responseMessage = await request(messageUrl, "tools/list", {}); + return normalizeToolList(responseMessage.result); + } catch (error) { + if (originalError instanceof Error && !(error instanceof DOMException && error.name === "AbortError")) { + throw new Error(`${toError(error).message} Streamable HTTP fallback failed first: ${originalError.message}`); + } + throw toError(error); + } finally { + clearTimeout(timeout); + rejectPending(new Error("MCP SSE discovery closed.")); + controller.abort(); + } + + function routeSseEvent(event: SseEvent) { + if (event.event === "endpoint") { + endpointResolve(event.data.trim()); + return; + } + const message = parseJsonRpcMessage(event.data); + if (!message) { + return; + } + const key = message.id === undefined || message.id === null ? "" : String(message.id); + const request = key ? pending.get(key) : undefined; + if (!request) { + return; + } + pending.delete(key); + if (message.error) { + request.reject(new Error(jsonRpcErrorMessage(message.error))); + return; + } + request.resolve(message); + } + + function request(messageUrl: string, method: string, params: unknown): Promise { + const id = nextId++; + const message: JsonRpcMessage = { + id, + jsonrpc: "2.0", + method, + params + }; + return new Promise((resolve, reject) => { + pending.set(String(id), { reject, resolve }); + postJsonRpc(server, messageUrl, message).catch((error: unknown) => { + pending.delete(String(id)); + reject(toError(error)); + }); + }); + } + + function rejectPending(error: unknown) { + endpointReject(toError(error)); + for (const request of pending.values()) { + request.reject(toError(error)); + } + pending.clear(); + } +} + +async function postJsonRpc( + server: GatewayMcpRemoteServerConfig, + url: string, + message: JsonRpcMessage, + sessionId = "" +): Promise<{ message?: JsonRpcMessage; sessionId?: string }> { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), mcpTimeoutMs(server)); + try { + const response = await fetchWithSystemProxy(url, { + body: JSON.stringify(message), + headers: mcpHttpHeaders(server, sessionId, true), + method: "POST", + signal: controller.signal + }); + const nextSessionId = response.headers.get("mcp-session-id") ?? undefined; + const text = await response.text(); + if (!response.ok) { + throw new Error(`MCP discovery request failed with HTTP ${response.status}${text.trim() ? `: ${text.trim().slice(0, 300)}` : ""}`); + } + const parsed = parseJsonRpcMessageFromResponse(text, message.id); + if (parsed?.error) { + throw new Error(jsonRpcErrorMessage(parsed.error)); + } + return { + message: parsed, + sessionId: nextSessionId + }; + } finally { + clearTimeout(timeout); + } +} + +function writeStdioMessage( + child: ChildProcessWithoutNullStreams, + mode: GatewayMcpStdioServerConfig["stdioMessageMode"], + message: JsonRpcMessage +) { + const body = JSON.stringify(message); + if (mode === "newline-json") { + child.stdin.write(`${body}\n`); + return; + } + child.stdin.write(`Content-Length: ${Buffer.byteLength(body, "utf8")}\r\n\r\n${body}`); +} + +function createStdioMessageReader( + mode: GatewayMcpStdioServerConfig["stdioMessageMode"], + onMessage: (message: JsonRpcMessage) => void +): (chunk: Buffer) => void { + if (mode === "newline-json") { + let textBuffer = ""; + return (chunk: Buffer) => { + textBuffer += chunk.toString("utf8"); + for (;;) { + const newlineIndex = textBuffer.indexOf("\n"); + if (newlineIndex < 0) { + return; + } + const line = textBuffer.slice(0, newlineIndex).trim(); + textBuffer = textBuffer.slice(newlineIndex + 1); + const message = parseJsonRpcMessage(line); + if (message) { + onMessage(message); + } + } + }; + } + + let buffer = Buffer.alloc(0); + return (chunk: Buffer) => { + buffer = Buffer.concat([buffer, chunk]); + for (;;) { + const delimiter = contentLengthHeaderDelimiter(buffer); + if (!delimiter) { + return; + } + const header = buffer.subarray(0, delimiter.index).toString("utf8"); + const match = /content-length:\s*(\d+)/i.exec(header); + if (!match) { + buffer = buffer.subarray(delimiter.index + delimiter.length); + continue; + } + const length = Number(match[1]); + const bodyStart = delimiter.index + delimiter.length; + const bodyEnd = bodyStart + length; + if (buffer.length < bodyEnd) { + return; + } + const message = parseJsonRpcMessage(buffer.subarray(bodyStart, bodyEnd).toString("utf8")); + buffer = buffer.subarray(bodyEnd); + if (message) { + onMessage(message); + } + } + }; +} + +function contentLengthHeaderDelimiter(buffer: Buffer): { index: number; length: number } | undefined { + const crlfIndex = buffer.indexOf("\r\n\r\n"); + if (crlfIndex >= 0) { + return { index: crlfIndex, length: 4 }; + } + const lfIndex = buffer.indexOf("\n\n"); + return lfIndex >= 0 ? { index: lfIndex, length: 2 } : undefined; +} + +function parseJsonRpcMessageFromResponse(text: string, expectedId: JsonRpcMessage["id"]): JsonRpcMessage | undefined { + const trimmed = text.trim(); + if (!trimmed) { + return undefined; + } + if (trimmed.startsWith("event:") || trimmed.startsWith("data:")) { + const messages: JsonRpcMessage[] = []; + consumeSseEvents(trimmed, (event) => { + const message = parseJsonRpcMessage(event.data); + if (message) { + messages.push(message); + } + }); + return findExpectedMessage(messages, expectedId); + } + const parsed = parseJsonValue(trimmed); + const messages = Array.isArray(parsed) ? parsed : [parsed]; + return findExpectedMessage(messages.filter(isJsonRpcMessage), expectedId); +} + +function findExpectedMessage(messages: JsonRpcMessage[], expectedId: JsonRpcMessage["id"]): JsonRpcMessage | undefined { + if (expectedId === undefined || expectedId === null) { + return messages[0]; + } + return messages.find((message) => message.id === expectedId) ?? messages[0]; +} + +function consumeSseEvents(buffer: string, onEvent: (event: SseEvent) => void): string { + for (;;) { + const delimiter = sseDelimiter(buffer); + if (!delimiter) { + return buffer; + } + const block = buffer.slice(0, delimiter.index); + buffer = buffer.slice(delimiter.index + delimiter.length); + const event = parseSseEvent(block); + if (event.data) { + onEvent(event); + } + } +} + +function sseDelimiter(buffer: string): { index: number; length: number } | undefined { + const crlfIndex = buffer.indexOf("\r\n\r\n"); + if (crlfIndex >= 0) { + return { index: crlfIndex, length: 4 }; + } + const lfIndex = buffer.indexOf("\n\n"); + return lfIndex >= 0 ? { index: lfIndex, length: 2 } : undefined; +} + +function parseSseEvent(block: string): SseEvent { + let event = "message"; + const data: string[] = []; + for (const line of block.split(/\r?\n/)) { + if (line.startsWith("event:")) { + event = line.slice("event:".length).trim() || "message"; + } else if (line.startsWith("data:")) { + data.push(line.slice("data:".length).trimStart()); + } + } + return { + data: data.join("\n"), + event + }; +} + +function mcpHttpHeaders(server: GatewayMcpRemoteServerConfig, sessionId = "", includeBodyHeaders = true): Record { + const headers: Record = { + Accept: "application/json, text/event-stream", + ...server.headers + }; + if (includeBodyHeaders) { + headers["Content-Type"] = "application/json"; + } + if (server.protocolVersion) { + headers["MCP-Protocol-Version"] = server.protocolVersion; + } + if (sessionId) { + headers["Mcp-Session-Id"] = sessionId; + } + const apiKey = server.apiKey || (server.apiKeyEnv ? process.env[server.apiKeyEnv] : ""); + if (apiKey && !hasHeader(headers, "authorization")) { + headers.Authorization = `Bearer ${apiKey}`; + } + return headers; +} + +function hasHeader(headers: Record, name: string): boolean { + const normalized = name.toLowerCase(); + return Object.keys(headers).some((key) => key.toLowerCase() === normalized); +} + +function mcpTimeoutMs(server: GatewayMcpServerConfig): number { + return Math.max(1000, Math.min(600000, server.startupTimeoutMs || server.requestTimeoutMs || 30000)); +} + +function normalizeToolList(value: unknown): GatewayMcpToolInfo[] { + const tools = isRecord(value) && Array.isArray(value.tools) ? value.tools : []; + return tools + .filter(isRecord) + .map((tool): GatewayMcpToolInfo | undefined => { + const name = stringValue(tool.name); + if (!name) { + return undefined; + } + const inputSchema = normalizeToolInputSchema(tool); + return { + ...(stringValue(tool.description) ? { description: stringValue(tool.description) } : {}), + inputSchema, + name + }; + }) + .filter((tool): tool is GatewayMcpToolInfo => Boolean(tool)); +} + +function normalizeToolInputSchema(tool: Record): Record { + const candidates = [ + tool.inputSchema, + tool.input_schema, + tool.parameters, + tool.schema + ]; + for (const candidate of candidates) { + const parsed = normalizeSchemaCandidate(candidate); + if (parsed) { + return parsed; + } + } + return { properties: {}, type: "object" }; +} + +function normalizeSchemaCandidate(value: unknown): Record | undefined { + if (isRecord(value)) { + return { ...value }; + } + if (typeof value !== "string" || !value.trim()) { + return undefined; + } + const parsed = parseJsonValue(value); + return isRecord(parsed) ? { ...parsed } : undefined; +} + +function parseJsonRpcMessage(value: string): JsonRpcMessage | undefined { + return isJsonRpcMessage(parseJsonValue(value)) ? parseJsonValue(value) as JsonRpcMessage : undefined; +} + +function parseJsonValue(value: string): unknown { + try { + return JSON.parse(value); + } catch { + return undefined; + } +} + +function isJsonRpcMessage(value: unknown): value is JsonRpcMessage { + return isRecord(value); +} + +function jsonRpcErrorMessage(error: unknown): string { + if (isRecord(error)) { + const message = stringValue(error.message); + if (message) { + return message; + } + } + return typeof error === "string" ? error : "MCP JSON-RPC request failed."; +} + +function toError(error: unknown): Error { + return error instanceof Error ? error : new Error(String(error)); +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function stringValue(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} diff --git a/packages/core/src/mcp/toolhub-config.ts b/packages/core/src/mcp/toolhub-config.ts new file mode 100644 index 0000000..5c4cbd1 --- /dev/null +++ b/packages/core/src/mcp/toolhub-config.ts @@ -0,0 +1,226 @@ +import { join as pathJoin } from "node:path"; +import { CONFIGDIR } from "@ccr/core/config/constants"; +import type { AppConfig, GatewayMcpServerConfig } from "@ccr/core/contracts/app"; + +export const TOOL_HUB_MCP_SERVER_NAME = "ccr-toolhub"; +export const TOOL_HUB_MCP_RUNTIME_FILE_NAME = "toolhub-mcp.js"; +export const BROWSER_AUTOMATION_MCP_SERVER_NAME = "ccr-browser-automation"; +export const BROWSER_AUTOMATION_MCP_PATH = "/__ccr/browser-automation/mcp"; +export const BROWSER_AUTOMATION_HANDOFF_TIMEOUT_MS = 600000; +export const TOOL_HUB_DEFAULT_REQUEST_TIMEOUT_MS = 60000; + +export type ToolHubMcpRuntimeConfig = { + args: string[]; + command: string; + env: Record; +}; + +export type ClaudeCodeMcpServerConfig = ToolHubMcpRuntimeConfig | { + args?: string[]; + command: string; + cwd?: string; + env?: Record; +} | { + headers?: Record; + type: "http" | "sse"; + url: string; +}; + +export type ToolHubClaudeCodeMcpConfig = { + mcpServers: Record; +}; + +export function toolHubBackendServers( + config: AppConfig | undefined, + extraServers: unknown[] = [], + options: { + apiKey?: string; + includeBuiltIns?: boolean; + } = {} +): unknown[] { + return [ + ...(options.includeBuiltIns === false ? [] : toolHubBuiltInBackendServers(config, options)), + ...(Array.isArray(config?.agent?.mcpServers) ? config.agent.mcpServers : []), + ...(Array.isArray(config?.toolHub?.mcpServers) ? config.toolHub.mcpServers : []), + ...extraServers + ].filter(isToolHubBackendServer); +} + +export function toolHubBuiltInBackendServers( + config: AppConfig | undefined, + options: { + apiKey?: string; + } = {} +): GatewayMcpServerConfig[] { + if (!config || !browserAutomationMcpEnabled(config) || !hasGatewayEndpoint(config)) { + return []; + } + + return [ + { + apiKey: options.apiKey || firstConfiguredApiKey(config), + headers: {}, + name: BROWSER_AUTOMATION_MCP_SERVER_NAME, + protocolVersion: "2024-11-05", + requestTimeoutMs: BROWSER_AUTOMATION_HANDOFF_TIMEOUT_MS, + startupTimeoutMs: 60000, + transport: "streamable-http", + url: `${gatewayEndpoint(config)}${BROWSER_AUTOMATION_MCP_PATH}` + } + ]; +} + +export function browserAutomationMcpEnabled(config: AppConfig | undefined): boolean { + return Boolean(config?.toolHub?.enabled && config.toolHub.browserAutomation); +} + +export function toolHubMcpRuntimeConfig( + config: AppConfig | undefined, + backendServers?: unknown[], + options: { + command?: string; + entryPath?: string; + resolver?: { + apiKey?: string; + baseUrl?: string; + model?: string; + }; + } = {} +): ToolHubMcpRuntimeConfig | undefined { + const toolHub = config?.toolHub; + if (!toolHub?.enabled) { + return undefined; + } + + const resolvedBackendServers = backendServers ?? toolHubBackendServers(config, [], { + apiKey: options.resolver?.apiKey + }); + const normalizedBackendServers = resolvedBackendServers.filter(isToolHubBackendServer); + if (normalizedBackendServers.length === 0) { + return undefined; + } + const requestTimeoutMs = toolHubRequestTimeoutMs(config, normalizedBackendServers); + + return { + args: [options.entryPath ?? bundledToolHubMcpEntryPath()], + command: options.command ?? process.execPath, + env: { + ELECTRON_RUN_AS_NODE: "1", + TOOLHUB_CACHE_FILE: pathJoin(CONFIGDIR, "toolhub-cache.json"), + TOOLHUB_MAX_TOOLS: String(toolHub.maxTools ?? 10), + TOOLHUB_MCP_SERVERS_JSON: JSON.stringify(normalizedBackendServers), + TOOLHUB_OPENAI_API_KEY: options.resolver?.apiKey ?? toolHub.llm?.apiKey ?? "", + TOOLHUB_OPENAI_BASE_URL: options.resolver?.baseUrl ?? toolHub.llm?.baseUrl ?? "https://api.openai.com/v1", + TOOLHUB_OPENAI_MODEL: options.resolver?.model ?? toolHub.llm?.model ?? "", + TOOLHUB_REQUEST_TIMEOUT_MS: String(requestTimeoutMs) + } + }; +} + +export function toolHubRequestTimeoutMs(config: AppConfig | undefined, backendServers?: unknown[]): number { + const configuredTimeout = positiveInteger(config?.toolHub?.requestTimeoutMs, TOOL_HUB_DEFAULT_REQUEST_TIMEOUT_MS); + const backendTimeouts = (backendServers ?? toolHubBackendServers(config)) + .map((server) => isRecord(server) ? positiveInteger(server.requestTimeoutMs, 0) : 0); + return Math.max(configuredTimeout, ...backendTimeouts); +} + +export function toolHubClaudeCodeMcpConfig( + config: AppConfig | undefined, + options: Parameters[2] = {} +): ToolHubClaudeCodeMcpConfig | undefined { + const toolHub = config?.toolHub; + if (!toolHub?.enabled) { + return undefined; + } + + const backendServers = toolHubBackendServers(config, [], { + apiKey: options.resolver?.apiKey + }); + if (backendServers.length === 0) { + return undefined; + } + + const runtimeConfig = toolHubMcpRuntimeConfig(config, backendServers, options); + return runtimeConfig + ? { mcpServers: { [TOOL_HUB_MCP_SERVER_NAME]: runtimeConfig } } + : undefined; +} + +export function bundledToolHubMcpEntryPath(): string { + return pathJoin(__dirname, TOOL_HUB_MCP_RUNTIME_FILE_NAME); +} + +export function bundledToolHubMcpEntryPathCandidates(): string[] { + const resourcesPath = (process as NodeJS.Process & { resourcesPath?: string }).resourcesPath; + return uniqueStrings([ + bundledToolHubMcpEntryPath(), + ...(resourcesPath + ? [ + pathJoin(resourcesPath, "app.asar", "dist", "main", TOOL_HUB_MCP_RUNTIME_FILE_NAME), + pathJoin(resourcesPath, "app", "dist", "main", TOOL_HUB_MCP_RUNTIME_FILE_NAME) + ] + : []), + pathJoin(process.cwd(), "packages", "electron", "dist", "main", TOOL_HUB_MCP_RUNTIME_FILE_NAME), + pathJoin(process.cwd(), "packages", "cli", "dist", "main", TOOL_HUB_MCP_RUNTIME_FILE_NAME), + pathJoin(process.cwd(), "packages", "core", "dist", "main", TOOL_HUB_MCP_RUNTIME_FILE_NAME), + pathJoin(process.cwd(), "dist", "main", TOOL_HUB_MCP_RUNTIME_FILE_NAME) + ]); +} + +function isToolHubBackendServer(value: unknown): value is Record { + return isRecord(value) && stringValue(value.name)?.toLowerCase() !== TOOL_HUB_MCP_SERVER_NAME; +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function stringValue(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function firstConfiguredApiKey(config: AppConfig): string | undefined { + return (Array.isArray(config.APIKEYS) ? config.APIKEYS : []) + .find((apiKey) => apiKey.key.trim())?.key.trim() || stringValue(config.APIKEY); +} + +function positiveInteger(value: unknown, fallback: number): number { + return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.trunc(value) : fallback; +} + +function gatewayEndpoint(config: AppConfig): string { + return `http://${formatHost(clientGatewayHost(config.gateway.host))}:${config.gateway.port}`; +} + +function hasGatewayEndpoint(config: AppConfig): boolean { + const gateway = (config as Partial).gateway; + return Boolean(gateway && stringValue(gateway.host) && Number.isFinite(gateway.port)); +} + +function formatHost(host: string): string { + return host.includes(":") && !host.startsWith("[") ? `[${host}]` : host; +} + +function clientGatewayHost(host: string): string { + const value = stringValue(host) ?? "127.0.0.1"; + if (value === "0.0.0.0") { + return "127.0.0.1"; + } + if (value === "::" || value === "[::]") { + return "::1"; + } + return value; +} + +function uniqueStrings(values: string[]): string[] { + const seen = new Set(); + const result: string[] = []; + for (const value of values) { + if (!value || seen.has(value)) { + continue; + } + seen.add(value); + result.push(value); + } + return result; +} diff --git a/packages/core/src/mcp/toolhub-mcp.ts b/packages/core/src/mcp/toolhub-mcp.ts new file mode 100644 index 0000000..9d440d9 --- /dev/null +++ b/packages/core/src/mcp/toolhub-mcp.ts @@ -0,0 +1,2944 @@ +#!/usr/bin/env node +import { spawn, type ChildProcessWithoutNullStreams } from "node:child_process"; +import { createHash, randomUUID } from "node:crypto"; +import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import OpenAI from "openai"; + +type JsonPrimitive = boolean | null | number | string; +type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue }; + +type JsonRpcRequest = { + error?: { + code?: number; + message?: string; + }; + id?: null | number | string; + jsonrpc?: string; + method?: string; + params?: unknown; + result?: unknown; +}; + +type JsonRpcResponse = + | { + id: null | number | string; + jsonrpc: "2.0"; + result: JsonValue; + } + | { + error: { + code: number; + data?: JsonValue; + message: string; + }; + id: null | number | string; + jsonrpc: "2.0"; + }; + +type GatewayMcpServerBaseConfig = { + label?: string; + name: string; + protocolVersion?: string; + requestTimeoutMs?: number; + startupTimeoutMs?: number; + transport: "stdio" | "streamable-http" | "sse"; +}; + +type GatewayMcpStdioServerConfig = GatewayMcpServerBaseConfig & { + args?: string[]; + command: string; + cwd?: string; + env?: Record; + stdioMessageMode?: "content-length" | "newline-json"; + transport: "stdio"; +}; + +type GatewayMcpRemoteServerConfig = GatewayMcpServerBaseConfig & { + apiKey?: string; + apiKeyEnv?: string; + headers?: Record; + transport: "streamable-http" | "sse"; + url: string; +}; + +type GatewayMcpServerConfig = GatewayMcpStdioServerConfig | GatewayMcpRemoteServerConfig; + +type ToolDefinition = { + description?: string; + inputSchema?: Record; + name: string; + outputSchema?: Record; + tags?: string[]; + title?: string; +}; + +type ToolInvocation = { + mode: "both" | "invoke" | "workflow"; + sideEffect: boolean; +}; + +type CatalogEntry = { + alias: string; + canonicalName: string; + description: string; + inputSchema?: Record; + invocation: ToolInvocation; + outputSchema?: Record; + remoteToolName: string; + serverId: string; + serverLabel?: string; + serverName: string; + serverNamespace: string; + status: "offline" | "online" | "unknown"; + tags: string[]; + title: string; + toolName: string; +}; + +type McpClient = { + callTool(name: string, args: Record): Promise; + close(): Promise; + listTools(): Promise; +}; + +type PendingRequest = { + reject: (error: Error) => void; + resolve: (message: JsonRpcRequest) => void; + timer: ReturnType; +}; + +type MessageMode = "content-length" | "newline-json"; + +type ResolveInput = { + constraints?: { + allowSideEffects?: boolean; + latencyBudgetMs?: number; + maxTools?: number; + preferWorkflow?: boolean; + }; + context?: Record; + task?: string; + __codeToolScopeKey?: string; + __toolHubScopeKey?: string; +}; + +type CodeToolSessionState = { + inFlightResolves: Map>; + loadedTools: Set; + recentObservations: Array<{ + resultSummary: string; + toolName: string; + }>; + recentlyResolvedTasks: Array<{ + observationCount: number; + resolvedAt: number; + taskHash: string; + toolNames: string[]; + }>; +}; + +type LlmToolResolution = { + plannedSteps?: string[]; + referencedTokens?: string[]; + selectedTools: CatalogEntry[]; + summary: string; + workflowSketch?: string; +}; + +type ResolveOutput = { + alreadyResolved?: boolean; + executionPlanInstructions?: string; + executionPlanJs?: string; + nextAction?: { + confirmationRequiredFor: string[]; + firstAction: { + missingArguments?: string[]; + toolName?: string; + type: "ask_user" | "invoke_tool"; + }; + instruction: string; + requiredArgumentsByTool: Array<{ + requiredArguments: string[]; + sideEffect: boolean; + toolName: string; + }>; + }; + plannedSteps?: string[]; + reasoningSummary: string; + referencedTokens?: string[]; + retriever?: "llm" | "local"; + runtimeContext?: { + availableContextKeys: string[]; + summary: string[]; + }; + selectedToolNames: string[]; + selectedTools: CatalogEntry[]; + tsDefinitions?: string; + usedLlm?: boolean; + workflowSketch?: string; +}; + +const protocolVersion = "2024-11-05"; +const toolHubServerName = "ccr-toolhub"; +const resolveToolName = "tool_hub.resolve"; +const invokeToolName = "tool_hub.invoke"; +const defaultRequestTimeoutMs = 60_000; +const defaultMaxTools = 10; +const discoveryCacheMaxAgeMs = 10_000; +const repeatedResolveWindowMs = 5 * 60_000; +const executionPlanInstructions = [ + "Treat executionPlanJs as the dependency plan for ToolHub invocations.", + "Each callTool(toolName, args) call maps to one tool_hub.invoke call with tool=toolName and args=args.", + "await means the next ToolHub invocation depends on the previous result and must not be started early.", + "Only callTool calls inside the same Promise.all([...]) expression may be issued as parallel tool calls.", + "If a later call needs values from an earlier result, wait for that earlier result and fill the arguments after it returns." +].join(" "); +const reservedJavaScriptWords = new Set( + "await break case catch class const continue debugger default delete do else enum export extends false finally for function if import in instanceof new null return super switch this throw true try typeof var void while with yield" + .split(" ") +); + +type RuntimeLike = { + callTool(params: unknown): Promise; + close(): void; +}; + +let runtime: RuntimeLike; +let inputBuffer = Buffer.alloc(0); +let lastMessageMode: MessageMode = "content-length"; + +process.stdin.on("data", (chunk) => { + inputBuffer = Buffer.concat([inputBuffer, Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)]); + drainInputBuffer().catch((error) => { + writeJsonRpc(jsonRpcError(null, -32603, formatError(error)), lastMessageMode); + }); +}); + +process.stdin.resume(); + +process.on("exit", () => { + runtime.close(); +}); + +async function drainInputBuffer(): Promise { + while (true) { + discardLeadingNewlines(); + if (inputBuffer.length === 0) { + return; + } + + if (!startsWithContentLengthHeader(inputBuffer)) { + const newline = inputBuffer.indexOf("\n"); + if (newline < 0) { + return; + } + const message = inputBuffer.subarray(0, newline).toString("utf8").trim(); + inputBuffer = inputBuffer.subarray(newline + 1); + if (!message) { + continue; + } + await handleJsonRpcMessage(message, "newline-json"); + continue; + } + + const headerEnd = inputBuffer.indexOf("\r\n\r\n"); + if (headerEnd < 0) { + return; + } + + const headerText = inputBuffer.subarray(0, headerEnd).toString("utf8"); + const lengthMatch = headerText.match(/content-length:\s*(\d+)/i); + if (!lengthMatch) { + inputBuffer = inputBuffer.subarray(headerEnd + 4); + writeJsonRpc(jsonRpcError(null, -32600, "Missing Content-Length header."), "content-length"); + continue; + } + + const contentLength = Number(lengthMatch[1]); + const messageStart = headerEnd + 4; + const messageEnd = messageStart + contentLength; + if (inputBuffer.length < messageEnd) { + return; + } + + const message = inputBuffer.subarray(messageStart, messageEnd).toString("utf8"); + inputBuffer = inputBuffer.subarray(messageEnd); + await handleJsonRpcMessage(message, "content-length"); + } +} + +function discardLeadingNewlines(): void { + while (inputBuffer[0] === 10 || inputBuffer[0] === 13) { + inputBuffer = inputBuffer.subarray(1); + } +} + +function startsWithContentLengthHeader(buffer: Buffer): boolean { + return /^content-length\s*:/i.test(buffer.subarray(0, Math.min(buffer.length, 64)).toString("utf8")); +} + +async function handleJsonRpcMessage(message: string, messageMode: MessageMode): Promise { + lastMessageMode = messageMode; + let payload: unknown; + try { + payload = JSON.parse(message) as unknown; + } catch (error) { + writeJsonRpc(jsonRpcError(null, -32700, `Invalid JSON-RPC request: ${formatError(error)}`), messageMode); + return; + } + + const response = await handleJsonRpcRequest(payload); + if (response) { + writeJsonRpc(response, messageMode); + } +} + +async function handleJsonRpcRequest(payload: unknown): Promise { + if (!isRecord(payload)) { + return jsonRpcError(null, -32600, "JSON-RPC request must be an object."); + } + + const request = payload as JsonRpcRequest; + const id = request.id ?? null; + if (request.id === undefined && request.method?.startsWith("notifications/")) { + return undefined; + } + if (request.jsonrpc !== "2.0" || !request.method) { + return jsonRpcError(id, -32600, "Invalid JSON-RPC 2.0 request."); + } + + try { + switch (request.method) { + case "initialize": + return jsonRpcResult(id, { + capabilities: { + tools: {} + }, + protocolVersion, + serverInfo: { + name: toolHubServerName, + title: "CCR ToolHub", + version: "1.0.0" + } + }); + case "ping": + return jsonRpcResult(id, {}); + case "tools/list": + return jsonRpcResult(id, { tools: metaTools() as unknown as JsonValue }); + case "tools/call": + return jsonRpcResult(id, await runtime.callTool(request.params) as JsonValue); + default: + return jsonRpcError(id, -32601, `Unsupported MCP method: ${request.method}`); + } + } catch (error) { + return jsonRpcError(id, -32603, formatError(error)); + } +} + +class ToolHubRuntime { + private readonly clients = new Map(); + private readonly registry = new ToolHubRegistry((serverName, config) => this.clientForServer(serverName, config)); + private readonly sessions = new Map(); + + async callTool(params: unknown): Promise { + const name = isRecord(params) && typeof params.name === "string" ? params.name.trim() : ""; + const args = isRecord(params) && isRecord(params.arguments) ? params.arguments : {}; + if (name === resolveToolName || name === "tool_hub_resolve" || name === "code_tool.resolve" || name === "code_tool_resolve") { + return this.resolveTools(args as ResolveInput); + } + if (name === invokeToolName || name === "tool_hub_invoke" || name === "code_tool.invoke" || name === "code_tool_invoke") { + return this.invokeTool(args); + } + throw new Error(`Unknown ToolHub meta tool: ${name}`); + } + + close(): void { + for (const entry of this.clients.values()) { + void entry.client.close(); + } + this.clients.clear(); + this.sessions.clear(); + } + + private async resolveTools(input: ResolveInput): Promise { + const task = typeof input.task === "string" ? input.task.trim() : ""; + if (!task) { + throw new Error(`${resolveToolName} requires task.`); + } + const maxTools = normalizeMaxTools(input.constraints?.maxTools ?? envNumber("TOOLHUB_MAX_TOOLS", defaultMaxTools)); + const scopeKey = this.scopeKey(input); + const session = this.session(scopeKey); + const taskHash = normalizeResolveTaskKey(task); + + this.registry.updateServers(readBackendServers()); + let catalog = await this.registry.listTools(); + if (catalog.length === 0) { + await this.registry.refreshServers(undefined, true); + catalog = await this.registry.listTools(); + } + if (taskWantsChromeLoginImport(task) && !catalogHasChromeLoginImportTool(catalog)) { + await this.registry.refreshServers(["ccr-browser-automation"], true); + catalog = await this.registry.listTools(); + } + if (catalog.length === 0) { + throw new Error("No MCP tools are available to resolve."); + } + + const cached = this.findRecentlyResolvedTask(scopeKey, taskHash); + if (cached) { + const selectedTools = expandToolBundleWithCompanionTools( + uniqueToolEntries([ + ...cached.toolNames + .map((toolName) => this.resolveCatalogEntry(toolName, catalog)) + .filter((entry): entry is CatalogEntry => Boolean(entry)), + ...getDeterministicTaskTools(task, catalog) + ]), + catalog + ); + if (selectedTools.length > 0) { + this.markToolsLoaded(scopeKey, selectedTools); + return toolResult(this.buildRepeatedResolveOutput(selectedTools)); + } + } + + const inFlightResolve = session.inFlightResolves.get(taskHash); + if (inFlightResolve) { + const output = await inFlightResolve; + const selectedTools = expandToolBundleWithCompanionTools( + uniqueToolEntries([ + ...output.selectedTools + .map((tool) => this.resolveCatalogEntry(tool.toolName, catalog) ?? tool) + .filter((entry): entry is CatalogEntry => Boolean(entry)), + ...getDeterministicTaskTools(task, catalog) + ]), + catalog + ); + if (selectedTools.length > 0) { + this.markToolsLoaded(scopeKey, selectedTools); + return toolResult(this.buildRepeatedResolveOutput(selectedTools)); + } + return toolResult(output); + } + + const resolvePromise = this.executeFreshResolve({ + catalog, + context: input.context, + maxTools, + observations: session.recentObservations.slice(-5), + scopeKey, + task, + taskHash, + timeoutMs: input.constraints?.latencyBudgetMs, + withoutSideEffects: input.constraints?.allowSideEffects === false + }); + session.inFlightResolves.set(taskHash, resolvePromise); + try { + return toolResult(await resolvePromise); + } finally { + if (session.inFlightResolves.get(taskHash) === resolvePromise) { + session.inFlightResolves.delete(taskHash); + } + } + } + + private async invokeTool(args: Record): Promise { + const requestedTool = typeof args.tool === "string" ? args.tool.trim() : ""; + if (!requestedTool) { + throw new Error(`${invokeToolName} requires tool.`); + } + const scopeKey = this.scopeKey(args); + this.registry.updateServers(readBackendServers()); + const catalog = await this.registry.listTools(); + const entry = this.resolveCatalogEntry(requestedTool, catalog); + if (!entry) { + return toolError("UNKNOWN_TOOL", `Unknown ToolHub tool: ${requestedTool}`); + } + if (!this.session(scopeKey).loadedTools.has(entry.toolName)) { + return toolError("TOOL_NOT_RESOLVED", `Tool ${entry.toolName} is not loaded in this session. Call ${resolveToolName} for the task first.`); + } + const toolArgs = isRecord(args.args) ? args.args : {}; + const client = this.clientForServer(entry.serverName); + const result = await client.callTool(entry.remoteToolName, toolArgs); + this.rememberObservation(scopeKey, entry.toolName, result); + return result; + } + + private async executeFreshResolve(input: { + catalog: CatalogEntry[]; + context?: Record; + maxTools: number; + observations: CodeToolSessionState["recentObservations"]; + scopeKey: string; + task: string; + taskHash: string; + timeoutMs?: number; + withoutSideEffects: boolean; + }): Promise { + let resolution: LlmToolResolution; + let retriever: NonNullable = "llm"; + let usedLlm = true; + try { + resolution = await this.resolveCatalogWithLlm(input); + } catch (error) { + resolution = this.resolveCatalogLocally({ ...input, error }); + if (resolution.selectedTools.length === 0) { + throw error; + } + retriever = "local"; + usedLlm = false; + } + + let selectedTools = expandToolBundleWithCompanionTools( + uniqueToolEntries([ + ...resolution.selectedTools, + ...getDeterministicTaskTools(input.task, input.catalog) + ]), + input.catalog + ); + if (input.withoutSideEffects) { + selectedTools = selectedTools.filter((tool) => !tool.invocation.sideEffect); + } + if (selectedTools.length === 0) { + throw new Error("ToolHub could not resolve any matching MCP tools for this task."); + } + + this.markToolsLoaded(input.scopeKey, selectedTools); + this.rememberResolvedTask(input.scopeKey, input.taskHash, selectedTools); + const executionPlanJs = buildExecutionPlanJs(resolution.workflowSketch, selectedTools); + return { + ...this.buildResolveOutput(resolution.summary, selectedTools, executionPlanJs), + plannedSteps: resolution.plannedSteps, + referencedTokens: resolution.referencedTokens, + retriever, + usedLlm, + workflowSketch: executionPlanJs + }; + } + + private async resolveCatalogWithLlm(input: { + catalog: CatalogEntry[]; + context?: Record; + maxTools: number; + observations: CodeToolSessionState["recentObservations"]; + task: string; + timeoutMs?: number; + }): Promise { + const searchAgent = new OpenAiToolHubSearchAgent({ + openAiApiKey: env("TOOLHUB_OPENAI_API_KEY"), + openAiBaseUrl: env("TOOLHUB_OPENAI_BASE_URL") || "https://api.openai.com/v1", + openAiModel: env("TOOLHUB_OPENAI_MODEL") + }); + const result = await searchAgent.search({ + catalog: input.catalog.map(toSearchCatalogItem), + code: JSON.stringify({ + context: input.context ?? {}, + observations: input.observations ?? [] + }), + query: input.task, + timeoutMs: input.timeoutMs ?? envNumber("TOOLHUB_REQUEST_TIMEOUT_MS", defaultRequestTimeoutMs), + topK: input.maxTools + }); + const selectedTools = result.selectedToolNames + .map((toolName) => this.resolveCatalogEntry(toolName, input.catalog)) + .filter((entry): entry is CatalogEntry => Boolean(entry)) + .slice(0, input.maxTools); + return { + plannedSteps: result.plannedSteps, + referencedTokens: result.referencedTokens, + selectedTools, + summary: result.summary, + workflowSketch: result.workflowSketch + }; + } + + private resolveCatalogLocally(input: { + catalog: CatalogEntry[]; + context?: Record; + error: unknown; + maxTools: number; + observations: CodeToolSessionState["recentObservations"]; + task: string; + }): LlmToolResolution { + const taskText = [ + input.task, + input.context ? JSON.stringify(input.context) : "", + ...input.observations.map((observation) => `${observation.toolName} ${observation.resultSummary}`) + ].join(" "); + const preferredToolNames = getLocalFallbackPreferredTools(taskText); + const scored = input.catalog + .map((tool, index) => ({ + index, + score: scoreLocalCatalogMatch(taskText, tool, preferredToolNames), + tool + })) + .filter((item) => item.score > 0) + .sort((left, right) => right.score - left.score || left.index - right.index); + const selectedTools = uniqueToolEntries(scored.map((item) => item.tool)).slice(0, input.maxTools); + return { + plannedSteps: selectedTools.length > 0 + ? [ + "Resolve retrieval LLM did not finish within the latency budget.", + "Selected candidate tools with local catalog matching." + ] + : undefined, + referencedTokens: tokenizeLocalSearchText(taskText), + selectedTools, + summary: `Resolve retrieval fell back to local catalog matching after LLM retrieval failed: ${formatError(input.error)}.`, + workflowSketch: buildLocalFallbackWorkflowSketch(selectedTools) + }; + } + + private clientForServer(serverName: string, config?: GatewayMcpServerConfig): McpClient { + const server = config ?? readBackendServers().find((candidate) => candidate.name === serverName); + if (!server) { + throw new Error(`ToolHub backend MCP server not found: ${serverName}`); + } + const existing = this.clients.get(serverName); + const configHash = hashToolHubMcpServerConfig(server); + if (existing && existing.configHash === configHash) { + return existing.client; + } + void existing?.client.close(); + const client = server.transport === "stdio" + ? new StdioMcpClient(server) + : server.transport === "sse" + ? new SseMcpClient(server) + : new HttpMcpClient(server); + this.clients.set(serverName, { client, configHash }); + return client; + } + + private resolveCatalogEntry(nameOrAlias: string, catalog: CatalogEntry[]): CatalogEntry | undefined { + const resolvedName = resolveCatalogItemName(catalog.map((entry) => ({ + alias: entry.alias, + canonicalName: entry.canonicalName, + name: entry.toolName, + remoteToolName: entry.remoteToolName + })), nameOrAlias); + if (!resolvedName) { + return undefined; + } + return catalog.find((entry) => entry.toolName === resolvedName); + } + + private buildResolveOutput(summary: string, selectedTools: CatalogEntry[], executionPlanJs = buildSequentialExecutionPlanJs(selectedTools)): ResolveOutput { + return { + executionPlanInstructions, + executionPlanJs, + nextAction: this.buildResolveNextAction(selectedTools), + reasoningSummary: summary, + runtimeContext: { + availableContextKeys: ["selectedTools", "executionPlanJs", "executionPlanInstructions"], + summary: [ + ...selectedTools.map((tool) => `${tool.toolName}: ${tool.description || tool.title}`), + "Follow executionPlanJs for dependency ordering before invoking selected tools." + ] + }, + selectedToolNames: selectedTools.map((tool) => tool.toolName), + selectedTools, + tsDefinitions: buildTsDefinitions(selectedTools), + workflowSketch: executionPlanJs + }; + } + + private buildRepeatedResolveOutput(selectedTools: CatalogEntry[]): ResolveOutput { + const nextAction = this.buildResolveNextAction(selectedTools); + const executionPlanJs = buildSequentialExecutionPlanJs(selectedTools); + return { + alreadyResolved: true, + executionPlanInstructions, + executionPlanJs, + nextAction, + reasoningSummary: [ + "This task has already been resolved in the current ToolHub session.", + nextAction.instruction + ].join(" "), + runtimeContext: { + availableContextKeys: ["selectedTools", "nextAction", "executionPlanJs", "executionPlanInstructions"], + summary: [ + "The selected tools are already loaded for tool_hub.invoke.", + "Do not repeat discovery for this task.", + nextAction.instruction, + "Follow executionPlanJs for dependency ordering before invoking selected tools." + ] + }, + selectedToolNames: selectedTools.map((tool) => tool.toolName), + selectedTools, + workflowSketch: executionPlanJs + }; + } + + private buildResolveNextAction(selectedTools: CatalogEntry[]): NonNullable { + const requiredArgumentsByTool = selectedTools + .map((tool) => ({ + requiredArguments: getSchemaRequiredProperties(tool.inputSchema), + sideEffect: tool.invocation.sideEffect, + toolName: tool.toolName + })) + .filter((item) => item.requiredArguments.length > 0); + const confirmationRequiredFor = selectedTools + .filter((tool) => tool.invocation.sideEffect) + .map((tool) => tool.toolName); + const firstTool = selectFirstActionTool(selectedTools); + const firstRequiredArguments = firstTool ? getSchemaRequiredProperties(firstTool.inputSchema) : []; + const firstAction = firstRequiredArguments.length > 0 + ? { + missingArguments: firstRequiredArguments, + toolName: firstTool?.toolName, + type: "ask_user" as const + } + : { + toolName: firstTool?.toolName, + type: "invoke_tool" as const + }; + const instructionParts = [ + "Do not call tool_hub.resolve again for this task.", + "Follow executionPlanJs: await is serial dependency; only Promise.all groups may run in parallel." + ]; + if (firstTool && firstRequiredArguments.length > 0) { + instructionParts.push(`Ask the user for missing required arguments for ${firstTool.toolName}: ${firstRequiredArguments.join(", ")}.`); + } else if (firstTool) { + instructionParts.push(`Call tool_hub.invoke for ${firstTool.toolName}.`); + } else { + instructionParts.push("Ask the user for the missing task details before invoking tools."); + } + if (confirmationRequiredFor.length > 0) { + instructionParts.push(`Before calling side-effecting tools, ask for explicit confirmation: ${confirmationRequiredFor.join(", ")}.`); + } + return { + confirmationRequiredFor, + firstAction, + instruction: instructionParts.join(" "), + requiredArgumentsByTool + }; + } + + private scopeKey(input: Record): string { + return readNonEmptyString(input.__toolHubScopeKey) || readNonEmptyString(input.__codeToolScopeKey) || "default"; + } + + private session(scopeKey: string): CodeToolSessionState { + const existing = this.sessions.get(scopeKey); + if (existing) { + return existing; + } + const session: CodeToolSessionState = { + inFlightResolves: new Map(), + loadedTools: new Set(), + recentObservations: [], + recentlyResolvedTasks: [] + }; + this.sessions.set(scopeKey, session); + return session; + } + + private markToolsLoaded(scopeKey: string, entries: CatalogEntry[]): void { + const session = this.session(scopeKey); + for (const entry of entries) { + session.loadedTools.add(entry.toolName); + } + } + + private rememberResolvedTask(scopeKey: string, taskHash: string, entries: CatalogEntry[]): void { + const session = this.session(scopeKey); + session.recentlyResolvedTasks = session.recentlyResolvedTasks.filter((item) => item.taskHash !== taskHash); + session.recentlyResolvedTasks.unshift({ + observationCount: session.recentObservations.length, + resolvedAt: Date.now(), + taskHash, + toolNames: entries.map((entry) => entry.toolName) + }); + session.recentlyResolvedTasks = session.recentlyResolvedTasks.slice(0, 10); + } + + private findRecentlyResolvedTask(scopeKey: string, taskHash: string): CodeToolSessionState["recentlyResolvedTasks"][number] | undefined { + const session = this.session(scopeKey); + const now = Date.now(); + session.recentlyResolvedTasks = session.recentlyResolvedTasks.filter((item) => now - item.resolvedAt <= repeatedResolveWindowMs); + return session.recentlyResolvedTasks.find((item) => item.taskHash === taskHash); + } + + private rememberObservation(scopeKey: string, toolName: string, result: unknown): void { + const session = this.session(scopeKey); + session.recentObservations.push({ + resultSummary: summarizeValue(result), + toolName + }); + session.recentObservations = session.recentObservations.slice(-20); + } +} + +class ToolHubRegistry { + private discoveryPromise: Promise | undefined; + private readonly entries = new Map(); + + constructor(private readonly clientFactory: (serverName: string, config?: GatewayMcpServerConfig) => McpClient) {} + + updateServers(servers: GatewayMcpServerConfig[]): void { + const nextServerNames = new Set(); + for (const server of servers) { + nextServerNames.add(server.name); + const configHash = hashToolHubMcpServerConfig(server); + const existing = this.entries.get(server.name); + if (existing && existing.configHash === configHash) { + existing.config = cloneServerConfig(server); + continue; + } + const cachedDiscovery = toolHubPersistentCache.readDiscovery(server.name, configHash); + this.entries.set(server.name, { + config: cloneServerConfig(server), + configHash, + lastCheckedAt: cachedDiscovery?.cachedAt, + lastSeenOnlineAt: cachedDiscovery?.lastSeenOnlineAt, + loadedFromCache: Boolean(cachedDiscovery), + status: "unknown", + tools: cachedDiscovery?.tools.map((tool) => ({ ...tool })) ?? [] + }); + } + + for (const serverName of this.entries.keys()) { + if (!nextServerNames.has(serverName)) { + this.entries.delete(serverName); + } + } + } + + async listTools(): Promise { + await this.ensureDiscoveryFresh(); + return this.listCatalogEntriesSync(); + } + + async refreshServers(serverNames?: string[], force = true): Promise { + const targetServerNames = normalizeTargetServerNames(serverNames, this.entries); + if (targetServerNames.length === 0) { + return; + } + if (this.discoveryPromise) { + await this.discoveryPromise; + if (!force) { + return; + } + } + this.discoveryPromise = this.performDiscovery(targetServerNames, force); + try { + await this.discoveryPromise; + } finally { + this.discoveryPromise = undefined; + } + } + + private async ensureDiscoveryFresh(maxAgeMs = discoveryCacheMaxAgeMs): Promise { + const staleServerNames = [...this.entries.values()] + .filter((entry) => !entry.lastCheckedAt || Date.now() - entry.lastCheckedAt > maxAgeMs) + .map((entry) => entry.config.name); + if (staleServerNames.length === 0) { + return; + } + await this.refreshServers(staleServerNames, false); + } + + private listCatalogEntriesSync(): CatalogEntry[] { + const namespaces = serverNamespaces([...this.entries.values()].map((entry) => entry.config.name)); + const entries: CatalogEntry[] = []; + for (const entry of this.entries.values()) { + const serverNamespace = namespaces.get(entry.config.name) ?? toIdentifier(entry.config.name); + for (const tool of entry.tools) { + const remoteToolName = tool.name.trim(); + if (!remoteToolName) { + continue; + } + const toolName = `mcp.${serverNamespace}.${remoteToolName}`; + entries.push({ + alias: toIdentifier(toolName), + canonicalName: `${entry.config.name}.${remoteToolName}`, + description: tool.description ?? "", + inputSchema: tool.inputSchema, + invocation: inferInvocation(tool), + outputSchema: tool.outputSchema, + remoteToolName, + serverId: entry.config.name, + serverLabel: entry.config.label, + serverName: entry.config.name, + serverNamespace, + status: entry.status, + tags: tool.tags ?? [], + title: tool.title || tool.name, + toolName + }); + } + } + return entries.sort((left, right) => left.toolName.localeCompare(right.toolName)); + } + + private async performDiscovery(serverNames: string[], force: boolean): Promise { + for (const serverName of serverNames) { + const entry = this.entries.get(serverName); + if (!entry) { + continue; + } + if (!force && entry.lastCheckedAt && Date.now() - entry.lastCheckedAt < 3_000) { + continue; + } + await this.probeServer(entry.config); + } + } + + private async probeServer(config: GatewayMcpServerConfig): Promise { + const now = Date.now(); + try { + const tools = await this.clientFactory(config.name, config).listTools(); + const entry = this.entries.get(config.name); + if (!entry) { + return; + } + entry.status = "online"; + entry.tools = tools.map((tool) => ({ ...tool })); + entry.lastCheckedAt = now; + entry.lastSeenOnlineAt = now; + entry.loadedFromCache = true; + entry.error = undefined; + toolHubPersistentCache.writeDiscovery(config.name, entry.configHash, entry.tools, now); + } catch (error) { + const entry = this.entries.get(config.name); + if (!entry) { + return; + } + entry.status = "offline"; + entry.lastCheckedAt = now; + entry.loadedFromCache = false; + entry.error = formatError(error); + } + } +} + +runtime = new ToolHubRuntime(); + +class SseMcpClient implements McpClient { + private endpointUrl = ""; + private initialized = false; + private nextId = 1; + private openPromise: Promise | undefined; + private readonly pending = new Map(); + private streamAbort: AbortController | undefined; + private streamBuffer = ""; + + constructor(private readonly server: GatewayMcpRemoteServerConfig) {} + + async listTools(): Promise { + await this.ensureInitialized(); + const result = await this.request("tools/list", {}); + return normalizeToolList(result); + } + + async callTool(name: string, args: Record): Promise { + await this.ensureInitialized(); + return this.request("tools/call", { + name, + arguments: args + }); + } + + async close(): Promise { + this.initialized = false; + this.endpointUrl = ""; + this.streamAbort?.abort(); + this.streamAbort = undefined; + this.rejectAll(new Error(`MCP SSE client closed: ${this.server.name}`)); + } + + private async ensureInitialized(): Promise { + if (this.initialized) { + return; + } + await this.ensureStream(); + await this.request("initialize", { + capabilities: {}, + clientInfo: { name: toolHubServerName, version: "1.0.0" }, + protocolVersion: this.server.protocolVersion || protocolVersion + }, this.server.startupTimeoutMs); + await this.notification("notifications/initialized", {}).catch(() => undefined); + this.initialized = true; + } + + private async ensureStream(): Promise { + if (this.endpointUrl) { + return; + } + if (!this.openPromise) { + this.openPromise = this.openStream().finally(() => { + this.openPromise = undefined; + }); + } + await this.openPromise; + } + + private async openStream(): Promise { + const controller = new AbortController(); + this.streamAbort = controller; + const response = await fetch(this.server.url, { + headers: this.headers(false), + method: "GET", + signal: controller.signal + }); + if (!response.ok || !response.body) { + throw new Error(`MCP SSE stream failed (${this.server.name}): ${response.status}`); + } + + let resolveEndpoint: () => void = () => {}; + let rejectEndpoint: (error: Error) => void = () => {}; + const endpointReady = new Promise((resolve, reject) => { + resolveEndpoint = resolve; + rejectEndpoint = reject; + }); + const timeout = setTimeout(() => { + rejectEndpoint(new Error(`MCP SSE endpoint timed out (${this.server.name}).`)); + controller.abort(); + }, this.server.startupTimeoutMs ?? defaultRequestTimeoutMs); + + const reader = response.body.getReader(); + const decoder = new TextDecoder(); + void (async () => { + try { + for (;;) { + const { done, value } = await reader.read(); + if (done) break; + this.streamBuffer += decoder.decode(value, { stream: true }); + this.streamBuffer = consumeSseEvents(this.streamBuffer, (event) => { + if (event.event === "endpoint") { + this.endpointUrl = new URL(event.data.trim(), this.server.url).toString(); + clearTimeout(timeout); + resolveEndpoint(); + return; + } + this.routeSseMessage(event.data); + }); + } + this.rejectAll(new Error(`MCP SSE stream closed (${this.server.name}).`)); + } catch (error) { + clearTimeout(timeout); + rejectEndpoint(toError(error)); + this.rejectAll(toError(error)); + } + })(); + + await endpointReady; + } + + private request(method: string, params: Record, timeoutMs = this.server.requestTimeoutMs): Promise { + return this.ensureStream().then(() => { + const id = this.nextId++; + const message = { + id, + jsonrpc: "2.0", + method, + params + }; + const pending = new Promise((resolve, reject) => { + const timer = setTimeout(() => { + this.pending.delete(String(id)); + reject(new Error(`MCP SSE request timed out (${this.server.name}): ${method}`)); + }, timeoutMs ?? defaultRequestTimeoutMs); + this.pending.set(String(id), { + reject, + resolve: (response) => { + if (isRecord(response.error)) { + reject(new Error(String(response.error.message ?? "MCP request failed."))); + return; + } + resolve(response.result); + }, + timer + }); + }); + return this.post(message).then(() => pending); + }); + } + + private async notification(method: string, params: Record): Promise { + await this.ensureStream(); + await this.post({ jsonrpc: "2.0", method, params }); + } + + private async post(message: Record): Promise { + const response = await fetch(this.endpointUrl, { + body: JSON.stringify(message), + headers: this.headers(true), + method: "POST" + }); + if (!response.ok) { + throw new Error(`MCP SSE post failed (${this.server.name}): ${response.status}`); + } + } + + private headers(json: boolean): Headers { + const headers = new Headers({ + ...(json ? { "content-type": "application/json" } : {}), + ...(this.server.headers ?? {}) + }); + const apiKey = this.server.apiKey || (this.server.apiKeyEnv ? process.env[this.server.apiKeyEnv] : ""); + if (apiKey && !headers.has("authorization")) { + headers.set("authorization", `Bearer ${apiKey}`); + } + return headers; + } + + private routeSseMessage(text: string): void { + let message: JsonRpcRequest; + try { + message = JSON.parse(text) as JsonRpcRequest; + } catch { + return; + } + const key = message.id === undefined || message.id === null ? "" : String(message.id); + const pending = key ? this.pending.get(key) : undefined; + if (!pending) { + return; + } + this.pending.delete(key); + clearTimeout(pending.timer); + pending.resolve(message); + } + + private rejectAll(error: Error): void { + for (const item of this.pending.values()) { + clearTimeout(item.timer); + item.reject(error); + } + this.pending.clear(); + } +} + +class HttpMcpClient implements McpClient { + private initialized = false; + private sessionId = ""; + + constructor(private readonly server: GatewayMcpRemoteServerConfig) {} + + async listTools(): Promise { + await this.ensureInitialized(); + const result = await this.request("tools/list", {}); + return normalizeToolList(result); + } + + async callTool(name: string, args: Record): Promise { + await this.ensureInitialized(); + return this.request("tools/call", { + name, + arguments: args + }); + } + + async close(): Promise { + this.initialized = false; + this.sessionId = ""; + } + + private async ensureInitialized(): Promise { + if (this.initialized) { + return; + } + await this.request("initialize", { + capabilities: {}, + clientInfo: { name: toolHubServerName, version: "1.0.0" }, + protocolVersion: this.server.protocolVersion || protocolVersion + }, this.server.startupTimeoutMs); + await this.notification("notifications/initialized", {}).catch(() => undefined); + this.initialized = true; + } + + private async notification(method: string, params: Record): Promise { + await this.frame({ jsonrpc: "2.0", method, params }, this.server.requestTimeoutMs, true); + } + + private async request(method: string, params: Record, timeoutMs = this.server.requestTimeoutMs): Promise { + const response = await this.frame({ + id: randomUUID(), + jsonrpc: "2.0", + method, + params + }, timeoutMs, false); + if (!isRecord(response)) { + throw new Error(`Invalid MCP response from ${this.server.name}.`); + } + if (isRecord(response.error)) { + throw new Error(`MCP request failed (${this.server.name}): ${String(response.error.message ?? "Unknown error")}`); + } + return response.result; + } + + private async frame(request: Record, timeoutMs = defaultRequestTimeoutMs, notification: boolean): Promise { + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), timeoutMs); + try { + const headers = new Headers({ + accept: "application/json, text/event-stream", + "content-type": "application/json", + ...(this.server.headers ?? {}) + }); + const apiKey = this.server.apiKey || (this.server.apiKeyEnv ? process.env[this.server.apiKeyEnv] : ""); + if (apiKey && !headers.has("authorization")) { + headers.set("authorization", `Bearer ${apiKey}`); + } + if (this.sessionId) { + headers.set("mcp-session-id", this.sessionId); + } + const response = await fetch(this.server.url, { + body: JSON.stringify(request), + headers, + method: "POST", + signal: controller.signal + }); + this.sessionId = response.headers.get("mcp-session-id") || response.headers.get("x-mcp-session-id") || this.sessionId; + if (notification && response.status === 204) { + return undefined; + } + const text = await response.text(); + if (!response.ok) { + throw new Error(`MCP HTTP request failed (${this.server.name}): ${response.status} ${text.slice(0, 300)}`); + } + if (!text.trim()) { + return undefined; + } + return parseHttpJsonRpcResponse(text); + } finally { + clearTimeout(timer); + } + } +} + +class StdioMcpClient implements McpClient { + private child: ChildProcessWithoutNullStreams | undefined; + private initialized = false; + private nextId = 1; + private readonly pending = new Map(); + private stdoutBuffer = Buffer.alloc(0); + + constructor(private readonly server: GatewayMcpStdioServerConfig) {} + + async listTools(): Promise { + await this.ensureInitialized(); + const result = await this.request("tools/list", {}, this.server.requestTimeoutMs); + return normalizeToolList(result); + } + + async callTool(name: string, args: Record): Promise { + await this.ensureInitialized(); + return this.request("tools/call", { + name, + arguments: args + }, this.server.requestTimeoutMs); + } + + async close(): Promise { + this.initialized = false; + for (const item of this.pending.values()) { + clearTimeout(item.timer); + item.reject(new Error(`MCP stdio client closed: ${this.server.name}`)); + } + this.pending.clear(); + if (this.child && !this.child.killed) { + this.child.kill(); + } + this.child = undefined; + } + + private async ensureInitialized(): Promise { + if (this.initialized) { + return; + } + this.ensureChild(); + await this.request("initialize", { + capabilities: {}, + clientInfo: { name: toolHubServerName, version: "1.0.0" }, + protocolVersion: this.server.protocolVersion || protocolVersion + }, this.server.startupTimeoutMs); + this.notify("notifications/initialized", {}); + this.initialized = true; + } + + private ensureChild(): ChildProcessWithoutNullStreams { + if (this.child) { + return this.child; + } + const child = spawn(this.server.command, this.server.args ?? [], { + cwd: this.server.cwd || undefined, + env: { + ...process.env, + ...(this.server.env ?? {}) + }, + stdio: ["pipe", "pipe", "pipe"] + }) as ChildProcessWithoutNullStreams; + child.stdout.on("data", (chunk: Buffer) => this.readStdout(chunk)); + child.stderr.on("data", (chunk: Buffer) => { + const text = chunk.toString("utf8").trim(); + if (text) { + console.error(`[ToolHub backend ${this.server.name}] ${text}`); + } + }); + child.on("error", (error) => this.rejectAll(error)); + child.on("exit", (code, signal) => { + this.initialized = false; + this.child = undefined; + this.rejectAll(new Error(`MCP server exited (${this.server.name}): ${signal ?? code ?? "unknown"}`)); + }); + this.child = child; + return child; + } + + private request(method: string, params: Record, timeoutMs = defaultRequestTimeoutMs): Promise { + const id = this.nextId++; + const message = { + id, + jsonrpc: "2.0", + method, + params + }; + return new Promise((resolve, reject) => { + const timer = setTimeout(() => { + this.pending.delete(String(id)); + reject(new Error(`MCP stdio request timed out (${this.server.name}): ${method}`)); + }, timeoutMs); + this.pending.set(String(id), { + reject, + resolve: (response) => { + if (isRecord(response.error)) { + reject(new Error(String(response.error.message ?? "MCP request failed."))); + return; + } + resolve(response.result); + }, + timer + }); + this.write(message); + }); + } + + private notify(method: string, params: Record): void { + this.write({ jsonrpc: "2.0", method, params }); + } + + private write(message: Record): void { + const child = this.ensureChild(); + const text = JSON.stringify(message); + if (this.server.stdioMessageMode === "newline-json") { + child.stdin.write(`${text}\n`); + return; + } + child.stdin.write(`Content-Length: ${Buffer.byteLength(text, "utf8")}\r\n\r\n${text}`); + } + + private readStdout(chunk: Buffer): void { + this.stdoutBuffer = Buffer.concat([this.stdoutBuffer, chunk]); + if (this.server.stdioMessageMode === "newline-json") { + this.drainNewlineJsonStdout(); + } else { + this.drainContentLengthStdout(); + } + } + + private drainContentLengthStdout(): void { + while (true) { + const headerEnd = this.stdoutBuffer.indexOf("\r\n\r\n"); + if (headerEnd < 0) return; + const headerText = this.stdoutBuffer.subarray(0, headerEnd).toString("utf8"); + const lengthMatch = headerText.match(/content-length:\s*(\d+)/i); + if (!lengthMatch) { + this.stdoutBuffer = this.stdoutBuffer.subarray(headerEnd + 4); + continue; + } + const contentLength = Number(lengthMatch[1]); + const messageStart = headerEnd + 4; + const messageEnd = messageStart + contentLength; + if (this.stdoutBuffer.length < messageEnd) return; + const text = this.stdoutBuffer.subarray(messageStart, messageEnd).toString("utf8"); + this.stdoutBuffer = this.stdoutBuffer.subarray(messageEnd); + this.routeMessage(text); + } + } + + private drainNewlineJsonStdout(): void { + while (true) { + const newline = this.stdoutBuffer.indexOf("\n"); + if (newline < 0) return; + const text = this.stdoutBuffer.subarray(0, newline).toString("utf8").trim(); + this.stdoutBuffer = this.stdoutBuffer.subarray(newline + 1); + if (text) { + this.routeMessage(text); + } + } + } + + private routeMessage(text: string): void { + let message: JsonRpcRequest; + try { + message = JSON.parse(text) as JsonRpcRequest; + } catch { + return; + } + const key = message.id === undefined || message.id === null ? "" : String(message.id); + const pending = key ? this.pending.get(key) : undefined; + if (!pending) { + return; + } + this.pending.delete(key); + clearTimeout(pending.timer); + pending.resolve(message); + } + + private rejectAll(error: Error): void { + for (const item of this.pending.values()) { + clearTimeout(item.timer); + item.reject(error); + } + this.pending.clear(); + } +} + +const treeSitterToolName = "tree_sitter_collect_tool_references"; +const defaultMaxTurns = 3; +const maxTurnsLimit = 6; +const minSearchTimeoutMs = 8_000; +const maxTurnTimeoutMs = 60_000; +const minTurnRemainingMs = 3_500; +const minFinalAnswerTurnTimeoutMs = 8_000; +const timeoutHeadroomMs = 1_500; + +type SearchCatalogItem = { + alias: string; + canonicalName?: string; + description: string; + invocationMode: string; + name: string; + remoteToolName?: string; + required?: string[]; + serverId?: string; + serverLabel?: string; + sideEffect: boolean; + title: string; +}; + +type SearchMessage = { + content?: string | null; + role: "assistant" | "system" | "tool" | "user"; + tool_call_id?: string; + tool_calls?: Array<{ + function: { + arguments: string; + name: string; + }; + id: string; + type: "function"; + }>; +}; + +type SearchResult = { + plannedSteps?: string[]; + referencedTokens: string[]; + selectedToolNames: string[]; + summary: string; + workflowSketch?: string; +}; + +type ToolReference = { + column: number; + line: number; + rawName: string; + source: string; +}; + +class OpenAiToolHubSearchAgent { + private readonly analyzer = new ToolReferenceAnalyzer(); + + constructor(private readonly config: { + openAiApiKey?: string; + openAiBaseUrl?: string; + openAiModel?: string; + }) {} + + async search(input: { + catalog: SearchCatalogItem[]; + code?: string; + maxTurns?: number; + query: string; + timeoutMs?: number; + topK?: number; + }): Promise { + const query = input.query.trim(); + if (!query) { + throw new Error("ToolHub resolve query must be non-empty."); + } + const apiKey = this.config.openAiApiKey || env("TOOLHUB_OPENAI_API_KEY"); + const baseURL = this.config.openAiBaseUrl || env("TOOLHUB_OPENAI_BASE_URL") || "https://api.openai.com/v1"; + const model = this.config.openAiModel || env("TOOLHUB_OPENAI_MODEL"); + if (!apiKey || !model) { + throw new Error("ToolHub resolver requires TOOLHUB_OPENAI_API_KEY and TOOLHUB_OPENAI_MODEL."); + } + + const topK = normalizeTopK(input.topK); + const maxTurns = normalizeSearchMaxTurns(input.maxTurns); + const timeoutMs = normalizeSearchTimeout(input.timeoutMs); + const deadlineAt = Date.now() + timeoutMs; + await waitForLocalResolverEndpoint(baseURL, apiKey, timeoutMs); + const client = new OpenAI({ apiKey, baseURL }); + const messages: SearchMessage[] = [ + { + role: "user", + content: JSON.stringify({ + context: input.code ?? "", + query + }, null, 2) + } + ]; + + let didCallAnalyzer = false; + let analyzerCallCount = 0; + let summary = ""; + let workflowSketch = ""; + let plannedSteps: string[] = []; + let llmSelectedNames: string[] = []; + let referencedTokens: string[] = []; + let latestResolvedFromAnalyzer: string[] = []; + + for (let turn = 0; turn < maxTurns; turn += 1) { + const remainingMs = deadlineAt - Date.now(); + const minTurnTimeoutMs = didCallAnalyzer ? minFinalAnswerTurnTimeoutMs : minTurnRemainingMs; + if (remainingMs <= minTurnTimeoutMs + timeoutHeadroomMs) { + break; + } + const turnTimeoutMs = Math.min(remainingMs - timeoutHeadroomMs, maxTurnTimeoutMs); + const responseMessage = await this.callOpenAiWithTools( + client, + model, + buildSearchSystemPrompt(input.catalog, topK), + messages, + turnTimeoutMs + ); + + const toolCalls = responseMessage.tool_calls ?? []; + if (toolCalls.length > 0) { + messages.push(responseMessage); + const roundResolvedToolNames: string[] = []; + for (const toolCall of toolCalls) { + if (toolCall.function.name !== treeSitterToolName) { + messages.push({ + role: "tool", + tool_call_id: toolCall.id, + content: JSON.stringify({ error: `Unknown tool: ${toolCall.function.name}` }) + }); + continue; + } + didCallAnalyzer = true; + analyzerCallCount += 1; + const toolInput = parseToolArguments(toolCall.function.arguments); + const analyzeCode = typeof toolInput.code === "string" ? toolInput.code : ""; + const references = this.analyzer.collectReferences(analyzeCode); + const tokens = uniqueStrings(references.map((item) => item.rawName)); + const resolvedToolNames = uniqueStrings( + tokens + .map((token) => resolveCatalogItemName(input.catalog, token)) + .filter((name): name is string => typeof name === "string") + ); + referencedTokens = uniqueStrings([...referencedTokens, ...tokens]); + roundResolvedToolNames.push(...resolvedToolNames); + messages.push({ + role: "tool", + tool_call_id: toolCall.id, + content: JSON.stringify({ + references, + resolvedToolNames, + tokens + }) + }); + } + latestResolvedFromAnalyzer = uniqueStrings(roundResolvedToolNames); + continue; + } + + const contentText = typeof responseMessage.content === "string" ? responseMessage.content.trim() : ""; + const parsed = firstJsonObject(contentText); + if (!parsed) { + messages.push(responseMessage); + messages.push({ + role: "user", + content: didCallAnalyzer + ? "Return only a valid JSON object with keys \"summary\", \"steps\", \"workflowSketch\", and \"toolNames\"." + : `You must call ${treeSitterToolName} on a TypeScript workflow sketch before your final answer.` + }); + continue; + } + + summary = typeof parsed.summary === "string" ? parsed.summary.trim() : ""; + workflowSketch = typeof parsed.workflowSketch === "string" ? parsed.workflowSketch : ""; + plannedSteps = toStringArray(parsed.steps); + const workflowReferences = this.analyzer.collectReferences(workflowSketch); + const workflowTokens = uniqueStrings(workflowReferences.map((item) => item.rawName)); + const workflowResolvedNames = uniqueStrings( + workflowTokens + .map((token) => resolveCatalogItemName(input.catalog, token)) + .filter((name): name is string => typeof name === "string") + ); + referencedTokens = uniqueStrings([...referencedTokens, ...workflowTokens]); + llmSelectedNames = uniqueStrings( + [ + ...workflowResolvedNames, + ...toStringArray(parsed.toolNames) + ] + .map((name) => resolveCatalogItemName(input.catalog, name)) + .filter((name): name is string => typeof name === "string") + ); + const selectedToolNames = uniqueStrings([...latestResolvedFromAnalyzer, ...llmSelectedNames]).slice(0, topK); + const refinementFeedback = didCallAnalyzer + ? buildSearchRefinementFeedback({ + selectedToolNames, + summary, + workflowSketch + }) + : selectedToolNames.length === 0 + ? "Your current answer resolved to zero valid catalog tools. Call the tree-sitter tool on a revised TypeScript workflow sketch before answering." + : undefined; + if (refinementFeedback && turn + 1 < maxTurns) { + messages.push(responseMessage); + messages.push({ role: "user", content: refinementFeedback }); + continue; + } + break; + } + + const selectedToolNames = uniqueStrings([...latestResolvedFromAnalyzer, ...llmSelectedNames]).slice(0, topK); + if (selectedToolNames.length === 0) { + throw new Error(didCallAnalyzer || analyzerCallCount > 0 + ? "Resolve retrieval did not converge on any valid catalog tools after AST refinement." + : "Resolve retrieval did not converge on any valid catalog tools."); + } + if (!didCallAnalyzer || analyzerCallCount === 0) { + referencedTokens = uniqueStrings([...referencedTokens, ...selectedToolNames]); + } + if (didCallAnalyzer && analyzerCallCount === 0) { + throw new Error("Resolve retrieval LLM did not complete an AST planning round."); + } + if (!summary) { + summary = didCallAnalyzer + ? "Resolved a planned end-to-end tool bundle with AST-assisted retrieval." + : "Resolved a planned end-to-end tool bundle from the resolver model response."; + } else if (summary.toLowerCase().includes("no strong tool bundle match was found")) { + summary = "Resolved a candidate tool bundle after iterative AST refinement."; + } + return { + plannedSteps: plannedSteps.length > 0 ? plannedSteps : undefined, + referencedTokens, + selectedToolNames, + summary, + workflowSketch: workflowSketch || undefined + }; + } + + private async callOpenAiWithTools( + client: OpenAI, + model: string, + system: string, + messages: SearchMessage[], + timeoutMs: number + ): Promise { + const response = await client.chat.completions.create({ + model, + temperature: 0, + messages: [ + { role: "system", content: system }, + ...messages + ] as OpenAI.Chat.Completions.ChatCompletionMessageParam[], + stream: false, + tools: [ + { + type: "function", + function: { + name: treeSitterToolName, + description: "Analyze a short TypeScript workflow sketch and extract exact ToolHub tool references.", + parameters: { + type: "object", + properties: { + code: { + type: "string", + description: "TypeScript workflow sketch that references ToolHub tools." + } + }, + required: ["code"], + additionalProperties: false + } + } + } + ], + tool_choice: "auto" + } as OpenAI.Chat.Completions.ChatCompletionCreateParamsNonStreaming, { + timeout: timeoutMs + }); + + const message = response.choices[0]?.message; + if (!message) { + throw new Error("OpenAI resolve retrieval returned no assistant message."); + } + const content = typeof message.content === "string" ? message.content : ""; + const toolCalls = (message.tool_calls ?? []) + .map((toolCall, index) => { + const rawToolCall = toolCall as unknown as { function?: unknown }; + const functionCall = isRecord(rawToolCall.function) ? rawToolCall.function : {}; + return { + id: toolCall.id || `tool_call_${index}`, + type: "function" as const, + function: { + arguments: typeof functionCall.arguments === "string" ? functionCall.arguments : "", + name: typeof functionCall.name === "string" ? functionCall.name : "" + } + }; + }) + .filter((toolCall) => toolCall.function.name.length > 0); + if (!content && toolCalls.length === 0) { + throw new Error("OpenAI resolve retrieval returned no assistant content or tool calls."); + } + return { + role: "assistant", + content, + tool_calls: toolCalls + }; + } +} + +async function waitForLocalResolverEndpoint(baseURL: string, apiKey: string, timeoutMs: number): Promise { + const readinessUrl = localResolverReadinessUrl(baseURL); + if (!readinessUrl) { + return; + } + const deadline = Date.now() + Math.min(Math.max(timeoutMs, 1000), 30_000); + let lastError: unknown; + while (Date.now() < deadline) { + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), 1000); + try { + await fetch(readinessUrl, { + headers: { authorization: `Bearer ${apiKey}` }, + method: "GET", + signal: controller.signal + }); + return; + } catch (error) { + lastError = error; + if (!isRetryableLocalResolverError(error)) { + return; + } + await delay(300); + } finally { + clearTimeout(timer); + } + } + throw new Error(`ToolHub resolver could not connect to CCR Gateway at ${readinessUrl}: ${formatError(lastError)}.`); +} + +function localResolverReadinessUrl(baseURL: string): string | undefined { + let parsed: URL; + try { + parsed = new URL(baseURL); + } catch { + return undefined; + } + if (!isLoopbackHostname(parsed.hostname)) { + return undefined; + } + const base = baseURL.replace(/\/+$/g, ""); + return `${base}/models`; +} + +function isLoopbackHostname(hostname: string): boolean { + const normalized = hostname.trim().toLowerCase().replace(/^\[|\]$/g, ""); + return normalized === "localhost" || + normalized === "::1" || + normalized === "0:0:0:0:0:0:0:1" || + normalized.startsWith("127."); +} + +function isRetryableLocalResolverError(error: unknown): boolean { + if (error instanceof DOMException && error.name === "AbortError") { + return true; + } + const code = errorCode(error); + return code === "ECONNREFUSED" || + code === "ECONNRESET" || + code === "EHOSTUNREACH" || + code === "ENETUNREACH" || + code === "ETIMEDOUT"; +} + +function errorCode(error: unknown): string { + if (!isRecord(error)) { + return ""; + } + const direct = typeof error.code === "string" ? error.code : ""; + if (direct) { + return direct; + } + const cause = isRecord(error.cause) ? error.cause : undefined; + return typeof cause?.code === "string" ? cause.code : ""; +} + +function delay(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +function metaTools(): Array<{ description: string; inputSchema: Record; name: string }> { + return [ + { + name: resolveToolName, + description: [ + "Search ToolHub with the configured model and resolve installed MCP tools needed for a task.", + `MUST be called before answering any request about external services, installed MCP capabilities, business APIs, orders, coupons, stores, accounts, available tools, or capabilities that are not already obvious from the eager tools.`, + `Call this even if the user did not mention ToolHub or ${resolveToolName}.`, + `Use ${invokeToolName} after this tool returns selected tools.`, + "Follow the returned executionPlanJs: await means serial dependency, and only calls grouped by Promise.all may be invoked in parallel.", + "Use the user's request as task and include concise context so the resolver can select the right tools." + ].join(" "), + inputSchema: { + type: "object", + properties: { + task: { type: "string" }, + context: { type: "object", additionalProperties: true }, + constraints: { + type: "object", + properties: { + maxTools: { type: "number" } + }, + additionalProperties: false + } + }, + required: ["task"], + additionalProperties: false + } + }, + { + name: invokeToolName, + description: `Invoke one MCP tool selected by ${resolveToolName}. Follow executionPlanJs from ${resolveToolName}; do not parallelize invoke calls unless that plan groups them in Promise.all.`, + inputSchema: { + type: "object", + properties: { + tool: { type: "string" }, + args: { type: "object", additionalProperties: true } + }, + required: ["tool"], + additionalProperties: false + } + } + ]; +} + +function readBackendServers(): GatewayMcpServerConfig[] { + const raw = env("TOOLHUB_MCP_SERVERS_JSON"); + if (!raw) { + return []; + } + try { + const parsed = JSON.parse(raw) as unknown; + return Array.isArray(parsed) + ? parsed.map(normalizeServerConfig).filter((server): server is GatewayMcpServerConfig => Boolean(server)) + : []; + } catch { + return []; + } +} + +function normalizeServerConfig(value: unknown): GatewayMcpServerConfig | undefined { + if (!isRecord(value)) { + return undefined; + } + const rawTransport = typeof value.transport === "string" ? value.transport : typeof value.type === "string" ? value.type : ""; + const normalizedTransport = rawTransport.toLowerCase().replace(/_/g, "-"); + const transport = normalizedTransport === "streamable-http" || normalizedTransport === "streamablehttp" || normalizedTransport === "http" + ? "streamable-http" + : normalizedTransport === "sse" + ? "sse" + : "stdio"; + const name = typeof value.name === "string" && value.name.trim() ? value.name.trim() : ""; + if (!name) { + return undefined; + } + const base = { + label: typeof value.label === "string" && value.label.trim() ? value.label.trim() : undefined, + name, + protocolVersion: typeof value.protocolVersion === "string" ? value.protocolVersion : protocolVersion, + requestTimeoutMs: normalizeTimeout(value.requestTimeoutMs, defaultRequestTimeoutMs), + startupTimeoutMs: normalizeTimeout(value.startupTimeoutMs, defaultRequestTimeoutMs), + transport + }; + if (transport !== "stdio") { + const url = typeof value.url === "string" && value.url.trim() ? value.url.trim() : ""; + if (!url) { + return undefined; + } + return { + ...base, + apiKey: typeof value.apiKey === "string" ? value.apiKey : undefined, + apiKeyEnv: typeof value.apiKeyEnv === "string" ? value.apiKeyEnv : undefined, + headers: isStringRecord(value.headers) ? value.headers : {}, + transport, + url + }; + } + const command = typeof value.command === "string" && value.command.trim() ? value.command.trim() : ""; + if (!command) { + return undefined; + } + return { + ...base, + args: Array.isArray(value.args) ? value.args.filter((item): item is string => typeof item === "string") : [], + command, + cwd: typeof value.cwd === "string" && value.cwd.trim() ? value.cwd.trim() : undefined, + env: isStringRecord(value.env) ? value.env : {}, + stdioMessageMode: value.stdioMessageMode === "newline-json" ? "newline-json" : "content-length", + transport + }; +} + +function normalizeToolList(value: unknown): ToolDefinition[] { + const tools = isRecord(value) && Array.isArray(value.tools) ? value.tools : []; + const result: ToolDefinition[] = []; + for (const tool of tools) { + if (!isRecord(tool) || typeof tool.name !== "string" || !tool.name.trim()) { + continue; + } + result.push({ + description: typeof tool.description === "string" ? tool.description : "", + inputSchema: normalizeInputSchema(tool.inputSchema ?? tool.input_schema), + name: tool.name.trim(), + outputSchema: normalizeOptionalSchema(tool.outputSchema ?? tool.output_schema), + tags: Array.isArray(tool.tags) ? tool.tags.filter((tag): tag is string => typeof tag === "string") : undefined, + title: typeof tool.title === "string" && tool.title.trim() ? tool.title.trim() : undefined + }); + } + return result; +} + +function normalizeInputSchema(value: unknown): Record { + return isRecord(value) ? value : { type: "object", properties: {} }; +} + +function normalizeOptionalSchema(value: unknown): Record | undefined { + return isRecord(value) ? value : undefined; +} + +function parseHttpJsonRpcResponse(text: string): unknown { + if (/^event:/m.test(text) || /^data:/m.test(text)) { + const events = text.split(/\n\n+/); + for (const event of events) { + const data = event + .split(/\n/) + .filter((line) => line.startsWith("data:")) + .map((line) => line.slice("data:".length).trim()) + .join("\n"); + if (!data) continue; + try { + return JSON.parse(data) as unknown; + } catch { + continue; + } + } + } + return JSON.parse(text) as unknown; +} + +function consumeSseEvents(buffer: string, handle: (event: { data: string; event: string }) => void): string { + let offset = 0; + for (;;) { + const nextMatch = /\r?\n\r?\n/.exec(buffer.slice(offset)); + if (!nextMatch || nextMatch.index < 0) { + return buffer.slice(offset); + } + const next = offset + nextMatch.index; + const raw = buffer.slice(offset, next); + offset = next + nextMatch[0].length; + let event = "message"; + const data: string[] = []; + for (const line of raw.split(/\r?\n/)) { + if (line.startsWith("event:")) { + event = line.slice("event:".length).trim() || "message"; + } else if (line.startsWith("data:")) { + data.push(line.slice("data:".length).trimStart()); + } + } + if (data.length > 0 || event !== "message") { + handle({ data: data.join("\n"), event }); + } + } +} + +function firstJsonObject(text: string): Record | undefined { + try { + const parsed = JSON.parse(text) as unknown; + return isRecord(parsed) ? parsed : undefined; + } catch { + const start = text.indexOf("{"); + const end = text.lastIndexOf("}"); + if (start < 0 || end <= start) return undefined; + try { + const parsed = JSON.parse(text.slice(start, end + 1)) as unknown; + return isRecord(parsed) ? parsed : undefined; + } catch { + return undefined; + } + } +} + +function serverNamespaces(serverNames: string[]): Map { + const counts = new Map(); + const output = new Map(); + for (const serverName of serverNames) { + const base = toIdentifier(serverName); + const count = (counts.get(base) ?? 0) + 1; + counts.set(base, count); + output.set(serverName, count === 1 ? base : `${base}_${count}`); + } + return output; +} + +function toIdentifier(value: string): string { + const normalized = value.replace(/[^a-zA-Z0-9_]/g, "_").replace(/_+/g, "_").replace(/^_+|_+$/g, ""); + if (!normalized) { + return "tool"; + } + return /^\d/.test(normalized) ? `_${normalized}` : normalized; +} + +function toSearchCatalogItem(entry: CatalogEntry): SearchCatalogItem { + return { + alias: entry.alias, + canonicalName: entry.canonicalName, + description: entry.description, + invocationMode: entry.invocation.mode, + name: entry.toolName, + remoteToolName: entry.remoteToolName, + required: getSchemaRequiredProperties(entry.inputSchema), + serverId: entry.serverId, + serverLabel: entry.serverLabel, + sideEffect: entry.invocation.sideEffect, + title: entry.title + }; +} + +function buildSearchSystemPrompt(catalog: SearchCatalogItem[], topK: number): string { + return [ + "You are the ToolHub resolve planner and retrieval agent.", + "Your job is to return the complete anticipated tool bundle for the user task, not just the first tool.", + "You must think ahead about the next likely steps needed to finish the task end-to-end.", + `You MUST call ${treeSitterToolName} before your final answer.`, + "You may need multiple planning and search rounds.", + "If your first workflow sketch yields zero, partial, or weak tool matches, revise the sketch and call the tree-sitter tool again before answering.", + "Workflow you must follow:", + "1. Plan the likely execution steps.", + "2. Draft a short JavaScript/TypeScript workflow sketch that uses the exact catalog tool names or aliases you expect to need.", + "2a. Prefer sketches that call tools through string literals such as callTool(\"\", {...}) or tools.call(\"\", {...}).", + "3. Call the tree-sitter tool on that sketch.", + "4. Inspect the tree-sitter result and check whether the bundle is complete end-to-end.", + "5. If it is incomplete, revise the sketch and call the tree-sitter tool again.", + "6. Return the final JSON only after the bundle is complete.", + `Return at most ${topK} tool names.`, + "Final answer MUST be a JSON object with this shape:", + "{ \"summary\": string, \"steps\": string[], \"workflowSketch\": string, \"toolNames\": string[] }", + "Rules:", + "- toolNames must be exact catalog names or aliases.", + "- workflowSketch is the dependency plan that will be returned to the caller as executionPlanJs.", + "- In workflowSketch, use await to show serial dependencies and Promise.all([...]) only for tool calls that are independent and safe to invoke in parallel.", + "- Do not put side-effecting calls in Promise.all unless they are truly independent and safe to run concurrently.", + "- In workflowSketch, prefer string-literal tool calls over reconstructed member chains whenever possible.", + "- Include prerequisite and downstream tools you will likely need after the first action.", + "- Never invent tool names.", + "- Generic browser automation tools are a strong match for web tasks such as ordering, buying, booking, delivery, or checkout when no domain-specific MCP tool exists.", + "- For browser navigation/open calls, prefer omitting waitUntil or using waitUntil: \"interactive\" so the agent can inspect and act as soon as the page is usable.", + "- Do not use waitUntil: \"network_idle\" for Gmail, Google sign-in, SPAs, mail, chat, auth, checkout, verification, or pages with long-lived requests. Use network_idle only when the user explicitly asks for network quiescence.", + "- When selecting CCR browser automation tools, include the human-handoff follow-up tools needed if login, CAPTCHA, verification, blocked navigation, or manual confirmation appears.", + "- For CCR browser automation bundles, include browser_handoff_request and browser_handoff_wait when the workflow may need user help. Do not assume all browser tools are preloaded.", + "- For importing existing Chrome login state into CCR's in-app browser, select browser_chrome_login_import and include browser_chrome_login_import_status to check completion.", + "- If using member-call syntax, prefer tools.(...) or mcp..(...).", + "- For lookup tasks, do not stop at opening or navigating. Include the tools needed to read or extract the answer.", + "- If the catalog has no strong match, return an empty toolNames array.", + "", + "Tool catalog:", + JSON.stringify(catalog, null, 2) + ].join("\n"); +} + +function buildSearchRefinementFeedback(input: { + selectedToolNames: string[]; + summary: string; + workflowSketch: string; +}): string | undefined { + const issues: string[] = []; + if (!input.workflowSketch.trim()) { + issues.push("workflowSketch is empty."); + } + if (input.selectedToolNames.length === 0) { + issues.push("Your current answer resolved to zero valid catalog tools."); + } + if (input.summary.trim().toLowerCase().includes("no strong tool bundle match was found")) { + issues.push("Your summary says the bundle is weak; revise the workflow sketch and search again."); + } + if (issues.length === 0) { + return undefined; + } + return [ + "Your last candidate tool bundle is incomplete.", + ...issues.map((issue, index) => `${index + 1}. ${issue}`), + `Revise the workflow sketch, call ${treeSitterToolName} again, and then return updated JSON only.` + ].join("\n"); +} + +class ToolReferenceAnalyzer { + collectReferences(code: string): ToolReference[] { + if (!code.trim()) { + return []; + } + const references: ToolReference[] = []; + this.collectStringCallReferences(code, references); + this.collectMemberReferences(code, references); + return uniqueToolReferences(references); + } + + private collectStringCallReferences(code: string, output: ToolReference[]): void { + const patterns: Array<{ regex: RegExp; source: string }> = [ + { regex: /\bcallTool\s*\(\s*(["'`])([^"'`]+)\1/g, source: "callTool" }, + { regex: /\btools\s*\.\s*call\s*\(\s*(["'`])([^"'`]+)\1/g, source: "tools.call" }, + { regex: /\b[\w$]+\s*\.\s*callTool\s*\(\s*(["'`])([^"'`]+)\1/g, source: "context.callTool" }, + { regex: /\btools\s*\[\s*(["'`])([^"'`]+)\1\s*\]\s*\(/g, source: "tools.subscript" } + ]; + for (const pattern of patterns) { + for (const match of code.matchAll(pattern.regex)) { + const rawName = match[2]?.trim(); + if (rawName) { + output.push(buildToolReference(code, match.index ?? 0, rawName, pattern.source)); + } + } + } + } + + private collectMemberReferences(code: string, output: ToolReference[]): void { + const patterns: Array<{ regex: RegExp; source: string }> = [ + { regex: /\btools\s*\.\s*([A-Za-z_$][\w$]*(?:\s*\.\s*[A-Za-z_$][\w$]*)*)\s*\(/g, source: "tools.member" }, + { regex: /\bmcp\s*\.\s*([A-Za-z_$][\w$]*(?:\s*\.\s*[A-Za-z_$][\w$]*){1,})\s*\(/g, source: "mcp.member" } + ]; + for (const pattern of patterns) { + for (const match of code.matchAll(pattern.regex)) { + const pathText = match[1]?.replace(/\s+/g, ""); + if (!pathText || pathText === "call") { + continue; + } + const rawName = pattern.source === "mcp.member" ? `mcp.${pathText}` : pathText; + output.push(buildToolReference(code, match.index ?? 0, rawName, pattern.source)); + } + } + } +} + +function buildToolReference(code: string, index: number, rawName: string, source: string): ToolReference { + const before = code.slice(0, index); + const lines = before.split(/\r?\n/); + return { + column: lines[lines.length - 1].length + 1, + line: lines.length, + rawName, + source + }; +} + +function uniqueToolReferences(references: ToolReference[]): ToolReference[] { + const seen = new Set(); + const output: ToolReference[] = []; + for (const reference of references) { + const key = `${reference.rawName}\u0000${reference.source}\u0000${reference.line}\u0000${reference.column}`; + if (seen.has(key)) { + continue; + } + seen.add(key); + output.push(reference); + } + return output; +} + +function parseToolArguments(value: string): Record { + try { + const parsed = JSON.parse(value) as unknown; + return isRecord(parsed) ? parsed : {}; + } catch { + return {}; + } +} + +function toStringArray(value: unknown): string[] { + return Array.isArray(value) ? value.filter((item): item is string => typeof item === "string") : []; +} + +function normalizeTopK(value: unknown): number { + return Math.min(Math.max(toPositiveIntOrDefault(value, defaultMaxTools), 1), 20); +} + +function normalizeSearchMaxTurns(value: unknown): number { + return Math.min(Math.max(toPositiveIntOrDefault(value, defaultMaxTurns), 1), maxTurnsLimit); +} + +function normalizeSearchTimeout(value: unknown): number { + return Math.max(toPositiveIntOrDefault(value, defaultRequestTimeoutMs), minSearchTimeoutMs); +} + +function toPositiveIntOrDefault(value: unknown, fallback: number): number { + if (typeof value !== "number" || !Number.isFinite(value)) { + return fallback; + } + const rounded = Math.floor(value); + return rounded > 0 ? rounded : fallback; +} + +function resolveCatalogItemName( + catalog: Array<{ alias: string; canonicalName?: string; name: string; remoteToolName?: string }>, + token: string +): string | undefined { + const normalized = token.trim(); + if (!normalized) { + return undefined; + } + const lookupCandidates = uniqueStrings([ + normalized, + toIdentifier(normalized), + normalized.startsWith("mcp.") ? normalized : `mcp.${normalized}`, + normalized.startsWith("mcp_") ? normalized : `mcp_${toIdentifier(normalized)}` + ]); + for (const item of catalog) { + const itemExactNames = uniqueStrings([ + item.name, + item.alias, + item.canonicalName ?? "", + item.canonicalName ? toIdentifier(item.canonicalName) : "" + ].filter(Boolean)); + for (const candidate of lookupCandidates) { + if (itemExactNames.includes(candidate)) { + return item.name; + } + } + } + const suffixMatches = catalog.filter((item) => matchesUniqueSuffix(item, normalized)); + return suffixMatches.length === 1 ? suffixMatches[0].name : undefined; +} + +function matchesUniqueSuffix( + item: { alias: string; canonicalName?: string; name: string; remoteToolName?: string }, + token: string +): boolean { + const tokenAlias = toIdentifier(token); + const nameSuffix = item.name.split(".").slice(1).join("."); + const remoteToolName = item.remoteToolName || item.name.split(".").at(-1) || ""; + const suffixes = uniqueStrings([ + item.canonicalName ?? "", + item.canonicalName ? toIdentifier(item.canonicalName) : "", + nameSuffix, + toIdentifier(nameSuffix), + remoteToolName, + toIdentifier(remoteToolName) + ].filter(Boolean)); + return suffixes.includes(token) || suffixes.includes(tokenAlias); +} + +function buildTsDefinitions(entries: CatalogEntry[]): string { + return entries + .map((entry) => { + const typeName = toTypeName(entry.toolName); + const argsTypeName = `${typeName}Args`; + return [ + "/**", + ` * ${entry.description || entry.title}`, + ` * Exact tool name: "${entry.toolName}".`, + ` * Callable references: "${entry.toolName}", "${entry.alias}".`, + " */", + `type ${argsTypeName} = ${schemaToType(entry.inputSchema)};`, + `type ${typeName}Call = { tool: "${entry.toolName}"; args: ${argsTypeName}; };` + ].join("\n"); + }) + .join("\n\n"); +} + +function schemaToType(schema: Record | undefined): string { + if (!isRecord(schema) || !isRecord(schema.properties)) { + return "Record"; + } + const required = new Set(getSchemaRequiredProperties(schema)); + const lines = ["{"]; + for (const [key, value] of Object.entries(schema.properties)) { + const propertySchema = isRecord(value) ? value : {}; + lines.push(` ${JSON.stringify(key)}${required.has(key) ? "" : "?"}: ${jsonSchemaTypeToTs(propertySchema)};`); + } + lines.push("}"); + return lines.join("\n"); +} + +function jsonSchemaTypeToTs(schema: Record): string { + if (Array.isArray(schema.enum) && schema.enum.every((item) => typeof item === "string")) { + return schema.enum.map((item) => JSON.stringify(item)).join(" | ") || "string"; + } + switch (schema.type) { + case "array": + return "unknown[]"; + case "boolean": + return "boolean"; + case "integer": + case "number": + return "number"; + case "object": + return "Record"; + case "string": + return "string"; + default: + return "unknown"; + } +} + +function toTypeName(value: string): string { + const words = value.replace(/[^a-zA-Z0-9]+/g, " ").trim().split(/\s+/); + const name = words.map((word) => `${word.slice(0, 1).toUpperCase()}${word.slice(1)}`).join(""); + return name || "Tool"; +} + +function scoreLocalCatalogMatch(taskText: string, tool: CatalogEntry, preferredToolScores: Map): number { + const taskTokens = tokenizeLocalSearchText(taskText); + const taskTokenSet = new Set(taskTokens); + const toolText = [ + tool.toolName, + tool.alias, + tool.canonicalName, + tool.remoteToolName, + tool.serverId, + tool.serverLabel ?? "", + tool.title, + tool.description, + ...tool.tags + ].join(" "); + const toolTokens = tokenizeLocalSearchText(toolText); + let score = preferredToolScores.get(tool.remoteToolName) ?? preferredToolScores.get(tool.toolName) ?? 0; + for (const token of toolTokens) { + if (taskTokenSet.has(token)) { + score += token.length > 4 ? 3 : 1; + } + } + if (tool.invocation.sideEffect) { + score -= 8; + } + return score; +} + +function getLocalFallbackPreferredTools(taskText: string): Map { + const tokens = new Set(tokenizeLocalSearchText(taskText)); + const normalizedText = taskText.toLowerCase(); + const scores = new Map(); + const add = (toolName: string, score: number) => scores.set(toolName, Math.max(scores.get(toolName) ?? 0, score)); + if (hasAnyToken(tokens, [ + "app", + "book", + "booking", + "browse", + "buy", + "cart", + "checkout", + "coffee", + "delivery", + "latte", + "order", + "pickup", + "product", + "purchase", + "restaurant", + "search", + "shop", + "store", + "website" + ]) || /咖啡|拿铁|生椰|点单|下单|外卖|配送|自取|门店|商品|购买|结账|订单/.test(normalizedText)) { + add("browser_session_open", 120); + add("browser_navigate", 112); + add("browser_snapshot", 108); + add("browser_ax_query", 96); + add("browser_element_input", 88); + add("browser_element_click", 84); + add("browser_screenshot", 60); + add("browser_events_await", 44); + } + if (hasAnyToken(tokens, [ + "auth", + "chrome", + "cookie", + "cookies", + "import", + "localstorage", + "login", + "session", + "signin", + "storage" + ]) || /chrome|cookie|cookies|localstorage|local storage|登录态|登录状态|导入登录|浏览器登录|本地存储/.test(normalizedText)) { + add("browser_chrome_login_import", 128); + add("browser_chrome_login_import_status", 92); + } + if (hasAnyToken(tokens, ["address", "delivery", "geo", "geolocation", "location", "nearby", "pickup", "store"]) || + /地址|定位|位置|附近|配送|外卖|自取|门店/.test(normalizedText)) { + add("location_permission_status", 90); + add("location_get_current", 86); + } + if (hasAnyToken(tokens, ["ask", "choice", "confirm", "confirmation", "missing", "option", "preference", "question", "select", "user"]) || + /确认|选择|偏好|口味|缺少|询问|用户/.test(normalizedText)) { + add("user_interaction_collect", 82); + } + return scores; +} + +function getDeterministicTaskTools(taskText: string, catalog: CatalogEntry[]): CatalogEntry[] { + if (!taskWantsChromeLoginImport(taskText)) { + return []; + } + return [ + catalog.find((tool) => isBrowserAutomationTool(tool) && tool.remoteToolName === "browser_chrome_login_import"), + catalog.find((tool) => isBrowserAutomationTool(tool) && tool.remoteToolName === "browser_chrome_login_import_status") + ].filter((tool): tool is CatalogEntry => Boolean(tool)); +} + +function taskWantsChromeLoginImport(taskText: string): boolean { + const normalizedText = taskText.toLowerCase(); + return normalizedText.includes("browser_chrome_login_import") || + /(chrome|谷歌浏览器|浏览器).*(login|signin|auth|cookie|localstorage|local storage|session|登录态|登录状态|登录信息|本地存储|cookie)/.test(normalizedText) || + /(import|导入|迁移|同步).*(chrome|谷歌浏览器).*(login|signin|auth|cookie|localstorage|local storage|session|登录态|登录状态|登录信息|本地存储)/.test(normalizedText) || + /(登录态|登录状态|登录信息).*(chrome|谷歌浏览器|浏览器).*(导入|迁移|同步)/.test(normalizedText); +} + +function catalogHasChromeLoginImportTool(catalog: CatalogEntry[]): boolean { + return catalog.some((tool) => isBrowserAutomationTool(tool) && tool.remoteToolName === "browser_chrome_login_import"); +} + +function tokenizeLocalSearchText(text: string): string[] { + const tokens = text + .replace(/([a-z0-9])([A-Z])/g, "$1 $2") + .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2") + .toLowerCase() + .split(/[^a-z0-9_]+/) + .map((token) => token.trim()) + .filter((token) => token.length > 1 && !localSearchStopWords.has(token)); + return uniqueStrings(tokens); +} + +const localSearchStopWords = new Set(["a", "an", "and", "are", "as", "be", "by", "for", "from", "in", "is", "it", "need", "of", "or", "the", "then", "to", "with"]); + +function uniqueToolEntries(entries: CatalogEntry[]): CatalogEntry[] { + const seen = new Set(); + const output: CatalogEntry[] = []; + for (const entry of entries) { + if (seen.has(entry.toolName)) { + continue; + } + seen.add(entry.toolName); + output.push(entry); + } + return output; +} + +function expandToolBundleWithCompanionTools(selectedTools: CatalogEntry[], catalog: CatalogEntry[]): CatalogEntry[] { + const output = uniqueToolEntries(selectedTools); + const selectedNames = new Set(output.map((tool) => tool.toolName)); + const selectedRemoteNames = new Set(output.map((tool) => tool.remoteToolName)); + const hasBrowserAutomationTool = output.some((tool) => isBrowserAutomationTool(tool)); + const hasHandoffRequestTool = output.some((tool) => + isBrowserAutomationTool(tool) && + (tool.remoteToolName === "browser_handoff_request" || tool.remoteToolName === "askHumanHelp") + ); + const hasChromeLoginImportTool = output.some((tool) => + isBrowserAutomationTool(tool) && + tool.remoteToolName === "browser_chrome_login_import" + ); + const companionRemoteNames = new Set(); + + if (hasBrowserAutomationTool) { + companionRemoteNames.add("browser_handoff_request"); + companionRemoteNames.add("browser_handoff_status"); + companionRemoteNames.add("browser_handoff_wait"); + } + if (hasHandoffRequestTool) { + companionRemoteNames.add("browser_handoff_wait"); + } + if (hasChromeLoginImportTool) { + companionRemoteNames.add("browser_chrome_login_import_status"); + } + + for (const remoteToolName of companionRemoteNames) { + if (selectedRemoteNames.has(remoteToolName)) { + continue; + } + const companion = catalog.find((tool) => + isBrowserAutomationTool(tool) && + tool.remoteToolName === remoteToolName && + !selectedNames.has(tool.toolName) + ); + if (companion) { + output.push(companion); + selectedNames.add(companion.toolName); + selectedRemoteNames.add(companion.remoteToolName); + } + } + + return output; +} + +function isBrowserAutomationTool(tool: CatalogEntry): boolean { + return tool.serverName === "ccr-browser-automation" || + tool.serverId === "ccr-browser-automation" || + tool.serverNamespace === "ccr_browser_automation" || + tool.toolName.startsWith("mcp.ccr_browser_automation."); +} + +function buildLocalFallbackWorkflowSketch(selectedTools: CatalogEntry[]): string | undefined { + return selectedTools.length > 0 ? buildSequentialExecutionPlanJs(selectedTools) : undefined; +} + +function isBrowserNavigationTool(tool: CatalogEntry): boolean { + return isBrowserAutomationTool(tool) && ( + tool.toolName.endsWith("browser_session_open") || + tool.toolName.endsWith("browser_navigate") || + tool.remoteToolName === "browser_session_open" || + tool.remoteToolName === "browser_navigate" + ); +} + +function buildExecutionPlanJs(workflowSketch: string | undefined, selectedTools: CatalogEntry[]): string { + const trimmed = typeof workflowSketch === "string" ? workflowSketch.trim() : ""; + return trimmed || buildSequentialExecutionPlanJs(selectedTools); +} + +function buildSequentialExecutionPlanJs(selectedTools: CatalogEntry[]): string { + if (selectedTools.length === 0) { + return [ + "async function runWithToolHub() {", + " // Ask the user for missing task details before invoking tools.", + "}" + ].join("\n"); + } + const lines = [ + "async function runWithToolHub() {", + " // Invoke calls in this order unless the plan explicitly uses Promise.all." + ]; + selectedTools.forEach((tool, index) => { + lines.push(` const step${index + 1} = await callTool(${JSON.stringify(tool.toolName)}, ${buildExecutionPlanArgs(tool)});`); + }); + lines.push("}"); + return lines.join("\n"); +} + +function buildExecutionPlanArgs(tool: CatalogEntry): string { + if (isBrowserNavigationTool(tool)) { + return "{ url, waitUntil: \"interactive\" }"; + } + const required = getSchemaRequiredProperties(tool.inputSchema); + if (required.length === 0) { + return "{}"; + } + return `{ ${required.map((key) => `${JSON.stringify(key)}: ${toPlanVariableName(key)}`).join(", ")} }`; +} + +function toPlanVariableName(value: string): string { + const identifier = toIdentifier(value).replace(/^[A-Z]/, (match) => match.toLowerCase()); + if (!identifier || reservedJavaScriptWords.has(identifier)) { + return "value"; + } + return identifier; +} + +function inferInvocation(tool: ToolDefinition): ToolInvocation { + const text = `${tool.name} ${tool.title ?? ""} ${tool.description ?? ""}`; + const tokenList = tokenizeToolText(text); + const tokens = new Set(tokenList); + const sideEffect = hasAnyToken(tokens, [ + "book", + "cancel", + "commit", + "create", + "delete", + "execute", + "merge", + "post", + "publish", + "purchase", + "push", + "remove", + "reserve", + "run", + "send", + "submit", + "update", + "write" + ]); + const workflowOnly = hasAnyToken(tokens, ["batch", "bulk", "foreach", "iterate", "parallel"]) || + hasTokenSequence(tokenList, ["for", "each"]) || + hasTokenSequence(tokenList, ["sync", "all"]) || + hasTokenSequence(tokenList, ["export", "all"]); + return { + mode: workflowOnly ? "workflow" : "both", + sideEffect + }; +} + +function tokenizeToolText(text: string): string[] { + const spaced = text + .replace(/([a-z0-9])([A-Z])/g, "$1 $2") + .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2") + .replace(/[^a-zA-Z0-9_]+/g, " ") + .toLowerCase(); + return spaced.split(/\s+|_+/).filter(Boolean); +} + +function hasAnyToken(tokens: Set, candidates: string[]): boolean { + return candidates.some((candidate) => tokens.has(candidate)); +} + +function hasTokenSequence(tokens: string[], sequence: string[]): boolean { + if (sequence.length === 0 || tokens.length < sequence.length) { + return false; + } + for (let index = 0; index <= tokens.length - sequence.length; index += 1) { + if (sequence.every((token, offset) => tokens[index + offset] === token)) { + return true; + } + } + return false; +} + +function selectFirstActionTool(selectedTools: CatalogEntry[]): CatalogEntry | undefined { + const candidates = selectedTools + .map((tool, index) => ({ + index, + rank: rankFirstActionTool(tool), + tool + })) + .filter((candidate) => !candidate.tool.invocation.sideEffect); + const rankedCandidates = candidates.length + ? candidates + : selectedTools.map((tool, index) => ({ + index, + rank: rankFirstActionTool(tool), + tool + })); + return rankedCandidates.sort((left, right) => { + return left.rank.derivedRequiredCount - right.rank.derivedRequiredCount || + right.rank.userSuppliedRequiredCount - left.rank.userSuppliedRequiredCount || + left.rank.requiredCount - right.rank.requiredCount || + left.index - right.index; + })[0]?.tool; +} + +function rankFirstActionTool(tool: CatalogEntry): { + derivedRequiredCount: number; + requiredCount: number; + userSuppliedRequiredCount: number; +} { + const required = getSchemaRequiredProperties(tool.inputSchema); + return { + derivedRequiredCount: required.filter(isLikelyWorkflowIntermediateArgument).length, + requiredCount: required.length, + userSuppliedRequiredCount: required.filter(isLikelyUserSuppliedArgument).length + }; +} + +function isLikelyWorkflowIntermediateArgument(name: string): boolean { + const normalized = normalizeSchemaPropertyName(name); + return /(?:dept|department|shop|store|merchant|product|goods|sku|cart|order|payment|coupon|address)id$/.test(normalized) || + /(?:sku|order|product|goods|shop|store)(?:code|no|num|number)$/.test(normalized) || + normalized === "id" || + normalized.endsWith("list"); +} + +function isLikelyUserSuppliedArgument(name: string): boolean { + const normalized = normalizeSchemaPropertyName(name); + return normalized === "query" || + normalized === "keyword" || + normalized === "keywords" || + normalized === "search" || + normalized === "address" || + normalized === "city" || + normalized === "latitude" || + normalized === "lat" || + normalized === "longitude" || + normalized === "lng" || + normalized === "lon" || + normalized.endsWith("name") || + normalized.endsWith("text"); +} + +function normalizeSchemaPropertyName(name: string): string { + return name.trim().toLowerCase().replace(/[^a-z0-9]+/g, ""); +} + +function getSchemaRequiredProperties(schema: Record | undefined): string[] { + return Array.isArray(schema?.required) + ? schema.required.filter((item): item is string => typeof item === "string") + : []; +} + +function cloneServerConfig(config: GatewayMcpServerConfig): GatewayMcpServerConfig { + if (config.transport === "stdio") { + return { + ...config, + args: config.args ? [...config.args] : undefined, + env: config.env ? { ...config.env } : undefined + }; + } + return { + ...config, + headers: config.headers ? { ...config.headers } : undefined + }; +} + +function normalizeTargetServerNames(serverNames: string[] | undefined, entries: Map): string[] { + if (!serverNames || serverNames.length === 0) { + return [...entries.keys()]; + } + return uniqueStrings(serverNames.map((item) => item.trim()).filter((item) => entries.has(item))); +} + +const toolHubPersistentCache = { + readDiscovery(serverName: string, configHash: string): { + cachedAt: number; + configHash: string; + lastSeenOnlineAt?: number; + tools: ToolDefinition[]; + } | null { + const store = readCacheStore(); + const entry = store.discovery[serverName]; + if (!entry) { + return null; + } + if (entry.configHash !== configHash) { + delete store.discovery[serverName]; + writeCacheStore(store); + return null; + } + return { + cachedAt: entry.cachedAt, + configHash: entry.configHash, + lastSeenOnlineAt: entry.lastSeenOnlineAt, + tools: entry.tools.map((tool) => ({ ...tool })) + }; + }, + writeDiscovery(serverName: string, configHash: string, tools: ToolDefinition[], lastSeenOnlineAt = Date.now()): void { + const store = readCacheStore(); + store.discovery[serverName] = { + cachedAt: Date.now(), + configHash, + lastSeenOnlineAt, + tools: tools.map((tool) => ({ ...tool })) + }; + writeCacheStore(store); + } +}; + +type ToolHubCacheStore = { + discovery: Record; + version: 1; +}; + +function readCacheStore(): ToolHubCacheStore { + try { + const file = toolHubCacheFile(); + if (!existsSync(file)) { + return createEmptyCacheStore(); + } + const parsed = JSON.parse(readFileSync(file, "utf8")) as unknown; + return normalizeCacheStore(parsed); + } catch { + return createEmptyCacheStore(); + } +} + +function writeCacheStore(store: ToolHubCacheStore): void { + const file = toolHubCacheFile(); + mkdirSync(path.dirname(file), { recursive: true }); + const tempFile = `${file}.${process.pid}.tmp`; + writeFileSync(tempFile, `${JSON.stringify(store, null, 2)}\n`, { encoding: "utf8", mode: 0o600 }); + renameSync(tempFile, file); +} + +function createEmptyCacheStore(): ToolHubCacheStore { + return { discovery: {}, version: 1 }; +} + +function normalizeCacheStore(value: unknown): ToolHubCacheStore { + if (!isRecord(value) || value.version !== 1 || !isRecord(value.discovery)) { + return createEmptyCacheStore(); + } + const discovery: ToolHubCacheStore["discovery"] = {}; + for (const [serverName, entryValue] of Object.entries(value.discovery)) { + if (!isRecord(entryValue) || typeof entryValue.configHash !== "string" || !Array.isArray(entryValue.tools)) { + continue; + } + discovery[serverName] = { + cachedAt: typeof entryValue.cachedAt === "number" && Number.isFinite(entryValue.cachedAt) ? entryValue.cachedAt : Date.now(), + configHash: entryValue.configHash, + lastSeenOnlineAt: typeof entryValue.lastSeenOnlineAt === "number" && Number.isFinite(entryValue.lastSeenOnlineAt) ? entryValue.lastSeenOnlineAt : undefined, + tools: entryValue.tools + .map(normalizeToolDefinitionForCache) + .filter((tool): tool is ToolDefinition => Boolean(tool)) + }; + } + return { discovery, version: 1 }; +} + +function normalizeToolDefinitionForCache(value: unknown): ToolDefinition | null { + if (!isRecord(value) || typeof value.name !== "string" || !value.name.trim()) { + return null; + } + return { + description: typeof value.description === "string" ? value.description : "", + inputSchema: normalizeOptionalSchema(value.inputSchema), + name: value.name.trim(), + outputSchema: normalizeOptionalSchema(value.outputSchema), + tags: Array.isArray(value.tags) ? value.tags.filter((tag): tag is string => typeof tag === "string") : undefined, + title: typeof value.title === "string" && value.title.trim() ? value.title.trim() : undefined + }; +} + +function toolHubCacheFile(): string { + return env("TOOLHUB_CACHE_FILE") || path.join(os.homedir(), ".claude-code-router", "toolhub-cache.json"); +} + +function hashToolHubMcpServerConfig(config: GatewayMcpServerConfig): string { + return createHash("sha256").update(stableJsonStringify(config) ?? "null").digest("hex"); +} + +function stableJsonStringify(value: unknown): string | undefined { + if (value === undefined) { + return undefined; + } + if (value === null || typeof value !== "object") { + return JSON.stringify(value); + } + if (Array.isArray(value)) { + return `[${value.map((item) => stableJsonStringify(item) ?? "null").join(",")}]`; + } + const record = value as Record; + const entries = Object.keys(record) + .filter((key) => record[key] !== undefined) + .sort() + .map((key) => `${JSON.stringify(key)}:${stableJsonStringify(record[key]) ?? "null"}`); + return `{${entries.join(",")}}`; +} + +function normalizeResolveTaskKey(value: string): string { + return value.trim().toLowerCase().replace(/\s+/g, " "); +} + +function readNonEmptyString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function summarizeValue(value: unknown): string { + try { + const text = JSON.stringify(value); + return text.length > 600 ? `${text.slice(0, 600)}...` : text; + } catch { + return String(value); + } +} + +function uniqueStrings(values: string[]): string[] { + return [...new Set(values)]; +} + +function jsonRpcResult(id: null | number | string, result: JsonValue): JsonRpcResponse { + return { + id, + jsonrpc: "2.0", + result + }; +} + +function jsonRpcError(id: null | number | string, code: number, message: string): JsonRpcResponse { + return { + error: { + code, + message + }, + id, + jsonrpc: "2.0" + }; +} + +function writeJsonRpc(response: JsonRpcResponse, messageMode: MessageMode = "content-length"): void { + const text = JSON.stringify(response); + if (messageMode === "newline-json") { + process.stdout.write(`${text}\n`); + return; + } + process.stdout.write(`Content-Length: ${Buffer.byteLength(text, "utf8")}\r\n\r\n${text}`); +} + +function toolError(code: string, message: string): unknown { + return { + content: [{ + text: `${code}: ${message}`, + type: "text" + }], + isError: true + }; +} + +function toolResult(payload: Record): unknown { + return { + ...payload, + content: [{ + text: JSON.stringify(payload, null, 2), + type: "text" + }], + structuredContent: payload + }; +} + +function env(name: string): string { + return process.env[name]?.trim() ?? ""; +} + +function envNumber(name: string, fallback: number): number { + const parsed = Number(process.env[name]); + return Number.isFinite(parsed) ? parsed : fallback; +} + +function normalizeMaxTools(value: unknown): number { + const parsed = typeof value === "number" ? value : Number(value); + return Number.isFinite(parsed) ? Math.min(Math.max(Math.floor(parsed), 1), 20) : defaultMaxTools; +} + +function normalizeTimeout(value: unknown, fallback: number): number { + const parsed = typeof value === "number" ? value : Number(value); + return Number.isFinite(parsed) ? Math.min(Math.max(Math.floor(parsed), 100), 600_000) : fallback; +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function isStringRecord(value: unknown): value is Record { + return isRecord(value) && Object.values(value).every((item) => typeof item === "string"); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + +function toError(error: unknown): Error { + return error instanceof Error ? error : new Error(String(error)); +} diff --git a/packages/core/src/models/catalog-file.ts b/packages/core/src/models/catalog-file.ts new file mode 100644 index 0000000..08c09e1 --- /dev/null +++ b/packages/core/src/models/catalog-file.ts @@ -0,0 +1,48 @@ +import { existsSync, readFileSync } from "node:fs"; +import { resolve as pathResolve } from "node:path"; + +export type LoadedModelCatalogPayload = { + loadedFrom: string; + payload: unknown; +}; + +export function loadModelCatalogPayload(): LoadedModelCatalogPayload | undefined { + for (const candidate of modelCatalogPathCandidates()) { + if (!existsSync(candidate)) { + continue; + } + return { + loadedFrom: candidate, + payload: JSON.parse(readFileSync(candidate, "utf8")) as unknown + }; + } + return undefined; +} + +export function modelCatalogPathCandidates(): string[] { + return uniqueStrings([ + process.env.CCR_MODEL_CATALOG_PATH?.trim() || "", + process.env.CCR_MODELS_JSON_PATH?.trim() || "", + pathResolve(process.cwd(), "models.json"), + pathResolve(process.cwd(), "packages", "core", "models.json"), + pathResolve(process.cwd(), "packages", "cli", "models.json"), + pathResolve(__dirname, "..", "models.json"), + pathResolve(__dirname, "..", "assets", "models.json"), + pathResolve(__dirname, "..", "..", "models.json"), + pathResolve(__dirname, "..", "..", "..", "models.json") + ]); +} + +function uniqueStrings(values: Array): string[] { + const seen = new Set(); + const strings: string[] = []; + for (const value of values) { + const trimmed = value?.trim(); + if (!trimmed || seen.has(trimmed)) { + continue; + } + seen.add(trimmed); + strings.push(trimmed); + } + return strings; +} diff --git a/packages/core/src/models/pricing-service.ts b/packages/core/src/models/pricing-service.ts new file mode 100644 index 0000000..e581d21 --- /dev/null +++ b/packages/core/src/models/pricing-service.ts @@ -0,0 +1,378 @@ +import { fetchWithSystemProxy } from "@ccr/core/proxy/system-proxy-fetch"; + +type ModelPricingSource = "litellm" | "models.dev" | "openrouter"; + +export type UsageCostInput = { + cacheReadTokens?: number; + cacheWriteTokens?: number; + inputTokens?: number; + model?: string; + outputTokens?: number; + provider?: string; +}; + +export type UsageCostEstimate = { + amountUsd: number; + model: string; + source: ModelPricingSource; +}; + +type ModelPrice = { + cacheReadUsdPerToken?: number; + cacheWriteUsdPerToken?: number; + inputUsdPerToken: number; + model: string; + outputUsdPerToken: number; + provider?: string; + source: ModelPricingSource; +}; + +type PriceCatalog = { + loadedAt: number; + prices: ModelPrice[]; +}; + +const catalogTtlMs = 24 * 60 * 60 * 1000; +const fetchTimeoutMs = 5000; +const liteLlmPricesUrl = "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json"; +const modelsDevPricesUrl = "https://models.dev/api.json"; +const openRouterModelsUrl = "https://openrouter.ai/api/v1/models"; + +let catalog: PriceCatalog | undefined; +let catalogPromise: Promise | undefined; + +export async function estimateUsageCostUsd(input: UsageCostInput): Promise { + const model = input.model?.trim(); + if (!model || model === "unknown") { + return undefined; + } + + const prices = await getPriceCatalog(); + const price = findModelPrice(prices.prices, model, input.provider); + if (!price) { + return undefined; + } + + const inputTokens = normalizeCount(input.inputTokens); + const outputTokens = normalizeCount(input.outputTokens); + const cacheReadTokens = normalizeCount(input.cacheReadTokens); + const cacheWriteTokens = normalizeCount(input.cacheWriteTokens); + const amountUsd = + inputTokens * price.inputUsdPerToken + + outputTokens * price.outputUsdPerToken + + cacheReadTokens * (price.cacheReadUsdPerToken ?? price.inputUsdPerToken) + + cacheWriteTokens * (price.cacheWriteUsdPerToken ?? price.inputUsdPerToken); + + if (!Number.isFinite(amountUsd) || amountUsd <= 0) { + return undefined; + } + + return { + amountUsd, + model: price.model, + source: price.source + }; +} + +async function getPriceCatalog(): Promise { + if (catalog && Date.now() - catalog.loadedAt < catalogTtlMs) { + return catalog; + } + + catalogPromise ??= loadPriceCatalog(); + try { + catalog = await catalogPromise; + return catalog; + } finally { + catalogPromise = undefined; + } +} + +async function loadPriceCatalog(): Promise { + const results = await Promise.allSettled([ + fetchLiteLlmPrices(), + fetchModelsDevPrices(), + fetchOpenRouterPrices() + ]); + const prices = results.flatMap((result) => result.status === "fulfilled" ? result.value : []); + return { + loadedAt: Date.now(), + prices + }; +} + +async function fetchLiteLlmPrices(): Promise { + const payload = await fetchJson(liteLlmPricesUrl); + if (!isRecord(payload)) { + return []; + } + + return Object.entries(payload) + .map(([model, value]) => { + if (model === "sample_spec" || !isRecord(value)) { + return undefined; + } + const inputUsdPerToken = firstNumber(value, [ + "input_cost_per_token", + "prompt_cost_per_token" + ]); + const outputUsdPerToken = firstNumber(value, [ + "output_cost_per_token", + "completion_cost_per_token", + "output_cost_per_reasoning_token" + ]); + return priceFromTokenCosts({ + cacheReadUsdPerToken: firstNumber(value, [ + "cache_read_input_token_cost", + "input_cache_read_cost_per_token", + "cache_read_cost_per_token" + ]), + cacheWriteUsdPerToken: firstNumber(value, [ + "cache_creation_input_token_cost", + "input_cache_write_cost_per_token", + "cache_write_cost_per_token" + ]), + inputUsdPerToken, + model, + outputUsdPerToken, + provider: readString(value.litellm_provider), + source: "litellm" + }); + }) + .filter((price): price is ModelPrice => Boolean(price)); +} + +async function fetchModelsDevPrices(): Promise { + const payload = await fetchJson(modelsDevPricesUrl); + if (!isRecord(payload)) { + return []; + } + + const prices: ModelPrice[] = []; + for (const [providerId, provider] of Object.entries(payload)) { + if (!isRecord(provider) || !isRecord(provider.models)) { + continue; + } + for (const [modelKey, model] of Object.entries(provider.models)) { + if (!isRecord(model) || !isRecord(model.cost)) { + continue; + } + const cost = model.cost; + const price = priceFromMillionTokenCosts({ + cacheReadUsdPerMillionTokens: readNumber(cost.cache_read), + cacheWriteUsdPerMillionTokens: readNumber(cost.cache_write), + inputUsdPerMillionTokens: readNumber(cost.input), + model: readString(model.id) || modelKey, + outputUsdPerMillionTokens: readNumber(cost.output), + provider: providerId, + source: "models.dev" + }); + if (price) { + prices.push(price); + } + } + } + return prices; +} + +async function fetchOpenRouterPrices(): Promise { + const payload = await fetchJson(openRouterModelsUrl); + if (!isRecord(payload) || !Array.isArray(payload.data)) { + return []; + } + + return payload.data + .map((model) => { + if (!isRecord(model) || !isRecord(model.pricing)) { + return undefined; + } + const pricing = model.pricing; + return priceFromTokenCosts({ + cacheReadUsdPerToken: readNumber(pricing.input_cache_read), + cacheWriteUsdPerToken: readNumber(pricing.input_cache_write), + inputUsdPerToken: readNumber(pricing.prompt), + model: readString(model.id) || readString(model.canonical_slug), + outputUsdPerToken: readNumber(pricing.completion), + provider: "openrouter", + source: "openrouter" + }); + }) + .filter((price): price is ModelPrice => Boolean(price)); +} + +function priceFromMillionTokenCosts(input: { + cacheReadUsdPerMillionTokens?: number; + cacheWriteUsdPerMillionTokens?: number; + inputUsdPerMillionTokens?: number; + model: string; + outputUsdPerMillionTokens?: number; + provider?: string; + source: ModelPricingSource; +}): ModelPrice | undefined { + return priceFromTokenCosts({ + cacheReadUsdPerToken: divideByMillion(input.cacheReadUsdPerMillionTokens), + cacheWriteUsdPerToken: divideByMillion(input.cacheWriteUsdPerMillionTokens), + inputUsdPerToken: divideByMillion(input.inputUsdPerMillionTokens), + model: input.model, + outputUsdPerToken: divideByMillion(input.outputUsdPerMillionTokens), + provider: input.provider, + source: input.source + }); +} + +function priceFromTokenCosts(input: { + cacheReadUsdPerToken?: number; + cacheWriteUsdPerToken?: number; + inputUsdPerToken?: number; + model?: string; + outputUsdPerToken?: number; + provider?: string; + source: ModelPricingSource; +}): ModelPrice | undefined { + const model = input.model?.trim(); + const inputUsdPerToken = normalizePrice(input.inputUsdPerToken); + const outputUsdPerToken = normalizePrice(input.outputUsdPerToken); + if (!model || inputUsdPerToken === undefined || outputUsdPerToken === undefined) { + return undefined; + } + + return { + cacheReadUsdPerToken: normalizePrice(input.cacheReadUsdPerToken), + cacheWriteUsdPerToken: normalizePrice(input.cacheWriteUsdPerToken), + inputUsdPerToken, + model, + outputUsdPerToken, + provider: input.provider?.trim() || undefined, + source: input.source + }; +} + +function findModelPrice(prices: ModelPrice[], model: string, provider: string | undefined): ModelPrice | undefined { + const candidateKeys = modelCandidateKeys(model, provider); + const providerIsOpenRouter = normalizeKey(provider).includes("openrouter"); + const sourcePriority: ModelPricingSource[] = providerIsOpenRouter + ? ["openrouter", "models.dev", "litellm"] + : ["models.dev", "litellm", "openrouter"]; + + for (const source of sourcePriority) { + for (const key of candidateKeys) { + const price = prices.find((item) => item.source === source && priceMatchesKey(item, key)); + if (price) { + return price; + } + } + } + return undefined; +} + +function priceMatchesKey(price: ModelPrice, key: string): boolean { + const keys = new Set([ + normalizeKey(price.model), + normalizeKey(lastPathSegment(price.model)) + ]); + if (price.provider) { + keys.add(normalizeKey(`${price.provider}/${price.model}`)); + keys.add(normalizeKey(`${price.provider}/${lastPathSegment(price.model)}`)); + } + return keys.has(key); +} + +function modelCandidateKeys(model: string, provider: string | undefined): string[] { + const rawModel = model.trim(); + const rawProvider = provider?.trim() || ""; + const providerPrefixes = providerModelPrefixes(rawProvider); + const values = [ + rawModel, + lastPathSegment(rawModel), + ...providerPrefixes.map((prefix) => `${prefix}/${rawModel}`), + ...providerPrefixes.map((prefix) => `${prefix}/${lastPathSegment(rawModel)}`) + ]; + return unique(values.map(normalizeKey).filter(Boolean)); +} + +function providerModelPrefixes(provider: string): string[] { + const normalized = normalizeKey(provider); + const prefixes = new Set(); + const add = (value: string) => prefixes.add(value); + + if (normalized.includes("openai")) add("openai"); + if (normalized.includes("anthropic") || normalized.includes("claude")) add("anthropic"); + if (normalized.includes("gemini") || normalized.includes("google")) add("google"); + if (normalized.includes("deepseek")) add("deepseek"); + if (normalized.includes("moonshot") || normalized.includes("kimi")) add("moonshotai"); + if (normalized.includes("mistral")) add("mistral"); + if (normalized.includes("zhipu") || normalized.includes("bigmodel") || normalized.includes("glm")) add("zhipuai"); + if (normalized.includes("zai") || normalized.includes("z-ai") || normalized.includes("z.ai")) add("z-ai"); + if (normalized.includes("qwen")) add("qwen"); + if (normalized.includes("alibaba") || normalized.includes("bailian") || normalized.includes("dashscope")) add("alibaba"); + if (normalized.includes("siliconflow")) add("siliconflow"); + if (normalized.includes("openrouter")) add("openrouter"); + + return Array.from(prefixes); +} + +async function fetchJson(url: string): Promise { + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), fetchTimeoutMs); + try { + const response = await fetchWithSystemProxy(url, { + headers: { accept: "application/json" }, + signal: controller.signal + }); + if (!response.ok) { + throw new Error(`HTTP ${response.status}`); + } + return await response.json() as unknown; + } finally { + clearTimeout(timer); + } +} + +function firstNumber(record: Record, keys: string[]): number | undefined { + for (const key of keys) { + const value = readNumber(record[key]); + if (value !== undefined) { + return value; + } + } + return undefined; +} + +function readNumber(value: unknown): number | undefined { + const parsed = typeof value === "number" ? value : typeof value === "string" ? Number(value) : Number.NaN; + return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined; +} + +function readString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function normalizePrice(value: number | undefined): number | undefined { + return value !== undefined && Number.isFinite(value) && value >= 0 ? value : undefined; +} + +function divideByMillion(value: number | undefined): number | undefined { + return value === undefined ? undefined : value / 1_000_000; +} + +function normalizeCount(value: unknown): number { + const parsed = typeof value === "number" ? value : Number(value); + return Number.isFinite(parsed) && parsed > 0 ? parsed : 0; +} + +function normalizeKey(value: string | undefined): string { + return value?.trim().toLowerCase().replace(/[\s:_]+/g, "-").replace(/-+/g, "-") ?? ""; +} + +function lastPathSegment(value: string): string { + const trimmed = value.trim().replace(/^\/+|\/+$/g, ""); + return trimmed.split("/").filter(Boolean).at(-1) ?? trimmed; +} + +function unique(values: string[]): string[] { + return Array.from(new Set(values)); +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} diff --git a/packages/core/src/observability/request-log-store.ts b/packages/core/src/observability/request-log-store.ts new file mode 100644 index 0000000..edd289e --- /dev/null +++ b/packages/core/src/observability/request-log-store.ts @@ -0,0 +1,3616 @@ +import { mkdirSync } from "node:fs"; +import { dirname } from "node:path"; +import { StringDecoder } from "node:string_decoder"; +import { REQUEST_LOGS_DB_FILE } from "@ccr/core/config/constants"; +import { estimateUsageCostUsd } from "@ccr/core/models/pricing-service"; +import { createBetterSqliteDatabase, type BetterSqliteDatabase } from "@ccr/core/storage/sqlite-native"; +import { normalizeUsageInputTokens } from "@ccr/core/usage/normalization"; +import type { + AgentAnalysisAgentRow, + AgentAnalysisFilter, + AgentAnalysisRequestRow, + AgentAnalysisSessionDetail, + AgentAnalysisSessionModelRow, + AgentAnalysisSessionRow, + AgentAnalysisSnapshot, + AgentAnalysisSubagentRow, + AgentAnalysisTrace, + AgentAnalysisTracePayloadFullResult, + AgentAnalysisTracePayloadPreview, + AgentAnalysisTracePayloadRequest, + AgentAnalysisTraceRun, + AgentAnalysisTraceRunKind, + AgentAnalysisTraceToolDetail, + AgentAnalysisToolRow, + AgentAnalysisTotals, + AgentObservabilityClientRow, + AgentObservabilityEndpointRow, + AgentObservabilityErrorRow, + AgentObservabilityRouteRow, + AgentKind, + GatewayProviderProtocol, + RequestLogBody, + RequestLogDetailRequest, + RequestLogEntry, + RequestLogFilterOptions, + RequestLogListFilter, + RequestLogPage, + RequestLogRetryAttempt, + RequestLogStatusFilter, + UsageStatsRange +} from "@ccr/core/contracts/app"; + +type SqlDatabase = BetterSqliteDatabase; +type SqlValue = bigint | Buffer | number | string | null; + +type HeaderRecord = Record; + +type UsageNumbers = { + cacheReadTokens?: number; + cacheWriteTokens?: number; + inputIncludesCacheTokens?: boolean; + inputTokens?: number; + outputTokens?: number; + reasoningTokens?: number; + totalTokens?: number; +}; + +type UsageSnapshot = UsageNumbers & { + model?: string; +}; + +type RequestLogUsageContext = { + model: string; + path: string; + provider: string; +}; + +type RequestLogRecordInput = { + client?: string; + completedAt?: string; + durationMs: number; + error?: string; + fallbackModel?: string; + method: string; + path: string; + providerName?: string; + providerProtocol?: GatewayProviderProtocol; + requestBody: Buffer; + requestHeaders: HeaderRecord; + requestId?: string; + responseBodyText?: string; + responseBodyTruncated?: boolean; + responseHeaders?: Headers | HeaderRecord; + startedAt: string; + statusCode: number; + url: string; +}; + +export type RequestLogRawTraceUpdateInput = { + method?: string; + model?: string; + path?: string; + provider?: string; + requestBodyContentType?: string; + requestBodyText?: string; + requestBodyTruncated?: boolean; + requestHeaders?: HeaderRecord; + requestId: string; + isStream?: boolean; + responseBodyContentType?: string; + responseBodyText?: string; + responseBodyTruncated?: boolean; + responseHeaders?: HeaderRecord; + statusCode?: number; + url?: string; +}; + +type StoredRequestLogEntry = { + cacheReadTokens: number; + cacheWriteTokens: number; + client: string; + completedAt: string; + costUsd: number | undefined; + createdAt: string; + credentialChain: string[]; + credentialId: string; + credentialSaturated: boolean; + durationMs: number; + error: string; + id: number; + inputTokens: number; + isStream: boolean; + method: string; + model: string; + ok: boolean; + outputTokens: number; + path: string; + provider: string; + reasoningTokens: number; + requestBody: RequestLogBody; + requestHeaders: Record; + requestId: string; + retryAttempts: RequestLogRetryAttempt[]; + responseBody?: RequestLogBody; + responseHeaders: Record; + statusCode: number; + totalTokens: number; + url: string; +}; + +type AnalyzedAgentRequest = AgentAnalysisRequestRow & { + client: string; + completedAt: string; + endedAtMs: number; + startedAtMs: number; + toolCalls: AgentToolCallDetail[]; + toolResults: AgentToolResultDetail[]; +}; + +type AgentLogDetails = { + agent: AgentKind; + routeReason?: string; + sessionId: string; + subagentModel?: string; + toolCalls: AgentToolCallDetail[]; + toolResults: AgentToolResultDetail[]; + tools: string[]; + userAgent?: string; +}; + +type AgentTextSignalOptions = { + allowStandaloneCodex?: boolean; +}; + +type AgentToolCallDetail = { + id?: string; + input?: AgentAnalysisTracePayloadPreview; + name: string; +}; + +type AgentToolResultDetail = { + id: string; + requestId?: string; + requestLogId: number; + result?: AgentAnalysisTracePayloadPreview; +}; + +type StreamedToolCallInput = { + fragments: string[]; + id: string; + input?: unknown; + name?: string; +}; + +export type SseErrorDetector = { + append: (chunk: Buffer | string) => string | undefined; + finish: () => string | undefined; + read: () => string | undefined; +}; + +type ToolCallStreamState = { + calls: Map; + indexToId: Map; +}; + +const maxBodyBytes = 2 * 1024 * 1024; +const maxAgentAnalysisRows = 5000; +const maxAgentSessionDetailRequests = 250; +const maxTracePayloadPreviewChars = 1600; +const requestLogBodyMetadataSelect = ` + '' AS request_body_text, + '' AS response_body_text +`; +const emptyAgentAnalysisTotals: AgentAnalysisTotals = { + avgDurationMs: 0, + cacheRatio: 0, + cacheReadTokens: 0, + cacheTokens: 0, + cacheWriteTokens: 0, + costUsd: 0, + errorCount: 0, + inputTokens: 0, + maxConcurrentRequests: 0, + maxDurationMs: 0, + outputTokens: 0, + p50DurationMs: 0, + p95DurationMs: 0, + p99DurationMs: 0, + requestCount: 0, + sessionCount: 0, + subagentCallCount: 0, + successRate: 0, + toolCallCount: 0, + totalTokens: 0 +}; +const sensitiveHeaderNames = new Set([ + "authorization", + "cookie", + "proxy-authorization", + "set-cookie", + "x-api-key", + "x-auth-api-key-id", + "x-auth-sub" +]); + +type AgentAnalysisCacheEntry = { + filterKey: string; + revision: number; + snapshot: AgentAnalysisSnapshot; +}; + +export class RequestLogStore { + private database?: SqlDatabase; + private initPromise?: Promise; + private lastRetentionCleanupDay?: string; + private revision = 0; + private analysisCache?: AgentAnalysisCacheEntry; + + constructor(private readonly dbFile: string) {} + + async record(input: RequestLogRecordInput): Promise { + const database = await this.getDatabase(); + this.pruneOldRequestLogs(database); + const requestHeaders = sanitizeHeaders(input.requestHeaders); + const responseHeaders = sanitizeHeaders(headersToRecord(input.responseHeaders)); + const responseBodyText = input.responseBodyText ?? ""; + const responseError = normalizeFilterValue(input.error) ?? + detectSseError(responseBodyText, headerValue(responseHeaders, "content-type")); + const bodyUsage = extractUsageFromBody(responseBodyText); + const usage: UsageSnapshot = normalizeUsageInputTokens(extractUsageFromBillingHeaders(input.responseHeaders) ?? bodyUsage, { + path: input.path, + providerProtocol: input.providerProtocol, + usageHint: bodyUsage + }) ?? {}; + const route = splitRouteSelector(input.fallbackModel); + const requestModel = extractModelFromBody(input.requestBody.toString("utf8")); + const provider = + normalizeFilterValue(input.providerName) ?? + readResponseHeader(input.responseHeaders, "x-gateway-target-provider-name") ?? + readResponseHeader(input.responseHeaders, "x-gateway-target-provider") ?? + route.provider; + const inputTokens = normalizeCount(usage.inputTokens); + const outputTokens = normalizeCount(usage.outputTokens); + const reasoningTokens = normalizeCount(usage.reasoningTokens); + const cacheReadTokens = normalizeCount(usage.cacheReadTokens); + const cacheWriteTokens = normalizeCount(usage.cacheWriteTokens); + const totalTokens = + normalizeCount(usage.totalTokens) || + inputTokens + outputTokens + cacheReadTokens + cacheWriteTokens; + const model = normalizeLabel(usage.model ?? route.model ?? requestModel ?? input.fallbackModel, "unknown"); + const providerName = normalizeLabel(provider, "unknown"); + const credentialInfo = readCredentialLogInfo(responseHeaders, requestHeaders); + const cost = await estimateUsageCostUsd({ + cacheReadTokens, + cacheWriteTokens, + inputTokens, + model, + outputTokens, + provider: providerName + }); + const requestBody = bodyFromBuffer( + input.requestBody, + headerValue(requestHeaders, "content-type") + ); + const responseBody = bodyFromText( + responseBodyText, + headerValue(responseHeaders, "content-type"), + Boolean(input.responseBodyTruncated) + ); + const isStream = inferRequestLogIsStream({ + path: input.path, + requestBodyText: requestBody.encoding === "utf8" ? requestBody.text : undefined, + requestHeaders, + responseBodyContentType: responseBody.contentType, + responseHeaders, + url: input.url + }); + + const statement = database.prepare(` + INSERT INTO request_logs ( + created_at, + completed_at, + request_id, + client, + method, + path, + url, + provider, + credential_id, + credential_chain, + credential_saturated, + model, + is_stream, + status_code, + ok, + duration_ms, + input_tokens, + output_tokens, + reasoning_tokens, + cache_read_tokens, + cache_write_tokens, + total_tokens, + cost_usd, + request_headers, + response_headers, + request_body_text, + request_body_encoding, + request_body_content_type, + request_body_size_bytes, + request_body_truncated, + response_body_text, + response_body_encoding, + response_body_content_type, + response_body_size_bytes, + response_body_truncated, + error + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + `); + + statement.run( + input.startedAt, + input.completedAt ?? new Date().toISOString(), + input.requestId ?? "", + normalizeLabel(input.client, "unknown"), + input.method, + input.path, + input.url, + providerName, + credentialInfo.id, + credentialInfo.chain.join(","), + credentialInfo.saturated ? 1 : 0, + model, + isStream ? 1 : 0, + normalizeCount(input.statusCode), + isSuccessStatus(input.statusCode, responseError) ? 1 : 0, + normalizeCount(input.durationMs), + inputTokens, + outputTokens, + reasoningTokens, + cacheReadTokens, + cacheWriteTokens, + totalTokens, + cost?.amountUsd ?? null, + JSON.stringify(requestHeaders), + JSON.stringify(responseHeaders), + requestBody.text, + requestBody.encoding, + requestBody.contentType ?? "", + requestBody.sizeBytes, + requestBody.truncated ? 1 : 0, + responseBody.text, + responseBody.encoding, + responseBody.contentType ?? "", + responseBody.sizeBytes, + responseBody.truncated ? 1 : 0, + responseError ?? "" + ); + this.revision += 1; + } + + async updateFromRawTrace(input: RequestLogRawTraceUpdateInput): Promise { + const requestId = input.requestId.trim(); + if (!requestId) { + return false; + } + + const database = await this.getDatabase(); + this.pruneOldRequestLogs(database); + if (!hasRequestLogWithRequestId(database, requestId)) { + return false; + } + const existingUsageContext = readRequestLogUsageContext(database, requestId); + + const sets: string[] = []; + const params: SqlValue[] = []; + const pushValue = (column: string, value: SqlValue | undefined) => { + if (value === undefined) { + return; + } + sets.push(`${column} = ?`); + params.push(value); + }; + + const url = normalizeFilterValue(input.url); + const path = normalizeFilterValue(input.path) ?? pathFromUrl(url); + const usagePath = path ?? existingUsageContext.path; + const modelFromTrace = normalizeFilterValue(input.model); + const providerFromTrace = normalizeFilterValue(input.provider); + const statusCode = input.statusCode === undefined ? undefined : normalizeCount(input.statusCode); + const requestHeaders = input.requestHeaders === undefined ? undefined : sanitizeHeaders(input.requestHeaders); + const responseHeaders = input.responseHeaders === undefined ? undefined : sanitizeHeaders(input.responseHeaders); + const responseBodyContentType = input.responseBodyContentType ?? headerValue(responseHeaders ?? {}, "content-type"); + const sseError = input.responseBodyText === undefined + ? undefined + : detectSseError(input.responseBodyText, responseBodyContentType); + const mergedRequestHeaders = requestHeaders + ? mergeRequestHeadersForRawTrace(readRequestHeadersForRequestId(database, requestId), requestHeaders) + : undefined; + + pushValue("method", normalizeFilterValue(input.method)); + pushValue("path", path); + pushValue("url", url); + pushValue("provider", providerFromTrace); + pushValue("model", modelFromTrace); + if (statusCode !== undefined && statusCode > 0) { + pushValue("status_code", statusCode); + pushValue("ok", isSuccessStatus(statusCode, sseError) ? 1 : 0); + } + if (sseError) { + pushValue("error", sseError); + if (statusCode === undefined) { + pushValue("ok", 0); + } + } + if (mergedRequestHeaders) { + pushValue("request_headers", JSON.stringify(mergedRequestHeaders)); + } + if (responseHeaders) { + pushValue("response_headers", JSON.stringify(responseHeaders)); + } + if (input.responseBodyText !== undefined || responseHeaders) { + const bodyUsage = input.responseBodyText === undefined + ? undefined + : extractUsageFromBody(input.responseBodyText); + const usage: UsageSnapshot = normalizeUsageInputTokens(extractUsageFromBillingHeaders(responseHeaders) ?? bodyUsage, { + path: usagePath, + usageHint: bodyUsage + }) ?? {}; + if (hasUsageNumbers(usage)) { + const inputTokens = normalizeCount(usage.inputTokens); + const outputTokens = normalizeCount(usage.outputTokens); + const reasoningTokens = normalizeCount(usage.reasoningTokens); + const cacheReadTokens = normalizeCount(usage.cacheReadTokens); + const cacheWriteTokens = normalizeCount(usage.cacheWriteTokens); + const totalTokens = + normalizeCount(usage.totalTokens) || + inputTokens + outputTokens + cacheReadTokens + cacheWriteTokens; + const model = normalizeLabel(usage.model ?? modelFromTrace ?? existingUsageContext.model, "unknown"); + const provider = normalizeLabel(providerFromTrace ?? existingUsageContext.provider, "unknown"); + const cost = await estimateUsageCostUsd({ + cacheReadTokens, + cacheWriteTokens, + inputTokens, + model, + outputTokens, + provider + }); + + pushValue("input_tokens", inputTokens); + pushValue("output_tokens", outputTokens); + pushValue("reasoning_tokens", reasoningTokens); + pushValue("cache_read_tokens", cacheReadTokens); + pushValue("cache_write_tokens", cacheWriteTokens); + pushValue("total_tokens", totalTokens); + pushValue("cost_usd", cost?.amountUsd ?? null); + if (usage.model && !modelFromTrace) { + pushValue("model", model); + } + } + } + if (hasCredentialLogHeaders(responseHeaders ?? {}) || hasCredentialLogHeaders(mergedRequestHeaders ?? {})) { + const credentialInfo = readCredentialLogInfo(responseHeaders ?? {}, mergedRequestHeaders ?? {}); + pushValue("credential_id", credentialInfo.id); + pushValue("credential_chain", credentialInfo.chain.join(",")); + pushValue("credential_saturated", credentialInfo.saturated ? 1 : 0); + } + const hasStreamSignal = + input.isStream !== undefined || + input.path !== undefined || + input.url !== undefined || + input.requestBodyText !== undefined || + input.requestHeaders !== undefined || + input.responseBodyContentType !== undefined || + input.responseHeaders !== undefined; + if (hasStreamSignal) { + pushValue("is_stream", inferRequestLogIsStream({ + path, + requestBodyText: input.requestBodyText, + requestHeaders: mergedRequestHeaders, + responseBodyContentType: input.responseBodyContentType, + responseHeaders, + responseWasStream: input.isStream, + url + }) ? 1 : 0); + } + if (input.requestBodyText !== undefined) { + const requestBody = bodyFromText( + input.requestBodyText, + input.requestBodyContentType ?? headerValue(mergedRequestHeaders ?? {}, "content-type"), + Boolean(input.requestBodyTruncated) + ); + pushBodyValues(sets, params, "request", requestBody); + } + if (input.responseBodyText !== undefined) { + const responseBody = bodyFromText( + input.responseBodyText, + responseBodyContentType, + Boolean(input.responseBodyTruncated) + ); + pushBodyValues(sets, params, "response", responseBody); + } + + if (sets.length === 0) { + return true; + } + + database.prepare(`UPDATE request_logs SET ${sets.join(", ")} WHERE request_id = ?`).run(...params, requestId); + this.revision += 1; + return true; + } + + async list(filter: RequestLogListFilter = {}): Promise { + const database = await this.getDatabase(); + this.pruneOldRequestLogs(database); + const pageSize = clampInteger(filter.pageSize, 1, 100, 25); + const page = clampInteger(filter.page, 1, Number.MAX_SAFE_INTEGER, 1); + const query = buildLogWhereClause(filter); + const count = firstNumber(queryRows(database, `SELECT COUNT(*) AS total FROM request_logs ${query.where}`, query.params), "total"); + const totalPages = Math.max(1, Math.ceil(count / pageSize)); + const normalizedPage = Math.min(page, totalPages); + const offset = (normalizedPage - 1) * pageSize; + const rows = queryRows( + database, + ` + SELECT + rowid AS id, + created_at, + completed_at, + request_id, + client, + method, + path, + url, + provider, + credential_id, + credential_chain, + credential_saturated, + model, + is_stream, + status_code, + ok, + duration_ms, + input_tokens, + output_tokens, + reasoning_tokens, + cache_read_tokens, + cache_write_tokens, + total_tokens, + cost_usd, + request_headers, + response_headers, + ${requestLogBodyMetadataSelect}, + request_body_encoding, + request_body_content_type, + request_body_size_bytes, + request_body_truncated, + response_body_encoding, + response_body_content_type, + response_body_size_bytes, + response_body_truncated, + error + FROM request_logs + ${query.where} + ORDER BY created_at DESC, id DESC + LIMIT ? OFFSET ? + `, + [...query.params, pageSize, offset] + ).map(toRequestLogEntry); + + return { + generatedAt: new Date().toISOString(), + items: rows, + options: await this.getFilterOptions(), + page: normalizedPage, + pageSize, + total: count, + totalPages + }; + } + + async getDetail(request: RequestLogDetailRequest): Promise { + const database = await this.getDatabase(); + const requestLogId = normalizeCount(request.id); + if (requestLogId <= 0) { + return undefined; + } + return readRequestLogById(database, requestLogId); + } + + async analyze(filter: AgentAnalysisFilter = {}): Promise { + const database = await this.getDatabase(); + this.pruneOldRequestLogs(database); + const now = new Date(); + const filterKey = agentAnalysisCacheKey(filter); + if (this.analysisCache?.revision === this.revision && this.analysisCache.filterKey === filterKey) { + return { + ...this.analysisCache.snapshot, + generatedAt: now.toISOString() + }; + } + const range = normalizeAgentAnalysisRange(filter.range); + const since = getAgentAnalysisSince(range, now); + const rows = queryRows( + database, + ` + SELECT + rowid AS id, + created_at, + completed_at, + request_id, + client, + method, + path, + url, + provider, + credential_id, + credential_chain, + credential_saturated, + model, + is_stream, + status_code, + ok, + duration_ms, + input_tokens, + output_tokens, + reasoning_tokens, + cache_read_tokens, + cache_write_tokens, + total_tokens, + cost_usd, + request_headers, + response_headers, + request_body_text, + request_body_encoding, + request_body_content_type, + request_body_size_bytes, + request_body_truncated, + response_body_text, + response_body_encoding, + response_body_content_type, + response_body_size_bytes, + response_body_truncated, + error + FROM request_logs + WHERE source_usage_id IS NULL + AND path NOT LIKE ? + AND created_at >= ? + ORDER BY created_at DESC, id DESC + LIMIT ? + `, + ["%/count_tokens%", since.toISOString(), maxAgentAnalysisRows] + ) + .map(toRequestLogEntry) + .reverse(); + + const requestedAgent = normalizeAgentFilter(filter.agent); + const analyzed = rows + .map(toAnalyzedAgentRequest) + .filter((request) => requestedAgent === "all" || request.agent === requestedAgent); + const requests = applyRequestConcurrency(analyzed); + const sessionScopedRequests = selectAgentSessionRequests(requests, filter); + const analysisRequests = sessionScopedRequests + ? applyRequestConcurrency(sessionScopedRequests) + : requests; + const selectedSession = sessionScopedRequests + ? buildAgentSessionDetail(analysisRequests) + : undefined; + + const snapshot: AgentAnalysisSnapshot = { + agents: buildAgentRows(analysisRequests), + clients: buildAgentClientRows(analysisRequests), + concurrency: buildAgentConcurrencySeries(range, now, analysisRequests), + endpoints: buildAgentEndpointRows(analysisRequests), + errors: buildAgentErrorRows(analysisRequests), + generatedAt: now.toISOString(), + range, + recentRequests: analysisRequests.slice(-50).reverse().map(stripAnalysisInternals), + routes: buildAgentRouteRows(analysisRequests), + scannedRequestCount: rows.length, + ...(selectedSession ? { selectedSession } : {}), + sessions: buildAgentSessionRows(requests), + subagents: buildAgentSubagentRows(analysisRequests), + tools: buildAgentToolRows(analysisRequests), + totals: buildAgentAnalysisTotals(analysisRequests) + }; + this.analysisCache = { + filterKey, + revision: this.revision, + snapshot + }; + return snapshot; + } + + async getTracePayload(request: AgentAnalysisTracePayloadRequest): Promise { + const database = await this.getDatabase(); + const requestLogId = normalizeCount(request.requestLogId); + if (requestLogId <= 0) { + return emptyTracePayloadResult(); + } + const entry = readRequestLogById(database, requestLogId); + if (!entry) { + return emptyTracePayloadResult(); + } + + const body = request.part === "tool-input" ? entry.responseBody : entry.requestBody; + if (!body || body.encoding !== "utf8") { + return emptyTracePayloadResult(Boolean(body?.truncated)); + } + + const payloads = parseLogBodyPayloads(body); + const found = request.part === "tool-input" + ? findToolCallPayload(payloads, request.callId) + : findToolResultPayload(payloads, request.callId); + if (!found.found) { + return emptyTracePayloadResult(body.truncated); + } + return fullPayloadResult(found.value, body.truncated); + } + + private async getFilterOptions(): Promise { + const database = await this.getDatabase(); + return { + credentials: readDistinctValues(database, "credential_id"), + models: readDistinctValues(database, "model"), + providers: readDistinctValues(database, "provider") + }; + } + + private async getDatabase(): Promise { + if (this.database) { + return this.database; + } + + this.initPromise ??= this.open(); + return this.initPromise; + } + + private async open(): Promise { + mkdirSync(dirname(this.dbFile), { recursive: true }); + const database = createBetterSqliteDatabase(this.dbFile); + configureSqliteDatabase(database); + + database.exec(` + CREATE TABLE IF NOT EXISTS request_logs ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + source_usage_id INTEGER, + created_at TEXT NOT NULL, + completed_at TEXT NOT NULL DEFAULT '', + request_id TEXT NOT NULL DEFAULT '', + client TEXT NOT NULL DEFAULT 'unknown', + method TEXT NOT NULL, + path TEXT NOT NULL, + url TEXT NOT NULL DEFAULT '', + provider TEXT NOT NULL DEFAULT 'unknown', + credential_id TEXT NOT NULL DEFAULT '', + credential_chain TEXT NOT NULL DEFAULT '', + credential_saturated INTEGER NOT NULL DEFAULT 0, + model TEXT NOT NULL DEFAULT 'unknown', + is_stream INTEGER NOT NULL DEFAULT 0, + status_code INTEGER NOT NULL DEFAULT 0, + ok INTEGER NOT NULL DEFAULT 0, + duration_ms INTEGER NOT NULL DEFAULT 0, + input_tokens INTEGER NOT NULL DEFAULT 0, + output_tokens INTEGER NOT NULL DEFAULT 0, + reasoning_tokens INTEGER NOT NULL DEFAULT 0, + cache_read_tokens INTEGER NOT NULL DEFAULT 0, + cache_write_tokens INTEGER NOT NULL DEFAULT 0, + total_tokens INTEGER NOT NULL DEFAULT 0, + cost_usd REAL, + request_headers TEXT NOT NULL DEFAULT '{}', + response_headers TEXT NOT NULL DEFAULT '{}', + request_body_text TEXT NOT NULL DEFAULT '', + request_body_encoding TEXT NOT NULL DEFAULT 'utf8', + request_body_content_type TEXT NOT NULL DEFAULT '', + request_body_size_bytes INTEGER NOT NULL DEFAULT 0, + request_body_truncated INTEGER NOT NULL DEFAULT 0, + response_body_text TEXT NOT NULL DEFAULT '', + response_body_encoding TEXT NOT NULL DEFAULT 'utf8', + response_body_content_type TEXT NOT NULL DEFAULT '', + response_body_size_bytes INTEGER NOT NULL DEFAULT 0, + response_body_truncated INTEGER NOT NULL DEFAULT 0, + error TEXT NOT NULL DEFAULT '' + ); + `); + ensureRequestLogSchema(database); + backfillRequestLogStreamFlags(database); + + this.database = database; + this.pruneOldRequestLogs(database); + return database; + } + + private pruneOldRequestLogs(database: SqlDatabase): void { + const now = new Date(); + const dayKey = formatLocalDayKey(now); + if (this.lastRetentionCleanupDay === dayKey) { + return; + } + + const cutoff = floorDay(now).toISOString(); + const staleCount = firstNumber( + queryRows( + database, + "SELECT COUNT(*) AS total FROM request_logs WHERE source_usage_id IS NULL AND created_at < ?", + [cutoff] + ), + "total" + ); + + if (staleCount === 0) { + this.lastRetentionCleanupDay = dayKey; + return; + } + + database.prepare( + "DELETE FROM request_logs WHERE source_usage_id IS NULL AND created_at < ?", + ).run(cutoff); + this.lastRetentionCleanupDay = dayKey; + } +} + +export const requestLogStore = new RequestLogStore(REQUEST_LOGS_DB_FILE); + +export async function recordGatewayRequestLog(input: RequestLogRecordInput): Promise { + try { + await requestLogStore.record(input); + } catch (error) { + console.warn(`[request-log] Failed to record request log: ${formatError(error)}`); + } +} + +export async function updateGatewayRequestLogFromRawTrace(input: RequestLogRawTraceUpdateInput): Promise { + try { + return await requestLogStore.updateFromRawTrace(input); + } catch (error) { + console.warn(`[request-log] Failed to update request log from raw trace: ${formatError(error)}`); + return false; + } +} + +export async function getRequestLogs(filter?: RequestLogListFilter): Promise { + try { + return await requestLogStore.list(filter); + } catch (error) { + console.warn(`[request-log] Failed to read request logs: ${formatError(error)}`); + throw error; + } +} + +export async function getRequestLogDetail(request: RequestLogDetailRequest): Promise { + try { + return await requestLogStore.getDetail(request); + } catch (error) { + console.warn(`[request-log] Failed to read request log detail: ${formatError(error)}`); + throw error; + } +} + +export async function getAgentAnalysis(filter?: AgentAnalysisFilter): Promise { + try { + return await requestLogStore.analyze(filter); + } catch (error) { + console.warn(`[request-log] Failed to analyze agent logs: ${formatError(error)}`); + throw error; + } +} + +export async function getAgentTracePayload(request: AgentAnalysisTracePayloadRequest): Promise { + try { + return await requestLogStore.getTracePayload(request); + } catch (error) { + console.warn(`[request-log] Failed to read agent trace payload: ${formatError(error)}`); + throw error; + } +} + +function toAnalyzedAgentRequest(entry: StoredRequestLogEntry): AnalyzedAgentRequest { + const details = extractAgentLogDetails(entry); + const startedAtMs = parseDateMs(entry.createdAt); + const completedAtMs = parseDateMs(entry.completedAt); + const endedAtMs = Math.max( + startedAtMs + 1, + completedAtMs > startedAtMs ? completedAtMs : startedAtMs + Math.max(0, entry.durationMs) + ); + + return { + agent: details.agent, + cacheReadTokens: entry.cacheReadTokens, + cacheWriteTokens: entry.cacheWriteTokens, + client: entry.client, + completedAt: entry.completedAt, + concurrentRequests: 1, + costUsd: entry.costUsd, + createdAt: entry.createdAt, + durationMs: entry.durationMs, + endedAtMs, + error: entry.error || undefined, + id: entry.id, + inputTokens: entry.inputTokens, + method: entry.method, + model: entry.model, + ok: entry.ok, + outputTokens: entry.outputTokens, + path: entry.path, + provider: entry.provider, + requestId: entry.requestId, + routeReason: details.routeReason, + sessionId: details.sessionId, + startedAtMs, + statusCode: entry.statusCode, + subagentModel: details.subagentModel, + toolCallCount: details.tools.length, + toolCalls: details.toolCalls, + toolResults: details.toolResults, + tools: details.tools, + totalTokens: entry.totalTokens, + userAgent: details.userAgent + }; +} + +function agentAnalysisCacheKey(filter: AgentAnalysisFilter): string { + return JSON.stringify({ + agent: normalizeAgentFilter(filter.agent), + range: normalizeAgentAnalysisRange(filter.range), + sessionAgent: normalizeAgentFilter(filter.sessionAgent), + sessionId: normalizeFilterValue(filter.sessionId) + }); +} + +function extractAgentLogDetails(entry: StoredRequestLogEntry): AgentLogDetails { + const requestPayloads = parseLogBodyPayloads(entry.requestBody); + const responsePayloads = parseLogBodyPayloads(entry.responseBody); + const routeReason = readHeaderValue(entry.requestHeaders, "x-ccr-route-reason"); + const routedModel = readHeaderValue(entry.requestHeaders, "x-ccr-routed-model"); + const subagentModel = extractSubagentModel(entry, requestPayloads, routeReason, routedModel); + const agent = inferAgentKind(entry, requestPayloads, responsePayloads); + const toolCalls = extractToolCalls(responsePayloads); + const toolResults = extractToolResults(requestPayloads, entry); + + return { + agent, + routeReason, + sessionId: extractAgentSessionId(entry, requestPayloads, agent), + subagentModel, + toolCalls, + toolResults, + tools: toolCalls.map((tool) => tool.name), + userAgent: readAgentUserAgent(entry.requestHeaders) + }; +} + +function inferAgentKind( + entry: StoredRequestLogEntry, + requestPayloads: unknown[], + responsePayloads: unknown[] +): AgentKind { + const headerAgent = inferAgentFromText(readAgentHeaderSignals(entry.requestHeaders)); + if (headerAgent) { + return headerAgent; + } + + const haystack = [ + entry.path, + entry.url, + JSON.stringify(entry.responseHeaders), + stringifyForSearch(requestPayloads), + stringifyForSearch(responsePayloads) + ].join(" ").toLowerCase(); + + const bodyAgent = inferAgentFromText(haystack, { allowStandaloneCodex: false }); + if (bodyAgent) { + return bodyAgent; + } + if ( + Boolean(readHeaderValue(entry.requestHeaders, "x-claude-code-session-id")) || + requestPayloads.some(hasClaudeCodeSessionMetadata) + ) { + return "claude-code"; + } + + return "unknown"; +} + +function readAgentHeaderSignals(headers: Record): string { + const values: string[] = []; + for (const [key, value] of Object.entries(headers)) { + const normalizedKey = key.toLowerCase(); + if ( + normalizedKey === "user-agent" || + normalizedKey === "x-user-agent" || + normalizedKey === "x-client-user-agent" || + normalizedKey === "x-ccr-client" || + normalizedKey === "x-client-name" || + normalizedKey.includes("user-agent") || + normalizedKey.endsWith("-ua") + ) { + values.push(Array.isArray(value) ? value.join(" ") : value); + } + } + return values.join(" ").toLowerCase(); +} + +function readAgentUserAgent(headers: Record): string | undefined { + return ( + readHeaderValue(headers, "user-agent") || + readHeaderValue(headers, "x-user-agent") || + readHeaderValue(headers, "x-client-user-agent") + ); +} + +function inferAgentFromText(value: string, options: AgentTextSignalOptions = {}): AgentKind | undefined { + const normalized = value.toLowerCase(); + const allowStandaloneCodex = options.allowStandaloneCodex ?? true; + if (normalized.includes("claude design") || normalized.includes("claude-design") || normalized.includes("claude.ai/design")) { + return "claude-design"; + } + if ( + normalized.includes("zcode") || + normalized.includes("z-code") || + normalized.includes("z code") || + /(^|[^a-z0-9])zcode([/_\s-]|$)/.test(normalized) + ) { + return "zcode"; + } + if ( + normalized.includes("openai-codex") || + normalized.includes("codex_cli") || + normalized.includes("codex-cli") || + (allowStandaloneCodex && /(^|[^a-z0-9])codex([/_\s-]|$)/.test(normalized)) + ) { + return "codex"; + } + if ( + normalized.includes("@anthropic-ai/claude-code") || + normalized.includes("claude-code") || + normalized.includes("claude code") || + normalized.includes("claude_cli") || + normalized.includes("claude-cli") + ) { + return "claude-code"; + } + return undefined; +} + +function extractAgentSessionId(entry: StoredRequestLogEntry, requestPayloads: unknown[], agent: AgentKind): string { + const fromHeaders = readAgentSessionHeader(entry.requestHeaders, agent); + if (fromHeaders) { + return fromHeaders; + } + + for (const payload of requestPayloads) { + const fromPayload = extractSessionIdFromPayload(payload); + if (fromPayload) { + return fromPayload; + } + } + + return `request:${entry.requestId || entry.id}`; +} + +function readAgentSessionHeader(headers: Record, agent: AgentKind): string | undefined { + const commonHeaders = [ + "x-agent-session-id", + "x-session-id", + "session-id", + "x-conversation-id", + "conversation-id", + "x-thread-id", + "thread-id", + "x-chat-id", + "chat-id" + ]; + const claudeCodeHeaders = [ + "x-claude-code-session-id", + "x-claude-session-id", + "claude-code-session-id", + "claude-session-id" + ]; + const codexHeaders = [ + "x-codex-session-id", + "codex-session-id", + "x-codex-conversation-id", + "codex-conversation-id", + "x-openai-session-id", + "openai-session-id", + "x-openai-conversation-id", + "openai-conversation-id", + "x-openai-thread-id", + "openai-thread-id" + ]; + const zcodeHeaders = [ + "x-zcode-session-id", + "zcode-session-id", + "x-zcode-conversation-id", + "zcode-conversation-id", + "x-zcode-thread-id", + "zcode-thread-id", + "x-z-code-session-id", + "z-code-session-id" + ]; + const orderedHeaders = agent === "zcode" + ? [...zcodeHeaders, ...codexHeaders, ...commonHeaders, ...claudeCodeHeaders] + : agent === "codex" + ? [...codexHeaders, ...commonHeaders, ...claudeCodeHeaders] + : agent === "claude-code" + ? [...claudeCodeHeaders, ...commonHeaders, ...codexHeaders, ...zcodeHeaders] + : [...claudeCodeHeaders, ...codexHeaders, ...zcodeHeaders, ...commonHeaders]; + + for (const name of orderedHeaders) { + const value = readHeaderValue(headers, name); + if (value) { + return value; + } + } + + return readFuzzySessionHeader(headers); +} + +function readFuzzySessionHeader(headers: Record): string | undefined { + for (const [key, value] of Object.entries(headers)) { + const normalizedKey = key.toLowerCase(); + if (!isSessionLikeKey(normalizedKey) || isRequestScopedKey(normalizedKey)) { + continue; + } + const normalizedValue = normalizeFilterValue(Array.isArray(value) ? value[0] : value); + if (normalizedValue) { + return normalizedValue; + } + } + return undefined; +} + +function extractSessionIdFromPayload(payload: unknown): string | undefined { + if (!isRecord(payload)) { + return undefined; + } + + const direct = + asString(payload.session_id) || + asString(payload.sessionId) || + asString(payload.conversation_id) || + asString(payload.conversationId) || + asString(payload.chat_id) || + asString(payload.chatId) || + asString(payload.thread_id) || + asString(payload.threadId); + if (direct) { + return direct; + } + + const metadata = isRecord(payload.metadata) ? payload.metadata : undefined; + const metadataSession = + asString(metadata?.session_id) || + asString(metadata?.sessionId) || + asString(metadata?.conversation_id) || + asString(metadata?.conversationId) || + asString(metadata?.chat_id) || + asString(metadata?.chatId); + if (metadataSession) { + return metadataSession; + } + + const userId = asString(metadata?.user_id); + if (userId?.includes("_session_")) { + return userId.split("_session_").at(-1)?.trim() || undefined; + } + + return findSessionIdInPayload(payload); +} + +function findSessionIdInPayload(value: unknown, depth = 0): string | undefined { + if (depth > 4) { + return undefined; + } + if (Array.isArray(value)) { + for (const item of value) { + const found = findSessionIdInPayload(item, depth + 1); + if (found) { + return found; + } + } + return undefined; + } + if (!isRecord(value)) { + return undefined; + } + for (const [key, item] of Object.entries(value)) { + const normalizedKey = key.toLowerCase(); + if (isSessionLikeKey(normalizedKey) && !isRequestScopedKey(normalizedKey)) { + const candidate = asString(item); + if (candidate) { + return candidate; + } + } + } + for (const item of Object.values(value)) { + const found = findSessionIdInPayload(item, depth + 1); + if (found) { + return found; + } + } + return undefined; +} + +function isSessionLikeKey(key: string): boolean { + return ( + key.includes("session") || + key.includes("conversation") || + key.includes("thread") || + key === "chat_id" || + key === "chatid" || + key === "chat-id" + ); +} + +function isRequestScopedKey(key: string): boolean { + return ( + key.includes("request") || + key.includes("trace") || + key.includes("span") || + key.includes("message") || + key.includes("event") || + key.includes("parent") + ); +} + +function hasClaudeCodeSessionMetadata(payload: unknown): boolean { + if (!isRecord(payload)) { + return false; + } + const metadata = isRecord(payload.metadata) ? payload.metadata : undefined; + return Boolean(asString(metadata?.user_id)?.includes("_session_")); +} + +function extractSubagentModel( + entry: StoredRequestLogEntry, + requestPayloads: unknown[], + routeReason: string | undefined, + routedModel: string | undefined +): string | undefined { + if (routeReason?.toLowerCase().includes("subagent")) { + return routedModel || entry.model; + } + + for (const payload of requestPayloads) { + const match = stringifyForSearch(payload).match(/(.*?)<\/CCR-SUBAGENT-MODEL>/s); + if (match?.[1]?.trim()) { + return match[1].trim(); + } + } + + return undefined; +} + +function parseLogBodyPayloads(body: RequestLogBody | undefined): unknown[] { + if (!body || body.encoding !== "utf8" || !body.text.trim()) { + return []; + } + + const parsed = parseJson(body.text.trim()); + if (parsed !== undefined) { + return [parsed]; + } + + return parseStreamPayloads(body.text); +} + +function extractToolCalls(payloads: unknown[]): AgentToolCallDetail[] { + const calls = new Map(); + for (const payload of payloads) { + collectToolCalls(payload, calls); + } + for (const [id, tool] of collectStreamedToolCallInputs(payloads)) { + const input = payloadPreview(tool.input); + const existing = calls.get(id); + calls.set(id, { + id, + input: input ?? existing?.input, + name: existing?.name || tool.name || "tool" + }); + } + return Array.from(calls.values()); +} + +function collectToolCalls(value: unknown, calls: Map): void { + if (Array.isArray(value)) { + for (const item of value) { + collectToolCalls(item, calls); + } + return; + } + if (!isRecord(value)) { + return; + } + + const type = asString(value.type); + const functionRecord = isRecord(value.function) ? value.function : undefined; + const functionArguments = functionRecord + ? functionRecord.arguments ?? functionRecord.parameters ?? functionRecord.input + : undefined; + const name = + asString(value.name) || + asString(value.tool) || + asString(value.tool_name) || + asString(functionRecord?.name); + const looksLikeToolCall = + type === "tool_use" || + type === "server_tool_use" || + type === "mcp_tool_use" || + type === "function_call" || + type === "tool_call" || + type === "tool_block_complete" || + type === "tool_delta" || + Boolean(functionRecord?.name); + + if (looksLikeToolCall && name) { + const explicitKey = + asString(value.id) || + asString(value.call_id) || + asString(value.tool_call_id); + if (!explicitKey && functionRecord && streamIndexKey(value.index)) { + return; + } + const key = explicitKey || `${name}:${calls.size}`; + calls.set(key, { + id: key, + input: payloadPreview(value.input ?? value.arguments ?? value.parameters ?? functionArguments), + name + }); + } + + for (const item of Object.values(value)) { + collectToolCalls(item, calls); + } +} + +function collectStreamedToolCallInputs(payloads: unknown[]): Map { + const state: ToolCallStreamState = { + calls: new Map(), + indexToId: new Map() + }; + for (const payload of payloads) { + collectStreamedToolCallInput(payload, state); + } + + const resolved = new Map(); + for (const [id, tool] of state.calls) { + const joined = tool.fragments.join(""); + const input = joined.trim() + ? parseJsonLikeValue(joined) + : tool.input; + if (input === undefined) { + continue; + } + resolved.set(id, { + ...tool, + input + }); + } + return resolved; +} + +function collectStreamedToolCallInput(value: unknown, state: ToolCallStreamState): void { + if (Array.isArray(value)) { + for (const item of value) { + collectStreamedToolCallInput(item, state); + } + return; + } + if (!isRecord(value)) { + return; + } + + collectAnthropicStreamToolInput(value, state); + collectOpenAiStreamToolInput(value, state); + + for (const item of Object.values(value)) { + collectStreamedToolCallInput(item, state); + } +} + +function collectAnthropicStreamToolInput(value: Record, state: ToolCallStreamState): void { + const type = asString(value.type); + const index = streamIndexKey(value.index); + if (type === "content_block_start" && index && isRecord(value.content_block)) { + const block = value.content_block; + const blockType = asString(block.type); + if (blockType === "tool_use" || blockType === "server_tool_use" || blockType === "mcp_tool_use") { + const id = asString(block.id); + if (id) { + state.indexToId.set(index, id); + const tool = ensureStreamedToolCall(state, id, asString(block.name)); + if (block.input !== undefined) { + tool.input = block.input; + } + } + } + return; + } + + if (type !== "content_block_delta" || !index || !isRecord(value.delta)) { + return; + } + + const delta = value.delta; + if (asString(delta.type) !== "input_json_delta" || typeof delta.partial_json !== "string") { + return; + } + + const id = state.indexToId.get(index); + if (!id) { + return; + } + ensureStreamedToolCall(state, id).fragments.push(delta.partial_json); +} + +function collectOpenAiStreamToolInput(value: Record, state: ToolCallStreamState): void { + const functionRecord = isRecord(value.function) ? value.function : undefined; + if (!functionRecord) { + return; + } + + const rawIndex = streamIndexKey(value.index); + const id = asString(value.id) || asString(value.call_id) || asString(value.tool_call_id); + const mappedId = rawIndex ? state.indexToId.get(rawIndex) : undefined; + const key = id || mappedId || (rawIndex ? `tool-index:${rawIndex}` : undefined); + if (!key) { + return; + } + + if (rawIndex && !id && !mappedId) { + state.indexToId.set(rawIndex, key); + } + if (id && rawIndex) { + remapStreamedToolCall(state, rawIndex, id); + } + + const tool = ensureStreamedToolCall(state, id || key, asString(functionRecord.name) || asString(value.name)); + const argumentsValue = functionRecord.arguments ?? functionRecord.parameters ?? functionRecord.input; + if (typeof argumentsValue === "string") { + tool.fragments.push(argumentsValue); + } else if (argumentsValue !== undefined) { + tool.input = argumentsValue; + } +} + +function ensureStreamedToolCall(state: ToolCallStreamState, id: string, name?: string): StreamedToolCallInput { + const existing = state.calls.get(id); + if (existing) { + if (!existing.name && name) { + existing.name = name; + } + return existing; + } + + const tool: StreamedToolCallInput = { + fragments: [], + id, + name + }; + state.calls.set(id, tool); + return tool; +} + +function remapStreamedToolCall(state: ToolCallStreamState, index: string, id: string): void { + const previousId = state.indexToId.get(index); + state.indexToId.set(index, id); + if (!previousId || previousId === id) { + return; + } + + const previous = state.calls.get(previousId); + if (!previous) { + return; + } + + const next = ensureStreamedToolCall(state, id, previous.name); + next.fragments.push(...previous.fragments); + if (next.input === undefined) { + next.input = previous.input; + } + state.calls.delete(previousId); +} + +function extractToolResults(payloads: unknown[], entry: StoredRequestLogEntry): AgentToolResultDetail[] { + const results = new Map(); + for (const payload of payloads) { + collectToolResults(payload, entry, results); + } + return Array.from(results.values()); +} + +function collectToolResults( + value: unknown, + entry: StoredRequestLogEntry, + results: Map +): void { + if (Array.isArray(value)) { + for (const item of value) { + collectToolResults(item, entry, results); + } + return; + } + if (!isRecord(value)) { + return; + } + + const type = asString(value.type); + const role = asString(value.role); + const id = + asString(value.tool_use_id) || + asString(value.tool_call_id) || + asString(value.call_id) || + asString(value.id); + const looksLikeToolResult = + type === "tool_result" || + type === "function_call_output" || + type === "tool_call_output" || + (role === "tool" && Boolean(value.tool_call_id)); + + if (looksLikeToolResult && id) { + results.set(id, { + id, + requestId: entry.requestId, + requestLogId: entry.id, + result: payloadPreview(value.content ?? value.output ?? value.result ?? value.text) + }); + } + + for (const item of Object.values(value)) { + collectToolResults(item, entry, results); + } +} + +function payloadPreview(value: unknown): AgentAnalysisTracePayloadPreview | undefined { + if (value === undefined || value === null) { + return undefined; + } + const normalized = parseJsonLikeValue(value); + const isText = typeof normalized === "string"; + const kind = isText ? "text" : "json"; + const text = isText ? normalized : stringifyPretty(normalized); + const sizeBytes = Buffer.byteLength(text, "utf8"); + const truncated = text.length > maxTracePayloadPreviewChars; + return { + kind, + preview: truncated ? `${text.slice(0, maxTracePayloadPreviewChars)}\n...` : text, + sizeBytes, + truncated + }; +} + +function emptyTracePayloadResult(sourceTruncated = false): AgentAnalysisTracePayloadFullResult { + return { + content: "", + found: false, + kind: "empty", + sizeBytes: 0, + sourceTruncated + }; +} + +function fullPayloadResult(value: unknown, sourceTruncated: boolean): AgentAnalysisTracePayloadFullResult { + if (value === undefined || value === null) { + return { + content: "", + found: true, + kind: "empty", + sizeBytes: 0, + sourceTruncated + }; + } + const normalized = parseJsonLikeValue(value); + const isText = typeof normalized === "string"; + const content = isText ? normalized : stringifyPretty(normalized); + return { + content, + found: true, + kind: isText ? "text" : "json", + sizeBytes: Buffer.byteLength(content, "utf8"), + sourceTruncated + }; +} + +function findToolCallPayload(payloads: unknown[], callId: string | undefined): { found: boolean; value?: unknown } { + const streamedCalls = collectStreamedToolCallInputs(payloads); + if (callId && streamedCalls.has(callId)) { + return { found: true, value: streamedCalls.get(callId)?.input }; + } + if (!callId && streamedCalls.size === 1) { + return { found: true, value: Array.from(streamedCalls.values())[0].input }; + } + + const calls = new Map(); + for (const payload of payloads) { + collectToolCallPayloads(payload, calls); + } + if (callId && calls.has(callId)) { + return { found: true, value: calls.get(callId) }; + } + if (!callId && calls.size === 1) { + return { found: true, value: Array.from(calls.values())[0] }; + } + return { found: false }; +} + +function collectToolCallPayloads(value: unknown, calls: Map): void { + if (Array.isArray(value)) { + for (const item of value) { + collectToolCallPayloads(item, calls); + } + return; + } + if (!isRecord(value)) { + return; + } + + const type = asString(value.type); + const functionRecord = isRecord(value.function) ? value.function : undefined; + const functionArguments = functionRecord + ? functionRecord.arguments ?? functionRecord.parameters ?? functionRecord.input + : undefined; + const name = + asString(value.name) || + asString(value.tool) || + asString(value.tool_name) || + asString(functionRecord?.name); + const looksLikeToolCall = + type === "tool_use" || + type === "server_tool_use" || + type === "mcp_tool_use" || + type === "function_call" || + type === "tool_call" || + type === "tool_block_complete" || + type === "tool_delta" || + Boolean(functionRecord?.name); + + if (looksLikeToolCall && name) { + const key = + asString(value.id) || + asString(value.call_id) || + asString(value.tool_call_id) || + `${name}:${calls.size}`; + calls.set(key, value.input ?? value.arguments ?? value.parameters ?? functionArguments); + } + + for (const item of Object.values(value)) { + collectToolCallPayloads(item, calls); + } +} + +function findToolResultPayload(payloads: unknown[], callId: string | undefined): { found: boolean; value?: unknown } { + const results = new Map(); + for (const payload of payloads) { + collectToolResultPayloads(payload, results); + } + if (callId && results.has(callId)) { + return { found: true, value: results.get(callId) }; + } + if (!callId && results.size === 1) { + return { found: true, value: Array.from(results.values())[0] }; + } + return { found: false }; +} + +function collectToolResultPayloads(value: unknown, results: Map): void { + if (Array.isArray(value)) { + for (const item of value) { + collectToolResultPayloads(item, results); + } + return; + } + if (!isRecord(value)) { + return; + } + + const type = asString(value.type); + const role = asString(value.role); + const id = + asString(value.tool_use_id) || + asString(value.tool_call_id) || + asString(value.call_id) || + asString(value.id); + const looksLikeToolResult = + type === "tool_result" || + type === "function_call_output" || + type === "tool_call_output" || + (role === "tool" && Boolean(value.tool_call_id)); + + if (looksLikeToolResult && id) { + results.set(id, value.content ?? value.output ?? value.result ?? value.text); + } + + for (const item of Object.values(value)) { + collectToolResultPayloads(item, results); + } +} + +function parseJsonLikeValue(value: unknown): unknown { + if (typeof value !== "string") { + return value; + } + + const trimmed = value.trim(); + if (!trimmed || !/^[{\[]/.test(trimmed)) { + return value; + } + + return parseJson(trimmed) ?? value; +} + +function streamIndexKey(value: unknown): string | undefined { + if (typeof value === "number" && Number.isFinite(value)) { + return String(value); + } + if (typeof value === "string" && value.trim()) { + return value.trim(); + } + return undefined; +} + +function stringifyPretty(value: unknown): string { + try { + return JSON.stringify(value, null, 2) ?? ""; + } catch { + return stringifyForSearch(value); + } +} + +function applyRequestConcurrency(requests: AnalyzedAgentRequest[]): AnalyzedAgentRequest[] { + return requests.map((request) => ({ + ...request, + concurrentRequests: countConcurrentAt(requests, request.startedAtMs) + })); +} + +function countConcurrentAt(requests: AnalyzedAgentRequest[], timeMs: number): number { + return requests.filter((request) => request.startedAtMs <= timeMs && request.endedAtMs > timeMs).length || 1; +} + +function buildAgentRows(requests: AnalyzedAgentRequest[]): AgentAnalysisAgentRow[] { + const grouped = groupBy(requests, (request) => request.agent); + const rows = Array.from(grouped.entries()).map(([agent, items]) => ({ + ...buildAgentAnalysisTotals(items), + agent, + key: agent, + label: agentDisplayName(agent), + maxShare: 0 + })); + const max = Math.max(...rows.map((row) => row.totalTokens || row.requestCount), 0); + return rows + .map((row) => ({ + ...row, + maxShare: max > 0 ? (row.totalTokens || row.requestCount) / max : 0 + })) + .sort((a, b) => b.totalTokens - a.totalTokens || b.requestCount - a.requestCount); +} + +function buildAgentClientRows(requests: AnalyzedAgentRequest[]): AgentObservabilityClientRow[] { + const grouped = groupBy(requests, (request) => `${request.agent}:${request.client}:${request.userAgent ?? ""}`); + return Array.from(grouped.values()) + .map((items) => { + const first = items[0]; + const last = items.at(-1) ?? first; + return { + ...buildAgentAnalysisTotals(items), + agent: first.agent, + key: `${first.agent}:${first.client}:${first.userAgent ?? ""}`, + label: first.client || first.userAgent || "unknown", + lastSeenAt: last.completedAt || last.createdAt, + userAgent: first.userAgent + }; + }) + .sort(compareObservabilityRows) + .slice(0, 100); +} + +function buildAgentEndpointRows(requests: AnalyzedAgentRequest[]): AgentObservabilityEndpointRow[] { + const grouped = groupBy(requests, (request) => `${request.agent}:${request.method}:${request.path}:${request.provider}:${request.model}`); + return Array.from(grouped.values()) + .map((items) => { + const first = items[0]; + const last = items.at(-1) ?? first; + return { + ...buildAgentAnalysisTotals(items), + agent: first.agent, + key: `${first.agent}:${first.method}:${first.path}:${first.provider}:${first.model}`, + lastSeenAt: last.completedAt || last.createdAt, + method: first.method, + model: first.model, + path: first.path, + provider: first.provider, + statusCodes: buildStatusCodeCounts(items) + }; + }) + .sort(compareObservabilityRows) + .slice(0, 100); +} + +function buildAgentRouteRows(requests: AnalyzedAgentRequest[]): AgentObservabilityRouteRow[] { + const grouped = groupBy(requests, (request) => `${request.agent}:${request.routeReason || "unknown"}:${request.provider}:${request.model}`); + return Array.from(grouped.values()) + .map((items) => { + const first = items[0]; + const last = items.at(-1) ?? first; + const totals = buildAgentAnalysisTotals(items); + return { + agent: first.agent, + cacheRatio: totals.cacheRatio, + errorCount: totals.errorCount, + key: `${first.agent}:${first.routeReason || "unknown"}:${first.provider}:${first.model}`, + lastSeenAt: last.completedAt || last.createdAt, + model: first.model, + p95DurationMs: totals.p95DurationMs, + provider: first.provider, + requestCount: totals.requestCount, + routeReason: first.routeReason || "unknown", + successRate: totals.successRate, + totalTokens: totals.totalTokens + }; + }) + .sort((a, b) => b.errorCount - a.errorCount || b.p95DurationMs - a.p95DurationMs || b.requestCount - a.requestCount) + .slice(0, 100); +} + +function buildAgentErrorRows(requests: AnalyzedAgentRequest[]): AgentObservabilityErrorRow[] { + return requests + .filter((request) => !request.ok || Boolean(request.error)) + .slice(-100) + .reverse() + .map((request) => ({ + agent: request.agent, + client: request.client, + createdAt: request.createdAt, + durationMs: request.durationMs, + error: request.error, + id: request.id, + method: request.method, + model: request.model, + path: request.path, + provider: request.provider, + requestId: request.requestId, + routeReason: request.routeReason, + sessionId: request.sessionId, + statusCode: request.statusCode, + userAgent: request.userAgent + })); +} + +function buildAgentSessionRows(requests: AnalyzedAgentRequest[]): AgentAnalysisSessionRow[] { + const grouped = groupBy(requests, (request) => `${request.agent}:${request.sessionId}`); + return Array.from(grouped.values()) + .map(buildAgentSessionRow) + .sort((a, b) => Date.parse(b.lastSeenAt) - Date.parse(a.lastSeenAt)) + .slice(0, 100); +} + +function buildAgentSessionRow(items: AnalyzedAgentRequest[]): AgentAnalysisSessionRow { + const first = items[0]; + const last = items.at(-1) ?? first; + const totals = buildAgentAnalysisTotals(items); + return { + ...totals, + agent: first.agent, + client: first.client, + durationMs: Math.max(0, last.endedAtMs - first.startedAtMs), + id: first.sessionId, + lastRequestId: last.requestId, + lastSeenAt: last.completedAt || last.createdAt, + models: uniqueNonEmpty(items.map((item) => item.model)).slice(0, 8), + providers: uniqueNonEmpty(items.map((item) => item.provider)).slice(0, 8), + startedAt: first.createdAt, + topTools: topToolCounts(items, 5), + userAgent: first.userAgent + }; +} + +function selectAgentSessionRequests( + requests: AnalyzedAgentRequest[], + filter: AgentAnalysisFilter +): AnalyzedAgentRequest[] | undefined { + const sessionId = normalizeFilterValue(filter.sessionId); + if (!sessionId) { + return undefined; + } + + const sessionAgent = normalizeSessionAgentFilter(filter.sessionAgent); + return requests.filter((request) => + request.sessionId === sessionId && + (!sessionAgent || request.agent === sessionAgent) + ); +} + +function buildAgentSessionDetail( + sessionRequests: AnalyzedAgentRequest[] +): AgentAnalysisSessionDetail | undefined { + if (sessionRequests.length === 0) { + return undefined; + } + + return { + endpoints: buildAgentEndpointRows(sessionRequests), + errors: buildAgentErrorRows(sessionRequests), + models: buildAgentSessionModelRows(sessionRequests), + requests: sessionRequests.slice(-maxAgentSessionDetailRequests).reverse().map(stripAnalysisInternals), + routes: buildAgentRouteRows(sessionRequests), + session: buildAgentSessionRow(sessionRequests), + statusCodes: buildStatusCodeCounts(sessionRequests), + subagents: buildAgentSubagentRows(sessionRequests), + tools: buildAgentToolRows(sessionRequests), + totals: buildAgentAnalysisTotals(sessionRequests), + trace: buildAgentTrace(sessionRequests) + }; +} + +function buildAgentTrace(requests: AnalyzedAgentRequest[]): AgentAnalysisTrace { + const ordered = [...requests].sort((a, b) => a.startedAtMs - b.startedAtMs || a.id - b.id); + const first = ordered[0]; + const sessionId = first.sessionId; + const startMs = Math.min(...ordered.map((request) => request.startedAtMs)); + const endMs = Math.max(...ordered.map((request) => request.endedAtMs)); + const durationMs = Math.max(0, endMs - startMs); + const totals = buildAgentAnalysisTotals(ordered); + const rootRunId = `agent:${first.agent}:${sessionId}`; + const toolResults = buildToolResultMap(ordered); + const runs: AgentAnalysisTraceRun[] = [ + { + agent: first.agent, + cacheReadTokens: totals.cacheReadTokens, + cacheWriteTokens: totals.cacheWriteTokens, + concurrentRequests: totals.maxConcurrentRequests, + depth: 0, + durationMs, + endedAt: isoFromMs(endMs), + id: rootRunId, + inputTokens: totals.inputTokens, + kind: "agent", + name: `${agentDisplayName(first.agent)} session`, + offsetMs: 0, + outputTokens: totals.outputTokens, + sessionId, + startedAt: isoFromMs(startMs), + status: totals.errorCount > 0 ? "error" : "success", + totalTokens: totals.totalTokens + } + ]; + + for (const request of ordered) { + let parentId = rootRunId; + let depth = 1; + + if (request.subagentModel) { + const run = requestTraceRun({ + depth, + kind: "subagent", + name: `Subagent: ${request.subagentModel}`, + parentId, + request, + startMs + }); + runs.push(run); + parentId = run.id; + depth += 1; + } + + if (request.routeReason && !isInlineModelRouteReason(request.routeReason)) { + const run = requestTraceRun({ + depth, + kind: "route", + name: `Route: ${request.routeReason}`, + parentId, + request, + startMs + }); + runs.push(run); + parentId = run.id; + depth += 1; + } + + const llmRun = requestTraceRun({ + depth, + kind: "llm", + name: request.model && request.model !== "unknown" ? request.model : request.path, + parentId, + request, + startMs + }); + runs.push(llmRun); + + request.toolCalls.forEach((toolCall, index) => { + runs.push(toolTraceRun({ + depth: depth + 1, + index, + parentId: llmRun.id, + request, + startMs, + tool: toolDetailForCall(toolCall, toolResults) + })); + }); + } + + return { + agent: first.agent, + durationMs, + endedAt: isoFromMs(endMs), + errorCount: runs.filter((run) => run.status === "error").length, + id: `${first.agent}:${sessionId}`, + llmRunCount: runs.filter((run) => run.kind === "llm").length, + maxDepth: Math.max(...runs.map((run) => run.depth), 0), + rootRunId, + runCount: runs.length, + runs, + sessionId, + startedAt: isoFromMs(startMs), + subagentRunCount: runs.filter((run) => run.kind === "subagent").length, + toolRunCount: runs.filter((run) => run.kind === "tool").length + }; +} + +function isInlineModelRouteReason(value: string | undefined): boolean { + return value?.trim().toLowerCase() === "inline-model"; +} + +function buildToolResultMap(requests: AnalyzedAgentRequest[]): Map { + const results = new Map(); + for (const request of requests) { + for (const result of request.toolResults) { + results.set(result.id, result); + } + } + return results; +} + +function toolDetailForCall( + call: AgentToolCallDetail, + results: Map +): AgentAnalysisTraceToolDetail { + const result = call.id ? results.get(call.id) : undefined; + return { + callId: call.id, + input: call.input, + result: result?.result, + resultRequestId: result?.requestId, + resultRequestLogId: result?.requestLogId + }; +} + +function requestTraceRun({ + depth, + kind, + name, + parentId, + request, + startMs +}: { + depth: number; + kind: AgentAnalysisTraceRunKind; + name: string; + parentId: string; + request: AnalyzedAgentRequest; + startMs: number; +}): AgentAnalysisTraceRun { + return { + agent: request.agent, + cacheReadTokens: request.cacheReadTokens, + cacheWriteTokens: request.cacheWriteTokens, + concurrentRequests: request.concurrentRequests, + depth, + durationMs: request.durationMs, + endedAt: isoFromMs(request.endedAtMs), + error: request.error, + id: `${kind}:${request.id}`, + inputTokens: request.inputTokens, + kind, + model: request.model, + name, + offsetMs: Math.max(0, request.startedAtMs - startMs), + outputTokens: request.outputTokens, + parentId, + path: request.path, + provider: request.provider, + requestId: request.requestId, + requestLogId: request.id, + routeReason: request.routeReason, + sessionId: request.sessionId, + startedAt: request.createdAt, + status: request.ok && !request.error ? "success" : "error", + statusCode: request.statusCode, + totalTokens: request.totalTokens + }; +} + +function toolTraceRun({ + depth, + index, + parentId, + request, + startMs, + tool +}: { + depth: number; + index: number; + parentId: string; + request: AnalyzedAgentRequest; + startMs: number; + tool: AgentAnalysisTraceToolDetail; +}): AgentAnalysisTraceRun { + const timestampMs = request.endedAtMs; + const toolName = request.toolCalls[index]?.name || "tool"; + return { + agent: request.agent, + cacheReadTokens: 0, + cacheWriteTokens: 0, + concurrentRequests: request.concurrentRequests, + depth, + durationMs: 0, + endedAt: isoFromMs(timestampMs), + id: `tool:${request.id}:${index}:${toolName}`, + inputTokens: 0, + kind: "tool", + model: request.model, + name: toolName, + offsetMs: Math.max(0, timestampMs - startMs), + outputTokens: 0, + parentId, + path: request.path, + provider: request.provider, + requestId: request.requestId, + requestLogId: request.id, + routeReason: request.routeReason, + sessionId: request.sessionId, + startedAt: isoFromMs(timestampMs), + status: "success", + tool, + toolName, + totalTokens: 0 + }; +} + +function buildAgentSessionModelRows(requests: AnalyzedAgentRequest[]): AgentAnalysisSessionModelRow[] { + const grouped = groupBy(requests, (request) => `${request.provider}:${request.model}`); + return Array.from(grouped.values()) + .map((items) => { + const first = items[0]; + const last = items.at(-1) ?? first; + return { + ...buildAgentAnalysisTotals(items), + key: `${first.provider}:${first.model}`, + lastSeenAt: last.completedAt || last.createdAt, + model: first.model, + provider: first.provider + }; + }) + .sort((a, b) => b.totalTokens - a.totalTokens || b.requestCount - a.requestCount || a.model.localeCompare(b.model)) + .slice(0, 50); +} + +function buildAgentToolRows(requests: AnalyzedAgentRequest[]): AgentAnalysisToolRow[] { + const grouped = new Map; + count: number; + lastSeenAt: string; + requests: Set; + sessions: Set; + }>(); + + for (const request of requests) { + const requestTools = new Set(request.tools); + for (const tool of request.tools) { + const row = grouped.get(tool) ?? { + agents: new Set(), + count: 0, + lastSeenAt: request.createdAt, + requests: new Set(), + sessions: new Set() + }; + row.agents.add(request.agent); + row.count += 1; + row.lastSeenAt = request.createdAt; + row.sessions.add(`${request.agent}:${request.sessionId}`); + grouped.set(tool, row); + } + for (const tool of requestTools) { + grouped.get(tool)?.requests.add(request.id); + } + } + + return Array.from(grouped.entries()) + .map(([name, row]) => ({ + agents: Array.from(row.agents).sort(), + count: row.count, + lastSeenAt: row.lastSeenAt, + name, + requestCount: row.requests.size, + sessions: row.sessions.size + })) + .sort((a, b) => b.count - a.count || a.name.localeCompare(b.name)) + .slice(0, 100); +} + +function buildAgentSubagentRows(requests: AnalyzedAgentRequest[]): AgentAnalysisSubagentRow[] { + const grouped = new Map(); + for (const request of requests) { + if (!request.subagentModel) { + continue; + } + const key = `${request.agent}:${request.sessionId}:${request.provider}:${request.subagentModel}`; + const current = grouped.get(key) ?? { + agent: request.agent, + cacheReadTokens: 0, + cacheWriteTokens: 0, + count: 0, + lastSeenAt: request.createdAt, + model: request.subagentModel, + provider: request.provider, + sessionId: request.sessionId, + totalTokens: 0 + }; + current.cacheReadTokens += request.cacheReadTokens; + current.cacheWriteTokens += request.cacheWriteTokens; + current.count += 1; + current.lastSeenAt = request.createdAt; + current.totalTokens += request.totalTokens; + grouped.set(key, current); + } + + return Array.from(grouped.values()) + .sort((a, b) => b.count - a.count || Date.parse(b.lastSeenAt) - Date.parse(a.lastSeenAt)) + .slice(0, 100); +} + +function buildAgentConcurrencySeries( + range: UsageStatsRange, + now: Date, + requests: AnalyzedAgentRequest[] +): Array<{ bucket: string; label: string; maxConcurrentRequests: number; requestCount: number }> { + const buckets = buildAgentAnalysisBuckets(range, now); + const grouped = groupBy(requests, (request) => formatAnalysisBucketKey(new Date(request.createdAt), range === "today" || range === "24h" ? "hour" : "day")); + return buckets.map(({ key, label }) => { + const items = grouped.get(key) ?? []; + return { + bucket: key, + label, + maxConcurrentRequests: maxConcurrentRequests(items), + requestCount: items.length + }; + }); +} + +function buildAgentAnalysisTotals(requests: AnalyzedAgentRequest[]): AgentAnalysisTotals { + if (requests.length === 0) { + return { ...emptyAgentAnalysisTotals }; + } + + const inputTokens = sum(requests, (request) => request.inputTokens); + const outputTokens = sum(requests, (request) => request.outputTokens); + const cacheReadTokens = sum(requests, (request) => request.cacheReadTokens); + const cacheWriteTokens = sum(requests, (request) => request.cacheWriteTokens); + const cacheTokens = cacheReadTokens; + const costUsd = sum(requests, (request) => request.costUsd ?? 0); + const totalTokens = sum(requests, (request) => request.totalTokens || request.inputTokens + request.outputTokens + request.cacheReadTokens + request.cacheWriteTokens); + const promptTokens = sum(requests, (request) => { + const promptTokensFromTotal = request.totalTokens - request.outputTokens; + return promptTokensFromTotal > 0 + ? Math.max(request.inputTokens, promptTokensFromTotal) + : request.inputTokens + request.cacheReadTokens + request.cacheWriteTokens; + }); + const successfulRequests = requests.filter((request) => request.ok).length; + const sessionCount = new Set(requests.map((request) => `${request.agent}:${request.sessionId}`)).size; + const durations = requests.map((request) => request.durationMs).sort((a, b) => a - b); + + return { + avgDurationMs: Math.round(sum(requests, (request) => request.durationMs) / requests.length), + cacheRatio: ratio(cacheTokens, promptTokens), + cacheReadTokens, + cacheTokens, + cacheWriteTokens, + costUsd, + errorCount: requests.length - successfulRequests, + inputTokens, + maxConcurrentRequests: maxConcurrentRequests(requests), + maxDurationMs: durations.at(-1) ?? 0, + outputTokens, + p50DurationMs: percentile(durations, 0.5), + p95DurationMs: percentile(durations, 0.95), + p99DurationMs: percentile(durations, 0.99), + requestCount: requests.length, + sessionCount, + subagentCallCount: requests.filter((request) => Boolean(request.subagentModel)).length, + successRate: successfulRequests / requests.length, + toolCallCount: sum(requests, (request) => request.toolCallCount), + totalTokens + }; +} + +function buildStatusCodeCounts(requests: AnalyzedAgentRequest[]): Array<{ count: number; statusCode: number }> { + const counts = new Map(); + for (const request of requests) { + counts.set(request.statusCode, (counts.get(request.statusCode) ?? 0) + 1); + } + return Array.from(counts.entries()) + .map(([statusCode, count]) => ({ count, statusCode })) + .sort((a, b) => b.count - a.count || a.statusCode - b.statusCode) + .slice(0, 6); +} + +function compareObservabilityRows(a: AgentAnalysisTotals, b: AgentAnalysisTotals): number { + return b.errorCount - a.errorCount || b.p95DurationMs - a.p95DurationMs || b.requestCount - a.requestCount; +} + +function percentile(sortedValues: number[], percentileValue: number): number { + if (sortedValues.length === 0) { + return 0; + } + const index = Math.ceil(sortedValues.length * percentileValue) - 1; + return sortedValues[Math.max(0, Math.min(sortedValues.length - 1, index))] ?? 0; +} + +function maxConcurrentRequests(requests: AnalyzedAgentRequest[]): number { + if (requests.length === 0) { + return 0; + } + const points = requests.flatMap((request) => [ + { delta: 1, time: request.startedAtMs }, + { delta: -1, time: request.endedAtMs } + ]); + points.sort((a, b) => a.time - b.time || a.delta - b.delta); + let current = 0; + let max = 0; + for (const point of points) { + current += point.delta; + max = Math.max(max, current); + } + return max; +} + +function stripAnalysisInternals(request: AnalyzedAgentRequest): AgentAnalysisRequestRow { + const { + completedAt: _completedAt, + endedAtMs: _endedAtMs, + startedAtMs: _startedAtMs, + toolCalls: _toolCalls, + toolResults: _toolResults, + ...row + } = request; + return row; +} + +function topToolCounts(requests: AnalyzedAgentRequest[], limit: number): Array<{ count: number; name: string }> { + const counts = new Map(); + for (const request of requests) { + for (const tool of request.tools) { + counts.set(tool, (counts.get(tool) ?? 0) + 1); + } + } + return Array.from(counts.entries()) + .map(([name, count]) => ({ count, name })) + .sort((a, b) => b.count - a.count || a.name.localeCompare(b.name)) + .slice(0, limit); +} + +function buildAgentAnalysisBuckets( + range: UsageStatsRange, + now: Date +): Array<{ key: string; label: string }> { + if (range === "today" || range === "24h") { + const start = range === "today" ? floorDay(now) : floorHour(now); + if (range === "24h") { + start.setHours(start.getHours() - 23); + } + const count = range === "today" ? floorHour(now).getHours() + 1 : 24; + return Array.from({ length: count }, (_, index) => { + const date = new Date(start); + date.setHours(start.getHours() + index); + return { + key: formatAnalysisBucketKey(date, "hour"), + label: `${String(date.getHours()).padStart(2, "0")}:00` + }; + }); + } + + const count = range === "7d" ? 7 : 30; + const start = floorDay(now); + start.setDate(start.getDate() - (count - 1)); + return Array.from({ length: count }, (_, index) => { + const date = new Date(start); + date.setDate(start.getDate() + index); + return { + key: formatAnalysisBucketKey(date, "day"), + label: `${date.getMonth() + 1}/${date.getDate()}` + }; + }); +} + +function formatAnalysisBucketKey(date: Date, precision: "day" | "hour"): string { + const month = String(date.getMonth() + 1).padStart(2, "0"); + const day = String(date.getDate()).padStart(2, "0"); + const base = `${date.getFullYear()}-${month}-${day}`; + if (precision === "day") { + return base; + } + return `${base} ${String(date.getHours()).padStart(2, "0")}:00`; +} + +function floorHour(date: Date): Date { + const result = new Date(date); + result.setMinutes(0, 0, 0); + return result; +} + +function floorDay(date: Date): Date { + const result = new Date(date); + result.setHours(0, 0, 0, 0); + return result; +} + +function formatLocalDayKey(date: Date): string { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, "0"); + const day = String(date.getDate()).padStart(2, "0"); + return `${year}-${month}-${day}`; +} + +function isoFromMs(value: number): string { + return new Date(value).toISOString(); +} + +function getAgentAnalysisSince(range: UsageStatsRange, now: Date): Date { + const date = new Date(now); + if (range === "today") { + return floorDay(date); + } + if (range === "24h") { + date.setHours(date.getHours() - 24); + } else if (range === "7d") { + date.setDate(date.getDate() - 7); + } else { + date.setDate(date.getDate() - 30); + } + return date; +} + +function normalizeAgentAnalysisRange(value: UsageStatsRange | undefined): UsageStatsRange { + return value === "today" || value === "24h" || value === "30d" ? value : "7d"; +} + +function normalizeAgentFilter(value: AgentAnalysisFilter["agent"] | undefined): AgentKind | "all" { + return value === "claude-code" || value === "codex" || value === "zcode" || value === "claude-design" || value === "unknown" ? value : "all"; +} + +function normalizeSessionAgentFilter(value: AgentAnalysisFilter["sessionAgent"] | undefined): AgentKind | undefined { + return value === "claude-code" || value === "codex" || value === "zcode" || value === "claude-design" || value === "unknown" ? value : undefined; +} + +function agentDisplayName(agent: AgentKind): string { + if (agent === "claude-code") { + return "Claude Code"; + } + if (agent === "claude-design") { + return "Claude Design"; + } + if (agent === "codex") { + return "Codex"; + } + if (agent === "zcode") { + return "ZCode"; + } + return "Unknown"; +} + +function uniqueNonEmpty(values: string[]): string[] { + const result: string[] = []; + const seen = new Set(); + for (const value of values) { + const trimmed = value.trim(); + if (!trimmed || trimmed === "unknown" || seen.has(trimmed)) { + continue; + } + seen.add(trimmed); + result.push(trimmed); + } + return result; +} + +function groupBy(values: T[], keyFn: (value: T) => K): Map { + const grouped = new Map(); + for (const value of values) { + const key = keyFn(value); + const bucket = grouped.get(key) ?? []; + bucket.push(value); + grouped.set(key, bucket); + } + return grouped; +} + +function readHeaderValue(headers: Record, name: string): string | undefined { + const value = headers[name.toLowerCase()]; + if (Array.isArray(value)) { + return normalizeFilterValue(value[0]); + } + return normalizeFilterValue(value); +} + +function hasCredentialLogHeaders(headers: Record): boolean { + return Boolean( + readHeaderValue(headers, "x-ccr-provider-credential-id") || + readHeaderValue(headers, "x-ccr-provider-credential-chain") || + readHeaderValue(headers, "x-ccr-provider-credential-saturated") + ); +} + +function readCredentialLogInfo( + responseHeaders: Record, + requestHeaders: Record +): { chain: string[]; id: string; saturated: boolean } { + const responseChain = parseCredentialChain(readHeaderValue(responseHeaders, "x-ccr-provider-credential-chain")); + const requestChain = parseCredentialChain(readHeaderValue(requestHeaders, "x-ccr-provider-credential-chain")); + const id = normalizeLabel( + readHeaderValue(responseHeaders, "x-ccr-provider-credential-id") ?? + readHeaderValue(requestHeaders, "x-ccr-provider-credential-id") ?? + responseChain[0] ?? + requestChain[0], + "" + ); + const chain = responseChain.length > 0 + ? responseChain + : requestChain.length > 0 + ? requestChain + : id + ? [id] + : []; + const saturated = readHeaderFlag( + readHeaderValue(responseHeaders, "x-ccr-provider-credential-saturated") ?? + readHeaderValue(requestHeaders, "x-ccr-provider-credential-saturated") + ); + return { chain, id, saturated }; +} + +function parseRequestLogRetryAttempts( + responseHeaders: Record, + finalStatusCode: number +): RequestLogRetryAttempt[] { + const attemptCount = asNumber(readHeaderValue(responseHeaders, "x-ccr-fallback-attempts")) ?? 0; + if (attemptCount <= 1) { + return []; + } + + const failures = splitHeaderCsv(readHeaderValue(responseHeaders, "x-ccr-fallback-failures")); + const delays = splitHeaderCsv(readHeaderValue(responseHeaders, "x-ccr-fallback-delays-ms")) + .map((value) => asNumber(value) ?? 0); + const attempts: RequestLogRetryAttempt[] = []; + + for (let index = 0; index < attemptCount - 1; index += 1) { + attempts.push({ + attempt: index + 1, + delayMs: delays[index] ?? 0, + final: false, + status: failures[index] || "failed" + }); + } + + attempts.push({ + attempt: attemptCount, + delayMs: 0, + final: true, + status: finalStatusCode > 0 ? String(finalStatusCode) : undefined + }); + return attempts; +} + +function splitHeaderCsv(value: string | undefined): string[] { + return (value ?? "") + .split(",") + .map((item) => item.trim()) + .filter(Boolean); +} + +function parseCredentialChain(value: string | undefined): string[] { + return uniqueNonEmpty((value ?? "").split(",")); +} + +function readHeaderFlag(value: string | undefined): boolean { + const normalized = value?.trim().toLowerCase(); + return normalized === "1" || normalized === "true" || normalized === "yes"; +} + +function stringifyForSearch(value: unknown): string { + if (typeof value === "string") { + return value; + } + try { + return JSON.stringify(value) || ""; + } catch { + return ""; + } +} + +function parseDateMs(value: string): number { + const parsed = Date.parse(value); + return Number.isFinite(parsed) ? parsed : 0; +} + +function ensureRequestLogSchema(database: SqlDatabase): void { + const columns = new Set( + queryRows(database, "PRAGMA table_info(request_logs)") + .map((row) => String(row.name ?? "")) + .filter(Boolean) + ); + const addColumn = (name: string, definition: string) => { + if (!columns.has(name)) { + database.exec(`ALTER TABLE request_logs ADD COLUMN ${name} ${definition}`); + columns.add(name); + } + }; + + addColumn("source_usage_id", "INTEGER"); + addColumn("created_at", "TEXT NOT NULL DEFAULT ''"); + addColumn("completed_at", "TEXT NOT NULL DEFAULT ''"); + addColumn("request_id", "TEXT NOT NULL DEFAULT ''"); + addColumn("client", "TEXT NOT NULL DEFAULT 'unknown'"); + addColumn("method", "TEXT NOT NULL DEFAULT ''"); + addColumn("path", "TEXT NOT NULL DEFAULT ''"); + addColumn("url", "TEXT NOT NULL DEFAULT ''"); + addColumn("provider", "TEXT NOT NULL DEFAULT 'unknown'"); + addColumn("credential_id", "TEXT NOT NULL DEFAULT ''"); + addColumn("credential_chain", "TEXT NOT NULL DEFAULT ''"); + addColumn("credential_saturated", "INTEGER NOT NULL DEFAULT 0"); + addColumn("model", "TEXT NOT NULL DEFAULT 'unknown'"); + addColumn("is_stream", "INTEGER NOT NULL DEFAULT 0"); + addColumn("status_code", "INTEGER NOT NULL DEFAULT 0"); + addColumn("ok", "INTEGER NOT NULL DEFAULT 0"); + addColumn("duration_ms", "INTEGER NOT NULL DEFAULT 0"); + addColumn("input_tokens", "INTEGER NOT NULL DEFAULT 0"); + addColumn("output_tokens", "INTEGER NOT NULL DEFAULT 0"); + addColumn("reasoning_tokens", "INTEGER NOT NULL DEFAULT 0"); + addColumn("cache_read_tokens", "INTEGER NOT NULL DEFAULT 0"); + addColumn("cache_write_tokens", "INTEGER NOT NULL DEFAULT 0"); + addColumn("total_tokens", "INTEGER NOT NULL DEFAULT 0"); + addColumn("cost_usd", "REAL"); + addColumn("request_headers", "TEXT NOT NULL DEFAULT '{}'"); + addColumn("response_headers", "TEXT NOT NULL DEFAULT '{}'"); + addColumn("request_body_text", "TEXT NOT NULL DEFAULT ''"); + addColumn("request_body_encoding", "TEXT NOT NULL DEFAULT 'utf8'"); + addColumn("request_body_content_type", "TEXT NOT NULL DEFAULT ''"); + addColumn("request_body_size_bytes", "INTEGER NOT NULL DEFAULT 0"); + addColumn("request_body_truncated", "INTEGER NOT NULL DEFAULT 0"); + addColumn("response_body_text", "TEXT NOT NULL DEFAULT ''"); + addColumn("response_body_encoding", "TEXT NOT NULL DEFAULT 'utf8'"); + addColumn("response_body_content_type", "TEXT NOT NULL DEFAULT ''"); + addColumn("response_body_size_bytes", "INTEGER NOT NULL DEFAULT 0"); + addColumn("response_body_truncated", "INTEGER NOT NULL DEFAULT 0"); + addColumn("error", "TEXT NOT NULL DEFAULT ''"); + + database.exec("CREATE INDEX IF NOT EXISTS request_logs_created_at_idx ON request_logs(created_at)"); + database.exec("CREATE INDEX IF NOT EXISTS request_logs_credential_id_idx ON request_logs(credential_id)"); + database.exec("CREATE INDEX IF NOT EXISTS request_logs_model_idx ON request_logs(model)"); + database.exec("CREATE INDEX IF NOT EXISTS request_logs_provider_idx ON request_logs(provider)"); + database.exec("CREATE INDEX IF NOT EXISTS request_logs_source_usage_id_idx ON request_logs(source_usage_id)"); + database.exec("CREATE INDEX IF NOT EXISTS request_logs_status_idx ON request_logs(ok, status_code)"); + database.exec("CREATE INDEX IF NOT EXISTS request_logs_list_idx ON request_logs(source_usage_id, created_at DESC, id DESC)"); + database.exec("CREATE INDEX IF NOT EXISTS request_logs_credential_created_at_idx ON request_logs(credential_id, created_at DESC)"); + database.exec("CREATE INDEX IF NOT EXISTS request_logs_model_created_at_idx ON request_logs(model, created_at DESC)"); + database.exec("CREATE INDEX IF NOT EXISTS request_logs_provider_created_at_idx ON request_logs(provider, created_at DESC)"); + database.exec("CREATE INDEX IF NOT EXISTS request_logs_status_created_at_idx ON request_logs(ok, created_at DESC)"); +} + +function backfillRequestLogStreamFlags(database: SqlDatabase): void { + const rows = queryRows( + database, + ` + SELECT + rowid AS id, + path, + url, + request_headers, + response_headers, + request_body_text, + request_body_encoding, + response_body_content_type + FROM request_logs + WHERE source_usage_id IS NULL + AND is_stream = 0 + AND ( + path LIKE '%stream%' OR + url LIKE '%stream%' OR + request_body_text LIKE '%stream%' OR + response_headers LIKE '%event-stream%' OR + response_body_content_type LIKE '%event-stream%' + ) + ` + ); + if (rows.length === 0) { + return; + } + + const statement = database.prepare("UPDATE request_logs SET is_stream = 1 WHERE rowid = ?"); + for (const row of rows) { + const requestBodyText = String(row.request_body_encoding ?? "utf8") === "utf8" + ? String(row.request_body_text ?? "") + : undefined; + const isStream = inferRequestLogIsStream({ + path: String(row.path ?? ""), + requestBodyText, + requestHeaders: parseHeaderJson(row.request_headers), + responseBodyContentType: String(row.response_body_content_type ?? ""), + responseHeaders: parseHeaderJson(row.response_headers), + url: String(row.url ?? "") + }); + if (isStream) { + statement.run(normalizeCount(row.id)); + } + } +} + +type RequestLogStreamInferenceInput = { + path?: string; + requestBodyText?: string; + requestHeaders?: Record; + responseBodyContentType?: string; + responseHeaders?: Record; + responseWasStream?: boolean; + url?: string; +}; + +function inferRequestLogIsStream(input: RequestLogStreamInferenceInput): boolean { + return Boolean( + input.responseWasStream || + requestPathLooksStreaming(input.path) || + requestPathLooksStreaming(input.url) || + contentTypeLooksStreaming(input.responseBodyContentType) || + contentTypeLooksStreaming(headerValue(input.responseHeaders ?? {}, "content-type")) || + contentTypeLooksStreaming(headerValue(input.requestHeaders ?? {}, "accept")) || + requestBodyHasStreamFlag(input.requestBodyText) + ); +} + +function requestPathLooksStreaming(value: string | undefined): boolean { + const normalized = value?.toLowerCase() ?? ""; + return normalized.includes(":streamgeneratecontent"); +} + +function contentTypeLooksStreaming(value: string | undefined): boolean { + const normalized = value?.toLowerCase() ?? ""; + return normalized.includes("text/event-stream") || normalized.includes("application/x-ndjson"); +} + +function requestBodyHasStreamFlag(text: string | undefined): boolean { + const trimmed = text?.trim(); + if (!trimmed) { + return false; + } + + const parsed = parseJson(trimmed); + return payloadHasStreamFlag(parsed); +} + +function payloadHasStreamFlag(value: unknown, depth = 0): boolean { + if (depth > 3) { + return false; + } + if (Array.isArray(value)) { + return value.some((item) => payloadHasStreamFlag(item, depth + 1)); + } + if (!isRecord(value)) { + return false; + } + if (value.stream === true || value.stream === "true") { + return true; + } + return Object.values(value).some((item) => payloadHasStreamFlag(item, depth + 1)); +} + +function buildLogWhereClause(filter: RequestLogListFilter): { params: SqlValue[]; where: string } { + const where: string[] = ["source_usage_id IS NULL", "path NOT LIKE ?"]; + const params: SqlValue[] = ["%/count_tokens%"]; + const status = normalizeStatusFilter(filter.status); + const credential = normalizeFilterValue(filter.credential); + const model = normalizeFilterValue(filter.model); + const provider = normalizeFilterValue(filter.provider); + const query = normalizeFilterValue(filter.query); + + if (status === "success") { + where.push("ok = 1"); + } else if (status === "error") { + where.push("ok = 0"); + } + if (model) { + where.push("model = ?"); + params.push(model); + } + if (provider) { + where.push("provider = ?"); + params.push(provider); + } + if (credential) { + where.push("credential_id = ?"); + params.push(credential); + } + if (query) { + const like = `%${query}%`; + where.push(`( + request_id LIKE ? OR + client LIKE ? OR + method LIKE ? OR + path LIKE ? OR + url LIKE ? OR + provider LIKE ? OR + credential_id LIKE ? OR + credential_chain LIKE ? OR + model LIKE ? OR + request_body_text LIKE ? OR + response_body_text LIKE ? OR + error LIKE ? + )`); + params.push(like, like, like, like, like, like, like, like, like, like, like, like); + } + + return { + params, + where: where.length > 0 ? `WHERE ${where.join(" AND ")}` : "" + }; +} + +function configureSqliteDatabase(database: SqlDatabase): void { + database.pragma("journal_mode = WAL"); + database.pragma("synchronous = NORMAL"); + database.pragma("busy_timeout = 5000"); +} + +function queryRows(database: SqlDatabase, sql: string, params: SqlValue[] = []): Record[] { + return database.prepare(sql).all(...params) as Record[]; +} + +function firstNumber(rows: Record[], column: string): number { + const row = rows[0]; + return normalizeCount(row?.[column]); +} + +function readRequestLogById(database: SqlDatabase, id: number): StoredRequestLogEntry | undefined { + const row = queryRows( + database, + ` + SELECT + rowid AS id, + created_at, + completed_at, + request_id, + client, + method, + path, + url, + provider, + credential_id, + credential_chain, + credential_saturated, + model, + is_stream, + status_code, + ok, + duration_ms, + input_tokens, + output_tokens, + reasoning_tokens, + cache_read_tokens, + cache_write_tokens, + total_tokens, + cost_usd, + request_headers, + response_headers, + request_body_text, + request_body_encoding, + request_body_content_type, + request_body_size_bytes, + request_body_truncated, + response_body_text, + response_body_encoding, + response_body_content_type, + response_body_size_bytes, + response_body_truncated, + error + FROM request_logs + WHERE rowid = ? + LIMIT 1 + `, + [id] + )[0]; + return row ? toRequestLogEntry(row) : undefined; +} + +function toRequestLogEntry(row: Record): StoredRequestLogEntry { + const costUsd = asFloat(row.cost_usd); + const requestBody = bodyFromRow(row, "request") ?? emptyBody(); + const responseBody = bodyFromRow(row, "response"); + const requestHeaders = parseHeaderJson(row.request_headers); + const responseHeaders = parseHeaderJson(row.response_headers); + const isStream = normalizeCount(row.is_stream) === 1 || inferRequestLogIsStream({ + path: String(row.path ?? ""), + requestBodyText: requestBody.encoding === "utf8" ? requestBody.text : undefined, + requestHeaders, + responseBodyContentType: responseBody?.contentType, + responseHeaders, + url: String(row.url ?? "") + }); + return { + cacheReadTokens: normalizeCount(row.cache_read_tokens), + cacheWriteTokens: normalizeCount(row.cache_write_tokens), + client: normalizeLabel(String(row.client ?? ""), "unknown"), + completedAt: String(row.completed_at ?? ""), + costUsd, + createdAt: String(row.created_at ?? ""), + credentialChain: parseCredentialChain(String(row.credential_chain ?? "")), + credentialId: normalizeLabel(String(row.credential_id ?? ""), ""), + credentialSaturated: normalizeCount(row.credential_saturated) === 1, + durationMs: normalizeCount(row.duration_ms), + error: String(row.error ?? ""), + id: normalizeCount(row.id), + inputTokens: normalizeCount(row.input_tokens), + isStream, + method: String(row.method ?? ""), + model: normalizeLabel(String(row.model ?? ""), "unknown"), + ok: normalizeCount(row.ok) === 1, + outputTokens: normalizeCount(row.output_tokens), + path: normalizeLabel(String(row.path ?? ""), "/"), + provider: normalizeLabel(String(row.provider ?? ""), "unknown"), + reasoningTokens: normalizeCount(row.reasoning_tokens), + requestBody, + requestHeaders, + requestId: String(row.request_id ?? ""), + retryAttempts: parseRequestLogRetryAttempts(responseHeaders, normalizeCount(row.status_code)), + responseBody, + responseHeaders, + statusCode: normalizeCount(row.status_code), + totalTokens: normalizeCount(row.total_tokens), + url: String(row.url ?? "") + }; +} + +function bodyFromRow(row: Record, prefix: "request" | "response"): RequestLogBody | undefined { + const text = String(row[`${prefix}_body_text`] ?? ""); + const sizeBytes = normalizeCount(row[`${prefix}_body_size_bytes`]); + if (!text && sizeBytes === 0 && prefix === "response") { + return undefined; + } + + const encoding = String(row[`${prefix}_body_encoding`] ?? "utf8") === "base64" ? "base64" : "utf8"; + const contentType = normalizeFilterValue(String(row[`${prefix}_body_content_type`] ?? "")); + return { + contentType, + encoding, + sizeBytes, + text, + truncated: normalizeCount(row[`${prefix}_body_truncated`]) === 1 + }; +} + +function emptyBody(): RequestLogBody { + return { + encoding: "utf8", + sizeBytes: 0, + text: "", + truncated: false + }; +} + +function parseHeaderJson(value: SqlValue): Record { + if (typeof value !== "string" || !value.trim()) { + return {}; + } + try { + const parsed = JSON.parse(value) as unknown; + if (!isRecord(parsed)) { + return {}; + } + const result: Record = {}; + for (const [key, headerValue] of Object.entries(parsed)) { + if (Array.isArray(headerValue)) { + result[key] = headerValue.map(String); + } else if (typeof headerValue === "string") { + result[key] = headerValue; + } + } + return result; + } catch { + return {}; + } +} + +function readDistinctValues(database: SqlDatabase, column: "credential_id" | "model" | "provider"): string[] { + return queryRows( + database, + ` + SELECT DISTINCT ${column} AS value + FROM request_logs + WHERE source_usage_id IS NULL AND path NOT LIKE ? AND ${column} <> '' AND ${column} <> 'unknown' + ORDER BY ${column} COLLATE NOCASE ASC + LIMIT 100 + `, + ["%/count_tokens%"] + ) + .map((row) => String(row.value ?? "")) + .filter(Boolean); +} + +function bodyFromBuffer(buffer: Buffer, contentType?: string): RequestLogBody { + const truncated = buffer.byteLength > maxBodyBytes; + const data = truncated ? buffer.subarray(0, maxBodyBytes) : buffer; + const textLike = isTextLikeContentType(contentType); + return { + contentType, + encoding: textLike ? "utf8" : "base64", + sizeBytes: buffer.byteLength, + text: textLike ? data.toString("utf8") : data.toString("base64"), + truncated + }; +} + +function bodyFromText(text: string, contentType?: string, alreadyTruncated = false): RequestLogBody { + const buffer = Buffer.from(text); + const truncated = alreadyTruncated || buffer.byteLength > maxBodyBytes; + const data = truncated ? buffer.subarray(0, maxBodyBytes) : buffer; + return { + contentType, + encoding: "utf8", + sizeBytes: buffer.byteLength, + text: data.toString("utf8"), + truncated + }; +} + +function pushBodyValues( + sets: string[], + params: SqlValue[], + prefix: "request" | "response", + body: RequestLogBody +): void { + sets.push(`${prefix}_body_text = ?`); + params.push(body.text); + sets.push(`${prefix}_body_encoding = ?`); + params.push(body.encoding); + sets.push(`${prefix}_body_content_type = ?`); + params.push(body.contentType ?? ""); + sets.push(`${prefix}_body_size_bytes = ?`); + params.push(body.sizeBytes); + sets.push(`${prefix}_body_truncated = ?`); + params.push(body.truncated ? 1 : 0); +} + +function isTextLikeContentType(contentType: string | undefined): boolean { + if (!contentType) { + return true; + } + const normalized = contentType.toLowerCase(); + return ( + normalized.includes("json") || + normalized.includes("text") || + normalized.includes("xml") || + normalized.includes("x-www-form-urlencoded") || + normalized.includes("event-stream") + ); +} + +function hasRequestLogWithRequestId(database: SqlDatabase, requestId: string): boolean { + return firstNumber( + queryRows(database, "SELECT COUNT(*) AS total FROM request_logs WHERE request_id = ?", [requestId]), + "total" + ) > 0; +} + +function readRequestHeadersForRequestId(database: SqlDatabase, requestId: string): Record { + const row = queryRows(database, "SELECT request_headers FROM request_logs WHERE request_id = ? LIMIT 1", [requestId])[0]; + return row ? parseHeaderJson(row.request_headers) : {}; +} + +function readRequestLogUsageContext(database: SqlDatabase, requestId: string): RequestLogUsageContext { + const row = queryRows(database, "SELECT model, path, provider FROM request_logs WHERE request_id = ? LIMIT 1", [requestId])[0]; + return { + model: normalizeLabel(String(row?.model ?? ""), "unknown"), + path: normalizeLabel(String(row?.path ?? ""), ""), + provider: normalizeLabel(String(row?.provider ?? ""), "unknown") + }; +} + +function mergeRequestHeadersForRawTrace( + existingHeaders: Record, + upstreamHeaders: Record +): Record { + return { + ...upstreamHeaders, + ...existingHeaders + }; +} + +function pathFromUrl(value: string | undefined): string | undefined { + if (!value) { + return undefined; + } + try { + return new URL(value).pathname || undefined; + } catch { + return undefined; + } +} + +function sanitizeHeaders(headers: HeaderRecord): Record { + const result: Record = {}; + for (const [key, value] of Object.entries(headers)) { + if (value === undefined) { + continue; + } + const normalizedKey = key.toLowerCase(); + if (sensitiveHeaderNames.has(normalizedKey)) { + result[normalizedKey] = "[redacted]"; + continue; + } + result[normalizedKey] = Array.isArray(value) ? value.map(String) : String(value); + } + return result; +} + +function headersToRecord(headers: Headers | HeaderRecord | undefined): HeaderRecord { + if (!headers) { + return {}; + } + if (headers instanceof Headers) { + const result: HeaderRecord = {}; + headers.forEach((value, key) => { + result[key] = value; + }); + return result; + } + return headers; +} + +function headerValue(headers: Record, name: string): string | undefined { + const value = headers[name.toLowerCase()]; + return Array.isArray(value) ? value[0] : value; +} + +function extractUsageFromBillingHeaders(headers: Headers | HeaderRecord | undefined): UsageNumbers | undefined { + const inputTokens = readNumberResponseHeader(headers, "x-gateway-billing-input-tokens"); + const outputTokens = readNumberResponseHeader(headers, "x-gateway-billing-output-tokens"); + const reasoningTokens = + readNumberResponseHeader(headers, "x-gateway-billing-reasoning-tokens") ?? + readNumberResponseHeader(headers, "x-gateway-billing-thinking-tokens"); + const cacheReadTokens = readNumberResponseHeader(headers, "x-gateway-billing-cache-read-tokens"); + const cacheWriteTokens = readNumberResponseHeader(headers, "x-gateway-billing-cache-write-tokens"); + const totalTokens = readNumberResponseHeader(headers, "x-gateway-billing-total-tokens"); + + if ([inputTokens, outputTokens, reasoningTokens, cacheReadTokens, cacheWriteTokens, totalTokens].every((value) => value === undefined)) { + return undefined; + } + + return { + cacheReadTokens, + cacheWriteTokens, + inputTokens, + outputTokens, + reasoningTokens, + totalTokens + }; +} + +function extractUsageFromBody(text: string): UsageSnapshot | undefined { + const snapshots: UsageSnapshot[] = []; + const trimmed = text.trim(); + if (!trimmed) { + return undefined; + } + + const parsed = parseJson(trimmed); + if (parsed !== undefined) { + const snapshot = extractUsageSnapshot(parsed); + return snapshot && hasUsageNumbers(snapshot) ? snapshot : undefined; + } + + for (const payload of parseStreamPayloads(trimmed)) { + const snapshot = extractUsageSnapshot(payload); + if (snapshot && hasUsageNumbers(snapshot)) { + snapshots.push(snapshot); + } + } + + return snapshots.at(-1); +} + +function parseStreamPayloads(text: string): unknown[] { + const payloads: unknown[] = []; + for (const rawLine of text.split(/\r?\n/)) { + const line = rawLine.trim(); + const payload = line.startsWith("data:") ? line.slice(5).trim() : line.startsWith("{") ? line : ""; + if (!payload || payload === "[DONE]") { + continue; + } + const parsed = parseJson(payload); + if (parsed !== undefined) { + payloads.push(parsed); + } + } + return payloads; +} + +export function detectSseError(text: string, contentType?: string): string | undefined { + if (!text || (!contentTypeLooksSse(contentType) && !textLooksSse(text))) { + return undefined; + } + const detector = createSseErrorDetector(contentType, true); + detector.append(text); + return detector.finish(); +} + +export function createSseErrorDetector(contentType?: string, force = false): SseErrorDetector { + const active = force || contentTypeLooksSse(contentType); + const decoder = new StringDecoder("utf8"); + let currentEvent = ""; + let dataLines: string[] = []; + let detectedError: string | undefined; + let pendingLine = ""; + + const read = () => detectedError; + const flushEvent = () => { + if (!detectedError) { + detectedError = detectSseEventError(currentEvent, dataLines); + } + currentEvent = ""; + dataLines = []; + }; + const processLine = (line: string) => { + if (!active || detectedError) { + return; + } + if (line === "") { + flushEvent(); + return; + } + if (line.startsWith(":")) { + return; + } + const separator = line.indexOf(":"); + const field = separator === -1 ? line : line.slice(0, separator); + const rawValue = separator === -1 ? "" : line.slice(separator + 1); + const value = rawValue.startsWith(" ") ? rawValue.slice(1) : rawValue; + if (field === "event") { + currentEvent = value.trim(); + } else if (field === "data") { + dataLines.push(value); + } + }; + const processText = (textChunk: string) => { + pendingLine += textChunk; + while (true) { + const newlineIndex = pendingLine.indexOf("\n"); + if (newlineIndex === -1) { + break; + } + const rawLine = pendingLine.slice(0, newlineIndex); + pendingLine = pendingLine.slice(newlineIndex + 1); + processLine(rawLine.endsWith("\r") ? rawLine.slice(0, -1) : rawLine); + } + }; + + return { + append(chunk: Buffer | string) { + if (!active || detectedError) { + return detectedError; + } + processText(Buffer.isBuffer(chunk) ? decoder.write(chunk) : chunk); + return detectedError; + }, + finish() { + if (!active || detectedError) { + return detectedError; + } + processText(decoder.end()); + if (pendingLine) { + processLine(pendingLine.endsWith("\r") ? pendingLine.slice(0, -1) : pendingLine); + pendingLine = ""; + } + if (currentEvent || dataLines.length > 0) { + flushEvent(); + } + return detectedError; + }, + read + }; +} + +function detectSseEventError(eventName: string, dataLines: string[]): string | undefined { + const event = eventName.trim().toLowerCase(); + const data = dataLines.join("\n").trim(); + const payload = data && data !== "[DONE]" ? parseJson(data) : undefined; + if (event === "error") { + return formatSseErrorPayload(payload, data || "SSE error event"); + } + if (event === "response.failed" || event === "response.error") { + return formatSseErrorPayload(payload, event); + } + if (isRecord(payload)) { + const payloadType = asString(payload.type)?.toLowerCase(); + if (payloadType === "error" || payloadType === "response.failed" || payloadType === "response.error") { + return formatSseErrorPayload(payload, payloadType); + } + if (payload.error !== undefined && payload.error !== null) { + return formatSseErrorPayload(payload, event || "SSE error"); + } + const response = isRecord(payload.response) ? payload.response : undefined; + const responseStatus = asString(response?.status)?.toLowerCase(); + if ( + (responseStatus === "failed" || responseStatus === "error") && + response?.error !== undefined && + response.error !== null + ) { + return formatSseErrorPayload(response, responseStatus); + } + } + return undefined; +} + +function formatSseErrorPayload(payload: unknown, fallback: string): string { + if (isRecord(payload)) { + const response = isRecord(payload.response) ? payload.response : undefined; + const error = payload.error ?? response?.error; + const message = sseErrorMessage(error) ?? sseErrorMessage(payload); + const type = sseErrorType(error) ?? sseErrorType(payload); + const code = isRecord(error) ? asString(error.code) : undefined; + const label = uniqueStrings([type, code]).join(" "); + if (message && label && message !== label) { + return `${label}: ${message}`; + } + if (message) { + return message; + } + if (label) { + return label; + } + } + if (typeof payload === "string" && payload.trim()) { + return payload.trim(); + } + return fallback; +} + +function sseErrorMessage(value: unknown): string | undefined { + if (typeof value === "string") { + return normalizeFilterValue(value); + } + if (!isRecord(value)) { + return undefined; + } + return ( + asString(value.message) ?? + asString(value.detail) ?? + asString(value.reason) ?? + asString(value.error_description) ?? + asString(value.error) + ); +} + +function sseErrorType(value: unknown): string | undefined { + if (!isRecord(value)) { + return undefined; + } + return asString(value.type) ?? asString(value.code) ?? asString(value.status); +} + +function contentTypeLooksSse(contentType: string | undefined): boolean { + return Boolean(contentType?.toLowerCase().includes("event-stream")); +} + +function textLooksSse(text: string): boolean { + const trimmed = text.trimStart(); + return trimmed.startsWith("event:") || trimmed.startsWith("data:"); +} + +function uniqueStrings(values: Array): string[] { + const seen = new Set(); + const result: string[] = []; + for (const value of values) { + const trimmed = value?.trim(); + if (!trimmed || seen.has(trimmed)) { + continue; + } + seen.add(trimmed); + result.push(trimmed); + } + return result; +} + +function extractUsageSnapshot(payload: unknown): UsageSnapshot | undefined { + if (!isRecord(payload)) { + return undefined; + } + + const response = isRecord(payload.response) ? payload.response : payload; + const usage = isRecord(response.usage) + ? response.usage + : isRecord(payload.usage) + ? payload.usage + : undefined; + const usageMetadata = isRecord(response.usageMetadata) + ? response.usageMetadata + : isRecord(payload.usageMetadata) + ? payload.usageMetadata + : undefined; + + if (usageMetadata) { + return { + cacheReadTokens: asNumber(usageMetadata.cachedContentTokenCount), + inputIncludesCacheTokens: true, + inputTokens: asNumber(usageMetadata.promptTokenCount), + model: asString(response.modelVersion) ?? asString(payload.modelVersion), + outputTokens: asNumber(usageMetadata.candidatesTokenCount), + totalTokens: asNumber(usageMetadata.totalTokenCount) + }; + } + + if (!usage) { + return undefined; + } + + const inputDetails = isRecord(usage.input_tokens_details) + ? usage.input_tokens_details + : isRecord(usage.prompt_tokens_details) + ? usage.prompt_tokens_details + : undefined; + const outputDetails = isRecord(usage.output_tokens_details) + ? usage.output_tokens_details + : isRecord(usage.completion_tokens_details) + ? usage.completion_tokens_details + : undefined; + const hasAnthropicCacheFields = + usage.cache_read_input_tokens !== undefined || + usage.cache_creation_input_tokens !== undefined; + const hasOpenAiCacheFields = + inputDetails?.cached_tokens !== undefined || + inputDetails?.cache_creation_tokens !== undefined || + usage.cached_tokens !== undefined || + usage.prompt_tokens !== undefined; + + return { + cacheReadTokens: + asNumber(usage.cache_read_tokens) ?? + asNumber(usage.cache_read_input_tokens) ?? + asNumber(usage.cached_tokens) ?? + asNumber(inputDetails?.cached_tokens), + cacheWriteTokens: + asNumber(usage.cache_write_tokens) ?? + asNumber(usage.cache_creation_tokens) ?? + asNumber(usage.cache_creation_input_tokens) ?? + asNumber(inputDetails?.cache_creation_tokens), + inputIncludesCacheTokens: hasAnthropicCacheFields ? false : hasOpenAiCacheFields ? true : undefined, + inputTokens: asNumber(usage.input_tokens) ?? asNumber(usage.prompt_tokens), + model: + asString(response.model) ?? + asString(payload.model) ?? + asString(response.modelVersion) ?? + asString(payload.modelVersion), + outputTokens: asNumber(usage.output_tokens) ?? asNumber(usage.completion_tokens), + reasoningTokens: + asNumber(outputDetails?.reasoning_tokens) ?? + asNumber(outputDetails?.thinking_tokens) ?? + asNumber(usage.reasoning_tokens) ?? + asNumber(usage.thinking_tokens), + totalTokens: asNumber(usage.total_tokens) + }; +} + +function extractModelFromBody(text: string): string | undefined { + const parsed = parseJson(text.trim()); + if (!isRecord(parsed)) { + return undefined; + } + return asString(parsed.model); +} + +function hasUsageNumbers(snapshot: UsageNumbers): boolean { + return [ + snapshot.cacheReadTokens, + snapshot.cacheWriteTokens, + snapshot.inputTokens, + snapshot.outputTokens, + snapshot.reasoningTokens, + snapshot.totalTokens + ].some((value) => value !== undefined); +} + +function readResponseHeader(headers: Headers | HeaderRecord | undefined, name: string): string | undefined { + if (!headers) { + return undefined; + } + if (headers instanceof Headers) { + return normalizeFilterValue(headers.get(name) ?? undefined); + } + return normalizeFilterValue(headerValue(headersToRecord(headers) as Record, name)); +} + +function readNumberResponseHeader(headers: Headers | HeaderRecord | undefined, name: string): number | undefined { + return asNumber(readResponseHeader(headers, name)); +} + +function parseJson(value: string): unknown | undefined { + try { + return JSON.parse(value) as unknown; + } catch { + return undefined; + } +} + +function splitRouteSelector(value: string | undefined): { model?: string; provider?: string } { + const trimmed = value?.trim(); + if (!trimmed) { + return {}; + } + + const separator = trimmed.indexOf("/"); + if (separator <= 0 || separator >= trimmed.length - 1) { + return { model: trimmed }; + } + + return { + model: trimmed.slice(separator + 1).trim(), + provider: trimmed.slice(0, separator).trim() + }; +} + +function normalizeStatusFilter(value: RequestLogStatusFilter | undefined): RequestLogStatusFilter { + return value === "success" || value === "error" ? value : "all"; +} + +function normalizeFilterValue(value: string | undefined): string | undefined { + const trimmed = value?.trim(); + return trimmed || undefined; +} + +function normalizeLabel(value: string | undefined, fallback: string): string { + const trimmed = value?.trim(); + return trimmed || fallback; +} + +function normalizeCount(value: unknown): number { + return asNumber(value) ?? 0; +} + +function asNumber(value: unknown): number | undefined { + const parsed = typeof value === "number" ? value : typeof value === "string" ? Number(value) : Number.NaN; + return Number.isFinite(parsed) ? Math.max(0, Math.round(parsed)) : undefined; +} + +function asFloat(value: unknown): number | undefined { + const parsed = typeof value === "number" ? value : typeof value === "string" ? Number(value) : Number.NaN; + return Number.isFinite(parsed) ? Math.max(0, parsed) : undefined; +} + +function asString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function isSuccessStatus(statusCode: number, error: string | undefined): boolean { + return !error && statusCode >= 200 && statusCode < 400; +} + +function clampInteger(value: unknown, min: number, max: number, fallback: number): number { + const parsed = Number(value); + if (!Number.isFinite(parsed)) { + return fallback; + } + return Math.max(min, Math.min(max, Math.trunc(parsed))); +} + +function ratio(numerator: number, denominator: number): number { + if (denominator <= 0) { + return 0; + } + return Math.max(0, Math.min(1, numerator / denominator)); +} + +function sum(items: T[], read: (item: T) => number): number { + return items.reduce((total, item) => total + read(item), 0); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/core/src/platform/windows-app-discovery.ts b/packages/core/src/platform/windows-app-discovery.ts new file mode 100644 index 0000000..3e9c00c --- /dev/null +++ b/packages/core/src/platform/windows-app-discovery.ts @@ -0,0 +1,413 @@ +import { spawnSync } from "node:child_process"; +import { readdirSync, statSync } from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import { windowsSystemCommand } from "@ccr/core/platform/windows-system"; + +export type WindowsDesktopAppDiscoveryOptions = { + appDirs: string[]; + exeNames: string[]; + packageKeywords: string[]; + vendorDirs: string[]; + whereNames: string[]; +}; + +export type WindowsDesktopAppNormalizeOptions = { + exeNames: string[]; + packageKeywords: string[]; +}; + +export function windowsDesktopAppCandidates(options: WindowsDesktopAppDiscoveryOptions): string[] { + if (process.platform !== "win32") { + return []; + } + + const candidates: string[] = []; + for (const root of windowsInstallRoots()) { + const installRoots = [ + root, + path.join(root, "Programs"), + ...options.vendorDirs.flatMap((vendor) => [ + path.join(root, vendor), + path.join(root, "Programs", vendor) + ]), + path.join(root, "Microsoft", "WindowsApps") + ]; + + for (const installRoot of installRoots) { + for (const exeName of options.exeNames) { + pushUnique(candidates, path.join(installRoot, exeName)); + } + for (const dirName of options.appDirs) { + const appDir = path.join(installRoot, dirName); + pushUnique(candidates, appDir); + for (const exeName of options.exeNames) { + pushUnique(candidates, path.join(appDir, exeName)); + } + } + } + } + + for (const candidate of windowsAppExecutionAliasCandidates(options)) { + pushUnique(candidates, candidate); + } + for (const candidate of windowsShortcutTargetCandidates(options)) { + pushUnique(candidates, candidate); + } + for (const candidate of windowsMsixPackageCandidates(options)) { + pushUnique(candidates, candidate); + } + for (const candidate of windowsWhereCandidates(options.whereNames)) { + pushUnique(candidates, candidate); + } + return candidates; +} + +function windowsShortcutTargetCandidates(options: WindowsDesktopAppDiscoveryOptions): string[] { + const names = unique([ + ...options.packageKeywords, + ...options.appDirs, + ...options.exeNames.map((name) => path.basename(name, path.extname(name))) + ].map((name) => name.trim()).filter(Boolean)); + if (names.length === 0) { + return []; + } + + const pattern = names.map(escapeRegExp).join("|"); + const script = [ + "$ErrorActionPreference = 'SilentlyContinue';", + "$roots = @(", + " [Environment]::GetFolderPath('Programs'),", + " [Environment]::GetFolderPath('CommonPrograms'),", + " [Environment]::GetFolderPath('Desktop'),", + " [Environment]::GetFolderPath('CommonDesktopDirectory')", + ") | Where-Object { $_ } | Select-Object -Unique;", + `$pattern = '${powerShellSingleQuotedString(pattern)}';`, + "$shell = New-Object -ComObject WScript.Shell;", + "Get-ChildItem -LiteralPath $roots -Filter '*.lnk' -File -Recurse |", + " Where-Object { $_.BaseName -match $pattern } |", + " ForEach-Object {", + " try {", + " $target = $shell.CreateShortcut($_.FullName).TargetPath;", + " if ($target) { $target }", + " } catch {}", + " }" + ].join(" "); + + const result = spawnSync(windowsSystemCommand("powershell.exe"), [ + "-NoProfile", + "-NonInteractive", + "-ExecutionPolicy", + "Bypass", + "-Command", + script + ], { + encoding: "utf8", + windowsHide: true + }); + if (result.status !== 0) { + return []; + } + + return result.stdout + .split(/\r?\n/) + .map((line) => line.trim()) + .filter(Boolean); +} + +export function normalizeWindowsDesktopAppCandidate( + candidate: string, + options: WindowsDesktopAppNormalizeOptions +): string | undefined { + if (isDirectory(candidate)) { + return windowsExecutableInDir(candidate, options); + } + if (!isFile(candidate)) { + return undefined; + } + + const fileName = path.basename(candidate); + if (matchesKnownExeName(fileName, options.exeNames)) { + return candidate; + } + if (isLikelyWindowsPackagedAppPath(candidate) && windowsExecutableNameLooksLikeApp(fileName, options.packageKeywords)) { + return candidate; + } + + const parent = path.basename(path.dirname(candidate)).toLowerCase(); + if (parent === "resources") { + const appDir = path.dirname(path.dirname(candidate)); + return windowsExecutableInDir(appDir, options); + } + return undefined; +} + +function windowsInstallRoots(): string[] { + return unique([ + process.env.LOCALAPPDATA, + process.env.APPDATA, + process.env.ProgramFiles, + process.env.PROGRAMFILES, + process.env["ProgramFiles(x86)"], + process.env["PROGRAMFILES(X86)"], + process.env.ProgramW6432, + process.env.PROGRAMW6432, + process.env.USERPROFILE ? path.join(process.env.USERPROFILE, "AppData", "Local") : undefined, + process.env.USERPROFILE ? path.join(process.env.USERPROFILE, "AppData", "Roaming") : undefined, + path.join(os.homedir(), "AppData", "Local"), + path.join(os.homedir(), "AppData", "Roaming") + ].filter((value): value is string => Boolean(value?.trim()))); +} + +function windowsAppExecutionAliasCandidates(options: WindowsDesktopAppDiscoveryOptions): string[] { + const roots = unique([ + process.env.LOCALAPPDATA ? path.join(process.env.LOCALAPPDATA, "Microsoft", "WindowsApps") : undefined, + process.env.USERPROFILE ? path.join(process.env.USERPROFILE, "AppData", "Local", "Microsoft", "WindowsApps") : undefined, + path.join(os.homedir(), "AppData", "Local", "Microsoft", "WindowsApps") + ].filter((value): value is string => Boolean(value?.trim()))); + + const candidates: string[] = []; + const aliasNames = windowsAliasNames(options); + for (const root of roots) { + for (const aliasName of aliasNames) { + pushUnique(candidates, path.join(root, aliasName)); + } + + for (const entry of readDirectoryEntries(root)) { + if (entry.toLowerCase().endsWith(".exe") && windowsExecutableNameLooksLikeApp(entry, options.packageKeywords)) { + pushUnique(candidates, path.join(root, entry)); + } + } + } + return candidates; +} + +function windowsAliasNames(options: WindowsDesktopAppDiscoveryOptions): string[] { + const names = [...options.exeNames]; + for (const name of options.whereNames) { + names.push(name); + if (!name.toLowerCase().endsWith(".exe")) { + names.push(`${name}.exe`); + } + } + return unique(names.filter((name) => name.trim().length > 0)); +} + +function windowsMsixPackageCandidates(options: WindowsDesktopAppDiscoveryOptions): string[] { + const candidates: string[] = []; + for (const installLocation of windowsMsixInstallLocations(options.packageKeywords)) { + pushWindowsExecutableCandidates(candidates, installLocation, options); + } + return candidates; +} + +function windowsMsixInstallLocations(packageKeywords: string[]): string[] { + const locations: string[] = []; + + for (const root of windowsPackageRoots()) { + for (const entry of readDirectoryEntries(root)) { + if (nameContainsKeyword(entry, packageKeywords)) { + pushUnique(locations, path.join(root, entry)); + } + } + } + + for (const installLocation of windowsAppxPackageInstallLocations(packageKeywords)) { + pushUnique(locations, installLocation); + } + return locations; +} + +function windowsPackageRoots(): string[] { + return unique([ + process.env.ProgramFiles ? path.join(process.env.ProgramFiles, "WindowsApps") : undefined, + process.env.PROGRAMFILES ? path.join(process.env.PROGRAMFILES, "WindowsApps") : undefined, + process.env.ProgramW6432 ? path.join(process.env.ProgramW6432, "WindowsApps") : undefined, + process.env.PROGRAMW6432 ? path.join(process.env.PROGRAMW6432, "WindowsApps") : undefined, + "C:\\Program Files\\WindowsApps" + ].filter((value): value is string => Boolean(value?.trim()))); +} + +function windowsAppxPackageInstallLocations(packageKeywords: string[]): string[] { + if (packageKeywords.length === 0) { + return []; + } + + const pattern = packageKeywords.map(escapeRegExp).join("|"); + const script = [ + "$ErrorActionPreference = 'SilentlyContinue';", + `$pattern = '${powerShellSingleQuotedString(pattern)}';`, + "Get-AppxPackage | Where-Object {", + " ($_.Name -match $pattern) -or", + " ($_.PackageFullName -match $pattern) -or", + " ($_.InstallLocation -match $pattern)", + "} | ForEach-Object { $_.InstallLocation }" + ].join(" "); + + const result = spawnSync(windowsSystemCommand("powershell.exe"), [ + "-NoProfile", + "-NonInteractive", + "-ExecutionPolicy", + "Bypass", + "-Command", + script + ], { + encoding: "utf8", + windowsHide: true + }); + if (result.status !== 0) { + return []; + } + + return result.stdout + .split(/\r?\n/) + .map((line) => line.trim()) + .filter(Boolean); +} + +function pushWindowsExecutableCandidates( + candidates: string[], + installLocation: string, + options: WindowsDesktopAppDiscoveryOptions +): void { + pushUnique(candidates, installLocation); + for (const exeName of options.exeNames) { + pushUnique(candidates, path.join(installLocation, exeName)); + } + for (const nested of ["app", "current", "Current", "bin", path.join("app", "bin")]) { + const nestedDir = path.join(installLocation, nested); + pushUnique(candidates, nestedDir); + for (const exeName of options.exeNames) { + pushUnique(candidates, path.join(nestedDir, exeName)); + } + } +} + +function windowsWhereCandidates(names: string[]): string[] { + const candidates: string[] = []; + for (const name of names) { + const result = spawnSync(windowsSystemCommand("where.exe"), [name], { + encoding: "utf8", + windowsHide: true + }); + if (result.status !== 0) { + continue; + } + for (const line of result.stdout.split(/\r?\n/)) { + if (line.trim()) { + pushUnique(candidates, line.trim()); + } + } + } + return candidates; +} + +function windowsExecutableInDir( + dir: string, + options: WindowsDesktopAppNormalizeOptions +): string | undefined { + if (!isDirectory(dir)) { + return undefined; + } + + for (const exeName of options.exeNames) { + const candidate = path.join(dir, exeName); + if (isFile(candidate)) { + return candidate; + } + } + + const looseExecutable = readDirectoryEntries(dir) + .filter((entry) => entry.toLowerCase().endsWith(".exe")) + .map((entry) => path.join(dir, entry)) + .find((entry) => isFile(entry) && windowsExecutableNameLooksLikeApp(path.basename(entry), options.packageKeywords)); + if (looseExecutable) { + return looseExecutable; + } + + for (const nested of ["app", "current", "Current", "bin", path.join("app", "bin")]) { + const candidate = windowsExecutableInDir(path.join(dir, nested), options); + if (candidate) { + return candidate; + } + } + + const versionedDirs = readDirectoryEntries(dir) + .filter((entry) => entry.toLowerCase().startsWith("app-") || nameContainsKeyword(entry, options.packageKeywords)) + .map((entry) => path.join(dir, entry)) + .filter(isDirectory) + .sort() + .reverse(); + for (const versionedDir of versionedDirs) { + const candidate = windowsExecutableInDir(versionedDir, options); + if (candidate) { + return candidate; + } + } + return undefined; +} + +function readDirectoryEntries(dir: string): string[] { + try { + return readdirSync(dir); + } catch { + return []; + } +} + +function matchesKnownExeName(fileName: string, exeNames: string[]): boolean { + const normalized = fileName.toLowerCase(); + return exeNames.some((name) => name.toLowerCase() === normalized); +} + +function windowsExecutableNameLooksLikeApp(fileName: string, packageKeywords: string[]): boolean { + return fileName.toLowerCase().endsWith(".exe") && nameContainsKeyword(fileName, packageKeywords); +} + +function nameContainsKeyword(value: string, packageKeywords: string[]): boolean { + const normalized = value.toLowerCase(); + return packageKeywords.some((keyword) => normalized.includes(keyword.toLowerCase())); +} + +function isLikelyWindowsPackagedAppPath(value: string): boolean { + const normalized = value.replace(/\\/g, "/").toLowerCase(); + return normalized.includes("/microsoft/windowsapps/") || normalized.includes("/windowsapps/"); +} + +function isFile(file: string): boolean { + try { + return statSync(file).isFile(); + } catch { + return false; + } +} + +function isDirectory(file: string): boolean { + try { + return statSync(file).isDirectory(); + } catch { + return false; + } +} + +function unique(values: string[]): string[] { + const result: string[] = []; + for (const value of values) { + pushUnique(result, value); + } + return result; +} + +function pushUnique(values: string[], value: string): void { + if (!values.includes(value)) { + values.push(value); + } +} + +function powerShellSingleQuotedString(value: string): string { + return value.replace(/'/g, "''"); +} + +function escapeRegExp(value: string): string { + return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); +} diff --git a/packages/core/src/platform/windows-system.ts b/packages/core/src/platform/windows-system.ts new file mode 100644 index 0000000..800798b --- /dev/null +++ b/packages/core/src/platform/windows-system.ts @@ -0,0 +1,57 @@ +import { spawnSync } from "node:child_process"; +import { existsSync } from "node:fs"; +import path from "node:path"; + +export function windowsSystemCommand(command: string): string { + if (process.platform !== "win32" || path.isAbsolute(command)) { + return command; + } + + const roots = [process.env.SystemRoot, process.env.windir] + .map((value) => value?.trim()) + .filter((value): value is string => Boolean(value)); + const normalized = command.toLowerCase(); + const candidates = roots.flatMap((root) => { + if (normalized === "powershell.exe") { + return [ + path.join(root, "System32", "WindowsPowerShell", "v1.0", "powershell.exe"), + path.join(root, "Sysnative", "WindowsPowerShell", "v1.0", "powershell.exe") + ]; + } + return [ + path.join(root, "System32", command), + path.join(root, "Sysnative", command) + ]; + }); + + return candidates.find((candidate) => existsSync(candidate)) ?? command; +} + +export function broadcastWindowsEnvironmentChanged(): void { + if (process.platform !== "win32") { + return; + } + + const script = windowsEnvironmentChangedPowerShellLines().join(" "); + + spawnSync(windowsSystemCommand("powershell.exe"), [ + "-NoProfile", + "-NonInteractive", + "-ExecutionPolicy", + "Bypass", + "-Command", + script + ], { + stdio: "ignore", + windowsHide: true + }); +} + +export function windowsEnvironmentChangedPowerShellLines(): string[] { + return [ + "$signature = '[DllImport(\"user32.dll\", SetLastError=true, CharSet=CharSet.Auto)] public static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam, uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);';", + "Add-Type -MemberDefinition $signature -Namespace Win32 -Name NativeMethods;", + "$result = [UIntPtr]::Zero;", + "[Win32.NativeMethods]::SendMessageTimeout([IntPtr]0xffff, 0x1a, [UIntPtr]::Zero, 'Environment', 0x2, 5000, [ref]$result) | Out-Null;" + ]; +} diff --git a/packages/core/src/plugins/backend-service.ts b/packages/core/src/plugins/backend-service.ts new file mode 100644 index 0000000..84abbf2 --- /dev/null +++ b/packages/core/src/plugins/backend-service.ts @@ -0,0 +1,383 @@ +import { copyFileSync, existsSync, mkdirSync, rmSync } from "node:fs"; +import http, { type IncomingMessage, type Server, type ServerResponse } from "node:http"; +import path from "node:path"; +import { createBetterSqliteDatabase, type BetterSqliteDatabase, type BetterSqliteStatement } from "@ccr/core/storage/sqlite-native"; + +type MaybePromise = T | Promise; +export type SqliteValue = bigint | Buffer | number | string | Uint8Array | null; +export type SqliteExecResult = { + columns: string[]; + values: SqliteValue[][]; +}; +export type SqliteStatement = { + bind: (params?: SqliteValue[]) => void; + free: () => void; + getAsObject: () => Record; + run: (params?: SqliteValue[]) => void; + step: () => boolean; +}; +export type SqlDatabase = { + close: () => void; + exec: (sql: string, params?: SqliteValue[]) => SqliteExecResult[]; + prepare: (sql: string) => SqliteStatement; + run: (sql: string, params?: SqliteValue[]) => SqlDatabase; +}; + +export type HttpBackendRegistration = { + handler: (request: IncomingMessage, response: ServerResponse) => MaybePromise; + host?: string; + id?: string; + port?: number; +}; + +export type RegisteredHttpBackend = { + host: string; + id: string; + port: number; + url: string; +}; + +export type SqliteStoreOptions = { + filename?: string; + migrate?: (database: SqlDatabase) => MaybePromise; +}; + +export type SqliteStore = { + database: SqlDatabase; + dbFile: string; + exec: (sql: string, params?: SqliteValue[]) => ReturnType; + persist: () => void; +}; + +type RegisteredBackendServer = RegisteredHttpBackend & { + ownerId: string; + server: Server; +}; + +class BackendService { + private backends: RegisteredBackendServer[] = []; + private sqliteStores: SqliteStoreImpl[] = []; + + async registerHttpBackend(ownerId: string, backend: HttpBackendRegistration): Promise { + const server = http.createServer((request, response) => { + void Promise.resolve(backend.handler(request, response)).catch((error) => { + if (!response.headersSent) { + sendJson(response, 500, { error: { message: formatError(error) } }); + } else { + response.destroy(error instanceof Error ? error : new Error(String(error))); + } + }); + }); + + const host = backend.host || "127.0.0.1"; + const port = backend.port ?? 0; + await listen(server, port, host); + const address = server.address(); + if (!address || typeof address === "string") { + await closeServer(server); + throw new Error(`Backend ${backend.id || ownerId} failed to start.`); + } + + const registered = { + host, + id: backend.id || `${ownerId}:backend:${this.backends.length + 1}`, + ownerId, + port: address.port, + server, + url: `http://${formatHost(host)}:${address.port}` + }; + this.backends.push(registered); + return { + host: registered.host, + id: registered.id, + port: registered.port, + url: registered.url + }; + } + + async openSqliteStore(ownerId: string, dataDir: string, options: SqliteStoreOptions = {}): Promise { + mkdirSync(dataDir, { recursive: true }); + const filename = options.filename || `${sanitizeFileSegment(ownerId)}.sqlite`; + const dbFile = path.isAbsolute(filename) ? filename : path.join(dataDir, filename); + mkdirSync(path.dirname(dbFile), { recursive: true }); + const database = openSqliteDatabaseWithRecovery(ownerId, dbFile); + const store = new SqliteStoreImpl(ownerId, dbFile, database); + this.sqliteStores.push(store); + if (options.migrate) { + await options.migrate(database); + store.persist(); + } + return store; + } + + async stopOwner(ownerId: string): Promise { + const backends = this.backends.filter((backend) => backend.ownerId === ownerId); + this.backends = this.backends.filter((backend) => backend.ownerId !== ownerId); + await Promise.all(backends.map((backend) => closeServer(backend.server))); + + const sqliteStores = this.sqliteStores.filter((store) => store.ownerId === ownerId); + this.sqliteStores = this.sqliteStores.filter((store) => store.ownerId !== ownerId); + for (const store of sqliteStores) { + try { + store.close(); + } catch (error) { + console.warn(`[backend:${ownerId}] SQLite store close failed: ${formatError(error)}`); + } + } + } + + async stopAll(): Promise { + const ownerIds = new Set([ + ...this.backends.map((backend) => backend.ownerId), + ...this.sqliteStores.map((store) => store.ownerId) + ]); + await Promise.all([...ownerIds].map((ownerId) => this.stopOwner(ownerId))); + } +} + +class SqliteStoreImpl implements SqliteStore { + constructor( + readonly ownerId: string, + readonly dbFile: string, + readonly database: SqlDatabase + ) {} + + exec(sql: string, params?: SqliteValue[]): ReturnType { + return this.database.exec(sql, params); + } + + persist(): void { + // better-sqlite3 writes mutations directly to the database/WAL. Keep this + // method for the plugin API without reintroducing whole-database rewrites. + } + + close(): void { + this.database.close(); + } +} + +export const backendService = new BackendService(); + +function openSqliteDatabaseWithRecovery(ownerId: string, dbFile: string): SqlDatabase { + try { + const database = openBetterSqliteDatabase(dbFile); + assertSqliteDatabaseIntegrity(database); + return database; + } catch (error) { + if (!isSqliteOpenCorruptionError(error)) { + throw error; + } + + const backupFile = nextCorruptSqliteBackupPath(dbFile); + if (existsSync(dbFile)) { + copyFileSync(dbFile, backupFile); + } + removeSqliteDatabaseFiles(dbFile); + console.warn( + `[backend:${ownerId}] SQLite store is corrupt and will be rebuilt: ${dbFile}. ` + + `Corrupt copy saved to ${backupFile}. Error: ${formatError(error)}` + ); + return openBetterSqliteDatabase(dbFile); + } +} + +function openBetterSqliteDatabase(dbFile: string): SqlDatabase { + const raw = createBetterSqliteDatabase(dbFile); + raw.pragma("journal_mode = WAL"); + raw.pragma("synchronous = NORMAL"); + raw.pragma("busy_timeout = 5000"); + return new SqliteCompatDatabase(raw); +} + +class SqliteCompatDatabase implements SqlDatabase { + constructor(private readonly raw: BetterSqliteDatabase) {} + + close(): void { + this.raw.close(); + } + + exec(sql: string, params: SqliteValue[] = []): SqliteExecResult[] { + const normalizedParams = normalizeSqliteParams(params); + if (normalizedParams.length === 0 && !sqlCanReturnRows(sql)) { + this.raw.exec(sql); + return []; + } + + const statement = this.raw.prepare(sql); + if (!statement.reader) { + statement.run(...normalizedParams); + return []; + } + + const columns = statement.columns().map((column) => column.name); + const rows = statement.all(...normalizedParams) as Array>; + return [{ + columns, + values: rows.map((row) => columns.map((column) => normalizeSqliteValue(row[column]))) + }]; + } + + prepare(sql: string): SqliteStatement { + return new SqliteCompatStatement(this.raw.prepare(sql)); + } + + run(sql: string, params: SqliteValue[] = []): SqlDatabase { + const normalizedParams = normalizeSqliteParams(params); + if (normalizedParams.length === 0) { + this.raw.exec(sql); + } else { + this.raw.prepare(sql).run(...normalizedParams); + } + return this; + } +} + +class SqliteCompatStatement implements SqliteStatement { + private boundParams: SqliteValue[] = []; + private currentRow: Record = {}; + private rowIndex = -1; + private rows?: Array>; + + constructor(private readonly statement: BetterSqliteStatement) {} + + bind(params: SqliteValue[] = []): void { + this.boundParams = normalizeSqliteParams(params); + this.currentRow = {}; + this.rowIndex = -1; + this.rows = undefined; + } + + free(): void { + this.currentRow = {}; + this.rows = undefined; + } + + getAsObject(): Record { + return { ...this.currentRow }; + } + + run(params?: SqliteValue[]): void { + const normalizedParams = params === undefined ? this.boundParams : normalizeSqliteParams(params); + this.statement.run(...normalizedParams); + } + + step(): boolean { + if (!this.statement.reader) { + return false; + } + this.rows ??= (this.statement.all(...this.boundParams) as Array>) + .map((row) => normalizeSqliteRow(row)); + this.rowIndex += 1; + const row = this.rows[this.rowIndex]; + if (!row) { + this.currentRow = {}; + return false; + } + this.currentRow = row; + return true; + } +} + +function sqlCanReturnRows(sql: string): boolean { + return /^(?:\s|--[^\n]*\n|\/\*[\s\S]*?\*\/)*(?:select|pragma|with|explain)\b/i.test(sql); +} + +function normalizeSqliteParams(params: SqliteValue[]): SqliteValue[] { + return params.map((value) => normalizeSqliteValue(value)); +} + +function normalizeSqliteRow(row: Record): Record { + return Object.fromEntries( + Object.entries(row).map(([key, value]) => [key, normalizeSqliteValue(value)]) + ); +} + +function normalizeSqliteValue(value: unknown): SqliteValue { + if (value === undefined || value === null) { + return null; + } + if (typeof value === "bigint" || typeof value === "number" || typeof value === "string") { + return value; + } + if (Buffer.isBuffer(value)) { + return value; + } + if (value instanceof Uint8Array) { + return Buffer.from(value); + } + return String(value); +} + +function assertSqliteDatabaseIntegrity(database: SqlDatabase): void { + const result = database.exec("PRAGMA integrity_check;"); + const status = result[0]?.values?.[0]?.[0]; + if (status !== "ok") { + throw new Error(`database disk image is malformed: integrity_check returned ${String(status || "no result")}`); + } +} + +function isSqliteOpenCorruptionError(error: unknown): boolean { + const message = formatError(error).toLowerCase(); + return message.includes("database disk image is malformed") || + message.includes("integrity_check") || + message.includes("file is not a database") || + message.includes("not an sqlite database"); +} + +function nextCorruptSqliteBackupPath(dbFile: string): string { + const timestamp = new Date().toISOString().replace(/[:.]/g, "-"); + const base = `${dbFile}.corrupt-${timestamp}`; + if (!existsSync(base)) { + return base; + } + for (let index = 1; index < 1000; index += 1) { + const candidate = `${base}-${index}`; + if (!existsSync(candidate)) { + return candidate; + } + } + return `${base}-${process.pid}`; +} + +function removeSqliteDatabaseFiles(dbFile: string): void { + rmSync(dbFile, { force: true }); + rmSync(`${dbFile}-wal`, { force: true }); + rmSync(`${dbFile}-shm`, { force: true }); +} + +function sendJson(response: ServerResponse, statusCode: number, body: unknown): void { + response.writeHead(statusCode, { "content-type": "application/json" }); + response.end(`${JSON.stringify(body)}\n`); +} + +function listen(server: Server, port: number, host: string): Promise { + return new Promise((resolve, reject) => { + server.once("error", reject); + server.listen(port, host, () => { + server.off("error", reject); + resolve(); + }); + }); +} + +function closeServer(server: Server): Promise { + return new Promise((resolve) => { + try { + server.close(() => resolve()); + } catch { + resolve(); + } + }); +} + +function formatHost(host: string): string { + return host.includes(":") && !host.startsWith("[") ? `[${host}]` : host; +} + +function sanitizeFileSegment(value: string): string { + return value.replace(/[^a-zA-Z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "backend"; +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/core/src/plugins/service.ts b/packages/core/src/plugins/service.ts new file mode 100644 index 0000000..05fc11c --- /dev/null +++ b/packages/core/src/plugins/service.ts @@ -0,0 +1,810 @@ +import { mkdirSync } from "node:fs"; +import { type IncomingMessage, type ServerResponse } from "node:http"; +import { createRequire } from "node:module"; +import os from "node:os"; +import path from "node:path"; +import { pathToFileURL } from "node:url"; +import type { + AppConfig, + GatewayPluginAppConfig, + GatewayPluginConfig, + GatewayPluginProxyRouteConfig, + GatewayProviderConfig, + InstalledBrowserApp, + ProviderAccountMeter, + ProviderAccountPluginConnectorConfig, + ProviderAccountSnapshot +} from "@ccr/core/contracts/app"; +import { backendService, type RegisteredHttpBackend, type SqliteStore, type SqliteStoreOptions } from "@ccr/core/plugins/backend-service"; +import { CONFIGDIR, DATADIR } from "@ccr/core/config/constants"; + +type MaybePromise = T | Promise; +type PluginLogger = { + debug: (...args: unknown[]) => void; + error: (...args: unknown[]) => void; + info: (...args: unknown[]) => void; + warn: (...args: unknown[]) => void; +}; + +export type GatewayPluginRouteHandler = ( + request: IncomingMessage, + response: ServerResponse, + context: GatewayPluginRouteContext +) => MaybePromise; + +export type GatewayPluginRouteRegistration = { + auth?: "gateway" | "none"; + handler: GatewayPluginRouteHandler; + id?: string; + method?: string; + methods?: string[]; + path?: string; + pathPrefix?: string; +}; + +export type GatewayPluginProxyRouteRegistration = Omit & { + upstream: string | URL | (() => string | URL); +}; + +export type GatewayPluginHttpBackendRegistration = { + handler: GatewayPluginRouteHandler; + host?: string; + id?: string; + port?: number; +}; + +export type GatewayPluginProviderAccountRequest = { + config: AppConfig; + connector: ProviderAccountPluginConnectorConfig; + now: string; + provider: GatewayProviderConfig; +}; + +export type GatewayPluginProviderAccountConnector = { + id: string; + resolve: (request: GatewayPluginProviderAccountRequest) => MaybePromise; +}; + +export type GatewayPluginRegistration = { + apps?: GatewayPluginAppConfig[]; + coreGateway?: { + config?: Record; + providerPlugins?: unknown[]; + virtualModelProfiles?: unknown[]; + }; + gatewayRoutes?: GatewayPluginRouteRegistration[]; + onStop?: () => MaybePromise; + providerAccountConnectors?: GatewayPluginProviderAccountConnector[]; + proxyRoutes?: GatewayPluginProxyRouteRegistration[]; + stop?: () => MaybePromise; + virtualModelProfiles?: unknown[]; +}; + +export type GatewayPluginContext = { + config: AppConfig; + logger: PluginLogger; + paths: { + configDir: string; + dataDir: string; + pluginDataDir: string; + }; + pluginConfig: unknown; + pluginId: string; + openSqliteStore: (options?: PluginSqliteStoreOptions) => Promise; + registerCoreGatewayProviderPlugin: (providerPlugin: unknown) => void; + registerCoreGatewayVirtualModelProfile: (profile: unknown) => void; + registerApp: (app: GatewayPluginAppConfig) => void; + registerGatewayRoute: (route: GatewayPluginRouteRegistration) => void; + registerHttpBackend: (backend: GatewayPluginHttpBackendRegistration) => Promise; + registerProviderAccountConnector: (connector: GatewayPluginProviderAccountConnector) => void; + registerProxyRoute: (route: GatewayPluginProxyRouteRegistration) => void; +}; + +export type GatewayPluginRouteContext = Pick< + GatewayPluginContext, + "config" | "logger" | "openSqliteStore" | "paths" | "pluginConfig" | "pluginId" +> & { + readBody: (request: IncomingMessage) => Promise; + readJson: (request: IncomingMessage) => Promise; + sendJson: (response: ServerResponse, statusCode: number, body: unknown) => void; +}; + +export type PluginSqliteStoreOptions = SqliteStoreOptions; +export type PluginSqliteStore = SqliteStore; + +export type GatewayPluginRouteMatch = RegisteredGatewayRoute; + +export type GatewayPluginProxyRouteMatch = { + headers?: Record; + id: string; + preserveHost: boolean; + pluginId: string; + targetUrl: URL; + upstreamUrl: URL; +}; + +type RegisteredGatewayRoute = Required> & { + auth: "gateway" | "none"; + methods?: string[]; + path?: string; + pathPrefix?: string; + pluginId: string; +}; + +type RegisteredProxyRoute = Omit & { + host: string; + id: string; + paths?: string[]; + pluginId: string; +}; + +type LoadedPlugin = { + activate?: (context: GatewayPluginContext) => MaybePromise; + setup?: (context: GatewayPluginContext) => MaybePromise; + stop?: () => MaybePromise; +}; + +type PluginServiceStateSnapshot = { + apps: InstalledBrowserApp[]; + coreGatewayConfig: Record; + coreProviderPlugins: unknown[]; + gatewayRoutes: RegisteredGatewayRoute[]; + providerAccountConnectors: Map; + proxyRoutes: RegisteredProxyRoute[]; + resourceOwnerIds: Set; + stopHooks: Array<() => MaybePromise>; + virtualModelProfiles: unknown[]; +}; + +const requireFromHere = createRequire(__filename); +const builtInMarketplacePluginModules = new Map([ + ["claude-design", path.join(__dirname, "..", "marketplace", "plugins", "claude-design-plugin.cjs")], + ["cursor-proxy", path.join(__dirname, "..", "marketplace", "plugins", "cursor-proxy-plugin.cjs")] +]); + +class GatewayPluginService { + private config?: AppConfig; + private coreGatewayConfig: Record = {}; + private coreProviderPlugins: unknown[] = []; + private apps: InstalledBrowserApp[] = []; + private gatewayRoutes: RegisteredGatewayRoute[] = []; + private proxyRoutes: RegisteredProxyRoute[] = []; + private providerAccountConnectors = new Map(); + private resourceOwnerIds = new Set(); + private running = false; + private stopHooks: Array<() => MaybePromise> = []; + private virtualModelProfiles: unknown[] = []; + + async start(config: AppConfig): Promise { + await this.stop(); + this.config = config; + this.running = true; + + for (const pluginConfig of config.plugins ?? []) { + if (pluginConfig.enabled === false) { + continue; + } + const snapshot = this.createStateSnapshot(); + this.resourceOwnerIds.add(pluginConfig.id); + try { + await this.loadConfiguredPlugin(pluginConfig); + } catch (error) { + await this.rollbackConfiguredPluginLoad(pluginConfig.id, snapshot); + console.warn(`[plugin:${pluginConfig.id}] Disabled after startup failure: ${formatError(error)}`); + } + } + } + + async stop(): Promise { + const stopHooks = [...this.stopHooks].reverse(); + this.stopHooks = []; + + for (const stopHook of stopHooks) { + try { + await stopHook(); + } catch (error) { + console.warn(`[plugin] Stop hook failed: ${formatError(error)}`); + } + } + + const resourceOwnerIds = [...this.resourceOwnerIds].reverse(); + this.resourceOwnerIds.clear(); + for (const ownerId of resourceOwnerIds) { + await backendService.stopOwner(ownerId); + } + + this.config = undefined; + this.apps = []; + this.coreGatewayConfig = {}; + this.coreProviderPlugins = []; + this.gatewayRoutes = []; + this.proxyRoutes = []; + this.providerAccountConnectors.clear(); + this.running = false; + this.virtualModelProfiles = []; + } + + hasGatewayRoutes(): boolean { + return this.gatewayRoutes.length > 0; + } + + getCoreGatewayConfig(): Record { + return { ...this.coreGatewayConfig }; + } + + getCoreProviderPlugins(): unknown[] { + return [...this.coreProviderPlugins]; + } + + getVirtualModelProfiles(): unknown[] { + return [...this.virtualModelProfiles]; + } + + getApps(): InstalledBrowserApp[] { + return this.apps.map((app) => ({ ...app })); + } + + getProviderAccountConnector(pluginId: string, connectorId: string): GatewayPluginProviderAccountConnector | undefined { + return this.providerAccountConnectors.get(providerAccountConnectorKey(pluginId, connectorId)); + } + + getProxyRouteHosts(): string[] { + return [...new Set(this.proxyRoutes.map((route) => route.host))]; + } + + getProxyRouteTargets(): Array<{ host: string; paths?: string[] }> { + return this.proxyRoutes.map((route) => ({ + host: route.host, + paths: route.paths ? [...route.paths] : undefined + })); + } + + matchGatewayRoute(method: string | undefined, requestPath: string): GatewayPluginRouteMatch | undefined { + const normalizedMethod = (method || "GET").toUpperCase(); + return this.gatewayRoutes.find((route) => { + if (route.methods?.length && !route.methods.includes(normalizedMethod)) { + return false; + } + if (route.path && requestPath === route.path) { + return true; + } + if (route.pathPrefix && matchesPathPrefix(route.pathPrefix, requestPath)) { + return true; + } + return false; + }); + } + + async handleGatewayRoute(route: GatewayPluginRouteMatch, request: IncomingMessage, response: ServerResponse): Promise { + if (!this.config) { + throw new Error("Gateway plugin service is not configured."); + } + await route.handler(request, response, this.createRouteContext(route.pluginId)); + } + + resolveProxyRoute(targetUrl: URL): GatewayPluginProxyRouteMatch | undefined { + let bestMatch: { matchedPathPrefix: string; route: RegisteredProxyRoute } | undefined; + for (const route of this.proxyRoutes) { + const matchedPathPrefix = matchProxyRoute(route, targetUrl); + if (matchedPathPrefix === undefined) { + continue; + } + + if (!bestMatch || matchedPathPrefix.length > bestMatch.matchedPathPrefix.length) { + bestMatch = { matchedPathPrefix, route }; + } + } + if (!bestMatch) { + return undefined; + } + + return { + headers: bestMatch.route.headers, + id: bestMatch.route.id, + pluginId: bestMatch.route.pluginId, + preserveHost: bestMatch.route.preserveHost === true, + targetUrl, + upstreamUrl: buildPluginProxyUpstreamUrl(bestMatch.route, targetUrl, bestMatch.matchedPathPrefix) + }; + } + + private async loadConfiguredPlugin(pluginConfig: GatewayPluginConfig): Promise { + this.registerConfiguredCoreGateway(pluginConfig); + this.registerConfiguredApps(pluginConfig); + for (const route of pluginConfig.proxy?.routes ?? []) { + this.registerProxyRoute(pluginConfig.id, route); + } + + const modulePath = pluginConfig.module || builtInMarketplacePluginModules.get(pluginConfig.id); + if (!modulePath) { + return; + } + + const loadedPlugin = await loadPluginModule(modulePath); + const plugin = normalizeLoadedPlugin(loadedPlugin); + const context = this.createPluginContext(pluginConfig); + const registration = plugin.setup + ? await plugin.setup(context) + : plugin.activate + ? await plugin.activate(context) + : undefined; + + if (registration) { + this.applyPluginRegistration(pluginConfig.id, registration); + } + if (plugin.stop) { + this.stopHooks.push(() => plugin.stop?.()); + } + } + + private applyPluginRegistration(pluginId: string, registration: GatewayPluginRegistration): void { + for (const app of registration.apps ?? []) { + this.registerApp(pluginId, app); + } + for (const route of registration.gatewayRoutes ?? []) { + this.registerGatewayRoute(pluginId, route); + } + for (const route of registration.proxyRoutes ?? []) { + this.registerProxyRoute(pluginId, route); + } + for (const connector of registration.providerAccountConnectors ?? []) { + this.registerProviderAccountConnector(pluginId, connector); + } + for (const providerPlugin of registration.coreGateway?.providerPlugins ?? []) { + this.coreProviderPlugins.push(providerPlugin); + } + for (const profile of [ + ...(registration.coreGateway?.virtualModelProfiles ?? []), + ...(registration.virtualModelProfiles ?? []) + ]) { + this.virtualModelProfiles.push(profile); + } + if (registration.coreGateway?.config) { + this.coreGatewayConfig = { + ...this.coreGatewayConfig, + ...registration.coreGateway.config + }; + } + if (registration.stop) { + this.stopHooks.push(registration.stop); + } + if (registration.onStop) { + this.stopHooks.push(registration.onStop); + } + } + + private registerConfiguredApps(pluginConfig: GatewayPluginConfig): void { + for (const app of pluginConfig.apps ?? []) { + this.registerApp(pluginConfig.id, app); + } + } + + private registerApp(pluginId: string, app: GatewayPluginAppConfig): void { + const normalized = normalizePluginApp(pluginId, app, this.apps.length + 1); + if (!normalized) { + return; + } + this.apps = this.apps.filter((item) => !(item.pluginId === pluginId && item.id === normalized.id)); + this.apps.push(normalized); + } + + private registerConfiguredCoreGateway(pluginConfig: GatewayPluginConfig): void { + for (const providerPlugin of pluginConfig.coreGateway?.providerPlugins ?? []) { + this.coreProviderPlugins.push(providerPlugin); + } + for (const profile of pluginConfig.coreGateway?.virtualModelProfiles ?? []) { + this.virtualModelProfiles.push(profile); + } + if (pluginConfig.coreGateway?.config) { + this.coreGatewayConfig = { + ...this.coreGatewayConfig, + ...pluginConfig.coreGateway.config + }; + } + } + + private registerGatewayRoute(pluginId: string, route: GatewayPluginRouteRegistration): void { + if (!route.path && !route.pathPrefix) { + throw new Error(`Plugin ${pluginId} registered a gateway route without path or pathPrefix.`); + } + + this.gatewayRoutes.push({ + auth: route.auth ?? "gateway", + handler: route.handler, + id: route.id || `${pluginId}:gateway:${this.gatewayRoutes.length + 1}`, + methods: normalizeMethods(route), + path: normalizeRoutePath(route.path), + pathPrefix: normalizeRoutePath(route.pathPrefix), + pluginId + }); + } + + private registerProxyRoute(pluginId: string, route: GatewayPluginProxyRouteRegistration): void { + const host = route.host.trim().toLowerCase(); + if (!host) { + throw new Error(`Plugin ${pluginId} registered a proxy route without host.`); + } + + this.proxyRoutes.push({ + ...route, + host, + id: route.id || `${pluginId}:proxy:${this.proxyRoutes.length + 1}`, + paths: route.paths?.map(normalizeRoutePath).filter((path): path is string => Boolean(path)), + pluginId + }); + } + + private createPluginContext(pluginConfig: GatewayPluginConfig): GatewayPluginContext { + const pluginDataDir = path.join(DATADIR, "plugins", sanitizeFileSegment(pluginConfig.id)); + mkdirSync(pluginDataDir, { recursive: true }); + const logger = createPluginLogger(pluginConfig.id); + + return { + config: this.config ?? ({} as AppConfig), + logger, + paths: { + configDir: CONFIGDIR, + dataDir: DATADIR, + pluginDataDir + }, + pluginConfig: pluginConfig.config, + pluginId: pluginConfig.id, + openSqliteStore: (options) => this.openSqliteStore(pluginConfig.id, pluginDataDir, options), + registerCoreGatewayProviderPlugin: (providerPlugin) => { + this.coreProviderPlugins.push(providerPlugin); + }, + registerCoreGatewayVirtualModelProfile: (profile) => { + this.virtualModelProfiles.push(profile); + }, + registerApp: (app) => this.registerApp(pluginConfig.id, app), + registerGatewayRoute: (route) => this.registerGatewayRoute(pluginConfig.id, route), + registerHttpBackend: (backend) => this.registerHttpBackend(pluginConfig.id, pluginDataDir, logger, backend), + registerProviderAccountConnector: (connector) => this.registerProviderAccountConnector(pluginConfig.id, connector), + registerProxyRoute: (route) => this.registerProxyRoute(pluginConfig.id, route) + }; + } + + private registerProviderAccountConnector(pluginId: string, connector: GatewayPluginProviderAccountConnector): void { + const id = connector.id.trim(); + if (!id || typeof connector.resolve !== "function") { + throw new Error(`Plugin ${pluginId} registered an invalid provider account connector.`); + } + this.providerAccountConnectors.set(providerAccountConnectorKey(pluginId, id), { + ...connector, + id + }); + } + + private createRouteContext(pluginId: string): GatewayPluginRouteContext { + const pluginDataDir = path.join(DATADIR, "plugins", sanitizeFileSegment(pluginId)); + const logger = createPluginLogger(pluginId); + return { + config: this.config ?? ({} as AppConfig), + logger, + paths: { + configDir: CONFIGDIR, + dataDir: DATADIR, + pluginDataDir + }, + pluginConfig: this.config?.plugins.find((plugin) => plugin.id === pluginId)?.config, + pluginId, + openSqliteStore: (options) => this.openSqliteStore(pluginId, pluginDataDir, options), + readBody, + readJson, + sendJson + }; + } + + private async registerHttpBackend( + pluginId: string, + pluginDataDir: string, + logger: PluginLogger, + backend: GatewayPluginHttpBackendRegistration + ): Promise { + return backendService.registerHttpBackend(pluginId, { + host: backend.host, + id: backend.id, + port: backend.port, + handler: (request, response) => + backend.handler(request, response, { + config: this.config ?? ({} as AppConfig), + logger, + paths: { + configDir: CONFIGDIR, + dataDir: DATADIR, + pluginDataDir + }, + pluginConfig: this.config?.plugins.find((plugin) => plugin.id === pluginId)?.config, + pluginId, + openSqliteStore: (options) => this.openSqliteStore(pluginId, pluginDataDir, options), + readBody, + readJson, + sendJson + }) + }); + } + + private async openSqliteStore( + pluginId: string, + pluginDataDir: string, + options: PluginSqliteStoreOptions = {} + ): Promise { + return backendService.openSqliteStore(pluginId, pluginDataDir, options); + } + + private createStateSnapshot(): PluginServiceStateSnapshot { + return { + apps: [...this.apps], + coreGatewayConfig: { ...this.coreGatewayConfig }, + coreProviderPlugins: [...this.coreProviderPlugins], + gatewayRoutes: [...this.gatewayRoutes], + providerAccountConnectors: new Map(this.providerAccountConnectors), + proxyRoutes: [...this.proxyRoutes], + resourceOwnerIds: new Set(this.resourceOwnerIds), + stopHooks: [...this.stopHooks], + virtualModelProfiles: [...this.virtualModelProfiles] + }; + } + + private async rollbackConfiguredPluginLoad(pluginId: string, snapshot: PluginServiceStateSnapshot): Promise { + const newStopHooks = this.stopHooks.slice(snapshot.stopHooks.length).reverse(); + this.apps = snapshot.apps; + this.coreGatewayConfig = snapshot.coreGatewayConfig; + this.coreProviderPlugins = snapshot.coreProviderPlugins; + this.gatewayRoutes = snapshot.gatewayRoutes; + this.providerAccountConnectors = snapshot.providerAccountConnectors; + this.proxyRoutes = snapshot.proxyRoutes; + this.resourceOwnerIds = snapshot.resourceOwnerIds; + this.stopHooks = snapshot.stopHooks; + this.virtualModelProfiles = snapshot.virtualModelProfiles; + + for (const stopHook of newStopHooks) { + try { + await stopHook(); + } catch (error) { + console.warn(`[plugin:${pluginId}] Rollback stop hook failed: ${formatError(error)}`); + } + } + + try { + await backendService.stopOwner(pluginId); + } catch (error) { + console.warn(`[plugin:${pluginId}] Rollback resource cleanup failed: ${formatError(error)}`); + } + } +} + +export const pluginService = new GatewayPluginService(); + +async function loadPluginModule(modulePath: string): Promise { + const resolved = resolvePluginModule(modulePath); + return import(pathToFileURL(resolved).href); +} + +function resolvePluginModule(modulePath: string): string { + const resolved = requireFromHere.resolve(resolveLocalModulePath(modulePath, "Plugin module")); + assertJavaScriptModulePath(resolved, "Plugin module"); + return resolved; +} + +function resolveLocalModulePath(value: string, label: string): string { + const trimmed = value.trim(); + if (!trimmed) { + throw new Error(`${label} path is required.`); + } + + const expanded = expandHome(trimmed); + if (path.isAbsolute(expanded)) { + return expanded; + } + if (isProtocolSpecifier(expanded)) { + throw new Error(`${label} must be a local JavaScript file path, not a URL or protocol specifier.`); + } + if (!expanded.startsWith(".")) { + throw new Error(`${label} must be an explicit local JavaScript path. Package specifiers are not loaded from configuration.`); + } + + const resolved = path.resolve(CONFIGDIR, expanded); + if (!isPathInside(resolved, CONFIGDIR)) { + throw new Error(`${label} relative paths must stay inside the CCR config directory.`); + } + return resolved; +} + +function assertJavaScriptModulePath(resolved: string, label: string): void { + const extension = path.extname(resolved).toLowerCase(); + if (![".cjs", ".js", ".mjs"].includes(extension)) { + throw new Error(`${label} must resolve to a JavaScript module file.`); + } +} + +function isProtocolSpecifier(value: string): boolean { + return /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(value); +} + +function isPathInside(file: string, root: string): boolean { + const relative = path.relative(root, file); + return relative === "" || (Boolean(relative) && !relative.startsWith("..") && !path.isAbsolute(relative)); +} + +function normalizeLoadedPlugin(moduleValue: unknown): LoadedPlugin { + const record = isRecord(moduleValue) ? moduleValue : {}; + const candidate = record.default ?? record.plugin ?? moduleValue; + if (typeof candidate === "function") { + return { setup: candidate as LoadedPlugin["setup"] }; + } + if (isRecord(candidate)) { + return candidate as LoadedPlugin; + } + throw new Error("Plugin module must export a function, default plugin, or plugin object."); +} + +function matchProxyRoute(route: RegisteredProxyRoute, targetUrl: URL): string | undefined { + if (!matchesHost(route.host, targetUrl.hostname)) { + return undefined; + } + if (!route.paths?.length) { + return ""; + } + let matchedPathPrefix: string | undefined; + for (const pathPrefix of route.paths) { + const normalizedPathPrefix = normalizeRoutePath(pathPrefix) ?? "/"; + if (!matchesPathPrefix(normalizedPathPrefix, targetUrl.pathname)) { + continue; + } + if (!matchedPathPrefix || normalizedPathPrefix.length > matchedPathPrefix.length) { + matchedPathPrefix = normalizedPathPrefix; + } + } + return matchedPathPrefix; +} + +function buildPluginProxyUpstreamUrl(route: RegisteredProxyRoute, targetUrl: URL, matchedPathPrefix: string): URL { + const upstreamValue = typeof route.upstream === "function" ? route.upstream() : route.upstream; + const upstreamUrl = new URL(upstreamValue.toString()); + const basePath = upstreamUrl.pathname === "/" ? "" : upstreamUrl.pathname.replace(/\/+$/, ""); + let forwardedPath = targetUrl.pathname; + const stripPrefix = resolveStripPathPrefix(route.stripPathPrefix, matchedPathPrefix); + + if (stripPrefix && matchesPathPrefix(stripPrefix, forwardedPath)) { + forwardedPath = forwardedPath.slice(stripPrefix.length) || "/"; + if (!forwardedPath.startsWith("/")) { + forwardedPath = `/${forwardedPath}`; + } + } + if (route.rewritePathPrefix !== undefined) { + const rewritePrefix = normalizeRoutePath(route.rewritePathPrefix) ?? "/"; + const suffix = matchedPathPrefix && matchesPathPrefix(matchedPathPrefix, targetUrl.pathname) + ? targetUrl.pathname.slice(matchedPathPrefix.length) + : targetUrl.pathname; + forwardedPath = joinUrlPaths(rewritePrefix, suffix || "/"); + } + + upstreamUrl.pathname = joinUrlPaths(basePath, forwardedPath); + upstreamUrl.search = targetUrl.search; + return upstreamUrl; +} + +function resolveStripPathPrefix(value: boolean | string | undefined, matchedPathPrefix: string): string | undefined { + if (value === true) { + return matchedPathPrefix || undefined; + } + if (typeof value === "string") { + return normalizeRoutePath(value); + } + return undefined; +} + +function normalizePluginApp(pluginId: string, app: GatewayPluginAppConfig, index: number): InstalledBrowserApp | undefined { + const name = app.name?.trim(); + const url = app.url?.trim(); + if (!name || !url) { + return undefined; + } + + return { + ...(app.description?.trim() ? { description: app.description.trim() } : {}), + ...(app.icon?.trim() ? { icon: app.icon.trim() } : {}), + id: app.id?.trim() || sanitizeFileSegment(`${name}-${url}`) || `app-${index}`, + name, + pluginId, + url + }; +} + +function normalizeMethods(route: GatewayPluginRouteRegistration): string[] | undefined { + const methods = [...(route.methods ?? []), ...(route.method ? [route.method] : [])] + .map((method) => method.trim().toUpperCase()) + .filter(Boolean); + return methods.length ? [...new Set(methods)] : undefined; +} + +function normalizeRoutePath(value: string | undefined): string | undefined { + if (typeof value !== "string" || !value.trim()) { + return undefined; + } + const trimmed = value.trim(); + return trimmed.startsWith("/") ? trimmed : `/${trimmed}`; +} + +function matchesHost(pattern: string, hostname: string): boolean { + const normalizedPattern = pattern.toLowerCase(); + const normalizedHost = hostname.toLowerCase(); + if (normalizedPattern === normalizedHost) { + return true; + } + if (normalizedPattern.startsWith("*.")) { + const suffix = normalizedPattern.slice(1); + return normalizedHost.endsWith(suffix) && normalizedHost !== suffix.slice(1); + } + if (normalizedPattern.startsWith(".")) { + return normalizedHost.endsWith(normalizedPattern); + } + return false; +} + +function matchesPathPrefix(prefix: string, requestPath: string): boolean { + const normalizedPrefix = normalizeRoutePath(prefix) ?? "/"; + const normalizedPath = normalizeRoutePath(requestPath) ?? "/"; + return normalizedPath === normalizedPrefix || normalizedPath.startsWith(`${normalizedPrefix.replace(/\/+$/, "")}/`); +} + +function joinUrlPaths(prefix: string, suffix: string): string { + const normalizedPrefix = prefix === "/" ? "" : prefix.replace(/\/+$/, ""); + const normalizedSuffix = suffix.startsWith("/") ? suffix : `/${suffix}`; + return `${normalizedPrefix}${normalizedSuffix}` || "/"; +} + +function createPluginLogger(pluginId: string): PluginLogger { + const prefix = `[plugin:${pluginId}]`; + return { + debug: (...args) => console.debug(prefix, ...args), + error: (...args) => console.error(prefix, ...args), + info: (...args) => console.info(prefix, ...args), + warn: (...args) => console.warn(prefix, ...args) + }; +} + +function sendJson(response: ServerResponse, statusCode: number, body: unknown): void { + response.writeHead(statusCode, { "content-type": "application/json" }); + response.end(`${JSON.stringify(body)}\n`); +} + +function readJson(request: IncomingMessage): Promise { + return readBody(request).then((body) => JSON.parse(body.toString("utf8") || "{}") as unknown); +} + +function readBody(request: IncomingMessage): Promise { + return new Promise((resolve, reject) => { + const chunks: Buffer[] = []; + request.on("data", (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))); + request.once("end", () => resolve(Buffer.concat(chunks))); + request.once("error", reject); + }); +} + +function expandHome(value: string): string { + if (value === "~") { + return os.homedir(); + } + if (value.startsWith("~/")) { + return path.join(os.homedir(), value.slice(2)); + } + return value; +} + +function sanitizeFileSegment(value: string): string { + return value.replace(/[^a-zA-Z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "plugin"; +} + +function providerAccountConnectorKey(pluginId: string, connectorId: string): string { + return `${pluginId.trim()}:${connectorId.trim()}`; +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/core/src/profiles/launch-core.ts b/packages/core/src/profiles/launch-core.ts new file mode 100644 index 0000000..ab187fd --- /dev/null +++ b/packages/core/src/profiles/launch-core.ts @@ -0,0 +1,314 @@ +import path from "node:path"; +import type { AppConfig, ProfileConfig, ProfileOpenSurface } from "@ccr/core/contracts/app"; +import { claudeCodeUtcTimezoneEnvOverride } from "@ccr/core/agents/claude-code/environment"; +import { resolveZcodeConfigFile } from "@ccr/core/agents/zcode/profile-config"; + +export type ProfileLaunchPlan = { + args: string[]; + command: string; + env: Record; + profile: ProfileConfig; + surface: ProfileOpenSurface; +}; + +export type ProfileLaunchSpawnCommand = { + args: string[]; + command: string; + windowsVerbatimArguments?: boolean; +}; + +export function findProfileForOpen(config: Pick, profileRef: string): ProfileConfig { + const needle = profileRef.trim(); + if (!needle) { + throw new Error("Profile name is required."); + } + + const profiles = config.profile.profiles.filter((profile) => profile.enabled); + const exactId = profiles.find((profile) => profile.id === needle); + if (exactId) { + return exactId; + } + + const normalizedNeedle = normalizeLookupValue(needle); + const matches = profiles.filter((profile) => + normalizeLookupValue(profile.name) === normalizedNeedle || + normalizeLookupValue(profile.id) === normalizedNeedle || + sanitizePathSegment(profile.name) === normalizedNeedle || + sanitizePathSegment(profile.id) === normalizedNeedle + ); + if (matches.length === 1) { + return matches[0]; + } + if (matches.length > 1) { + throw new Error(`Profile "${needle}" is ambiguous. Use the profile ID instead.`); + } + throw new Error(`Profile "${needle}" was not found or is disabled.`); +} + +export function profileOpenSurfaces(profile: ProfileConfig): ProfileOpenSurface[] { + if (profile.agent === "zcode") { + return ["app"]; + } + const surface = normalizeProfileSurface(profile.surface); + if (surface === "cli") { + return ["cli"]; + } + if (surface === "app") { + return ["app"]; + } + return ["cli", "app"]; +} + +export function resolveProfileOpenSurface(profile: ProfileConfig, surface?: ProfileOpenSurface): ProfileOpenSurface { + const surfaces = profileOpenSurfaces(profile); + if (surface) { + if (!surfaces.includes(surface)) { + throw new Error(`${profile.name || profile.id} does not support ${surface.toUpperCase()} opening.`); + } + return surface; + } + return surfaces[0]; +} + +export function defaultProfileOpenSurface(profile: Pick): ProfileOpenSurface { + return profile.agent === "zcode" ? "app" : "cli"; +} + +export function profileOpenCommand( + profile: ProfileConfig, + surface: ProfileOpenSurface = defaultProfileOpenSurface(profile), + command = "ccr", + profileRef = profile.name?.trim() || profile.id +): string { + const quote = process.platform === "win32" ? windowsCommandQuote : shellQuote; + const parts = [quote(command), quote(profileRef)]; + if (surface === "app") { + parts.push(surface); + } + return parts.join(" "); +} + +export function buildProfileLaunchPlan( + configDir: string, + profile: ProfileConfig, + surface: ProfileOpenSurface, + extraArgs: string[] = [] +): ProfileLaunchPlan { + const resolvedSurface = resolveProfileOpenSurface(profile, surface); + if (isCodexCompatibleAgent(profile.agent)) { + return buildCodexLaunchPlan(configDir, profile, resolvedSurface, extraArgs); + } + return buildClaudeCodeLaunchPlan(configDir, profile, resolvedSurface, extraArgs); +} + +export function profileLaunchSpawnCommand(plan: Pick): ProfileLaunchSpawnCommand { + if (!isWindowsCommandScript(plan.command)) { + return { + args: plan.args, + command: plan.command + }; + } + let cmdLine = `"${plan.command}"`; + if (plan.args && plan.args.length > 0) { + cmdLine += " " + plan.args.join(" "); + } + return { + args: ["/d", "/v:off", "/c", cmdLine], + command: process.env.ComSpec || process.env.COMSPEC || "cmd.exe", + windowsVerbatimArguments: true + }; +} + +export function ccrManagedProfileDir(configDir: string, profile: ProfileConfig): string { + const slug = sanitizePathSegment(profile.id || profile.name || profile.agent); + const baseDir = path.join(configDir, "profiles", slug || "profile"); + return profile.scope === "custom" ? path.join(baseDir, "custom") : baseDir; +} + +export function resolveClaudeCodeSettingsFile(configDir: string, profile: ProfileConfig): string { + if (isGeneratedProfileScope(profile.scope)) { + return path.join(ccrManagedProfileDir(configDir, profile), "claude", "settings.json"); + } + return resolveUserPath(profile.settingsFile || "~/.claude/settings.json"); +} + +export function resolveCodexConfigFile(configDir: string, profile: ProfileConfig): string { + if (profile.agent === "zcode") { + return resolveZcodeConfigFile(profile); + } + if (isGeneratedProfileScope(profile.scope)) { + return path.join(ccrManagedProfileDir(configDir, profile), codexConfigSubdir(profile.agent), "config.toml"); + } + const codexHome = profile.codexHome?.trim(); + if (codexHome) { + return path.join(resolveUserPath(codexHome), "config.toml"); + } + return resolveUserPath(profile.configFile || defaultCodexConfigFile(profile.agent)); +} + +function buildCodexLaunchPlan( + configDir: string, + profile: ProfileConfig, + surface: ProfileOpenSurface, + extraArgs: string[] +): ProfileLaunchPlan { + const providerId = sanitizeCodexProviderId(profile.providerId || "") || "claude-code-router"; + const launcher = path.join(configDir, "bin", codexMiddlewareFilename(profile, providerId)); + return { + args: surface === "app" && extraArgs.length === 0 ? ["app"] : extraArgs, + command: launcher, + env: { + CCR_PROFILE_SURFACE: surface + }, + profile, + surface + }; +} + +function buildClaudeCodeLaunchPlan( + configDir: string, + profile: ProfileConfig, + surface: ProfileOpenSurface, + extraArgs: string[] +): ProfileLaunchPlan { + if (surface === "app") { + throw new Error("Claude App opening is available from the CCR desktop app."); + } + const settingsFile = resolveClaudeCodeSettingsFile(configDir, profile); + const launcher = path.join(configDir, "bin", claudeCodeWrapperFilename(profile)); + return { + args: extraArgs, + command: launcher, + env: { + CLAUDE_CONFIG_DIR: path.dirname(settingsFile), + CCR_PROFILE_SURFACE: surface, + ...claudeCodeModelEnv(profile), + ...claudeCodeUtcTimezoneEnvOverride() + }, + profile, + surface + }; +} + +function isCodexCompatibleAgent(agent: ProfileConfig["agent"]): boolean { + return agent === "codex" || agent === "zcode"; +} + +function defaultCodexConfigFile(agent: ProfileConfig["agent"]): string { + return agent === "zcode" ? "~/.zcode/cli/config.json" : "~/.codex/config.toml"; +} + +function codexConfigSubdir(agent: ProfileConfig["agent"]): string { + return agent === "zcode" ? "zcode" : "codex"; +} + +function claudeCodeWrapperFilename(profile: ProfileConfig): string { + const slug = sanitizePathSegment(profile.id || profile.name || profile.agent) || "claude-code"; + return process.platform === "win32" + ? `ccr-claude-code-wrapper-${slug}.cmd` + : `ccr-claude-code-wrapper-${slug}`; +} + +function codexMiddlewareFilename(profile: ProfileConfig, providerId: string): string { + const slug = sanitizeCodexProviderId(profile.id || profile.name || providerId) || "codex"; + return process.platform === "win32" + ? `ccr-codex-cli-stdio-${slug}.cmd` + : `ccr-codex-cli-stdio-${slug}`; +} + +function normalizeProfileSurface(value: ProfileConfig["surface"]): "auto" | "cli" | "app" { + return value === "cli" || value === "app" ? value : "auto"; +} + +function claudeCodeModelEnv(profile: ProfileConfig): Record { + const env: Record = {}; + const model = normalizeClientModel(profile.model); + if (model) { + env.ANTHROPIC_MODEL = model; + env.CCR_CLAUDE_CODE_MODEL = model; + env.CODEXL_CLAUDE_CODE_MODEL = model; + } + const smallFastModel = normalizeClientModel(profile.smallFastModel); + if (smallFastModel) { + env.ANTHROPIC_SMALL_FAST_MODEL = smallFastModel; + } + return env; +} + +function normalizeClientModel(value: string | undefined): string { + const trimmed = value?.trim() || ""; + if (!trimmed) { + return ""; + } + const commaIndex = trimmed.indexOf(","); + if (commaIndex > 0 && commaIndex < trimmed.length - 1) { + const provider = trimmed.slice(0, commaIndex).trim(); + const model = trimmed.slice(commaIndex + 1).trim(); + return provider && model ? `${provider}/${model}` : ""; + } + return trimmed; +} + +function isGeneratedProfileScope(value: ProfileConfig["scope"]): boolean { + return value === "ccr" || value === "custom"; +} + +function resolveUserPath(value: string): string { + const trimmed = value.trim(); + if (trimmed === "~") { + return homeDir(); + } + if (trimmed.startsWith("~/") || trimmed.startsWith("~\\")) { + return path.join(homeDir(), trimmed.slice(2)); + } + return path.resolve(trimmed || "."); +} + +function homeDir(): string { + return process.env.HOME || process.env.USERPROFILE || "."; +} + +function sanitizeCodexProviderId(value: string): string { + return value.trim().replace(/[^a-zA-Z0-9_.-]+/g, "-").replace(/^-+|-+$/g, ""); +} + +function sanitizePathSegment(value: string): string { + return value.trim().toLowerCase().replace(/[^a-z0-9_.-]+/g, "-").replace(/^-+|-+$/g, ""); +} + +function normalizeLookupValue(value: string): string { + return value.trim().toLowerCase(); +} + +function shellQuote(value: string): string { + return /^[A-Za-z0-9_./:-]+$/.test(value) + ? value + : `'${value.replace(/'/g, "'\\''")}'`; +} + +function windowsCommandQuote(value: string): string { + const normalized = value.replace(/\r?\n/g, " "); + return /^[A-Za-z0-9_.:/\\-]+$/.test(normalized) + ? normalized + : `"${normalized.replace(/"/g, '\\"')}"`; +} + +function isWindowsCommandScript(command: string): boolean { + return process.platform === "win32" && /\.(?:bat|cmd)$/i.test(path.basename(command)); +} + +function windowsCommandScriptInvocation(command: string, args: string[]): string { + return [ + "call", + windowsCommandInvocationArg(command), + ...args.map(windowsCommandInvocationArg) + ].join(" "); +} + +function windowsCommandInvocationArg(value: string): string { + const normalized = value.replace(/\r?\n/g, " "); + if (!normalized) { + return "\"\""; + } + return `"${normalized.replace(/[\^"%&|<>()]/g, "^$&")}"`; +} diff --git a/packages/core/src/profiles/launch-service.ts b/packages/core/src/profiles/launch-service.ts new file mode 100644 index 0000000..55e8153 --- /dev/null +++ b/packages/core/src/profiles/launch-service.ts @@ -0,0 +1,1562 @@ +import { spawn, spawnSync, type ChildProcess } from "node:child_process"; +import { chmodSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import { assertAvailableGatewayModels, type AppConfig, type ProfileOpenCommandResult, type ProfileOpenRequest, type ProfileOpenResult, type ProfileRuntimeEntry, type ProfileRuntimeStatus, type ProfileStopResult } from "@ccr/core/contracts/app"; +import { botGatewayProfileEnv } from "@ccr/core/agents/bot-gateway/env"; +import { applyClaudeAppGatewayConfig, readClaudeAppGatewayApiKeyCandidates } from "@ccr/core/agents/claude-app/gateway-service"; +import { launchClaudeAppProfile, resolveClaudeAppProfileUserDataDir } from "@ccr/core/agents/claude-app/launch"; +import { claudeCodeUtcTimezoneEnvOverride } from "@ccr/core/agents/claude-code/environment"; +import { codexDesktopAppName, launchCodexAppProfile, launchZcodeAppProfile, refreshCodexCompatibleAppProfileFiles } from "@ccr/core/agents/codex/app-launch"; +import { codexCliMiddlewareRuntimeScript } from "@ccr/core/agents/codex/cli-middleware-runtime"; +import { CONFIGDIR } from "@ccr/core/config/constants"; +import { gatewayService } from "@ccr/core/gateway/service"; +import { TOOL_HUB_MCP_RUNTIME_FILE_NAME, bundledToolHubMcpEntryPathCandidates } from "@ccr/core/mcp/toolhub-config"; +import { buildProfileLaunchPlan, findProfileForOpen, profileLaunchSpawnCommand, profileOpenCommand, profileOpenSurfaces, resolveClaudeCodeSettingsFile, resolveProfileOpenSurface } from "@ccr/core/profiles/launch-core"; +import { applyProfileConfig, cleanupGeneratedBinBackups } from "@ccr/core/profiles/service"; +import { windowsEnvironmentChangedPowerShellLines, windowsSystemCommand } from "@ccr/core/platform/windows-system"; + +const ccrPathBlockStart = "# >>> Claude Code Router CLI >>>"; +const ccrPathBlockEnd = "# <<< Claude Code Router CLI <<<"; +export const desktopCliCommandName = "ccr-app"; +const desktopCliRuntimeFileName = "ccr-cli.js"; +const desktopCliCommandNameEnv = "CCR_CLI_COMMAND_NAME"; +let claudeAppBotWorker: ChildProcess | undefined; +let claudeAppBotWorkerProfileId: string | undefined; + +type ProfileOpenCommandOptions = { + commandName?: string; + ensureLauncher?: boolean; +}; + +export type CcrCliLauncherPreparation = { + binDir: string; + persistentPathRequired: boolean; +}; + +type EnsureCcrCliLauncherOptions = { + persistPath?: boolean; +}; + +type ProfileAppLaunchResult = { + child: ChildProcess; + claudeDesignProxy?: boolean; + command: string; + pidIsLauncher?: boolean; + pid?: number; + userDataDir: string; +}; + +type RunningProfileApp = ProfileRuntimeEntry & { + child: ChildProcess; + claudeDesignProxy?: boolean; + command: string; + pidIsLauncher?: boolean; + spawnError?: string; + stopRequested?: boolean; + userDataDir: string; +}; + +process.once("exit", () => stopClaudeAppBotWorker()); + +export async function getProfileOpenCommand(config: AppConfig, request: ProfileOpenRequest, options: ProfileOpenCommandOptions = {}): Promise { + assertAvailableGatewayModels(config); + await applyProfileConfig(config); + const profile = findProfileForOpen(config, request.profileId); + const surface = resolveProfileOpenSurface(profile, request.surface); + if (options.ensureLauncher) { + ensureCcrCliLauncher(config); + } + return { + command: profileOpenCommand(profile, surface, options.commandName ?? "ccr", commandProfileRef(config, profile)), + profileId: profile.id, + profileName: profile.name, + surface + }; +} + +export async function openProfileFromCcr(config: AppConfig, request: ProfileOpenRequest): Promise { + assertAvailableGatewayModels(config); + await applyProfileConfig(config); + const profile = findProfileForOpen(config, request.profileId); + const surface = resolveProfileOpenSurface(profile, request.surface); + if (profile.agent === "claude-code" && surface === "app") { + return openClaudeAppProfile(config, profile); + } + if ((profile.agent === "codex" || profile.agent === "zcode") && surface === "app") { + return await openCodexAppProfile(config, profile); + } + const plan = buildProfileLaunchPlan(CONFIGDIR, profile, surface); + if (path.isAbsolute(plan.command) && !existsSync(plan.command)) { + throw new Error(`Profile launcher was not found: ${plan.command}. Re-save the profile and try again.`); + } + + const launch = profileLaunchSpawnCommand(plan); + const child = spawn(launch.command, launch.args, { + detached: true, + env: { + ...process.env, + ...plan.env, + ...botGatewayProfileEnv(config, profile, surface), + ...(profile.agent === "claude-code" ? claudeCodeUtcTimezoneEnvOverride() : {}) + }, + stdio: "ignore" + }); + const spawnError = await waitForImmediateSpawnError(child, 500); + if (spawnError) { + throw new Error(`Failed to open ${profile.name || profile.id}: ${spawnError}`); + } + child.unref(); + + return { + message: `Opened ${profile.name || profile.id}.`, + profileId: profile.id, + profileName: profile.name, + surface + }; +} + +async function openCodexAppProfile(config: AppConfig, profile: ReturnType): Promise { + const appName = profile.agent === "zcode" ? "ZCode App" : codexDesktopAppName; + const profileGatewayConfig = await ensureProfileGateway(config, profile, appName); + const existing = runningProfileApp(profile.id, "app"); + if (existing) { + refreshCodexCompatibleAppProfileFiles(CONFIGDIR, profile, profileGatewayConfig); + activateProfileAppWindow(existing); + return { + message: `${appName} is already running with ${profile.name || profile.id}.`, + profileId: profile.id, + profileName: profile.name, + surface: "app" + }; + } + const launch = profile.agent === "zcode" + ? launchZcodeAppProfile(CONFIGDIR, profile, profileGatewayConfig) + : launchCodexAppProfile(CONFIGDIR, profile, profileGatewayConfig); + const entry = registerProfileApp(profile, "app", launch); + const started = await waitForProfileAppStart(entry, 12000); + if (!started) { + cleanupProfileAppEntry(profileRuntimeKey(profile.id, "app"), entry); + sendProfileProcessSignal(entry.pid, "SIGTERM"); + throw new Error([ + `${appName} did not open a window for ${profile.name || profile.id}.`, + ...(entry.spawnError ? [`Error: ${entry.spawnError}`] : []), + `Command: ${entry.command}`, + `User data: ${entry.userDataDir}` + ].join(" ")); + } + activateProfileAppWindow(entry); + return { + message: `Opened ${appName} with ${profile.name || profile.id}.`, + profileId: profile.id, + profileName: profile.name, + surface: "app" + }; +} + +async function openClaudeAppProfile(config: AppConfig, profile: ReturnType): Promise { + const profileGatewayConfig = claudeAppGatewayConfigFor(config, profile); + const existing = runningProfileApp(profile.id, "app"); + if (existing) { + if (!claudeAppDesignProxyRequired(profileGatewayConfig) || existing.claudeDesignProxy) { + activateProfileAppWindow(existing); + return { + message: `Claude App is already running with ${profile.name || profile.id}.`, + profileId: profile.id, + profileName: profile.name, + surface: "app" + }; + } + const stopped = await stopRunningProfileApp(profileRuntimeKey(profile.id, "app"), existing); + if (!stopped) { + throw new Error("Claude App is already running without the Claude Design proxy. Close Claude App and try again."); + } + stopClaudeAppBotWorker(profile.id); + } + + applyClaudeAppGatewayConfig(profileGatewayConfig); + applyClaudeAppGatewayConfig(profileGatewayConfig, { + backup: false, + dataDir: resolveClaudeAppProfileUserDataDir(CONFIGDIR, profile), + refreshModelDiscoveryCache: true + }); + await ensureGatewayConfigRunning(profileGatewayConfig, profile, "Claude App"); + const entry = registerProfileApp(profile, "app", await launchClaudeAppProfile(CONFIGDIR, profile, profileGatewayConfig)); + const started = await waitForProfileAppStart(entry, 12000); + if (!started) { + cleanupProfileAppEntry(profileRuntimeKey(profile.id, "app"), entry); + sendProfileProcessSignal(entry.pid, "SIGTERM"); + throw new Error([ + `Claude App did not open a window for ${profile.name || profile.id}.`, + ...(entry.spawnError ? [`Error: ${entry.spawnError}`] : []), + `Command: ${entry.command}`, + `User data: ${entry.userDataDir}` + ].join(" ")); + } + activateProfileAppWindow(entry); + startClaudeAppBotWorker(config, profile); + return { + message: `Opened Claude App with ${profile.name || profile.id}.`, + profileId: profile.id, + profileName: profile.name, + surface: "app" + }; +} + +export async function ensureProfileGateway( + config: AppConfig, + profile: ReturnType, + appName: string, + options: { reuseExisting?: boolean; startIfMissing?: boolean } = {} +): Promise { + const profileGatewayConfig = profileGatewayConfigFor(config, profile); + const result = await ensureGatewayConfigRunning(profileGatewayConfig, profile, appName, options, config); + return result.acceptedApiKey && result.acceptedApiKey !== result.config.APIKEY + ? profileGatewayConfigWithToken(result.config, profile, result.acceptedApiKey) + : result.config; +} + +type EnsureGatewayConfigRunningResult = { + acceptedApiKey?: string; + config: AppConfig; +}; + +async function ensureGatewayConfigRunning( + config: AppConfig, + profile: ReturnType, + appName: string, + options: { reuseExisting?: boolean; startIfMissing?: boolean } = {}, + candidateConfig: AppConfig = config +): Promise { + const startIfMissing = options.startIfMissing !== false; + if (options.reuseExisting) { + const existingGateway = await probeExistingProfileGateway(config, profile, candidateConfig); + if (existingGateway.state === "usable") { + return { acceptedApiKey: existingGateway.apiKey, config }; + } + if (existingGateway.state === "unavailable") { + if (!startIfMissing) { + throw new Error(`CCR gateway is not running at ${profileGatewayEndpoint(config)}. Start CCR Desktop or run ccr start before opening ${appName}.`); + } + } else { + throw new Error(existingGatewayConflictMessage(existingGateway, appName)); + } + } + + if (!startIfMissing) { + throw new Error(`CCR gateway is not running at ${profileGatewayEndpoint(config)}. Start CCR Desktop or run ccr start before opening ${appName}.`); + } + + const startedStatus = await gatewayService.start(config); + if (startedStatus.state === "running") { + return { config }; + } + + if (options.reuseExisting && isAddressInUseError(startedStatus.lastError)) { + const existingGateway = await probeExistingProfileGateway(config, profile, candidateConfig); + if (existingGateway.state === "usable") { + return { acceptedApiKey: existingGateway.apiKey, config }; + } + throw new Error(existingGatewayConflictMessage(existingGateway, appName)); + } + + throw new Error(startedStatus.lastError || `CCR gateway did not start for ${appName}.`); +} + +type ExistingProfileGatewayProbe = + | { endpoint: string; reason?: string; state: "unavailable" } + | { endpoint: string; status?: number; state: "not-ccr" } + | { endpoint: string; message?: string; status: number; state: "unauthorized" } + | { endpoint: string; status: number; state: "unusable" } + | { apiKey?: string; endpoint: string; state: "usable" }; + +type ExistingGatewayHttpProbe = { + payload?: unknown; + reason?: string; + status?: number; +}; + +async function probeExistingProfileGateway( + config: AppConfig, + profile: ReturnType, + candidateConfig: AppConfig = config +): Promise { + const endpoint = profileGatewayEndpoint(config); + const root = await fetchExistingGateway(endpoint, "/"); + if (root.status === undefined) { + return { endpoint, reason: root.reason, state: "unavailable" }; + } + + let ccrGateway = isCcrGatewayRoot(root.payload); + if (!ccrGateway) { + const health = await fetchExistingGateway(endpoint, "/health"); + ccrGateway = isCcrGatewayHealth(health.payload); + } + if (!ccrGateway) { + return { endpoint, status: root.status, state: "not-ccr" }; + } + + let lastUnauthorized: ExistingGatewayHttpProbe | undefined; + for (const apiKey of existingGatewayApiKeyCandidates(config, profile, candidateConfig)) { + const headers: Record = { + "user-agent": "Claude Code" + }; + if (apiKey) { + headers.authorization = `Bearer ${apiKey}`; + } + const models = await fetchExistingGateway(endpoint, "/v1/models", { headers }); + if (models.status === 200) { + return { apiKey, endpoint, state: "usable" }; + } + if (models.status === 401 || models.status === 403) { + lastUnauthorized = models; + continue; + } + return { endpoint, status: models.status ?? 0, state: "unusable" }; + } + + if (lastUnauthorized?.status === 401 || lastUnauthorized?.status === 403) { + return { + endpoint, + message: readGatewayErrorMessage(lastUnauthorized.payload), + status: lastUnauthorized.status, + state: "unauthorized" + }; + } + return { endpoint, status: 0, state: "unusable" }; +} + +async function fetchExistingGateway( + endpoint: string, + pathname: string, + init: RequestInit = {} +): Promise { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), 1200); + try { + const response = await fetch(new URL(pathname, endpoint).toString(), { + ...init, + signal: controller.signal + }); + return { + payload: await readResponseJson(response), + status: response.status + }; + } catch (error) { + return { reason: formatError(error) }; + } finally { + clearTimeout(timeout); + } +} + +async function readResponseJson(response: Response): Promise { + const text = await response.text(); + if (!text.trim()) { + return undefined; + } + try { + return JSON.parse(text) as unknown; + } catch { + return undefined; + } +} + +function isCcrGatewayRoot(value: unknown): boolean { + if (!isRecord(value)) { + return false; + } + return value.name === "claude-code-router" || value.plugin === "claude-code-router"; +} + +function isCcrGatewayHealth(value: unknown): boolean { + if (!isRecord(value)) { + return false; + } + return typeof value.core === "string" && typeof value.status === "string" && typeof value.timestamp === "string"; +} + +function readGatewayErrorMessage(value: unknown): string | undefined { + if (!isRecord(value) || !isRecord(value.error)) { + return undefined; + } + return typeof value.error.message === "string" ? value.error.message : undefined; +} + +function existingGatewayApiKeyCandidates( + config: AppConfig, + profile: ReturnType, + candidateConfig: AppConfig +): Array { + const values = [ + config.APIKEY, + ...(Array.isArray(config.APIKEYS) ? config.APIKEYS.map((apiKey) => apiKey.key) : []), + candidateConfig.APIKEY, + ...(Array.isArray(candidateConfig.APIKEYS) ? candidateConfig.APIKEYS.map((apiKey) => apiKey.key) : []), + ...readClaudeAppGatewayApiKeyCandidates(), + ...readClaudeCodeApiKeyHelperCandidates(profile) + ]; + const seen = new Set(); + const result: string[] = []; + for (const value of values) { + const key = value?.trim(); + if (!key || seen.has(key)) { + continue; + } + seen.add(key); + result.push(key); + } + return result.length > 0 ? result : [undefined]; +} + +function readClaudeCodeApiKeyHelperCandidates(profile: ReturnType): string[] { + const file = path.join(CONFIGDIR, "bin", claudeCodeApiKeyHelperFilename(profile)); + const files = [ + file, + ...readBackupFiles(file) + ]; + return uniqueStrings(files.map(readClaudeCodeApiKeyHelperToken)); +} + +function claudeCodeApiKeyHelperFilename(profile: ReturnType): string { + const slug = sanitizeProfilePathSegment(profile.id || profile.name || profile.agent) || "claude-code"; + return process.platform === "win32" + ? `ccr-claude-code-api-key-${slug}.cmd` + : `ccr-claude-code-api-key-${slug}`; +} + +function readBackupFiles(file: string): string[] { + const dir = path.dirname(file); + const prefix = `${path.basename(file)}.ccr-backup-`; + try { + return readdirSync(dir) + .filter((entry) => entry.startsWith(prefix)) + .sort() + .reverse() + .map((entry) => path.join(dir, entry)); + } catch { + return []; + } +} + +function readClaudeCodeApiKeyHelperToken(file: string): string { + if (!existsSync(file)) { + return ""; + } + try { + const content = readFileSync(file, "utf8"); + for (const line of content.split(/\r?\n/g)) { + const token = parseClaudeCodeApiKeyHelperLine(line); + if (token) { + return token; + } + } + } catch { + return ""; + } + return ""; +} + +function parseClaudeCodeApiKeyHelperLine(line: string): string { + const trimmed = line.trim(); + const shellPrefix = "printf '%s\\n' "; + if (trimmed.startsWith(shellPrefix)) { + return unquoteShellValue(trimmed.slice(shellPrefix.length).trim()); + } + if (/^echo\s+/i.test(trimmed)) { + return trimmed.replace(/^echo\s+/i, "").trim().replace(/^"|"$/g, ""); + } + return ""; +} + +function unquoteShellValue(value: string): string { + if (value.startsWith("'") && value.endsWith("'")) { + return value.slice(1, -1).replace(/'\\''/g, "'"); + } + return value.replace(/^"|"$/g, ""); +} + +function existingGatewayConflictMessage(probe: ExistingProfileGatewayProbe, appName: string): string { + if (probe.state === "unauthorized") { + const details = probe.message ? ` ${probe.message}` : ""; + return `CCR gateway is already running at ${probe.endpoint}, but it does not accept the API key for ${appName}.${details} Restart CCR Desktop or run ccr start to refresh the gateway before opening this profile.`; + } + if (probe.state === "unusable") { + return `CCR gateway is already running at ${probe.endpoint}, but it cannot serve ${appName} right now (HTTP ${probe.status}). Restart CCR Desktop or run ccr start to refresh the gateway before opening this profile.`; + } + if (probe.state === "not-ccr") { + return `Port ${probe.endpoint} is already in use by a non-CCR service. Stop that process or change the CCR gateway port.`; + } + if (probe.state === "unavailable") { + return `CCR gateway is not reachable at ${probe.endpoint}${probe.reason ? `: ${probe.reason}` : ""}.`; + } + return `CCR gateway is already running at ${probe.endpoint}.`; +} + +function isAddressInUseError(message: string | undefined): boolean { + return /\bEADDRINUSE\b/i.test(message || ""); +} + +function profileGatewayEndpoint(config: AppConfig): string { + const host = probeGatewayHost(config.gateway.host); + return `http://${formatEndpointHost(host)}:${config.gateway.port}/`; +} + +function probeGatewayHost(host: string): string { + if (!host || host === "0.0.0.0") { + return "127.0.0.1"; + } + if (host === "::") { + return "::1"; + } + return host; +} + +function formatEndpointHost(host: string): string { + return host.includes(":") && !host.startsWith("[") ? `[${host}]` : host; +} + +function profileGatewayConfigFor(config: AppConfig, profile: ReturnType): AppConfig { + const token = findProfileApiKey(config, profile); + if (!token) { + throw new Error(`No CCR API key was found for profile "${profile.name || profile.id}". Re-save the profile and try again.`); + } + return profileGatewayConfigWithToken(config, profile, token); +} + +function profileGatewayConfigWithToken(config: AppConfig, profile: ReturnType, token: string): AppConfig { + return { + ...config, + APIKEY: token, + APIKEYS: [ + { + createdAt: new Date().toISOString(), + id: profileApiKeyId(profile), + key: token, + name: `Profile: ${profile.name?.trim() || profile.id || profile.agent}` + } + ] + }; +} + +function claudeAppGatewayConfigFor(config: AppConfig, profile: ReturnType): AppConfig { + const profileGatewayConfig = profileGatewayConfigFor(config, profile); + if (!claudeAppDesignProxyRequired(profileGatewayConfig)) { + return profileGatewayConfig; + } + return { + ...profileGatewayConfig, + proxy: { + ...profileGatewayConfig.proxy, + enabled: true, + mode: "transparent", + systemProxy: false + } + }; +} + +function claudeAppDesignProxyRequired(config: AppConfig): boolean { + return config.plugins.some((plugin) => plugin.enabled !== false && plugin.id === "claude-design"); +} + +export function getProfileRuntimeStatus(): ProfileRuntimeStatus { + cleanupExitedProfileApps(); + return { + profiles: [...runningProfileApps.values()] + .filter((entry) => !entry.stopRequested) + .map((entry) => ({ + agent: entry.agent, + pid: entry.pid, + profileId: entry.profileId, + profileName: entry.profileName, + startedAt: entry.startedAt, + state: entry.state, + surface: entry.surface + })) + }; +} + +export async function stopProfileFromCcr(config: AppConfig, request: ProfileOpenRequest): Promise { + const profile = findProfileForOpen(config, request.profileId); + const surface = resolveProfileOpenSurface(profile, request.surface); + if (surface !== "app") { + throw new Error(`${profile.name || profile.id} does not support stopping ${surface.toUpperCase()} from CCR.`); + } + + const key = profileRuntimeKey(profile.id, surface); + const entry = runningProfileApps.get(key); + if (!entry) { + return { + message: `No running app was found for ${profile.name || profile.id}.`, + profileId: profile.id, + profileName: profile.name, + stopped: false, + surface + }; + } + + const stopped = await stopRunningProfileApp(key, entry); + if (stopped && profile.agent === "claude-code") { + stopClaudeAppBotWorker(profile.id); + } + return { + message: stopped + ? `Stopped ${profile.name || profile.id}.` + : `Stop requested for ${profile.name || profile.id}. It may take a moment to close.`, + profileId: profile.id, + profileName: profile.name, + stopped, + surface + }; +} + +const runningProfileApps = new Map(); + +function registerProfileApp( + profile: ReturnType, + surface: ProfileOpenRequest["surface"], + launch: ProfileAppLaunchResult +): RunningProfileApp { + const key = profileRuntimeKey(profile.id, surface); + const existing = runningProfileApps.get(key); + if (existing && isProcessAlive(existing.pid)) { + sendProfileProcessSignal(existing.pid, "SIGTERM"); + } + + const entry: RunningProfileApp = { + agent: profile.agent, + child: launch.child, + claudeDesignProxy: launch.claudeDesignProxy, + command: launch.command, + pid: launch.pid, + pidIsLauncher: launch.pidIsLauncher, + profileId: profile.id, + profileName: profile.name, + startedAt: new Date().toISOString(), + state: "running", + surface, + userDataDir: launch.userDataDir + }; + runningProfileApps.set(key, entry); + + launch.child.once("exit", () => { + if (process.platform === "win32" && entry.userDataDir) { + setTimeout(() => { + if (isProfileAppRunning(entry)) { + return; + } + cleanupProfileAppEntry(key, entry); + }, 1500).unref(); + return; + } + if (entry.pidIsLauncher && isProfileAppRunning(entry)) { + return; + } + cleanupProfileAppEntry(key, entry); + }); + launch.child.once("error", (error) => { + entry.spawnError = formatError(error); + cleanupProfileAppEntry(key, entry); + }); + return entry; +} + +function activateProfileAppWindow(entry: Pick): void { + if (process.platform !== "darwin") { + return; + } + for (const delayMs of [250, 1200]) { + setTimeout(() => { + const pid = profileAppMainPid(entry) ?? entry.pid; + if (!isProcessAlive(pid)) { + return; + } + try { + const child = spawn("/usr/bin/osascript", [ + "-e", + `tell application "System Events" to set frontmost of the first process whose unix id is ${pid} to true` + ], { + detached: true, + stdio: "ignore" + }); + child.unref(); + } catch { + // Activation is best-effort; the app process itself has already been started. + } + }, delayMs).unref(); + } +} + +function runningProfileApp(profileId: string, surface: ProfileOpenRequest["surface"]): RunningProfileApp | undefined { + const key = profileRuntimeKey(profileId, surface); + const entry = runningProfileApps.get(key); + if (!entry) { + return undefined; + } + if (isProfileAppRunning(entry)) { + entry.stopRequested = false; + return entry; + } + cleanupProfileAppEntry(key, entry); + return undefined; +} + +function cleanupExitedProfileApps(): void { + for (const [key, entry] of runningProfileApps) { + if (!isProfileAppRunning(entry)) { + cleanupProfileAppEntry(key, entry); + } + } +} + +function cleanupProfileAppEntry(key: string, entry: RunningProfileApp): void { + if (runningProfileApps.get(key) !== entry) { + return; + } + runningProfileApps.delete(key); + if (entry.stopRequested && entry.agent === "claude-code") { + stopClaudeAppBotWorker(entry.profileId); + } +} + +async function stopRunningProfileApp(key: string, entry: RunningProfileApp): Promise { + if (!isProfileAppRunning(entry)) { + runningProfileApps.delete(key); + return false; + } + + entry.stopRequested = true; + sendProfileProcessSignal(profileAppMainPid(entry) ?? entry.pid, "SIGTERM"); + if (await waitForProfileAppExit(entry, 5000)) { + runningProfileApps.delete(key); + return true; + } + + return false; +} + +function profileRuntimeKey(profileId: string, surface: ProfileOpenRequest["surface"]): string { + return `${surface}:${profileId}`; +} + +function isProcessAlive(pid: number | undefined): boolean { + if (!pid) { + return false; + } + try { + process.kill(pid, 0); + return true; + } catch (error) { + return nodeErrorCode(error) === "EPERM"; + } +} + +function isProfileAppRunning(entry: Pick): boolean { + if (profileAppMainPid(entry)) { + return true; + } + return !entry.pidIsLauncher && isProcessAlive(entry.pid); +} + +function profileAppMainPid(entry: Pick): number | undefined { + if (!entry.userDataDir) { + return undefined; + } + const marker = normalizeProcessPath(entry.userDataDir); + if (process.platform === "win32") { + return windowsProfileAppMainPid(marker); + } + return posixProfileAppMainPid(marker); +} + +function posixProfileAppMainPid(marker: string): number | undefined { + try { + const result = spawnSync("ps", ["-Ao", "pid=,command="], { + encoding: "utf8" + }); + if (result.error || result.status !== 0) { + return undefined; + } + for (const line of result.stdout.split(/\r?\n/)) { + const match = line.match(/^\s*(\d+)\s+(.+)$/); + if (!match) { + continue; + } + const pid = Number(match[1]); + const command = match[2]; + if (!Number.isFinite(pid) || pid <= 0 || pid === process.pid) { + continue; + } + if (path.basename(command.trim().split(/\s+/)[0] || "") === "open") { + continue; + } + if (command.includes(" --type=")) { + continue; + } + if (normalizeProcessPath(command).includes(marker)) { + return pid; + } + } + } catch { + return undefined; + } + return undefined; +} + +function normalizeProcessPath(value: string): string { + return process.platform === "win32" ? value.replace(/\\/g, "/").toLowerCase() : value; +} + +function windowsProfileAppMainPid(marker: string): number | undefined { + const script = [ + "$ErrorActionPreference = 'SilentlyContinue'", + `$marker = ${powershellString(marker)}`, + `$hostPid = ${process.pid}`, + "$selfPid = $PID", + "Get-CimInstance Win32_Process | Where-Object {", + " $_.ProcessId -ne $selfPid -and", + " $_.ProcessId -ne $hostPid -and", + " $_.CommandLine -and", + " (($_.CommandLine -replace '\\\\', '/').ToLowerInvariant().Contains($marker)) -and", + " ($_.CommandLine -notmatch '\\s--type=')", + "} | Sort-Object ProcessId | Select-Object -First 1 -ExpandProperty ProcessId" + ].join("\n"); + try { + const result = spawnSync(windowsSystemCommand("powershell.exe"), [ + "-NoProfile", + "-NonInteractive", + "-ExecutionPolicy", + "Bypass", + "-Command", + script + ], { + encoding: "utf8", + maxBuffer: 1024 * 1024, + windowsHide: true + }); + if (result.error || result.status !== 0) { + return undefined; + } + const pid = result.stdout + .split(/\r?\n/) + .map((line) => Number(line.trim())) + .find((value) => Number.isFinite(value) && value > 0 && value !== process.pid); + return pid; + } catch { + return undefined; + } +} + +function sendProfileProcessSignal(pid: number | undefined, signal: NodeJS.Signals): void { + if (!pid) { + return; + } + if (process.platform === "win32") { + const args = ["/PID", String(pid), "/T"]; + if (signal === "SIGKILL") { + args.push("/F"); + } + spawnSync(windowsSystemCommand("taskkill.exe"), args, { + stdio: "ignore", + windowsHide: true + }); + return; + } + + try { + process.kill(pid, signal); + } catch { + // The app process may have already exited. + } +} + +async function waitForProcessExit(pid: number | undefined, timeoutMs: number): Promise { + if (!pid) { + return true; + } + const startedAt = Date.now(); + while (Date.now() - startedAt < timeoutMs) { + if (!isProcessAlive(pid)) { + return true; + } + await sleep(100); + } + return !isProcessAlive(pid); +} + +async function waitForProfileAppStart(entry: Pick, timeoutMs: number): Promise { + const startedAt = Date.now(); + while (Date.now() - startedAt < timeoutMs) { + if (entry.spawnError) { + return false; + } + if (profileAppMainPid(entry)) { + return true; + } + if (!entry.pidIsLauncher && isProcessAlive(entry.pid)) { + return true; + } + if (process.platform !== "win32" && !entry.pidIsLauncher && !isProcessAlive(entry.pid)) { + return false; + } + await sleep(100); + } + return !entry.spawnError && (Boolean(profileAppMainPid(entry)) || (!entry.pidIsLauncher && isProcessAlive(entry.pid))); +} + +function waitForImmediateSpawnError(child: ChildProcess, timeoutMs: number): Promise { + return new Promise((resolve) => { + let settled = false; + let timer: NodeJS.Timeout | undefined; + const finish = (message: string | undefined) => { + if (settled) { + return; + } + settled = true; + if (timer) { + clearTimeout(timer); + } + child.off("error", onError); + child.off("spawn", onSpawn); + resolve(message); + }; + const onError = (error: Error) => finish(formatError(error)); + const onSpawn = () => finish(undefined); + child.once("error", onError); + child.once("spawn", onSpawn); + timer = setTimeout(() => finish(undefined), timeoutMs); + timer.unref?.(); + }); +} + +async function waitForProfileAppExit(entry: Pick, timeoutMs: number): Promise { + const startedAt = Date.now(); + while (Date.now() - startedAt < timeoutMs) { + if (!isProfileAppRunning(entry)) { + return true; + } + await sleep(100); + } + return !isProfileAppRunning(entry); +} + +function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +function nodeErrorCode(error: unknown): string | undefined { + return typeof error === "object" && error !== null && "code" in error + ? String((error as { code?: unknown }).code) + : undefined; +} + +function startClaudeAppBotWorker(config: AppConfig, profile: ReturnType): void { + const botEnv = botGatewayProfileEnv(config, profile, "app"); + stopClaudeAppBotWorker(); + if (botEnv.CCR_BOT_GATEWAY_ENABLED !== "true") { + return; + } + + const runtimeFile = path.join(CONFIGDIR, "bin", "ccr-codex-cli-middleware.js"); + ensureClaudeBotWorkerRuntime(runtimeFile); + + const settingsFile = resolveClaudeCodeSettingsFile(CONFIGDIR, profile); + const settingsEnv = readClaudeCodeSettingsEnv(settingsFile); + const claudeAppUserDataDir = resolveClaudeAppProfileUserDataDir(CONFIGDIR, profile); + const nodeLaunch = nodeRuntimeLaunch(); + const env: NodeJS.ProcessEnv = { + ...process.env, + ...stringRecord(profile.env), + ...settingsEnv, + ...botEnv, + ...(nodeLaunch.electronRunAsNode ? { ELECTRON_RUN_AS_NODE: "1" } : {}), + CCR_CLAUDE_BASE_CONFIG_DIR: path.dirname(settingsFile), + CLAUDE_CONFIG_DIR: path.dirname(settingsFile), + CLAUDE_USER_DATA_DIR: claudeAppUserDataDir, + CCR_CLAUDE_APP_USER_DATA_PATH: claudeAppUserDataDir, + CCR_CLAUDE_CODE_BOT_WORKER: "1", + CCR_CLAUDE_CODE_MODEL: profile.model.trim(), + CCR_CODEX_MODEL: profile.model.trim(), + CCR_CODEX_WORKSPACE_NAME: profile.name || profile.id, + CCR_PROFILE_SURFACE: "app", + CODEXL_CODEX_WORKSPACE_NAME: profile.name || profile.id, + CODEXL_PROFILE_SURFACE: "app", + ...claudeCodeUtcTimezoneEnvOverride() + }; + delete env.ELECTRON_NO_ATTACH_CONSOLE; + + const child = spawn(nodeLaunch.command, [runtimeFile, "claude-bot-worker", "--workspace-name", profile.name || profile.id], { + detached: false, + env, + stdio: ["ignore", "ignore", "pipe"], + windowsHide: true + }); + claudeAppBotWorker = child; + claudeAppBotWorkerProfileId = profile.id; + child.stderr?.on("data", (chunk) => { + console.warn(`[profile] Claude App bot worker stderr: ${chunk.toString("utf8").trim()}`); + }); + child.once("exit", (code, signal) => { + if (claudeAppBotWorker === child) { + claudeAppBotWorker = undefined; + claudeAppBotWorkerProfileId = undefined; + } + if (code && code !== 0) { + console.warn(`[profile] Claude App bot worker exited: code=${code}${signal ? ` signal=${signal}` : ""}`); + } + }); + child.once("error", (error) => { + if (claudeAppBotWorker === child) { + claudeAppBotWorker = undefined; + claudeAppBotWorkerProfileId = undefined; + } + console.warn(`[profile] Claude App bot worker failed: ${formatError(error)}`); + }); +} + +function readClaudeCodeSettingsEnv(settingsFile: string): Record { + if (!existsSync(settingsFile)) { + return {}; + } + try { + const parsed = JSON.parse(readFileSync(settingsFile, "utf8")) as unknown; + if (!isRecord(parsed) || !isRecord(parsed.env)) { + return {}; + } + const env: Record = {}; + for (const [key, value] of Object.entries(parsed.env)) { + if (isEnvName(key) && typeof value === "string") { + env[key] = value; + } + } + return env; + } catch { + return {}; + } +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function isEnvName(value: string): boolean { + return /^[A-Za-z_][A-Za-z0-9_]*$/.test(value); +} + +function ensureClaudeBotWorkerRuntime(runtimeFile: string): void { + const content = codexCliMiddlewareRuntimeScript(); + const existing = existsSync(runtimeFile) ? readFileSync(runtimeFile, "utf8") : ""; + if (existing !== content) { + mkdirSync(path.dirname(runtimeFile), { recursive: true }); + writeFileSync(runtimeFile, content); + if (process.platform !== "win32") { + chmodSync(runtimeFile, 0o755); + } + } + if (!content.includes("CCR_CLAUDE_CODE_BOT_WORKER") || !content.includes("claude-bot-worker")) { + throw new Error("Claude bot worker runtime does not contain the bot worker entrypoint."); + } +} + +function stopClaudeAppBotWorker(profileId?: string): void { + if (profileId && claudeAppBotWorkerProfileId && claudeAppBotWorkerProfileId !== profileId) { + return; + } + const child = claudeAppBotWorker; + claudeAppBotWorker = undefined; + claudeAppBotWorkerProfileId = undefined; + if (!child || child.killed) { + return; + } + try { + child.kill("SIGTERM"); + } catch { + // The worker may have already exited. + } +} + +function nodeRuntimeLaunch(): { command: string; electronRunAsNode: boolean } { + const configured = process.env.CCR_NODE_BIN?.trim(); + if (configured) { + return { command: configured, electronRunAsNode: false }; + } + return { + command: process.execPath, + electronRunAsNode: Boolean(process.versions.electron) + }; +} + +function commandProfileRef(config: AppConfig, profile: ReturnType): string { + const name = profile.name?.trim(); + if (!name) { + return profile.id; + } + const normalizedName = name.toLowerCase(); + const duplicateName = config.profile.profiles.some((item) => + item.enabled && + item.id !== profile.id && + item.name.trim().toLowerCase() === normalizedName + ); + return duplicateName ? profile.id : name; +} + +export function prepareCcrCliLauncherRuntime(): CcrCliLauncherPreparation { + const binDir = path.join(CONFIGDIR, "bin"); + const persistentPathRequired = !processPathIncludes(binDir); + mkdirSync(binDir, { recursive: true }); + cleanupGeneratedBinBackups(); + cleanupLegacyCcrCliLauncher(binDir); + + const runtimeFile = path.join(binDir, desktopCliRuntimeFileName); + const runtimeSource = findBundledCcrCliSource(); + writeFileIfChanged(runtimeFile, readFileSync(runtimeSource, "utf8")); + chmodSafe(runtimeFile); + ensureBundledToolHubMcpRuntime(path.join(binDir, TOOL_HUB_MCP_RUNTIME_FILE_NAME)); + prependProcessPath(binDir); + + return { binDir, persistentPathRequired }; +} + +export function persistPreparedCcrCliPath(preparation: CcrCliLauncherPreparation): void { + if (!preparation.persistentPathRequired) { + return; + } + persistCcrBinOnPath(preparation.binDir); +} + +export function ensureCcrCliLauncher(config?: AppConfig, options: EnsureCcrCliLauncherOptions = {}): string { + const preparation = prepareCcrCliLauncherRuntime(); + const { binDir } = preparation; + const runtimeFile = path.join(binDir, desktopCliRuntimeFileName); + + const launcherFile = path.join(binDir, process.platform === "win32" ? `${desktopCliCommandName}.cmd` : desktopCliCommandName); + const launcherContent = process.platform === "win32" + ? windowsCcrLauncher(runtimeFile, config) + : posixCcrLauncher(runtimeFile); + writeFileIfChanged(launcherFile, launcherContent); + chmodSafe(launcherFile); + if (options.persistPath !== false) { + persistPreparedCcrCliPath(preparation); + } + + return launcherFile; +} + +function cleanupLegacyCcrCliLauncher(binDir: string): void { + const legacyLauncherFile = path.join(binDir, process.platform === "win32" ? "ccr.cmd" : "ccr"); + if (!existsSync(legacyLauncherFile)) { + return; + } + try { + const source = readFileSync(legacyLauncherFile, "utf8"); + if (!isLegacyManagedCcrCliLauncher(source)) { + return; + } + rmSync(legacyLauncherFile, { force: true }); + } catch (error) { + console.warn(`[profile] Failed to remove legacy ccr launcher: ${formatError(error)}`); + } +} + +function isLegacyManagedCcrCliLauncher(source: string): boolean { + return source.includes("CCR_CLI_NODE_PATH") && + source.includes(desktopCliRuntimeFileName) && + source.includes("ELECTRON_RUN_AS_NODE=1") && + source.includes("CCR_NODE_BIN"); +} + +function findBundledCcrCliSource(): string { + const resourcesPath = (process as NodeJS.Process & { resourcesPath?: string }).resourcesPath; + const candidates = [ + path.join(__dirname, "cli.js"), + ...(resourcesPath + ? [ + path.join(resourcesPath, "app.asar", "dist", "main", "cli.js"), + path.join(resourcesPath, "app", "dist", "main", "cli.js") + ] + : []), + path.join(process.cwd(), "dist", "main", "cli.js") + ]; + const source = candidates.find((candidate) => existsSync(candidate)); + if (!source) { + throw new Error(`CCR CLI runtime was not found. Rebuild or reinstall CCR and try again. Checked: ${candidates.join(", ")}`); + } + return source; +} + +function ensureBundledToolHubMcpRuntime(file: string): void { + const source = bundledToolHubMcpEntryPathCandidates().find((candidate) => existsSync(candidate)); + if (!source) { + return; + } + writeFileIfChanged(file, readFileSync(source, "utf8")); + chmodSafe(file); +} + +function posixCcrLauncher(runtimeFile: string): string { + const nodePath = bundledNodePath(); + return [ + "#!/bin/sh", + `${desktopCliCommandNameEnv}=${shQuote(desktopCliCommandName)}`, + `export ${desktopCliCommandNameEnv}`, + `CCR_CLI_NODE_PATH=${shQuote(nodePath)}`, + 'if [ -n "$NODE_PATH" ]; then', + ' export NODE_PATH="$CCR_CLI_NODE_PATH:$NODE_PATH"', + "else", + ' export NODE_PATH="$CCR_CLI_NODE_PATH"', + "fi", + 'if [ -n "$CCR_NODE_BIN" ]; then', + ` exec "$CCR_NODE_BIN" ${shQuote(runtimeFile)} "$@"`, + "fi", + `ELECTRON_RUN_AS_NODE=1 exec ${shQuote(process.execPath)} ${shQuote(runtimeFile)} "$@"` + ].join("\n") + "\n"; +} + +export function windowsCcrLauncher(runtimeFile: string, config?: AppConfig): string { + const nodePath = bundledNodePath(); + const dispatches = config ? windowsProfileCliDispatches(config) : []; + return [ + "@echo off", + "setlocal", + `set "${desktopCliCommandNameEnv}=${desktopCliCommandName}"`, + `set "CCR_CLI_RUNTIME=${cmdEnvValue(runtimeFile)}"`, + `set "CCR_CLI_NODE_PATH=${cmdEnvValue(nodePath)}"`, + "if defined NODE_PATH (", + " set \"NODE_PATH=%CCR_CLI_NODE_PATH%;%NODE_PATH%\"", + ") else (", + " set \"NODE_PATH=%CCR_CLI_NODE_PATH%\"", + ")", + ...(dispatches.length > 0 + ? [ + "if /I \"%~2\"==\"app\" goto ccr_run_cli", + "if /I \"%~2\"==\"--app\" goto ccr_run_cli", + ...dispatches.map((dispatch, index) => `if /I \"%~1\"==\"${cmdValue(dispatch.profileRef)}\" goto ccr_profile_${index}`), + ":ccr_run_cli" + ] + : []), + "if defined CCR_NODE_BIN (", + ' "%CCR_NODE_BIN%" "%CCR_CLI_RUNTIME%" %*', + " exit /b %ERRORLEVEL%", + ")", + "set \"ELECTRON_RUN_AS_NODE=1\"", + `${cmdQuote(process.execPath)} "%CCR_CLI_RUNTIME%" %*`, + "exit /b %ERRORLEVEL%", + ...dispatches.flatMap((dispatch, index) => [ + `:ccr_profile_${index}`, + "set \"CCR_CLI_PREPARE_PROFILE_ONLY=1\"", + "set \"ELECTRON_RUN_AS_NODE=1\"", + `${cmdQuote(process.execPath)} "%CCR_CLI_RUNTIME%" %*`, + "if errorlevel 1 exit /b %ERRORLEVEL%", + "set \"CCR_CLI_PREPARE_PROFILE_ONLY=\"", + "set \"ELECTRON_RUN_AS_NODE=\"", + "set \"CCR_CLI_DIRECT_PROFILE_DISPATCH=1\"", + `call ${cmdQuote(dispatch.launcher)} %*`, + "exit /b %ERRORLEVEL%" + ]) + ].join("\r\n") + "\r\n"; +} + +function windowsProfileCliDispatches(config: AppConfig): Array<{ launcher: string; profileRef: string }> { + const dispatches: Array<{ launcher: string; profileRef: string }> = []; + const refs = new Set(); + for (const profile of config.profile.profiles) { + if (!profile.enabled || !profileOpenSurfaces(profile).includes("cli")) { + continue; + } + const launcher = buildProfileLaunchPlan(CONFIGDIR, profile, "cli").command; + for (const profileRef of uniqueStrings([commandProfileRef(config, profile), profile.id])) { + const normalized = profileRef.trim().toLowerCase(); + if (!normalized || refs.has(normalized)) { + continue; + } + refs.add(normalized); + dispatches.push({ launcher, profileRef }); + } + } + return dispatches; +} + +function bundledNodePath(): string { + const resourcesPath = (process as NodeJS.Process & { resourcesPath?: string }).resourcesPath; + const candidates = [ + path.join(__dirname, "..", "..", "node_modules"), + ...(resourcesPath + ? [ + path.join(resourcesPath, "app.asar", "node_modules"), + path.join(resourcesPath, "app.asar.unpacked", "node_modules"), + path.join(resourcesPath, "app", "node_modules") + ] + : []), + path.join(process.cwd(), "node_modules") + ]; + return uniqueStrings(candidates).join(path.delimiter); +} + +function uniqueStrings(values: string[]): string[] { + const seen = new Set(); + const result: string[] = []; + for (const value of values) { + if (!value || seen.has(value)) { + continue; + } + seen.add(value); + result.push(value); + } + return result; +} + +function writeFileIfChanged(file: string, content: string): void { + if (existsSync(file) && readFileSync(file, "utf8") === content) { + return; + } + writeFileSync(file, content, "utf8"); +} + +function persistCcrBinOnPath(binDir: string): void { + try { + if (process.platform === "win32") { + ensureWindowsUserPath(binDir); + return; + } + ensurePosixShellPath(binDir); + } catch (error) { + console.warn(`[profile] Failed to persist ccr PATH: ${formatError(error)}`); + } +} + +function processPathIncludes(binDir: string): boolean { + const pathKey = process.platform === "win32" + ? Object.keys(process.env).find((key) => key.toLowerCase() === "path") || "Path" + : "PATH"; + return pathSegmentsInclude((process.env[pathKey] || "").split(path.delimiter).filter(Boolean), binDir); +} + +function prependProcessPath(binDir: string): void { + const pathKey = process.platform === "win32" + ? Object.keys(process.env).find((key) => key.toLowerCase() === "path") || "Path" + : "PATH"; + const delimiter = path.delimiter; + const currentPath = process.env[pathKey] || ""; + const segments = currentPath.split(delimiter).filter(Boolean); + if (pathSegmentsInclude(segments, binDir)) { + return; + } + process.env[pathKey] = [binDir, ...segments].join(delimiter); +} + +function ensureWindowsUserPath(binDir: string): boolean { + const broadcastLines = windowsEnvironmentChangedPowerShellLines().map((line) => ` ${line}`); + const script = [ + "$ErrorActionPreference = 'Stop'", + `$bin = ${powershellString(binDir)}`, + "$userPath = [Environment]::GetEnvironmentVariable('Path', 'User')", + "$segments = @()", + "if (-not [string]::IsNullOrWhiteSpace($userPath)) {", + " $segments = $userPath -split ';' | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }", + "}", + "$expandedBin = [Environment]::ExpandEnvironmentVariables($bin).TrimEnd('\\\\')", + "$expandedSegments = $segments | ForEach-Object { [Environment]::ExpandEnvironmentVariables($_).TrimEnd('\\\\') }", + "if ($expandedSegments -notcontains $expandedBin) {", + " [Environment]::SetEnvironmentVariable('Path', ((@($bin) + $segments) -join ';'), 'User')", + ...broadcastLines, + " Write-Output 'CHANGED'", + "} else {", + " Write-Output 'UNCHANGED'", + "}" + ].join("\n"); + const result = spawnSync(windowsSystemCommand("powershell.exe"), [ + "-NoProfile", + "-NonInteractive", + "-ExecutionPolicy", + "Bypass", + "-Command", + script + ], { + encoding: "utf8", + windowsHide: true + }); + if (result.error) { + throw result.error; + } + if (result.status !== 0) { + throw new Error((result.stderr || result.stdout || `powershell.exe exited with ${result.status}`).trim()); + } + return result.stdout.trim().split(/\r?\n/).includes("CHANGED"); +} + +function ensurePosixShellPath(binDir: string): void { + const shellName = path.basename(process.env.SHELL || "").toLowerCase(); + if (shellName.includes("fish")) { + ensureFishPathBlock(path.join(os.homedir(), ".config", "fish", "conf.d", "ccr.fish"), binDir); + return; + } + ensureShellRcPathBlock(preferredShellRcFile(shellName), binDir); +} + +function preferredShellRcFile(shellName = path.basename(process.env.SHELL || "").toLowerCase()): string { + const home = os.homedir(); + if (shellName.includes("zsh")) { + return path.join(home, ".zshrc"); + } + if (shellName.includes("bash")) { + if (process.platform === "darwin") { + const bashProfile = path.join(home, ".bash_profile"); + return existsSync(bashProfile) ? bashProfile : path.join(home, ".bashrc"); + } + return path.join(home, ".bashrc"); + } + return path.join(home, ".profile"); +} + +function pathSegmentsInclude(segments: string[], target: string): boolean { + if (process.platform === "win32") { + const normalizedTarget = normalizeWindowsPathSegment(target); + return segments.some((segment) => normalizeWindowsPathSegment(segment) === normalizedTarget); + } + return segments.includes(target); +} + +function normalizeWindowsPathSegment(value: string): string { + return value.trim().replace(/[\\/]+$/g, "").toLowerCase(); +} + +function ensureShellRcPathBlock(rcFile: string, binDir: string): void { + mkdirSync(path.dirname(rcFile), { recursive: true }); + const source = existsSync(rcFile) ? readFileSync(rcFile, "utf8") : ""; + const block = shellRcPathBlock(); + const managedPattern = new RegExp( + `\\n?${escapeRegExp(ccrPathBlockStart)}[\\s\\S]*?${escapeRegExp(ccrPathBlockEnd)}\\n?`, + "m" + ); + if (managedPattern.test(source)) { + const next = ensureTrailingNewline(source.replace(managedPattern, `\n${block}\n`)).replace(/^\n+/, ""); + writeFileIfChanged(rcFile, next); + return; + } + if (shellRcAlreadyAddsCcrBin(source, binDir)) { + return; + } + + const separator = source.trim() ? (source.endsWith("\n") ? "\n" : "\n\n") : ""; + writeFileIfChanged(rcFile, `${source}${separator}${block}\n`); +} + +function shellRcPathBlock(): string { + const binDir = "$HOME/.claude-code-router/bin"; + return [ + ccrPathBlockStart, + "# Added by Claude Code Router. Enables the ccr-app command in new shells.", + 'case ":$PATH:" in', + ` *":${binDir}:"*) ;;`, + ` *) export PATH="${binDir}:$PATH" ;;`, + "esac", + ccrPathBlockEnd + ].join("\n"); +} + +function ensureFishPathBlock(file: string, binDir: string): void { + mkdirSync(path.dirname(file), { recursive: true }); + const source = existsSync(file) ? readFileSync(file, "utf8") : ""; + const block = fishPathBlock(); + const managedPattern = new RegExp( + `\\n?${escapeRegExp(ccrPathBlockStart)}[\\s\\S]*?${escapeRegExp(ccrPathBlockEnd)}\\n?`, + "m" + ); + if (managedPattern.test(source)) { + const next = ensureTrailingNewline(source.replace(managedPattern, `\n${block}\n`)).replace(/^\n+/, ""); + writeFileIfChanged(file, next); + return; + } + if (shellRcAlreadyAddsCcrBin(source, binDir)) { + return; + } + + const separator = source.trim() ? (source.endsWith("\n") ? "\n" : "\n\n") : ""; + writeFileIfChanged(file, `${source}${separator}${block}\n`); +} + +function fishPathBlock(): string { + return [ + ccrPathBlockStart, + "# Added by Claude Code Router. Enables the ccr-app command in new shells.", + 'set -l ccr_bin "$HOME/.claude-code-router/bin"', + "if not contains $ccr_bin $PATH", + " set -gx PATH $ccr_bin $PATH", + "end", + ccrPathBlockEnd + ].join("\n"); +} + +function shellRcAlreadyAddsCcrBin(source: string, binDir: string): boolean { + return source.includes("$HOME/.claude-code-router/bin") || + source.includes("~/.claude-code-router/bin") || + source.includes(binDir); +} + +function ensureTrailingNewline(value: string): string { + return value.endsWith("\n") ? value : `${value}\n`; +} + +function chmodSafe(file: string): void { + if (process.platform === "win32") { + return; + } + try { + chmodSync(file, 0o755); + } catch { + // The launcher can still be shown; execution will surface the filesystem error. + } +} + +function shQuote(value: string): string { + return `'${value.replace(/'/g, "'\\''")}'`; +} + +function cmdQuote(value: string): string { + return `"${cmdValue(value)}"`; +} + +function cmdEnvValue(value: string): string { + return cmdValue(value); +} + +function cmdValue(value: string): string { + return value + .replace(/\r?\n/g, " ") + .replace(/\^/g, "^^") + .replace(/%/g, "%%") + .replace(/"/g, '^"') + .replace(/[&|<>()]/g, "^$&"); +} + +function powershellString(value: string): string { + return `'${value.replace(/'/g, "''")}'`; +} + +function escapeRegExp(value: string): string { + return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + +function stringRecord(value: Record | undefined): Record { + if (!value || typeof value !== "object") { + return {}; + } + return Object.fromEntries(Object.entries(value).filter(([, item]) => typeof item === "string")); +} + +function findProfileApiKey(config: AppConfig, profile: ReturnType): string { + const keyId = profileApiKeyId(profile); + const key = config.APIKEYS.find((apiKey) => apiKey.id === keyId)?.key.trim(); + return key || config.APIKEYS.find((apiKey) => apiKey.key.trim())?.key.trim() || config.APIKEY.trim(); +} + +function profileApiKeyId(profile: ReturnType): string { + return `profile:${sanitizeProfilePathSegment(profile.id || profile.name || profile.agent) || "profile"}`; +} + +function sanitizeProfilePathSegment(value: string): string { + return value.trim().replace(/[^a-zA-Z0-9_.-]+/g, "-").replace(/^-+|-+$/g, ""); +} diff --git a/packages/core/src/profiles/service.ts b/packages/core/src/profiles/service.ts new file mode 100644 index 0000000..8773cb6 --- /dev/null +++ b/packages/core/src/profiles/service.ts @@ -0,0 +1,2072 @@ +import { randomBytes } from "node:crypto"; +import { chmodSync, copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import { CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV, NO_AVAILABLE_GATEWAY_MODELS_MESSAGE, enforceSingleEnabledGlobalProfilePerAgent, hasAvailableGatewayModels, type ApiKeyConfig, type AppConfig, type ProfileApplyResult, type ProfileClientApplyStatus, type ProfileClientKind, type ProfileConfig } from "@ccr/core/contracts/app"; +import { replacePersistedApiKeys } from "@ccr/core/config/api-key-store"; +import { botGatewayProfileEnv } from "@ccr/core/agents/bot-gateway/env"; +import { + CLAUDE_CODE_MCP_CONFIG_ENV, + CODEXL_CLAUDE_CODE_MCP_CONFIG_ENV, + claudeCodeMcpConfigEnv, + claudeCodeUtcTimezoneEnvOverride +} from "@ccr/core/agents/claude-code/environment"; +import { writeCodexCompatibleAppModelCatalog } from "@ccr/core/agents/codex/app-launch"; +import { codexCliMiddlewareRuntimeScript } from "@ccr/core/agents/codex/cli-middleware-runtime"; +import { codexModelCatalogJson } from "@ccr/core/agents/codex/model-catalog"; +import { CONFIGDIR } from "@ccr/core/config/constants"; +import { resolveZcodeConfigFile, writeZcodeGatewayConfig, zcodeHomeFromConfigFile } from "@ccr/core/agents/zcode/profile-config"; +import { normalizeRouteSelector } from "@ccr/core/gateway/claude-code-router-plugin"; +import { + TOOL_HUB_MCP_RUNTIME_FILE_NAME, + TOOL_HUB_MCP_SERVER_NAME, + bundledToolHubMcpEntryPathCandidates, + toolHubClaudeCodeMcpConfig, + toolHubMcpRuntimeConfig, + type ToolHubMcpRuntimeConfig +} from "@ccr/core/mcp/toolhub-config"; + +const managedRootStart = "# BEGIN CCR managed profile"; +const managedRootEnd = "# END CCR managed profile"; +const managedProviderStart = "# BEGIN CCR managed Codex provider"; +const managedProviderEnd = "# END CCR managed Codex provider"; +const managedToolHubMcpStart = "# BEGIN CCR managed ToolHub MCP"; +const managedToolHubMcpEnd = "# END CCR managed ToolHub MCP"; +const originalBackupSuffix = ".ccr-original"; +const originalMissingSuffix = ".ccr-original-missing"; +const globalProfileTakeoverFile = path.join(CONFIGDIR, "global-profile-takeover.json"); +const fallbackClientToken = "ccr-local"; +const privateDirMode = 0o700; +const privateExecutableMode = 0o700; +const privateFileMode = 0o600; +const publicExecutableMode = 0o755; +let ownedGlobalProfileTakeovers: GlobalProfileTakeoverRecord[] | undefined; + +type GlobalProfileTakeoverRecord = { + agent: ProfileClientKind; + codexHome?: string; + configFile?: string; + id: string; + name: string; + providerId?: string; + settingsFile?: string; +}; + +export async function applyProfileConfig(config: AppConfig): Promise { + cleanupGeneratedBinBackups(); + const appliedAt = new Date().toISOString(); + const profiles = profileEntries(config); + const result: ProfileApplyResult = { + appliedAt, + clients: [], + enabled: profiles.some((profile) => profile.enabled) + }; + const takeoverStatuses = synchronizeGlobalProfileTakeovers( + profiles, + result.enabled && hasAvailableGatewayModels(config) + ); + + if (!result.enabled) { + result.clients = profiles.map(disabledProfileStatus); + result.clients.push(...takeoverStatuses); + result.clients.push(...restoreInactiveGlobalProfileConfigs(profiles)); + return result; + } + + if (!hasAvailableGatewayModels(config)) { + const managedCleanupResult = cleanupManagedClaudeCodeToolHubArtifacts(profiles, { includeActive: true }); + result.clients = profiles.map((profile) => { + const cleanupResult = profile.agent === "claude-code" + ? cleanupClaudeCodeToolHubArtifacts(profile) + : { ok: true }; + const status = profile.enabled + ? unavailableModelStatus(profile, profilePath(profile)) + : disabledProfileStatus(profile); + const cleanupMessage = [managedCleanupResult, cleanupResult] + .filter((item) => !item.ok) + .map((item) => item.message) + .filter(Boolean) + .join("; "); + return cleanupMessage + ? { + ...status, + message: `${status.message} Failed to clean stale ToolHub config: ${cleanupMessage}` + } + : status; + }); + result.clients.push(...takeoverStatuses); + result.clients.push(...restoreInactiveGlobalProfileConfigs(profiles)); + return result; + } + + const profileApiKeys = await ensureProfileApiKeys(config, profiles); + + for (const profile of profiles) { + const token = profileApiKeys.get(profile.id) ?? fallbackClientToken; + result.clients.push( + profile.agent === "claude-code" + ? applyClaudeCodeProfile(config, profile, token, appliedAt) + : profile.agent === "zcode" + ? applyZcodeProfile(config, profile, token, appliedAt) + : applyCodexProfile(config, profile, token, appliedAt) + ); + } + result.clients.push(...takeoverStatuses); + cleanupManagedClaudeCodeToolHubArtifacts(profiles, { includeActive: false }); + result.clients.push(...restoreInactiveGlobalProfileConfigs(profiles)); + return result; +} + +function cleanupManagedClaudeCodeToolHubArtifacts( + profiles: ProfileConfig[], + options: { includeActive: boolean } +): { changed?: boolean; message?: string; ok: boolean } { + const activeToolHubFiles = new Set(profiles + .filter((profile) => profile.agent === "claude-code") + .map((profile) => normalizedFileKey(claudeCodeToolHubMcpConfigFile(profile)))); + const activeGeneratedSettingsFiles = new Set(profiles + .filter((profile) => profile.agent === "claude-code" && isGeneratedProfileScope(profile.scope)) + .map((profile) => normalizedFileKey(resolveClaudeCodeSettingsFile(profile)))); + const errors: string[] = []; + let changed = false; + + for (const file of managedClaudeCodeToolHubMcpConfigFiles()) { + if (!options.includeActive && activeToolHubFiles.has(normalizedFileKey(file))) { + continue; + } + try { + rmSync(file, { force: true }); + changed = true; + } catch (error) { + errors.push(`${file}: ${formatError(error)}`); + } + } + + for (const file of managedClaudeCodeSettingsFiles()) { + if (!options.includeActive && activeGeneratedSettingsFiles.has(normalizedFileKey(file))) { + continue; + } + try { + changed = cleanupClaudeCodeToolHubSettingsFile(file, { backup: false }).changed || changed; + } catch (error) { + errors.push(`${file}: ${formatError(error)}`); + } + } + + return errors.length > 0 + ? { changed, message: errors.join("; "), ok: false } + : { changed, ok: true }; +} + +function managedClaudeCodeToolHubMcpConfigFiles(): string[] { + return managedClaudeCodeGeneratedFiles("toolhub-mcp.json"); +} + +function managedClaudeCodeSettingsFiles(): string[] { + return managedClaudeCodeGeneratedFiles("settings.json"); +} + +function managedClaudeCodeGeneratedFiles(fileName: string): string[] { + const profilesDir = path.join(CONFIGDIR, "profiles"); + let entries; + try { + entries = readdirSync(profilesDir, { withFileTypes: true }); + } catch { + return []; + } + const files: string[] = []; + for (const entry of entries) { + if (!entry.isDirectory()) { + continue; + } + const profileDir = path.join(profilesDir, entry.name); + for (const file of [ + path.join(profileDir, "claude", fileName), + path.join(profileDir, "custom", "claude", fileName) + ]) { + if (existsSync(file)) { + files.push(file); + } + } + } + return files; +} + +function normalizedFileKey(file: string): string { + const normalized = path.resolve(file); + return process.platform === "win32" ? normalized.toLowerCase() : normalized; +} + +function cleanupClaudeCodeToolHubSettingsFile(file: string, options: { backup: boolean }): { changed: boolean } { + const settings = readJsonObject(file); + const env = isRecord(settings.env) ? { ...settings.env } : {}; + if (!deleteClaudeCodeToolHubEnv(env)) { + return { changed: false }; + } + const content = `${JSON.stringify({ ...settings, env }, null, 2)}\n`; + const writeResult = options.backup + ? writeFileWithBackup(file, content, { mode: privateFileMode }) + : writeGeneratedFileIfChanged(file, content, { mode: privateFileMode }); + return { changed: writeResult.changed }; +} + +function deleteClaudeCodeToolHubEnv(env: Record): boolean { + let changed = false; + for (const key of [CLAUDE_CODE_MCP_CONFIG_ENV, CODEXL_CLAUDE_CODE_MCP_CONFIG_ENV]) { + if (key in env) { + delete env[key]; + changed = true; + } + } + return changed; +} + +function cleanupClaudeCodeToolHubArtifacts(profile: ProfileConfig): { changed?: boolean; message?: string; ok: boolean } { + try { + let changed = false; + const mcpConfigFile = claudeCodeToolHubMcpConfigFile(profile); + if (existsSync(mcpConfigFile)) { + rmSync(mcpConfigFile, { force: true }); + changed = true; + } + changed = cleanupClaudeCodeToolHubSettingsFile(resolveClaudeCodeSettingsFile(profile), { backup: true }).changed || changed; + return { changed, ok: true }; + } catch (error) { + return { + message: formatError(error), + ok: false + }; + } +} + +export function applyProfileRuntimeConfig(config: AppConfig, profile: ProfileConfig, token: string): ProfileClientApplyStatus { + cleanupGeneratedBinBackups(); + const appliedAt = new Date().toISOString(); + return profile.agent === "claude-code" + ? applyClaudeCodeProfile(config, profile, token, appliedAt) + : profile.agent === "zcode" + ? applyZcodeProfile(config, profile, token, appliedAt) + : applyCodexProfile(config, profile, token, appliedAt); +} + +function applyClaudeCodeProfile(config: AppConfig, profile: ProfileConfig, token: string, appliedAt: string): ProfileClientApplyStatus { + const settingsFile = resolveClaudeCodeSettingsFile(profile); + if (!profile.enabled) { + return restoreDisabledGlobalProfile(profile, settingsFile, "Claude Code profile is disabled.", isManagedClaudeCodeSettingsContent); + } + + try { + const endpoint = gatewayEndpoint(config); + const settings = readJsonObject(settingsFile); + const settingsEnv = withoutBotGatewayEnv(Object.fromEntries(stringRecord(settings.env))); + delete settingsEnv[CLAUDE_CODE_MCP_CONFIG_ENV]; + delete settingsEnv[CODEXL_CLAUDE_CODE_MCP_CONFIG_ENV]; + const env = { + ...settingsEnv, + ...profileEnv(profile) + }; + env.ANTHROPIC_BASE_URL = endpoint; + env.ANTHROPIC_API_BASE_URL = endpoint; + env.CLAUDE_AGENT_API_BASE_URL = endpoint; + delete env.ANTHROPIC_AUTH_TOKEN; + delete env.ANTHROPIC_API_KEY; + if (profile.model.trim()) { + const model = normalizeClientModel(profile.model); + env.ANTHROPIC_MODEL = model; + env.CCR_CLAUDE_CODE_MODEL = model; + env.CODEXL_CLAUDE_CODE_MODEL = model; + } else { + delete env.ANTHROPIC_MODEL; + delete env.CCR_CLAUDE_CODE_MODEL; + delete env.CODEXL_CLAUDE_CODE_MODEL; + } + if (profile.smallFastModel?.trim()) { + env.ANTHROPIC_SMALL_FAST_MODEL = normalizeClientModel(profile.smallFastModel); + } else { + delete env.ANTHROPIC_SMALL_FAST_MODEL; + } + const toolHubMcpConfigResult = writeClaudeCodeToolHubMcpConfig(config, profile, token); + Object.assign(env, claudeCodeMcpConfigEnv(toolHubMcpConfigResult.file), claudeCodeUtcTimezoneEnvOverride()); + + const helperResult = writeClaudeCodeApiKeyHelper(profile, token); + const wrapperResult = writeClaudeCodeWrapper(config, profile, helperResult.file, toolHubMcpConfigResult.file); + const nextSettings = { + ...settings, + apiKeyHelper: process.platform === "win32" ? `"${helperResult.file}"` : helperResult.file, + env + }; + const writeResult = writeFileWithBackup(settingsFile, `${JSON.stringify(nextSettings, null, 2)}\n`, { mode: privateFileMode }); + const changed = writeResult.changed || helperResult.changed || wrapperResult.changed || toolHubMcpConfigResult.changed; + return { + appliedAt, + backupFile: writeResult.backupFile ?? helperResult.backupFile ?? wrapperResult.backupFile, + client: "claude-code", + enabled: true, + message: changed + ? `Claude Code settings are managed by CCR (wrapper ${wrapperResult.file}).` + : "Claude Code settings already match CCR.", + ok: true, + path: settingsFile + }; + } catch (error) { + return { + client: "claude-code", + enabled: true, + message: formatError(error), + ok: false, + path: settingsFile + }; + } +} + +function applyCodexProfile(config: AppConfig, profile: ProfileConfig, token: string, appliedAt: string): ProfileClientApplyStatus { + const clientName = codexCompatibleClientName(profile.agent); + const configFile = resolveCodexConfigFile(profile); + if (!profile.enabled) { + return restoreDisabledGlobalProfile( + profile, + configFile, + `${clientName} profile is disabled.`, + (content) => isManagedCodexConfigContent(content, sanitizeCodexProviderId(profile.providerId || "") || "claude-code-router") + ); + } + + try { + const endpoint = `${gatewayEndpoint(config).replace(/\/+$/g, "")}/v1`; + const providerId = sanitizeCodexProviderId(profile.providerId || "") || "claude-code-router"; + const providerName = profile.providerName?.trim() || "Claude Code Router"; + const model = normalizeClientModel(profile.model) || defaultClientModel(config); + const source = existsSync(configFile) ? readFileSync(configFile, "utf8") : ""; + const configFormat = normalizeCodexConfigFormat(profile.configFormat); + const modelCatalogFile = codexModelCatalogFile(configFile); + const modelCatalogResult = writeFileWithBackup(modelCatalogFile, codexModelCatalogJson(config, model)); + const appModelCatalogResult = writeCodexCompatibleAppModelCatalog(CONFIGDIR, { ...profile, model }, config); + const showAllSessions = profile.agent === "zcode" ? false : Boolean(profile.showAllSessions); + const toolHubMcpResult = writeCodexToolHubMcpRuntimeConfig(config, token); + const nextConfig = buildCodexConfigToml(source, { + baseUrl: endpoint, + modelCatalogFile, + configFormat, + model, + providerId, + providerName, + showAllSessions, + token, + toolHubMcp: toolHubMcpResult.runtime + }); + const writeResult = writeFileWithBackup(configFile, nextConfig, { mode: privateFileMode }); + const separateProfileResult = maybeWriteSeparateCodexProfileFile(configFile, source, { + configFormat, + model, + providerId, + showAllSessions + }); + const middlewareResult = profile.cliMiddleware + ? writeCodexCliMiddleware(config, profile, { + configFormat, + configFile, + modelCatalogFile, + model, + providerId + }) + : undefined; + const changed = writeResult.changed || + modelCatalogResult.changed || + appModelCatalogResult.changed || + toolHubMcpResult.changed || + Boolean(separateProfileResult?.changed) || + Boolean(middlewareResult?.changed); + const extras = [ + modelCatalogFile ? `catalog ${modelCatalogFile}` : "", + appModelCatalogResult.file ? `app catalog ${appModelCatalogResult.file}` : "", + toolHubMcpResult.file ? `toolhub runtime ${toolHubMcpResult.file}` : "", + separateProfileResult?.file ? `profile ${separateProfileResult.file}` : "", + middlewareResult?.file ? `middleware ${middlewareResult.file}` : "" + ].filter(Boolean); + return { + appliedAt, + backupFile: writeResult.backupFile, + client: profile.agent, + enabled: true, + message: changed + ? `${clientName} config is managed by CCR${extras.length ? ` (${extras.join(", ")})` : ""}.` + : `${clientName} config already matches CCR.`, + ok: true, + path: configFile + }; + } catch (error) { + return { + client: profile.agent, + enabled: true, + message: formatError(error), + ok: false, + path: configFile + }; + } +} + +function applyZcodeProfile(config: AppConfig, profile: ProfileConfig, token: string, appliedAt: string): ProfileClientApplyStatus { + const configFile = resolveZcodeConfigFile(profile); + if (!profile.enabled) { + return restoreDisabledZcodeProfile(profile, configFile); + } + + try { + const providerId = sanitizeCodexProviderId(profile.providerId || "") || "claude-code-router"; + const model = normalizeClientModel(profile.model) || defaultClientModel(config); + const configResult = writeZcodeGatewayConfig(config, profile, token, { backup: true }); + const middlewareResult = profile.cliMiddleware + ? writeCodexCliMiddleware(config, profile, { + configFile, + configFormat: normalizeCodexConfigFormat(profile.configFormat), + model, + modelCatalogFile: zcodeMiddlewareModelCatalogFile(configFile), + providerId + }) + : undefined; + const changed = configResult.changed || Boolean(middlewareResult?.changed); + const extras = [ + middlewareResult?.file ? `middleware ${middlewareResult.file}` : "" + ].filter(Boolean); + return { + appliedAt, + backupFile: configResult.backupFile, + client: "zcode", + enabled: true, + message: changed + ? `ZCode config is managed by CCR${extras.length ? ` (${extras.join(", ")})` : ""}.` + : "ZCode config already matches CCR.", + ok: true, + path: configResult.file + }; + } catch (error) { + return { + client: "zcode", + enabled: true, + message: formatError(error), + ok: false, + path: configFile + }; + } +} + +function profileEntries(config: AppConfig): ProfileConfig[] { + return enforceSingleEnabledGlobalProfilePerAgent(config.profile.profiles); +} + +async function ensureProfileApiKeys(config: AppConfig, profiles: ProfileConfig[]): Promise> { + const apiKeys = [...(Array.isArray(config.APIKEYS) ? config.APIKEYS : [])]; + const byId = new Map(apiKeys.map((apiKey, index) => [apiKey.id || `key-${index + 1}`, { apiKey, index }])); + const tokens = new Map(); + let changed = false; + + for (const profile of profiles) { + const id = profileApiKeyId(profile); + const name = profileApiKeyName(profile); + const existing = byId.get(id); + if (existing?.apiKey.key.trim()) { + tokens.set(profile.id, existing.apiKey.key.trim()); + if (existing.apiKey.name !== name) { + apiKeys[existing.index] = { + ...existing.apiKey, + name + }; + changed = true; + } + continue; + } + + const apiKey: ApiKeyConfig = { + createdAt: new Date().toISOString(), + id, + key: generateProfileApiKey(), + name + }; + apiKeys.push(apiKey); + byId.set(id, { apiKey, index: apiKeys.length - 1 }); + tokens.set(profile.id, apiKey.key); + changed = true; + } + + if (changed) { + config.APIKEYS = await replacePersistedApiKeys(apiKeys); + config.APIKEY = config.APIKEYS[0]?.key ?? ""; + } + + return tokens; +} + +function profileApiKeyId(profile: ProfileConfig): string { + return `profile:${sanitizeProfilePathSegment(profile.id || profile.name || profile.agent) || "profile"}`; +} + +function profileApiKeyName(profile: ProfileConfig): string { + return `Profile: ${profile.name?.trim() || profile.id || profile.agent}`; +} + +function generateProfileApiKey(): string { + return `ccr-profile-${randomBase64Url(24)}`; +} + +function randomBase64Url(byteLength: number): string { + return randomBytes(byteLength).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, ""); +} + +function profilePath(profile: ProfileConfig): string { + return profile.agent === "claude-code" + ? resolveClaudeCodeSettingsFile(profile) + : resolveCodexConfigFile(profile); +} + +function resolveClaudeCodeSettingsFile(profile: ProfileConfig): string { + if (isGeneratedProfileScope(profile.scope)) { + return path.join(ccrManagedProfileDir(profile), "claude", "settings.json"); + } + return resolveUserPath(profile.settingsFile || "~/.claude/settings.json"); +} + +function claudeCodeToolHubMcpConfigFile(profile: ProfileConfig): string { + return path.join(ccrManagedProfileDir(profile), "claude", "toolhub-mcp.json"); +} + +function writeClaudeCodeToolHubMcpConfig(config: AppConfig, profile: ProfileConfig, token: string): { changed: boolean; file?: string } { + const file = claudeCodeToolHubMcpConfigFile(profile); + const entryPath = path.join(CONFIGDIR, "bin", TOOL_HUB_MCP_RUNTIME_FILE_NAME); + const mcpConfig = toolHubClaudeCodeMcpConfig(config, { + entryPath, + resolver: { + apiKey: token, + baseUrl: `${gatewayEndpoint(config).replace(/\/+$/g, "")}/v1`, + model: toolHubResolverModel(config) + } + }); + if (!mcpConfig) { + if (existsSync(file)) { + rmSync(file, { force: true }); + return { changed: true }; + } + return { changed: false }; + } + + const runtimeResult = ensureToolHubMcpRuntimeFile(entryPath); + const writeResult = writeGeneratedFileIfChanged(file, `${JSON.stringify(mcpConfig, null, 2)}\n`, { mode: privateFileMode }); + return { changed: runtimeResult.changed || writeResult.changed, file }; +} + +function writeCodexToolHubMcpRuntimeConfig(config: AppConfig, token: string): { changed: boolean; file?: string; runtime?: ToolHubMcpRuntimeConfig } { + const entryPath = path.join(CONFIGDIR, "bin", TOOL_HUB_MCP_RUNTIME_FILE_NAME); + const runtime = toolHubMcpRuntimeConfig(config, undefined, { + entryPath, + resolver: { + apiKey: token, + baseUrl: `${gatewayEndpoint(config).replace(/\/+$/g, "")}/v1`, + model: toolHubResolverModel(config) + } + }); + if (!runtime) { + return { changed: false }; + } + + const runtimeResult = ensureToolHubMcpRuntimeFile(entryPath); + return { + changed: runtimeResult.changed, + file: entryPath, + runtime + }; +} + +function ensureToolHubMcpRuntimeFile(file: string): { changed: boolean } { + const source = bundledToolHubMcpEntryPathCandidates().find((candidate) => existsSync(candidate)); + if (!source) { + throw new Error(`ToolHub MCP runtime was not found. Rebuild or reinstall CCR and try again. Checked: ${bundledToolHubMcpEntryPathCandidates().join(", ")}`); + } + return writeGeneratedFileIfChanged(file, readFileSync(source, "utf8"), { mode: publicExecutableMode }); +} + +function resolveCodexConfigFile(profile: ProfileConfig): string { + if (profile.agent === "zcode") { + return resolveZcodeConfigFile(profile); + } + if (isGeneratedProfileScope(profile.scope)) { + return path.join(ccrManagedProfileDir(profile), codexConfigSubdir(profile.agent), "config.toml"); + } + const codexHome = profile.codexHome?.trim(); + if (codexHome) { + return path.join(resolveUserPath(codexHome), "config.toml"); + } + return resolveUserPath(profile.configFile || defaultCodexConfigFile(profile.agent)); +} + +function codexModelCatalogFile(configFile: string): string { + return path.join(path.dirname(configFile), "ccr-model-catalog.json"); +} + +function zcodeMiddlewareModelCatalogFile(configFile: string): string { + return path.join(path.dirname(configFile), "ccr-zcode-middleware-model-catalog.json"); +} + +function ccrManagedProfileDir(profile: ProfileConfig): string { + const slug = sanitizeProfilePathSegment(profile.id || profile.name || profile.agent); + const baseDir = path.join(CONFIGDIR, "profiles", slug || "profile"); + return profile.scope === "custom" ? path.join(baseDir, "custom") : baseDir; +} + +function buildCodexConfigToml( + source: string, + values: { + baseUrl: string; + modelCatalogFile: string; + configFormat: "legacy" | "separate_profile_files"; + model: string; + providerId: string; + providerName: string; + showAllSessions: boolean; + token: string; + toolHubMcp?: ToolHubMcpRuntimeConfig; + } +): string { + let content = removeManagedBlock(source, managedRootStart, managedRootEnd); + content = removeManagedBlock(content, managedProviderStart, managedProviderEnd); + content = removeManagedBlock(content, managedToolHubMcpStart, managedToolHubMcpEnd); + content = removeCodexProviderTable(content, values.providerId); + content = removeCodexMcpServerTable(content, TOOL_HUB_MCP_SERVER_NAME); + if (values.configFormat === "separate_profile_files") { + content = removeCodexProfileTable(content, values.providerId); + } + + const firstTableIndex = firstTomlTableIndex(content); + const rootSource = firstTableIndex === -1 ? content : content.slice(0, firstTableIndex); + const restSource = firstTableIndex === -1 ? "" : content.slice(firstTableIndex); + const cleanedRoot = removeRootTomlKeys(rootSource, ["model", "model_catalog_json", "model_provider", "profile", "show_all_sessions"]); + const rootBlock = [ + managedRootStart, + `model_provider = ${tomlString(values.providerId)}`, + `model = ${tomlString(values.model)}`, + `model_catalog_json = ${tomlString(values.modelCatalogFile)}`, + ...(values.showAllSessions ? ["show_all_sessions = true"] : []), + managedRootEnd, + "" + ].join("\n"); + const providerBlock = [ + "", + managedProviderStart, + `[model_providers.${tomlKey(values.providerId)}]`, + `name = ${tomlString(values.providerName)}`, + `base_url = ${tomlString(values.baseUrl)}`, + `experimental_bearer_token = ${tomlString(values.token)}`, + 'wire_api = "responses"', + managedProviderEnd, + "" + ].join("\n"); + const toolHubMcpBlock = buildCodexToolHubMcpBlock(values.toolHubMcp); + + return `${rootBlock}${trimLeadingBlankLines(cleanedRoot)}${restSource}${providerBlock}${toolHubMcpBlock}`.replace(/\n{4,}/g, "\n\n\n"); +} + +function buildCodexToolHubMcpBlock(runtime: ToolHubMcpRuntimeConfig | undefined): string { + if (!runtime) { + return ""; + } + + const serverTable = `mcp_servers.${tomlKey(TOOL_HUB_MCP_SERVER_NAME)}`; + return [ + "", + managedToolHubMcpStart, + `[${serverTable}]`, + `command = ${tomlString(runtime.command)}`, + `args = ${tomlStringArray(runtime.args)}`, + "", + `[${serverTable}.env]`, + ...Object.entries(runtime.env).map(([key, value]) => `${tomlKey(key)} = ${tomlString(value)}`), + managedToolHubMcpEnd, + "" + ].join("\n"); +} + +function maybeWriteSeparateCodexProfileFile( + configFile: string, + source: string, + values: { + configFormat: "legacy" | "separate_profile_files"; + model: string; + providerId: string; + showAllSessions: boolean; + } +): { changed: boolean; file: string } | undefined { + if (values.configFormat !== "separate_profile_files") { + return undefined; + } + const file = path.join(path.dirname(configFile), `${values.providerId}.config.toml`); + const previous = existsSync(file) + ? readFileSync(file, "utf8") + : legacyCodexProfileTableBody(source, values.providerId); + const next = buildSeparateCodexProfileToml(previous, values); + const writeResult = writeFileWithBackup(file, next, { mode: privateFileMode }); + return { + changed: writeResult.changed, + file + }; +} + +function buildSeparateCodexProfileToml( + source: string, + values: { + model: string; + providerId: string; + showAllSessions: boolean; + } +): string { + const firstTableIndex = firstTomlTableIndex(source); + const rootSource = firstTableIndex === -1 ? source : source.slice(0, firstTableIndex); + const restSource = firstTableIndex === -1 ? "" : source.slice(firstTableIndex); + const cleanedRoot = removeRootTomlKeys(rootSource, ["model", "model_provider", "model_reasoning_effort", "show_all_sessions"]); + const rootBlock = [ + `model_provider = ${tomlString(values.providerId)}`, + `model = ${tomlString(values.model)}`, + `model_reasoning_effort = "xhigh"`, + ...(values.showAllSessions ? ["show_all_sessions = true"] : []), + "" + ].join("\n"); + return ensureTrailingNewline(`${rootBlock}${trimLeadingBlankLines(cleanedRoot)}${restSource}`.replace(/\n{4,}/g, "\n\n\n")); +} + +function writeClaudeCodeApiKeyHelper(profile: ProfileConfig, token: string): { backupFile?: string; changed: boolean; file: string } { + const binDir = path.join(CONFIGDIR, "bin"); + mkdirSync(binDir, { mode: privateDirMode, recursive: true }); + const file = path.join(binDir, claudeCodeApiKeyHelperFilename(profile)); + const content = process.platform === "win32" + ? claudeCodeApiKeyHelperCmdScript(token) + : claudeCodeApiKeyHelperShellScript(token); + const writeResult = writeGeneratedFileIfChanged(file, content, { mode: privateExecutableMode }); + return { + changed: writeResult.changed, + file + }; +} + +function claudeCodeApiKeyHelperFilename(profile: ProfileConfig): string { + const slug = sanitizeProfilePathSegment(profile.id || profile.name || profile.agent) || "claude-code"; + return process.platform === "win32" + ? `ccr-claude-code-api-key-${slug}.cmd` + : `ccr-claude-code-api-key-${slug}`; +} + +function claudeCodeApiKeyHelperShellScript(token: string): string { + return [ + "#!/bin/sh", + `printf '%s\\n' ${shellQuote(token)}`, + "" + ].join("\n"); +} + +function claudeCodeApiKeyHelperCmdScript(token: string): string { + return [ + "@echo off", + `echo ${cmdValue(token)}`, + "" + ].join("\r\n"); +} + +function writeClaudeCodeWrapper(config: AppConfig, profile: ProfileConfig, apiKeyHelperFile: string, mcpConfigFile: string | undefined): { backupFile?: string; changed: boolean; file: string } { + const binDir = path.join(CONFIGDIR, "bin"); + mkdirSync(binDir, { mode: privateDirMode, recursive: true }); + const runtimeFile = path.join(binDir, codexMiddlewareRuntimeFilename()); + const runtimeResult = writeGeneratedFileIfChanged(runtimeFile, codexCliMiddlewareRuntimeScript(), { mode: publicExecutableMode }); + const file = path.join(binDir, claudeCodeWrapperFilename(profile)); + const content = process.platform === "win32" + ? claudeCodeWrapperCmdScript(config, profile, runtimeFile, apiKeyHelperFile, mcpConfigFile) + : claudeCodeWrapperShellScript(config, profile, runtimeFile, apiKeyHelperFile, mcpConfigFile); + const writeResult = writeGeneratedFileIfChanged(file, content, { mode: privateExecutableMode }); + return { + changed: writeResult.changed || runtimeResult.changed, + file + }; +} + +function claudeCodeWrapperFilename(profile: ProfileConfig): string { + const slug = sanitizeProfilePathSegment(profile.id || profile.name || profile.agent).toLowerCase() || "claude-code"; + return process.platform === "win32" + ? `ccr-claude-code-wrapper-${slug}.cmd` + : `ccr-claude-code-wrapper-${slug}`; +} + +function claudeCodeWrapperShellScript(config: AppConfig, profile: ProfileConfig, runtimeFile: string, apiKeyHelperFile: string, mcpConfigFile: string | undefined): string { + const realClaude = profile.env?.CCR_CLAUDE_CODE_BIN?.trim() || "claude"; + const surface = normalizeProfileSurface(profile.surface); + const remoteEndpoint = `${gatewayEndpoint(config)}/__ccr/remote`; + const settingsDir = path.dirname(resolveClaudeCodeSettingsFile(profile)); + const envExports = Object.entries(profileEnv(profile)) + .filter(([key]) => key !== "CCR_CLAUDE_CODE_BIN") + .map(([key, value]) => `export ${key}=${shellQuote(value)}`); + const botEnvExports = shellBotGatewayEnvExports(config, profile); + return [ + "#!/bin/sh", + ...envExports, + ...shellEnvExports(claudeCodeRuntimeEnv(config, profile, settingsDir)), + ...shellEnvExports(claudeCodeMcpConfigEnv(mcpConfigFile)), + ...shellEnvExports(claudeCodeUtcTimezoneEnvOverride()), + `: "\${CCR_PROFILE_SURFACE:=${surface}}"`, + "export CCR_PROFILE_SURFACE", + ...botEnvExports, + `export CCR_CLAUDE_CODE_WRAPPER=1`, + `export CCR_REAL_CLAUDE_CODE_BIN=${shellQuote(realClaude)}`, + `export CODEXL_CLAUDE_CODE_BIN=${shellQuote(realClaude)}`, + `if [ -z "\${CCR_REMOTE_SYNC_ENABLED:-}" ]; then CCR_REMOTE_SYNC_ENABLED=1; fi`, + `if [ -z "\${CCR_REMOTE_SYNC_ENDPOINT:-}" ]; then CCR_REMOTE_SYNC_ENDPOINT=${shellQuote(remoteEndpoint)}; fi`, + `if [ -z "\${CCR_REMOTE_SYNC_API_KEY_HELPER:-}" ]; then CCR_REMOTE_SYNC_API_KEY_HELPER=${shellQuote(apiKeyHelperFile)}; fi`, + `if [ -z "\${CCR_REMOTE_SYNC_PROFILE_ID:-}" ]; then CCR_REMOTE_SYNC_PROFILE_ID=${shellQuote(profile.id || profile.name || "claude-code")}; fi`, + `if [ -z "\${CCR_REMOTE_SYNC_PROFILE_NAME:-}" ]; then CCR_REMOTE_SYNC_PROFILE_NAME=${shellQuote(profile.name || profile.id || "Claude Code")}; fi`, + "export CCR_REMOTE_SYNC_ENABLED CCR_REMOTE_SYNC_ENDPOINT CCR_REMOTE_SYNC_API_KEY_HELPER CCR_REMOTE_SYNC_PROFILE_ID CCR_REMOTE_SYNC_PROFILE_NAME", + ...nodeRuntimeShellExecLines(runtimeFile), + "" + ].join("\n"); +} + +function claudeCodeWrapperCmdScript(config: AppConfig, profile: ProfileConfig, runtimeFile: string, apiKeyHelperFile: string, mcpConfigFile: string | undefined): string { + const realClaude = profile.env?.CCR_CLAUDE_CODE_BIN?.trim() || "claude"; + const surface = normalizeProfileSurface(profile.surface); + const remoteEndpoint = `${gatewayEndpoint(config)}/__ccr/remote`; + const settingsDir = path.dirname(resolveClaudeCodeSettingsFile(profile)); + const envExports = Object.entries(profileEnv(profile)) + .filter(([key]) => key !== "CCR_CLAUDE_CODE_BIN") + .map(([key, value]) => cmdSetLine(key, value)); + const botEnvExports = cmdBotGatewayEnvExports(config, profile); + return [ + "@echo off", + ...envExports, + ...cmdEnvExports(claudeCodeRuntimeEnv(config, profile, settingsDir)), + ...cmdEnvExports(claudeCodeMcpConfigEnv(mcpConfigFile)), + ...cmdEnvExports(claudeCodeUtcTimezoneEnvOverride()), + `if not defined CCR_PROFILE_SURFACE ${cmdSetLine("CCR_PROFILE_SURFACE", surface)}`, + ...botEnvExports, + cmdSetLine("CCR_CLAUDE_CODE_WRAPPER", "1"), + cmdSetLine("CCR_REAL_CLAUDE_CODE_BIN", realClaude), + cmdSetLine("CODEXL_CLAUDE_CODE_BIN", realClaude), + `if not defined CCR_REMOTE_SYNC_ENABLED ${cmdSetLine("CCR_REMOTE_SYNC_ENABLED", "1")}`, + `if not defined CCR_REMOTE_SYNC_ENDPOINT ${cmdSetLine("CCR_REMOTE_SYNC_ENDPOINT", remoteEndpoint)}`, + `if not defined CCR_REMOTE_SYNC_API_KEY_HELPER ${cmdSetLine("CCR_REMOTE_SYNC_API_KEY_HELPER", apiKeyHelperFile)}`, + `if not defined CCR_REMOTE_SYNC_PROFILE_ID ${cmdSetLine("CCR_REMOTE_SYNC_PROFILE_ID", profile.id || profile.name || "claude-code")}`, + `if not defined CCR_REMOTE_SYNC_PROFILE_NAME ${cmdSetLine("CCR_REMOTE_SYNC_PROFILE_NAME", profile.name || profile.id || "Claude Code")}`, + ...nodeRuntimeCmdExecLines(runtimeFile), + "" + ].join("\r\n"); +} + +function writeCodexCliMiddleware( + config: AppConfig, + profile: ProfileConfig, + values: { + configFormat: "legacy" | "separate_profile_files"; + configFile: string; + modelCatalogFile: string; + model: string; + providerId: string; + } +): { changed: boolean; file: string } { + const binDir = path.join(CONFIGDIR, "bin"); + mkdirSync(binDir, { mode: privateDirMode, recursive: true }); + const runtimeFile = path.join(binDir, codexMiddlewareRuntimeFilename()); + const runtimeResult = writeGeneratedFileIfChanged(runtimeFile, codexCliMiddlewareRuntimeScript(), { mode: publicExecutableMode }); + const file = path.join(binDir, codexMiddlewareFilename(profile, values.providerId)); + const content = process.platform === "win32" + ? codexMiddlewareCmdScript(config, profile, values, runtimeFile) + : codexMiddlewareShellScript(config, profile, values, runtimeFile); + const writeResult = writeGeneratedFileIfChanged(file, content, { mode: privateExecutableMode }); + return { + changed: writeResult.changed || runtimeResult.changed, + file + }; +} + +function claudeCodeRuntimeEnv(config: AppConfig, profile: ProfileConfig, settingsDir: string): Record { + const endpoint = gatewayEndpoint(config); + const env: Record = { + ANTHROPIC_API_BASE_URL: endpoint, + ANTHROPIC_BASE_URL: endpoint, + CLAUDE_AGENT_API_BASE_URL: endpoint, + CLAUDE_CONFIG_DIR: settingsDir + }; + const model = normalizeClientModel(profile.model); + if (model) { + env.ANTHROPIC_MODEL = model; + env.CCR_CLAUDE_CODE_MODEL = model; + env.CODEXL_CLAUDE_CODE_MODEL = model; + } + const smallFastModel = normalizeClientModel(profile.smallFastModel); + if (smallFastModel) { + env.ANTHROPIC_SMALL_FAST_MODEL = smallFastModel; + } + return env; +} + +function codexMiddlewareRuntimeFilename(): string { + return "ccr-codex-cli-middleware.js"; +} + +function codexMiddlewareFilename(profile: ProfileConfig, providerId: string): string { + const slug = sanitizeCodexProviderId(profile.id || profile.name || providerId) || "codex"; + return process.platform === "win32" + ? `ccr-codex-cli-stdio-${slug}.cmd` + : `ccr-codex-cli-stdio-${slug}`; +} + +function shellProfileSurfaceExports(surface: "auto" | "cli" | "app"): string[] { + return [ + "if [ -z \"${CCR_PROFILE_SURFACE:-}\" ]; then", + " case \"${1:-}\" in", + " app|app-server) CCR_PROFILE_SURFACE=app ;;", + ` *) CCR_PROFILE_SURFACE=${shellQuote(surface)} ;;`, + " esac", + "fi", + "export CCR_PROFILE_SURFACE" + ]; +} + +function shellCodexlProfileSurfaceExports(): string[] { + return [ + "if [ -z \"${CODEXL_PROFILE_SURFACE:-}\" ]; then", + " CODEXL_PROFILE_SURFACE=$CCR_PROFILE_SURFACE", + "fi", + "export CODEXL_PROFILE_SURFACE" + ]; +} + +function nodeRuntimeShellExecLines(runtimeFile: string): string[] { + return [ + "if [ -n \"${CCR_NODE_BIN:-}\" ]; then", + ` exec "$CCR_NODE_BIN" ${shellQuote(runtimeFile)} "$@"`, + "fi", + "if command -v node >/dev/null 2>&1; then", + ` exec node ${shellQuote(runtimeFile)} "$@"`, + "fi", + `ELECTRON_RUN_AS_NODE=1 exec ${shellQuote(process.execPath)} ${shellQuote(runtimeFile)} "$@"` + ]; +} + +function codexMiddlewareShellScript( + config: AppConfig, + profile: ProfileConfig, + values: { + configFormat: "legacy" | "separate_profile_files"; + configFile: string; + modelCatalogFile: string; + model: string; + providerId: string; + }, + runtimeFile: string +): string { + const codexCli = profile.codexCliPath?.trim() || defaultCodexCliCommand(profile.agent); + const codexHome = profile.codexHome?.trim() || defaultCodexCompatibleHome(profile.agent, values.configFile); + const resolvedCodexHome = resolveUserPath(codexHome); + const remoteFrontendMode = normalizeCodexRemoteFrontendMode(profile.remoteFrontendMode); + const surface = profile.agent === "zcode" ? "app" : normalizeProfileSurface(profile.surface); + const envExports = Object.entries(profileEnv(profile)).map(([key, value]) => `export ${key}=${shellQuote(value)}`); + const botEnvExports = shellBotGatewayEnvExports(config, profile); + const agentEnvExports = profile.agent === "zcode" + ? [ + `export ZCODE_HOME=${shellQuote(resolvedCodexHome)}`, + `export ZCODE_STORAGE_DIR=${shellQuote(resolvedCodexHome)}`, + "if [ -z \"${CCR_REAL_ZCODE_CLI_PATH:-}\" ]; then", + ` CCR_REAL_ZCODE_CLI_PATH=${shellQuote(codexCli)}`, + "fi", + "export CCR_REAL_ZCODE_CLI_PATH", + `export CCR_ZCODE_PROFILE=${shellQuote(values.providerId)}`, + `export CCR_ZCODE_MODEL=${shellQuote(values.model)}`, + `export CCR_ZCODE_MODEL_CATALOG_FILE=${shellQuote(values.modelCatalogFile)}`, + `export CCR_ZCODE_MODEL_PROVIDER=${shellQuote(values.providerId)}`, + `export CCR_ZCODE_PROFILE_CONFIG_FORMAT=${shellQuote(values.configFormat)}`, + `export CCR_PROFILE_SCOPE=${shellQuote(normalizeProfileScope(profile.scope))}`, + `export CCR_ZCODE_REMOTE_FRONTEND_MODE=${shellQuote(remoteFrontendMode)}`, + "if [ -z \"${CODEXL_REAL_ZCODE_CLI_PATH:-}\" ]; then", + " CODEXL_REAL_ZCODE_CLI_PATH=$CCR_REAL_ZCODE_CLI_PATH", + "fi", + "export CODEXL_REAL_ZCODE_CLI_PATH", + `export CODEXL_ZCODE_PROFILE=${shellQuote(values.providerId)}`, + `export CODEXL_ZCODE_MODEL_CATALOG_FILE=${shellQuote(values.modelCatalogFile)}`, + `export CODEXL_ZCODE_MODEL_PROVIDER=${shellQuote(values.providerId)}`, + `export CODEXL_ZCODE_WORKSPACE_NAME=${shellQuote(profile.name || values.providerId)}`, + `export CODEXL_ZCODE_PROFILE_CONFIG_FORMAT=${shellQuote(values.configFormat)}`, + `export CODEXL_ZCODE_CORE_MODE=${shellQuote(remoteFrontendMode)}` + ] + : [ + `export CODEX_HOME=${shellQuote(resolvedCodexHome)}`, + "if [ -z \"${CCR_REAL_CODEX_CLI_PATH:-}\" ]; then", + ` CCR_REAL_CODEX_CLI_PATH=${shellQuote(codexCli)}`, + "fi", + "export CCR_REAL_CODEX_CLI_PATH", + `export CCR_CODEX_PROFILE=${shellQuote(values.providerId)}`, + `export CCR_CODEX_MODEL=${shellQuote(values.model)}`, + `export CCR_CODEX_MODEL_CATALOG_FILE=${shellQuote(values.modelCatalogFile)}`, + `export CCR_CODEX_MODEL_PROVIDER=${shellQuote(values.providerId)}`, + `export CCR_CODEX_PROFILE_CONFIG_FORMAT=${shellQuote(values.configFormat)}`, + `export CCR_PROFILE_SCOPE=${shellQuote(normalizeProfileScope(profile.scope))}`, + `export CCR_CODEX_REMOTE_FRONTEND_MODE=${shellQuote(remoteFrontendMode)}`, + "if [ -z \"${CODEXL_REAL_CODEX_CLI_PATH:-}\" ]; then", + " CODEXL_REAL_CODEX_CLI_PATH=$CCR_REAL_CODEX_CLI_PATH", + "fi", + "export CODEXL_REAL_CODEX_CLI_PATH", + `export CODEXL_CODEX_PROFILE=${shellQuote(values.providerId)}`, + `export CODEXL_CODEX_MODEL_CATALOG_FILE=${shellQuote(values.modelCatalogFile)}`, + `export CODEXL_CODEX_MODEL_PROVIDER=${shellQuote(values.providerId)}`, + `export CODEXL_CODEX_WORKSPACE_NAME=${shellQuote(profile.name || values.providerId)}`, + `export CODEXL_CODEX_PROFILE_CONFIG_FORMAT=${shellQuote(values.configFormat)}`, + `export CODEXL_CODEX_CORE_MODE=${shellQuote(remoteFrontendMode)}` + ]; + return [ + "#!/bin/sh", + ...envExports, + ...agentEnvExports, + ...shellProfileSurfaceExports(surface), + ...botEnvExports, + ...shellCodexlProfileSurfaceExports(), + ...nodeRuntimeShellExecLines(runtimeFile), + "" + ].join("\n"); +} + +function cmdProfileSurfaceExports(surface: "auto" | "cli" | "app"): string[] { + return [ + "if not defined CCR_PROFILE_SURFACE (", + " if \"%~1\"==\"app\" (", + cmdSetLine("CCR_PROFILE_SURFACE", "app", " "), + " ) else if \"%~1\"==\"app-server\" (", + cmdSetLine("CCR_PROFILE_SURFACE", "app", " "), + " ) else (", + cmdSetLine("CCR_PROFILE_SURFACE", surface, " "), + " )", + ")" + ]; +} + +function cmdCodexlProfileSurfaceExports(): string[] { + return [ + "if not defined CODEXL_PROFILE_SURFACE set \"CODEXL_PROFILE_SURFACE=%CCR_PROFILE_SURFACE%\"" + ]; +} + +function nodeRuntimeCmdExecLines(runtimeFile: string): string[] { + const quotedRuntime = cmdQuote(runtimeFile); + const quotedHost = cmdQuote(process.execPath); + return [ + "if not defined CCR_NODE_BIN goto ccr_try_system_node", + `"%CCR_NODE_BIN%" ${quotedRuntime} %*`, + "exit /b %ERRORLEVEL%", + ":ccr_try_system_node", + "where node >nul 2>nul", + "if errorlevel 1 goto ccr_use_electron_node", + `node ${quotedRuntime} %*`, + "exit /b %ERRORLEVEL%", + ":ccr_use_electron_node", + "set \"ELECTRON_RUN_AS_NODE=1\"", + `${quotedHost} ${quotedRuntime} %*`, + "exit /b %ERRORLEVEL%" + ]; +} + +function codexMiddlewareCmdScript( + config: AppConfig, + profile: ProfileConfig, + values: { + configFormat: "legacy" | "separate_profile_files"; + configFile: string; + modelCatalogFile: string; + model: string; + providerId: string; + }, + runtimeFile: string +): string { + const codexCli = profile.codexCliPath?.trim() || defaultCodexCliCommand(profile.agent); + const codexHome = profile.codexHome?.trim() || defaultCodexCompatibleHome(profile.agent, values.configFile); + const resolvedCodexHome = resolveUserPath(codexHome); + const remoteFrontendMode = normalizeCodexRemoteFrontendMode(profile.remoteFrontendMode); + const surface = profile.agent === "zcode" ? "app" : normalizeProfileSurface(profile.surface); + const workspaceName = profile.name || values.providerId; + const envExports = Object.entries(profileEnv(profile)).map(([key, value]) => cmdSetLine(key, value)); + const botEnvExports = cmdBotGatewayEnvExports(config, profile); + const agentEnvExports = profile.agent === "zcode" + ? [ + cmdSetLine("ZCODE_HOME", resolvedCodexHome), + cmdSetLine("ZCODE_STORAGE_DIR", resolvedCodexHome), + `if not defined CCR_REAL_ZCODE_CLI_PATH ${cmdSetLine("CCR_REAL_ZCODE_CLI_PATH", codexCli)}`, + cmdSetLine("CCR_ZCODE_PROFILE", values.providerId), + cmdSetLine("CCR_ZCODE_MODEL", values.model), + cmdSetLine("CCR_ZCODE_MODEL_CATALOG_FILE", values.modelCatalogFile), + cmdSetLine("CCR_ZCODE_MODEL_PROVIDER", values.providerId), + cmdSetLine("CCR_ZCODE_PROFILE_CONFIG_FORMAT", values.configFormat), + cmdSetLine("CCR_PROFILE_SCOPE", normalizeProfileScope(profile.scope)), + cmdSetLine("CCR_ZCODE_REMOTE_FRONTEND_MODE", remoteFrontendMode), + "if not defined CODEXL_REAL_ZCODE_CLI_PATH set \"CODEXL_REAL_ZCODE_CLI_PATH=%CCR_REAL_ZCODE_CLI_PATH%\"", + cmdSetLine("CODEXL_ZCODE_PROFILE", values.providerId), + cmdSetLine("CODEXL_ZCODE_MODEL_CATALOG_FILE", values.modelCatalogFile), + cmdSetLine("CODEXL_ZCODE_MODEL_PROVIDER", values.providerId), + cmdSetLine("CODEXL_ZCODE_WORKSPACE_NAME", workspaceName), + cmdSetLine("CODEXL_ZCODE_PROFILE_CONFIG_FORMAT", values.configFormat), + cmdSetLine("CODEXL_ZCODE_CORE_MODE", remoteFrontendMode) + ] + : [ + cmdSetLine("CODEX_HOME", resolvedCodexHome), + `if not defined CCR_REAL_CODEX_CLI_PATH ${cmdSetLine("CCR_REAL_CODEX_CLI_PATH", codexCli)}`, + cmdSetLine("CCR_CODEX_PROFILE", values.providerId), + cmdSetLine("CCR_CODEX_MODEL", values.model), + cmdSetLine("CCR_CODEX_MODEL_CATALOG_FILE", values.modelCatalogFile), + cmdSetLine("CCR_CODEX_MODEL_PROVIDER", values.providerId), + cmdSetLine("CCR_CODEX_PROFILE_CONFIG_FORMAT", values.configFormat), + cmdSetLine("CCR_PROFILE_SCOPE", normalizeProfileScope(profile.scope)), + cmdSetLine("CCR_CODEX_REMOTE_FRONTEND_MODE", remoteFrontendMode), + "if not defined CODEXL_REAL_CODEX_CLI_PATH set \"CODEXL_REAL_CODEX_CLI_PATH=%CCR_REAL_CODEX_CLI_PATH%\"", + cmdSetLine("CODEXL_CODEX_PROFILE", values.providerId), + cmdSetLine("CODEXL_CODEX_MODEL_CATALOG_FILE", values.modelCatalogFile), + cmdSetLine("CODEXL_CODEX_MODEL_PROVIDER", values.providerId), + cmdSetLine("CODEXL_CODEX_WORKSPACE_NAME", workspaceName), + cmdSetLine("CODEXL_CODEX_PROFILE_CONFIG_FORMAT", values.configFormat), + cmdSetLine("CODEXL_CODEX_CORE_MODE", remoteFrontendMode) + ]; + return [ + "@echo off", + ...envExports, + ...agentEnvExports, + ...cmdProfileSurfaceExports(surface), + ...botEnvExports, + ...cmdCodexlProfileSurfaceExports(), + ...nodeRuntimeCmdExecLines(runtimeFile), + "" + ].join("\r\n"); +} + +function shellBotGatewayEnvExports(config: AppConfig, profile: ProfileConfig): string[] { + return [ + 'if [ "$CCR_PROFILE_SURFACE" = "app" ]; then', + ...Object.entries(botGatewayProfileEnv(config, profile, "app")).map(([key, value]) => ` export ${key}=${shellQuote(value)}`), + "else", + ...Object.entries(botGatewayProfileEnv(config, profile, "cli")).map(([key, value]) => ` export ${key}=${shellQuote(value)}`), + "fi" + ]; +} + +function shellEnvExports(env: Record): string[] { + return Object.entries(env).map(([key, value]) => `export ${key}=${shellQuote(value)}`); +} + +function cmdBotGatewayEnvExports(config: AppConfig, profile: ProfileConfig): string[] { + return [ + `if /I "%CCR_PROFILE_SURFACE%"=="app" (`, + ...Object.entries(botGatewayProfileEnv(config, profile, "app")).map(([key, value]) => cmdSetLine(key, value, " ")), + ") else (", + ...Object.entries(botGatewayProfileEnv(config, profile, "cli")).map(([key, value]) => cmdSetLine(key, value, " ")), + ")" + ]; +} + +function cmdEnvExports(env: Record): string[] { + return Object.entries(env).map(([key, value]) => cmdSetLine(key, value)); +} + +function withoutBotGatewayEnv(values: Record): Record { + return Object.fromEntries(Object.entries(values).filter(([key]) => !isBotGatewayEnvKey(key))); +} + +function isBotGatewayEnvKey(key: string): boolean { + return key === "BOT_GATEWAY_STATE_DIR" || + key.startsWith("CCR_BOT_") || + key.startsWith("CODEXL_BOT_") || + key === "CCR_BOT_GATEWAY_SDK_MODULE"; +} + +function removeRootTomlKeys(source: string, keys: string[]): string { + const keyPattern = keys.map(escapeRegExp).join("|"); + const pattern = new RegExp(`^\\s*(?:${keyPattern})\\s*=.*(?:\\n|$)`, "gm"); + return source.replace(pattern, ""); +} + +function removeCodexProviderTable(source: string, providerId: string): string { + return removeTomlTable(source, "model_providers", providerId); +} + +function removeCodexProfileTable(source: string, providerId: string): string { + return removeTomlTable(source, "profiles", providerId); +} + +function removeCodexMcpServerTable(source: string, serverName: string): string { + const lines = source.split(/(?<=\n)/); + const headers = new Set([ + `[mcp_servers.${serverName}]`, + `[mcp_servers.${tomlQuotedKey(serverName)}]`, + `[mcp_servers.${serverName}.env]`, + `[mcp_servers.${tomlQuotedKey(serverName)}.env]` + ]); + const kept: string[] = []; + for (let index = 0; index < lines.length; index += 1) { + const line = lines[index]; + if (!headers.has(line.trim())) { + kept.push(line); + continue; + } + + index += 1; + while (index < lines.length && !/^\s*\[/.test(lines[index])) { + index += 1; + } + index -= 1; + } + return kept.join(""); +} + +function removeTomlTable(source: string, section: string, name: string): string { + const lines = source.split(/(?<=\n)/); + const headers = new Set([ + `[${section}.${name}]`, + `[${section}.${tomlQuotedKey(name)}]` + ]); + const kept: string[] = []; + for (let index = 0; index < lines.length; index += 1) { + const line = lines[index]; + if (!headers.has(line.trim())) { + kept.push(line); + continue; + } + + index += 1; + while (index < lines.length && !/^\s*\[/.test(lines[index])) { + index += 1; + } + index -= 1; + } + return kept.join(""); +} + +function legacyCodexProfileTableBody(source: string, providerId: string): string { + const headers = new Set([ + `[profiles.${providerId}]`, + `[profiles.${tomlQuotedKey(providerId)}]` + ]); + const lines: string[] = []; + let inTarget = false; + for (const line of source.split(/\r?\n/)) { + const trimmed = line.trim(); + if (/^\s*\[/.test(trimmed)) { + if (inTarget) { + break; + } + inTarget = headers.has(trimmed); + continue; + } + if (inTarget) { + lines.push(line); + } + } + return lines.join("\n").trim(); +} + +function removeManagedBlock(source: string, start: string, end: string): string { + const pattern = new RegExp(`\\n?${escapeRegExp(start)}[\\s\\S]*?${escapeRegExp(end)}\\n?`, "g"); + return source.replace(pattern, "\n"); +} + +function firstTomlTableIndex(source: string): number { + const match = source.match(/^\s*\[/m); + return match?.index ?? -1; +} + +function readJsonObject(file: string): Record { + if (!existsSync(file)) { + return {}; + } + try { + const parsed = JSON.parse(readFileSync(file, "utf8")) as unknown; + return isRecord(parsed) ? parsed : {}; + } catch { + return {}; + } +} + +function writeFileWithBackup( + file: string, + content: string, + options: { mode?: number } = {} +): { backupFile?: string; changed: boolean } { + mkdirSync(path.dirname(file), { recursive: true }); + const previous = existsSync(file) ? readFileSync(file, "utf8") : undefined; + if (previous === content) { + chmodFileIfRequested(file, options.mode); + return { changed: false }; + } + ensureOriginalSnapshot(file, previous, options.mode); + const backupFile = previous === undefined ? undefined : backupFilePath(file); + if (backupFile) { + copyFileSync(file, backupFile); + chmodFileIfRequested(backupFile, options.mode); + } + writeFileSync(file, content, options.mode === undefined ? "utf8" : { encoding: "utf8", mode: options.mode }); + chmodFileIfRequested(file, options.mode); + return { backupFile, changed: true }; +} + +function writeGeneratedFileIfChanged( + file: string, + content: string, + options: { mode?: number } = {} +): { changed: boolean } { + mkdirSync(path.dirname(file), { recursive: true }); + const previous = existsSync(file) ? readFileSync(file, "utf8") : undefined; + if (previous === content) { + chmodFileIfRequested(file, options.mode); + return { changed: false }; + } + writeFileSync(file, content, options.mode === undefined ? "utf8" : { encoding: "utf8", mode: options.mode }); + chmodFileIfRequested(file, options.mode); + return { changed: true }; +} + +export function cleanupGeneratedBinBackups(configDir = CONFIGDIR): number { + const binDir = path.join(configDir, "bin"); + let entries: string[]; + try { + entries = readdirSync(binDir); + } catch { + return 0; + } + + let removed = 0; + for (const entry of entries) { + const baseName = generatedBinBackupBaseName(entry); + if (!baseName || !isManagedGeneratedBinFile(baseName)) { + continue; + } + try { + rmSync(path.join(binDir, entry), { force: true }); + removed += 1; + } catch { + // Cleanup is best effort; stale backups should never block profile launch. + } + } + return removed; +} + +function generatedBinBackupBaseName(entry: string): string | undefined { + const backupMarker = ".ccr-backup-"; + const backupIndex = entry.indexOf(backupMarker); + if (backupIndex !== -1) { + return entry.slice(0, backupIndex); + } + for (const suffix of [originalMissingSuffix, originalBackupSuffix]) { + if (entry.endsWith(suffix)) { + return entry.slice(0, -suffix.length); + } + } + return undefined; +} + +function isManagedGeneratedBinFile(fileName: string): boolean { + const normalized = fileName.replace(/\.cmd$/i, ""); + return normalized === "ccr" || + normalized === "ccr-app" || + normalized === "ccr-cli.js" || + normalized === TOOL_HUB_MCP_RUNTIME_FILE_NAME || + normalized === codexMiddlewareRuntimeFilename() || + normalized.startsWith("ccr-claude-code-api-key-") || + normalized.startsWith("ccr-claude-code-wrapper-") || + normalized.startsWith("ccr-codex-cli-stdio-"); +} + +type RestoreFileResult = { + backupFile?: string; + changed: boolean; + file: string; + missingBackup: boolean; + restored: boolean; +}; + +function restoreDisabledGlobalProfile( + profile: ProfileConfig, + file: string, + disabledMessage: string, + isManagedContent: (content: string) => boolean +): ProfileClientApplyStatus { + if (!isGlobalProfile(profile)) { + return disabledStatus(profile.agent, file, disabledMessage); + } + + const restoreResult = restoreGlobalConfigFile(file, { isManagedContent, mode: privateFileMode }); + return disabledRestoreStatus(profile.agent, file, disabledMessage, restoreResult, profile.name || profile.id || profile.agent); +} + +function disabledProfileStatus(profile: ProfileConfig): ProfileClientApplyStatus { + if (profile.agent === "claude-code") { + return restoreDisabledGlobalProfile(profile, resolveClaudeCodeSettingsFile(profile), "Claude Code profile is disabled.", isManagedClaudeCodeSettingsContent); + } + if (profile.agent === "zcode") { + return restoreDisabledZcodeProfile(profile, resolveZcodeConfigFile(profile)); + } + const providerId = sanitizeCodexProviderId(profile.providerId || "") || "claude-code-router"; + return restoreDisabledGlobalProfile( + profile, + resolveCodexConfigFile(profile), + "Codex profile is disabled.", + (content) => isManagedCodexConfigContent(content, providerId) + ); +} + +export function restoreInactiveGlobalProfileConfigs(profiles: ProfileConfig[]): ProfileClientApplyStatus[] { + const statuses: ProfileClientApplyStatus[] = []; + if (!profiles.some((profile) => profile.agent === "claude-code" && profile.enabled && isGlobalProfile(profile))) { + for (const file of uniqueResolvedPaths([ + "~/.claude/settings.json", + ...profiles + .filter((profile) => profile.agent === "claude-code") + .map((profile) => profile.settingsFile || "") + .filter(Boolean) + ])) { + const restoreResult = restoreGlobalConfigFile(file, { + isManagedContent: isManagedClaudeCodeSettingsContent, + mode: privateFileMode + }); + if (restoreResult.changed || restoreResult.missingBackup) { + statuses.push(inactiveGlobalCleanupStatus("claude-code", file, restoreResult)); + } + } + } + const codexProfiles = profiles.filter((profile) => profile.agent === "codex"); + if (codexProfiles.length > 0 && !codexProfiles.some((profile) => profile.enabled && isGlobalProfile(profile))) { + for (const file of uniqueResolvedPaths([ + ...codexProfiles.map(globalCodexConfigCandidate) + ])) { + const restoreResult = restoreGlobalConfigFile(file, { + isManagedContent: (content) => isManagedCodexConfigContent(content, "claude-code-router"), + mode: privateFileMode + }); + if (restoreResult.changed || restoreResult.missingBackup) { + statuses.push(inactiveGlobalCleanupStatus("codex", file, restoreResult)); + } + } + } + const zcodeProfiles = profiles.filter((profile) => profile.agent === "zcode"); + if (zcodeProfiles.length > 0 && !zcodeProfiles.some((profile) => profile.enabled && isGlobalProfile(profile))) { + const providerIds = [...new Set([ + "claude-code-router", + ...zcodeProfiles.map((profile) => sanitizeCodexProviderId(profile.providerId || "")).filter(Boolean) + ])]; + const configFiles = uniqueResolvedPaths([ + ...zcodeProfiles.map((profile) => resolveZcodeConfigFile(profile)) + ]); + for (const configFile of configFiles) { + const storageRoot = zcodeHomeFromConfigFile(configFile); + for (const file of [ + configFile, + path.join(storageRoot, "v2", "config.json"), + path.join(storageRoot, "v2", "bots-model-cache.v2.json") + ]) { + const restoreResult = restoreGlobalConfigFile(file, { + isManagedContent: (content) => providerIds.some((providerId) => isManagedZcodeConfigContent(content, providerId)), + mode: privateFileMode + }); + if (restoreResult.changed || restoreResult.missingBackup) { + statuses.push(inactiveGlobalCleanupStatus("zcode", file, restoreResult)); + } + } + } + } + return statuses; +} + +function globalCodexConfigCandidate(profile: ProfileConfig): string { + const codexHome = profile.codexHome?.trim(); + if (codexHome) { + return path.join(resolveUserPath(codexHome), "config.toml"); + } + return profile.configFile || "~/.codex/config.toml"; +} + +export function restoreGlobalProfileConfigsOnExit( + profiles: ProfileConfig[], + options: { manageMarker?: boolean } = {} +): ProfileClientApplyStatus[] { + const manageMarker = options.manageMarker !== false; + const records = dedupeGlobalProfileTakeovers([ + ...(manageMarker ? ownedGlobalProfileTakeovers ?? readGlobalProfileTakeoverMarker() : []), + ...globalProfileTakeoverRecords(profiles) + ]); + const statuses = restoreGlobalProfileTakeoverRecords(records); + if (manageMarker && statuses.every((status) => status.ok)) { + clearGlobalProfileTakeoverMarker(); + ownedGlobalProfileTakeovers = []; + } + return statuses; +} + +function synchronizeGlobalProfileTakeovers(profiles: ProfileConfig[], canTakeOver: boolean): ProfileClientApplyStatus[] { + const next = canTakeOver ? globalProfileTakeoverRecords(profiles) : []; + const previous = ownedGlobalProfileTakeovers ?? readGlobalProfileTakeoverMarker(); + if (ownedGlobalProfileTakeovers !== undefined && JSON.stringify(previous) === JSON.stringify(next)) { + return []; + } + + const statuses = previous.length > 0 ? restoreGlobalProfileTakeoverRecords(previous) : []; + const markerRecords = statuses.every((status) => status.ok) + ? next + : dedupeGlobalProfileTakeovers([...previous, ...next]); + if (markerRecords.length > 0) { + writeGlobalProfileTakeoverMarker(markerRecords); + } else { + clearGlobalProfileTakeoverMarker(); + } + ownedGlobalProfileTakeovers = markerRecords; + return statuses; +} + +function globalProfileTakeoverRecords(profiles: ProfileConfig[]): GlobalProfileTakeoverRecord[] { + return dedupeGlobalProfileTakeovers(profiles + .filter((profile) => profile.enabled && isGlobalProfile(profile)) + .map((profile) => ({ + agent: profile.agent, + codexHome: profile.codexHome?.trim() || undefined, + configFile: profile.configFile?.trim() || undefined, + id: profile.id, + name: profile.name, + providerId: profile.providerId?.trim() || undefined, + settingsFile: profile.settingsFile?.trim() || undefined + }))); +} + +function restoreGlobalProfileTakeoverRecords(records: GlobalProfileTakeoverRecord[]): ProfileClientApplyStatus[] { + return records.map((record) => disabledProfileStatus({ + ...record, + enabled: false, + env: {}, + model: "", + scope: "global", + surface: "auto" + })); +} + +function dedupeGlobalProfileTakeovers(records: GlobalProfileTakeoverRecord[]): GlobalProfileTakeoverRecord[] { + const seen = new Set(); + return records.filter((record) => { + const key = JSON.stringify(record); + if (seen.has(key)) { + return false; + } + seen.add(key); + return true; + }); +} + +function readGlobalProfileTakeoverMarker(): GlobalProfileTakeoverRecord[] { + try { + const parsed = JSON.parse(readFileSync(globalProfileTakeoverFile, "utf8")) as { profiles?: unknown }; + if (!Array.isArray(parsed.profiles)) { + return []; + } + return parsed.profiles.filter((value): value is GlobalProfileTakeoverRecord => + isRecord(value) && + (value.agent === "claude-code" || value.agent === "codex" || value.agent === "zcode") && + typeof value.id === "string" && + typeof value.name === "string" + ); + } catch { + return []; + } +} + +function writeGlobalProfileTakeoverMarker(records: GlobalProfileTakeoverRecord[]): void { + mkdirSync(path.dirname(globalProfileTakeoverFile), { recursive: true }); + writeFileSync(globalProfileTakeoverFile, `${JSON.stringify({ profiles: records, version: 1 }, null, 2)}\n`, { + encoding: "utf8", + mode: privateFileMode + }); +} + +function clearGlobalProfileTakeoverMarker(): void { + rmSync(globalProfileTakeoverFile, { force: true }); +} + +function inactiveGlobalCleanupStatus( + client: ProfileClientKind, + file: string, + restoreResult: RestoreFileResult +): ProfileClientApplyStatus { + return { + backupFile: restoreResult.backupFile, + client, + enabled: false, + message: restoreResult.missingBackup + ? `No active global ${codexCompatibleClientName(client)} profile is configured, but the global config is managed by CCR and no original backup was found.` + : `${codexCompatibleClientName(client)} global config was restored because no active global profile is configured.`, + ok: !restoreResult.missingBackup, + path: resolveUserPath(file) + }; +} + +function uniqueResolvedPaths(paths: string[]): string[] { + const seen = new Set(); + const result: string[] = []; + for (const item of paths) { + const resolved = resolveUserPath(item); + const key = process.platform === "win32" ? resolved.toLowerCase() : resolved; + if (seen.has(key)) { + continue; + } + seen.add(key); + result.push(resolved); + } + return result; +} + +function restoreDisabledZcodeProfile(profile: ProfileConfig, configFile: string): ProfileClientApplyStatus { + const disabledMessage = "ZCode profile is disabled."; + if (!isGlobalProfile(profile)) { + return disabledStatus("zcode", configFile, disabledMessage); + } + + const providerId = sanitizeCodexProviderId(profile.providerId || "") || "claude-code-router"; + const storageRoot = zcodeHomeFromConfigFile(configFile); + const files = [ + configFile, + path.join(storageRoot, "v2", "config.json"), + path.join(storageRoot, "v2", "bots-model-cache.v2.json") + ]; + const results = files.map((file) => + restoreGlobalConfigFile(file, { + isManagedContent: (content) => isManagedZcodeConfigContent(content, providerId), + mode: privateFileMode + }) + ); + const changed = results.some((result) => result.changed); + const restored = results.some((result) => result.restored); + const missingBackup = results.some((result) => result.missingBackup); + return { + backupFile: results.find((result) => result.backupFile)?.backupFile, + client: "zcode", + enabled: false, + message: missingBackup + ? `${disabledMessage} No original ZCode config backup was found for ${profile.name || profile.id || "this profile"}.` + : restored + ? changed + ? "ZCode config was restored from the CCR backup because the global profile is disabled." + : "ZCode config already matches the CCR backup; profile is disabled." + : disabledMessage, + ok: !missingBackup, + path: resolveUserPath(configFile) + }; +} + +function disabledRestoreStatus( + client: ProfileClientKind, + file: string, + disabledMessage: string, + restoreResult: RestoreFileResult, + profileName: string +): ProfileClientApplyStatus { + return { + backupFile: restoreResult.backupFile, + client, + enabled: false, + message: restoreResult.missingBackup + ? `${disabledMessage} No original ${codexCompatibleClientName(client)} config backup was found for ${profileName}.` + : restoreResult.restored + ? restoreResult.changed + ? `${codexCompatibleClientName(client)} config was restored from the CCR backup because the global profile is disabled.` + : `${codexCompatibleClientName(client)} config already matches the CCR backup; profile is disabled.` + : disabledMessage, + ok: !restoreResult.missingBackup, + path: resolveUserPath(file) + }; +} + +function restoreGlobalConfigFile( + file: string, + options: { + isManagedContent: (content: string) => boolean; + mode?: number; + } +): RestoreFileResult { + const current = existsSync(file) ? readFileSync(file, "utf8") : undefined; + const currentManaged = current !== undefined && options.isManagedContent(current); + if (current !== undefined && !currentManaged) { + return { changed: false, file, missingBackup: false, restored: false }; + } + + const snapshot = originalSnapshotCandidate(file, options.isManagedContent); + if (snapshot) { + if (current === snapshot.content) { + chmodFileIfRequested(file, options.mode); + return { changed: false, file, missingBackup: false, restored: true }; + } + + const backupFile = current === undefined ? undefined : backupCurrentConfigFile(file, options.mode); + mkdirSync(path.dirname(file), { recursive: true }); + writeFileSync(file, snapshot.content, options.mode === undefined ? "utf8" : { encoding: "utf8", mode: options.mode }); + chmodFileIfRequested(file, options.mode); + return { backupFile, changed: true, file, missingBackup: false, restored: true }; + } + + if (existsSync(originalMissingFilePath(file))) { + if (currentManaged) { + const backupFile = backupCurrentConfigFile(file, options.mode); + rmSync(file, { force: true }); + return { backupFile, changed: true, file, missingBackup: false, restored: true }; + } + return { changed: false, file, missingBackup: false, restored: current === undefined }; + } + + return { + changed: false, + file, + missingBackup: Boolean(currentManaged), + restored: false + }; +} + +function originalSnapshotCandidate( + file: string, + isManagedContent: (content: string) => boolean +): { content: string; file: string } | undefined { + // Prefer the most recent non-CCR snapshot captured immediately before the + // latest takeover. The permanent .ccr-original file can be stale when the + // user changes the agent config between separate CCR sessions. + for (const candidate of [...backupFiles(file).reverse(), originalBackupFilePath(file)]) { + if (!existsSync(candidate)) { + continue; + } + const content = readFileSync(candidate, "utf8"); + if (!isManagedContent(content)) { + return { content, file: candidate }; + } + } + return undefined; +} + +function backupCurrentConfigFile(file: string, mode: number | undefined): string { + const backupFile = backupFilePath(file); + copyFileSync(file, backupFile); + chmodFileIfRequested(backupFile, mode); + return backupFile; +} + +function backupFiles(file: string): string[] { + const dir = path.dirname(file); + const prefix = `${path.basename(file)}.ccr-backup-`; + try { + return readdirSync(dir) + .filter((entry) => entry.startsWith(prefix)) + .sort() + .map((entry) => path.join(dir, entry)); + } catch { + return []; + } +} + +function ensureOriginalSnapshot(file: string, previous: string | undefined, mode: number | undefined): void { + const originalBackup = originalBackupFilePath(file); + const originalMissing = originalMissingFilePath(file); + if (existsSync(originalBackup) || existsSync(originalMissing)) { + return; + } + if (previous === undefined) { + writeFileSync(originalMissing, "", "utf8"); + chmodFileIfRequested(originalMissing, mode); + return; + } + copyFileSync(file, originalBackup); + chmodFileIfRequested(originalBackup, mode); +} + +function chmodFileIfRequested(file: string, mode: number | undefined): void { + if (mode === undefined || process.platform === "win32") { + return; + } + try { + chmodSync(file, mode); + } catch { + // Best effort; the write itself should still succeed on filesystems without chmod. + } +} + +function backupFilePath(file: string): string { + const timestamp = new Date().toISOString().replace(/[:.]/g, "-"); + return `${file}.ccr-backup-${timestamp}`; +} + +function originalBackupFilePath(file: string): string { + return `${file}${originalBackupSuffix}`; +} + +function originalMissingFilePath(file: string): string { + return `${file}${originalMissingSuffix}`; +} + +function disabledStatus(client: ProfileClientKind, file: string, message: string): ProfileClientApplyStatus { + return { + client, + enabled: false, + message, + ok: true, + path: resolveUserPath(file) + }; +} + +function unavailableModelStatus(profile: ProfileConfig, file: string): ProfileClientApplyStatus { + return { + client: profile.agent, + enabled: true, + message: NO_AVAILABLE_GATEWAY_MODELS_MESSAGE, + ok: false, + path: resolveUserPath(file) + }; +} + +function disabledProfileMessage(profile: ProfileConfig): string { + if (profile.agent === "claude-code") { + return "Claude Code profile is disabled."; + } + return `${codexCompatibleClientName(profile.agent)} profile is disabled.`; +} + +function isGlobalProfile(profile: ProfileConfig): boolean { + return normalizeProfileScope(profile.scope) === "global"; +} + +function isManagedClaudeCodeSettingsContent(content: string): boolean { + const settings = parseJsonContent(content); + if (!settings) { + return false; + } + const apiKeyHelper = typeof settings.apiKeyHelper === "string" ? settings.apiKeyHelper : ""; + if (apiKeyHelper.includes("ccr-claude-code-api-key-")) { + return true; + } + const env = isRecord(settings.env) ? settings.env : {}; + return typeof env.ANTHROPIC_BASE_URL === "string" && + typeof env.ANTHROPIC_API_BASE_URL === "string" && + typeof env.CLAUDE_AGENT_API_BASE_URL === "string"; +} + +function isManagedCodexConfigContent(content: string, providerId: string): boolean { + if (content.includes(managedRootStart) || content.includes(managedProviderStart)) { + return true; + } + const escapedProvider = escapeRegExp(providerId); + return new RegExp(`^\\s*\\[model_providers\\.(?:${escapedProvider}|${escapeRegExp(tomlQuotedKey(providerId))})\\]`, "m").test(content); +} + +function isManagedZcodeConfigContent(content: string, providerId: string): boolean { + const config = parseJsonContent(content); + if (!config) { + return false; + } + if (isRecord(config.provider) && hasOwn(config.provider, providerId)) { + return true; + } + if (isRecord(config.model) && typeof config.model.main === "string" && config.model.main.startsWith(`${providerId}/`)) { + return true; + } + for (const key of ["defaultModel", "lastUsed", "lastUsedModel"]) { + const modelRef = config[key]; + if (isRecord(modelRef) && modelRef.providerId === providerId) { + return true; + } + } + return Array.isArray(config.providers) && config.providers.some((provider) => + isRecord(provider) && provider.id === providerId + ); +} + +function parseJsonContent(content: string): Record | undefined { + try { + const parsed = JSON.parse(content) as unknown; + return isRecord(parsed) ? parsed : undefined; + } catch { + return undefined; + } +} + +function gatewayEndpoint(config: AppConfig): string { + const host = config.gateway.host === "0.0.0.0" ? "127.0.0.1" : config.gateway.host || "127.0.0.1"; + const formattedHost = host.includes(":") && !host.startsWith("[") ? `[${host}]` : host; + return `http://${formattedHost}:${config.gateway.port}`; +} + +function defaultClientModel(config: AppConfig): string { + const preferred = config.Providers.find((provider) => provider.name === config.preferredProvider) ?? config.Providers[0]; + if (preferred?.name && preferred.models[0]) { + return `${preferred.name}/${preferred.models[0]}`; + } + return "gpt-5-codex"; +} + +function toolHubResolverModel(config: AppConfig): string { + const model = config.toolHub.llm.model.trim(); + if (!model) { + return ""; + } + if (model.includes("/")) { + return model; + } + const baseUrl = normalizeUrlForMatch(config.toolHub.llm.baseUrl); + const provider = config.Providers.find((candidate) => + candidate.models.includes(model) && + (!baseUrl || normalizeUrlForMatch(providerBaseUrl(candidate)) === baseUrl) + ) ?? config.Providers.find((candidate) => candidate.models.includes(model)); + return provider?.name ? `${provider.name}/${model}` : model; +} + +function providerBaseUrl(provider: AppConfig["Providers"][number]): string { + return provider.api_base_url || provider.baseUrl || provider.baseurl || ""; +} + +function normalizeUrlForMatch(value: string | undefined): string { + return (value || "").trim().replace(/\/+$/g, ""); +} + +function normalizeClientModel(value: string | undefined): string { + return normalizeRouteSelector(value)?.trim() || ""; +} + +function resolveUserPath(value: string): string { + const trimmed = value.trim(); + if (trimmed === "~") { + return os.homedir(); + } + if (trimmed.startsWith("~/") || trimmed.startsWith("~\\")) { + return path.join(os.homedir(), trimmed.slice(2)); + } + return path.resolve(trimmed || "."); +} + +function sanitizeCodexProviderId(value: string): string { + return value.trim().replace(/[^a-zA-Z0-9_.-]+/g, "-").replace(/^-+|-+$/g, ""); +} + +function sanitizeProfilePathSegment(value: string): string { + return value.trim().replace(/[^a-zA-Z0-9_.-]+/g, "-").replace(/^-+|-+$/g, ""); +} + +function normalizeCodexConfigFormat(_value: ProfileConfig["configFormat"]): "legacy" | "separate_profile_files" { + return "separate_profile_files"; +} + +function normalizeCodexRemoteFrontendMode(value: ProfileConfig["remoteFrontendMode"]): "app" | "cli" | "claude-code" { + return value === "cli" || value === "claude-code" ? value : "app"; +} + +function normalizeProfileScope(value: ProfileConfig["scope"]): "ccr" | "global" | "custom" { + return value === "ccr" || value === "custom" ? value : "global"; +} + +function isGeneratedProfileScope(value: ProfileConfig["scope"]): boolean { + return value === "ccr" || value === "custom"; +} + +function normalizeProfileSurface(value: ProfileConfig["surface"]): "auto" | "cli" | "app" { + return value === "cli" || value === "app" ? value : "auto"; +} + +function codexCompatibleClientName(agent: ProfileConfig["agent"]): string { + if (agent === "claude-code") { + return "Claude Code"; + } + return agent === "zcode" ? "ZCode" : "Codex"; +} + +function defaultCodexConfigFile(agent: ProfileConfig["agent"]): string { + return agent === "zcode" ? "~/.zcode/cli/config.json" : "~/.codex/config.toml"; +} + +function codexConfigSubdir(agent: ProfileConfig["agent"]): string { + return agent === "zcode" ? "zcode" : "codex"; +} + +function defaultCodexCliCommand(agent: ProfileConfig["agent"]): string { + return agent === "zcode" ? "zcode" : "codex"; +} + +function defaultCodexCompatibleHome(agent: ProfileConfig["agent"], configFile: string): string { + return agent === "zcode" ? zcodeHomeFromConfigFile(configFile) : path.dirname(configFile); +} + +function profileEnv(profile: ProfileConfig): Record { + return stringRecord(profile.env).filter(([key]) => isEnvName(key)).reduce>((result, [key, value]) => { + if (profile.agent !== "claude-code" && key === CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV) { + return result; + } + result[key] = value; + return result; + }, {}); +} + +function stringRecord(value: unknown): Array<[string, string]> { + if (!isRecord(value)) { + return []; + } + return Object.entries(value) + .map(([key, itemValue]) => [key.trim(), itemValue] as const) + .filter((entry): entry is [string, string] => Boolean(entry[0]) && typeof entry[1] === "string"); +} + +function isEnvName(value: string): boolean { + return /^[A-Za-z_][A-Za-z0-9_]*$/.test(value); +} + +function tomlKey(value: string): string { + return /^[A-Za-z0-9_-]+$/.test(value) ? value : tomlQuotedKey(value); +} + +function tomlQuotedKey(value: string): string { + return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`; +} + +function tomlString(value: string): string { + return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r")}"`; +} + +function tomlStringArray(values: string[]): string { + return `[${values.map((value) => tomlString(value)).join(", ")}]`; +} + +function tomlStringContent(value: string): string { + return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r"); +} + +function shellQuote(value: string): string { + return `'${value.replace(/'/g, "'\\''")}'`; +} + +function cmdSetLine(key: string, value: string, indent = ""): string { + return `${indent}set "${key}=${cmdValue(value)}"`; +} + +function cmdQuote(value: string): string { + return `"${cmdValue(value)}"`; +} + +function cmdValue(value: string): string { + return value + .replace(/\r?\n/g, " ") + .replace(/\^/g, "^^") + .replace(/%/g, "%%") + .replace(/"/g, '^"') + .replace(/[&|<>()]/g, "^$&"); +} + +function trimLeadingBlankLines(value: string): string { + return value.replace(/^\s*\n/g, ""); +} + +function ensureTrailingNewline(value: string): string { + return value.endsWith("\n") ? value : `${value}\n`; +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function hasOwn(value: Record, key: string): boolean { + return Object.prototype.hasOwnProperty.call(value, key); +} + +function escapeRegExp(value: string): string { + return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/core/src/providers/account-service.ts b/packages/core/src/providers/account-service.ts new file mode 100644 index 0000000..adeb61d --- /dev/null +++ b/packages/core/src/providers/account-service.ts @@ -0,0 +1,1982 @@ +import { createHash, randomUUID } from "node:crypto"; +import { loadAppConfig } from "@ccr/core/config/config"; +import { attachCodexRateLimitResetCreditDetails } from "@ccr/core/agents/local-providers/codex"; +import { localAgentProviderApiKey, readCodexAuth } from "@ccr/core/agents/local-providers/service"; +import { pluginService } from "@ccr/core/plugins/service"; +import { getUsageTotalsSince } from "@ccr/core/usage/store"; +import { findProviderPresetByBaseUrl, providerEndpointCanReceiveProviderApiKey } from "@ccr/core/providers/presets/index"; +import { fetchWithSystemProxy } from "@ccr/core/proxy/system-proxy-fetch"; +import { normalizeProviderBaseUrl, providerUrlWithDefaultScheme } from "@ccr/core/providers/url"; +import type { + AppConfig, + GatewayProviderConfig, + ProviderAccountConfig, + ProviderAccountConnectorConfig, + ProviderAccountConnectorError, + ProviderAccountConnectorSource, + ProviderAccountAuthMode, + ProviderAccountHttpJsonConnectorConfig, + ProviderAccountLocalEstimateConnectorConfig, + ProviderAccountLocalWindowConfig, + ProviderAccountMappedMeterConfig, + ProviderAccountMappedNumberExpression, + ProviderAccountMappedStringExpression, + ProviderAccountMeter, + ProviderAccountMeterDetail, + ProviderAccountMeterKind, + ProviderAccountMeterUnit, + ProviderAccountPluginConnectorConfig, + ProviderAccountSnapshot, + ProviderAccountSnapshotRequestOptions, + ProviderAccountResetRequest, + ProviderAccountResetResult, + ProviderAccountTestPath, + ProviderAccountTestRequest, + ProviderAccountTestResult, + ProviderAccountStandardConnectorConfig, + ProviderCredentialConfig, + ProviderAccountStatus +} from "@ccr/core/contracts/app"; + +type CacheEntry = { + expiresAt: number; + snapshot: ProviderAccountSnapshot; + staleUntil: number; +}; + +type ConnectorResult = { + errors: ProviderAccountConnectorError[]; + meters: ProviderAccountMeter[]; + message?: string; + source: ProviderAccountConnectorSource; + status?: ProviderAccountStatus; +}; + +type ProviderAccountTarget = { + account: ProviderAccountConfig; + credential?: ProviderCredentialConfig; + provider: GatewayProviderConfig; +}; + +type MaterializedProviderAccountRequest = { + headers?: Record; + provider: GatewayProviderConfig; +}; + +const defaultRefreshIntervalMs = 5 * 60 * 1000; +const minRefreshIntervalMs = 30 * 1000; +const maxErrorRefreshIntervalMs = 60 * 1000; +const maxStaleAccountSnapshotMs = 2 * 60 * 1000; +const maxCacheEntries = 500; +const standardAccountPaths = ["/.well-known/ccr/account", "/v1/account/limits"]; +const codexRateLimitResetCreditConsumeEndpoint = "https://chatgpt.com/backend-api/wham/rate-limit-reset-credits/consume"; +const cache = new Map(); +const inFlightRefreshes = new Map>(); +let cacheGeneration = 0; + +export async function getProviderAccountSnapshots( + providerName?: string, + options: ProviderAccountSnapshotRequestOptions = {} +): Promise { + const config = await loadAppConfig(); + pruneProviderAccountCache(); + const normalizedProviderName = normalizeProviderName(providerName); + const providers = config.Providers.filter((provider) => { + if (!normalizedProviderName) { + return true; + } + return provider.name.trim().toLowerCase() === normalizedProviderName; + }); + + const snapshots = await Promise.all( + providers.flatMap((provider) => { + const targets = providerAccountTargets(provider); + if (targets.length > 0) { + return targets.map((target) => resolveProviderAccountSnapshot(config, target, options)); + } + return providerAccountUnavailableSnapshots(provider).map((snapshot) => Promise.resolve(snapshot)); + }) + ); + return snapshots.filter((snapshot): snapshot is ProviderAccountSnapshot => Boolean(snapshot)); +} + +export function invalidateProviderAccountSnapshotCache(providerName?: string): void { + const normalizedProviderName = normalizeProviderName(providerName); + cacheGeneration += 1; + if (!normalizedProviderName) { + cache.clear(); + inFlightRefreshes.clear(); + return; + } + + const providerNameKey = `"providerName":"${normalizedProviderName}"`; + for (const [key, entry] of cache.entries()) { + if (normalizeProviderName(entry.snapshot.provider) === normalizedProviderName || key.includes(providerNameKey)) { + cache.delete(key); + } + } + for (const key of inFlightRefreshes.keys()) { + if (key.includes(providerNameKey)) { + inFlightRefreshes.delete(key); + } + } +} + +export async function testProviderAccountConnector(request: ProviderAccountTestRequest): Promise { + const provider: GatewayProviderConfig = { + api_base_url: request.baseUrl, + api_key: request.apiKey ?? "", + models: [], + name: request.providerName?.trim() || "Provider" + }; + const connector: ProviderAccountHttpJsonConnectorConfig = { + ...request.connector, + auth: request.connector.auth ?? "provider-api-key", + method: request.connector.method ?? "GET", + type: "http-json" + }; + const payload = await fetchJson(connector.endpoint, provider, connector.auth, connector.headers, connector.method, connector.body); + if (connector.parser === "kimi-code-usages") { + const meters = kimiCodeUsageMeters(payload); + return { + meters, + message: meters.length === 0 ? "No usage data available." : undefined, + paths: flattenJsonPaths(payload), + payload, + status: statusFromMeters(meters, [], 1) + }; + } + if (connector.parser === "new-api-key-usage") { + const meters = newApiKeyUsageMeters(payload); + return { + meters, + message: meters.length === 0 ? newApiKeyUsageFallbackMessage(payload) : readMappedString(connector.mapping.message, payload), + paths: flattenJsonPaths(payload), + payload, + status: statusFromMeters(meters, [], 1) + }; + } + if (connector.parser === "new-api-user-self") { + const meters = newApiUserSelfMeters(payload); + return { + meters, + message: meters.length === 0 ? readMappedString(connector.mapping.message, payload) ?? "No user balance data available." : readMappedString(connector.mapping.message, payload), + paths: flattenJsonPaths(payload), + payload, + status: statusFromMeters(meters, [], 1) + }; + } + + const meters = mappedMetersFromPayload(connector, payload); + + return { + meters, + message: readMappedString(connector.mapping.message, payload), + paths: flattenJsonPaths(payload), + payload, + status: normalizeStatus(readMappedString(connector.mapping.status, payload)) + }; +} + +export function newApiKeyUsageMetersForTest(payload: unknown): ProviderAccountMeter[] { + return newApiKeyUsageMeters(payload); +} + +export function newApiKeyUsageFallbackMessageForTest(payload: unknown): string { + return newApiKeyUsageFallbackMessage(payload); +} + +export function newApiUserSelfMetersForTest(payload: unknown): ProviderAccountMeter[] { + return newApiUserSelfMeters(payload); +} + +export async function resetCodexRateLimitCredit(request: ProviderAccountResetRequest): Promise { + const providerName = request.provider?.trim(); + const creditId = request.creditId?.trim(); + if (!providerName) { + throw new Error("Provider is required."); + } + if (!creditId) { + throw new Error("Reset credit id is required."); + } + + const config = await loadAppConfig(); + const provider = codexResetProvider(config, providerName, request.credentialId); + const materialized = materializeProviderAccountRequest(config, provider); + const payload = await fetchJson( + codexRateLimitResetCreditConsumeEndpoint, + materialized.provider, + "provider-api-key", + { + "User-Agent": "codex-cli", + ...(materialized.headers ?? {}) + }, + "POST", + { + credit_id: creditId, + redeem_request_id: randomUUID() + } + ); + + invalidateProviderAccountSnapshotCache(providerName); + return { + code: isRecord(payload) ? readString(payload.code) : undefined, + creditId, + ok: true + }; +} + +async function resolveProviderAccountSnapshot( + config: AppConfig, + target: ProviderAccountTarget, + options: ProviderAccountSnapshotRequestOptions +): Promise { + const { account, credential } = target; + const provider = credential + ? providerWithCredentialApiKey(target.provider, credential, account) + : { ...target.provider, account }; + const providerName = provider.name.trim(); + if (!providerName) { + return undefined; + } + + const refreshIntervalMs = normalizeRefreshInterval(account.refreshIntervalMs); + const cacheKey = providerAccountCacheKey(provider, account, credential); + const nowMs = Date.now(); + const cached = cache.get(cacheKey); + if (!options.forceRefresh && cached && cached.expiresAt > nowMs) { + return cached.snapshot; + } + const inFlight = inFlightRefreshes.get(cacheKey); + if (!options.forceRefresh && cached && cached.staleUntil > nowMs) { + if (!inFlight) { + void startProviderAccountRefresh(config, provider, account, credential, cacheKey, refreshIntervalMs); + } + return cached.snapshot; + } + if (inFlight) { + return inFlight; + } + + return startProviderAccountRefresh(config, provider, account, credential, cacheKey, refreshIntervalMs); +} + +function startProviderAccountRefresh( + config: AppConfig, + provider: GatewayProviderConfig, + account: ProviderAccountConfig, + credential: ProviderCredentialConfig | undefined, + cacheKey: string, + refreshIntervalMs: number +): Promise { + const generation = cacheGeneration; + const refresh = refreshProviderAccountSnapshot(config, provider, account, credential, cacheKey, refreshIntervalMs, generation); + inFlightRefreshes.set(cacheKey, refresh); + refresh.then( + () => { + if (inFlightRefreshes.get(cacheKey) === refresh) { + inFlightRefreshes.delete(cacheKey); + } + }, + () => { + if (inFlightRefreshes.get(cacheKey) === refresh) { + inFlightRefreshes.delete(cacheKey); + } + } + ); + return refresh; +} + +async function refreshProviderAccountSnapshot( + config: AppConfig, + provider: GatewayProviderConfig, + account: ProviderAccountConfig, + credential: ProviderCredentialConfig | undefined, + cacheKey: string, + refreshIntervalMs: number, + generation: number +): Promise { + const now = new Date(); + const credentialId = credential ? providerCredentialRuntimeId(provider, credential) : undefined; + const connectorResults = await Promise.all( + normalizeConnectors(account).map((connector) => resolveConnector(config, provider, connector, now, credentialId)) + ); + const snapshot = mergeConnectorResults(provider.name.trim(), connectorResults, now, refreshIntervalMs, credential, credentialId); + const cacheTtlMs = providerAccountCacheTtl(snapshot, refreshIntervalMs); + const expiresAt = Date.now() + cacheTtlMs; + snapshot.nextRefreshAt = new Date(expiresAt).toISOString(); + if (generation === cacheGeneration) { + cache.set(cacheKey, { + expiresAt, + snapshot, + staleUntil: expiresAt + providerAccountStaleWindow(cacheTtlMs) + }); + pruneProviderAccountCache(); + } + return snapshot; +} + +function providerAccountCacheKey( + provider: GatewayProviderConfig, + account: ProviderAccountConfig, + credential?: ProviderCredentialConfig +): string { + return JSON.stringify({ + apiKeyHash: hashSensitiveValue(providerApiKey(provider)), + baseUrl: providerBaseUrl(provider), + connectors: account.connectors ?? [], + credentialId: credential ? providerCredentialRuntimeId(provider, credential) : "", + providerName: normalizeProviderName(provider.name), + refreshIntervalMs: account.refreshIntervalMs ?? null + }); +} + +function providerAccountCacheTtl(snapshot: ProviderAccountSnapshot, refreshIntervalMs: number): number { + if (snapshot.status === "error" || (snapshot.meters.length === 0 && (snapshot.errors?.length || snapshot.status === "unsupported"))) { + return Math.min(refreshIntervalMs, maxErrorRefreshIntervalMs); + } + return refreshIntervalMs; +} + +function providerAccountStaleWindow(cacheTtlMs: number): number { + return Math.min(Math.max(cacheTtlMs, minRefreshIntervalMs), maxStaleAccountSnapshotMs); +} + +function pruneProviderAccountCache(now = Date.now()): void { + for (const [key, entry] of cache.entries()) { + if (entry.staleUntil <= now) { + cache.delete(key); + } + } + if (cache.size <= maxCacheEntries) { + return; + } + + const oldestEntries = [...cache.entries()] + .sort(([, left], [, right]) => left.staleUntil - right.staleUntil) + .slice(0, cache.size - maxCacheEntries); + for (const [key] of oldestEntries) { + cache.delete(key); + } +} + +function hashSensitiveValue(value: string): string { + return value + ? createHash("sha256").update(value).digest("hex").slice(0, 16) + : ""; +} + +function providerAccountTargets(provider: GatewayProviderConfig): ProviderAccountTarget[] { + const providerAccount = effectiveProviderAccount(provider); + const credentials = activeProviderCredentials(provider); + if (credentials.length === 0) { + return providerAccount ? [{ account: providerAccount, provider }] : []; + } + + const credentialTargets = credentials + .map((credential): ProviderAccountTarget | undefined => { + const account = effectiveProviderCredentialAccount(provider, credential, providerAccount); + return account ? { account, credential, provider } : undefined; + }) + .filter((target): target is ProviderAccountTarget => Boolean(target)); + if (credentialTargets.length > 0) { + return credentialTargets; + } + + return providerAccount && providerApiKey(provider) ? [{ account: providerAccount, provider }] : []; +} + +function codexResetProvider(config: AppConfig, providerName: string, credentialId: string | undefined): GatewayProviderConfig { + const normalizedProviderName = normalizeProviderName(providerName); + const provider = config.Providers.find((candidate) => normalizeProviderName(candidate.name) === normalizedProviderName); + if (!provider) { + throw new Error("Provider account was not found."); + } + + const target = providerAccountTargets(provider).find((candidate) => { + const candidateCredentialId = candidate.credential ? providerCredentialRuntimeId(candidate.provider, candidate.credential) : undefined; + return !credentialId || candidateCredentialId === credentialId; + }); + if (!target) { + throw new Error("Provider account credential was not found."); + } + if (!providerAccountHasCodexResetCreditsConnector(target.account)) { + throw new Error("Provider account does not support Codex manual reset credits."); + } + + return target.credential + ? providerWithCredentialApiKey(target.provider, target.credential, target.account) + : { ...target.provider, account: target.account }; +} + +function providerAccountHasCodexResetCreditsConnector(account: ProviderAccountConfig): boolean { + return normalizeConnectors(account).some((connector) => + connector.type === "http-json" && + /\/wham\/rate-limit-reset-credits(?:$|[?#/])/i.test(connector.endpoint.trim()) + ); +} + +function providerAccountUnavailableSnapshots(provider: GatewayProviderConfig): ProviderAccountSnapshot[] { + const credentials = activeProviderCredentials(provider); + if (credentials.length > 0) { + return credentials + .map((credential) => providerAccountUnavailableSnapshot(provider, credential.account ?? provider.account, credential)) + .filter((snapshot): snapshot is ProviderAccountSnapshot => Boolean(snapshot)); + } + + const snapshot = providerAccountUnavailableSnapshot(provider, provider.account); + return snapshot ? [snapshot] : []; +} + +function providerAccountUnavailableSnapshot( + provider: GatewayProviderConfig, + account: ProviderAccountConfig | undefined, + credential?: ProviderCredentialConfig +): ProviderAccountSnapshot | undefined { + const providerName = provider.name.trim(); + if (!providerName || !account?.enabled || !providerAccountConnectorsAreDefaultStandard(account.connectors ?? [])) { + return undefined; + } + if (effectiveProviderAccountConfig(provider, account)) { + return undefined; + } + + const message = "No supported account usage endpoint is available for this provider. Configure an HTTP JSON connector or disable account balance."; + return { + credentialId: credential ? providerCredentialRuntimeId(provider, credential) : undefined, + credentialLabel: credential?.name ?? credential?.label ?? credential?.id, + errors: [ + { + message, + source: "unsupported" + } + ], + message, + meters: [], + provider: providerName, + source: "unsupported", + status: "unsupported", + updatedAt: new Date().toISOString() + }; +} + +function effectiveProviderAccount(provider: GatewayProviderConfig): ProviderAccountConfig | undefined { + return effectiveProviderAccountConfig(provider, provider.account); +} + +function effectiveProviderCredentialAccount( + provider: GatewayProviderConfig, + credential: ProviderCredentialConfig, + inheritedAccount: ProviderAccountConfig | undefined +): ProviderAccountConfig | undefined { + if (credential.account !== undefined) { + return effectiveProviderAccountConfig(provider, credential.account); + } + return inheritedAccount; +} + +function effectiveProviderAccountConfig( + provider: GatewayProviderConfig, + account: ProviderAccountConfig | undefined +): ProviderAccountConfig | undefined { + if (!account?.enabled) { + return undefined; + } + + if (!providerAccountConnectorsAreDefaultStandard(account.connectors ?? [])) { + return account; + } + + const presetAccount = findProviderPresetByBaseUrl(providerBaseUrl(provider))?.account; + if (!presetAccount?.enabled) { + return undefined; + } + return { + ...presetAccount, + refreshIntervalMs: account.refreshIntervalMs ?? presetAccount.refreshIntervalMs + }; +} + +function activeProviderCredentials(provider: GatewayProviderConfig): ProviderCredentialConfig[] { + return (provider.credentials ?? []).filter((credential) => + credential.enabled !== false && + Boolean(providerCredentialApiKey(credential)) + ); +} + +function providerWithCredentialApiKey( + provider: GatewayProviderConfig, + credential: ProviderCredentialConfig, + account: ProviderAccountConfig +): GatewayProviderConfig { + return { + ...provider, + account, + api_key: providerCredentialApiKey(credential), + apiKey: undefined, + apikey: undefined + }; +} + +function normalizeConnectors(account: ProviderAccountConfig): ProviderAccountConnectorConfig[] { + return Array.isArray(account.connectors) ? account.connectors : []; +} + +function providerAccountConnectorsAreDefaultStandard(connectors: ProviderAccountConnectorConfig[]): boolean { + if (connectors.length !== 1 || connectors[0]?.type !== "standard") { + return false; + } + const connector = connectors[0] as ProviderAccountStandardConnectorConfig; + return ( + (connector.auth ?? "provider-api-key") === "provider-api-key" && + !connector.endpoint?.trim() && + !connector.endpoints?.length && + !connector.headers && + !connector.id + ); +} + +async function resolveConnector( + config: AppConfig, + provider: GatewayProviderConfig, + connector: ProviderAccountConnectorConfig, + now: Date, + credentialId?: string +): Promise { + try { + if (connector.type === "standard") { + return await resolveStandardConnector(config, provider, connector); + } + if (connector.type === "http-json") { + return await resolveHttpJsonConnector(config, provider, connector); + } + if (connector.type === "plugin") { + return await resolvePluginConnector(config, provider, connector, now); + } + if (connector.type === "local-estimate") { + return await resolveLocalEstimateConnector(provider, connector, now, credentialId); + } + return connectorError("unsupported", `Unsupported account connector type: ${readConnectorType(connector)}`, connectorId(connector)); + } catch (error) { + return connectorError(connectorSource(connector), formatError(error), connectorId(connector)); + } +} + +async function resolveStandardConnector( + config: AppConfig, + provider: GatewayProviderConfig, + connector: ProviderAccountStandardConnectorConfig +): Promise { + const endpoints = standardConnectorEndpoints(provider, connector); + let lastError = ""; + + for (const endpoint of endpoints) { + try { + const request = providerAccountConnectorUsesProviderApiKey(connector) + ? materializeProviderAccountRequest(config, provider) + : { provider }; + const payload = await fetchJson(endpoint, request.provider, connector.auth, { + ...(connector.headers ?? {}), + ...(request.headers ?? {}) + }); + const snapshot = normalizeRemoteSnapshot(provider.name, payload, "standard"); + if (snapshot.meters.length > 0 || snapshot.status !== "unsupported") { + return { + errors: [], + meters: snapshot.meters, + message: snapshot.message, + source: "standard", + status: snapshot.status + }; + } + } catch (error) { + lastError = formatError(error); + } + } + + return connectorError("standard", lastError || "No standard account endpoint returned a usable snapshot.", connectorId(connector)); +} + +async function resolveHttpJsonConnector( + config: AppConfig, + provider: GatewayProviderConfig, + connector: ProviderAccountHttpJsonConnectorConfig +): Promise { + const request = providerAccountConnectorUsesProviderApiKey(connector) + ? materializeProviderAccountRequest(config, provider) + : { provider }; + const payload = await fetchJson(connector.endpoint, request.provider, connector.auth, { + ...(connector.headers ?? {}), + ...(request.headers ?? {}) + }, connector.method, connector.body); + if (connector.parser === "kimi-code-usages") { + const meters = kimiCodeUsageMeters(payload); + return { + errors: [], + message: meters.length === 0 ? "No usage data available." : undefined, + meters, + source: "http-json" + }; + } + if (connector.parser === "new-api-key-usage") { + const meters = newApiKeyUsageMeters(payload); + return { + errors: [], + message: meters.length === 0 ? newApiKeyUsageFallbackMessage(payload) : readMappedString(connector.mapping.message, payload), + meters, + source: "http-json" + }; + } + if (connector.parser === "new-api-user-self") { + const meters = newApiUserSelfMeters(payload); + return { + errors: [], + message: meters.length === 0 ? readMappedString(connector.mapping.message, payload) ?? "No user balance data available." : readMappedString(connector.mapping.message, payload), + meters, + source: "http-json" + }; + } + + const meters = mappedMetersFromPayload(connector, payload); + return { + errors: [], + meters, + message: readMappedString(connector.mapping.message, payload), + source: "http-json", + status: normalizeStatus(readMappedString(connector.mapping.status, payload)) + }; +} + +async function resolvePluginConnector( + config: AppConfig, + provider: GatewayProviderConfig, + connector: ProviderAccountPluginConnectorConfig, + now: Date +): Promise { + const pluginConnector = pluginService.getProviderAccountConnector(connector.pluginId, connector.connectorId); + if (!pluginConnector) { + return connectorError("plugin", `Plugin account connector is not registered: ${connector.pluginId}/${connector.connectorId}`, connectorId(connector)); + } + + const result = await pluginConnector.resolve({ + config, + connector, + now: now.toISOString(), + provider + }); + + if (!result) { + return connectorError("plugin", "Plugin account connector returned no account data.", connectorId(connector)); + } + + if (Array.isArray(result)) { + return { + errors: [], + meters: result.map((meter) => normalizeMeter(meter, "plugin")).filter((meter): meter is ProviderAccountMeter => Boolean(meter)), + source: "plugin" + }; + } + + return { + errors: result.errors ?? [], + meters: result.meters.map((meter) => normalizeMeter(meter, "plugin")).filter((meter): meter is ProviderAccountMeter => Boolean(meter)), + message: result.message, + source: "plugin", + status: result.status + }; +} + +async function resolveLocalEstimateConnector( + provider: GatewayProviderConfig, + connector: ProviderAccountLocalEstimateConnectorConfig, + now: Date, + credentialId?: string +): Promise { + const meters = await Promise.all( + connector.windows.map((window) => localEstimateMeter(provider, window, now, credentialId)) + ); + + return { + errors: [], + meters: meters.filter((meter): meter is ProviderAccountMeter => Boolean(meter)), + message: "Local estimate from CCR usage history.", + source: "local-estimate" + }; +} + +async function localEstimateMeter( + provider: GatewayProviderConfig, + window: ProviderAccountLocalWindowConfig, + now: Date, + credentialId?: string +): Promise { + const limit = normalizeNumber(window.limit); + if (!window.id || !window.label || !limit || limit <= 0) { + return undefined; + } + + const since = localEstimateWindowStart(window.window, now); + const totals = await getUsageTotalsSince(since, { + ...(credentialId ? { credential: credentialId } : {}), + provider: provider.name + }); + const used = window.unit === "tokens" + ? totals.totalTokens + : window.unit === "requests" + ? totals.requestCount + : totals.requestCount * totals.avgDurationMs / 3_600_000; + + return { + id: window.id, + kind: window.unit === "tokens" ? "tokens" : window.unit === "requests" ? "requests" : "time_window", + label: window.label, + limit, + remaining: Math.max(0, limit - used), + resetAt: localEstimateResetAt(window.window, now).toISOString(), + source: "local-estimate", + unit: window.unit, + used, + window: window.window + }; +} + +function mergeConnectorResults( + provider: string, + results: ConnectorResult[], + now: Date, + refreshIntervalMs: number, + credential?: ProviderCredentialConfig, + credentialId?: string +): ProviderAccountSnapshot { + const errors = results.flatMap((result) => result.errors); + const metersById = new Map(); + for (const result of results) { + for (const meter of result.meters) { + const key = meter.id.trim(); + if (!key) { + continue; + } + metersById.set(key, meter); + } + } + + const meters = [...metersById.values()]; + const successfulSources = results.filter((result) => result.meters.length > 0).map((result) => result.source); + const source = successfulSources.length === 0 + ? "merged" + : new Set(successfulSources).size === 1 + ? successfulSources[0] + : "merged"; + const explicitStatus = mostSevereStatus(results.map((result) => result.status).filter((status): status is ProviderAccountStatus => Boolean(status))); + const status = explicitStatus ?? statusFromMeters(meters, errors, results.length); + const message = results.find((result) => result.message)?.message ?? (errors.length > 0 && meters.length === 0 ? errors[0]?.message : undefined); + + return { + credentialId, + credentialLabel: credential?.name ?? credential?.label ?? credential?.id, + errors: errors.length > 0 ? errors : undefined, + message, + meters, + nextRefreshAt: new Date(now.getTime() + refreshIntervalMs).toISOString(), + provider, + source, + status, + updatedAt: now.toISOString() + }; +} + +function normalizeRemoteSnapshot( + provider: string, + payload: unknown, + source: ProviderAccountConnectorSource +): ProviderAccountSnapshot { + if (!isRecord(payload)) { + throw new Error("Account endpoint returned a non-object payload."); + } + const meters = Array.isArray(payload.meters) + ? payload.meters.map((meter) => normalizeMeter(meter, source)).filter((meter): meter is ProviderAccountMeter => Boolean(meter)) + : []; + return { + errors: normalizeRemoteErrors(payload.errors, source), + message: readString(payload.message), + meters, + nextRefreshAt: readString(payload.nextRefreshAt), + provider: readString(payload.provider) || provider, + source, + status: normalizeStatus(readString(payload.status)) ?? statusFromMeters(meters, [], 1), + updatedAt: readString(payload.updatedAt) || new Date().toISOString() + }; +} + +function newApiKeyUsageMeters(payload: unknown): ProviderAccountMeter[] { + const meter = newApiKeyUsageMeter(payload); + return meter ? [meter] : []; +} + +function newApiKeyUsageMeter(payload: unknown): ProviderAccountMeter | undefined { + const data = newApiKeyUsageData(payload); + if (!data) { + return undefined; + } + + const unlimited = readBoolean(readJsonRecordValue(data, "unlimited_quota")) === true; + const remaining = normalizeNumber(readJsonRecordValue(data, "total_available")); + const limit = normalizeNumber(readJsonRecordValue(data, "total_granted")); + const used = normalizeNumber(readJsonRecordValue(data, "total_used")); + if (unlimited || (limit === undefined && remaining === undefined && used === undefined)) { + return undefined; + } + + return { + id: "new_api_key_quota", + kind: "quota", + label: "API key quota", + limit, + remaining, + source: "http-json", + unit: "quota", + used + }; +} + +function newApiKeyUsageFallbackMessage(payload: unknown): string { + const data = newApiKeyUsageData(payload); + if (data && readBoolean(readJsonRecordValue(data, "unlimited_quota")) === true) { + return "API key has no dedicated quota limit. Configure a New API user balance connector with an access token and New-Api-User to read account balance."; + } + return readMappedString("$.message", payload) ?? "No API key quota data available."; +} + +function newApiUserSelfMeters(payload: unknown): ProviderAccountMeter[] { + const meter = newApiUserSelfMeter(payload); + return meter ? [meter] : []; +} + +function newApiUserSelfMeter(payload: unknown): ProviderAccountMeter | undefined { + const data = newApiUserSelfData(payload); + if (!data) { + return undefined; + } + + const remaining = normalizeNumber(readJsonRecordValue(data, "quota")); + const used = normalizeNumber(readJsonRecordValue(data, "used_quota")); + if (remaining === undefined && used === undefined) { + return undefined; + } + + return { + id: "new_api_user_balance", + kind: "balance", + label: "User balance", + limit: remaining !== undefined && used !== undefined ? remaining + used : undefined, + remaining, + source: "http-json", + unit: "quota", + used + }; +} + +function newApiKeyUsageData(payload: unknown): Record | undefined { + if (!isRecord(payload)) { + return undefined; + } + const data = readJsonRecordValue(payload, "data"); + return isRecord(data) ? data : payload; +} + +function newApiUserSelfData(payload: unknown): Record | undefined { + if (!isRecord(payload)) { + return undefined; + } + const data = readJsonRecordValue(payload, "data"); + return isRecord(data) ? data : payload; +} + +function kimiCodeUsageMeters(payload: unknown): ProviderAccountMeter[] { + if (!isRecord(payload)) { + return []; + } + + const meters: ProviderAccountMeter[] = []; + const usage = isRecord(payload.usage) ? kimiCodeUsageMeter(payload.usage, "weekly_quota", "Weekly quota") : undefined; + if (usage) { + meters.push(usage); + } + + if (Array.isArray(payload.limits)) { + const seenIds = new Set(meters.map((meter) => meter.id)); + payload.limits.forEach((item, index) => { + if (!isRecord(item)) { + return; + } + const detail = isRecord(item.detail) ? item.detail : item; + const window = isRecord(item.window) ? item.window : {}; + const label = kimiCodeUsageLimitLabel(item, detail, window, index); + const meter = kimiCodeUsageMeter(detail, uniqueKimiCodeUsageMeterId(kimiCodeUsageMeterId(item, detail, label, index), seenIds), label, item); + if (meter) { + seenIds.add(meter.id); + meters.push(meter); + } + }); + } + + return meters; +} + +function kimiCodeUsageMeter( + data: Record, + id: string, + defaultLabel: string, + fallbackData?: Record +): ProviderAccountMeter | undefined { + const limit = normalizeNumber(data.limit); + let used = normalizeNumber(data.used); + let remaining = normalizeNumber(data.remaining); + if (used === undefined && remaining !== undefined && limit !== undefined) { + used = limit - remaining; + } + if (remaining === undefined && used !== undefined && limit !== undefined) { + remaining = limit - used; + } + if (limit === undefined && used === undefined && remaining === undefined) { + return undefined; + } + + const label = readString(data.name) || readString(data.title) || defaultLabel; + const resetAt = kimiCodeUsageResetAt(data) ?? (fallbackData ? kimiCodeUsageResetAt(fallbackData) : undefined); + if (limit !== undefined && limit > 0) { + const remainingRatio = remaining !== undefined + ? Math.max(0, Math.min(1, remaining / limit)) + : used !== undefined + ? Math.max(0, Math.min(1, (limit - used) / limit)) + : undefined; + const remainingPercent = remainingRatio === undefined ? undefined : remainingRatio * 100; + return { + id, + kind: "quota", + label, + limit: 100, + remaining: remainingPercent, + resetAt, + source: "http-json", + unit: "%", + used: remainingPercent === undefined ? undefined : 100 - remainingPercent + }; + } + + return { + id, + kind: "quota", + label, + limit, + remaining, + resetAt, + source: "http-json", + unit: "quota", + used + }; +} + +function kimiCodeUsageLimitLabel( + item: Record, + detail: Record, + window: Record, + index: number +): string { + const named = readString(item.name) || readString(detail.name) || readString(item.title) || readString(detail.title) || readString(item.scope) || readString(detail.scope); + if (named) { + return named; + } + + const duration = normalizeNumber(window.duration) ?? normalizeNumber(item.duration) ?? normalizeNumber(detail.duration); + const timeUnit = (readString(window.timeUnit) || readString(item.timeUnit) || readString(detail.timeUnit) || "").toUpperCase(); + if (duration && duration > 0) { + if (timeUnit.includes("MINUTE")) { + return duration >= 60 && duration % 60 === 0 ? `${duration / 60}h quota` : `${duration}m quota`; + } + if (timeUnit.includes("HOUR")) { + return `${duration}h quota`; + } + if (timeUnit.includes("DAY")) { + return `${duration}d quota`; + } + return `${duration}s quota`; + } + + return `Limit #${index + 1}`; +} + +function kimiCodeUsageMeterId( + item: Record, + detail: Record, + label: string, + index: number +): string { + const explicit = readString(item.id) || readString(detail.id) || readString(item.name) || readString(detail.name) || readString(item.scope) || readString(detail.scope); + return providerCredentialSlug(explicit || label || `limit-${index + 1}`) || `limit-${index + 1}`; +} + +function uniqueKimiCodeUsageMeterId(id: string, seenIds: Set): string { + if (!seenIds.has(id)) { + return id; + } + let index = 2; + while (seenIds.has(`${id}-${index}`)) { + index += 1; + } + return `${id}-${index}`; +} + +function kimiCodeUsageResetAt(data: Record): string | undefined { + for (const key of ["reset_at", "resetAt", "reset_time", "resetTime"]) { + const value = data[key]; + const timestamp = typeof value === "number" + ? value + : typeof value === "string" && /^\d+$/.test(value.trim()) + ? Number(value) + : undefined; + if (timestamp !== undefined && Number.isFinite(timestamp)) { + const milliseconds = timestamp < 1_000_000_000_000 ? timestamp * 1000 : timestamp; + const date = new Date(milliseconds); + return Number.isNaN(date.getTime()) ? undefined : date.toISOString(); + } + + const dateString = readString(value); + if (dateString) { + const date = new Date(dateString); + return Number.isNaN(date.getTime()) ? dateString : date.toISOString(); + } + } + + for (const key of ["reset_in", "resetIn", "ttl", "window"]) { + const seconds = normalizeNumber(data[key]); + if (seconds && seconds > 0) { + return new Date(Date.now() + seconds * 1000).toISOString(); + } + } + + return undefined; +} + +function normalizeRemoteErrors(value: unknown, source: ProviderAccountConnectorSource): ProviderAccountConnectorError[] | undefined { + if (!Array.isArray(value)) { + return undefined; + } + const errors = value + .map((item): ProviderAccountConnectorError | undefined => { + if (!isRecord(item)) { + return undefined; + } + const message = readString(item.message); + if (!message) { + return undefined; + } + return { + connectorId: readString(item.connectorId), + message, + source + }; + }) + .filter((item): item is ProviderAccountConnectorError => Boolean(item)); + return errors.length > 0 ? errors : undefined; +} + +function mappedMeterFromPayload(config: ProviderAccountMappedMeterConfig, payload: unknown): ProviderAccountMeter | undefined { + const id = config.id.trim(); + const label = config.label.trim(); + if (!id || !label) { + return undefined; + } + const unit = config.unit ? readMappedString(config.unit, payload) : undefined; + const limit = readMappedNumber(config.limit, payload); + const remaining = readMappedNumber(config.remaining, payload); + const used = readMappedNumber(config.used, payload); + if (limit === undefined && remaining === undefined && used === undefined) { + return undefined; + } + return normalizeMeter({ + id, + kind: config.kind, + label, + limit, + remaining, + resetAt: readMappedDateString(config.resetAt, payload), + unit, + used, + window: config.window + }, "http-json"); +} + +function mappedMetersFromPayload(connector: ProviderAccountHttpJsonConnectorConfig, payload: unknown): ProviderAccountMeter[] { + const meters = connector.mapping.meters + .map((meter) => mappedMeterFromPayload(meter, payload)) + .filter((meter): meter is ProviderAccountMeter => Boolean(meter)); + return attachCodexRateLimitResetCreditDetails(meters, payload); +} + +function normalizeMeter(value: unknown, source: ProviderAccountConnectorSource): ProviderAccountMeter | undefined { + if (!isRecord(value)) { + return undefined; + } + const id = readString(value.id); + const label = readString(value.label); + const unit = readString(value.unit) as ProviderAccountMeterUnit | undefined; + if (!id || !label || !unit) { + return undefined; + } + const limit = normalizeNumber(value.limit); + const used = normalizeNumber(value.used); + const remaining = normalizeNumber(value.remaining) ?? (limit !== undefined && used !== undefined ? limit - used : undefined); + const details = normalizeMeterDetails(value.details); + return { + ...(details.length > 0 ? { details } : {}), + id, + kind: normalizeMeterKind(readString(value.kind)) ?? inferMeterKind(unit), + label, + limit, + remaining, + resetAt: readString(value.resetAt), + source, + unit, + used, + window: readString(value.window) + }; +} + +function normalizeMeterDetails(value: unknown): ProviderAccountMeterDetail[] { + if (!Array.isArray(value)) { + return []; + } + return value + .map(normalizeMeterDetail) + .filter((detail): detail is ProviderAccountMeterDetail => Boolean(detail)); +} + +function normalizeMeterDetail(value: unknown): ProviderAccountMeterDetail | undefined { + if (!isRecord(value)) { + return undefined; + } + const detail: ProviderAccountMeterDetail = { + description: readString(value.description), + effectiveAt: readString(value.effectiveAt), + expiresAt: readString(value.expiresAt), + id: readString(value.id), + label: readString(value.label), + redeemable: readBoolean(value.redeemable), + status: readString(value.status) + }; + return detail.description || detail.effectiveAt || detail.expiresAt || detail.id || detail.label || detail.redeemable !== undefined || detail.status ? detail : undefined; +} + +function materializeProviderAccountRequest( + config: AppConfig, + provider: GatewayProviderConfig +): MaterializedProviderAccountRequest { + if (providerApiKey(provider) !== localAgentProviderApiKey) { + return { provider }; + } + + const credential = localAgentProviderAccountCredential(config, provider); + if (!credential?.apiKey) { + throw new Error("Local agent account credential was not found. Sign in again, then re-import the local login provider."); + } + + return { + headers: credential.headers, + provider: { + ...provider, + api_key: credential.apiKey, + apiKey: undefined, + apikey: undefined + } + }; +} + +function providerAccountConnectorUsesProviderApiKey( + connector: ProviderAccountStandardConnectorConfig | ProviderAccountHttpJsonConnectorConfig +): boolean { + return (connector.auth ?? "provider-api-key") !== "none"; +} + +function localAgentProviderAccountCredential( + config: AppConfig, + provider: GatewayProviderConfig +): { apiKey?: string; headers?: Record } | undefined { + for (const plugin of config.providerPlugins ?? []) { + if (!localAgentProviderPluginMatches(plugin, provider)) { + continue; + } + + const key = readString((plugin as { key?: unknown }).key)?.toLowerCase() ?? ""; + if (key.includes("codex-oauth")) { + return localCodexAccountCredential(plugin); + } + if (key.includes("claude-code-oauth")) { + return localBearerAccountCredential(plugin); + } + if (key.includes("zcode-api-key")) { + return localApiKeyHeaderAccountCredential(plugin); + } + } + return undefined; +} + +function localAgentProviderPluginMatches(plugin: unknown, provider: GatewayProviderConfig): plugin is Record { + if (!isRecord(plugin)) { + return false; + } + const key = readString(plugin.key)?.toLowerCase() ?? ""; + if (!key.startsWith("ccr-local-agent-")) { + return false; + } + + const pluginProviderName = readString(plugin.providerName) || readString(plugin.provider); + if (!pluginProviderName) { + return false; + } + + const providerNames = new Set([ + provider.name, + provider.type ? `${provider.name}::${provider.type}` : "" + ].map((value) => value.trim().toLowerCase()).filter(Boolean)); + return providerNames.has(pluginProviderName.trim().toLowerCase()); +} + +function localCodexAccountCredential(plugin: Record): { apiKey?: string; headers?: Record } { + const codexOauth = isRecord(plugin.codexOauth) ? plugin.codexOauth : {}; + const codexAuth = readCodexAuth(); + // Imported plugins contain a point-in-time access token. Prefer the live Codex + // auth file so account checks follow tokens refreshed by Codex CLI/App. + const apiKey = + codexAuth?.accessToken || + readString(codexOauth.accessToken) || + readString(codexOauth.access_token); + const accountId = + codexAuth?.accountId || + readString(codexOauth.accountId) || + readString(codexOauth.account_id); + const headers = { + ...localProviderPluginAuthHeaders(plugin), + ...(accountId ? { "ChatGPT-Account-Id": accountId } : {}), + ...(codexAuth?.isFedrampAccount ? { "X-OpenAI-Fedramp": "true" } : {}) + }; + return { + apiKey, + headers + }; +} + +function localBearerAccountCredential(plugin: Record): { apiKey?: string; headers?: Record } { + const headers = localProviderPluginAuthHeaders(plugin); + const apiKey = readBearerToken(headers.authorization || headers.Authorization); + return { + apiKey, + headers: withoutHeader(headers, "authorization") + }; +} + +function localApiKeyHeaderAccountCredential(plugin: Record): { apiKey?: string; headers?: Record } { + const headers = localProviderPluginAuthHeaders(plugin); + const apiKey = headers["x-api-key"] || headers["X-API-Key"]; + return { + apiKey, + headers: withoutHeader(headers, "x-api-key") + }; +} + +function localProviderPluginAuthHeaders(plugin: Record): Record { + const auth = isRecord(plugin.auth) ? plugin.auth : {}; + const headers = isRecord(auth.headers) ? auth.headers : {}; + return Object.fromEntries( + Object.entries(headers) + .map(([key, value]) => [key, readString(value)] as const) + .filter((entry): entry is readonly [string, string] => Boolean(entry[1])) + ); +} + +function withoutHeader(headers: Record, header: string): Record { + const normalized = header.toLowerCase(); + return Object.fromEntries(Object.entries(headers).filter(([key]) => key.toLowerCase() !== normalized)); +} + +function readBearerToken(value: string | undefined): string | undefined { + const match = value?.match(/^Bearer\s+(.+)$/i); + return match?.[1]?.trim() || undefined; +} + +async function fetchJson( + endpoint: string, + provider: GatewayProviderConfig, + auth: ProviderAccountAuthMode = "provider-api-key", + headers: Record | undefined = undefined, + method: "GET" | "POST" = "GET", + body?: unknown +): Promise { + const apiKey = providerApiKey(provider); + const requestHeaders: Record = { + accept: "application/json", + ...(headers ?? {}) + }; + if ((auth === "provider-api-key" || auth === "provider-api-key-raw") && apiKey) { + const safetyIssue = providerEndpointCanReceiveProviderApiKey({ + apiKey, + endpoint, + providerName: provider.name, + providerPresetId: findProviderPresetByBaseUrl(providerBaseUrl(provider))?.id + }); + if (safetyIssue) { + throw new Error(safetyIssue.message); + } + requestHeaders.authorization = requestHeaders.authorization ?? (auth === "provider-api-key-raw" ? apiKey : `Bearer ${apiKey}`); + } + if (method === "POST") { + requestHeaders["content-type"] = requestHeaders["content-type"] ?? "application/json"; + } + + const response = await fetchWithSystemProxy(endpoint, { + body: method === "POST" ? JSON.stringify(body ?? {}) : undefined, + headers: requestHeaders, + method + }); + return await readJsonResponse(response); +} + +async function readJsonResponse(response: Response): Promise { + const contentType = response.headers.get("content-type") ?? ""; + const text = await response.text(); + if (!response.ok) { + const errorMessage = jsonErrorMessage(text) || readableResponseSnippet(text) || response.statusText; + throw new Error(`Account endpoint returned HTTP ${response.status}${errorMessage ? `: ${errorMessage}` : ""}.`); + } + if (!responseLooksJson(contentType, text)) { + throw new Error(`Account endpoint returned non-JSON response${contentType ? ` (${contentType.split(";")[0]})` : ""}.`); + } + try { + return JSON.parse(text) as unknown; + } catch { + throw new Error("Account endpoint returned malformed JSON."); + } +} + +function responseLooksJson(contentType: string, text: string): boolean { + const normalizedContentType = contentType.toLowerCase(); + if (normalizedContentType.includes("json")) { + return true; + } + return /^[\s]*[\[{]/.test(text); +} + +function jsonErrorMessage(text: string): string | undefined { + if (!responseLooksJson("", text)) { + return undefined; + } + try { + const payload = JSON.parse(text) as unknown; + if (!isRecord(payload)) { + return undefined; + } + const directMessage = readString(payload.message) || readString(payload.detail); + if (directMessage) { + return directMessage; + } + if (isRecord(payload.error)) { + return readString(payload.error.message) || readString(payload.error.type); + } + return readString(payload.error); + } catch { + return undefined; + } +} + +function readableResponseSnippet(text: string): string | undefined { + const compact = text.replace(/<[^>]*>/g, " ").replace(/\s+/g, " ").trim(); + if (!compact) { + return undefined; + } + return compact.length > 160 ? `${compact.slice(0, 157)}...` : compact; +} + +function standardConnectorEndpoints(provider: GatewayProviderConfig, connector: ProviderAccountStandardConnectorConfig): string[] { + const configured = [ + connector.endpoint, + ...(connector.endpoints ?? []) + ].filter((value): value is string => Boolean(value?.trim())); + if (configured.length > 0) { + return configured.map((endpoint) => absoluteAccountEndpoint(provider, endpoint)); + } + + const baseUrl = providerBaseUrl(provider); + if (!baseUrl) { + return []; + } + return standardAccountPaths.map((path) => absoluteAccountEndpoint(provider, path)); +} + +function absoluteAccountEndpoint(provider: GatewayProviderConfig, endpoint: string): string { + if (/^https?:\/\//i.test(endpoint)) { + return endpoint; + } + const baseUrl = providerBaseUrl(provider); + if (!baseUrl) { + return endpoint; + } + const url = new URL(providerUrlWithDefaultScheme(normalizeProviderBaseUrl(baseUrl))); + url.pathname = endpoint.startsWith("/") ? endpoint : joinUrlPath(url.pathname, endpoint); + url.search = ""; + url.hash = ""; + return url.toString(); +} + +function providerBaseUrl(provider: GatewayProviderConfig): string { + return provider.api_base_url || provider.baseUrl || provider.baseurl || ""; +} + +function providerApiKey(provider: GatewayProviderConfig): string { + return provider.api_key || provider.apiKey || provider.apikey || ""; +} + +function providerCredentialRuntimeId( + provider: GatewayProviderConfig, + credential: ProviderCredentialConfig, + index = provider.credentials?.indexOf(credential) ?? -1 +): string { + const explicitId = credential.id?.trim(); + if (explicitId) { + return explicitId; + } + const oneBasedIndex = index >= 0 ? index + 1 : 1; + const label = credential.name?.trim() || credential.label?.trim(); + return label ? `${providerCredentialSlug(label)}-${oneBasedIndex}` : `key-${oneBasedIndex}`; +} + +function providerCredentialApiKey(credential: ProviderCredentialConfig): string { + return credential.api_key || credential.apiKey || credential.apikey || ""; +} + +function providerCredentialSlug(value: string | undefined): string { + return (value ?? "") + .trim() + .toLowerCase() + .replace(/[^a-z0-9_.-]+/g, "-") + .replace(/^-+|-+$/g, "") || "key"; +} + +function localEstimateWindowStart(window: string, now: Date): Date { + const start = new Date(now); + if (window === "5h") { + start.setHours(start.getHours() - 5); + return start; + } + if (window === "weekly") { + start.setDate(start.getDate() - start.getDay()); + start.setHours(0, 0, 0, 0); + return start; + } + if (window === "monthly") { + start.setDate(1); + start.setHours(0, 0, 0, 0); + return start; + } + start.setHours(0, 0, 0, 0); + return start; +} + +function localEstimateResetAt(window: string, now: Date): Date { + const resetAt = localEstimateWindowStart(window, now); + if (window === "5h") { + resetAt.setHours(resetAt.getHours() + 5); + return resetAt; + } + if (window === "weekly") { + resetAt.setDate(resetAt.getDate() + 7); + return resetAt; + } + if (window === "monthly") { + resetAt.setMonth(resetAt.getMonth() + 1); + return resetAt; + } + resetAt.setDate(resetAt.getDate() + 1); + return resetAt; +} + +function statusFromMeters( + meters: ProviderAccountMeter[], + errors: ProviderAccountConnectorError[], + connectorCount: number +): ProviderAccountStatus { + if (meters.length === 0) { + return errors.length > 0 ? "error" : connectorCount > 0 ? "unsupported" : "unsupported"; + } + + let status: ProviderAccountStatus = errors.length > 0 ? "warning" : "ok"; + for (const meter of meters) { + const ratio = meterRemainingRatio(meter); + if (ratio === undefined) { + continue; + } + if (ratio <= 0.05) { + status = "critical"; + continue; + } + if (ratio <= 0.2 && status !== "critical") { + status = "warning"; + } + } + return status; +} + +function meterRemainingRatio(meter: ProviderAccountMeter): number | undefined { + const limit = normalizeNumber(meter.limit); + const remaining = normalizeNumber(meter.remaining); + if (!limit || limit <= 0 || remaining === undefined) { + return undefined; + } + return remaining / limit; +} + +function mostSevereStatus(statuses: ProviderAccountStatus[]): ProviderAccountStatus | undefined { + if (statuses.length === 0) { + return undefined; + } + const severity: Record = { + critical: 4, + error: 5, + ok: 1, + unsupported: 0, + warning: 3 + }; + return statuses.sort((a, b) => severity[b] - severity[a])[0]; +} + +function connectorError(source: ProviderAccountConnectorSource, message: string, connectorId?: string): ConnectorResult { + return { + errors: [{ connectorId, message, source }], + meters: [], + source, + status: source === "unsupported" ? "unsupported" : "error" + }; +} + +function connectorSource(connector: ProviderAccountConnectorConfig): ProviderAccountConnectorSource { + return connector.type === "standard" || connector.type === "http-json" || connector.type === "plugin" || connector.type === "local-estimate" + ? connector.type + : "unsupported"; +} + +function connectorId(connector: ProviderAccountConnectorConfig): string | undefined { + return readString((connector as { id?: unknown }).id); +} + +function readConnectorType(connector: ProviderAccountConnectorConfig): string { + return readString((connector as { type?: unknown }).type) || "unknown"; +} + +type JsonPathBracketSelection = { + filter?: JsonPathFilterCondition[]; + key?: number | string; + nextIndex: number; +}; + +type JsonPathFilterCondition = { + expected: number | string; + path: string[]; +}; + +function readMappedNumber(value: ProviderAccountMappedNumberExpression | undefined, payload: unknown): number | undefined { + if (Array.isArray(value)) { + for (const candidate of value) { + const resolved = readMappedNumber(candidate, payload); + if (resolved !== undefined) { + return resolved; + } + } + return undefined; + } + if (typeof value === "number") { + return normalizeNumber(value); + } + if (!value) { + return undefined; + } + const resolved = resolveMappedNumberExpression(value, payload); + return normalizeNumber(resolved); +} + +function resolveMappedNumberExpression(expression: string, payload: unknown): unknown { + const subtraction = splitMappedSubtractionExpression(expression); + if (subtraction) { + const left = normalizeNumber(resolveMappedNumberTerm(subtraction.left, payload)); + const right = normalizeNumber(resolveMappedNumberTerm(subtraction.right, payload)); + return left === undefined || right === undefined ? undefined : left - right; + } + return resolveMappedNumberTerm(expression, payload); +} + +function splitMappedSubtractionExpression(expression: string): { left: string; right: string } | undefined { + const match = expression.match(/^(.+?)\s+-\s+(.+)$/); + if (!match) { + return undefined; + } + return { + left: match[1]?.trim() ?? "", + right: match[2]?.trim() ?? "" + }; +} + +function resolveMappedNumberTerm(term: string, payload: unknown): unknown { + const trimmed = term.trim(); + return trimmed.startsWith("$") ? readJsonPath(payload, trimmed) : trimmed; +} + +function readMappedString(value: ProviderAccountMappedStringExpression | undefined, payload: unknown): string | undefined { + if (Array.isArray(value)) { + for (const candidate of value) { + const resolved = readMappedString(candidate, payload); + if (resolved !== undefined) { + return resolved; + } + } + return undefined; + } + if (!value) { + return undefined; + } + const resolved = value.trim().startsWith("$") ? readJsonPath(payload, value) : value; + return readString(resolved); +} + +function readMappedDateString(value: ProviderAccountMappedStringExpression | undefined, payload: unknown): string | undefined { + if (Array.isArray(value)) { + for (const candidate of value) { + const resolved = readMappedDateString(candidate, payload); + if (resolved !== undefined) { + return resolved; + } + } + return undefined; + } + if (!value) { + return undefined; + } + const resolved = value.trim().startsWith("$") ? readJsonPath(payload, value) : value; + const numericTimestamp = typeof resolved === "number" + ? resolved + : typeof resolved === "string" && /^\d+$/.test(resolved.trim()) + ? Number(resolved) + : undefined; + if (numericTimestamp !== undefined && Number.isFinite(numericTimestamp)) { + const milliseconds = numericTimestamp < 1_000_000_000_000 ? numericTimestamp * 1000 : numericTimestamp; + const date = new Date(milliseconds); + return Number.isNaN(date.getTime()) ? undefined : date.toISOString(); + } + return readString(resolved); +} + +function readJsonPath(payload: unknown, path: string): unknown { + const trimmed = path.trim(); + if (trimmed === "$") { + return payload; + } + if (!trimmed.startsWith("$")) { + return undefined; + } + + let current = payload; + let index = 1; + while (index < trimmed.length) { + if (trimmed[index] === ".") { + const nextIndex = nextJsonPathBoundary(trimmed, index + 1); + const key = trimmed.slice(index + 1, nextIndex); + if (!key || !isRecord(current)) { + return undefined; + } + current = readJsonRecordValue(current, key); + index = nextIndex; + continue; + } + + if (trimmed[index] === "[") { + const parsed = readJsonPathBracket(trimmed, index); + if (!parsed) { + return undefined; + } + if (parsed.filter) { + if (!Array.isArray(current)) { + return undefined; + } + current = current.find((item) => jsonPathFilterMatches(item, parsed.filter ?? [])); + } else if (typeof parsed.key === "number") { + if (!Array.isArray(current)) { + return undefined; + } + current = current[parsed.key]; + } else if (typeof parsed.key === "string") { + if (!isRecord(current)) { + return undefined; + } + current = readJsonRecordValue(current, parsed.key); + } else { + return undefined; + } + index = parsed.nextIndex; + continue; + } + + return undefined; + } + return current; +} + +function nextJsonPathBoundary(path: string, startIndex: number): number { + let index = startIndex; + while (index < path.length && path[index] !== "." && path[index] !== "[") { + index += 1; + } + return index; +} + +function readJsonRecordValue(record: Record, key: string): unknown { + if (Object.prototype.hasOwnProperty.call(record, key)) { + return record[key]; + } + for (const alternate of jsonPathKeyAlternates(key)) { + if (Object.prototype.hasOwnProperty.call(record, alternate)) { + return record[alternate]; + } + } + return undefined; +} + +function jsonPathKeyAlternates(key: string): string[] { + const alternates = new Set(); + const camel = key.replace(/[_-]([a-zA-Z0-9])/g, (_match, letter: string) => letter.toUpperCase()); + if (camel !== key) { + alternates.add(camel); + } + const snake = key + .replace(/([a-z0-9])([A-Z])/g, "$1_$2") + .replace(/-/g, "_") + .toLowerCase(); + if (snake !== key) { + alternates.add(snake); + } + return [...alternates]; +} + +function readJsonPathBracket(path: string, startIndex: number): JsonPathBracketSelection | undefined { + if (path[startIndex] !== "[") { + return undefined; + } + const quote = path[startIndex + 1]; + if (quote === "\"" || quote === "'") { + let index = startIndex + 2; + let escaped = false; + while (index < path.length) { + const char = path[index]; + if (!escaped && char === quote) { + const raw = path.slice(startIndex + 1, index + 1); + if (path[index + 1] !== "]") { + return undefined; + } + try { + return { + key: JSON.parse(quote === "'" ? `"${raw.slice(1, -1).replace(/"/g, "\\\"")}"` : raw), + nextIndex: index + 2 + }; + } catch { + return undefined; + } + } + escaped = !escaped && char === "\\"; + if (char !== "\\") { + escaped = false; + } + index += 1; + } + return undefined; + } + + const endIndex = path.indexOf("]", startIndex + 1); + if (endIndex < 0) { + return undefined; + } + const rawIndex = path.slice(startIndex + 1, endIndex).trim(); + if (/^\d+$/.test(rawIndex)) { + return { + key: Number(rawIndex), + nextIndex: endIndex + 1 + }; + } + const filter = parseJsonPathFilter(rawIndex); + return filter + ? { + filter, + nextIndex: endIndex + 1 + } + : undefined; +} + +function parseJsonPathFilter(raw: string): JsonPathFilterCondition[] | undefined { + const match = raw.match(/^\?\((.*)\)$/); + if (!match) { + return undefined; + } + const conditions = match[1] + .split(/\s+&&\s+/) + .map((condition) => parseJsonPathFilterCondition(condition.trim())); + if (conditions.some((condition) => !condition)) { + return undefined; + } + return conditions as JsonPathFilterCondition[]; +} + +function parseJsonPathFilterCondition(condition: string): JsonPathFilterCondition | undefined { + const match = condition.match(/^@((?:\.[A-Za-z_$][A-Za-z0-9_$]*)+)\s*==\s*(?:"([^"]*)"|'([^']*)'|(-?\d+(?:\.\d+)?))$/); + if (!match) { + return undefined; + } + const path = match[1] + ?.slice(1) + .split(".") + .filter(Boolean); + if (!path?.length) { + return undefined; + } + const expected = match[2] ?? match[3] ?? match[4]; + if (expected === undefined) { + return undefined; + } + return { + expected: match[4] !== undefined ? Number(expected) : expected, + path + }; +} + +function jsonPathFilterMatches(value: unknown, conditions: JsonPathFilterCondition[]): boolean { + return conditions.every((condition) => { + const actual = condition.path.reduce((current, key) => isRecord(current) ? readJsonRecordValue(current, key) : undefined, value); + if (typeof condition.expected === "number") { + return normalizeNumber(actual) === condition.expected; + } + return actual === condition.expected; + }); +} + +function normalizeMeterKind(value: string | undefined): ProviderAccountMeterKind | undefined { + if (value === "balance" || value === "subscription" || value === "quota" || value === "time_window" || value === "tokens" || value === "requests") { + return value; + } + return undefined; +} + +function inferMeterKind(unit: string): ProviderAccountMeterKind { + if (unit === "tokens") { + return "tokens"; + } + if (unit === "requests") { + return "requests"; + } + if (unit === "hours" || unit === "minutes") { + return "time_window"; + } + return "balance"; +} + +function normalizeStatus(value: string | undefined): ProviderAccountStatus | undefined { + if (value === "ok" || value === "warning" || value === "critical" || value === "error" || value === "unsupported") { + return value; + } + return undefined; +} + +function normalizeNumber(value: unknown): number | undefined { + if (typeof value === "number" && Number.isFinite(value)) { + return value; + } + if (typeof value === "string" && value.trim()) { + const parsed = Number(value); + return Number.isFinite(parsed) ? parsed : undefined; + } + return undefined; +} + +function normalizeRefreshInterval(value: number | undefined): number { + return Math.max(minRefreshIntervalMs, value && Number.isFinite(value) ? value : defaultRefreshIntervalMs); +} + +function normalizeProviderName(value: string | undefined): string { + return value?.trim().toLowerCase() ?? ""; +} + +function readString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function readBoolean(value: unknown): boolean | undefined { + return typeof value === "boolean" ? value : undefined; +} + +function joinUrlPath(basePath: string, suffix: string): string { + const normalizedBase = basePath === "/" ? "" : basePath.replace(/\/+$/, ""); + const normalizedSuffix = suffix.startsWith("/") ? suffix : `/${suffix}`; + return `${normalizedBase}${normalizedSuffix}`; +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + +function flattenJsonPaths(value: unknown, path = "$", depth = 0): ProviderAccountTestPath[] { + if (depth > 12) { + return [{ path, preview: previewJsonValue(value), type: jsonValueType(value) }]; + } + if (Array.isArray(value)) { + if (value.length === 0) { + return [{ path, preview: "[]", type: "array" }]; + } + return value.flatMap((item, index) => flattenJsonPaths(item, `${path}[${index}]`, depth + 1)); + } + if (isRecord(value)) { + const entries = Object.entries(value); + if (entries.length === 0) { + return [{ path, preview: "{}", type: "object" }]; + } + return entries.flatMap(([key, item]) => flattenJsonPaths(item, `${path}${escapeJsonPathSegment(key)}`, depth + 1)); + } + return [{ path, preview: previewJsonValue(value), type: jsonValueType(value) }]; +} + +function escapeJsonPathSegment(value: string): string { + return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value) ? `.${value}` : `[${JSON.stringify(value)}]`; +} + +function previewJsonValue(value: unknown): string { + const preview = typeof value === "string" ? value : JSON.stringify(value); + if (preview === undefined) { + return String(value); + } + return preview.length > 140 ? `${preview.slice(0, 137)}...` : preview; +} + +function jsonValueType(value: unknown): ProviderAccountTestPath["type"] { + if (Array.isArray(value)) { + return "array"; + } + if (value === null) { + return "null"; + } + if (typeof value === "object") { + return "object"; + } + if (typeof value === "number") { + return "number"; + } + if (typeof value === "boolean") { + return "boolean"; + } + return "string"; +} diff --git a/packages/core/src/providers/icons.ts b/packages/core/src/providers/icons.ts new file mode 100644 index 0000000..78f2c17 --- /dev/null +++ b/packages/core/src/providers/icons.ts @@ -0,0 +1,313 @@ +import { createHash } from "node:crypto"; +import { existsSync, mkdirSync, readdirSync, writeFileSync } from "node:fs"; +import path from "node:path"; +import { pathToFileURL } from "node:url"; +import { PROVIDER_ICON_CACHE_DIR } from "@ccr/core/config/constants"; +import { fetchWithSystemProxy } from "@ccr/core/proxy/system-proxy-fetch"; +import type { ProviderIconDetectionRequest, ProviderIconDetectionResult } from "@ccr/core/contracts/app"; +import { compactProviderUrl, providerUrlWithDefaultScheme } from "@ccr/core/providers/url"; + +const faviconServiceUrl = "https://t0.gstatic.com/faviconV2"; +const maxProviderIconBytes = 1024 * 1024; +const providerIconFetchTimeoutMs = 8_000; +const providerIconUserAgent = "Mozilla/5.0 (compatible; ClaudeCodeRouter/3.0; +https://github.com/)"; + +export async function detectProviderIcon(request: ProviderIconDetectionRequest): Promise { + const siteUrls = providerIconSiteUrls(request.baseUrl); + if (siteUrls.length === 0) { + return {}; + } + + const cacheKey = providerIconCacheKey(siteUrls[0]); + const cachedFile = request.force ? undefined : findCachedProviderIcon(cacheKey); + if (cachedFile) { + return { + cachedFile, + icon: pathToFileURL(cachedFile).toString() + }; + } + + const candidates = await providerIconCandidateUrls(siteUrls, request.sourceUrls); + for (const sourceUrl of candidates) { + const downloaded = await downloadProviderIconCandidate(sourceUrl, cacheKey); + if (downloaded) { + return { + cachedFile: downloaded, + icon: pathToFileURL(downloaded).toString(), + sourceUrl + }; + } + } + + return {}; +} + +function providerIconSiteUrls(value: string): string[] { + const raw = value.trim(); + if (!raw) { + return []; + } + + try { + const inputUrl = new URL(providerUrlWithDefaultScheme(raw)); + if (!["http:", "https:"].includes(inputUrl.protocol)) { + return []; + } + inputUrl.username = ""; + inputUrl.password = ""; + inputUrl.hash = ""; + inputUrl.search = ""; + inputUrl.pathname = "/"; + + const urls: string[] = []; + const strippedHost = stripCommonProviderSubdomain(inputUrl.hostname); + if (strippedHost && strippedHost !== inputUrl.hostname) { + const strippedUrl = new URL(inputUrl.toString()); + strippedUrl.hostname = strippedHost; + urls.push(compactProviderUrl(strippedUrl)); + } + urls.push(compactProviderUrl(inputUrl)); + + return uniqueStrings(urls); + } catch { + return []; + } +} + +async function providerIconCandidateUrls(siteUrls: string[], sourceUrls: string[] | undefined): Promise { + const explicitCandidates = providerIconSourceUrls(sourceUrls); + const serviceCandidates = siteUrls.map((siteUrl) => { + const params = new URLSearchParams({ + client: "SOCIAL", + fallback_opts: "TYPE,SIZE,URL", + size: "256", + type: "FAVICON", + url: siteUrl + }); + return `${faviconServiceUrl}?${params.toString()}`; + }); + const directCandidates = siteUrls.flatMap((siteUrl) => [ + new URL("/favicon.ico", siteUrl).toString(), + new URL("/favicon.png", siteUrl).toString(), + new URL("/apple-touch-icon.png", siteUrl).toString() + ]); + const htmlCandidates = await discoverHtmlProviderIconUrls(siteUrls); + + return uniqueStrings([...explicitCandidates, ...serviceCandidates, ...htmlCandidates, ...directCandidates]); +} + +function providerIconSourceUrls(sourceUrls: string[] | undefined): string[] { + if (!Array.isArray(sourceUrls)) { + return []; + } + return sourceUrls + .map((value) => value.trim()) + .filter(Boolean) + .flatMap((value) => { + try { + const url = new URL(value); + return ["http:", "https:"].includes(url.protocol) ? [url.toString()] : []; + } catch { + return []; + } + }); +} + +async function discoverHtmlProviderIconUrls(siteUrls: string[]): Promise { + const candidates: string[] = []; + for (const siteUrl of siteUrls) { + try { + const response = await fetchWithTimeout(siteUrl); + if (!response.ok) { + continue; + } + const contentType = response.headers.get("content-type")?.toLowerCase() ?? ""; + if (!contentType.includes("text/html")) { + continue; + } + const html = await response.text(); + candidates.push(...parseHtmlIconLinks(html, siteUrl)); + } catch { + // Icon discovery is best effort; direct and favicon-service candidates remain available. + } + } + return uniqueStrings(candidates); +} + +function parseHtmlIconLinks(html: string, baseUrl: string): string[] { + const links: string[] = []; + for (const match of html.matchAll(/]*>/gi)) { + const tag = match[0]; + const rel = readHtmlAttribute(tag, "rel")?.toLowerCase() ?? ""; + if (!/(^|\s)(icon|shortcut icon|apple-touch-icon|mask-icon)(\s|$)/i.test(rel)) { + continue; + } + const href = readHtmlAttribute(tag, "href"); + if (!href) { + continue; + } + try { + const url = new URL(href, baseUrl); + if (["http:", "https:"].includes(url.protocol)) { + links.push(url.toString()); + } + } catch { + // Ignore malformed icon links from provider pages. + } + } + return links; +} + +function readHtmlAttribute(tag: string, name: string): string | undefined { + const pattern = new RegExp(`\\s${name}\\s*=\\s*(?:"([^"]*)"|'([^']*)'|([^\\s>]+))`, "i"); + const match = tag.match(pattern); + return match?.[1] ?? match?.[2] ?? match?.[3]; +} + +async function downloadProviderIconCandidate(sourceUrl: string, cacheKey: string): Promise { + try { + const response = await fetchWithTimeout(sourceUrl); + if (!response.ok) { + return undefined; + } + + const contentLength = Number(response.headers.get("content-length") ?? "0"); + if (contentLength > maxProviderIconBytes) { + return undefined; + } + + const buffer = Buffer.from(await response.arrayBuffer()); + if (buffer.length === 0 || buffer.length > maxProviderIconBytes) { + return undefined; + } + + const mimeType = response.headers.get("content-type")?.split(";")[0]?.trim().toLowerCase() ?? ""; + if (!isProviderIconImage(mimeType, buffer)) { + return undefined; + } + + const extension = providerIconExtension(mimeType, buffer, sourceUrl); + mkdirSync(PROVIDER_ICON_CACHE_DIR, { recursive: true }); + const file = path.join(PROVIDER_ICON_CACHE_DIR, `${cacheKey}.${extension}`); + writeFileSync(file, buffer); + return file; + } catch { + return undefined; + } +} + +async function fetchWithTimeout(url: string): Promise { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), providerIconFetchTimeoutMs); + try { + return await fetchWithSystemProxy(url, { + headers: { + "User-Agent": providerIconUserAgent, + Accept: "image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.9,text/html;q=0.6,*/*;q=0.1" + }, + signal: controller.signal + }); + } finally { + clearTimeout(timeout); + } +} + +function findCachedProviderIcon(cacheKey: string): string | undefined { + if (!existsSync(PROVIDER_ICON_CACHE_DIR)) { + return undefined; + } + const match = readdirSync(PROVIDER_ICON_CACHE_DIR) + .find((filename) => filename.startsWith(`${cacheKey}.`) && providerIconFileExtensionIsAllowed(path.extname(filename).slice(1))); + return match ? path.join(PROVIDER_ICON_CACHE_DIR, match) : undefined; +} + +function providerIconCacheKey(value: string): string { + return createHash("sha256").update(value).digest("hex").slice(0, 32); +} + +function stripCommonProviderSubdomain(hostname: string): string { + return hostname.replace(/^(api|api-\w+|gateway|gateway-api|llm|llm-api|open)\./i, ""); +} + +function isProviderIconImage(mimeType: string, buffer: Buffer): boolean { + if (mimeType.startsWith("image/")) { + return true; + } + return Boolean(providerIconMagicExtension(buffer)); +} + +function providerIconExtension(mimeType: string, buffer: Buffer, sourceUrl: string): string { + const fromMime = providerIconExtensionFromMime(mimeType); + if (fromMime) { + return fromMime; + } + + const fromMagic = providerIconMagicExtension(buffer); + if (fromMagic) { + return fromMagic; + } + + try { + const fromPath = path.extname(new URL(sourceUrl).pathname).slice(1).toLowerCase(); + if (providerIconFileExtensionIsAllowed(fromPath)) { + return fromPath; + } + } catch { + // Fall through to png. + } + + return "png"; +} + +function providerIconExtensionFromMime(mimeType: string): string | undefined { + switch (mimeType) { + case "image/avif": + return "avif"; + case "image/gif": + return "gif"; + case "image/jpeg": + case "image/jpg": + return "jpg"; + case "image/png": + return "png"; + case "image/svg+xml": + return "svg"; + case "image/vnd.microsoft.icon": + case "image/x-icon": + return "ico"; + case "image/webp": + return "webp"; + default: + return undefined; + } +} + +function providerIconMagicExtension(buffer: Buffer): string | undefined { + if (buffer.length >= 8 && buffer.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))) { + return "png"; + } + if (buffer.length >= 4 && buffer.subarray(0, 4).equals(Buffer.from([0x00, 0x00, 0x01, 0x00]))) { + return "ico"; + } + if (buffer.length >= 4 && buffer.subarray(0, 4).toString("ascii") === "GIF8") { + return "gif"; + } + if (buffer.length >= 3 && buffer[0] === 0xff && buffer[1] === 0xd8 && buffer[2] === 0xff) { + return "jpg"; + } + if (buffer.length >= 12 && buffer.subarray(0, 4).toString("ascii") === "RIFF" && buffer.subarray(8, 12).toString("ascii") === "WEBP") { + return "webp"; + } + if (buffer.length >= 12 && buffer.subarray(4, 12).toString("ascii") === "ftypavif") { + return "avif"; + } + return undefined; +} + +function providerIconFileExtensionIsAllowed(extension: string): boolean { + return ["avif", "gif", "ico", "jpg", "jpeg", "png", "svg", "webp"].includes(extension.toLowerCase()); +} + +function uniqueStrings(values: string[]): string[] { + return values.filter((value, index) => value && values.indexOf(value) === index); +} diff --git a/packages/core/src/providers/manifest-service.ts b/packages/core/src/providers/manifest-service.ts new file mode 100644 index 0000000..40bdf89 --- /dev/null +++ b/packages/core/src/providers/manifest-service.ts @@ -0,0 +1,334 @@ +import { lookup } from "node:dns/promises"; +import https from "node:https"; +import net from "node:net"; +import { parseProviderManifestPayload } from "@ccr/core/contracts/deep-link"; +import { findProviderPresetByBaseUrl, providerEndpointCanReceiveProviderApiKey, providerIdentitySafetyIssue } from "@ccr/core/providers/presets/index"; +import { providerUrlWithDefaultScheme } from "@ccr/core/providers/url"; +import type { + GatewayProviderConfig, + ProviderAccountConnectorConfig, + ProviderAccountHttpJsonConnectorConfig, + ProviderAccountStandardConnectorConfig, + ProviderDeepLinkPayload, + ProviderManifestFetchRequest, + ProviderManifestFetchResult +} from "@ccr/core/contracts/app"; + +type SafeAddress = { + address: string; + family: 4 | 6; +}; + +const maxManifestBytes = 128 * 1024; +const maxRedirects = 3; +const manifestTimeoutMs = 8000; +const manifestUserAgent = "Claude-Code-Router/provider-manifest"; + +export async function fetchProviderManifest(request: ProviderManifestFetchRequest): Promise { + const manifestUrl = normalizeManifestUrl(request.url); + const text = await fetchManifestText(manifestUrl); + const parsed = JSON.parse(text) as unknown; + const provider = parseProviderManifestPayload(parsed); + delete provider.apiKey; + await validateRemoteManifestProvider(provider); + return { + fetchedAt: new Date().toISOString(), + provider, + url: manifestUrl.toString() + }; +} + +async function fetchManifestText(url: URL, redirectCount = 0): Promise { + const safeUrl = normalizeManifestUrl(url.toString()); + const address = await resolveSafeAddress(safeUrl.hostname); + + return new Promise((resolve, reject) => { + let settled = false; + const finish = (error: Error | undefined, value?: string) => { + if (settled) { + return; + } + settled = true; + if (error) { + reject(error); + } else { + resolve(value ?? ""); + } + }; + + const request = https.request({ + headers: { + accept: "application/json, application/manifest+json, application/vnd.ccr.provider+json", + "accept-encoding": "identity", + "user-agent": manifestUserAgent + }, + hostname: safeUrl.hostname, + lookup: (_hostname, _options, callback) => { + callback(null, address.address, address.family); + }, + method: "GET", + path: `${safeUrl.pathname}${safeUrl.search}`, + port: safeUrl.port ? Number(safeUrl.port) : 443, + protocol: "https:", + servername: safeUrl.hostname, + timeout: manifestTimeoutMs + }, (response) => { + const statusCode = response.statusCode ?? 0; + if (statusCode >= 300 && statusCode < 400) { + response.resume(); + if (redirectCount >= maxRedirects) { + finish(new Error("Provider manifest redirected too many times.")); + return; + } + const location = response.headers.location; + if (!location) { + finish(new Error("Provider manifest redirect did not include a Location header.")); + return; + } + const redirectedUrl = normalizeManifestUrl(new URL(location, safeUrl).toString()); + void fetchManifestText(redirectedUrl, redirectCount + 1).then((value) => finish(undefined, value), finish); + return; + } + + if (statusCode !== 200) { + response.resume(); + finish(new Error(`Provider manifest returned HTTP ${statusCode}.`)); + return; + } + + const contentEncoding = headerValue(response.headers["content-encoding"]).toLowerCase(); + if (contentEncoding && contentEncoding !== "identity") { + response.resume(); + finish(new Error("Provider manifest must be served without compression.")); + return; + } + + const contentType = headerValue(response.headers["content-type"]).split(";", 1)[0]?.trim().toLowerCase() ?? ""; + if (!isJsonContentType(contentType)) { + response.resume(); + finish(new Error("Provider manifest must be served as JSON.")); + return; + } + + const contentLength = Number(headerValue(response.headers["content-length"])); + if (Number.isFinite(contentLength) && contentLength > maxManifestBytes) { + response.resume(); + finish(new Error("Provider manifest is too large.")); + return; + } + + const chunks: Buffer[] = []; + let totalBytes = 0; + response.on("data", (chunk: Buffer) => { + totalBytes += chunk.length; + if (totalBytes > maxManifestBytes) { + request.destroy(new Error("Provider manifest is too large.")); + return; + } + chunks.push(chunk); + }); + response.once("end", () => { + finish(undefined, Buffer.concat(chunks).toString("utf8")); + }); + response.once("error", (error) => finish(error)); + }); + + request.once("timeout", () => { + request.destroy(new Error(`Provider manifest fetch timed out after ${manifestTimeoutMs}ms.`)); + }); + request.once("error", (error) => finish(error)); + request.end(); + }); +} + +function normalizeManifestUrl(value: string): URL { + const url = new URL(value.trim()); + if (url.protocol !== "https:") { + throw new Error("Provider manifest URL must use https."); + } + if (url.username || url.password) { + throw new Error("Provider manifest URL cannot include credentials."); + } + if (url.hash) { + url.hash = ""; + } + validateRemoteHostname(url.hostname, "Provider manifest URL"); + return url; +} + +async function validateRemoteManifestProvider(provider: ProviderDeepLinkPayload): Promise { + await validatePublicHttpsUrl(provider.baseUrl, "Provider Base URL"); + const identityIssue = providerIdentitySafetyIssue({ + baseUrl: provider.baseUrl, + name: provider.name + }); + if (identityIssue) { + throw new Error(identityIssue.message); + } + + const connectors = provider.account?.connectors ?? []; + for (const connector of connectors) { + await validateRemoteAccountConnector(provider, connector); + } +} + +async function validateRemoteAccountConnector(provider: ProviderDeepLinkPayload, connector: ProviderAccountConnectorConfig): Promise { + if (connector.type === "http-json") { + validateSafeHeaders(connector.headers); + const endpoint = (connector as ProviderAccountHttpJsonConnectorConfig).endpoint; + await validatePublicHttpsUrl(endpoint, "Fetch usage URL"); + validateProviderApiKeyTarget(provider, endpoint); + return; + } + if (connector.type === "standard") { + const standardConnector = connector as ProviderAccountStandardConnectorConfig; + validateSafeHeaders(standardConnector.headers); + const endpoints = [ + standardConnector.endpoint, + ...(standardConnector.endpoints ?? []) + ].filter((endpoint): endpoint is string => Boolean(endpoint?.trim())); + for (const endpoint of endpoints) { + if (/^https?:\/\//i.test(endpoint)) { + await validatePublicHttpsUrl(endpoint, "Fetch usage URL"); + validateProviderApiKeyTarget(provider, endpoint); + } + } + } +} + +function validateProviderApiKeyTarget(provider: ProviderDeepLinkPayload, endpoint: string): void { + const issue = providerEndpointCanReceiveProviderApiKey({ + apiKey: "manifest-provider-api-key", + endpoint, + providerName: provider.name, + providerPresetId: findProviderPresetByBaseUrl(provider.baseUrl)?.id + }); + if (issue) { + throw new Error(issue.message); + } +} + +async function validatePublicHttpsUrl(value: string, label: string): Promise { + const url = new URL(providerUrlWithDefaultScheme(value)); + if (url.protocol !== "https:") { + throw new Error(`${label} from a remote manifest must use https.`); + } + if (url.username || url.password) { + throw new Error(`${label} cannot include credentials.`); + } + validateRemoteHostname(url.hostname, label); + await resolveSafeAddress(url.hostname); +} + +function validateRemoteHostname(hostname: string, label: string): void { + const normalized = hostname.trim().toLowerCase().replace(/\.$/, ""); + if (!normalized) { + throw new Error(`${label} is invalid.`); + } + if ( + normalized === "localhost" || + normalized.endsWith(".localhost") || + normalized.endsWith(".home") || + normalized.endsWith(".lan") || + normalized.endsWith(".local") || + normalized.endsWith(".internal") + ) { + throw new Error(`${label} cannot target a local or internal host.`); + } +} + +async function resolveSafeAddress(hostname: string): Promise { + const addresses = await lookup(hostname, { all: true, verbatim: true }); + if (addresses.length === 0) { + throw new Error(`Could not resolve host: ${hostname}`); + } + + for (const address of addresses) { + if (!isPublicIpAddress(address.address)) { + throw new Error(`Remote manifest host resolved to a private or reserved address: ${address.address}`); + } + } + + const first = addresses[0]; + return { + address: first.address, + family: first.family === 6 ? 6 : 4 + }; +} + +function isPublicIpAddress(address: string): boolean { + const family = net.isIP(address); + if (family === 4) { + return isPublicIpv4(address); + } + if (family === 6) { + return isPublicIpv6(address); + } + return false; +} + +function isPublicIpv4(address: string): boolean { + const parts = address.split(".").map((part) => Number(part)); + if (parts.length !== 4 || parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255)) { + return false; + } + const [a, b, c, d] = parts; + return !( + a === 0 || + a === 10 || + a === 127 || + (a === 100 && b >= 64 && b <= 127) || + (a === 169 && b === 254) || + (a === 172 && b >= 16 && b <= 31) || + (a === 192 && b === 0) || + (a === 192 && b === 0 && c === 2) || + (a === 192 && b === 88 && c === 99) || + (a === 192 && b === 168) || + (a === 198 && (b === 18 || b === 19)) || + (a === 198 && b === 51 && c === 100) || + (a === 203 && b === 0 && c === 113) || + a >= 224 || + (a === 255 && b === 255 && c === 255 && d === 255) + ); +} + +function isPublicIpv6(address: string): boolean { + const normalized = address.toLowerCase(); + const mappedIpv4 = normalized.match(/::ffff:(\d+\.\d+\.\d+\.\d+)$/)?.[1]; + if (mappedIpv4) { + return isPublicIpv4(mappedIpv4); + } + return !( + normalized === "::" || + normalized === "::1" || + normalized.startsWith("100:") || + normalized.startsWith("2001:2:") || + normalized.startsWith("2001:10:") || + normalized.startsWith("2001:db8:") || + normalized.startsWith("2002:") || + normalized.startsWith("fc") || + normalized.startsWith("fd") || + /^fe[89a-f]/.test(normalized) || + normalized.startsWith("ff") + ); +} + +function validateSafeHeaders(headers: Record | undefined): void { + for (const key of Object.keys(headers ?? {})) { + const normalized = key.trim().toLowerCase(); + if (normalized === "authorization" || normalized === "cookie" || normalized === "proxy-authorization") { + throw new Error("Remote provider manifests cannot define sensitive Fetch usage headers."); + } + } +} + +function isJsonContentType(value: string): boolean { + return value === "application/json" || value.endsWith("+json"); +} + +function headerValue(value: string | string[] | number | undefined): string { + if (Array.isArray(value)) { + return value[0] ?? ""; + } + return value === undefined ? "" : String(value); +} diff --git a/packages/core/src/providers/model-catalog.ts b/packages/core/src/providers/model-catalog.ts new file mode 100644 index 0000000..ef57208 --- /dev/null +++ b/packages/core/src/providers/model-catalog.ts @@ -0,0 +1,507 @@ +import type { ProviderCatalogModelsRequest, ProviderCatalogModelsResult } from "@ccr/core/contracts/app"; +import { providerUrlWithDefaultScheme } from "@ccr/core/providers/url"; +import { loadModelCatalogPayload } from "@ccr/core/models/catalog-file"; +import { findProviderPreset, findProviderPresetByBaseUrl } from "@ccr/core/providers/presets/index"; + +type CatalogProviderEntry = { + apiUrls: string[]; + models: string[]; + provider: string; + providerName?: string; + tokens: string[]; +}; + +type CatalogIndex = { + loadedFrom?: string; + providers: CatalogProviderEntry[]; +}; + +type MutableCatalogProviderEntry = Omit & { + apiUrls: Set; + models: string[]; + modelSet: Set; + tokens: Set; +}; + +type CatalogMatch = { + entry: CatalogProviderEntry; + matchedBy: NonNullable; + score: number; +}; + +const presetCatalogProviderIds: Record = { + anthropic: ["anthropic"], + bailian: ["alibaba-cn"], + deepseek: ["deepseek"], + gemini: ["google"], + "kimi-coding": ["kimi-for-coding"], + mistral: ["mistral"], + moonshot: ["moonshotai-cn"], + "moonshot-global": ["moonshotai"], + openai: ["openai"], + openrouter: ["openrouter"], + siliconflow: ["siliconflow-cn"], + "zai-global-coding": ["zai-coding-plan"], + "zai-global-general": ["zai"], + "zhipu-cn-coding": ["zhipuai-coding-plan"], + "zhipu-cn-general": ["zhipuai"] +}; + +const presetCatalogModelOverrides: Record; models: string[]; provider?: string; providerName?: string }> = { + "kimi-coding": { + modelDisplayNames: { + "kimi-for-coding": "K2.7 Code" + }, + models: ["kimi-for-coding"], + provider: "kimi-for-coding", + providerName: "Kimi Code" + } +}; + +let catalogIndex: CatalogIndex | undefined; + +export function getProviderCatalogModels(request: ProviderCatalogModelsRequest): ProviderCatalogModelsResult { + const index = loadCatalogIndex(); + const modelOverride = providerCatalogModelOverride(request); + if (modelOverride) { + return { + loadedFrom: index.loadedFrom, + ...modelOverride + }; + } + + const match = findBestCatalogProviderMatch(index.providers, request); + if (!match) { + return { + loadedFrom: index.loadedFrom, + models: [] + }; + } + + return { + loadedFrom: index.loadedFrom, + matchedBy: match.matchedBy, + models: match.entry.models, + provider: match.entry.provider, + providerName: match.entry.providerName + }; +} + +function providerCatalogModelOverride(request: ProviderCatalogModelsRequest): ProviderCatalogModelsResult | undefined { + const providerPresetId = request.providerPresetId?.trim() || ""; + const providerPresetOverride = presetCatalogModelOverrides[providerPresetId]; + if (providerPresetOverride) { + return { + matchedBy: "provider-id", + modelDisplayNames: providerPresetOverride.modelDisplayNames, + models: providerPresetOverride.models, + provider: providerPresetOverride.provider, + providerName: providerPresetOverride.providerName + }; + } + + const baseUrlPresetId = request.baseUrl ? findProviderPresetByBaseUrl(request.baseUrl)?.id ?? "" : ""; + const baseUrlOverride = presetCatalogModelOverrides[baseUrlPresetId]; + if (baseUrlOverride) { + return { + matchedBy: "base-url", + modelDisplayNames: baseUrlOverride.modelDisplayNames, + models: baseUrlOverride.models, + provider: baseUrlOverride.provider, + providerName: baseUrlOverride.providerName + }; + } + + return undefined; +} + +function loadCatalogIndex(): CatalogIndex { + if (catalogIndex) { + return catalogIndex; + } + + try { + const loaded = loadModelCatalogPayload(); + if (loaded) { + catalogIndex = buildCatalogIndex(loaded.payload, loaded.loadedFrom); + return catalogIndex; + } + } catch (error) { + console.warn("Failed to load provider model catalog:", error); + } + + catalogIndex = { + providers: [] + }; + return catalogIndex; +} + +function buildCatalogIndex(payload: unknown, loadedFrom: string): CatalogIndex { + const providers = new Map(); + const models = isRecord(payload) && Array.isArray(payload.models) ? payload.models : []; + + for (const item of models) { + if (!isRecord(item)) { + continue; + } + + const sourceRecords = Array.isArray(item.sourceRecords) ? item.sourceRecords : []; + for (const sourceRecord of sourceRecords) { + if (!isRecord(sourceRecord)) { + continue; + } + if (!catalogModelCanRouteText(item, sourceRecord)) { + continue; + } + const provider = stringValue(sourceRecord.provider); + const model = providerModelName(sourceRecord, item); + if (!provider || !model) { + continue; + } + + const entry = providers.get(provider) ?? createMutableCatalogProviderEntry(provider); + const providerName = stringValue(sourceRecord.providerName); + const providerApi = stringValue(sourceRecord.providerApi); + if (!entry.providerName && providerName) { + entry.providerName = providerName; + } + addSetValue(entry.tokens, normalizeProviderToken(provider)); + addSetValue(entry.tokens, normalizeProviderToken(providerName)); + addSetValue(entry.tokens, normalizeProviderToken(providerApiHost(providerApi))); + addSetValue(entry.apiUrls, normalizeProviderUrl(providerApi)); + if (!entry.modelSet.has(model)) { + entry.modelSet.add(model); + entry.models.push(model); + } + providers.set(provider, entry); + } + } + + return { + loadedFrom, + providers: Array.from(providers.values()).map((entry) => ({ + apiUrls: Array.from(entry.apiUrls), + models: sortCatalogProviderModels(entry.models), + provider: entry.provider, + providerName: entry.providerName, + tokens: Array.from(entry.tokens) + })) + }; +} + +function createMutableCatalogProviderEntry(provider: string): MutableCatalogProviderEntry { + return { + apiUrls: new Set(), + models: [], + modelSet: new Set(), + provider, + tokens: new Set([normalizeProviderToken(provider)]) + }; +} + +function providerModelName(sourceRecord: Record, modelEntry: Record): string { + return stringValue(sourceRecord.model) || + stringValue(sourceRecord.modelKey) || + stringValue(modelEntry.model) || + stringValue(modelEntry.id); +} + +function sortCatalogProviderModels(models: string[]): string[] { + return models + .map((model, index) => ({ index, model })) + .sort((left, right) => + catalogProviderModelRank(left.model) - catalogProviderModelRank(right.model) || + left.index - right.index + ) + .map((item) => item.model); +} + +function catalogProviderModelRank(model: string): number { + const normalized = model.toLowerCase(); + if (normalized.startsWith("ft:") || normalized.includes("/ft:")) { + return 30; + } + if (normalized.includes("sonnet")) return 0; + if (normalized.includes("gpt-5") || normalized.includes("gpt-4o") || normalized.includes("gpt-4.1")) return 0; + if (/\bo[34]\b/.test(normalized) || /(^|[-_/])o[34]([-_/]|$)/.test(normalized)) return 1; + if (normalized.includes("opus")) return 1; + if (normalized.includes("gemini") && normalized.includes("pro")) return 1; + if (normalized.includes("deepseek-chat") || normalized.includes("kimi-k2") || normalized.includes("qwen3") || normalized.includes("glm-4.5") || normalized.includes("mistral-large")) return 2; + if (normalized.includes("haiku") || normalized.includes("flash")) return 3; + if (normalized.includes("mini") || normalized.includes("lite")) return 4; + return 10; +} + +function catalogModelCanRouteText(modelEntry: Record, sourceRecord: Record): boolean { + const mode = (stringValue(sourceRecord.mode) || stringValue(modelEntry.mode)).toLowerCase(); + if (/embedding|image|audio|speech|transcription|moderation|rerank/.test(mode)) { + return false; + } + + const modalities = isRecord(modelEntry.modalities) ? modelEntry.modalities : undefined; + const output = stringListValue(modalities?.output).map((item) => item.toLowerCase()); + return output.length === 0 || output.includes("text"); +} + +function findBestCatalogProviderMatch( + providers: CatalogProviderEntry[], + request: ProviderCatalogModelsRequest +): CatalogMatch | undefined { + const urlKeys = providerUrlLookupKeys(request.baseUrl); + const explicitProviderTokens = explicitProviderLookupTokens(request); + const nameTokens = providerNameLookupTokens(request); + const matches = providers + .map((entry) => catalogProviderMatch(entry, urlKeys, explicitProviderTokens, nameTokens)) + .filter((match): match is CatalogMatch => Boolean(match)) + .sort((left, right) => + left.score - right.score || + right.entry.models.length - left.entry.models.length || + left.entry.provider.localeCompare(right.entry.provider) + ); + + return matches[0]; +} + +function catalogProviderMatch( + entry: CatalogProviderEntry, + urlKeys: ProviderUrlKey[], + explicitProviderTokens: string[], + nameTokens: string[] +): CatalogMatch | undefined { + const urlScore = catalogProviderUrlScore(entry, urlKeys); + const explicitScore = catalogProviderTokenScore(entry, explicitProviderTokens); + if (urlScore !== undefined) { + return { + entry, + matchedBy: "base-url", + score: urlScore + (urlScore >= 12 ? explicitScore ?? 8 : 0) + }; + } + + if (explicitScore !== undefined) { + return { + entry, + matchedBy: "provider-id", + score: 20 + explicitScore + }; + } + + const nameScore = catalogProviderTokenScore(entry, nameTokens); + if (nameScore !== undefined) { + return { + entry, + matchedBy: "provider-name", + score: 40 + nameScore + }; + } + + return undefined; +} + +function explicitProviderLookupTokens(request: ProviderCatalogModelsRequest): string[] { + const presetIds = uniqueStrings([ + request.providerPresetId?.trim() || "", + request.baseUrl ? findProviderPresetByBaseUrl(request.baseUrl)?.id ?? "" : "" + ]); + const presetProviderIds = uniqueStrings(presetIds.flatMap((presetId) => presetCatalogProviderIds[presetId] ?? [])); + const presetTokens = presetProviderIds.length > 0 ? presetProviderIds : presetIds.flatMap((presetId) => { + const preset = findProviderPreset(presetId); + return [ + presetId, + preset?.name ?? "", + ...(preset?.aliases ?? []) + ]; + }); + + return uniqueStrings([ + ...(request.providerIds ?? []), + ...presetTokens + ].map(normalizeProviderToken)); +} + +function providerNameLookupTokens(request: ProviderCatalogModelsRequest): string[] { + return uniqueStrings([ + request.name ?? "", + request.baseUrl ? providerApiHost(request.baseUrl) : "" + ].map(normalizeProviderToken)); +} + +function catalogProviderUrlScore(entry: CatalogProviderEntry, urlKeys: ProviderUrlKey[]): number | undefined { + let bestScore: number | undefined; + for (const apiUrl of entry.apiUrls) { + const apiKey = providerUrlKey(apiUrl); + if (!apiKey) { + continue; + } + for (const key of urlKeys) { + const score = providerUrlMatchScore(apiKey, key); + if (score === undefined) { + continue; + } + bestScore = bestScore === undefined ? score : Math.min(bestScore, score); + } + } + return bestScore; +} + +function catalogProviderTokenScore(entry: CatalogProviderEntry, tokens: string[]): number | undefined { + let bestScore: number | undefined; + for (const token of tokens) { + if (!token) { + continue; + } + for (const entryToken of entry.tokens) { + if (!entryToken) { + continue; + } + const score = token === entryToken + ? 0 + : token.length >= 4 && entryToken.includes(token) + ? 8 + : entryToken.length >= 4 && token.includes(entryToken) + ? 10 + : undefined; + if (score === undefined) { + continue; + } + bestScore = bestScore === undefined ? score : Math.min(bestScore, score); + } + } + return bestScore; +} + +type ProviderUrlKey = { + host: string; + pathname: string; + protocol: string; +}; + +function providerUrlLookupKeys(value: string | undefined): ProviderUrlKey[] { + const normalized = normalizeProviderUrl(value); + const key = providerUrlKey(normalized); + if (!key) { + return []; + } + + const rootKey = providerUrlRootKey(key); + return rootKey.host !== key.host || rootKey.pathname !== key.pathname || rootKey.protocol !== key.protocol + ? [key, rootKey] + : [key]; +} + +function providerUrlKey(value: string): ProviderUrlKey | undefined { + if (!value) { + return undefined; + } + try { + const url = new URL(providerUrlWithDefaultScheme(value)); + url.username = ""; + url.password = ""; + url.hash = ""; + url.search = ""; + return { + host: url.host.toLowerCase(), + pathname: normalizeProviderPath(url.pathname), + protocol: url.protocol.toLowerCase() + }; + } catch { + return undefined; + } +} + +function providerUrlRootKey(key: ProviderUrlKey): ProviderUrlKey { + return { + ...key, + pathname: key.pathname.replace(/\/(v1|v1beta)$/i, "") || "/" + }; +} + +function providerUrlMatchScore(left: ProviderUrlKey, right: ProviderUrlKey): number | undefined { + if (left.protocol !== right.protocol || left.host !== right.host) { + return undefined; + } + if (left.pathname === right.pathname) { + return 0; + } + if (left.pathname === "/" || right.pathname === "/") { + return 12; + } + if (right.pathname.startsWith(`${left.pathname}/`) || left.pathname.startsWith(`${right.pathname}/`)) { + return 4; + } + return undefined; +} + +function normalizeProviderUrl(value: string | undefined): string { + const trimmed = value?.trim(); + if (!trimmed) { + return ""; + } + try { + const url = new URL(providerUrlWithDefaultScheme(trimmed)); + url.username = ""; + url.password = ""; + url.hash = ""; + url.search = ""; + url.pathname = normalizeProviderPath(url.pathname); + return url.toString().replace(/\/$/, ""); + } catch { + return trimmed.replace(/[?#].*$/, "").replace(/\/+$/, ""); + } +} + +function normalizeProviderPath(value: string): string { + const trimmed = value.replace(/\/+$/, ""); + return trimmed || "/"; +} + +function providerApiHost(value: string | undefined): string { + const normalized = normalizeProviderUrl(value); + if (!normalized) { + return ""; + } + try { + const host = new URL(providerUrlWithDefaultScheme(normalized)).hostname; + return host.replace(/^api\./i, ""); + } catch { + return ""; + } +} + +function normalizeProviderToken(value: string | undefined): string { + return value?.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fff]+/g, "") ?? ""; +} + +function addSetValue(values: Set, value: string): void { + if (value) { + values.add(value); + } +} + +function isRecord(value: unknown): value is Record { + return Boolean(value) && typeof value === "object" && !Array.isArray(value); +} + +function stringValue(value: unknown): string { + return typeof value === "string" ? value.trim() : ""; +} + +function stringListValue(value: unknown): string[] { + return Array.isArray(value) + ? value.map(stringValue).filter(Boolean) + : []; +} + +function uniqueStrings(values: string[]): string[] { + const seen = new Set(); + const result: string[] = []; + for (const value of values) { + const trimmed = value.trim(); + if (!trimmed || seen.has(trimmed)) { + continue; + } + seen.add(trimmed); + result.push(trimmed); + } + return result; +} diff --git a/packages/core/src/providers/new-api.ts b/packages/core/src/providers/new-api.ts new file mode 100644 index 0000000..44c2609 --- /dev/null +++ b/packages/core/src/providers/new-api.ts @@ -0,0 +1,92 @@ +import type { ProviderAccountConfig, ProviderAccountHttpJsonConnectorConfig } from "@ccr/core/contracts/app"; +import { compactProviderUrl, providerUrlWithDefaultScheme } from "@ccr/core/providers/url"; + +export type DetectedProviderKind = "new-api"; + +const newApiHeaderNames = ["x-new-api-version", "x-oneapi-request-id"]; + +export function detectedProviderFromHeaders(headers: Record): DetectedProviderKind | undefined { + return hasNewApiHeaders(headers) ? "new-api" : undefined; +} + +export function hasNewApiHeaders(headers: Record): boolean { + const normalized = new Set(Object.keys(headers).map((key) => key.toLowerCase())); + return newApiHeaderNames.some((header) => normalized.has(header)); +} + +export function newApiKeyUsageAccountConfig(baseUrl: string): ProviderAccountConfig { + return { + connectors: [ + { + auth: "provider-api-key", + endpoint: newApiKeyUsageEndpoint(baseUrl), + mapping: { + message: "$.message", + meters: [ + { + id: "new_api_key_quota", + kind: "quota", + label: "API key quota", + limit: "$.data.total_granted", + remaining: "$.data.total_available", + unit: "quota", + used: "$.data.total_used", + } + ] + }, + method: "GET", + parser: "new-api-key-usage", + type: "http-json" + } + ], + enabled: true + }; +} + +export function newApiKeyUsageEndpoint(baseUrl: string): string { + const root = newApiRootBaseUrl(baseUrl); + return `${root}/api/usage/token/`; +} + +export function newApiUserSelfConnectorConfig(baseUrl: string): ProviderAccountHttpJsonConnectorConfig { + return { + auth: "none", + endpoint: newApiUserSelfEndpoint(baseUrl), + headers: { + Authorization: "Bearer ", + "New-Api-User": "" + }, + mapping: { + meters: [ + { + id: "new_api_user_balance", + kind: "balance", + label: "User balance", + remaining: "$.data.quota", + unit: "quota", + used: "$.data.used_quota" + } + ] + }, + method: "GET", + parser: "new-api-user-self", + type: "http-json" + }; +} + +export function newApiUserSelfEndpoint(baseUrl: string): string { + const root = newApiRootBaseUrl(baseUrl); + return `${root}/api/user/self`; +} + +export function newApiRootBaseUrl(baseUrl: string): string { + try { + const url = new URL(providerUrlWithDefaultScheme(baseUrl.trim())); + url.pathname = url.pathname.replace(/\/+(v1|api)$/i, "").replace(/\/+$/, "") || "/"; + url.search = ""; + url.hash = ""; + return compactProviderUrl(url); + } catch { + return baseUrl.trim().replace(/[?#].*$/, "").replace(/\/+$/, "").replace(/\/(v1|api)$/i, ""); + } +} diff --git a/packages/core/src/providers/presets/anthropic/index.ts b/packages/core/src/providers/presets/anthropic/index.ts new file mode 100644 index 0000000..929a717 --- /dev/null +++ b/packages/core/src/providers/presets/anthropic/index.ts @@ -0,0 +1,19 @@ +import { defaultProviderAccountConfig, type ProviderPreset } from "@ccr/core/providers/presets/types"; + +export const anthropicProviderPreset: ProviderPreset = { + account: defaultProviderAccountConfig, + aliases: ["anthropic", "claude"], + defaultModels: ["claude-sonnet-4-20250514"], + endpoints: [ + { + baseUrl: "https://api.anthropic.com", + protocols: ["anthropic_messages"] + } + ], + id: "anthropic", + name: "Anthropic", + officialApiKeyPatterns: [ + { flags: "i", source: "^sk-ant-[a-z0-9_-]+$" } + ], + websiteUrl: "https://www.anthropic.com/" +}; diff --git a/packages/core/src/providers/presets/bailian/index.ts b/packages/core/src/providers/presets/bailian/index.ts new file mode 100644 index 0000000..5a21269 --- /dev/null +++ b/packages/core/src/providers/presets/bailian/index.ts @@ -0,0 +1,15 @@ +import { defaultProviderAccountConfig, type ProviderPreset } from "@ccr/core/providers/presets/types"; + +export const bailianProviderPreset: ProviderPreset = { + account: defaultProviderAccountConfig, + aliases: ["qwen", "dashscope", "bailian", "alibaba"], + endpoints: [ + { + baseUrl: "https://dashscope.aliyuncs.com/compatible-mode/v1", + protocols: ["openai_chat_completions"] + } + ], + id: "bailian", + name: "Alibaba Bailian", + websiteUrl: "https://bailian.console.aliyun.com/" +}; diff --git a/packages/core/src/providers/presets/claudeapi/index.ts b/packages/core/src/providers/presets/claudeapi/index.ts new file mode 100644 index 0000000..dbd10d7 --- /dev/null +++ b/packages/core/src/providers/presets/claudeapi/index.ts @@ -0,0 +1,15 @@ +import { defaultProviderAccountConfig, type ProviderPreset } from "@ccr/core/providers/presets/types"; + +export const claudeApiProviderPreset: ProviderPreset = { + account: defaultProviderAccountConfig, + aliases: ["claudeapi", "claudeapi.com", "www.claudeapi.com"], + endpoints: [ + { + baseUrl: "https://gw.claudeapi.com", + protocols: ["anthropic_messages"] + } + ], + id: "claudeapi", + name: "claudeapi", + websiteUrl: "https://console.claudeapi.com/agent/register/LbmB7Y9kPloyzhwF?utm_source=claudecoderouter&utm_medium=partner&utm_campaign=claudecoderouter_2026&utm_content=default" +}; diff --git a/packages/core/src/providers/presets/code0/index.ts b/packages/core/src/providers/presets/code0/index.ts new file mode 100644 index 0000000..1caf832 --- /dev/null +++ b/packages/core/src/providers/presets/code0/index.ts @@ -0,0 +1,15 @@ +import { defaultProviderAccountConfig, type ProviderPreset } from "@ccr/core/providers/presets/types"; + +export const code0ProviderPreset: ProviderPreset = { + account: defaultProviderAccountConfig, + aliases: ["code0", "code0.ai", "code 0"], + endpoints: [ + { + baseUrl: "https://console.code0.ai", + protocols: ["anthropic_messages", "openai_chat_completions", "openai_responses"] + } + ], + id: "code0", + name: "code0.ai", + websiteUrl: "https://code0.ai/agent/register/9n9jOsSnYQoemIVL?utm_source=claudecoderouter&utm_medium=partner&utm_campaign=claudecoderouter_2026&utm_content=default" +}; diff --git a/packages/core/src/providers/presets/deepseek/index.ts b/packages/core/src/providers/presets/deepseek/index.ts new file mode 100644 index 0000000..ee51cd3 --- /dev/null +++ b/packages/core/src/providers/presets/deepseek/index.ts @@ -0,0 +1,52 @@ +import type { ProviderAccountConfig } from "@ccr/core/contracts/app"; +import type { ProviderPreset } from "@ccr/core/providers/presets/types"; + +const deepSeekProviderAccountConfig: ProviderAccountConfig = { + connectors: [ + { + auth: "provider-api-key", + endpoint: "https://api.deepseek.com/user/balance", + mapping: { + meters: [ + { + id: "balance", + kind: "balance", + label: "Balance", + remaining: "$.balance_infos[0].total_balance", + unit: "$.balance_infos[0].currency" + }, + { + id: "granted_balance", + kind: "balance", + label: "Granted balance", + remaining: "$.balance_infos[0].granted_balance", + unit: "$.balance_infos[0].currency" + }, + { + id: "topped_up_balance", + kind: "balance", + label: "Topped-up balance", + remaining: "$.balance_infos[0].topped_up_balance", + unit: "$.balance_infos[0].currency" + } + ] + }, + type: "http-json" + } + ], + enabled: true +}; + +export const deepSeekProviderPreset: ProviderPreset = { + account: deepSeekProviderAccountConfig, + aliases: ["deepseek"], + endpoints: [ + { + baseUrl: "https://api.deepseek.com", + protocols: ["openai_chat_completions"] + } + ], + id: "deepseek", + name: "DeepSeek", + websiteUrl: "https://www.deepseek.com/" +}; diff --git a/packages/core/src/providers/presets/fenno/index.ts b/packages/core/src/providers/presets/fenno/index.ts new file mode 100644 index 0000000..63a645c --- /dev/null +++ b/packages/core/src/providers/presets/fenno/index.ts @@ -0,0 +1,15 @@ +import { defaultProviderAccountConfig, type ProviderPreset } from "@ccr/core/providers/presets/types"; + +export const fennoProviderPreset: ProviderPreset = { + account: defaultProviderAccountConfig, + aliases: ["fenno", "fenno.ai", "fenno ai"], + endpoints: [ + { + baseUrl: "https://api.fenno.ai", + protocols: ["openai_chat_completions", "openai_responses", "anthropic_messages"] + } + ], + id: "fenno", + name: "Fenno.ai", + websiteUrl: "https://api.fenno.ai/register?redirect=/purchase?tab=subscription%26group=16&aff=9HHHAB5QLAES" +}; diff --git a/packages/core/src/providers/presets/gemini/index.ts b/packages/core/src/providers/presets/gemini/index.ts new file mode 100644 index 0000000..7e0fec7 --- /dev/null +++ b/packages/core/src/providers/presets/gemini/index.ts @@ -0,0 +1,18 @@ +import { defaultProviderAccountConfig, type ProviderPreset } from "@ccr/core/providers/presets/types"; + +export const geminiProviderPreset: ProviderPreset = { + account: defaultProviderAccountConfig, + aliases: ["gemini", "google"], + endpoints: [ + { + baseUrl: "https://generativelanguage.googleapis.com", + protocols: ["gemini_generate_content", "gemini_interactions"] + } + ], + id: "gemini", + name: "Google Gemini", + officialApiKeyPatterns: [ + { flags: "i", source: "^AIza[a-z0-9_-]{20,}$" } + ], + websiteUrl: "https://gemini.google.com/" +}; diff --git a/packages/core/src/providers/presets/index.ts b/packages/core/src/providers/presets/index.ts new file mode 100644 index 0000000..2a56d91 --- /dev/null +++ b/packages/core/src/providers/presets/index.ts @@ -0,0 +1,97 @@ +import { anthropicProviderPreset } from "@ccr/core/providers/presets/anthropic/index"; +import { bailianProviderPreset } from "@ccr/core/providers/presets/bailian/index"; +import { claudeApiProviderPreset } from "@ccr/core/providers/presets/claudeapi/index"; +import { code0ProviderPreset } from "@ccr/core/providers/presets/code0/index"; +import { deepSeekProviderPreset } from "@ccr/core/providers/presets/deepseek/index"; +import { fennoProviderPreset } from "@ccr/core/providers/presets/fenno/index"; +import { geminiProviderPreset } from "@ccr/core/providers/presets/gemini/index"; +import { kimiCodingProviderPreset } from "@ccr/core/providers/presets/kimi-coding/index"; +import { minimaxChinaProviderPreset, minimaxGlobalProviderPreset } from "@ccr/core/providers/presets/minimax/index"; +import { mistralProviderPreset } from "@ccr/core/providers/presets/mistral/index"; +import { moonshotChinaProviderPreset, moonshotGlobalProviderPreset } from "@ccr/core/providers/presets/moonshot/index"; +import { openaiProviderPreset } from "@ccr/core/providers/presets/openai/index"; +import { openRouterProviderPreset } from "@ccr/core/providers/presets/openrouter/index"; +import { qiniuAiProviderPreset } from "@ccr/core/providers/presets/qiniu-ai/index"; +import { runApiProviderPreset } from "@ccr/core/providers/presets/runapi/index"; +import { siliconFlowProviderPreset } from "@ccr/core/providers/presets/siliconflow/index"; +import { teamoRouterProviderPreset } from "@ccr/core/providers/presets/teamorouter/index"; +import { zaiGlobalCodingProviderPreset } from "@ccr/core/providers/presets/zai-global-coding/index"; +import { zaiGlobalGeneralProviderPreset } from "@ccr/core/providers/presets/zai-global-general/index"; +import { zhipuCnCodingProviderPreset } from "@ccr/core/providers/presets/zhipu-cn-coding/index"; +import { zhipuCnGeneralProviderPreset } from "@ccr/core/providers/presets/zhipu-cn-general/index"; +import { + findProviderPresetByBaseUrlInList, + findProviderPresetInList, + primaryProviderPresetEndpoint, + providerApiKeySafetyIssueInList, + providerEndpointCanReceiveProviderApiKeyInList, + providerIdentitySafetyIssueInList, + providerPresetMatchesBaseUrl +} from "@ccr/core/providers/presets/utils"; +import type { ProviderIdentitySafetyIssue, ProviderPreset } from "@ccr/core/providers/presets/types"; + +export const providerPresets: ProviderPreset[] = [ + openaiProviderPreset, + anthropicProviderPreset, + geminiProviderPreset, + openRouterProviderPreset, + deepSeekProviderPreset, + kimiCodingProviderPreset, + zhipuCnCodingProviderPreset, + zhipuCnGeneralProviderPreset, + zaiGlobalCodingProviderPreset, + zaiGlobalGeneralProviderPreset, + minimaxGlobalProviderPreset, + minimaxChinaProviderPreset, + mistralProviderPreset, + moonshotChinaProviderPreset, + moonshotGlobalProviderPreset, + bailianProviderPreset, + siliconFlowProviderPreset, + qiniuAiProviderPreset, + fennoProviderPreset, + runApiProviderPreset, + teamoRouterProviderPreset, + code0ProviderPreset, + claudeApiProviderPreset +]; + +export function getProviderPresets(): ProviderPreset[] { + return JSON.parse(JSON.stringify(providerPresets)) as ProviderPreset[]; +} + +export function findProviderPreset(id: string | undefined): ProviderPreset | undefined { + return findProviderPresetInList(providerPresets, id); +} + +export function findProviderPresetByBaseUrl(baseUrl: string): ProviderPreset | undefined { + return findProviderPresetByBaseUrlInList(providerPresets, baseUrl); +} + +export { primaryProviderPresetEndpoint, providerPresetMatchesBaseUrl }; + +export function providerIdentitySafetyIssue(input: { + baseUrl: string; + name?: string; + presetId?: string; +}): ProviderIdentitySafetyIssue | undefined { + return providerIdentitySafetyIssueInList(providerPresets, input); +} + +export function providerApiKeySafetyIssue(input: { + apiKey?: string; + baseUrl: string; + name?: string; + presetId?: string; +}): ProviderIdentitySafetyIssue | undefined { + return providerApiKeySafetyIssueInList(providerPresets, input); +} + +export function providerEndpointCanReceiveProviderApiKey(input: { + apiKey?: string; + endpoint: string; + providerName?: string; + providerPresetId?: string; +}): ProviderIdentitySafetyIssue | undefined { + return providerEndpointCanReceiveProviderApiKeyInList(providerPresets, input); +} diff --git a/packages/core/src/providers/presets/kimi-coding/index.ts b/packages/core/src/providers/presets/kimi-coding/index.ts new file mode 100644 index 0000000..924fd10 --- /dev/null +++ b/packages/core/src/providers/presets/kimi-coding/index.ts @@ -0,0 +1,41 @@ +import type { ProviderAccountConfig } from "@ccr/core/contracts/app"; +import type { ProviderPreset } from "@ccr/core/providers/presets/types"; + +const kimiCodingProviderAccountConfig: ProviderAccountConfig = { + connectors: [ + { + auth: "provider-api-key", + endpoint: "https://api.kimi.com/coding/v1/usages", + mapping: { + meters: [] + }, + parser: "kimi-code-usages", + type: "http-json" + } + ], + enabled: true +}; + +export const kimiCodingProviderPreset: ProviderPreset = { + account: kimiCodingProviderAccountConfig, + aliases: ["kimi code", "kimi coding", "kimi coding plan", "kimi-for-coding"], + defaultModelDisplayNames: { + "kimi-for-coding": "K2.7 Code" + }, + defaultModels: ["kimi-for-coding"], + endpoints: [ + { + baseUrl: "https://api.kimi.com/coding/v1", + protocols: ["openai_chat_completions"], + websiteUrl: "https://www.kimi.com/code?aff=ccr" + }, + { + baseUrl: "https://api.kimi.com/coding/", + protocols: ["anthropic_messages"], + websiteUrl: "https://www.kimi.com/code?aff=ccr" + } + ], + id: "kimi-coding", + name: "Kimi Code - Coding Plan", + websiteUrl: "https://www.kimi.com/code?aff=ccr" +}; diff --git a/packages/core/src/providers/presets/minimax/index.ts b/packages/core/src/providers/presets/minimax/index.ts new file mode 100644 index 0000000..f01fee0 --- /dev/null +++ b/packages/core/src/providers/presets/minimax/index.ts @@ -0,0 +1,44 @@ +import type { ProviderPreset } from "@ccr/core/providers/presets/types"; +import { standardProviderAccountConfig } from "@ccr/core/providers/presets/types"; + +export const minimaxGlobalProviderPreset: ProviderPreset = { + account: standardProviderAccountConfig, + aliases: ["minimax", "minimax global"], + defaultModels: ["MiniMax-M3"], + endpoints: [ + { + baseUrl: "https://api.minimax.io/v1", + protocols: ["openai_chat_completions"], + websiteUrl: "https://platform.minimax.io/docs" + }, + { + baseUrl: "https://api.minimax.io/anthropic/v1", + protocols: ["anthropic_messages"], + websiteUrl: "https://platform.minimax.io/docs" + } + ], + id: "minimax-global", + name: "MiniMax (Global)", + websiteUrl: "https://platform.minimax.io/docs" +}; + +export const minimaxChinaProviderPreset: ProviderPreset = { + account: standardProviderAccountConfig, + aliases: ["minimax", "minimaxi", "minimax china"], + defaultModels: ["MiniMax-M3"], + endpoints: [ + { + baseUrl: "https://api.minimaxi.com/v1", + protocols: ["openai_chat_completions"], + websiteUrl: "https://platform.minimaxi.com/docs" + }, + { + baseUrl: "https://api.minimaxi.com/anthropic/v1", + protocols: ["anthropic_messages"], + websiteUrl: "https://platform.minimaxi.com/docs" + } + ], + id: "minimax-cn", + name: "MiniMax (China)", + websiteUrl: "https://platform.minimaxi.com/docs" +}; diff --git a/packages/core/src/providers/presets/mistral/index.ts b/packages/core/src/providers/presets/mistral/index.ts new file mode 100644 index 0000000..e12bc2b --- /dev/null +++ b/packages/core/src/providers/presets/mistral/index.ts @@ -0,0 +1,46 @@ +import type { ProviderAccountConfig } from "@ccr/core/contracts/app"; +import type { ProviderPreset } from "@ccr/core/providers/presets/types"; + +const mistralProviderAccountConfig: ProviderAccountConfig = { + connectors: [ + { + auth: "provider-api-key", + endpoint: "https://api.mistral.ai/v1/billing/subscription", + mapping: { + meters: [ + { + id: "credit_balance", + kind: "balance", + label: "Credit balance", + remaining: "$.credit_balance", + unit: "EUR" + }, + { + id: "monthly_budget", + kind: "quota", + label: "Monthly budget", + limit: "$.monthly_budget", + unit: "EUR", + window: "monthly" + } + ] + }, + type: "http-json" + } + ], + enabled: true +}; + +export const mistralProviderPreset: ProviderPreset = { + account: mistralProviderAccountConfig, + aliases: ["mistral"], + endpoints: [ + { + baseUrl: "https://api.mistral.ai/v1", + protocols: ["openai_chat_completions"] + } + ], + id: "mistral", + name: "Mistral", + websiteUrl: "https://mistral.ai/" +}; diff --git a/packages/core/src/providers/presets/moonshot/index.ts b/packages/core/src/providers/presets/moonshot/index.ts new file mode 100644 index 0000000..b4ea02d --- /dev/null +++ b/packages/core/src/providers/presets/moonshot/index.ts @@ -0,0 +1,106 @@ +import type { ProviderAccountConfig } from "@ccr/core/contracts/app"; +import type { ProviderPreset } from "@ccr/core/providers/presets/types"; + +const moonshotGlobalProviderAccountConfig: ProviderAccountConfig = { + connectors: [ + { + auth: "provider-api-key", + endpoint: "https://api.moonshot.ai/v1/users/me/balance", + mapping: { + meters: [ + { + id: "balance", + kind: "balance", + label: "Balance", + remaining: "$.data.available_balance", + unit: "CNY" + }, + { + id: "voucher_balance", + kind: "balance", + label: "Voucher balance", + remaining: "$.data.voucher_balance", + unit: "CNY" + }, + { + id: "cash_balance", + kind: "balance", + label: "Cash balance", + remaining: "$.data.cash_balance", + unit: "CNY" + } + ] + }, + type: "http-json" + } + ], + enabled: true +}; + +const moonshotChinaProviderAccountConfig: ProviderAccountConfig = { + connectors: [ + { + auth: "provider-api-key", + endpoint: "https://api.moonshot.cn/v1/users/me/balance", + mapping: { + meters: [ + { + id: "balance", + kind: "balance", + label: "Balance", + remaining: "$.data.available_balance", + unit: "CNY" + }, + { + id: "voucher_balance", + kind: "balance", + label: "Voucher balance", + remaining: "$.data.voucher_balance", + unit: "CNY" + }, + { + id: "cash_balance", + kind: "balance", + label: "Cash balance", + remaining: "$.data.cash_balance", + unit: "CNY" + } + ] + }, + type: "http-json" + } + ], + enabled: true +}; + +export const moonshotChinaProviderPreset: ProviderPreset = { + account: moonshotChinaProviderAccountConfig, + aliases: ["kimi", "kimi api", "moonshot", "moonshot kimi"], + defaultModels: ["kimi-k2.7-code"], + endpoints: [ + { + baseUrl: "https://api.moonshot.cn/v1", + protocols: ["openai_chat_completions"], + websiteUrl: "https://platform.kimi.com/?aff=ccr" + } + ], + id: "moonshot", + name: "Kimi API (China)", + websiteUrl: "https://platform.kimi.com/?aff=ccr" +}; + +export const moonshotGlobalProviderPreset: ProviderPreset = { + account: moonshotGlobalProviderAccountConfig, + aliases: ["kimi", "kimi api", "moonshot", "moonshot kimi"], + defaultModels: ["kimi-k2.7-code"], + endpoints: [ + { + baseUrl: "https://api.moonshot.ai/v1", + protocols: ["openai_chat_completions"], + websiteUrl: "https://platform.kimi.ai/?aff=ccr" + } + ], + id: "moonshot-global", + name: "Kimi API (Global)", + websiteUrl: "https://platform.kimi.ai/?aff=ccr" +}; diff --git a/packages/core/src/providers/presets/openai/index.ts b/packages/core/src/providers/presets/openai/index.ts new file mode 100644 index 0000000..a4ea97f --- /dev/null +++ b/packages/core/src/providers/presets/openai/index.ts @@ -0,0 +1,19 @@ +import { defaultProviderAccountConfig, type ProviderPreset } from "@ccr/core/providers/presets/types"; + +export const openaiProviderPreset: ProviderPreset = { + account: defaultProviderAccountConfig, + aliases: ["openai", "chatgpt"], + defaultModels: ["gpt-4o"], + endpoints: [ + { + baseUrl: "https://api.openai.com/v1", + protocols: ["openai_responses", "openai_chat_completions"] + } + ], + id: "openai", + name: "OpenAI", + officialApiKeyPatterns: [ + { flags: "i", source: "^sk-(?:proj|svcacct)-[a-z0-9_-]+$" } + ], + websiteUrl: "https://openai.com/" +}; diff --git a/packages/core/src/providers/presets/openrouter/index.ts b/packages/core/src/providers/presets/openrouter/index.ts new file mode 100644 index 0000000..7570322 --- /dev/null +++ b/packages/core/src/providers/presets/openrouter/index.ts @@ -0,0 +1,56 @@ +import type { ProviderAccountConfig } from "@ccr/core/contracts/app"; +import type { ProviderPreset } from "@ccr/core/providers/presets/types"; + +const openRouterProviderAccountConfig: ProviderAccountConfig = { + connectors: [ + { + auth: "provider-api-key", + endpoint: "https://openrouter.ai/api/v1/credits", + mapping: { + meters: [ + { + id: "balance", + kind: "balance", + label: "Balance", + limit: "$.data.total_credits", + used: "$.data.total_usage", + unit: "USD" + }, + { + id: "total_credits", + kind: "balance", + label: "Total credits", + limit: "$.data.total_credits", + unit: "USD" + }, + { + id: "total_usage", + kind: "balance", + label: "Total usage", + unit: "USD", + used: "$.data.total_usage" + } + ] + }, + type: "http-json" + } + ], + enabled: true +}; + +export const openRouterProviderPreset: ProviderPreset = { + account: openRouterProviderAccountConfig, + aliases: ["openrouter"], + endpoints: [ + { + baseUrl: "https://openrouter.ai/api/v1", + protocols: ["openai_chat_completions", "openai_responses"] + } + ], + id: "openrouter", + name: "OpenRouter", + officialApiKeyPatterns: [ + { flags: "i", source: "^sk-or-v1-[a-z0-9_-]+$" } + ], + websiteUrl: "https://openrouter.ai/" +}; diff --git a/packages/core/src/providers/presets/qiniu-ai/index.ts b/packages/core/src/providers/presets/qiniu-ai/index.ts new file mode 100644 index 0000000..36deee3 --- /dev/null +++ b/packages/core/src/providers/presets/qiniu-ai/index.ts @@ -0,0 +1,35 @@ +import { defaultProviderAccountConfig, type ProviderPreset } from "@ccr/core/providers/presets/types"; + +export const qiniuAiProviderPreset: ProviderPreset = { + account: defaultProviderAccountConfig, + aliases: ["qiniu", "qiniu ai", "qiniu cloud ai", "qiniu yun ai", "qiniu yun", "七牛云", "七牛云ai", "七牛云 ai", "modelink"], + endpoints: [ + { + baseUrl: "https://api.qnaigc.com", + label: "China mainland OpenAI", + protocols: ["openai_chat_completions"], + websiteUrl: "https://s.qiniu.com/AVjMVf" + }, + { + baseUrl: "https://api.qnaigc.com/bypass/openai/v1", + label: "China mainland OpenAI Responses", + protocols: ["openai_responses"], + websiteUrl: "https://s.qiniu.com/AVjMVf" + }, + { + baseUrl: "https://api.qnaigc.com", + label: "China mainland Anthropic", + protocols: ["anthropic_messages"], + websiteUrl: "https://s.qiniu.com/AVjMVf" + }, + { + baseUrl: "https://api.qnaigc.com/bypass/vertex/v1", + label: "China mainland Gemini Generate", + protocols: ["gemini_generate_content"], + websiteUrl: "https://s.qiniu.com/AVjMVf" + } + ], + id: "qiniu-ai", + name: "七牛云 AI", + websiteUrl: "https://s.qiniu.com/AVjMVf" +}; diff --git a/packages/core/src/providers/presets/runapi/index.ts b/packages/core/src/providers/presets/runapi/index.ts new file mode 100644 index 0000000..5f982ab --- /dev/null +++ b/packages/core/src/providers/presets/runapi/index.ts @@ -0,0 +1,15 @@ +import { defaultProviderAccountConfig, type ProviderPreset } from "@ccr/core/providers/presets/types"; + +export const runApiProviderPreset: ProviderPreset = { + account: defaultProviderAccountConfig, + aliases: ["runapi"], + endpoints: [ + { + baseUrl: "https://runapi.co/v1", + protocols: ["openai_responses", "openai_chat_completions"] + } + ], + id: "runapi", + name: "RunAPI", + websiteUrl: "https://runapi.co/register?aff=IX1t" +}; diff --git a/packages/core/src/providers/presets/siliconflow/index.ts b/packages/core/src/providers/presets/siliconflow/index.ts new file mode 100644 index 0000000..a4af567 --- /dev/null +++ b/packages/core/src/providers/presets/siliconflow/index.ts @@ -0,0 +1,52 @@ +import type { ProviderAccountConfig } from "@ccr/core/contracts/app"; +import type { ProviderPreset } from "@ccr/core/providers/presets/types"; + +const siliconFlowProviderAccountConfig: ProviderAccountConfig = { + connectors: [ + { + auth: "provider-api-key", + endpoint: "https://api.siliconflow.cn/v1/user/info", + mapping: { + meters: [ + { + id: "balance", + kind: "balance", + label: "Balance", + remaining: "$.data.totalBalance", + unit: "CNY" + }, + { + id: "current_balance", + kind: "balance", + label: "Current balance", + remaining: "$.data.balance", + unit: "CNY" + }, + { + id: "charge_balance", + kind: "balance", + label: "Charge balance", + remaining: "$.data.chargeBalance", + unit: "CNY" + } + ] + }, + type: "http-json" + } + ], + enabled: true +}; + +export const siliconFlowProviderPreset: ProviderPreset = { + account: siliconFlowProviderAccountConfig, + aliases: ["siliconflow"], + endpoints: [ + { + baseUrl: "https://api.siliconflow.cn/v1", + protocols: ["openai_chat_completions"] + } + ], + id: "siliconflow", + name: "SiliconFlow", + websiteUrl: "https://siliconflow.cn/" +}; diff --git a/packages/core/src/providers/presets/teamorouter/index.ts b/packages/core/src/providers/presets/teamorouter/index.ts new file mode 100644 index 0000000..e7909fa --- /dev/null +++ b/packages/core/src/providers/presets/teamorouter/index.ts @@ -0,0 +1,15 @@ +import { defaultProviderAccountConfig, type ProviderPreset } from "@ccr/core/providers/presets/types"; + +export const teamoRouterProviderPreset: ProviderPreset = { + account: defaultProviderAccountConfig, + aliases: ["teamorouter", "teamo router", "teamo"], + endpoints: [ + { + baseUrl: "https://api.teamorouter.com", + protocols: ["anthropic_messages", "openai_chat_completions", "openai_responses"] + } + ], + id: "teamorouter", + name: "TeamoRouter", + websiteUrl: "https://teamorouter.com/" +}; diff --git a/packages/core/src/providers/presets/types.ts b/packages/core/src/providers/presets/types.ts new file mode 100644 index 0000000..c4811ff --- /dev/null +++ b/packages/core/src/providers/presets/types.ts @@ -0,0 +1,47 @@ +import type { GatewayProviderProtocol, ProviderAccountConfig } from "@ccr/core/contracts/app"; + +export type ProviderPresetEndpoint = { + baseUrl: string; + label?: string; + protocols: GatewayProviderProtocol[]; + websiteUrl?: string; +}; + +export type ProviderOfficialKeyPattern = { + flags?: string; + source: string; +}; + +export type ProviderPreset = { + account?: ProviderAccountConfig; + aliases: string[]; + defaultModelDisplayNames?: Record; + defaultModels?: string[]; + endpoints: ProviderPresetEndpoint[]; + id: string; + name: string; + officialApiKeyPatterns?: ProviderOfficialKeyPattern[]; + websiteUrl?: string; +}; + +export type ProviderIdentitySafetyIssue = { + message: string; + preset: ProviderPreset; +}; + +export const customProviderPresetId = "custom"; + +export const defaultProviderAccountConfig: ProviderAccountConfig = { + connectors: [], + enabled: false +}; + +export const standardProviderAccountConfig: ProviderAccountConfig = { + connectors: [ + { + auth: "provider-api-key", + type: "standard" + } + ], + enabled: true +}; diff --git a/packages/core/src/providers/presets/utils.ts b/packages/core/src/providers/presets/utils.ts new file mode 100644 index 0000000..e1e7f65 --- /dev/null +++ b/packages/core/src/providers/presets/utils.ts @@ -0,0 +1,147 @@ +import { + customProviderPresetId, + type ProviderIdentitySafetyIssue, + type ProviderPreset, + type ProviderPresetEndpoint +} from "@ccr/core/providers/presets/types"; +import { providerUrlWithDefaultScheme } from "@ccr/core/providers/url"; + +export function findProviderPresetInList( + presets: ProviderPreset[], + id: string | undefined +): ProviderPreset | undefined { + if (!id || id === customProviderPresetId) { + return undefined; + } + return presets.find((preset) => preset.id === id); +} + +export function findProviderPresetByBaseUrlInList( + presets: ProviderPreset[], + baseUrl: string +): ProviderPreset | undefined { + return presets.find((preset) => + providerPresetMatchesBaseUrl(preset, baseUrl) + ); +} + +export function findProviderPresetByIdentityInList( + presets: ProviderPreset[], + name: string | undefined +): ProviderPreset | undefined { + return findProviderPresetsByIdentity(presets, name)[0]; +} + +export function primaryProviderPresetEndpoint(preset: ProviderPreset): ProviderPresetEndpoint | undefined { + return preset.endpoints[0]; +} + +export function providerIdentitySafetyIssueInList( + _presets: ProviderPreset[], + input: { + baseUrl: string; + name?: string; + presetId?: string; + } +): ProviderIdentitySafetyIssue | undefined { + void input; + return undefined; +} + +export function providerApiKeySafetyIssueInList( + _presets: ProviderPreset[], + input: { + apiKey?: string; + baseUrl: string; + name?: string; + presetId?: string; + } +): ProviderIdentitySafetyIssue | undefined { + void input; + return undefined; +} + +export function providerPresetMatchesBaseUrl(preset: ProviderPreset, baseUrl: string): boolean { + return preset.endpoints.some((endpoint) => providerEndpointMatchesBaseUrl(endpoint.baseUrl, baseUrl)); +} + +export function providerEndpointCanReceiveProviderApiKeyInList( + _presets: ProviderPreset[], + input: { + apiKey?: string; + endpoint: string; + providerName?: string; + providerPresetId?: string; + } +): ProviderIdentitySafetyIssue | undefined { + void input; + return undefined; +} + +function findProviderPresetsByIdentity(presets: ProviderPreset[], name: string | undefined): ProviderPreset[] { + const normalizedName = normalizeProviderIdentityText(name); + if (!normalizedName) { + return []; + } + + return presets + .map((preset) => ({ + preset, + score: providerPresetIdentityMatchScore(preset, normalizedName) + })) + .filter((item) => item.score > 0) + .sort((left, right) => right.score - left.score) + .map((item) => item.preset); +} + +function providerPresetIdentityMatchScore(preset: ProviderPreset, normalizedName: string): number { + const identities = [preset.id, preset.name, ...preset.aliases] + .map(normalizeProviderIdentityText) + .filter(Boolean); + + return Math.max(0, ...identities.map((identity) => { + if (normalizedName === identity) { + return 10_000 + identity.length; + } + if (identity.length >= 4 && normalizedName.includes(identity)) { + return identity.length; + } + return 0; + })); +} + +function providerEndpointMatchesBaseUrl(endpointBaseUrl: string, baseUrl: string): boolean { + const endpoint = parseProviderPresetUrl(endpointBaseUrl); + const candidate = parseProviderPresetUrl(baseUrl); + if (!endpoint || !candidate) { + return false; + } + if (candidate.protocol !== endpoint.protocol || candidate.host !== endpoint.host) { + return false; + } + + const endpointPath = normalizeProviderPresetPath(endpoint.pathname); + const candidatePath = normalizeProviderPresetPath(candidate.pathname); + return endpointPath === "/" || + candidatePath === "/" || + candidatePath === endpointPath || + candidatePath.startsWith(`${endpointPath}/`) || + endpointPath.startsWith(`${candidatePath}/`); +} + +function parseProviderPresetUrl(value: string): URL | undefined { + try { + return new URL(providerUrlWithDefaultScheme(value.trim())); + } catch { + return undefined; + } +} + +function normalizeProviderPresetPath(value: string): string { + const trimmed = value.replace(/\/+$/, ""); + return trimmed || "/"; +} + +function normalizeProviderIdentityText(value: string | undefined): string { + return value?.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fff]+/g, "") ?? ""; +} diff --git a/packages/core/src/providers/presets/zai-global-coding/index.ts b/packages/core/src/providers/presets/zai-global-coding/index.ts new file mode 100644 index 0000000..24c0719 --- /dev/null +++ b/packages/core/src/providers/presets/zai-global-coding/index.ts @@ -0,0 +1,63 @@ +import type { ProviderAccountConfig, ProviderAccountMappingConfig } from "@ccr/core/contracts/app"; +import type { ProviderPreset } from "@ccr/core/providers/presets/types"; + +const zaiQuotaMapping: ProviderAccountMappingConfig = { + meters: [ + { + id: "five_hour_quota", + kind: "quota", + label: "5h quota", + limit: 100, + remaining: "100 - $.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==3)].percentage", + resetAt: "$.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==3)].nextResetTime", + unit: "%", + used: "$.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==3)].percentage", + window: "5h" + }, + { + id: "weekly_quota", + kind: "quota", + label: "Weekly quota", + limit: 100, + remaining: "100 - $.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==6)].percentage", + resetAt: "$.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==6)].nextResetTime", + unit: "%", + used: "$.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==6)].percentage", + window: "weekly" + } + ] +}; + +const zaiGlobalProviderAccountConfig: ProviderAccountConfig = { + connectors: [ + { + auth: "provider-api-key-raw", + endpoint: "https://api.z.ai/api/monitor/usage/quota/limit", + headers: { + "Accept-Language": "en-US,en" + }, + mapping: zaiQuotaMapping, + type: "http-json" + } + ], + enabled: true +}; + +export const zaiGlobalCodingProviderPreset: ProviderPreset = { + account: zaiGlobalProviderAccountConfig, + aliases: ["z.ai", "zai", "z ai", "z-ai", "glm global"], + defaultModels: ["glm-5.2", "glm-5.1", "glm-4.7", "glm-4.5-air"], + endpoints: [ + { + baseUrl: "https://api.z.ai/api/coding/paas/v4", + protocols: ["openai_chat_completions"] + }, + { + baseUrl: "https://api.z.ai/api/anthropic", + protocols: ["anthropic_messages"] + } + ], + id: "zai-global-coding", + name: "Z.ai (Global) - Coding Plan", + websiteUrl: "https://z.ai/" +}; diff --git a/packages/core/src/providers/presets/zai-global-general/index.ts b/packages/core/src/providers/presets/zai-global-general/index.ts new file mode 100644 index 0000000..377b564 --- /dev/null +++ b/packages/core/src/providers/presets/zai-global-general/index.ts @@ -0,0 +1,59 @@ +import type { ProviderAccountConfig, ProviderAccountMappingConfig } from "@ccr/core/contracts/app"; +import type { ProviderPreset } from "@ccr/core/providers/presets/types"; + +const zaiQuotaMapping: ProviderAccountMappingConfig = { + meters: [ + { + id: "five_hour_quota", + kind: "quota", + label: "5h quota", + limit: 100, + remaining: "100 - $.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==3)].percentage", + resetAt: "$.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==3)].nextResetTime", + unit: "%", + used: "$.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==3)].percentage", + window: "5h" + }, + { + id: "weekly_quota", + kind: "quota", + label: "Weekly quota", + limit: 100, + remaining: "100 - $.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==6)].percentage", + resetAt: "$.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==6)].nextResetTime", + unit: "%", + used: "$.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==6)].percentage", + window: "weekly" + } + ] +}; + +const zaiGlobalProviderAccountConfig: ProviderAccountConfig = { + connectors: [ + { + auth: "provider-api-key-raw", + endpoint: "https://api.z.ai/api/monitor/usage/quota/limit", + headers: { + "Accept-Language": "en-US,en" + }, + mapping: zaiQuotaMapping, + type: "http-json" + } + ], + enabled: true +}; + +export const zaiGlobalGeneralProviderPreset: ProviderPreset = { + account: zaiGlobalProviderAccountConfig, + aliases: ["z.ai", "zai", "z ai", "z-ai", "glm global"], + defaultModels: ["glm-5.2", "glm-5.1", "glm-4.7", "glm-4.5-air"], + endpoints: [ + { + baseUrl: "https://api.z.ai/api/paas/v4", + protocols: ["openai_chat_completions"] + } + ], + id: "zai-global-general", + name: "Z.ai (Global) - General Endpoint", + websiteUrl: "https://z.ai/" +}; diff --git a/packages/core/src/providers/presets/zhipu-cn-coding/index.ts b/packages/core/src/providers/presets/zhipu-cn-coding/index.ts new file mode 100644 index 0000000..04540d2 --- /dev/null +++ b/packages/core/src/providers/presets/zhipu-cn-coding/index.ts @@ -0,0 +1,63 @@ +import type { ProviderAccountConfig, ProviderAccountMappingConfig } from "@ccr/core/contracts/app"; +import type { ProviderPreset } from "@ccr/core/providers/presets/types"; + +const zhipuQuotaMapping: ProviderAccountMappingConfig = { + meters: [ + { + id: "five_hour_quota", + kind: "quota", + label: "5h quota", + limit: 100, + remaining: "100 - $.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==3)].percentage", + resetAt: "$.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==3)].nextResetTime", + unit: "%", + used: "$.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==3)].percentage", + window: "5h" + }, + { + id: "weekly_quota", + kind: "quota", + label: "Weekly quota", + limit: 100, + remaining: "100 - $.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==6)].percentage", + resetAt: "$.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==6)].nextResetTime", + unit: "%", + used: "$.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==6)].percentage", + window: "weekly" + } + ] +}; + +const zhipuCnProviderAccountConfig: ProviderAccountConfig = { + connectors: [ + { + auth: "provider-api-key-raw", + endpoint: "https://open.bigmodel.cn/api/monitor/usage/quota/limit", + headers: { + "Accept-Language": "en-US,en" + }, + mapping: zhipuQuotaMapping, + type: "http-json" + } + ], + enabled: true +}; + +export const zhipuCnCodingProviderPreset: ProviderPreset = { + account: zhipuCnProviderAccountConfig, + aliases: ["zhipu", "bigmodel", "glm", "智谱", "智谱ai", "智谱清言"], + defaultModels: ["glm-5.2", "glm-5.1", "glm-4.7", "glm-4.5-air"], + endpoints: [ + { + baseUrl: "https://open.bigmodel.cn/api/coding/paas/v4", + protocols: ["openai_chat_completions"] + }, + { + baseUrl: "https://open.bigmodel.cn/api/anthropic", + protocols: ["anthropic_messages"] + } + ], + id: "zhipu-cn-coding", + name: "Zhipu AI (China) - Coding Plan", + websiteUrl: "https://www.bigmodel.cn/" +}; diff --git a/packages/core/src/providers/presets/zhipu-cn-general/index.ts b/packages/core/src/providers/presets/zhipu-cn-general/index.ts new file mode 100644 index 0000000..2db2f5d --- /dev/null +++ b/packages/core/src/providers/presets/zhipu-cn-general/index.ts @@ -0,0 +1,59 @@ +import type { ProviderAccountConfig, ProviderAccountMappingConfig } from "@ccr/core/contracts/app"; +import type { ProviderPreset } from "@ccr/core/providers/presets/types"; + +const zhipuQuotaMapping: ProviderAccountMappingConfig = { + meters: [ + { + id: "five_hour_quota", + kind: "quota", + label: "5h quota", + limit: 100, + remaining: "100 - $.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==3)].percentage", + resetAt: "$.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==3)].nextResetTime", + unit: "%", + used: "$.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==3)].percentage", + window: "5h" + }, + { + id: "weekly_quota", + kind: "quota", + label: "Weekly quota", + limit: 100, + remaining: "100 - $.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==6)].percentage", + resetAt: "$.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==6)].nextResetTime", + unit: "%", + used: "$.data.limits[?(@.type==\"TOKENS_LIMIT\" && @.unit==6)].percentage", + window: "weekly" + } + ] +}; + +const zhipuCnProviderAccountConfig: ProviderAccountConfig = { + connectors: [ + { + auth: "provider-api-key-raw", + endpoint: "https://open.bigmodel.cn/api/monitor/usage/quota/limit", + headers: { + "Accept-Language": "en-US,en" + }, + mapping: zhipuQuotaMapping, + type: "http-json" + } + ], + enabled: true +}; + +export const zhipuCnGeneralProviderPreset: ProviderPreset = { + account: zhipuCnProviderAccountConfig, + aliases: ["zhipu", "bigmodel", "glm", "智谱", "智谱ai", "智谱清言"], + defaultModels: ["glm-5.2", "glm-5.1", "glm-4.7", "glm-4.5-air"], + endpoints: [ + { + baseUrl: "https://open.bigmodel.cn/api/paas/v4", + protocols: ["openai_chat_completions"] + } + ], + id: "zhipu-cn-general", + name: "Zhipu AI (China) - General Endpoint", + websiteUrl: "https://www.bigmodel.cn/" +}; diff --git a/packages/core/src/providers/probe.ts b/packages/core/src/providers/probe.ts new file mode 100644 index 0000000..3f6c7bd --- /dev/null +++ b/packages/core/src/providers/probe.ts @@ -0,0 +1,1224 @@ +import { createHash } from "node:crypto"; +import type { + GatewayProviderConnectivityCheckReport, + GatewayProviderConnectivityCheckRequest, + GatewayProviderCapability, + GatewayProviderProbeCandidate, + GatewayProviderProbeCandidateResult, + GatewayProviderProbeCandidatesRequest, + GatewayProviderProbeProtocolResult, + GatewayProviderProbeRequest, + GatewayProviderProbeResult, + GatewayProviderProtocol +} from "@ccr/core/contracts/app"; +import { providerApiKeySafetyIssue } from "@ccr/core/providers/presets/index"; +import { fetchWithSystemProxy } from "@ccr/core/proxy/system-proxy-fetch"; +import { + compactProviderUrl, + parseProviderBaseUrl, + providerBaseUrlForProtocol, + type ParsedProviderBaseUrl +} from "@ccr/core/providers/url"; +import { + detectedProviderFromHeaders, + newApiKeyUsageAccountConfig, + type DetectedProviderKind +} from "@ccr/core/providers/new-api"; + +type ModelSource = NonNullable; + +type ParsedProviderUrl = ParsedProviderBaseUrl & { + hints: GatewayProviderProtocol[]; +}; + +type FetchJsonResult = { + detectedProvider?: DetectedProviderKind; + headers?: Record; + payload?: unknown; + status?: number; + text: string; +}; + +type ModelProbeResult = { + baseUrl?: string; + modelDisplayNames?: Record; + models: string[]; + source?: ModelSource; +}; + +type ModelFetchResult = { + baseUrl?: string; + modelDisplayNames?: Record; + models: string[]; +}; + +type ProtocolEndpoint = { + baseUrl: string; + endpoint: string; +}; + +type ProbeCacheEntry = { + expiresAt: number; + result: GatewayProviderProbeResult; +}; + +const protocolOrder: GatewayProviderProtocol[] = [ + "openai_responses", + "openai_chat_completions", + "anthropic_messages", + "gemini_generate_content", + "gemini_interactions" +]; + +const modelSourceOrder: ModelSource[] = ["openai", "anthropic", "gemini"]; +const probeTimeoutMs = 10000; +const probeOutputTokenLimit = 1; +const protocolProbeCacheMs = 60 * 1000; +const connectivityProbeCacheMs = 15 * 1000; +const failedProbeCacheMs = 10 * 1000; +const maxProbeCacheEntries = 500; +const probeCache = new Map(); +const inFlightProbes = new Map>(); + +export async function probeGatewayProvider(request: GatewayProviderProbeRequest): Promise { + pruneProbeCache(); + const cacheKey = providerProbeCacheKey(request); + const cached = probeCache.get(cacheKey); + if (!request.forceRefresh && cached && cached.expiresAt > Date.now()) { + return cached.result; + } + + const inFlight = inFlightProbes.get(cacheKey); + if (inFlight) { + return inFlight; + } + + const probe = resolveGatewayProviderProbe(request); + inFlightProbes.set(cacheKey, probe); + probe.then( + (result) => { + const cacheTtlMs = providerProbeCacheTtl(request, result); + probeCache.set(cacheKey, { + expiresAt: Date.now() + cacheTtlMs, + result + }); + pruneProbeCache(); + if (inFlightProbes.get(cacheKey) === probe) { + inFlightProbes.delete(cacheKey); + } + }, + () => { + if (inFlightProbes.get(cacheKey) === probe) { + inFlightProbes.delete(cacheKey); + } + } + ); + return probe; +} + +export async function probeGatewayProviderCandidates( + request: GatewayProviderProbeCandidatesRequest +): Promise { + const results: GatewayProviderProbeCandidateResult[] = []; + const mode = request.mode ?? "protocols"; + + for (const candidate of request.candidates) { + const protocols = request.protocols + ? candidate.protocols.filter((protocol) => request.protocols?.includes(protocol)) + : candidate.protocols; + if (protocols.length === 0) { + continue; + } + + try { + const probe = await probeGatewayProvider({ + apiKey: mode === "connectivity" || mode === "models" ? request.apiKey : undefined, + baseUrl: candidate.baseUrl, + forceRefresh: request.forceRefresh, + mode, + models: mode === "connectivity" ? request.models ?? [] : [], + protocols + }); + results.push({ candidate, probe }); + } catch { + // Keep probing later candidates; the UI still receives the best usable result. + } + } + + return mergeProviderProbeCandidateResults(results); +} + +export async function checkGatewayProviderConnectivity( + request: GatewayProviderConnectivityCheckRequest +): Promise { + const models = uniqueStrings(request.models); + const checks = await Promise.all( + models.map(async (model) => { + try { + const result = await probeGatewayProviderCandidates({ + apiKey: request.apiKey, + candidates: request.candidates, + forceRefresh: request.forceRefresh, + mode: "connectivity", + models: [model], + protocols: request.protocols + }); + if (!result) { + return { + model, + probe: undefined, + report: { + message: "Request failed.", + model, + protocols: [], + supported: false + } + }; + } + + const supported = providerProbeHasSupportedProtocol(result.probe); + return { + model, + probe: result.probe, + report: { + message: supported + ? "Connection verified" + : result.probe.protocols.find((item) => item.message)?.message || "Request failed.", + model, + protocols: result.probe.protocols, + supported + } + }; + } catch (error) { + return { + model, + probe: undefined, + report: { + message: formatError(error), + model, + protocols: [], + supported: false + } + }; + } + }) + ); + const reports = checks.map((check) => check.report); + return { + failed: reports.filter((item) => !item.supported), + passed: reports.filter((item) => item.supported), + probe: checks.find((check) => check.report.supported && check.probe)?.probe, + results: reports + }; +} + +async function resolveGatewayProviderProbe(request: GatewayProviderProbeRequest): Promise { + const mode = request.mode ?? "protocols"; + const safetyIssue = providerApiKeySafetyIssue({ + apiKey: mode === "connectivity" || mode === "models" ? request.apiKey : undefined, + baseUrl: request.baseUrl + }); + if (safetyIssue) { + throw new Error(safetyIssue.message); + } + + const parsed = parseProviderUrl(request.baseUrl); + const protocols = uniqueProtocols(request.protocols ?? []); + const typedModels = uniqueStrings(request.models ?? []); + const modelProbe = mode !== "models" || request.skipModelDiscovery + ? { models: [] } + : await probeModels(parsed, request.apiKey, protocols); + const models = (mode === "connectivity" || mode === "models") && modelProbe.models.length > 0 + ? modelProbe.models + : typedModels; + const protocolResults = await probeProtocols(parsed, request.apiKey, models, protocols, mode); + const detectedProtocol = detectProtocol(parsed, protocolResults, modelProbe.source, protocols); + const normalizedBaseUrl = detectedProtocol + ? resolveProbeBaseUrl(parsed, detectedProtocol, protocolResults, modelProbe) + : parsed.normalizedInputBaseUrl; + const detectedProvider = detectProvider(protocolResults); + const account = detectedProvider === "new-api" ? newApiKeyUsageAccountConfig(normalizedBaseUrl) : undefined; + + return { + ...(account ? { account } : {}), + capabilities: capabilitiesFromProtocolResults(protocolResults), + ...(detectedProvider ? { detectedProvider } : {}), + detectedProtocol, + modelDisplayNames: modelProbe.modelDisplayNames, + modelSource: modelProbe.source, + models: modelProbe.models, + normalizedBaseUrl, + protocols: protocolResults + }; +} + +function providerProbeCacheKey(request: GatewayProviderProbeRequest): string { + return JSON.stringify({ + apiKeyHash: hashSensitiveValue(request.apiKey ?? ""), + baseUrl: request.baseUrl.trim(), + mode: request.mode ?? "protocols", + models: uniqueStrings(request.models ?? []), + protocols: uniqueProtocols(request.protocols ?? []), + skipModelDiscovery: request.skipModelDiscovery === true + }); +} + +function providerProbeCacheTtl(request: GatewayProviderProbeRequest, result: GatewayProviderProbeResult): number { + const hasSupportedProtocol = providerProbeHasSupportedProtocol(result); + if (!hasSupportedProtocol && result.models.length === 0) { + return failedProbeCacheMs; + } + return (request.mode ?? "protocols") === "connectivity" + ? connectivityProbeCacheMs + : protocolProbeCacheMs; +} + +function pruneProbeCache(now = Date.now()): void { + for (const [key, entry] of probeCache.entries()) { + if (entry.expiresAt <= now) { + probeCache.delete(key); + } + } + if (probeCache.size <= maxProbeCacheEntries) { + return; + } + + const oldestEntries = [...probeCache.entries()] + .sort(([, left], [, right]) => left.expiresAt - right.expiresAt) + .slice(0, probeCache.size - maxProbeCacheEntries); + for (const [key] of oldestEntries) { + probeCache.delete(key); + } +} + +function hashSensitiveValue(value: string): string { + return value + ? createHash("sha256").update(value).digest("hex").slice(0, 16) + : ""; +} + +function providerProbeHasSupportedProtocol(probe: GatewayProviderProbeResult): boolean { + return probe.protocols.some((item) => item.supported); +} + +function mergeProviderProbeCandidateResults( + results: GatewayProviderProbeCandidateResult[] +): GatewayProviderProbeCandidateResult | undefined { + if (results.length === 0) { + return undefined; + } + + const usable = results.find((result) => providerProbeResultIsUsable(result.probe)) ?? results[0]; + const capabilities = mergeProviderCapabilities( + ...results.map((result) => providerProbeCapabilities(result.candidate, result.probe)) + ); + const models = uniqueStrings(results.flatMap((result) => result.probe.models)); + const protocols = results.flatMap((result) => result.probe.protocols); + const detectedCapability = capabilities.find((capability) => capability.type === usable.probe.detectedProtocol) ?? capabilities[0]; + const probe: GatewayProviderProbeResult = { + ...usable.probe, + capabilities, + detectedProtocol: detectedCapability?.type ?? usable.probe.detectedProtocol, + models, + normalizedBaseUrl: detectedCapability?.baseUrl ?? usable.probe.normalizedBaseUrl, + protocols + }; + + return { + candidate: usable.candidate, + probe + }; +} + +function providerProbeResultIsUsable(probe: GatewayProviderProbeResult): boolean { + return Boolean(probe.detectedProtocol || probe.models.length > 0 || probe.protocols.some((item) => item.supported)); +} + +function providerProbeCapabilities( + candidate: GatewayProviderProbeCandidate, + probe: GatewayProviderProbeResult +): GatewayProviderCapability[] { + const detectedCapabilities = mergeProviderCapabilities(probe.capabilities ?? []); + const presetCapabilities = providerProbePresetCapabilities(candidate); + return mergeProviderCapabilities(detectedCapabilities, presetCapabilities); +} + +function providerProbePresetCapabilities(candidate: GatewayProviderProbeCandidate): GatewayProviderCapability[] { + if (candidate.source !== "preset") { + return []; + } + + return uniqueProtocols(candidate.declaredProtocols ?? []).map((type) => ({ + baseUrl: providerProbeCandidateBaseUrlForProtocol(candidate.baseUrl, type), + source: "preset" as const, + type + })); +} + +function providerProbeCandidateBaseUrlForProtocol(baseUrl: string, protocol: GatewayProviderProtocol): string { + try { + return providerBaseUrlForProtocol(parseProviderBaseUrl(baseUrl), protocol); + } catch { + return baseUrl.trim(); + } +} + +function mergeProviderCapabilities(...groups: GatewayProviderCapability[][]): GatewayProviderCapability[] { + const seen = new Set(); + const capabilities: GatewayProviderCapability[] = []; + for (const group of groups) { + for (const capability of group) { + const baseUrl = capability.baseUrl.trim(); + if (!baseUrl) { + continue; + } + const key = `${capability.type}\n${baseUrl}`; + if (seen.has(key)) { + continue; + } + seen.add(key); + capabilities.push({ + baseUrl, + endpoint: capability.endpoint, + source: capability.source, + type: capability.type + }); + } + } + return capabilities; +} + +function capabilitiesFromProtocolResults(results: GatewayProviderProbeProtocolResult[]): GatewayProviderCapability[] { + return results + .filter((result) => result.supported && result.baseUrl) + .map((result) => ({ + baseUrl: result.baseUrl as string, + endpoint: result.endpoint, + source: "detected" as const, + type: result.protocol + })); +} + +async function probeModels( + parsed: ParsedProviderUrl, + apiKey: string | undefined, + allowedProtocols: GatewayProviderProtocol[] = [] +): Promise { + for (const source of orderedModelSources(parsed, allowedProtocols)) { + const result = await fetchModelsForSource(parsed, source, apiKey); + if (result.models.length > 0) { + return { + baseUrl: result.baseUrl, + models: result.models, + source + }; + } + } + + return { + models: [] + }; +} + +async function fetchModelsForSource(parsed: ParsedProviderUrl, source: ModelSource, apiKey: string | undefined): Promise { + if (source === "openai") { + for (const baseUrl of parsed.openaiBaseUrlCandidates) { + const result = await requestJson(`${baseUrl}/models`, { + headers: { + ...openAiHeaders(apiKey) + }, + method: "GET" + }); + const modelList = parseModelList(result.payload, "openai"); + if (modelList.models.length > 0) { + return { + baseUrl, + ...modelList + }; + } + } + + return { + models: [] + }; + } + + if (source === "anthropic") { + for (const baseUrl of parsed.anthropicBaseUrlCandidates) { + const result = await requestJson(`${baseUrl}/v1/models`, { + headers: { + ...anthropicHeaders(apiKey) + }, + method: "GET" + }); + const modelList = parseModelList(result.payload, "anthropic"); + if (modelList.models.length > 0) { + return { + baseUrl, + ...modelList + }; + } + } + + return { + models: [] + }; + } + + const result = await requestJson(withGeminiKey(geminiApiEndpoint(parsed.geminiBaseUrl, "models"), apiKey), { + headers: { + ...geminiHeaders(apiKey) + }, + method: "GET" + }); + return { + baseUrl: parsed.geminiBaseUrl, + ...parseModelList(result.payload, "gemini") + }; +} + +async function probeProtocols( + parsed: ParsedProviderUrl, + apiKey: string | undefined, + models: string[], + allowedProtocols: GatewayProviderProtocol[] = [], + mode: NonNullable = "protocols" +): Promise { + const results: GatewayProviderProbeProtocolResult[] = []; + + for (const protocol of orderedProtocols(parsed, allowedProtocols)) { + results.push( + mode === "connectivity" + ? await probeProtocolConnectivity(parsed, apiKey, models, protocol) + : await probeProtocolSupport(parsed, apiKey, protocol) + ); + } + + return results; +} + +async function probeProtocolSupport( + parsed: ParsedProviderUrl, + apiKey: string | undefined, + protocol: GatewayProviderProtocol +): Promise { + const endpoints = endpointsForProtocol(parsed, protocol, undefined); + const endpoint = endpoints[0]?.endpoint ?? providerBaseUrlForProtocol(parsed, protocol); + let firstResult: GatewayProviderProbeProtocolResult | undefined; + + for (const candidate of endpoints) { + const result = await requestJson(candidate.endpoint, requestForProtocolSupport(protocol, apiKey)); + const message = readResponseMessage(result); + const supported = isProviderProtocolEndpointSupportedForProbe(result.status, message, protocol, parsed.hints); + const probeResult = { + baseUrl: candidate.baseUrl, + ...(result.detectedProvider ? { detectedProvider: result.detectedProvider } : {}), + endpoint: candidate.endpoint, + message, + protocol, + status: result.status, + supported + }; + + firstResult ??= probeResult; + if (supported) { + return probeResult; + } + } + + return firstResult ?? { + endpoint, + message: "No endpoint candidates available.", + protocol, + supported: false + }; +} + +async function probeProtocolConnectivity( + parsed: ParsedProviderUrl, + apiKey: string | undefined, + models: string[], + protocol: GatewayProviderProtocol +): Promise { + const model = pickProbeModel(models, protocol); + const endpoints = endpointsForProtocol(parsed, protocol, model); + const endpoint = endpoints[0]?.endpoint ?? providerBaseUrlForProtocol(parsed, protocol); + + if (!model) { + return { + endpoint, + message: "Model required before protocol verification.", + protocol, + supported: false + }; + } + + let firstResult: GatewayProviderProbeProtocolResult | undefined; + + for (const candidate of endpoints) { + const result = await requestJson(candidate.endpoint, requestForProtocol(protocol, model, apiKey)); + const message = readResponseMessage(result); + const supported = isProtocolSupported(result.status, message, protocol); + const probeResult = { + baseUrl: candidate.baseUrl, + ...(result.detectedProvider ? { detectedProvider: result.detectedProvider } : {}), + endpoint: candidate.endpoint, + message, + protocol, + status: result.status, + supported + }; + + firstResult ??= probeResult; + if (supported) { + return probeResult; + } + } + + return firstResult ?? { + endpoint, + message: "No endpoint candidates available.", + protocol, + supported: false + }; +} + +function requestForProtocol(protocol: GatewayProviderProtocol, model: string, apiKey: string | undefined): RequestInit { + if (protocol === "openai_responses") { + return { + body: JSON.stringify({ + input: "ping", + max_output_tokens: probeOutputTokenLimit, + model, + stream: false + }), + headers: { + "content-type": "application/json", + ...openAiHeaders(apiKey) + }, + method: "POST" + }; + } + + if (protocol === "openai_chat_completions") { + return { + body: JSON.stringify({ + max_tokens: probeOutputTokenLimit, + messages: [{ content: "ping", role: "user" }], + model, + stream: false + }), + headers: { + "content-type": "application/json", + ...openAiHeaders(apiKey) + }, + method: "POST" + }; + } + + if (protocol === "anthropic_messages") { + return { + body: JSON.stringify({ + max_tokens: probeOutputTokenLimit, + messages: [{ content: "ping", role: "user" }], + model, + stream: false + }), + headers: { + "content-type": "application/json", + ...anthropicHeaders(apiKey) + }, + method: "POST" + }; + } + + if (protocol === "gemini_interactions") { + return { + body: JSON.stringify({ + generation_config: { + max_output_tokens: probeOutputTokenLimit + }, + input: "ping", + model, + store: false + }), + headers: { + "content-type": "application/json", + ...geminiHeaders(apiKey) + }, + method: "POST" + }; + } + + return { + body: JSON.stringify({ + contents: [{ parts: [{ text: "ping" }], role: "user" }], + generationConfig: { + maxOutputTokens: probeOutputTokenLimit + } + }), + headers: { + "content-type": "application/json", + ...geminiHeaders(apiKey) + }, + method: "POST" + }; +} + +function requestForProtocolSupport(protocol: GatewayProviderProtocol, apiKey: string | undefined): RequestInit { + return { + body: JSON.stringify({}), + headers: { + "content-type": "application/json", + ...headersForProtocol(protocol, apiKey) + }, + method: "POST" + }; +} + +async function requestJson(url: string, init: RequestInit): Promise { + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), probeTimeoutMs); + + try { + const response = await fetchWithSystemProxy(url, { + ...init, + signal: controller.signal + }); + const text = await response.text(); + const headers = responseHeadersRecord(response.headers); + return { + detectedProvider: detectedProviderFromHeaders(headers), + headers, + payload: parseJson(text), + status: response.status, + text + }; + } catch (error) { + return { + text: formatError(error) + }; + } finally { + clearTimeout(timer); + } +} + +function detectProvider(protocols: GatewayProviderProbeProtocolResult[]): DetectedProviderKind | undefined { + return protocols.find((item) => item.detectedProvider)?.detectedProvider; +} + +function responseHeadersRecord(headers: Headers): Record { + const record: Record = {}; + headers.forEach((value, key) => { + record[key] = value; + }); + return record; +} + +function parseProviderUrl(value: string): ParsedProviderUrl { + const parsed = parseProviderBaseUrl(value); + const url = new URL(parsed.normalizedInputBaseUrl); + const hints = uniqueProtocols([...protocolHints(parsed.raw), ...protocolHints(url.hostname)]); + + return { + ...parsed, + hints + }; +} + +function endpointsForProtocol( + parsed: ParsedProviderUrl, + protocol: GatewayProviderProtocol, + model: string | undefined +): ProtocolEndpoint[] { + if (protocol === "openai_responses") { + return parsed.openaiBaseUrlCandidates.map((baseUrl) => ({ + baseUrl, + endpoint: `${baseUrl}/responses` + })); + } + + if (protocol === "openai_chat_completions") { + return parsed.openaiBaseUrlCandidates.map((baseUrl) => ({ + baseUrl, + endpoint: `${baseUrl}/chat/completions` + })); + } + + if (protocol === "anthropic_messages") { + return parsed.anthropicBaseUrlCandidates.flatMap((baseUrl) => uniqueProtocolEndpoints([ + { + baseUrl, + endpoint: `${baseUrl}/v1/messages` + }, + { + baseUrl, + endpoint: `${baseUrl}/messages` + } + ])); + } + + if (protocol === "gemini_interactions") { + return [ + { + baseUrl: parsed.geminiBaseUrl, + endpoint: geminiApiEndpoint(parsed.geminiBaseUrl, "interactions", "v1beta") + }, + { + baseUrl: parsed.geminiBaseUrl, + endpoint: geminiApiEndpoint(parsed.geminiBaseUrl, "interactions", "v1") + } + ]; + } + + const encodedModel = encodeURIComponent(stripGeminiModelPrefix(model || "model")); + return [ + { + baseUrl: parsed.geminiBaseUrl, + endpoint: geminiApiEndpoint(parsed.geminiBaseUrl, `models/${encodedModel}:generateContent`) + } + ]; +} + +function geminiApiEndpoint(baseUrl: string, path: string, defaultVersion: "v1" | "v1beta" = "v1beta"): string { + const normalizedBaseUrl = baseUrl.replace(/\/+$/, ""); + if (/\/v1(?:beta)?$/i.test(normalizedBaseUrl)) { + return `${normalizedBaseUrl}/${path}`; + } + return `${normalizedBaseUrl}/${defaultVersion}/${path}`; +} + +function withGeminiKey(url: string, apiKey: string | undefined): string { + if (!apiKey) { + return url; + } + + const parsed = new URL(url); + parsed.searchParams.set("key", apiKey); + return compactProviderUrl(parsed); +} + +function openAiHeaders(apiKey: string | undefined): Record { + return apiKey + ? { + authorization: `Bearer ${apiKey}` + } + : {}; +} + +function anthropicHeaders(apiKey: string | undefined): Record { + return { + "anthropic-version": "2023-06-01", + ...(apiKey ? { "x-api-key": apiKey } : {}) + }; +} + +function geminiHeaders(apiKey: string | undefined): Record { + return apiKey + ? { + "x-goog-api-key": apiKey + } + : {}; +} + +function headersForProtocol(protocol: GatewayProviderProtocol, apiKey: string | undefined): Record { + if (protocol === "anthropic_messages") { + return anthropicHeaders(apiKey); + } + if (protocol === "gemini_generate_content" || protocol === "gemini_interactions") { + return geminiHeaders(apiKey); + } + return openAiHeaders(apiKey); +} + +function parseModelList(payload: unknown, source: ModelSource): Pick { + if (!isRecord(payload)) { + return { + models: [] + }; + } + + const items = Array.isArray(payload.data) ? payload.data : Array.isArray(payload.models) ? payload.models : []; + const models: string[] = []; + const modelDisplayNames: Record = {}; + + for (const item of items) { + const model = readModelId(item, source); + if (!model) { + continue; + } + models.push(model); + + const displayName = readModelDisplayName(item); + if (displayName && displayName !== model) { + modelDisplayNames[model] = displayName; + } + } + + const uniqueModels = uniqueStrings(models); + const uniqueDisplayNames = Object.fromEntries( + uniqueModels + .map((model) => [model, modelDisplayNames[model]] as const) + .filter((entry): entry is [string, string] => Boolean(entry[1])) + ); + + return { + modelDisplayNames: Object.keys(uniqueDisplayNames).length > 0 ? uniqueDisplayNames : undefined, + models: uniqueModels + }; +} + +function readModelId(value: unknown, source: ModelSource): string | undefined { + if (typeof value === "string") { + return source === "gemini" ? stripGeminiModelPrefix(value) : value; + } + + if (!isRecord(value)) { + return undefined; + } + + const rawId = readString(value.id) || readString(value.name) || readString(value.model); + if (!rawId) { + return undefined; + } + + if (source === "gemini") { + const methods = Array.isArray(value.supportedGenerationMethods) + ? value.supportedGenerationMethods.map((item) => String(item)) + : []; + if (methods.length > 0 && !methods.includes("generateContent")) { + return undefined; + } + return stripGeminiModelPrefix(rawId); + } + + return rawId; +} + +function readModelDisplayName(value: unknown): string | undefined { + if (!isRecord(value)) { + return undefined; + } + return readString(value.display_name) || readString(value.displayName) || readString(value.label); +} + +function stripGeminiModelPrefix(value: string): string { + return value.replace(/^models\//i, ""); +} + +function pickProbeModel(models: string[], protocol: GatewayProviderProtocol): string | undefined { + const candidates = uniqueStrings(models); + if (candidates.length === 0) { + return undefined; + } + + if (protocol === "gemini_generate_content" || protocol === "gemini_interactions") { + return candidates.find((model) => model.toLowerCase().includes("gemini")) ?? candidates[0]; + } + + if (protocol === "anthropic_messages") { + return candidates.find((model) => model.toLowerCase().includes("claude")) ?? candidates[0]; + } + + return ( + candidates.find((model) => { + const normalized = model.toLowerCase(); + return /gpt|o\d|deepseek|qwen|glm|kimi|llama|mistral|command|sonar|yi-|doubao/.test(normalized); + }) ?? candidates[0] + ); +} + +function orderedProtocols( + parsed: ParsedProviderUrl, + allowedProtocols: GatewayProviderProtocol[] = [] +): GatewayProviderProtocol[] { + const ordered = uniqueProtocols([...parsed.hints, ...protocolOrder]); + if (allowedProtocols.length === 0) { + return ordered; + } + const allowed = new Set(allowedProtocols); + return ordered.filter((protocol) => allowed.has(protocol)); +} + +function orderedModelSources( + parsed: ParsedProviderUrl, + allowedProtocols: GatewayProviderProtocol[] = [] +): ModelSource[] { + const allowedSources = allowedProtocols.length > 0 + ? new Set(allowedProtocols.map(protocolModelSource)) + : undefined; + const hintedSources = parsed.hints + .map(protocolModelSource) + .filter((item): item is ModelSource => Boolean(item)); + const ordered = uniqueModelSources([...hintedSources, ...modelSourceOrder]); + if (!allowedSources) { + return ordered; + } + return ordered.filter((source) => allowedSources.has(source)); +} + +function protocolModelSource(protocol: GatewayProviderProtocol): ModelSource { + if (protocol === "anthropic_messages") { + return "anthropic"; + } + if (protocol === "gemini_generate_content" || protocol === "gemini_interactions") { + return "gemini"; + } + return "openai"; +} + +function orderedProtocolFallback(allowedProtocols: GatewayProviderProtocol[] = []): GatewayProviderProtocol | undefined { + if (allowedProtocols.length === 0) { + return undefined; + } + const allowed = new Set(allowedProtocols); + return protocolOrder.find((protocol) => allowed.has(protocol)) ?? allowedProtocols[0]; +} + +function protocolIsAllowed(protocol: GatewayProviderProtocol, allowedProtocols: GatewayProviderProtocol[]): boolean { + return allowedProtocols.length === 0 || allowedProtocols.includes(protocol); +} + +function detectProtocol( + parsed: ParsedProviderUrl, + protocols: GatewayProviderProbeProtocolResult[], + modelSource: ModelSource | undefined, + allowedProtocols: GatewayProviderProtocol[] = [] +): GatewayProviderProtocol | undefined { + const supported = protocols.find((item) => item.supported); + if (supported) { + return supported.protocol; + } + + const hinted = parsed.hints.find((protocol) => protocolIsAllowed(protocol, allowedProtocols)); + if (hinted) { + return hinted; + } + + if (modelSource === "anthropic" && protocolIsAllowed("anthropic_messages", allowedProtocols)) { + return "anthropic_messages"; + } + + if (modelSource === "gemini") { + const geminiProtocols = orderedProtocols(parsed, allowedProtocols).filter((protocol) => + protocol === "gemini_generate_content" || protocol === "gemini_interactions" + ); + return geminiProtocols.find((protocol) => parsed.hints.includes(protocol)) ?? + geminiProtocols.find((protocol) => protocol === "gemini_generate_content") ?? + geminiProtocols[0]; + } + + if (modelSource === "openai") { + const openAiProtocols = orderedProtocols(parsed, allowedProtocols).filter((protocol) => + protocol === "openai_responses" || protocol === "openai_chat_completions" + ); + return openAiProtocols.find((protocol) => parsed.hints.includes(protocol)) ?? + openAiProtocols.find((protocol) => protocol === "openai_chat_completions") ?? + openAiProtocols[0]; + } + + return orderedProtocolFallback(allowedProtocols); +} + +function resolveProbeBaseUrl( + parsed: ParsedProviderUrl, + protocol: GatewayProviderProtocol, + protocols: GatewayProviderProbeProtocolResult[], + modelProbe: ModelProbeResult +): string { + const supported = protocols.find((item) => item.protocol === protocol && item.supported && item.baseUrl); + if (supported?.baseUrl) { + return supported.baseUrl; + } + + if ( + (protocol === "openai_responses" || protocol === "openai_chat_completions") && + modelProbe.source === "openai" && + modelProbe.baseUrl + ) { + return modelProbe.baseUrl; + } + + return providerBaseUrlForProtocol(parsed, protocol); +} + +function protocolHints(value: string): GatewayProviderProtocol[] { + const normalized = value.toLowerCase(); + const hints: GatewayProviderProtocol[] = []; + + if (normalized.includes("chat/completions")) { + hints.push("openai_chat_completions"); + } + if (normalized.includes("responses")) { + hints.push("openai_responses"); + } + if (normalized.includes("api.openai.com") || normalized.includes("openai")) { + hints.push("openai_responses"); + } + if (normalized.includes("anthropic") || normalized.includes("/messages")) { + hints.push("anthropic_messages"); + } + if (normalized.includes("interactions") || normalized.includes("gemini_interactions") || normalized.includes("google_interactions")) { + hints.push("gemini_interactions"); + } + if (normalized.includes("generativelanguage.googleapis.com") || normalized.includes("gemini") || normalized.includes("generatecontent")) { + hints.push("gemini_generate_content"); + } + if (normalized.includes("generativelanguage.googleapis.com")) { + hints.push("gemini_interactions"); + } + + return hints; +} + +function isProtocolSupported( + status: number | undefined, + message: string, + protocol?: GatewayProviderProtocol +): boolean { + if (status === undefined) { + return false; + } + + if (status >= 200 && status < 300) { + return true; + } + + if (status === 429) { + return true; + } + + if (status === 400) { + const normalized = message.toLowerCase(); + if (/not found|unknown endpoint|unknown route|no route/.test(normalized)) { + return false; + } + return true; + } + + return false; +} + +export function isProviderProtocolEndpointSupportedForProbe( + status: number | undefined, + message: string, + protocol: GatewayProviderProtocol, + hints: GatewayProviderProtocol[] = [] +): boolean { + if (isProtocolSupported(status, message, protocol)) { + return true; + } + + if (status === 401 || status === 403) { + const normalized = message.toLowerCase(); + return (hints.length === 0 || protocolMatchesHints(protocol, hints)) && + !/not found|unknown endpoint|unknown route|no route/.test(normalized); + } + + return false; +} + +function protocolMatchesHints(protocol: GatewayProviderProtocol, hints: GatewayProviderProtocol[]): boolean { + if (hints.includes(protocol)) { + return true; + } + if (protocol === "openai_chat_completions") { + return hints.includes("openai_responses"); + } + if (protocol === "openai_responses") { + return hints.includes("openai_chat_completions"); + } + return false; +} + +function readResponseMessage(result: FetchJsonResult): string { + if (result.status === undefined) { + return result.text || "Request failed."; + } + + const payloadMessage = readPayloadMessage(result.payload); + if (payloadMessage) { + return `HTTP ${result.status}: ${payloadMessage}`; + } + + return `HTTP ${result.status}`; +} + +function readPayloadMessage(payload: unknown): string | undefined { + if (!isRecord(payload)) { + return undefined; + } + + const directMessage = readString(payload.message); + if (directMessage) { + return directMessage; + } + + if (isRecord(payload.error)) { + return readString(payload.error.message) || readString(payload.error.type) || readString(payload.error.code); + } + + return undefined; +} + +function parseJson(value: string): unknown { + if (!value.trim()) { + return undefined; + } + + try { + return JSON.parse(value) as unknown; + } catch { + return undefined; + } +} + +function readString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function uniqueStrings(values: string[]): string[] { + const seen = new Set(); + const result: string[] = []; + + for (const value of values) { + const trimmed = value.trim(); + if (!trimmed || seen.has(trimmed)) { + continue; + } + seen.add(trimmed); + result.push(trimmed); + } + + return result; +} + +function uniqueProtocols(values: GatewayProviderProtocol[]): GatewayProviderProtocol[] { + return values.filter((value, index) => values.indexOf(value) === index); +} + +function uniqueProtocolEndpoints(values: ProtocolEndpoint[]): ProtocolEndpoint[] { + const seen = new Set(); + const result: ProtocolEndpoint[] = []; + for (const value of values) { + const key = `${value.baseUrl}\n${value.endpoint}`; + if (seen.has(key)) { + continue; + } + seen.add(key); + result.push(value); + } + return result; +} + +function uniqueModelSources(values: ModelSource[]): ModelSource[] { + return values.filter((value, index) => values.indexOf(value) === index); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/core/src/providers/url.ts b/packages/core/src/providers/url.ts new file mode 100644 index 0000000..e3f66b3 --- /dev/null +++ b/packages/core/src/providers/url.ts @@ -0,0 +1,219 @@ +import type { GatewayProviderProtocol } from "@ccr/core/contracts/app"; + +export type ParsedProviderBaseUrl = { + anthropicBaseUrl: string; + anthropicBaseUrlCandidates: string[]; + geminiBaseUrl: string; + normalizedInputBaseUrl: string; + openaiBaseUrl: string; + openaiBaseUrlCandidates: string[]; + raw: string; + rootBaseUrl: string; +}; + +export function parseProviderBaseUrl(value: string): ParsedProviderBaseUrl { + const raw = value.trim(); + if (!raw) { + throw new Error("Base URL is required."); + } + + const url = new URL(providerUrlWithDefaultScheme(raw)); + url.username = ""; + url.password = ""; + url.hash = ""; + url.search = ""; + url.pathname = stripProviderEndpointPath(url.pathname); + url.pathname = stripNestedProviderApiVersion(url.pathname); + + const normalizedInputBaseUrl = compactProviderUrl(url); + const rootBaseUrl = stripProviderApiVersion(normalizedInputBaseUrl); + const anthropicBaseUrl = rootBaseUrl; + const anthropicBaseUrlCandidates = shouldProbeAnthropicPrefixFallback(anthropicBaseUrl) + ? uniqueProviderUrls([anthropicBaseUrl, appendProviderPathSegment(anthropicBaseUrl, "anthropic")]) + : [anthropicBaseUrl]; + const openaiBaseUrl = normalizedInputBaseUrl; + const openaiBaseUrlCandidates = shouldProbeOpenAiV1Fallback(openaiBaseUrl) + ? uniqueProviderUrls([openaiBaseUrl, ensureProviderApiVersion(rootBaseUrl, "v1")]) + : [openaiBaseUrl]; + + return { + anthropicBaseUrl, + anthropicBaseUrlCandidates, + geminiBaseUrl: providerGeminiBaseUrl(normalizedInputBaseUrl, rootBaseUrl), + normalizedInputBaseUrl, + openaiBaseUrl, + openaiBaseUrlCandidates, + raw, + rootBaseUrl + }; +} + +export function normalizeProviderBaseUrl(value: string, protocol?: GatewayProviderProtocol): string { + const raw = value.trim(); + if (!raw) { + return ""; + } + + try { + const parsed = parseProviderBaseUrl(raw); + return protocol ? providerBaseUrlForProtocol(parsed, protocol) : parsed.normalizedInputBaseUrl; + } catch { + return normalizeProviderBaseUrlText(raw, protocol); + } +} + +export function providerBaseUrlForProtocol(parsed: ParsedProviderBaseUrl, protocol: GatewayProviderProtocol): string { + if (protocol === "openai_responses" || protocol === "openai_chat_completions") { + return parsed.openaiBaseUrl; + } + + if (protocol === "anthropic_messages") { + return parsed.anthropicBaseUrl; + } + + return parsed.geminiBaseUrl; +} + +export function providerUrlWithDefaultScheme(value: string): string { + if (/^[a-z][a-z0-9+.-]*:\/\//i.test(value)) { + return value; + } + + if (/^(localhost|127\.|0\.0\.0\.0|\[::1\])/i.test(value)) { + return `http://${value}`; + } + + return `https://${value}`; +} + +export function compactProviderUrl(url: URL): string { + const value = url.toString(); + return value.endsWith("/") ? value.slice(0, -1) : value; +} + +function stripProviderEndpointPath(pathname: string): string { + const pathnameWithoutSlash = pathname.replace(/\/+$/, "") || "/"; + const rules: Array<[RegExp, string]> = [ + [/\/v1\/chat\/completions$/i, "/v1"], + [/\/chat\/completions$/i, ""], + [/\/v1\/responses$/i, "/v1"], + [/\/responses$/i, ""], + [/\/v1\/messages$/i, "/v1"], + [/\/messages$/i, ""], + [/\/v1beta\/models\/[^/]+:(generateContent|streamGenerateContent)$/i, "/v1beta"], + [/\/v1\/models\/[^/]+:(generateContent|streamGenerateContent)$/i, "/v1"], + [/\/v1beta\/interactions(?:\/[^/]+(?:\/cancel)?)?$/i, "/v1beta"], + [/\/v1\/interactions(?:\/[^/]+(?:\/cancel)?)?$/i, "/v1"], + [/\/interactions(?:\/[^/]+(?:\/cancel)?)?$/i, ""], + [/\/v1beta\/models$/i, "/v1beta"], + [/\/v1\/models$/i, "/v1"], + [/\/models$/i, ""] + ]; + + for (const [pattern, replacement] of rules) { + if (pattern.test(pathnameWithoutSlash)) { + const next = pathnameWithoutSlash.replace(pattern, replacement); + return next || "/"; + } + } + + return pathnameWithoutSlash; +} + +function stripProviderApiVersion(value: string): string { + const url = new URL(value); + url.pathname = url.pathname.replace(/\/(v1|v1beta)$/i, "") || "/"; + return compactProviderUrl(url); +} + +function providerGeminiBaseUrl(normalizedInputBaseUrl: string, rootBaseUrl: string): string { + return isVersionedVertexBypassBaseUrl(normalizedInputBaseUrl) + ? normalizedInputBaseUrl + : rootBaseUrl; +} + +function isVersionedVertexBypassBaseUrl(value: string): boolean { + try { + const url = new URL(value); + const segments = url.pathname + .split("/") + .map((segment) => segment.trim().toLowerCase()) + .filter(Boolean); + return segments.includes("bypass") && + segments.includes("vertex") && + /^(v1|v1beta)$/.test(segments[segments.length - 1] ?? ""); + } catch { + return false; + } +} + +function stripNestedProviderApiVersion(pathname: string): string { + return pathname.replace(/(\/v[0-9][a-z0-9-]*)\/v1$/i, "$1") || "/"; +} + +function shouldProbeOpenAiV1Fallback(value: string): boolean { + const url = new URL(value); + const pathname = url.pathname.replace(/\/+$/, ""); + return !/\/v[0-9][a-z0-9-]*$/i.test(pathname); +} + +function shouldProbeAnthropicPrefixFallback(value: string): boolean { + const url = new URL(value); + const segments = url.pathname + .split("/") + .map((segment) => segment.trim().toLowerCase()) + .filter(Boolean); + return !segments.includes("anthropic"); +} + +function ensureProviderApiVersion(value: string, version: "v1"): string { + const url = new URL(value); + const pathname = url.pathname.replace(/\/+$/, ""); + if (new RegExp(`/${version}$`, "i").test(pathname)) { + return compactProviderUrl(url); + } + url.pathname = `${pathname}/${version}`.replace(/\/{2,}/g, "/"); + return compactProviderUrl(url); +} + +function appendProviderPathSegment(value: string, segment: string): string { + const url = new URL(value); + const pathname = url.pathname.replace(/\/+$/, ""); + url.pathname = `${pathname}/${segment}`.replace(/\/{2,}/g, "/"); + return compactProviderUrl(url); +} + +function uniqueProviderUrls(values: string[]): string[] { + return values.filter((value, index) => values.indexOf(value) === index); +} + +function normalizeProviderBaseUrlText(value: string, protocol?: GatewayProviderProtocol): string { + const normalized = value + .trim() + .replace(/[?#].*$/, "") + .replace(/\/+$/, ""); + + if (protocol === "openai_chat_completions") { + return normalized.replace(/\/chat\/completions$/i, "").replace(/\/responses$/i, ""); + } + if (protocol === "openai_responses") { + return normalized.replace(/\/responses$/i, "").replace(/\/chat\/completions$/i, ""); + } + if (protocol === "anthropic_messages") { + return normalized.replace(/\/v1\/messages$/i, "").replace(/\/messages$/i, "").replace(/\/v1$/i, ""); + } + if (protocol === "gemini_generate_content" || protocol === "gemini_interactions") { + return normalized + .replace(/\/v1beta\/models\/[^/]+:(generateContent|streamGenerateContent)$/i, "") + .replace(/\/v1\/models\/[^/]+:(generateContent|streamGenerateContent)$/i, "") + .replace(/\/v1beta\/interactions(?:\/[^/]+(?:\/cancel)?)?$/i, "") + .replace(/\/v1\/interactions(?:\/[^/]+(?:\/cancel)?)?$/i, "") + .replace(/\/interactions(?:\/[^/]+(?:\/cancel)?)?$/i, "") + .replace(/\/v1beta\/models$/i, "") + .replace(/\/v1\/models$/i, "") + .replace(/\/v1beta$/i, "") + .replace(/\/v1$/i, ""); + } + + return normalized; +} diff --git a/packages/core/src/proxy/certificates.ts b/packages/core/src/proxy/certificates.ts new file mode 100644 index 0000000..57bb1d6 --- /dev/null +++ b/packages/core/src/proxy/certificates.ts @@ -0,0 +1,275 @@ +import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; +import { createHash, randomBytes } from "node:crypto"; +import net from "node:net"; +import os from "node:os"; +import path from "node:path"; +import forge from "node-forge"; +import { CERTDIR, PROXY_CA_CERT_DER_FILE, PROXY_CA_CERT_FILE, PROXY_CA_KEY_FILE } from "@ccr/core/config/constants"; + +const pki = forge.pki; +const certificateDirectoryMode = 0o700; +const certificateFileMode = 0o644; +const privateKeyFileMode = 0o600; + +export type CertificateAuthority = { + cert: forge.pki.Certificate; + key: forge.pki.rsa.PrivateKey; +}; + +export type PemPair = { + cert: string; + key: string; +}; + +type SubjectAltName = { + ip?: string; + type: 2 | 7; + value?: string; +}; + +export function ensureProxyCertificateAuthority(): void { + mkdirSync(CERTDIR, { mode: certificateDirectoryMode, recursive: true }); + securePathPermissions(CERTDIR, certificateDirectoryMode); + if (existsSync(PROXY_CA_CERT_FILE) && existsSync(PROXY_CA_KEY_FILE)) { + secureCertificateAuthorityFilePermissions(); + ensureProxyCertificateDerFile(); + return; + } + + const keys = pki.rsa.generateKeyPair(2048); + const cert = pki.createCertificate(); + cert.publicKey = keys.publicKey; + cert.serialNumber = createSerialNumber(); + cert.validity.notBefore = new Date(); + cert.validity.notAfter = new Date(); + cert.validity.notAfter.setFullYear(cert.validity.notAfter.getFullYear() + 20); + + const attrs = [ + { name: "commonName", value: `Claude Code Router CA (${os.hostname()})` }, + { name: "countryName", value: "US" }, + { shortName: "ST", value: "California" }, + { name: "localityName", value: "San Francisco" }, + { name: "organizationName", value: "Claude Code Router" }, + { shortName: "OU", value: "CCR MITM Proxy" } + ]; + cert.setSubject(attrs); + cert.setIssuer(attrs); + cert.setExtensions([ + { + cA: true, + critical: true, + name: "basicConstraints" + }, + { + critical: true, + digitalSignature: true, + keyCertSign: true, + cRLSign: true, + name: "keyUsage" + }, + { + name: "subjectKeyIdentifier" + } + ]); + cert.sign(keys.privateKey, forge.md.sha256.create()); + + writeFileSync(PROXY_CA_CERT_FILE, pki.certificateToPem(cert), { encoding: "utf8", mode: certificateFileMode }); + writeFileSync(PROXY_CA_KEY_FILE, pki.privateKeyToPem(keys.privateKey), { encoding: "utf8", mode: privateKeyFileMode }); + secureCertificateAuthorityFilePermissions(); + ensureProxyCertificateDerFile(); +} + +export function proxyCertificateAuthorityExists(): boolean { + return existsSync(PROXY_CA_CERT_FILE) && existsSync(PROXY_CA_KEY_FILE); +} + +export function readProxyCertificateAuthority(): CertificateAuthority { + ensureProxyCertificateAuthority(); + return { + cert: pki.certificateFromPem(readFileSync(PROXY_CA_CERT_FILE, "utf8")), + key: pki.privateKeyFromPem(readFileSync(PROXY_CA_KEY_FILE, "utf8")) as forge.pki.rsa.PrivateKey + }; +} + +export function proxyCertificateAuthorityKeyMatches(): boolean { + if (!proxyCertificateAuthorityExists()) { + return false; + } + + try { + const authority = readProxyCertificateAuthority(); + const publicKey = authority.cert.publicKey as forge.pki.rsa.PublicKey; + return authority.key.n.equals(publicKey.n) && authority.key.e.equals(publicKey.e); + } catch { + return false; + } +} + +export function readProxyCertificateFingerprintSha256(): string | undefined { + if (!existsSync(PROXY_CA_CERT_FILE)) { + return undefined; + } + + try { + return fingerprintPem(readFileSync(PROXY_CA_CERT_FILE, "utf8"), "sha256"); + } catch { + return undefined; + } +} + +export function readProxyCertificateFingerprintSha1(): string | undefined { + if (!existsSync(PROXY_CA_CERT_FILE)) { + return undefined; + } + + try { + return fingerprintPem(readFileSync(PROXY_CA_CERT_FILE, "utf8"), "sha1"); + } catch { + return undefined; + } +} + +export function readProxyCertificateSerialNumber(): string | undefined { + if (!existsSync(PROXY_CA_CERT_FILE)) { + return undefined; + } + + try { + const cert = pki.certificateFromPem(readFileSync(PROXY_CA_CERT_FILE, "utf8")); + return cert.serialNumber; + } catch { + return undefined; + } +} + +export function createCertificateForHost(hostname: string, authority: CertificateAuthority): PemPair { + const keys = pki.rsa.generateKeyPair(2048); + const cert = pki.createCertificate(); + cert.publicKey = keys.publicKey; + cert.serialNumber = createSerialNumber(); + cert.validity.notBefore = new Date(); + cert.validity.notBefore.setDate(cert.validity.notBefore.getDate() - 1); + cert.validity.notAfter = new Date(); + cert.validity.notAfter.setFullYear(cert.validity.notAfter.getFullYear() + 10); + + const attrs = [ + { name: "commonName", value: hostname }, + { name: "countryName", value: "US" }, + { shortName: "ST", value: "California" }, + { name: "localityName", value: "San Francisco" } + ]; + + cert.setIssuer(authority.cert.subject.attributes); + cert.setSubject(attrs); + cert.setExtensions([ + { + cA: false, + critical: true, + name: "basicConstraints" + }, + { + critical: true, + digitalSignature: true, + keyEncipherment: true, + name: "keyUsage" + }, + { + altNames: [subjectAltName(hostname)], + name: "subjectAltName" + }, + { + name: "extKeyUsage", + serverAuth: true + }, + { + name: "subjectKeyIdentifier" + }, + { + keyIdentifier: authority.cert.generateSubjectKeyIdentifier().getBytes(), + name: "authorityKeyIdentifier" + } + ]); + cert.sign(authority.key, forge.md.sha256.create()); + + return { + cert: pki.certificateToPem(cert), + key: pki.privateKeyToPem(keys.privateKey) + }; +} + +export function proxyCaCertFile(): string { + return path.normalize(PROXY_CA_CERT_FILE); +} + +export function proxyCaCertInstallFile(): string { + return path.normalize(ensureProxyCertificateDerFile() ? PROXY_CA_CERT_DER_FILE : PROXY_CA_CERT_FILE); +} + +function ensureProxyCertificateDerFile(): boolean { + if (!existsSync(PROXY_CA_CERT_FILE)) { + return false; + } + + try { + writeProxyCertificateDerFile(pki.certificateFromPem(readFileSync(PROXY_CA_CERT_FILE, "utf8"))); + return true; + } catch { + return false; + } +} + +function writeProxyCertificateDerFile(cert: forge.pki.Certificate): void { + const der = forge.asn1.toDer(pki.certificateToAsn1(cert)).getBytes(); + writeFileSync(PROXY_CA_CERT_DER_FILE, Buffer.from(der, "binary"), { mode: certificateFileMode }); + securePathPermissions(PROXY_CA_CERT_DER_FILE, certificateFileMode); +} + +function secureCertificateAuthorityFilePermissions(): void { + securePathPermissions(PROXY_CA_CERT_FILE, certificateFileMode); + securePathPermissions(PROXY_CA_KEY_FILE, privateKeyFileMode); + securePathPermissions(PROXY_CA_CERT_DER_FILE, certificateFileMode); +} + +function securePathPermissions(file: string, mode: number): void { + if (process.platform === "win32" || !existsSync(file)) { + return; + } + chmodSync(file, mode); +} + +function createSerialNumber(): string { + const bytes = randomBytes(16); + bytes[0] &= 0x7f; + if (bytes.every((byte) => byte === 0)) { + bytes[15] = 1; + } + return bytes.toString("hex"); +} + +function fingerprintPem(pem: string, algorithm: "sha1" | "sha256"): string { + const der = Buffer.from( + pem + .replace(/-----BEGIN CERTIFICATE-----/g, "") + .replace(/-----END CERTIFICATE-----/g, "") + .replace(/\s+/g, ""), + "base64" + ); + return createHash(algorithm) + .update(der) + .digest("hex") + .match(/.{1,2}/g)! + .join(":") + .toUpperCase(); +} + +function subjectAltName(hostname: string): SubjectAltName { + return net.isIP(hostname) + ? { + ip: hostname, + type: 7 + } + : { + type: 2, + value: hostname + }; +} diff --git a/packages/core/src/proxy/service.ts b/packages/core/src/proxy/service.ts new file mode 100644 index 0000000..8c8cfa0 --- /dev/null +++ b/packages/core/src/proxy/service.ts @@ -0,0 +1,1868 @@ +import { execFile } from "node:child_process"; +import { randomUUID } from "node:crypto"; +import { chmodSync, writeFileSync } from "node:fs"; +import http, { type ClientRequest, type IncomingHttpHeaders, type IncomingMessage, type Server, type ServerResponse } from "node:http"; +import https from "node:https"; +import net, { type Socket } from "node:net"; +import os from "node:os"; +import path from "node:path"; +import { PassThrough } from "node:stream"; +import tls from "node:tls"; +import { pathToFileURL } from "node:url"; +import { brotliDecompressSync, gunzipSync, inflateRawSync, inflateSync } from "node:zlib"; +import type { + AppConfig, + ProxyForwardMode, + ProxyCertificateInstallResult, + ProxyCertificateStatus, + ProxyMode, + ProxyNetworkBody, + ProxyNetworkExchange, + ProxyNetworkSnapshot, + ProxyRouteTarget, + ProxyStatus +} from "@ccr/core/contracts/app"; +import { PROXY_CA_CERT_FILE } from "@ccr/core/config/constants"; +import { windowsSystemCommand } from "@ccr/core/platform/windows-system"; +import { pluginService, type GatewayPluginProxyRouteMatch } from "@ccr/core/plugins/service"; +import { + createCertificateForHost, + ensureProxyCertificateAuthority, + proxyCertificateAuthorityKeyMatches, + proxyCertificateAuthorityExists, + proxyCaCertFile, + proxyCaCertInstallFile, + readProxyCertificateFingerprintSha1, + readProxyCertificateFingerprintSha256, + readProxyCertificateAuthority, + type CertificateAuthority +} from "@ccr/core/proxy/certificates"; +import { formatUpstreamProxy, readCurrentSystemUpstreamProxy, systemProxyManager, type UpstreamProxyConfig, type UpstreamProxyServer } from "@ccr/core/proxy/system-proxy"; + +type MitmServer = { + host: string; + port: number; + server: https.Server; +}; + +type AttachedServer = { + onConnect: (request: IncomingMessage, clientSocket: Socket, head: Buffer) => void; + server: Server; +}; + +type CapturedHeaders = Record; + +type ProxyNetworkCaptureRecord = { + client: string; + completedAt?: string; + durationMs?: number; + error?: string; + host: string; + id: string; + method: string; + mode: ProxyForwardMode; + path: string; + protocol: "http" | "https"; + requestHeaders: CapturedHeaders; + requestSampler: NetworkBodySampler; + responseHeaders?: CapturedHeaders; + responseSampler: NetworkBodySampler; + routedToGateway: boolean; + startedAt: string; + startedAtMs: number; + state: "complete" | "error" | "pending"; + statusCode?: number; + upstreamUrl: string; + url: string; +}; + +type ActiveProxyNetworkCapture = { + appendRequestBody: (chunk: Buffer | string) => void; + appendResponseBody: (chunk: Buffer | string) => void; + complete: () => void; + completeIfPending: () => void; + fail: (message: string, statusCode?: number) => void; + setResponse: (statusCode: number, headers: CapturedHeaders | IncomingHttpHeaders) => void; +}; + +export type ProxyDesktopIntegration = { + requestMacosCertificateInstallPermission?: () => Promise; + revealFile?: (file: string) => Promise; +}; + +const requestHopByHopHeaders = new Set([ + "connection", + "keep-alive", + "proxy-authenticate", + "proxy-authorization", + "proxy-connection", + "te", + "trailer", + "transfer-encoding", + "upgrade" +]); + +const responseHopByHopHeaders = new Set([ + "connection", + "keep-alive", + "proxy-authenticate", + "proxy-authorization", + "proxy-connection", + "te", + "trailer", + "transfer-encoding", + "upgrade" +]); + +const maxNetworkCaptureBodyBytes = 256 * 1024; +const maxNetworkCaptureEntries = 200; +const defaultSystemProxyRestoreTimeoutMs = 10_000; +const upstreamProxyConnectTimeoutMs = 30_000; +const upstreamRequestIdleTimeoutMs = 120_000; + +class ProxyService { + private authority?: CertificateAuthority; + private attachedServer?: AttachedServer; + private config?: AppConfig; + private desktopIntegration: ProxyDesktopIntegration = {}; + private networkCaptureEnabled = false; + private networkCaptures: ProxyNetworkCaptureRecord[] = []; + private secureServers = new Map>(); + private server?: Server; + private status: ProxyStatus = { + caCertFile: proxyCaCertFile(), + endpoint: "", + mode: "gateway", + port: 0, + state: "stopped", + systemProxy: systemProxyManager.getStatus(), + targetHosts: [] + }; + private upstreamProxy?: UpstreamProxyConfig; + + setDesktopIntegration(integration: ProxyDesktopIntegration): void { + this.desktopIntegration = integration; + } + + async start(config: AppConfig): Promise { + await this.stop(); + this.config = config; + this.networkCaptureEnabled = config.proxy.captureNetwork; + this.status = createProxyStatus(config, proxyEndpoint(config), config.proxy.port); + + if (!config.proxy.enabled) { + return this.getStatus(); + } + + try { + await this.requireTrustedCertificate(); + ensureProxyCertificateAuthority(); + this.authority = readProxyCertificateAuthority(); + this.server = http.createServer((request, response) => { + void this.handleProxyRequest(request, response, "http:").catch((error) => { + sendProxyError(response, 502, formatError(error)); + }); + }); + this.server.on("connect", (request, clientSocket, head) => { + const socket = clientSocket as Socket; + void this.handleConnect(request, socket, head).catch((error) => { + handleConnectError(request, socket, error); + }); + }); + + await listen(this.server, config.proxy.port, config.proxy.host); + this.status = { + ...this.status, + lastError: undefined, + lastStartedAt: new Date().toISOString(), + state: "running" + }; + if (config.proxy.systemProxy) { + await this.activateSystemProxy(); + } + return this.getStatus(); + } catch (error) { + await this.stop(); + this.status = { + ...this.status, + lastError: formatError(error), + state: "error" + }; + return this.getStatus(); + } + } + + async attach(config: AppConfig, server: Server): Promise { + await this.stop(); + this.config = config; + this.networkCaptureEnabled = config.proxy.captureNetwork; + this.status = createProxyStatus(config, sharedProxyEndpoint(config), config.gateway.port); + + if (!config.proxy.enabled) { + return this.getStatus(); + } + + try { + await this.requireTrustedCertificate(); + ensureProxyCertificateAuthority(); + this.authority = readProxyCertificateAuthority(); + const onConnect = (request: IncomingMessage, clientSocket: Socket, head: Buffer) => { + const socket = clientSocket as Socket; + void this.handleConnect(request, socket, head).catch((error) => { + handleConnectError(request, socket, error); + }); + }; + server.on("connect", onConnect); + this.attachedServer = { onConnect, server }; + this.status = { + ...this.status, + lastError: undefined, + lastStartedAt: new Date().toISOString(), + state: "running" + }; + if (config.proxy.systemProxy) { + await this.activateSystemProxy(); + } + return this.getStatus(); + } catch (error) { + await this.stop(); + this.status = { + ...this.status, + lastError: formatError(error), + state: "error" + }; + return this.getStatus(); + } + } + + async stop(systemProxyRestoreTimeoutMs = defaultSystemProxyRestoreTimeoutMs): Promise { + this.upstreamProxy = undefined; + + const systemProxyStatus = await withTimeout(systemProxyManager.restore(), systemProxyRestoreTimeoutMs, { + lastError: "Timed out while restoring the previous system proxy. Check system proxy settings if traffic does not recover.", + state: "error" + }); + + const attachedServer = this.attachedServer; + this.attachedServer = undefined; + if (attachedServer) { + attachedServer.server.off("connect", attachedServer.onConnect); + } + + const server = this.server; + this.server = undefined; + if (server) { + await closeServer(server); + } + + const localServers = await Promise.allSettled(this.secureServers.values()); + this.secureServers.clear(); + await Promise.all( + localServers.map((result) => { + if (result.status === "fulfilled") { + return closeServer(result.value.server); + } + return Promise.resolve(); + }) + ); + + this.authority = undefined; + this.status = { + ...this.status, + lastError: systemProxyStatus.state === "error" ? systemProxyStatus.lastError : this.status.lastError, + state: "stopped", + systemProxy: systemProxyStatus + }; + } + + getStatus(): ProxyStatus { + return { ...this.status, systemProxy: { ...this.status.systemProxy }, targetHosts: [...this.status.targetHosts] }; + } + + updateConfig(config: AppConfig): void { + this.config = config; + this.networkCaptureEnabled = config.proxy.captureNetwork; + } + + isNetworkCaptureEnabled(): boolean { + return this.networkCaptureEnabled; + } + + getNetworkCaptures(): ProxyNetworkSnapshot { + return { + capturedAt: new Date().toISOString(), + captureEnabled: this.networkCaptureEnabled, + items: this.networkCaptures.map(toProxyNetworkExchange), + maxBodyBytes: maxNetworkCaptureBodyBytes, + maxEntries: maxNetworkCaptureEntries + }; + } + + clearNetworkCaptures(): ProxyNetworkSnapshot { + this.networkCaptures = []; + return this.getNetworkCaptures(); + } + + setNetworkCaptureEnabled(enabled: boolean): ProxyNetworkSnapshot { + this.networkCaptureEnabled = enabled; + if (this.config) { + this.config = { + ...this.config, + proxy: { + ...this.config.proxy, + captureNetwork: enabled + } + }; + } + return this.getNetworkCaptures(); + } + + async ensureSystemProxyActive(): Promise { + if (!this.config?.proxy.enabled || !this.config.proxy.systemProxy || this.status.state !== "running") { + return this.getStatus(); + } + + if (this.status.systemProxy.state === "active") { + return this.getStatus(); + } + + try { + await this.activateSystemProxy(); + return this.getStatus(); + } catch (error) { + this.status = { + ...this.status, + lastError: formatError(error), + systemProxy: { + lastError: formatError(error), + state: "error" + } + }; + return this.getStatus(); + } + } + + getUpstreamProxy(): UpstreamProxyConfig | undefined { + return cloneUpstreamProxy(this.upstreamProxy); + } + + getUpstreamProxyUrl(protocol: "http" | "https" = "https"): string | undefined { + const upstreamProxy = selectUpstreamProxy(this.upstreamProxy, protocol); + if (!upstreamProxy) { + return undefined; + } + return `http://${formatProxyHost(upstreamProxy.host)}:${upstreamProxy.port}`; + } + + async refreshUpstreamProxyFromCurrentSystem(): Promise { + if (this.upstreamProxy || this.status.state !== "running" || !this.status.endpoint) { + return; + } + + const upstreamProxy = await readCurrentSystemUpstreamProxy(this.status.endpoint); + if (!upstreamProxy) { + return; + } + + this.upstreamProxy = upstreamProxy; + this.status = { + ...this.status, + systemProxy: { + ...this.status.systemProxy, + upstream: formatUpstreamProxy(upstreamProxy) + } + }; + } + + shouldHandleHttpRequest(request: IncomingMessage): boolean { + return Boolean(this.config?.proxy.enabled && isAbsoluteProxyUrl(request.url)); + } + + async handleHttpRequest(request: IncomingMessage, response: ServerResponse, defaultProtocol: "http:" | "https:" = "http:"): Promise { + await this.handleProxyRequest(request, response, defaultProtocol); + } + + async installCertificate(): Promise { + ensureProxyCertificateAuthority(); + if (process.platform === "darwin") { + const approved = await this.requestMacosCertificateInstallPermission(); + if (!approved) { + const status = await this.getCertificateStatus(); + return { + caCertFile: proxyCaCertFile(), + manualCommand: macosManualCertificateInstallCommand(), + message: "Certificate installation was cancelled. Install the CA into the macOS System keychain to use HTTPS proxying.", + ok: false, + status + }; + } + + try { + await execFilePromise("/usr/bin/osascript", [ + "-e", + `do shell script ${quoteAppleScriptString(macosSystemCertificateInstallScript())} with administrator privileges` + ]); + } catch (error) { + let terminalMessage = ""; + try { + const installerFile = await openMacosTerminalCertificateInstaller(); + terminalMessage = ` Opened Terminal installer: ${installerFile}`; + } catch (terminalError) { + await this.revealFile(PROXY_CA_CERT_FILE).catch(() => undefined); + terminalMessage = ` Could not open Terminal installer: ${formatError(terminalError)}`; + } + const status = await this.getCertificateStatus(); + return { + caCertFile: proxyCaCertFile(), + manualCommand: macosManualCertificateInstallCommand(), + message: `macOS did not allow CCR to request administrator authorization: ${formatError(error)}.${terminalMessage}`, + ok: false, + status + }; + } + + const status = await this.getCertificateStatus(); + return { + caCertFile: proxyCaCertFile(), + message: "Certificate installed into the macOS System keychain.", + ok: true, + status + }; + } + + if (process.platform === "win32") { + try { + await execFilePromise(windowsSystemCommand("certutil.exe"), ["-user", "-addstore", "Root", proxyCaCertInstallFile()]); + } catch (error) { + const status = await this.getCertificateStatus(); + return { + caCertFile: proxyCaCertFile(), + manualCommand: windowsManualCertificateInstallCommand(), + message: `Windows could not install the proxy CA certificate: ${formatError(error)}`, + ok: false, + status + }; + } + + const status = await this.getCertificateStatus(); + return { + caCertFile: proxyCaCertFile(), + manualCommand: status.trusted ? undefined : windowsManualCertificateInstallCommand(), + message: status.trusted + ? "Certificate installed into the current user's Root store." + : `Certificate import completed, but Windows trust verification did not find the certificate: ${status.message}`, + ok: status.trusted, + status + }; + } + + const status = await this.getCertificateStatus(); + return { + caCertFile: proxyCaCertFile(), + message: "Automatic certificate install is not supported on this platform. Import the CA file into the system trust store manually.", + ok: false, + status + }; + } + + private async requestMacosCertificateInstallPermission(): Promise { + return await (this.desktopIntegration.requestMacosCertificateInstallPermission?.() ?? Promise.resolve(true)); + } + + private async revealFile(file: string): Promise { + if (this.desktopIntegration.revealFile) { + await this.desktopIntegration.revealFile(file); + return; + } + await revealFileWithSystemCommand(file); + } + + async getCertificateStatus(): Promise { + const base = { + caCertFile: proxyCaCertFile(), + caFingerprintSha256: readProxyCertificateFingerprintSha256(), + platform: process.platform + }; + + if (!proxyCertificateAuthorityExists()) { + return { + ...base, + canInstall: process.platform === "darwin" || process.platform === "win32", + message: "Proxy CA certificate is not installed. Install the CA certificate before enabling proxy mode.", + state: "missing", + trusted: false + }; + } + + if (!proxyCertificateAuthorityKeyMatches()) { + return { + ...base, + canInstall: process.platform === "darwin" || process.platform === "win32", + message: + "Proxy CA certificate and private key do not match. Recreate the proxy CA certificate, trust the new CA, then restart proxy mode.", + state: "unknown", + trusted: false + }; + } + + if (process.platform === "darwin") { + try { + const systemKeychainMatch = await macosKeychainContainsCertificateFingerprint( + base.caFingerprintSha256, + "/Library/Keychains/System.keychain" + ); + if (systemKeychainMatch) { + return { + ...base, + canInstall: true, + message: "Proxy CA certificate is installed in the macOS System keychain.", + state: "trusted", + trusted: true + }; + } + + const loginKeychainMatch = await macosKeychainContainsCertificateFingerprint( + base.caFingerprintSha256, + path.join(os.homedir(), "Library", "Keychains", "login.keychain-db") + ); + if (loginKeychainMatch) { + return { + ...base, + canInstall: true, + message: + "Proxy CA certificate is installed only in the login keychain. Install it into the macOS System keychain so Chrome can trust HTTPS proxy certificates.", + state: "untrusted", + trusted: false + }; + } + + return { + ...base, + canInstall: true, + message: + "Proxy CA certificate is not installed in the macOS System keychain. Install and trust this exact CA certificate before enabling HTTPS proxying.", + state: "untrusted", + trusted: false + }; + } catch (error) { + return { + ...base, + canInstall: true, + message: `Proxy CA certificate is not trusted: ${formatError(error)}`, + state: "untrusted", + trusted: false + }; + } + } + + if (process.platform === "win32") { + const caFingerprintSha1 = readProxyCertificateFingerprintSha1(); + if (!caFingerprintSha1) { + return { + ...base, + canInstall: true, + message: "Proxy CA certificate thumbprint could not be read. Reinstall the CA certificate.", + state: "unknown", + trusted: false + }; + } + + try { + const trusted = await windowsCurrentUserRootContainsCertificateThumbprint(caFingerprintSha1); + if (!trusted) { + return { + ...base, + canInstall: true, + message: + "Proxy CA certificate is not installed in the current user's Windows Root store. Install this exact CA certificate before enabling HTTPS proxying.", + state: "untrusted", + trusted: false + }; + } + + return { + ...base, + canInstall: true, + message: "Proxy CA certificate is installed in the current user's Windows Root store.", + state: "trusted", + trusted: true + }; + } catch (error) { + return { + ...base, + canInstall: true, + message: `Proxy CA certificate is not trusted: ${formatError(error)}`, + state: "untrusted", + trusted: false + }; + } + } + + return { + ...base, + canInstall: false, + message: "Automatic certificate trust detection is not supported on this platform. Import the CA certificate manually before enabling proxy mode.", + state: "unsupported", + trusted: false + }; + } + + private async requireTrustedCertificate(): Promise { + const status = await this.getCertificateStatus(); + if (!status.trusted) { + throw new Error(status.message); + } + } + + private async handleConnect(request: IncomingMessage, clientSocket: Socket, head: Buffer): Promise { + const target = parseConnectTarget(request.url); + const mitmServer = await this.getMitmServer(target.hostname); + const localSocket = net.connect(mitmServer.port, "127.0.0.1"); + localSocket.once("connect", () => { + clientSocket.write("HTTP/1.1 200 Connection Established\r\nProxy-agent: CCR-MITM\r\n\r\n"); + if (head.length > 0) { + localSocket.write(head); + } + localSocket.pipe(clientSocket); + clientSocket.pipe(localSocket); + }); + localSocket.once("error", (error) => { + handleConnectError(request, clientSocket, error); + }); + clientSocket.once("error", () => { + localSocket.destroy(); + }); + clientSocket.once("end", () => { + localSocket.end(); + }); + localSocket.once("end", () => { + clientSocket.end(); + }); + } + + private async getMitmServer(hostname: string): Promise { + const key = hostname.toLowerCase(); + const cached = this.secureServers.get(key); + if (cached) { + return cached; + } + + const promise = this.createMitmServer(key).catch((error) => { + this.secureServers.delete(key); + throw error; + }); + this.secureServers.set(key, promise); + return promise; + } + + private async createMitmServer(hostname: string): Promise { + const authority = this.authority ?? readProxyCertificateAuthority(); + const certificate = createCertificateForHost(hostname, authority); + const server = https.createServer( + { + ALPNProtocols: ["http/1.1"], + cert: certificate.cert, + key: certificate.key + }, + (request, response) => { + void this.handleProxyRequest(request, response, "https:").catch((error) => { + sendProxyError(response, 502, formatError(error)); + }); + } + ); + await listen(server, 0, "127.0.0.1"); + const address = server.address(); + if (!address || typeof address === "string") { + await closeServer(server); + throw new Error(`Failed to start MITM server for ${hostname}`); + } + return { + host: hostname, + port: address.port, + server + }; + } + + private async handleProxyRequest(request: IncomingMessage, response: ServerResponse, defaultProtocol: "http:" | "https:"): Promise { + if (!this.config) { + sendProxyError(response, 503, "Proxy service is not configured."); + return; + } + + const requestId = randomUUID(); + const targetUrl = resolveRequestUrl(request, defaultProtocol); + const pluginRoute = pluginService.resolveProxyRoute(targetUrl); + if (!pluginRoute && isCursorAgentProxyRequest(targetUrl)) { + console.warn(`[proxy] Cursor Agent request did not match a plugin proxy route: ${request.method || "GET"} ${targetUrl.host}${targetUrl.pathname}`); + } + const routedToGateway = !pluginRoute && shouldRouteToGateway(this.config, targetUrl); + const upstreamUrl = pluginRoute?.upstreamUrl ?? (routedToGateway ? buildGatewayUrl(this.config, targetUrl) : targetUrl); + const mode: ProxyForwardMode = pluginRoute ? "plugin" : routedToGateway ? "gateway" : "transparent"; + const capture = this.networkCaptureEnabled + ? this.beginNetworkCapture({ + mode, + request, + requestId, + routedToGateway, + targetUrl, + upstreamUrl + }) + : createNoopNetworkCapture(); + + request.once("error", (error) => { + capture.fail(`Client request stream failed: ${formatError(error)}`); + }); + + await forwardRequest({ + capture, + config: this.config, + mode, + pluginRoute, + request, + response, + routedToGateway, + targetUrl, + upstreamUrl, + upstreamProxy: this.upstreamProxy + }).finally(() => { + capture.completeIfPending(); + }); + } + + private beginNetworkCapture({ + mode, + request, + requestId, + routedToGateway, + targetUrl, + upstreamUrl + }: { + mode: ProxyForwardMode; + request: IncomingMessage; + requestId: string; + routedToGateway: boolean; + targetUrl: URL; + upstreamUrl: URL; + }): ActiveProxyNetworkCapture { + const startedAtMs = Date.now(); + const record: ProxyNetworkCaptureRecord = { + client: inferProxyClient(request.headers), + host: targetUrl.host, + id: requestId, + method: request.method ?? "GET", + mode, + path: `${targetUrl.pathname}${targetUrl.search}`, + protocol: targetUrl.protocol === "https:" ? "https" : "http", + requestHeaders: cloneHeaders(request.headers), + requestSampler: new NetworkBodySampler(maxNetworkCaptureBodyBytes), + responseSampler: new NetworkBodySampler(maxNetworkCaptureBodyBytes), + routedToGateway, + startedAt: new Date(startedAtMs).toISOString(), + startedAtMs, + state: "pending", + upstreamUrl: upstreamUrl.toString(), + url: targetUrl.toString() + }; + + this.networkCaptures.unshift(record); + if (this.networkCaptures.length > maxNetworkCaptureEntries) { + this.networkCaptures.length = maxNetworkCaptureEntries; + } + + const finish = (state: "complete" | "error", message?: string, statusCode?: number) => { + if (record.state !== "pending") { + return; + } + const completedAtMs = Date.now(); + record.completedAt = new Date(completedAtMs).toISOString(); + record.durationMs = completedAtMs - record.startedAtMs; + record.state = state; + if (message) { + record.error = message; + } + if (statusCode !== undefined && record.statusCode === undefined) { + record.statusCode = statusCode; + } + }; + + return { + appendRequestBody: (chunk) => record.requestSampler.append(chunk), + appendResponseBody: (chunk) => record.responseSampler.append(chunk), + complete: () => finish("complete"), + completeIfPending: () => finish("complete"), + fail: (message, statusCode) => finish("error", message, statusCode), + setResponse: (statusCode, headers) => { + record.statusCode = statusCode; + record.responseHeaders = cloneHeaders(headers); + } + }; + } + + private async activateSystemProxy(): Promise { + const result = await systemProxyManager.enable(this.status.endpoint); + this.upstreamProxy = result.upstreamProxy; + const effectiveUpstream = formatUpstreamProxy(this.upstreamProxy); + this.status = { + ...this.status, + systemProxy: effectiveUpstream && effectiveUpstream !== result.status.upstream + ? { ...result.status, upstream: effectiveUpstream } + : result.status + }; + } +} + +export const proxyService = new ProxyService(); + +function createNoopNetworkCapture(): ActiveProxyNetworkCapture { + return { + appendRequestBody: () => undefined, + appendResponseBody: () => undefined, + complete: () => undefined, + completeIfPending: () => undefined, + fail: () => undefined, + setResponse: () => undefined + }; +} + +function forwardRequest({ + capture, + config, + mode, + pluginRoute, + request, + response, + routedToGateway, + targetUrl, + upstreamProxy, + upstreamUrl +}: { + capture: ActiveProxyNetworkCapture; + config: AppConfig; + mode: ProxyForwardMode; + pluginRoute?: GatewayPluginProxyRouteMatch; + request: IncomingMessage; + response: ServerResponse; + routedToGateway: boolean; + targetUrl: URL; + upstreamProxy?: UpstreamProxyConfig; + upstreamUrl: URL; +}): Promise { + const proxyServer = selectUpstreamProxyForUrl(upstreamProxy, upstreamUrl); + if (!proxyServer) { + return forwardDirectRequest({ + config, + capture, + mode, + pluginRoute, + request, + response, + routedToGateway, + targetUrl, + upstreamUrl + }); + } + + if (upstreamUrl.protocol === "https:") { + return forwardHttpsRequestViaHttpProxy({ + config, + capture, + mode, + pluginRoute, + proxyServer, + request, + response, + routedToGateway, + targetUrl, + upstreamUrl + }); + } + + return forwardHttpRequestViaHttpProxy({ + config, + capture, + mode, + pluginRoute, + proxyServer, + request, + response, + routedToGateway, + targetUrl, + upstreamUrl + }); +} + +function forwardDirectRequest({ + capture, + config, + mode, + pluginRoute, + request, + response, + routedToGateway, + targetUrl, + upstreamUrl +}: { + capture: ActiveProxyNetworkCapture; + config: AppConfig; + mode: ProxyForwardMode; + pluginRoute?: GatewayPluginProxyRouteMatch; + request: IncomingMessage; + response: ServerResponse; + routedToGateway: boolean; + targetUrl: URL; + upstreamUrl: URL; +}): Promise { + return new Promise((resolve) => { + const transport = upstreamUrl.protocol === "https:" ? https : http; + const upstreamRequest = transport.request( + { + headers: createForwardHeaders(request.headers, upstreamUrl, routedToGateway, config, { pluginRoute, targetUrl }), + hostname: upstreamUrl.hostname, + method: request.method, + path: `${upstreamUrl.pathname}${upstreamUrl.search}`, + port: upstreamUrl.port || (upstreamUrl.protocol === "https:" ? 443 : 80), + protocol: upstreamUrl.protocol + }, + (upstreamResponse) => { + const statusCode = upstreamResponse.statusCode ?? 502; + const responseHeaders = filterResponseHeaders(upstreamResponse.headers); + capture.setResponse(statusCode, responseHeaders); + response.writeHead(statusCode, responseHeaders); + upstreamResponse.on("data", capture.appendResponseBody); + upstreamResponse.pipe(response); + upstreamResponse.once("end", () => { + capture.complete(); + resolve(); + }); + upstreamResponse.once("error", (error) => { + if (!response.headersSent) { + const message = formatError(error); + captureProxyError(capture, 502, message); + sendProxyError(response, 502, message); + } else { + response.destroy(error); + } + capture.fail(formatError(error), response.statusCode || statusCode); + resolve(); + }); + } + ); + + upstreamRequest.once("error", (error) => { + const message = `Proxy ${mode} request failed: ${formatError(error)}`; + if (!response.headersSent) { + captureProxyError(capture, 502, message); + sendProxyError(response, 502, message); + } else { + response.destroy(error); + } + capture.fail(message, response.statusCode || 502); + resolve(); + }); + setClientRequestTimeout(upstreamRequest, upstreamRequestIdleTimeoutMs, `Proxy ${mode} request timed out.`); + pipeCapturedRequestBody(request, upstreamRequest, capture); + }); +} + +function forwardHttpRequestViaHttpProxy({ + capture, + config, + mode, + pluginRoute, + proxyServer, + request, + response, + routedToGateway, + targetUrl, + upstreamUrl +}: { + capture: ActiveProxyNetworkCapture; + config: AppConfig; + mode: ProxyForwardMode; + pluginRoute?: GatewayPluginProxyRouteMatch; + proxyServer: UpstreamProxyServer; + request: IncomingMessage; + response: ServerResponse; + routedToGateway: boolean; + targetUrl: URL; + upstreamUrl: URL; +}): Promise { + return new Promise((resolve) => { + const upstreamRequest = http.request( + { + agent: false, + headers: createForwardHeaders(request.headers, upstreamUrl, routedToGateway, config, { pluginRoute, targetUrl }), + hostname: proxyServer.host, + method: request.method, + path: upstreamUrl.toString(), + port: proxyServer.port, + protocol: "http:" + }, + (upstreamResponse) => { + const statusCode = upstreamResponse.statusCode ?? 502; + const responseHeaders = filterResponseHeaders(upstreamResponse.headers); + capture.setResponse(statusCode, responseHeaders); + response.writeHead(statusCode, responseHeaders); + upstreamResponse.on("data", capture.appendResponseBody); + upstreamResponse.pipe(response); + upstreamResponse.once("end", () => { + capture.complete(); + resolve(); + }); + upstreamResponse.once("error", (error) => { + if (!response.headersSent) { + const message = formatError(error); + captureProxyError(capture, 502, message); + sendProxyError(response, 502, message); + } else { + response.destroy(error); + } + capture.fail(formatError(error), response.statusCode || statusCode); + resolve(); + }); + } + ); + + upstreamRequest.once("error", (error) => { + const message = + `Proxy ${mode} HTTP request via upstream proxy ${formatUpstreamProxyServer(proxyServer)} ` + + `to ${upstreamUrl.toString()} failed: ${formatError(error)}`; + if (!response.headersSent) { + captureProxyError(capture, 502, message); + sendProxyError(response, 502, message); + } else { + response.destroy(error); + } + capture.fail(message, response.statusCode || 502); + resolve(); + }); + setClientRequestTimeout( + upstreamRequest, + upstreamRequestIdleTimeoutMs, + `Proxy ${mode} HTTP request via upstream proxy ${formatUpstreamProxyServer(proxyServer)} to ${upstreamUrl.toString()} timed out.` + ); + pipeCapturedRequestBody(request, upstreamRequest, capture); + }); +} + +function forwardHttpsRequestViaHttpProxy({ + capture, + config, + mode, + pluginRoute, + proxyServer, + request, + response, + routedToGateway, + targetUrl, + upstreamUrl +}: { + capture: ActiveProxyNetworkCapture; + config: AppConfig; + mode: ProxyForwardMode; + pluginRoute?: GatewayPluginProxyRouteMatch; + proxyServer: UpstreamProxyServer; + request: IncomingMessage; + response: ServerResponse; + routedToGateway: boolean; + targetUrl: URL; + upstreamUrl: URL; +}): Promise { + return new Promise((resolve) => { + const targetPort = Number(upstreamUrl.port || 443); + const connectRequest = http.request({ + agent: false, + headers: { + host: `${upstreamUrl.hostname}:${targetPort}`, + "proxy-connection": "keep-alive" + }, + hostname: proxyServer.host, + method: "CONNECT", + path: `${upstreamUrl.hostname}:${targetPort}`, + port: proxyServer.port, + protocol: "http:" + }); + + connectRequest.once("connect", (connectResponse, socket, head) => { + if ((connectResponse.statusCode ?? 502) < 200 || (connectResponse.statusCode ?? 502) >= 300) { + socket.destroy(); + const message = + `Upstream proxy ${formatUpstreamProxyServer(proxyServer)} CONNECT ${upstreamUrl.hostname}:${targetPort} ` + + `failed with status ${connectResponse.statusCode ?? 502}.`; + if (!response.headersSent) { + captureProxyError(capture, 502, message); + sendProxyError(response, 502, message); + } + capture.fail(message, response.statusCode || 502); + resolve(); + return; + } + + if (head.length > 0) { + socket.unshift(head); + } + + const tunnelAgent = createHttpsTunnelAgent(socket, upstreamUrl.hostname); + const upstreamRequest = https.request( + { + agent: tunnelAgent, + headers: createForwardHeaders(request.headers, upstreamUrl, routedToGateway, config, { pluginRoute, targetUrl }), + hostname: upstreamUrl.hostname, + method: request.method, + path: `${upstreamUrl.pathname}${upstreamUrl.search}`, + port: targetPort, + protocol: "https:", + servername: upstreamUrl.hostname + }, + (upstreamResponse) => { + const statusCode = upstreamResponse.statusCode ?? 502; + const responseHeaders = filterResponseHeaders(upstreamResponse.headers); + capture.setResponse(statusCode, responseHeaders); + response.writeHead(statusCode, responseHeaders); + upstreamResponse.on("data", capture.appendResponseBody); + upstreamResponse.pipe(response); + upstreamResponse.once("end", () => { + capture.complete(); + tunnelAgent.destroy(); + resolve(); + }); + upstreamResponse.once("error", (error) => { + if (!response.headersSent) { + const message = formatError(error); + captureProxyError(capture, 502, message); + sendProxyError(response, 502, message); + } else { + response.destroy(error); + } + capture.fail(formatError(error), response.statusCode || statusCode); + tunnelAgent.destroy(); + resolve(); + }); + } + ); + + upstreamRequest.once("error", (error) => { + const message = + `Proxy ${mode} HTTPS request via upstream proxy ${formatUpstreamProxyServer(proxyServer)} ` + + `to ${upstreamUrl.toString()} failed: ${formatError(error)}`; + if (!response.headersSent) { + captureProxyError(capture, 502, message); + sendProxyError(response, 502, message); + } else { + response.destroy(error); + } + capture.fail(message, response.statusCode || 502); + tunnelAgent.destroy(); + resolve(); + }); + setClientRequestTimeout( + upstreamRequest, + upstreamRequestIdleTimeoutMs, + `Proxy ${mode} HTTPS request via upstream proxy ${formatUpstreamProxyServer(proxyServer)} to ${upstreamUrl.toString()} timed out.` + ); + pipeCapturedRequestBody(request, upstreamRequest, capture); + }); + + connectRequest.once("error", (error) => { + const message = `Upstream proxy ${formatUpstreamProxyServer(proxyServer)} connection to ${upstreamUrl.hostname}:${targetPort} failed: ${formatError(error)}`; + if (!response.headersSent) { + captureProxyError(capture, 502, message); + sendProxyError(response, 502, message); + } else { + response.destroy(error); + } + capture.fail(message, response.statusCode || 502); + resolve(); + }); + setClientRequestTimeout( + connectRequest, + upstreamProxyConnectTimeoutMs, + `Upstream proxy ${formatUpstreamProxyServer(proxyServer)} CONNECT ${upstreamUrl.hostname}:${targetPort} timed out.` + ); + connectRequest.end(); + }); +} + +function pipeCapturedRequestBody(request: IncomingMessage, upstreamRequest: ClientRequest, capture: ActiveProxyNetworkCapture): void { + const requestBody = new PassThrough(); + requestBody.on("data", capture.appendRequestBody); + requestBody.once("error", (error) => { + capture.fail(`Request body capture failed: ${formatError(error)}`); + upstreamRequest.destroy(error); + }); + request.pipe(requestBody).pipe(upstreamRequest); +} + +function setClientRequestTimeout(request: ClientRequest, timeoutMs: number, message: string): void { + request.setTimeout(timeoutMs, () => { + request.destroy(new Error(message)); + }); +} + +function createForwardHeaders( + headers: IncomingHttpHeaders, + upstreamUrl: URL, + routedToGateway: boolean, + config: AppConfig, + route?: { + pluginRoute?: GatewayPluginProxyRouteMatch; + targetUrl?: URL; + } +): Record { + const forwarded: Record = {}; + for (const [key, value] of Object.entries(headers)) { + const normalized = key.toLowerCase(); + if (requestHopByHopHeaders.has(normalized) || value === undefined) { + continue; + } + forwarded[normalized] = Array.isArray(value) ? value.join(",") : String(value); + } + + const pluginRoute = route?.pluginRoute; + if (pluginRoute) { + forwarded.host = pluginRoute.preserveHost ? (route.targetUrl?.host ?? readHeader(headers.host) ?? upstreamUrl.host) : upstreamUrl.host; + forwarded["x-ccr-proxy-mode"] = "plugin"; + forwarded["x-ccr-plugin-id"] = pluginRoute.pluginId; + forwarded["x-ccr-plugin-route-id"] = pluginRoute.id; + forwarded["x-ccr-original-host"] = readHeader(headers.host) ?? ""; + forwarded["x-ccr-original-url"] = pluginRoute.targetUrl.toString(); + for (const [key, value] of Object.entries(pluginRoute.headers ?? {})) { + forwarded[key.toLowerCase()] = value; + } + } else if (routedToGateway) { + forwarded.host = upstreamUrl.host; + forwarded["x-ccr-proxy-mode"] = "gateway"; + forwarded["x-ccr-original-host"] = readHeader(headers.host) ?? ""; + delete forwarded.authorization; + delete forwarded["x-api-key"]; + const apiKey = primaryApiKey(config); + if (apiKey) { + forwarded.authorization = `Bearer ${apiKey}`; + forwarded["x-api-key"] = apiKey; + } + } else { + forwarded.host = upstreamUrl.host; + forwarded["x-ccr-proxy-mode"] = "transparent"; + } + return forwarded; +} + +function primaryApiKey(config: AppConfig): string | undefined { + const values = [ + ...(Array.isArray(config.APIKEYS) ? config.APIKEYS.map((item) => item.key) : []), + config.APIKEY + ]; + return values.map((value) => value?.trim()).find(Boolean); +} + +function filterResponseHeaders(headers: IncomingHttpHeaders): Record { + const filtered: Record = {}; + for (const [key, value] of Object.entries(headers)) { + if (!responseHopByHopHeaders.has(key.toLowerCase()) && value !== undefined) { + filtered[key] = Array.isArray(value) ? value.map(String) : String(value); + } + } + return filtered; +} + +function shouldRouteToGateway(config: AppConfig, url: URL): boolean { + if (config.proxy.mode !== "gateway") { + return false; + } + return config.proxy.targets.some((target) => matchesTarget(target, url)); +} + +function isCursorAgentProxyRequest(url: URL): boolean { + return ( + /^\/(?:aiserver|agent)\.v\d+\.[^/]+\/[^/]+$/i.test(url.pathname) && + /(?:agent|chat|composer|completion|complete|edit|generate|inline|intent|prompt|stream|terminal|tool)/i.test(url.pathname) && + /(^|\.)cursor(?:\.sh|\.com|api\.com)$/i.test(url.hostname) + ); +} + +function matchesTarget(target: ProxyRouteTarget, url: URL): boolean { + if (!matchesHost(target.host, url.hostname)) { + return false; + } + if (!target.paths?.length) { + return true; + } + return target.paths.some((pathPrefix) => { + const prefix = pathPrefix.startsWith("/") ? pathPrefix : `/${pathPrefix}`; + return url.pathname === prefix || url.pathname.startsWith(`${prefix}/`); + }); +} + +function matchesHost(pattern: string, hostname: string): boolean { + const normalizedPattern = pattern.toLowerCase(); + const normalizedHost = hostname.toLowerCase(); + if (normalizedPattern === normalizedHost) { + return true; + } + if (normalizedPattern.startsWith("*.")) { + const suffix = normalizedPattern.slice(1); + return normalizedHost.endsWith(suffix) && normalizedHost !== suffix.slice(1); + } + if (normalizedPattern.startsWith(".")) { + return normalizedHost.endsWith(normalizedPattern); + } + return false; +} + +function buildGatewayUrl(config: AppConfig, targetUrl: URL): URL { + const gatewayHost = config.gateway.host === "0.0.0.0" ? "127.0.0.1" : config.gateway.host; + return new URL(`${targetUrl.pathname}${targetUrl.search}`, `http://${gatewayHost}:${config.gateway.port}`); +} + +function resolveRequestUrl(request: IncomingMessage, defaultProtocol: "http:" | "https:"): URL { + const rawUrl = request.url || "/"; + if (/^https?:\/\//i.test(rawUrl)) { + return new URL(rawUrl); + } + + const host = readHeader(request.headers.host); + if (!host) { + throw new Error("Proxy request is missing Host header."); + } + return new URL(`${defaultProtocol}//${host}${rawUrl.startsWith("/") ? rawUrl : `/${rawUrl}`}`); +} + +function parseConnectTarget(value: string | undefined): { hostname: string; port: number } { + if (!value) { + throw new Error("CONNECT target is missing."); + } + const parsed = new URL(`http://${value}`); + return { + hostname: parsed.hostname, + port: parsed.port ? Number(parsed.port) : 443 + }; +} + +function proxyEndpoint(config: AppConfig): string { + const host = config.proxy.host === "0.0.0.0" ? "127.0.0.1" : config.proxy.host; + return `http://${host}:${config.proxy.port}`; +} + +function sharedProxyEndpoint(config: AppConfig): string { + const host = config.gateway.host === "0.0.0.0" ? "127.0.0.1" : config.gateway.host; + return `http://${host}:${config.gateway.port}`; +} + +function createProxyStatus(config: AppConfig, endpoint: string, port: number): ProxyStatus { + const targetHosts = [ + ...config.proxy.targets.map((target) => target.host), + ...pluginService.getProxyRouteHosts() + ]; + return { + caCertFile: proxyCaCertFile(), + endpoint, + mode: config.proxy.mode, + port, + state: config.proxy.enabled ? "starting" : "stopped", + systemProxy: systemProxyManager.getStatus(), + targetHosts: [...new Set(targetHosts)] + }; +} + +function isAbsoluteProxyUrl(value: string | undefined): boolean { + return /^https?:\/\//i.test(value || ""); +} + +function cloneUpstreamProxy(upstreamProxy: UpstreamProxyConfig | undefined): UpstreamProxyConfig | undefined { + if (!upstreamProxy?.http && !upstreamProxy?.https) { + return undefined; + } + return { + http: upstreamProxy.http ? { ...upstreamProxy.http } : undefined, + https: upstreamProxy.https ? { ...upstreamProxy.https } : undefined + }; +} + +function selectUpstreamProxy(upstreamProxy: UpstreamProxyConfig | undefined, protocol: "http" | "https"): UpstreamProxyServer | undefined { + if (protocol === "https") { + return upstreamProxy?.https ?? upstreamProxy?.http; + } + return upstreamProxy?.http ?? upstreamProxy?.https; +} + +function selectUpstreamProxyForUrl(upstreamProxy: UpstreamProxyConfig | undefined, upstreamUrl: URL): UpstreamProxyServer | undefined { + if (shouldBypassUpstreamProxy(upstreamUrl)) { + return undefined; + } + + if (upstreamUrl.protocol === "https:") { + return selectUpstreamProxy(upstreamProxy, "https"); + } + if (upstreamUrl.protocol === "http:") { + return selectUpstreamProxy(upstreamProxy, "http"); + } + return undefined; +} + +function shouldBypassUpstreamProxy(url: URL): boolean { + const hostname = url.hostname.toLowerCase(); + return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1" || hostname.endsWith(".local"); +} + +function formatProxyHost(host: string): string { + return host.includes(":") && !host.startsWith("[") ? `[${host}]` : host; +} + +function formatUpstreamProxyServer(proxyServer: UpstreamProxyServer): string { + return `http://${formatProxyHost(proxyServer.host)}:${proxyServer.port}`; +} + +function createHttpsTunnelAgent(socket: Socket, servername: string): https.Agent { + const agent = new https.Agent({ + keepAlive: false, + maxCachedSessions: 0, + maxSockets: 1 + }); + agent.createConnection = () => tls.connect({ + ALPNProtocols: ["http/1.1"], + servername, + socket + }); + return agent; +} + +function listen(server: Server | https.Server, port: number, host: string): Promise { + return new Promise((resolve, reject) => { + server.once("error", reject); + server.listen(port, host, () => { + server.off("error", reject); + resolve(); + }); + }); +} + +function closeServer(server: Server | https.Server): Promise { + return new Promise((resolve) => { + let settled = false; + let timeout: NodeJS.Timeout | undefined; + const finish = () => { + if (settled) { + return; + } + settled = true; + if (timeout) { + clearTimeout(timeout); + } + resolve(); + }; + + try { + server.closeIdleConnections?.(); + timeout = setTimeout(() => { + server.closeAllConnections?.(); + finish(); + }, 800); + server.close(() => finish()); + } catch { + finish(); + } + }); +} + +function withTimeout(promise: Promise, timeoutMs: number, timeoutValue: T): Promise { + return new Promise((resolve) => { + const timeout = setTimeout(() => resolve(timeoutValue), timeoutMs); + promise + .then((value) => { + clearTimeout(timeout); + resolve(value); + }) + .catch(() => { + clearTimeout(timeout); + resolve(timeoutValue); + }); + }); +} + +function execFilePromise(file: string, args: string[]): Promise { + return new Promise((resolve, reject) => { + execFile(file, args, { windowsHide: process.platform === "win32" }, (error, stdout, stderr) => { + if (error) { + reject(new Error(stderr?.trim() || stdout?.trim() || error.message)); + return; + } + resolve(); + }); + }); +} + +function execFileText(file: string, args: string[]): Promise { + return new Promise((resolve, reject) => { + execFile(file, args, { maxBuffer: 8 * 1024 * 1024, windowsHide: process.platform === "win32" }, (error, stdout, stderr) => { + if (error) { + reject(new Error(stderr?.trim() || stdout?.trim() || error.message)); + return; + } + resolve(stdout); + }); + }); +} + +async function macosKeychainContainsCertificateFingerprint(fingerprint: string | undefined, keychainPath: string): Promise { + if (!fingerprint) { + return false; + } + + try { + const output = await execFileText("/usr/bin/security", ["find-certificate", "-a", "-Z", keychainPath]); + return normalizeFingerprint(output).includes(normalizeFingerprint(fingerprint)); + } catch { + return false; + } +} + +function normalizeFingerprint(value: string): string { + return value.replace(/[^a-fA-F0-9]/g, "").toUpperCase(); +} + +function macosSystemCertificateInstallScript(): string { + return [ + "set -e", + "/usr/bin/security delete-certificate -c 'Claude Code Router CA' /Library/Keychains/System.keychain >/dev/null 2>&1 || true", + `/usr/bin/security add-trusted-cert -d -r trustRoot -p ssl -k /Library/Keychains/System.keychain ${quoteShellArg(PROXY_CA_CERT_FILE)}` + ].join("; "); +} + +function macosManualCertificateInstallCommand(): string { + return [ + "sudo /usr/bin/security delete-certificate -c 'Claude Code Router CA' /Library/Keychains/System.keychain || true", + `sudo /usr/bin/security add-trusted-cert -d -r trustRoot -p ssl -k /Library/Keychains/System.keychain ${quoteShellArg(PROXY_CA_CERT_FILE)}` + ].join("\n"); +} + +function windowsManualCertificateInstallCommand(): string { + return `${quoteWindowsCmdArg(windowsSystemCommand("certutil.exe"))} -user -addstore Root ${quoteWindowsCmdArg(proxyCaCertInstallFile())}`; +} + +async function windowsCurrentUserRootContainsCertificateThumbprint(thumbprint: string | undefined): Promise { + const normalizedThumbprint = normalizeFingerprint(thumbprint || ""); + if (!normalizedThumbprint) { + return false; + } + + try { + const output = await execFileText(windowsSystemCommand("certutil.exe"), ["-user", "-store", "Root", normalizedThumbprint]); + return normalizeFingerprint(output).includes(normalizedThumbprint); + } catch { + const output = await execFileText(windowsSystemCommand("certutil.exe"), ["-user", "-store", "Root"]); + return normalizeFingerprint(output).includes(normalizedThumbprint); + } +} + +async function openMacosTerminalCertificateInstaller(): Promise { + const installerFile = path.join(os.tmpdir(), `ccr-install-proxy-ca-${randomUUID()}.command`); + writeFileSync(installerFile, `${macosTerminalCertificateInstallScript()}\n`, "utf8"); + chmodSync(installerFile, 0o700); + await execFilePromise("/usr/bin/open", [installerFile]); + return installerFile; +} + +async function revealFileWithSystemCommand(file: string): Promise { + if (process.platform === "darwin") { + await execFilePromise("/usr/bin/open", ["-R", file]); + return; + } + if (process.platform === "win32") { + await execFilePromise("explorer.exe", ["/select,", file]); + return; + } + await execFilePromise("xdg-open", [pathToFileURL(path.dirname(file)).toString()]); +} + +function macosTerminalCertificateInstallScript(): string { + return [ + "#!/bin/zsh", + "set -e", + "echo 'Installing CCR Proxy CA into the macOS System keychain.'", + "echo 'Terminal will ask for your macOS password if sudo is required.'", + "echo ''", + "sudo /usr/bin/security delete-certificate -c 'Claude Code Router CA' /Library/Keychains/System.keychain >/dev/null 2>&1 || true", + `sudo /usr/bin/security add-trusted-cert -d -r trustRoot -p ssl -k /Library/Keychains/System.keychain ${quoteShellArg(PROXY_CA_CERT_FILE)}`, + "echo ''", + "echo 'Done. Return to CCR, click Check Trust, then restart proxy mode and Chrome.'", + "printf 'Press Return to close this window...'", + "read reply" + ].join("\n"); +} + +function quoteAppleScriptString(value: string): string { + return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`; +} + +function quoteShellArg(value: string): string { + return `'${value.replace(/'/g, "'\\''")}'`; +} + +function quoteWindowsCmdArg(value: string): string { + return `"${value.replace(/"/g, '""')}"`; +} + +function readHeader(value: string | string[] | undefined): string | undefined { + if (Array.isArray(value)) { + return value[0]?.trim(); + } + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +class NetworkBodySampler { + private capturedBytes = 0; + private readonly chunks: Buffer[] = []; + sizeBytes = 0; + truncated = false; + + constructor(private readonly maxBytes: number) {} + + append(chunk: Buffer | string): void { + const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); + this.sizeBytes += buffer.length; + const remaining = this.maxBytes - this.capturedBytes; + if (remaining <= 0) { + this.truncated = true; + return; + } + + const captured = buffer.length > remaining ? buffer.subarray(0, remaining) : buffer; + this.chunks.push(captured); + this.capturedBytes += captured.length; + if (captured.length < buffer.length) { + this.truncated = true; + } + } + + read(): Buffer { + return Buffer.concat(this.chunks, this.capturedBytes); + } +} + +function toProxyNetworkExchange(record: ProxyNetworkCaptureRecord): ProxyNetworkExchange { + return { + client: record.client, + completedAt: record.completedAt, + durationMs: record.durationMs, + error: record.error, + host: record.host, + id: record.id, + method: record.method, + mode: record.mode, + path: record.path, + protocol: record.protocol, + requestBody: createCapturedBody(record.requestSampler, record.requestHeaders), + requestHeaders: { ...record.requestHeaders }, + responseBody: + record.responseHeaders || record.responseSampler.sizeBytes > 0 + ? createCapturedBody(record.responseSampler, record.responseHeaders ?? {}) + : undefined, + responseHeaders: record.responseHeaders ? { ...record.responseHeaders } : undefined, + routedToGateway: record.routedToGateway, + startedAt: record.startedAt, + state: record.state, + statusCode: record.statusCode, + upstreamUrl: record.upstreamUrl, + url: record.url + }; +} + +function inferProxyClient(headers: IncomingHttpHeaders): string { + const explicitClient = + readHeader(headers["x-ccr-client"]) ?? + readHeader(headers["x-client-name"]) ?? + readHeader(headers["x-forwarded-client-cert"]); + if (explicitClient) { + return explicitClient; + } + + const userAgent = readHeader(headers["user-agent"]); + if (!userAgent) { + return "System"; + } + + const normalized = userAgent.toLowerCase(); + if (normalized.includes("codex")) { + return "Codex (Service)"; + } + if (normalized.includes("@anthropic-ai/claude-code") || normalized.includes("claude-code") || normalized.includes("claude code")) { + return "Claude Code"; + } + if (normalized.includes("chrome")) { + return "Google Chrome"; + } + if (normalized.includes("safari") && !normalized.includes("chrome")) { + return "Safari"; + } + if (normalized.includes("firefox")) { + return "Firefox"; + } + if (normalized.includes("curl")) { + return "curl"; + } + if (normalized.includes("node") || normalized.includes("undici")) { + return "Node.js"; + } + return userAgent.split(/[/(]/)[0]?.trim() || "Client"; +} + +function cloneHeaders(headers: CapturedHeaders | IncomingHttpHeaders): CapturedHeaders { + const result: CapturedHeaders = {}; + for (const [key, value] of Object.entries(headers)) { + if (value === undefined) { + continue; + } + result[key.toLowerCase()] = Array.isArray(value) ? value.map(String) : String(value); + } + return result; +} + +function createCapturedBody(sampler: NetworkBodySampler, headers: CapturedHeaders): ProxyNetworkBody { + const raw = sampler.read(); + const contentType = readCapturedHeader(headers, "content-type"); + const contentEncoding = readCapturedHeader(headers, "content-encoding")?.toLowerCase(); + let body = raw; + let decodedFrom: string | undefined; + let error: string | undefined; + + if (raw.length > 0 && contentEncoding && contentEncoding !== "identity") { + if (sampler.truncated) { + error = `Body was truncated before ${contentEncoding} decoding.`; + } else { + try { + body = decodeBodyEncoding(raw, contentEncoding); + decodedFrom = contentEncoding; + } catch (decodeError) { + error = `Failed to decode ${contentEncoding}: ${formatError(decodeError)}`; + } + } + } + + const display = bodyToDisplayText(body, contentType); + return { + contentType, + decodedFrom, + encoding: display.encoding, + error, + sizeBytes: sampler.sizeBytes, + text: display.text, + truncated: sampler.truncated + }; +} + +function decodeBodyEncoding(body: Buffer, encoding: string): Buffer { + return encoding + .split(",") + .map((item) => item.trim().toLowerCase()) + .filter(Boolean) + .reverse() + .reduce((current, item) => decodeSingleBodyEncoding(current, item), body); +} + +function decodeSingleBodyEncoding(body: Buffer, encoding: string): Buffer { + if (encoding === "gzip" || encoding === "x-gzip") { + return gunzipSync(body); + } + if (encoding === "br") { + return brotliDecompressSync(body); + } + if (encoding === "deflate") { + try { + return inflateSync(body); + } catch { + return inflateRawSync(body); + } + } + return body; +} + +function bodyToDisplayText(body: Buffer, contentType: string | undefined): { encoding: "base64" | "utf8"; text: string } { + if (body.length === 0) { + return { encoding: "utf8", text: "" }; + } + + const text = body.toString("utf8"); + if (isTextContentType(contentType) || looksLikeText(text)) { + return { encoding: "utf8", text }; + } + + return { encoding: "base64", text: body.toString("base64") }; +} + +function isTextContentType(contentType: string | undefined): boolean { + if (!contentType) { + return false; + } + const normalized = contentType.toLowerCase(); + return ( + normalized.includes("json") || + normalized.includes("text/") || + normalized.includes("xml") || + normalized.includes("javascript") || + normalized.includes("x-www-form-urlencoded") || + normalized.includes("event-stream") + ); +} + +function looksLikeText(value: string): boolean { + if (!value) { + return true; + } + + let suspicious = 0; + for (let index = 0; index < value.length; index += 1) { + const code = value.charCodeAt(index); + if (code === 0xfffd || (code < 32 && code !== 9 && code !== 10 && code !== 13)) { + suspicious += 1; + } + } + return suspicious / value.length < 0.08; +} + +function readCapturedHeader(headers: CapturedHeaders, name: string): string | undefined { + const value = headers[name.toLowerCase()]; + if (Array.isArray(value)) { + return value[0]?.trim(); + } + return value?.trim() || undefined; +} + +function captureProxyError(capture: ActiveProxyNetworkCapture, statusCode: number, message: string): void { + const body = proxyErrorBody(message); + capture.setResponse(statusCode, { "content-type": "application/json" }); + capture.appendResponseBody(Buffer.from(body, "utf8")); + capture.fail(message, statusCode); +} + +function proxyErrorBody(message: string): string { + return `${JSON.stringify({ error: { message } })}\n`; +} + +function sendProxyError(response: ServerResponse, statusCode: number, message: string): void { + response.writeHead(statusCode, { "content-type": "application/json" }); + response.end(proxyErrorBody(message)); +} + +function closeConnectSocket(socket: Socket, statusCode: number, message: string): void { + if (socket.destroyed) { + return; + } + const body = `${message}\n`; + socket.end( + `HTTP/1.1 ${statusCode} ${http.STATUS_CODES[statusCode] ?? "Proxy Error"}\r\n` + + "Content-Type: text/plain; charset=utf-8\r\n" + + `Content-Length: ${Buffer.byteLength(body)}\r\n` + + "Connection: close\r\n" + + `\r\n${body}` + ); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + +function handleConnectError(request: IncomingMessage, socket: Socket, error: unknown): void { + const message = formatError(error); + console.warn(`[proxy] CONNECT ${request.url || ""} failed: ${message}`); + closeConnectSocket(socket, 502, message); +} diff --git a/packages/core/src/proxy/system-proxy-fetch.ts b/packages/core/src/proxy/system-proxy-fetch.ts new file mode 100644 index 0000000..f1e10bc --- /dev/null +++ b/packages/core/src/proxy/system-proxy-fetch.ts @@ -0,0 +1,267 @@ +import { ProxyAgent, type Dispatcher } from "undici"; +import { loadAppConfig } from "@ccr/core/config/config"; +import { readCurrentSystemUpstreamProxy, systemProxyManager, type UpstreamProxyConfig, type UpstreamProxyServer } from "@ccr/core/proxy/system-proxy"; +import type { AppConfig } from "@ccr/core/contracts/app"; + +type FetchInitWithDispatcher = RequestInit & { + dispatcher?: Dispatcher; +}; + +type SystemProxyCache = { + expiresAt: number; + managedEndpointUrl: string; + upstreamProxy?: UpstreamProxyConfig; +}; + +const proxyRefreshIntervalMs = 30 * 1000; +const fallbackManagedEndpointUrl = "http://127.0.0.1:65535"; + +const proxyDispatchers = new Map(); + +let systemProxyCache: SystemProxyCache | undefined; +let systemProxyReadPromise: Promise | undefined; + +export async function fetchWithSystemProxy(input: RequestInfo | URL, init?: RequestInit): Promise { + const url = requestUrl(input); + if (!url || !isHttpUrl(url) || shouldBypassProxy(url)) { + return fetch(input, init); + } + + const proxyUrl = await systemProxyUrlForRequest(url); + if (!proxyUrl) { + return fetch(input, init); + } + + return fetch(input, { + ...init, + dispatcher: proxyDispatcher(proxyUrl) + } as FetchInitWithDispatcher); +} + +export function readEnvProxyUrl(): string | undefined { + const envProxy = process.env.HTTPS_PROXY || process.env.https_proxy || + process.env.HTTP_PROXY || process.env.http_proxy; + return envProxy ? envProxy.trim() : undefined; +} + +export async function getSystemProxyUrlForProtocol(protocol: "http" | "https" = "https"): Promise { + const cache = await readSystemProxy(); + const server = proxyServerForRequest(cache.upstreamProxy, protocol); + if (server) return formatProxyUrl(server); + + return readEnvProxyUrl(); +} + +async function systemProxyUrlForRequest(url: URL): Promise { + const cache = await readSystemProxy(); + const server = proxyServerForRequest(cache.upstreamProxy, url.protocol === "https:" ? "https" : "http"); + if (server) return formatProxyUrl(server); + + return readEnvProxyUrl(); +} + +async function readSystemProxy(): Promise { + const now = Date.now(); + const activeManagedEndpointUrl = systemProxyManager.getManagedEndpointUrl(); + if ( + systemProxyCache && + systemProxyCache.expiresAt > now && + (!activeManagedEndpointUrl || systemProxyCache.managedEndpointUrl === activeManagedEndpointUrl) + ) { + return systemProxyCache; + } + if (systemProxyReadPromise) { + return systemProxyReadPromise; + } + + systemProxyReadPromise = readSystemProxyUncached() + .then((cache) => { + systemProxyCache = { + ...cache, + expiresAt: Date.now() + proxyRefreshIntervalMs + }; + return systemProxyCache; + }) + .finally(() => { + systemProxyReadPromise = undefined; + }); + + return systemProxyReadPromise; +} + +async function readSystemProxyUncached(): Promise> { + const { managedEndpointUrl, systemProxyActive } = await readManagedProxyEndpoint(); + if (systemProxyActive) { + const managedUpstreamProxy = systemProxyManager.getUpstreamProxy(); + if (managedUpstreamProxy) { + return { + managedEndpointUrl, + upstreamProxy: managedUpstreamProxy + }; + } + } + + try { + return { + managedEndpointUrl, + upstreamProxy: await readCurrentSystemUpstreamProxy(managedEndpointUrl) + }; + } catch (error) { + console.warn(`[network] Failed to read system proxy: ${formatError(error)}`); + return { managedEndpointUrl }; + } +} + +async function readManagedProxyEndpoint(): Promise<{ managedEndpointUrl: string; systemProxyActive: boolean }> { + const activeManagedEndpointUrl = systemProxyManager.getManagedEndpointUrl(); + if (activeManagedEndpointUrl) { + return { + managedEndpointUrl: activeManagedEndpointUrl, + systemProxyActive: true + }; + } + + try { + const config = await loadAppConfig(); + return { + managedEndpointUrl: managedProxyEndpointUrl(config), + systemProxyActive: config.proxy.enabled && config.proxy.systemProxy + }; + } catch (error) { + console.warn(`[network] Failed to read proxy config: ${formatError(error)}`); + } + return { + managedEndpointUrl: fallbackManagedEndpointUrl, + systemProxyActive: false + }; +} + +function managedProxyEndpointUrl(config: AppConfig): string { + const host = normalizeManagedProxyHost(config.gateway.host); + return `http://${formatProxyHost(host)}:${config.gateway.port}`; +} + +function normalizeManagedProxyHost(host: string): string { + const normalized = host.trim(); + if (!normalized || normalized === "0.0.0.0" || normalized === "::" || normalized === "[::]") { + return "127.0.0.1"; + } + return normalized; +} + +function proxyServerForRequest(upstreamProxy: UpstreamProxyConfig | undefined, protocol: "http" | "https"): UpstreamProxyServer | undefined { + if (!upstreamProxy) { + return undefined; + } + if (protocol === "https") { + return upstreamProxy.https ?? upstreamProxy.http; + } + return upstreamProxy.http ?? upstreamProxy.https; +} + +function proxyDispatcher(proxyUrl: string): Dispatcher { + const existing = proxyDispatchers.get(proxyUrl); + if (existing) { + return existing; + } + const dispatcher = new ProxyAgent(proxyUrl); + proxyDispatchers.set(proxyUrl, dispatcher); + return dispatcher; +} + +function formatProxyUrl(server: UpstreamProxyServer): string { + return `${server.protocol}://${formatProxyHost(server.host)}:${server.port}`; +} + +function formatProxyHost(host: string): string { + return host.includes(":") && !host.startsWith("[") ? `[${host}]` : host; +} + +function requestUrl(input: RequestInfo | URL): URL | undefined { + try { + if (input instanceof URL) { + return input; + } + if (typeof input === "string") { + return new URL(input); + } + return new URL(input.url); + } catch { + return undefined; + } +} + +function isHttpUrl(url: URL): boolean { + return url.protocol === "http:" || url.protocol === "https:"; +} + +function shouldBypassProxy(url: URL): boolean { + const hostname = normalizeHostname(url.hostname); + if (hostname === "localhost" || + hostname === "127.0.0.1" || + hostname.startsWith("127.") || + hostname === "0.0.0.0" || + hostname === "::1" || + hostname === "0:0:0:0:0:0:0:1") { + return true; + } + + const noProxy = process.env.NO_PROXY || process.env.no_proxy; + if (!noProxy) return false; + + const patterns = noProxy.split(",").map((s) => s.trim()).filter(Boolean); + for (const pattern of patterns) { + if (pattern === "*") return true; + + if (pattern.startsWith(".")) { + if (hostname.endsWith(pattern.toLowerCase()) || hostname === pattern.slice(1).toLowerCase()) return true; + continue; + } + + if (pattern.includes("/") && isPlainIp(hostname)) { + if (isInCidr(hostname, pattern)) return true; + continue; + } + + if (hostname === pattern.toLowerCase()) return true; + } + + return false; +} + +function isPlainIp(s: string): boolean { + return /^\d+\.\d+\.\d+\.\d+$/.test(s); +} + +function isInCidr(ip: string, cidr: string): boolean { + const [network, prefixStr] = cidr.split("/"); + const prefix = parseInt(prefixStr, 10); + if (isNaN(prefix) || prefix < 0 || prefix > 32) return false; + + const ipInt = ipToInt(ip); + const netInt = ipToInt(network); + if (ipInt === null || netInt === null) return false; + + const mask = prefix === 0 ? 0 : (~0 << (32 - prefix)) >>> 0; + return (ipInt & mask) === (netInt & mask); +} + +function ipToInt(ip: string): number | null { + const parts = ip.split("."); + if (parts.length !== 4) return null; + let result = 0; + for (const part of parts) { + const num = parseInt(part, 10); + if (isNaN(num) || num < 0 || num > 255) return null; + result = (result << 8) | num; + } + return result >>> 0; +} + +function normalizeHostname(hostname: string): string { + return hostname.trim().toLowerCase().replace(/^\[(.*)]$/, "$1").replace(/\.$/, ""); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/core/src/proxy/system-proxy.ts b/packages/core/src/proxy/system-proxy.ts new file mode 100644 index 0000000..c17f7e8 --- /dev/null +++ b/packages/core/src/proxy/system-proxy.ts @@ -0,0 +1,973 @@ +import { execFile } from "node:child_process"; +import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import path from "node:path"; +import type { ProxySystemStatus } from "@ccr/core/contracts/app"; +import { DATADIR } from "@ccr/core/config/constants"; +import { windowsSystemCommand } from "@ccr/core/platform/windows-system"; + +export type UpstreamProxyServer = { + host: string; + port: number; + protocol: "http"; +}; + +export type UpstreamProxyConfig = { + http?: UpstreamProxyServer; + https?: UpstreamProxyServer; +}; + +type MacProxySettings = { + authenticated: boolean; + enabled: boolean; + port: number; + server: string; +}; + +type MacNetworkServiceSnapshot = { + name: string; + secureWeb: MacProxySettings; + socks?: MacProxySettings; + web: MacProxySettings; +}; + +type MacSystemProxySnapshot = { + createdAt: string; + managedEndpoint: string; + platform: "darwin"; + services: MacNetworkServiceSnapshot[]; + version: 1; +}; + +type WindowsProxySettings = { + autoConfigUrl?: string; + autoDetect?: number; + hadAutoConfigUrl: boolean; + hadAutoDetect: boolean; + hadProxyEnable: boolean; + hadProxyOverride: boolean; + hadProxyServer: boolean; + proxyEnable?: number; + proxyOverride?: string; + proxyServer?: string; + winHttp?: WindowsWinHttpProxySettings; +}; + +type WindowsWinHttpProxySettings = { + bypassList?: string; + direct: boolean; + proxyServer?: string; + raw: string; +}; + +type WindowsSystemProxySnapshot = { + createdAt: string; + managedEndpoint: string; + platform: "win32"; + settings: WindowsProxySettings; + version: 1; +}; + +type SystemProxySnapshot = MacSystemProxySnapshot | WindowsSystemProxySnapshot; + +type NetworkService = { + disabled: boolean; + name: string; +}; + +type ManagedProxyEndpoint = { + host: string; + port: number; + url: string; +}; + +type WindowsRegistryValue = { + type: string; + value: string; +}; + +const networkSetup = "/usr/sbin/networksetup"; +const windowsInternetSettingsKey = "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"; +const systemProxySnapshotFile = path.join(DATADIR, "system-proxy-snapshot.json"); + +class SystemProxyManager { + private snapshot?: SystemProxySnapshot; + private status: ProxySystemStatus = { + state: process.platform === "darwin" || process.platform === "win32" ? "inactive" : "unsupported" + }; + private upstreamProxy?: UpstreamProxyConfig; + + async enable(endpoint: string): Promise<{ status: ProxySystemStatus; upstreamProxy?: UpstreamProxyConfig }> { + this.upstreamProxy = undefined; + + if (process.platform !== "darwin" && process.platform !== "win32") { + this.status = { + lastError: "Automatic system proxy switching is only implemented for macOS and Windows.", + state: "unsupported" + }; + return this.current(); + } + + try { + const managedEndpoint = parseManagedEndpoint(endpoint); + await this.restorePersistedSnapshotIfCurrentProxyIsManaged(); + const snapshot = process.platform === "win32" + ? await captureWindowsSystemProxySnapshot(managedEndpoint) + : await captureMacSystemProxySnapshot(managedEndpoint); + const upstreamProxy = readSnapshotUpstreamProxy(snapshot, managedEndpoint); + + this.snapshot = snapshot; + this.upstreamProxy = upstreamProxy; + persistSnapshot(snapshot); + await applySystemProxy(snapshot, managedEndpoint); + + this.status = { + state: "active", + upstream: formatUpstreamProxy(upstreamProxy) + }; + return this.current(); + } catch (error) { + const restoreError = await this.restoreSnapshotAfterEnableFailure(); + this.status = { + lastError: [formatError(error), restoreError].filter(Boolean).join(" "), + state: "error" + }; + return this.current(); + } + } + + async restore(): Promise { + this.upstreamProxy = undefined; + + if (process.platform !== "darwin" && process.platform !== "win32") { + this.snapshot = undefined; + this.status = { + lastError: "Automatic system proxy switching is only implemented for macOS and Windows.", + state: "unsupported" + }; + return this.getStatus(); + } + + const activeSnapshot = this.snapshot; + const snapshot = activeSnapshot ?? readPersistedSnapshot(); + this.snapshot = undefined; + if (!snapshot) { + this.status = { state: "inactive" }; + return this.getStatus(); + } + if (!activeSnapshot && snapshot.platform !== process.platform) { + removePersistedSnapshot(); + this.status = { state: "inactive" }; + return this.getStatus(); + } + + try { + const shouldRestore = Boolean(activeSnapshot) || (await currentProxyUsesManagedEndpoint(snapshot)); + if (shouldRestore) { + await restoreSystemProxy(snapshot); + } + removePersistedSnapshot(); + this.status = { + state: shouldRestore ? "restored" : "inactive", + upstream: formatUpstreamProxy(readSnapshotUpstreamProxy(snapshot, parseManagedEndpoint(snapshot.managedEndpoint))) + }; + return this.getStatus(); + } catch (error) { + this.status = { + lastError: formatError(error), + state: "error" + }; + return this.getStatus(); + } + } + + getStatus(): ProxySystemStatus { + return { ...this.status }; + } + + getManagedEndpointUrl(): string | undefined { + return this.status.state === "active" ? this.snapshot?.managedEndpoint : undefined; + } + + getUpstreamProxy(): UpstreamProxyConfig | undefined { + if (!this.upstreamProxy) { + return undefined; + } + return { + http: this.upstreamProxy.http ? { ...this.upstreamProxy.http } : undefined, + https: this.upstreamProxy.https ? { ...this.upstreamProxy.https } : undefined + }; + } + + private current(): { status: ProxySystemStatus; upstreamProxy?: UpstreamProxyConfig } { + return { + status: this.getStatus(), + upstreamProxy: this.getUpstreamProxy() + }; + } + + private async restorePersistedSnapshotIfCurrentProxyIsManaged(): Promise { + const snapshot = readPersistedSnapshot(); + if (!snapshot) { + return; + } + + if (snapshot.platform !== process.platform) { + removePersistedSnapshot(); + return; + } + + if (await currentProxyUsesManagedEndpoint(snapshot)) { + await restoreSystemProxy(snapshot); + } + removePersistedSnapshot(); + } + + private async restoreSnapshotAfterEnableFailure(): Promise { + const snapshot = this.snapshot; + this.snapshot = undefined; + this.upstreamProxy = undefined; + if (!snapshot) { + return undefined; + } + + try { + await restoreSystemProxy(snapshot); + removePersistedSnapshot(); + return undefined; + } catch (error) { + return `Failed to restore the previous system proxy: ${formatError(error)}`; + } + } +} + +export const systemProxyManager = new SystemProxyManager(); + +export function formatUpstreamProxy(upstreamProxy: UpstreamProxyConfig | undefined): string | undefined { + if (!upstreamProxy?.http && !upstreamProxy?.https) { + return undefined; + } + + if (upstreamProxy.http && sameProxyServer(upstreamProxy.http, upstreamProxy.https)) { + return `HTTP/HTTPS ${formatProxyServer(upstreamProxy.http)}`; + } + + const values: string[] = []; + if (upstreamProxy.http) { + values.push(`HTTP ${formatProxyServer(upstreamProxy.http)}`); + } + if (upstreamProxy.https && !sameProxyServer(upstreamProxy.http, upstreamProxy.https)) { + values.push(`HTTPS ${formatProxyServer(upstreamProxy.https)}`); + } + return values.join(", "); +} + +export async function readCurrentSystemUpstreamProxy(managedEndpointUrl: string): Promise { + if (process.platform !== "darwin" && process.platform !== "win32") { + return undefined; + } + + const managedEndpoint = parseManagedEndpoint(managedEndpointUrl); + const snapshot = process.platform === "win32" + ? await captureWindowsSystemProxySnapshot(managedEndpoint) + : await captureMacSystemProxySnapshot(managedEndpoint); + return readSnapshotUpstreamProxy(snapshot, managedEndpoint); +} + +function parseManagedEndpoint(endpoint: string): ManagedProxyEndpoint { + const parsed = new URL(endpoint); + const port = Number(parsed.port || (parsed.protocol === "https:" ? 443 : 80)); + if (!parsed.hostname || !Number.isInteger(port) || port < 1 || port > 65535) { + throw new Error(`Invalid proxy endpoint: ${endpoint}`); + } + return { + host: parsed.hostname, + port, + url: `http://${formatProxyHost(parsed.hostname)}:${port}` + }; +} + +async function captureMacSystemProxySnapshot(managedEndpoint: ManagedProxyEndpoint): Promise { + const services = await listNetworkServices(); + const snapshots: MacNetworkServiceSnapshot[] = []; + + for (const service of services) { + if (service.disabled) { + continue; + } + + snapshots.push({ + name: service.name, + secureWeb: await readMacProxySettings("-getsecurewebproxy", service.name), + socks: await readMacProxySettings("-getsocksfirewallproxy", service.name), + web: await readMacProxySettings("-getwebproxy", service.name) + }); + } + + return { + createdAt: new Date().toISOString(), + managedEndpoint: managedEndpoint.url, + platform: "darwin", + services: snapshots, + version: 1 + }; +} + +async function captureWindowsSystemProxySnapshot(managedEndpoint: ManagedProxyEndpoint): Promise { + return { + createdAt: new Date().toISOString(), + managedEndpoint: managedEndpoint.url, + platform: "win32", + settings: await readWindowsProxySettings(), + version: 1 + }; +} + +async function listNetworkServices(): Promise { + const output = await runNetworkSetup(["-listallnetworkservices"]); + return output + .split(/\r?\n/) + .map((line) => line.trim()) + .filter((line) => line && !line.toLowerCase().startsWith("an asterisk")) + .map((line) => ({ + disabled: line.startsWith("*"), + name: line.startsWith("*") ? line.slice(1).trim() : line + })) + .filter((service) => service.name.length > 0); +} + +async function readMacProxySettings( + command: "-getsecurewebproxy" | "-getsocksfirewallproxy" | "-getwebproxy", + serviceName: string +): Promise { + const output = await runNetworkSetup([command, serviceName]); + const enabled = readSetting(output, "Enabled").toLowerCase(); + const server = readSetting(output, "Server"); + const port = Number(readSetting(output, "Port")); + const authenticated = readSetting(output, "Authenticated Proxy Enabled").toLowerCase(); + return { + authenticated: authenticated === "1" || authenticated === "yes" || authenticated === "true", + enabled: enabled === "yes" || enabled === "1" || enabled === "true", + port: Number.isInteger(port) && port > 0 ? port : 0, + server + }; +} + +async function applyMacSystemProxy(snapshot: MacSystemProxySnapshot, managedEndpoint: ManagedProxyEndpoint): Promise { + for (const service of snapshot.services) { + await setMacProxySettings("-setwebproxy", "-setwebproxystate", service.name, { + authenticated: false, + enabled: true, + port: managedEndpoint.port, + server: managedEndpoint.host + }); + await setMacProxySettings("-setsecurewebproxy", "-setsecurewebproxystate", service.name, { + authenticated: false, + enabled: true, + port: managedEndpoint.port, + server: managedEndpoint.host + }); + if (service.socks?.enabled) { + await setMacProxySettings("-setsocksfirewallproxy", "-setsocksfirewallproxystate", service.name, { + ...service.socks, + enabled: false + }); + } + } +} + +async function restoreMacSystemProxy(snapshot: MacSystemProxySnapshot): Promise { + const managedEndpoint = parseManagedEndpoint(snapshot.managedEndpoint); + for (const service of snapshot.services) { + await setMacProxySettings("-setwebproxy", "-setwebproxystate", service.name, sanitizeMacProxySettingsForRestore(service.web, managedEndpoint)); + await setMacProxySettings( + "-setsecurewebproxy", + "-setsecurewebproxystate", + service.name, + sanitizeMacProxySettingsForRestore(service.secureWeb, managedEndpoint) + ); + if (service.socks) { + await setMacProxySettings("-setsocksfirewallproxy", "-setsocksfirewallproxystate", service.name, service.socks); + } + } +} + +async function applySystemProxy(snapshot: SystemProxySnapshot, managedEndpoint: ManagedProxyEndpoint): Promise { + if (snapshot.platform === "win32") { + await applyWindowsSystemProxy(snapshot, managedEndpoint); + return; + } + await applyMacSystemProxy(snapshot, managedEndpoint); +} + +async function restoreSystemProxy(snapshot: SystemProxySnapshot): Promise { + if (snapshot.platform === "win32") { + await restoreWindowsSystemProxy(snapshot); + return; + } + await restoreMacSystemProxy(snapshot); +} + +async function setMacProxySettings( + setCommand: "-setsecurewebproxy" | "-setsocksfirewallproxy" | "-setwebproxy", + stateCommand: "-setsecurewebproxystate" | "-setsocksfirewallproxystate" | "-setwebproxystate", + serviceName: string, + settings: MacProxySettings +): Promise { + if (settings.server && settings.port > 0) { + await runNetworkSetup([ + setCommand, + serviceName, + settings.server, + String(settings.port), + settings.authenticated ? "on" : "off", + "", + "" + ]); + } + await runNetworkSetup([stateCommand, serviceName, settings.enabled ? "on" : "off"]); +} + +async function readWindowsProxySettings(): Promise { + const autoConfigUrl = await queryWindowsRegistryValue("AutoConfigURL"); + const autoDetect = await queryWindowsRegistryValue("AutoDetect"); + const proxyEnable = await queryWindowsRegistryValue("ProxyEnable"); + const proxyServer = await queryWindowsRegistryValue("ProxyServer"); + const proxyOverride = await queryWindowsRegistryValue("ProxyOverride"); + const winHttp = await readWindowsWinHttpProxySettings(); + return { + autoConfigUrl: autoConfigUrl?.value, + autoDetect: autoDetect ? parseWindowsRegistryDword(autoDetect.value) : undefined, + hadAutoConfigUrl: Boolean(autoConfigUrl), + hadAutoDetect: Boolean(autoDetect), + hadProxyEnable: Boolean(proxyEnable), + hadProxyOverride: Boolean(proxyOverride), + hadProxyServer: Boolean(proxyServer), + proxyEnable: proxyEnable ? parseWindowsRegistryDword(proxyEnable.value) : undefined, + proxyOverride: proxyOverride?.value, + proxyServer: proxyServer?.value, + winHttp + }; +} + +async function applyWindowsSystemProxy(snapshot: WindowsSystemProxySnapshot, managedEndpoint: ManagedProxyEndpoint): Promise { + const proxyServer = `http=${formatProxyServer(managedEndpoint)};https=${formatProxyServer(managedEndpoint)}`; + await deleteWindowsRegistryValue("AutoConfigURL"); + await setWindowsRegistryDword("AutoDetect", 0); + await setWindowsRegistryDword("ProxyEnable", 1); + await setWindowsRegistryString("ProxyServer", proxyServer); + await setWindowsRegistryString("ProxyOverride", ""); + if (snapshot.settings.winHttp) { + await applyWindowsWinHttpProxy(managedEndpoint).catch((error) => { + console.warn(`[proxy] Failed to set Windows WinHTTP proxy: ${formatError(error)}`); + }); + } + await notifyWindowsSystemProxyChanged(); +} + +async function restoreWindowsSystemProxy(snapshot: WindowsSystemProxySnapshot): Promise { + const settings = snapshot.settings; + if (settings.hadProxyEnable && settings.proxyEnable !== undefined) { + await setWindowsRegistryDword("ProxyEnable", settings.proxyEnable); + } else { + await deleteWindowsRegistryValue("ProxyEnable"); + } + + if (settings.hadProxyServer && settings.proxyServer !== undefined) { + await setWindowsRegistryString("ProxyServer", settings.proxyServer); + } else { + await deleteWindowsRegistryValue("ProxyServer"); + } + + if (settings.hadProxyOverride && settings.proxyOverride !== undefined) { + await setWindowsRegistryString("ProxyOverride", settings.proxyOverride); + } else { + await deleteWindowsRegistryValue("ProxyOverride"); + } + + if (settings.hadAutoConfigUrl && settings.autoConfigUrl !== undefined) { + await setWindowsRegistryString("AutoConfigURL", settings.autoConfigUrl); + } else { + await deleteWindowsRegistryValue("AutoConfigURL"); + } + + if (settings.hadAutoDetect && settings.autoDetect !== undefined) { + await setWindowsRegistryDword("AutoDetect", settings.autoDetect); + } else { + await deleteWindowsRegistryValue("AutoDetect"); + } + + await restoreWindowsWinHttpProxy(settings.winHttp).catch((error) => { + console.warn(`[proxy] Failed to restore Windows WinHTTP proxy: ${formatError(error)}`); + }); + await notifyWindowsSystemProxyChanged(); +} + +function readSnapshotUpstreamProxy(snapshot: SystemProxySnapshot, managedEndpoint: ManagedProxyEndpoint): UpstreamProxyConfig | undefined { + if (snapshot.platform === "win32") { + return readWindowsUpstreamProxy(snapshot, managedEndpoint); + } + return readMacUpstreamProxy(snapshot, managedEndpoint); +} + +function readMacUpstreamProxy(snapshot: MacSystemProxySnapshot, managedEndpoint: ManagedProxyEndpoint): UpstreamProxyConfig | undefined { + const upstreamProxy: UpstreamProxyConfig = {}; + + for (const service of snapshot.services) { + if (!upstreamProxy.http && isUsableUpstreamProxy(service.web, managedEndpoint)) { + upstreamProxy.http = { + host: service.web.server, + port: service.web.port, + protocol: "http" + }; + } + if (!upstreamProxy.https && isUsableUpstreamProxy(service.secureWeb, managedEndpoint)) { + upstreamProxy.https = { + host: service.secureWeb.server, + port: service.secureWeb.port, + protocol: "http" + }; + } + if (upstreamProxy.http && upstreamProxy.https) { + break; + } + } + + if (!upstreamProxy.https && upstreamProxy.http) { + upstreamProxy.https = upstreamProxy.http; + } + if (!upstreamProxy.http && upstreamProxy.https) { + upstreamProxy.http = upstreamProxy.https; + } + + return upstreamProxy.http || upstreamProxy.https ? upstreamProxy : undefined; +} + +function readWindowsUpstreamProxy(snapshot: WindowsSystemProxySnapshot, managedEndpoint: ManagedProxyEndpoint): UpstreamProxyConfig | undefined { + if (snapshot.settings.proxyEnable === 1 && snapshot.settings.proxyServer) { + const winInetProxy = parseWindowsProxyServer(snapshot.settings.proxyServer, managedEndpoint); + if (winInetProxy) { + return winInetProxy; + } + } + return readWindowsWinHttpUpstreamProxy(snapshot.settings.winHttp, managedEndpoint); +} + +async function currentProxyUsesManagedEndpoint(snapshot: SystemProxySnapshot): Promise { + if (snapshot.platform === "win32") { + return currentWindowsProxyUsesManagedEndpoint(snapshot); + } + return currentMacProxyUsesManagedEndpoint(snapshot); +} + +async function currentMacProxyUsesManagedEndpoint(snapshot: MacSystemProxySnapshot): Promise { + const managedEndpoint = parseManagedEndpoint(snapshot.managedEndpoint); + for (const service of snapshot.services) { + const currentWeb = await readMacProxySettings("-getwebproxy", service.name).catch(() => undefined); + if (currentWeb && matchesManagedEndpoint(currentWeb, managedEndpoint)) { + return true; + } + + const currentSecureWeb = await readMacProxySettings("-getsecurewebproxy", service.name).catch(() => undefined); + if (currentSecureWeb && matchesManagedEndpoint(currentSecureWeb, managedEndpoint)) { + return true; + } + } + return false; +} + +async function currentWindowsProxyUsesManagedEndpoint(snapshot: WindowsSystemProxySnapshot): Promise { + const managedEndpoint = parseManagedEndpoint(snapshot.managedEndpoint); + const current = await readWindowsProxySettings(); + if (current.proxyEnable === 1 && current.proxyServer && windowsProxyServerUsesManagedEndpoint(current.proxyServer, managedEndpoint)) { + return true; + } + return windowsWinHttpProxyUsesManagedEndpoint(current.winHttp, managedEndpoint); +} + +function parseWindowsProxyServer(proxyServer: string, managedEndpoint: ManagedProxyEndpoint): UpstreamProxyConfig | undefined { + const parsed = parseWindowsProxyServerEntries(proxyServer); + const upstreamProxy: UpstreamProxyConfig = {}; + const httpProxy = parsed.http ?? parsed.default; + const httpsProxy = parsed.https ?? parsed.default ?? httpProxy; + + if (httpProxy && !sameProxyServer(httpProxy, managedEndpoint)) { + upstreamProxy.http = httpProxy; + } + if (httpsProxy && !sameProxyServer(httpsProxy, managedEndpoint)) { + upstreamProxy.https = httpsProxy; + } + + if (!upstreamProxy.https && upstreamProxy.http) { + upstreamProxy.https = upstreamProxy.http; + } + if (!upstreamProxy.http && upstreamProxy.https) { + upstreamProxy.http = upstreamProxy.https; + } + + return upstreamProxy.http || upstreamProxy.https ? upstreamProxy : undefined; +} + +function windowsProxyServerUsesManagedEndpoint(proxyServer: string, managedEndpoint: ManagedProxyEndpoint): boolean { + const entries = parseWindowsProxyServerEntries(proxyServer); + return [entries.default, entries.http, entries.https].some((entry) => sameProxyServer(entry, managedEndpoint)); +} + +function parseWindowsProxyServerEntries(proxyServer: string): { + default?: UpstreamProxyServer; + http?: UpstreamProxyServer; + https?: UpstreamProxyServer; +} { + const trimmed = proxyServer.trim(); + if (!trimmed) { + return {}; + } + + if (!trimmed.includes("=")) { + return { + default: parseProxyServerEndpoint(trimmed, "http") + }; + } + + const parsed: { + default?: UpstreamProxyServer; + http?: UpstreamProxyServer; + https?: UpstreamProxyServer; + } = {}; + for (const segment of trimmed.split(";")) { + const [rawKey, ...rawValueParts] = segment.split("="); + const key = rawKey.trim().toLowerCase(); + const value = rawValueParts.join("=").trim(); + const endpoint = parseProxyServerEndpoint(value, "http"); + if (!endpoint) { + continue; + } + if (key === "http") { + parsed.http = endpoint; + } else if (key === "https") { + parsed.https = endpoint; + } + } + return parsed; +} + +function parseProxyServerEndpoint(value: string, defaultProtocol: UpstreamProxyServer["protocol"]): UpstreamProxyServer | undefined { + let normalized = value.trim(); + if (!normalized) { + return undefined; + } + + if (/^socks(?:4|5)?:\/\//i.test(normalized)) { + return undefined; + } + const explicitProtocol = /^https?:\/\//i.test(normalized) ? "http" : undefined; + normalized = normalized.replace(/^[a-z][a-z0-9+.-]*:\/\//i, ""); + const parsed = safeParseProxyServerUrl(normalized); + if (!parsed?.hostname) { + return undefined; + } + + const port = Number(parsed.port || 80); + if (!Number.isInteger(port) || port < 1 || port > 65535) { + return undefined; + } + + return { + host: parsed.hostname, + port, + protocol: explicitProtocol ?? defaultProtocol + }; +} + +function safeParseProxyServerUrl(value: string): URL | undefined { + try { + return new URL(`http://${value}`); + } catch { + try { + return new URL(`http://${value.replace(/^\[?([^\]]+)\]?:(\d+)$/, "[$1]:$2")}`); + } catch { + return undefined; + } + } +} + +async function readWindowsWinHttpProxySettings(): Promise { + try { + return parseWindowsWinHttpProxySettings(await runCommand(windowsSystemCommand("netsh.exe"), ["winhttp", "show", "proxy"])); + } catch (error) { + console.warn(`[proxy] Failed to read Windows WinHTTP proxy: ${formatError(error)}`); + return undefined; + } +} + +function parseWindowsWinHttpProxySettings(output: string): WindowsWinHttpProxySettings { + const proxyServer = normalizeWindowsNetshValue(readWindowsNetshProxyLine(output, "Proxy Server")); + const bypassList = normalizeWindowsNetshValue(readWindowsNetshProxyLine(output, "Bypass List")); + const direct = /Direct access\s*\(no proxy server\)/i.test(output); + if (!direct && !proxyServer) { + throw new Error("Could not parse Windows WinHTTP proxy settings."); + } + return { + bypassList, + direct, + proxyServer, + raw: output + }; +} + +function readWindowsNetshProxyLine(output: string, label: "Bypass List" | "Proxy Server"): string | undefined { + const pattern = label === "Proxy Server" + ? /^\s*Proxy Server(?:\(s\))?\s*:\s*(.+?)\s*$/im + : /^\s*Bypass List\s*:\s*(.+?)\s*$/im; + return pattern.exec(output)?.[1]?.trim(); +} + +function normalizeWindowsNetshValue(value: string | undefined): string | undefined { + if (!value) { + return undefined; + } + const trimmed = value.trim(); + return !trimmed || /^\(none\)$/i.test(trimmed) ? undefined : trimmed; +} + +async function applyWindowsWinHttpProxy(managedEndpoint: ManagedProxyEndpoint): Promise { + const proxyServer = `http=${formatProxyServer(managedEndpoint)};https=${formatProxyServer(managedEndpoint)}`; + await runCommand(windowsSystemCommand("netsh.exe"), [ + "winhttp", + "set", + "proxy", + `proxy-server=${proxyServer}`, + "bypass-list=" + ]); +} + +async function restoreWindowsWinHttpProxy(settings: WindowsWinHttpProxySettings | undefined): Promise { + if (!settings) { + return; + } + if (settings.direct || !settings.proxyServer) { + await runCommand(windowsSystemCommand("netsh.exe"), ["winhttp", "reset", "proxy"]); + return; + } + await runCommand(windowsSystemCommand("netsh.exe"), [ + "winhttp", + "set", + "proxy", + `proxy-server=${settings.proxyServer}`, + ...(settings.bypassList ? [`bypass-list=${settings.bypassList}`] : []) + ]); +} + +function readWindowsWinHttpUpstreamProxy( + settings: WindowsWinHttpProxySettings | undefined, + managedEndpoint: ManagedProxyEndpoint +): UpstreamProxyConfig | undefined { + if (!settings || settings.direct || !settings.proxyServer) { + return undefined; + } + return parseWindowsProxyServer(settings.proxyServer, managedEndpoint); +} + +function windowsWinHttpProxyUsesManagedEndpoint( + settings: WindowsWinHttpProxySettings | undefined, + managedEndpoint: ManagedProxyEndpoint +): boolean { + return Boolean(settings && !settings.direct && settings.proxyServer && windowsProxyServerUsesManagedEndpoint(settings.proxyServer, managedEndpoint)); +} + +function isUsableUpstreamProxy(settings: MacProxySettings, managedEndpoint: ManagedProxyEndpoint): boolean { + return settings.enabled && settings.server.length > 0 && settings.port > 0 && !matchesManagedEndpoint(settings, managedEndpoint); +} + +function sanitizeMacProxySettingsForRestore(settings: MacProxySettings, managedEndpoint: ManagedProxyEndpoint): MacProxySettings { + if (!matchesManagedEndpoint(settings, managedEndpoint)) { + return settings; + } + return { + ...settings, + enabled: false + }; +} + +function matchesManagedEndpoint(settings: MacProxySettings, managedEndpoint: ManagedProxyEndpoint): boolean { + return settings.enabled && normalizeHost(settings.server) === normalizeHost(managedEndpoint.host) && settings.port === managedEndpoint.port; +} + +function normalizeHost(host: string): string { + const normalized = host.trim().toLowerCase(); + if (normalized === "::1" || normalized === "[::1]" || normalized === "localhost") { + return "127.0.0.1"; + } + return normalized; +} + +function readSetting(output: string, key: string): string { + const pattern = new RegExp(`^${escapeRegExp(key)}:\\s*(.*)$`, "im"); + return pattern.exec(output)?.[1]?.trim() ?? ""; +} + +function persistSnapshot(snapshot: SystemProxySnapshot): void { + mkdirSync(path.dirname(systemProxySnapshotFile), { recursive: true }); + writeFileSync(systemProxySnapshotFile, `${JSON.stringify(snapshot, null, 2)}\n`, "utf8"); +} + +function readPersistedSnapshot(): SystemProxySnapshot | undefined { + if (!existsSync(systemProxySnapshotFile)) { + return undefined; + } + + try { + const parsed = JSON.parse(readFileSync(systemProxySnapshotFile, "utf8")) as unknown; + if (isSystemProxySnapshot(parsed)) { + return parsed; + } + } catch { + return undefined; + } + return undefined; +} + +function removePersistedSnapshot(): void { + rmSync(systemProxySnapshotFile, { force: true }); +} + +function isSystemProxySnapshot(value: unknown): value is SystemProxySnapshot { + if (!isObject(value) || value.version !== 1 || typeof value.managedEndpoint !== "string") { + return false; + } + if (value.platform === "darwin") { + return Array.isArray(value.services); + } + if (value.platform === "win32") { + return isObject(value.settings); + } + return false; +} + +function sameProxyServer(left: UpstreamProxyServer | undefined, right: UpstreamProxyServer | ManagedProxyEndpoint | undefined): boolean { + return Boolean( + left && + right && + normalizeHost(left.host) === normalizeHost(right.host) && + left.port === right.port && + (!("protocol" in right) || left.protocol === right.protocol) + ); +} + +function formatProxyServer(server: UpstreamProxyServer | ManagedProxyEndpoint): string { + const endpoint = `${formatProxyHost(server.host)}:${server.port}`; + return "protocol" in server ? `${server.protocol}://${endpoint}` : endpoint; +} + +function formatProxyHost(host: string): string { + return host.includes(":") && !host.startsWith("[") ? `[${host}]` : host; +} + +async function queryWindowsRegistryValue(name: string): Promise { + try { + const output = await runCommand(windowsSystemCommand("reg.exe"), ["query", windowsInternetSettingsKey, "/v", name]); + return parseWindowsRegistryQueryOutput(output, name); + } catch { + return undefined; + } +} + +function parseWindowsRegistryQueryOutput(output: string, name: string): WindowsRegistryValue | undefined { + for (const line of output.split(/\r?\n/)) { + const match = /^\s*(\S+)\s+(REG_\S+)\s+(.+?)\s*$/.exec(line); + if (match?.[1].toLowerCase() === name.toLowerCase()) { + return { + type: match[2], + value: match[3] + }; + } + } + return undefined; +} + +function parseWindowsRegistryDword(value: string): number | undefined { + const trimmed = value.trim().toLowerCase(); + const parsed = trimmed.startsWith("0x") ? Number.parseInt(trimmed.slice(2), 16) : Number.parseInt(trimmed, 10); + return Number.isFinite(parsed) ? parsed : undefined; +} + +async function setWindowsRegistryDword(name: string, value: number): Promise { + await runCommand(windowsSystemCommand("reg.exe"), [ + "add", + windowsInternetSettingsKey, + "/v", + name, + "/t", + "REG_DWORD", + "/d", + String(value), + "/f" + ]); +} + +async function setWindowsRegistryString(name: string, value: string): Promise { + await runCommand(windowsSystemCommand("reg.exe"), [ + "add", + windowsInternetSettingsKey, + "/v", + name, + "/t", + "REG_SZ", + "/d", + value, + "/f" + ]); +} + +async function deleteWindowsRegistryValue(name: string): Promise { + await runCommand(windowsSystemCommand("reg.exe"), ["delete", windowsInternetSettingsKey, "/v", name, "/f"]).catch(() => undefined); +} + +async function notifyWindowsSystemProxyChanged(): Promise { + const script = [ + "$signature = '[DllImport(\"wininet.dll\", SetLastError=true)] public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);';", + "Add-Type -MemberDefinition $signature -Namespace WinInet -Name NativeMethods;", + "[WinInet.NativeMethods]::InternetSetOption([IntPtr]::Zero, 39, [IntPtr]::Zero, 0) | Out-Null;", + "[WinInet.NativeMethods]::InternetSetOption([IntPtr]::Zero, 37, [IntPtr]::Zero, 0) | Out-Null;" + ].join(" "); + await runCommand(windowsSystemCommand("powershell.exe"), ["-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-Command", script]).catch((error) => { + console.warn(`[proxy] Failed to notify Windows system proxy change: ${formatError(error)}`); + }); +} + +function runNetworkSetup(args: string[]): Promise { + return runCommand(networkSetup, args).then((output) => { + if (isNetworkSetupErrorOutput(output)) { + throw new Error(output.trim()); + } + return output; + }); +} + +function runCommand(file: string, args: string[]): Promise { + return new Promise((resolve, reject) => { + execFile(file, args, { windowsHide: process.platform === "win32" }, (error, stdout, stderr) => { + const message = stderr?.trim() || stdout?.trim(); + if (error) { + reject(new Error(message || error.message)); + return; + } + resolve(stdout); + }); + }); +} + +function isNetworkSetupErrorOutput(output: string | undefined): boolean { + return Boolean(output && (/AuthorizationCreate\(\) failed/i.test(output) || /^\*\* Error:/m.test(output))); +} + +function escapeRegExp(value: string): string { + return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + +function isObject(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} diff --git a/packages/core/src/proxy/undici-proxy-agent.ts b/packages/core/src/proxy/undici-proxy-agent.ts new file mode 100644 index 0000000..e94e364 --- /dev/null +++ b/packages/core/src/proxy/undici-proxy-agent.ts @@ -0,0 +1 @@ +export { ProxyAgent } from "undici"; diff --git a/packages/core/src/runtime/app-paths.ts b/packages/core/src/runtime/app-paths.ts new file mode 100644 index 0000000..874977f --- /dev/null +++ b/packages/core/src/runtime/app-paths.ts @@ -0,0 +1,81 @@ +import os from "node:os"; +import path from "node:path"; + +export const APP_NAME = "Claude Code Router"; +export const APP_STORAGE_NAME = "claude-code-router"; +export const LEGACY_CONFIGDIR = path.join(os.homedir(), ".claude-code-router"); + +const homeDirEnv = "CCR_INTERNAL_HOME_DIR"; +const appDataDirEnv = "CCR_INTERNAL_APP_DATA_DIR"; +const userDataDirEnv = "CCR_INTERNAL_USER_DATA_DIR"; + +type RuntimePathName = "appData" | "home" | "userData"; + +export type RuntimeAppPaths = Partial>; + +export function setRuntimeAppPaths(paths: RuntimeAppPaths): void { + setPathEnv(homeDirEnv, paths.home); + setPathEnv(appDataDirEnv, paths.appData); + setPathEnv(userDataDirEnv, paths.userData); +} + +export function resolveRuntimeAppPath(name: RuntimePathName): string { + const configured = readConfiguredPath(name); + if (configured) { + return configured; + } + if (name === "home") { + return os.homedir(); + } + if (name === "appData") { + return fallbackAppDataDir(); + } + return fallbackUserDataDir(); +} + +export function resolveRuntimeConfigDir(): string { + if (process.platform === "win32") { + return path.join(resolveRuntimeAppPath("appData"), APP_STORAGE_NAME); + } + return path.join(resolveRuntimeAppPath("home"), `.${APP_STORAGE_NAME}`); +} + +export function resolveRuntimeDataDir(): string { + const configured = readConfiguredPath("userData"); + if (configured) { + return configured; + } + if (process.platform === "win32") { + return resolveRuntimeConfigDir(); + } + return path.join(resolveRuntimeConfigDir(), "app-data"); +} + +function readConfiguredPath(name: RuntimePathName): string | undefined { + const key = name === "home" + ? homeDirEnv + : name === "appData" + ? appDataDirEnv + : userDataDirEnv; + const value = process.env[key]?.trim(); + return value || undefined; +} + +function setPathEnv(key: string, value: string | undefined): void { + if (value?.trim()) { + process.env[key] = value; + } +} + +function fallbackAppDataDir(): string { + if (process.platform === "win32") { + return process.env.APPDATA || + process.env.LOCALAPPDATA || + (process.env.USERPROFILE ? path.join(process.env.USERPROFILE, "AppData", "Roaming") : path.join(os.homedir(), "AppData", "Roaming")); + } + return process.env.XDG_CONFIG_HOME || path.join(os.homedir(), ".config"); +} + +function fallbackUserDataDir(): string { + return resolveRuntimeDataDir(); +} diff --git a/packages/core/src/storage/migration.ts b/packages/core/src/storage/migration.ts new file mode 100644 index 0000000..dda7cc2 --- /dev/null +++ b/packages/core/src/storage/migration.ts @@ -0,0 +1,23 @@ +import { cpSync, existsSync, mkdirSync } from "node:fs"; +import path from "node:path"; + +export function copyMissingDirectoryContents(source: string, target: string, label: string): void { + if (!source || !target || sameFilesystemPath(source, target) || !existsSync(source)) { + return; + } + + try { + mkdirSync(target, { recursive: true }); + cpSync(source, target, { errorOnExist: false, force: false, recursive: true }); + } catch (error) { + console.warn(`Failed to migrate ${label} from ${source} to ${target}: ${formatError(error)}`); + } +} + +export function sameFilesystemPath(left: string, right: string): boolean { + return path.resolve(left).toLowerCase() === path.resolve(right).toLowerCase(); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/core/src/storage/sqlite-native.ts b/packages/core/src/storage/sqlite-native.ts new file mode 100644 index 0000000..3cb7698 --- /dev/null +++ b/packages/core/src/storage/sqlite-native.ts @@ -0,0 +1,31 @@ +import { createRequire } from "node:module"; +import DatabaseConstructor, { type Database as BetterSqliteDatabase } from "better-sqlite3"; + +export type { + Database as BetterSqliteDatabase, + Statement as BetterSqliteStatement +} from "better-sqlite3"; + +const requireFromHere = createRequire(__filename); +let resolvedNativeBinding: string | undefined; +let nativeBindingResolved = false; + +export function createBetterSqliteDatabase(filename: string): BetterSqliteDatabase { + const nativeBinding = resolveBetterSqliteNativeBinding(); + return nativeBinding + ? new DatabaseConstructor(filename, { nativeBinding }) + : new DatabaseConstructor(filename); +} + +function resolveBetterSqliteNativeBinding(): string | undefined { + if (nativeBindingResolved) { + return resolvedNativeBinding; + } + nativeBindingResolved = true; + try { + resolvedNativeBinding = requireFromHere.resolve("better-sqlite3/build/Release/better_sqlite3.node"); + } catch { + resolvedNativeBinding = undefined; + } + return resolvedNativeBinding; +} diff --git a/packages/core/src/usage/normalization.ts b/packages/core/src/usage/normalization.ts new file mode 100644 index 0000000..e2355b8 --- /dev/null +++ b/packages/core/src/usage/normalization.ts @@ -0,0 +1,95 @@ +import type { GatewayProviderProtocol } from "@ccr/core/contracts/app"; + +export type UsageTokenAccounting = { + cacheReadTokens?: number; + cacheWriteTokens?: number; + inputIncludesCacheTokens?: boolean; + inputTokens?: number; +}; + +export function normalizeUsageInputTokens( + usage: T | undefined, + options: { + path?: string; + providerProtocol?: GatewayProviderProtocol; + usageHint?: UsageTokenAccounting; + } = {} +): T | undefined { + if (!usage) { + return undefined; + } + + const includesCacheTokens = inputIncludesCacheTokens(usage, options); + if (!includesCacheTokens || usage.inputTokens === undefined) { + return usage; + } + + const cacheTokens = normalizeCount(usage.cacheReadTokens) + normalizeCount(usage.cacheWriteTokens); + if (cacheTokens <= 0) { + return usage; + } + + return { + ...usage, + inputTokens: Math.max(0, normalizeCount(usage.inputTokens) - cacheTokens) + }; +} + +function inputIncludesCacheTokens( + usage: UsageTokenAccounting, + options: { + path?: string; + providerProtocol?: GatewayProviderProtocol; + usageHint?: UsageTokenAccounting; + } +): boolean | undefined { + const protocolValue = inputIncludesCacheTokensForProtocol(options.providerProtocol); + if (protocolValue !== undefined) { + return protocolValue; + } + if (usage.inputIncludesCacheTokens !== undefined) { + return usage.inputIncludesCacheTokens; + } + if (options.usageHint?.inputIncludesCacheTokens !== undefined) { + return options.usageHint.inputIncludesCacheTokens; + } + return inputIncludesCacheTokensForPath(options.path); +} + +function inputIncludesCacheTokensForProtocol(protocol: GatewayProviderProtocol | undefined): boolean | undefined { + if (protocol === "anthropic_messages") { + return false; + } + if ( + protocol === "openai_chat_completions" || + protocol === "openai_responses" || + protocol === "gemini_generate_content" || + protocol === "gemini_interactions" + ) { + return true; + } + return undefined; +} + +function inputIncludesCacheTokensForPath(path: string | undefined): boolean | undefined { + const normalized = path?.toLowerCase() ?? ""; + if (!normalized) { + return undefined; + } + if ( + normalized.includes("/chat/completions") || + normalized.includes("/responses") || + normalized.includes(":generatecontent") || + normalized.includes("/interactions") + ) { + return true; + } + if (normalized.includes("/messages")) { + return false; + } + return undefined; +} + +function normalizeCount(value: number | undefined): number { + return value !== undefined && Number.isFinite(value) && value > 0 ? Math.trunc(value) : 0; +} diff --git a/packages/core/src/usage/store.ts b/packages/core/src/usage/store.ts new file mode 100644 index 0000000..1df1839 --- /dev/null +++ b/packages/core/src/usage/store.ts @@ -0,0 +1,1284 @@ +import { copyFileSync, existsSync, mkdirSync, rmSync } from "node:fs"; +import { EventEmitter } from "node:events"; +import { randomBytes } from "node:crypto"; +import { tmpdir } from "node:os"; +import { dirname, join } from "node:path"; +import { REQUEST_LOGS_DB_FILE, USAGE_DB_FILE } from "@ccr/core/config/constants"; +import { estimateUsageCostUsd } from "@ccr/core/models/pricing-service"; +import { createBetterSqliteDatabase, type BetterSqliteDatabase } from "@ccr/core/storage/sqlite-native"; +import { normalizeUsageInputTokens } from "@ccr/core/usage/normalization"; +import type { + GatewayProviderProtocol, + UsageComparisonRow, + UsageStatsFilter, + UsageSeriesPoint, + UsageStatsRange, + UsageStatsSnapshot, + UsageTotals +} from "@ccr/core/contracts/app"; + +type SqlDatabase = BetterSqliteDatabase; +type SqlValue = bigint | Buffer | number | string | null; + +type UsageNumbers = { + cacheReadTokens?: number; + cacheWriteTokens?: number; + inputIncludesCacheTokens?: boolean; + inputTokens?: number; + outputTokens?: number; + totalTokens?: number; +}; + +type UsageEventInput = { + client?: string; + createdAt?: string; + credentialId?: string; + durationMs: number; + method: string; + model?: string; + path: string; + provider?: string; + requestId?: string; + statusCode: number; + usage?: UsageNumbers; +}; + +type UsageCaptureInput = { + bodyText: string; + client?: string; + durationMs: number; + fallbackModel?: string; + method: string; + path: string; + providerName?: string; + providerProtocol?: GatewayProviderProtocol; + requestId?: string; + responseHeaders: Headers; + statusCode: number; +}; + +type UsageStatsQueryOptions = { + includeProxy?: boolean; +}; + +type UsageStoreOptions = { + requestLogDbFile?: string; +}; + +type UsageWhereClause = { + params: SqlValue[]; + where: string; +}; + +type StoredUsageEvent = { + cacheReadTokens: number; + cacheWriteTokens: number; + client: string; + costSource: string; + costUsd: number; + createdAt: string; + credentialId: string; + durationMs: number; + id: number; + inputTokens: number; + method: string; + model: string; + outputTokens: number; + path: string; + provider: string; + requestId: string; + statusCode: number; + totalTokens: number; +}; + +type UsageSnapshot = UsageNumbers & { + model?: string; +}; + +const usageEvents = new EventEmitter(); +const usageStatsRanges = new Set(["today", "24h", "7d", "30d"]); +const emptyTotals: UsageTotals = { + avgDurationMs: 0, + cacheRatio: 0, + cacheTokens: 0, + costUsd: 0, + errorCount: 0, + inputTokens: 0, + outputTokens: 0, + requestCount: 0, + successRate: 0, + totalTokens: 0 +}; + +export class UsageStore { + private database?: SqlDatabase; + private initPromise?: Promise; + private readonly requestLogDbFile?: string; + private requestLogBackfillFailureLogged = false; + + constructor(private readonly dbFile: string, options: UsageStoreOptions = {}) { + this.requestLogDbFile = options.requestLogDbFile; + } + + async record(event: UsageEventInput): Promise { + const database = await this.getDatabase(); + const usage = event.usage ?? {}; + const inputTokens = normalizeCount(usage.inputTokens); + const outputTokens = normalizeCount(usage.outputTokens); + const cacheReadTokens = normalizeCount(usage.cacheReadTokens); + const cacheWriteTokens = normalizeCount(usage.cacheWriteTokens); + const cacheTokens = cacheReadTokens + cacheWriteTokens; + const totalTokens = normalizeCount(usage.totalTokens) || inputTokens + outputTokens + cacheTokens; + const route = splitRouteSelector(event.model); + const model = normalizeLabel(route.model ?? event.model, "unknown"); + const provider = normalizeLabel(event.provider ?? route.provider, "unknown"); + const credentialId = normalizeLabel(event.credentialId, ""); + const cost = await estimateUsageCostUsd({ + cacheReadTokens, + cacheWriteTokens, + inputTokens, + model, + outputTokens, + provider + }); + + const statement = database.prepare(` + INSERT INTO usage_events ( + created_at, + request_id, + client, + method, + path, + model, + provider, + credential_id, + status_code, + duration_ms, + input_tokens, + output_tokens, + cache_read_tokens, + cache_write_tokens, + total_tokens, + cost_usd, + cost_source + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + `); + + statement.run( + event.createdAt ?? new Date().toISOString(), + event.requestId ?? "", + normalizeLabel(event.client, "unknown"), + event.method, + event.path, + model, + provider, + credentialId, + normalizeCount(event.statusCode), + normalizeCount(event.durationMs), + inputTokens, + outputTokens, + cacheReadTokens, + cacheWriteTokens, + totalTokens, + cost?.amountUsd ?? null, + cost?.source ?? "" + ); + usageEvents.emit("recorded"); + } + + async getStats(range: UsageStatsRange | null | undefined = "7d", filter: UsageStatsFilter | null | undefined = {}): Promise { + const database = await this.getDatabase(); + const now = new Date(); + const normalizedRange = normalizeUsageRange(range); + const since = getRangeSince(normalizedRange, now); + this.backfillFromRequestLogs(database, since); + const query = buildUsageWhereClause(since, filter); + + return { + clientModels: readClientModelRows(database, query), + generatedAt: now.toISOString(), + models: readModelRows(database, query), + providerModels: readProviderModelRows(database, query), + range: normalizedRange, + recentRequests: readRecentRequestRows(database, query), + series: readUsageSeries(database, normalizedRange, now, query), + totals: readUsageTotals(database, query) + }; + } + + async getTotalsSince(since: Date, filter: UsageStatsFilter | null | undefined = {}, options: UsageStatsQueryOptions | null | undefined = {}): Promise { + const database = await this.getDatabase(); + this.backfillFromRequestLogs(database, since); + return readUsageTotals(database, buildUsageWhereClause(since, filter, options)); + } + + private async getDatabase(): Promise { + if (this.database) { + return this.database; + } + + this.initPromise ??= this.open(); + return this.initPromise; + } + + private async open(): Promise { + mkdirSync(dirname(this.dbFile), { recursive: true }); + const database = createBetterSqliteDatabase(this.dbFile); + configureSqliteDatabase(database); + + database.exec(` + CREATE TABLE IF NOT EXISTS usage_events ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + created_at TEXT NOT NULL, + request_id TEXT NOT NULL DEFAULT '', + client TEXT NOT NULL DEFAULT 'unknown', + method TEXT NOT NULL, + path TEXT NOT NULL, + model TEXT NOT NULL DEFAULT 'unknown', + provider TEXT NOT NULL DEFAULT 'unknown', + credential_id TEXT NOT NULL DEFAULT '', + status_code INTEGER NOT NULL DEFAULT 0, + duration_ms INTEGER NOT NULL DEFAULT 0, + input_tokens INTEGER NOT NULL DEFAULT 0, + output_tokens INTEGER NOT NULL DEFAULT 0, + cache_read_tokens INTEGER NOT NULL DEFAULT 0, + cache_write_tokens INTEGER NOT NULL DEFAULT 0, + total_tokens INTEGER NOT NULL DEFAULT 0, + cost_usd REAL, + cost_source TEXT NOT NULL DEFAULT '' + ); + CREATE INDEX IF NOT EXISTS usage_events_created_at_idx ON usage_events(created_at); + CREATE INDEX IF NOT EXISTS usage_events_model_idx ON usage_events(model); + CREATE INDEX IF NOT EXISTS usage_events_path_idx ON usage_events(path); + `); + ensureUsageSchema(database); + + this.database = database; + return database; + } + + private backfillFromRequestLogs(database: SqlDatabase, since: Date): void { + const requestLogDbFile = this.requestLogDbFile; + if (!requestLogDbFile || !existsSync(requestLogDbFile)) { + return; + } + + let tempRequestLogDbFile: string | undefined; + try { + try { + this.backfillFromAttachedRequestLog(database, requestLogDbFile, since); + } catch { + tempRequestLogDbFile = copySqliteDatabaseToTemp(requestLogDbFile); + this.backfillFromAttachedRequestLog(database, tempRequestLogDbFile, since); + } + this.requestLogBackfillFailureLogged = false; + } catch (error) { + if (!this.requestLogBackfillFailureLogged) { + console.warn(`[usage] Failed to backfill usage from request logs: ${formatError(error)}`); + this.requestLogBackfillFailureLogged = true; + } + } finally { + if (tempRequestLogDbFile) { + cleanupSqliteTempCopy(tempRequestLogDbFile); + } + } + } + + private backfillFromAttachedRequestLog(database: SqlDatabase, requestLogDbFile: string, since: Date): void { + database.exec(`ATTACH DATABASE ${sqlString(requestLogDbFile)} AS request_log_source`); + try { + database.prepare(` + INSERT INTO usage_events ( + created_at, + request_id, + client, + method, + path, + model, + provider, + credential_id, + status_code, + duration_ms, + input_tokens, + output_tokens, + cache_read_tokens, + cache_write_tokens, + total_tokens, + cost_usd, + cost_source + ) + SELECT + logs.created_at, + logs.request_id, + logs.client, + logs.method, + logs.path, + logs.model, + logs.provider, + logs.credential_id, + logs.status_code, + logs.duration_ms, + logs.input_tokens, + logs.output_tokens, + logs.cache_read_tokens, + logs.cache_write_tokens, + logs.total_tokens, + logs.cost_usd, + 'request_log' + FROM request_log_source.request_logs AS logs + WHERE logs.source_usage_id IS NULL + AND logs.path NOT LIKE ? + AND logs.created_at >= ? + AND NOT EXISTS ( + SELECT 1 + FROM usage_events AS existing + WHERE ( + logs.request_id <> '' + AND existing.request_id = logs.request_id + ) OR ( + logs.request_id = '' + AND existing.created_at = logs.created_at + AND existing.path = logs.path + AND existing.model = logs.model + ) + ) + `).run("%/count_tokens%", since.toISOString()); + } finally { + database.exec("DETACH DATABASE request_log_source"); + } + } +} + +export const usageStore = new UsageStore(USAGE_DB_FILE, { requestLogDbFile: REQUEST_LOGS_DB_FILE }); + +export function onUsageRecorded(listener: () => void): () => void { + usageEvents.on("recorded", listener); + return () => { + usageEvents.off("recorded", listener); + }; +} + +function ensureUsageSchema(database: SqlDatabase): void { + const columns = new Set( + queryRows(database, "PRAGMA table_info(usage_events)") + .map((row) => String(row.name ?? "")) + .filter(Boolean) + ); + + if (!columns.has("client")) { + database.exec("ALTER TABLE usage_events ADD COLUMN client TEXT NOT NULL DEFAULT 'unknown'"); + } + if (!columns.has("cost_usd")) { + database.exec("ALTER TABLE usage_events ADD COLUMN cost_usd REAL"); + } + if (!columns.has("cost_source")) { + database.exec("ALTER TABLE usage_events ADD COLUMN cost_source TEXT NOT NULL DEFAULT ''"); + } + if (!columns.has("credential_id")) { + database.exec("ALTER TABLE usage_events ADD COLUMN credential_id TEXT NOT NULL DEFAULT ''"); + } + + database.exec("CREATE INDEX IF NOT EXISTS usage_events_client_idx ON usage_events(client)"); + database.exec("CREATE INDEX IF NOT EXISTS usage_events_created_at_idx ON usage_events(created_at)"); + database.exec("CREATE INDEX IF NOT EXISTS usage_events_credential_id_idx ON usage_events(credential_id)"); + database.exec("CREATE INDEX IF NOT EXISTS usage_events_model_idx ON usage_events(model)"); + database.exec("CREATE INDEX IF NOT EXISTS usage_events_path_idx ON usage_events(path)"); + database.exec("CREATE INDEX IF NOT EXISTS usage_events_created_filter_idx ON usage_events(created_at, provider, model, credential_id)"); + database.exec("CREATE INDEX IF NOT EXISTS usage_events_provider_created_at_idx ON usage_events(provider, created_at)"); + database.exec("CREATE INDEX IF NOT EXISTS usage_events_model_created_at_idx ON usage_events(model, created_at)"); + database.exec("CREATE INDEX IF NOT EXISTS usage_events_credential_created_at_idx ON usage_events(credential_id, created_at)"); +} + +export async function getUsageStats(range?: UsageStatsRange | null, filter?: UsageStatsFilter | null): Promise { + try { + return await usageStore.getStats(range, filter); + } catch (error) { + console.warn(`[usage] Failed to read usage stats: ${formatError(error)}`); + return emptySnapshot(normalizeUsageRange(range)); + } +} + +export async function getTodayUsageTotals(filter?: UsageStatsFilter | null, options?: UsageStatsQueryOptions | null): Promise { + try { + return await usageStore.getTotalsSince(floorDay(new Date()), filter, options); + } catch (error) { + console.warn(`[usage] Failed to read today's usage totals: ${formatError(error)}`); + return { ...emptyTotals }; + } +} + +export async function getUsageTotalsSince(since: Date, filter?: UsageStatsFilter | null, options?: UsageStatsQueryOptions | null): Promise { + try { + return await usageStore.getTotalsSince(since, filter, options); + } catch (error) { + console.warn(`[usage] Failed to read usage totals: ${formatError(error)}`); + return { ...emptyTotals }; + } +} + +export async function recordGatewayUsageCapture(input: UsageCaptureInput): Promise { + try { + const headersUsage = extractUsageFromBillingHeaders(input.responseHeaders); + const bodyUsage = extractUsageFromBody(input.bodyText); + const usage = normalizeUsageInputTokens(headersUsage ?? bodyUsage, { + path: input.path, + providerProtocol: input.providerProtocol, + usageHint: bodyUsage + }); + const route = splitRouteSelector(input.fallbackModel); + const provider = + input.providerName ?? + readHeader(input.responseHeaders, "x-gateway-target-provider-name") ?? + readHeader(input.responseHeaders, "x-gateway-target-provider") ?? + route.provider; + + await usageStore.record({ + durationMs: input.durationMs, + method: input.method, + model: bodyUsage?.model ?? route.model ?? input.fallbackModel, + path: input.path, + client: input.client, + provider, + credentialId: readCredentialId(input.responseHeaders), + requestId: input.requestId, + statusCode: input.statusCode, + usage + }); + } catch (error) { + console.warn(`[usage] Failed to record usage: ${formatError(error)}`); + } +} + +function buildUsageWhereClause( + since: Date, + filter: UsageStatsFilter | null | undefined, + options: UsageStatsQueryOptions | null | undefined = {} +): UsageWhereClause { + const normalizedFilter = normalizeUsageFilter(filter); + const normalizedOptions = normalizeUsageQueryOptions(options); + const where = ["created_at >= ?"]; + const params: SqlValue[] = [since.toISOString()]; + const credential = normalizeFilterValue(normalizedFilter.credential); + const provider = normalizeFilterValue(normalizedFilter.provider); + const model = normalizeFilterValue(normalizedFilter.model); + + if (provider) { + where.push("provider = ?"); + params.push(provider); + } else if (!normalizedOptions.includeProxy && normalizedFilter.includeProxy !== true) { + where.push("provider <> ?"); + params.push("proxy"); + } + if (model) { + where.push("model = ?"); + params.push(model); + } + if (credential) { + where.push("credential_id = ?"); + params.push(credential); + } + + return { + params, + where: where.join(" AND ") + }; +} + +function normalizeUsageRange(range: UsageStatsRange | null | undefined): UsageStatsRange { + return range && usageStatsRanges.has(range) ? range : "7d"; +} + +function normalizeUsageFilter(filter: UsageStatsFilter | null | undefined): UsageStatsFilter { + if (!isRecord(filter)) { + return {}; + } + return { + credential: typeof filter.credential === "string" ? filter.credential : undefined, + includeProxy: filter.includeProxy === true, + model: typeof filter.model === "string" ? filter.model : undefined, + provider: typeof filter.provider === "string" ? filter.provider : undefined + }; +} + +function normalizeUsageQueryOptions(options: UsageStatsQueryOptions | null | undefined): UsageStatsQueryOptions { + return isRecord(options) && options.includeProxy === true ? { includeProxy: true } : {}; +} + +function configureSqliteDatabase(database: SqlDatabase): void { + database.pragma("journal_mode = WAL"); + database.pragma("synchronous = NORMAL"); + database.pragma("busy_timeout = 5000"); +} + +function queryRows(database: SqlDatabase, sql: string, params: SqlValue[] = []): Record[] { + return database.prepare(sql).all(...params) as Record[]; +} + +function sqlString(value: string): string { + return `'${value.replace(/'/g, "''")}'`; +} + +function copySqliteDatabaseToTemp(file: string): string { + const target = join(tmpdir(), `ccr-request-logs-${process.pid}-${Date.now()}-${randomBytes(4).toString("hex")}.sqlite`); + copyFileSync(file, target); + for (const suffix of ["-wal", "-shm"]) { + const source = `${file}${suffix}`; + if (existsSync(source)) { + copyFileSync(source, `${target}${suffix}`); + } + } + return target; +} + +function cleanupSqliteTempCopy(file: string): void { + for (const item of [file, `${file}-wal`, `${file}-shm`]) { + rmSync(item, { force: true }); + } +} + +function toStoredUsageEvent(row: Record): StoredUsageEvent { + return { + cacheReadTokens: normalizeCount(row.cache_read_tokens), + cacheWriteTokens: normalizeCount(row.cache_write_tokens), + client: normalizeLabel(String(row.client ?? ""), "unknown"), + costSource: String(row.cost_source ?? ""), + costUsd: normalizeCost(row.cost_usd), + createdAt: String(row.created_at ?? ""), + credentialId: normalizeLabel(String(row.credential_id ?? ""), ""), + durationMs: normalizeCount(row.duration_ms), + id: normalizeCount(row.id), + inputTokens: normalizeCount(row.input_tokens), + method: String(row.method ?? ""), + model: normalizeLabel(String(row.model ?? ""), "unknown"), + outputTokens: normalizeCount(row.output_tokens), + path: normalizeLabel(String(row.path ?? ""), "/"), + provider: normalizeLabel(String(row.provider ?? ""), "unknown"), + requestId: String(row.request_id ?? ""), + statusCode: normalizeCount(row.status_code), + totalTokens: normalizeCount(row.total_tokens) + }; +} + +const usageTotalsSelect = ` + COUNT(*) AS request_count, + COALESCE(SUM(input_tokens), 0) AS input_tokens, + COALESCE(SUM(output_tokens), 0) AS output_tokens, + COALESCE(SUM(cache_read_tokens), 0) AS cache_read_tokens, + COALESCE(SUM(cache_write_tokens), 0) AS cache_write_tokens, + COALESCE(SUM(CASE + WHEN total_tokens > 0 THEN total_tokens + ELSE input_tokens + output_tokens + cache_read_tokens + cache_write_tokens + END), 0) AS computed_total_tokens, + COALESCE(SUM(COALESCE(cost_usd, 0)), 0) AS cost_usd, + COALESCE(SUM(duration_ms), 0) AS duration_ms, + COALESCE(SUM(CASE WHEN status_code >= 200 AND status_code < 400 THEN 1 ELSE 0 END), 0) AS success_count, + COALESCE(SUM(CASE + WHEN total_tokens - output_tokens > 0 THEN MAX(input_tokens, total_tokens - output_tokens) + ELSE input_tokens + cache_read_tokens + cache_write_tokens + END), 0) AS prompt_tokens +`; + +function readUsageTotals(database: SqlDatabase, query: UsageWhereClause): UsageTotals { + const row = queryRows( + database, + ` + SELECT + ${usageTotalsSelect} + FROM usage_events + WHERE ${query.where} + `, + query.params + )[0]; + return usageTotalsFromRow(row); +} + +function readUsageSeries( + database: SqlDatabase, + range: UsageStatsRange, + now: Date, + query: UsageWhereClause +): UsageSeriesPoint[] { + const unit: "day" | "hour" = range === "today" || range === "24h" ? "hour" : "day"; + const bucketExpression = unit === "hour" + ? "strftime('%Y-%m-%d %H:00', created_at, 'localtime')" + : "strftime('%Y-%m-%d', created_at, 'localtime')"; + const rows = queryRows( + database, + ` + SELECT + ${bucketExpression} AS bucket, + ${usageTotalsSelect} + FROM usage_events + WHERE ${query.where} + GROUP BY bucket + `, + query.params + ); + const totalsByBucket = new Map(rows.map((row) => [String(row.bucket ?? ""), usageTotalsFromRow(row)])); + + return buildBuckets(range, now).map(({ key, label }) => ({ + ...(totalsByBucket.get(key) ?? { ...emptyTotals }), + bucket: key, + label + })); +} + +function readModelRows(database: SqlDatabase, query: UsageWhereClause): UsageComparisonRow[] { + const rows = readUsageGroupRows( + database, + query, + "provider, model", + "provider, model, MAX(credential_id) AS credential_id", + 8 + ).map((row) => ({ + ...usageTotalsFromRow(row), + caption: normalizeLabel(String(row.provider ?? ""), "unknown"), + credentialId: normalizeFilterValue(String(row.credential_id ?? "")), + key: `${normalizeLabel(String(row.provider ?? ""), "unknown")}::${normalizeLabel(String(row.model ?? ""), "unknown")}`, + label: normalizeLabel(String(row.model ?? ""), "unknown"), + maxShare: 0, + model: normalizeLabel(String(row.model ?? ""), "unknown"), + provider: normalizeLabel(String(row.provider ?? ""), "unknown") + })); + return applyMaxShare(rows, (row) => row.totalTokens || row.requestCount); +} + +function readClientModelRows(database: SqlDatabase, query: UsageWhereClause): UsageComparisonRow[] { + const rows = readUsageGroupRows( + database, + query, + "client, provider, credential_id, model", + "client, provider, credential_id, model", + 25 + ).map((row) => { + const client = normalizeLabel(String(row.client ?? ""), "unknown"); + const model = normalizeLabel(String(row.model ?? ""), "unknown"); + const provider = normalizeLabel(String(row.provider ?? ""), "unknown"); + const credentialId = normalizeFilterValue(String(row.credential_id ?? "")) ?? ""; + return { + ...usageTotalsFromRow(row), + caption: credentialId ? `${provider} / ${credentialId} / ${model}` : `${provider} / ${model}`, + client, + credentialId: credentialId || undefined, + key: `${client}::${provider}::${credentialId}::${model}`, + label: client, + maxShare: 0, + model, + provider + }; + }); + return applyMaxShare(rows, (row) => row.totalTokens || row.requestCount); +} + +function readProviderModelRows(database: SqlDatabase, query: UsageWhereClause): UsageComparisonRow[] { + const rows = readUsageGroupRows( + database, + query, + "provider, credential_id, model", + "provider, credential_id, model", + 25 + ).map((row) => { + const model = normalizeLabel(String(row.model ?? ""), "unknown"); + const provider = normalizeLabel(String(row.provider ?? ""), "unknown"); + const credentialId = normalizeFilterValue(String(row.credential_id ?? "")) ?? ""; + return { + ...usageTotalsFromRow(row), + caption: credentialId ? `${credentialId} / ${model}` : model, + credentialId: credentialId || undefined, + key: `${provider}::${credentialId}::${model}`, + label: provider, + maxShare: 0, + model, + provider + }; + }); + return applyMaxShare(rows, (row) => row.totalTokens || row.requestCount); +} + +function readUsageGroupRows( + database: SqlDatabase, + query: UsageWhereClause, + groupBy: string, + selectColumns: string, + limit: number +): Record[] { + return queryRows( + database, + ` + SELECT + ${selectColumns}, + ${usageTotalsSelect} + FROM usage_events + WHERE ${query.where} + GROUP BY ${groupBy} + ORDER BY computed_total_tokens DESC, request_count DESC + LIMIT ? + `, + [...query.params, limit] + ); +} + +function readRecentRequestRows(database: SqlDatabase, query: UsageWhereClause): UsageComparisonRow[] { + const events = queryRows( + database, + ` + SELECT + id, + created_at, + request_id, + client, + method, + path, + model, + provider, + credential_id, + status_code, + duration_ms, + input_tokens, + output_tokens, + cache_read_tokens, + cache_write_tokens, + total_tokens, + cost_usd, + cost_source + FROM usage_events + WHERE ${query.where} + ORDER BY created_at DESC, id DESC + LIMIT 10 + `, + query.params + ).map(toStoredUsageEvent).reverse(); + return buildRecentRequestRows(events); +} + +function usageTotalsFromRow(row: Record | undefined): UsageTotals { + const requestCount = normalizeCount(row?.request_count); + if (requestCount === 0) { + return { ...emptyTotals }; + } + const successfulRequests = normalizeCount(row?.success_count); + const promptTokens = normalizeCount(row?.prompt_tokens); + const cacheTokens = normalizeCount(row?.cache_read_tokens); + return { + avgDurationMs: Math.round(normalizeCount(row?.duration_ms) / requestCount), + cacheRatio: ratio(cacheTokens, promptTokens), + cacheTokens, + costUsd: normalizeCost(row?.cost_usd), + errorCount: requestCount - successfulRequests, + inputTokens: normalizeCount(row?.input_tokens), + outputTokens: normalizeCount(row?.output_tokens), + requestCount, + successRate: successfulRequests / requestCount, + totalTokens: normalizeCount(row?.computed_total_tokens) + }; +} + +function buildSeries(range: UsageStatsRange, now: Date, events: StoredUsageEvent[]): UsageSeriesPoint[] { + const buckets = buildBuckets(range, now); + const grouped = new Map(); + for (const event of events) { + const key = formatBucketKey(new Date(event.createdAt), range === "today" || range === "24h" ? "hour" : "day"); + const bucket = grouped.get(key) ?? []; + bucket.push(event); + grouped.set(key, bucket); + } + + return buckets.map(({ key, label }) => ({ + ...buildTotals(grouped.get(key) ?? []), + bucket: key, + label + })); +} + +function buildBuckets( + range: UsageStatsRange, + now: Date +): Array<{ key: string; label: string }> { + if (range === "today" || range === "24h") { + const start = range === "today" ? floorDay(now) : floorHour(now); + if (range === "24h") { + start.setHours(start.getHours() - 23); + } + const count = range === "today" ? floorHour(now).getHours() + 1 : 24; + return Array.from({ length: count }, (_, index) => { + const date = new Date(start); + date.setHours(start.getHours() + index); + return { + key: formatBucketKey(date, "hour"), + label: `${String(date.getHours()).padStart(2, "0")}:00` + }; + }); + } + + const count = range === "7d" ? 7 : 30; + const start = floorDay(now); + start.setDate(start.getDate() - (count - 1)); + return Array.from({ length: count }, (_, index) => { + const date = new Date(start); + date.setDate(start.getDate() + index); + return { + key: formatBucketKey(date, "day"), + label: `${date.getMonth() + 1}/${date.getDate()}` + }; + }); +} + +function buildModelRows(events: StoredUsageEvent[]): UsageComparisonRow[] { + const grouped = new Map(); + for (const event of events) { + const key = `${event.provider}::${event.model}`; + const bucket = grouped.get(key) ?? []; + bucket.push(event); + grouped.set(key, bucket); + } + + const rows = Array.from(grouped.entries()) + .map(([key, groupedEvents]) => { + const latest = groupedEvents.at(-1); + return { + ...buildTotals(groupedEvents), + caption: latest?.provider || "unknown", + credentialId: latest?.credentialId || undefined, + key, + label: latest?.model || "unknown", + maxShare: 0, + model: latest?.model, + provider: latest?.provider + }; + }) + .sort((a, b) => b.totalTokens - a.totalTokens || b.requestCount - a.requestCount) + .slice(0, 8); + + return applyMaxShare(rows, (row) => row.totalTokens || row.requestCount); +} + +function buildClientModelRows(events: StoredUsageEvent[]): UsageComparisonRow[] { + const grouped = new Map(); + for (const event of events) { + const key = `${event.client}::${event.provider}::${event.credentialId}::${event.model}`; + const bucket = grouped.get(key) ?? []; + bucket.push(event); + grouped.set(key, bucket); + } + + const rows = Array.from(grouped.entries()) + .map(([key, groupedEvents]) => { + const latest = groupedEvents.at(-1); + const model = latest?.model || "unknown"; + const provider = latest?.provider || "unknown"; + const credentialId = latest?.credentialId || ""; + return { + ...buildTotals(groupedEvents), + caption: credentialId ? `${provider} / ${credentialId} / ${model}` : `${provider} / ${model}`, + client: latest?.client, + credentialId: credentialId || undefined, + key, + label: latest?.client || "unknown", + maxShare: 0, + model, + provider + }; + }) + .sort(compareUsageRows) + .slice(0, 25); + + return applyMaxShare(rows, (row) => row.totalTokens || row.requestCount); +} + +function buildProviderModelRows(events: StoredUsageEvent[]): UsageComparisonRow[] { + const grouped = new Map(); + for (const event of events) { + const key = `${event.provider}::${event.credentialId}::${event.model}`; + const bucket = grouped.get(key) ?? []; + bucket.push(event); + grouped.set(key, bucket); + } + + const rows = Array.from(grouped.entries()) + .map(([key, groupedEvents]) => { + const latest = groupedEvents.at(-1); + const model = latest?.model || "unknown"; + const provider = latest?.provider || "unknown"; + const credentialId = latest?.credentialId || ""; + return { + ...buildTotals(groupedEvents), + caption: credentialId ? `${credentialId} / ${model}` : model, + credentialId: credentialId || undefined, + key, + label: provider, + maxShare: 0, + model, + provider + }; + }) + .sort(compareUsageRows) + .slice(0, 25); + + return applyMaxShare(rows, (row) => row.totalTokens || row.requestCount); +} + +function buildRecentRequestRows(events: StoredUsageEvent[]): UsageComparisonRow[] { + const recent = events.slice(-10).reverse(); + const rows = recent.map((event) => ({ + ...buildTotals([event]), + caption: `${formatRequestTime(event.createdAt)} · ${event.client} · ${event.path} · ${event.statusCode}`, + client: event.client, + credentialId: event.credentialId || undefined, + key: String(event.id), + label: event.model || "unknown", + maxShare: 0, + model: event.model, + provider: event.provider + })); + + return applyMaxShare(rows, (row) => row.totalTokens || row.avgDurationMs || 1); +} + +function compareUsageRows(a: UsageComparisonRow, b: UsageComparisonRow): number { + return b.totalTokens - a.totalTokens || b.requestCount - a.requestCount || a.label.localeCompare(b.label); +} + +function applyMaxShare( + rows: T[], + readValue: (row: T) => number +): T[] { + const max = Math.max(...rows.map(readValue), 0); + return rows.map((row) => ({ + ...row, + maxShare: max > 0 ? readValue(row) / max : 0 + })); +} + +function buildTotals(events: StoredUsageEvent[]): UsageTotals { + if (events.length === 0) { + return { ...emptyTotals }; + } + + const requestCount = events.length; + const inputTokens = sum(events, (event) => event.inputTokens); + const outputTokens = sum(events, (event) => event.outputTokens); + const cacheTokens = sum(events, (event) => event.cacheReadTokens); + const costUsd = sum(events, (event) => event.costUsd); + const totalTokens = sum(events, (event) => event.totalTokens || event.inputTokens + event.outputTokens + event.cacheReadTokens + event.cacheWriteTokens); + const promptTokens = sum(events, promptTokenCount); + const successfulRequests = events.filter((event) => event.statusCode >= 200 && event.statusCode < 400).length; + const errorCount = requestCount - successfulRequests; + + return { + avgDurationMs: Math.round(sum(events, (event) => event.durationMs) / requestCount), + cacheRatio: ratio(cacheTokens, promptTokens), + cacheTokens, + costUsd, + errorCount, + inputTokens, + outputTokens, + requestCount, + successRate: successfulRequests / requestCount, + totalTokens + }; +} + +function promptTokenCount(event: StoredUsageEvent): number { + const cacheTokens = event.cacheReadTokens + event.cacheWriteTokens; + const promptTokensFromTotal = event.totalTokens - event.outputTokens; + if (promptTokensFromTotal > 0) { + return Math.max(event.inputTokens, promptTokensFromTotal); + } + return event.inputTokens + cacheTokens; +} + +function extractUsageFromBillingHeaders(headers: Headers): UsageNumbers | undefined { + const inputTokens = readNumberHeader(headers, "x-gateway-billing-input-tokens"); + const outputTokens = readNumberHeader(headers, "x-gateway-billing-output-tokens"); + const cacheReadTokens = readNumberHeader(headers, "x-gateway-billing-cache-read-tokens"); + const cacheWriteTokens = readNumberHeader(headers, "x-gateway-billing-cache-write-tokens"); + const totalTokens = readNumberHeader(headers, "x-gateway-billing-total-tokens"); + + if ([inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens, totalTokens].every((value) => value === undefined)) { + return undefined; + } + + return { + cacheReadTokens, + cacheWriteTokens, + inputTokens, + outputTokens, + totalTokens + }; +} + +function extractUsageFromBody(text: string): UsageSnapshot | undefined { + const snapshots: UsageSnapshot[] = []; + const trimmed = text.trim(); + if (!trimmed) { + return undefined; + } + + const parsed = parseJson(trimmed); + if (parsed !== undefined) { + const snapshot = extractUsageSnapshot(parsed); + return snapshot && hasUsageNumbers(snapshot) ? snapshot : undefined; + } + + for (const payload of parseStreamPayloads(trimmed)) { + const snapshot = extractUsageSnapshot(payload); + if (snapshot && hasUsageNumbers(snapshot)) { + snapshots.push(snapshot); + } + } + + return snapshots.at(-1); +} + +function parseStreamPayloads(text: string): unknown[] { + const payloads: unknown[] = []; + for (const rawLine of text.split(/\r?\n/)) { + const line = rawLine.trim(); + const payload = line.startsWith("data:") ? line.slice(5).trim() : line.startsWith("{") ? line : ""; + if (!payload || payload === "[DONE]") { + continue; + } + const parsed = parseJson(payload); + if (parsed !== undefined) { + payloads.push(parsed); + } + } + return payloads; +} + +function extractUsageSnapshot(payload: unknown): UsageSnapshot | undefined { + if (!isRecord(payload)) { + return undefined; + } + + const response = isRecord(payload.response) ? payload.response : payload; + const usage = isRecord(response.usage) + ? response.usage + : isRecord(payload.usage) + ? payload.usage + : undefined; + const usageMetadata = isRecord(response.usageMetadata) + ? response.usageMetadata + : isRecord(payload.usageMetadata) + ? payload.usageMetadata + : undefined; + + if (usageMetadata) { + return { + cacheReadTokens: asNumber(usageMetadata.cachedContentTokenCount), + inputIncludesCacheTokens: true, + inputTokens: asNumber(usageMetadata.promptTokenCount), + model: asString(response.modelVersion) ?? asString(payload.modelVersion), + outputTokens: asNumber(usageMetadata.candidatesTokenCount), + totalTokens: asNumber(usageMetadata.totalTokenCount) + }; + } + + if (!usage) { + return undefined; + } + + const inputDetails = isRecord(usage.input_tokens_details) + ? usage.input_tokens_details + : isRecord(usage.prompt_tokens_details) + ? usage.prompt_tokens_details + : undefined; + const hasAnthropicCacheFields = + usage.cache_read_input_tokens !== undefined || + usage.cache_creation_input_tokens !== undefined; + const hasOpenAiCacheFields = + inputDetails?.cached_tokens !== undefined || + inputDetails?.cache_creation_tokens !== undefined || + usage.cached_tokens !== undefined || + usage.prompt_tokens !== undefined; + + return { + cacheReadTokens: + asNumber(usage.cache_read_tokens) ?? + asNumber(usage.cache_read_input_tokens) ?? + asNumber(usage.cached_tokens) ?? + asNumber(inputDetails?.cached_tokens), + cacheWriteTokens: + asNumber(usage.cache_write_tokens) ?? + asNumber(usage.cache_creation_tokens) ?? + asNumber(usage.cache_creation_input_tokens) ?? + asNumber(inputDetails?.cache_creation_tokens), + inputIncludesCacheTokens: hasAnthropicCacheFields ? false : hasOpenAiCacheFields ? true : undefined, + inputTokens: asNumber(usage.input_tokens) ?? asNumber(usage.prompt_tokens), + model: + asString(response.model) ?? + asString(payload.model) ?? + asString(response.modelVersion) ?? + asString(payload.modelVersion), + outputTokens: asNumber(usage.output_tokens) ?? asNumber(usage.completion_tokens), + totalTokens: asNumber(usage.total_tokens) + }; +} + +function hasUsageNumbers(snapshot: UsageNumbers): boolean { + return [ + snapshot.cacheReadTokens, + snapshot.cacheWriteTokens, + snapshot.inputTokens, + snapshot.outputTokens, + snapshot.totalTokens + ].some((value) => value !== undefined); +} + +function readHeader(headers: Headers, name: string): string | undefined { + const value = headers.get(name)?.trim(); + return value || undefined; +} + +function readCredentialId(headers: Headers): string | undefined { + return readHeader(headers, "x-ccr-provider-credential-id") ?? parseCredentialChain(readHeader(headers, "x-ccr-provider-credential-chain"))[0]; +} + +function parseCredentialChain(value: string | undefined): string[] { + const result: string[] = []; + const seen = new Set(); + for (const item of (value ?? "").split(",")) { + const trimmed = item.trim(); + if (!trimmed || seen.has(trimmed)) { + continue; + } + seen.add(trimmed); + result.push(trimmed); + } + return result; +} + +function readNumberHeader(headers: Headers, name: string): number | undefined { + return asNumber(readHeader(headers, name)); +} + +function asNumber(value: unknown): number | undefined { + const parsed = typeof value === "number" ? value : typeof value === "string" ? Number(value) : Number.NaN; + return Number.isFinite(parsed) ? Math.max(0, Math.round(parsed)) : undefined; +} + +function normalizeCount(value: unknown): number { + return asNumber(value) ?? 0; +} + +function normalizeCost(value: unknown): number { + const parsed = typeof value === "number" ? value : typeof value === "string" ? Number(value) : Number.NaN; + return Number.isFinite(parsed) && parsed > 0 ? parsed : 0; +} + +function asString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function parseJson(value: string): unknown | undefined { + try { + return JSON.parse(value) as unknown; + } catch { + return undefined; + } +} + +function splitRouteSelector(value: string | undefined): { model?: string; provider?: string } { + const trimmed = value?.trim(); + if (!trimmed) { + return {}; + } + + const separator = trimmed.indexOf("/"); + if (separator <= 0 || separator >= trimmed.length - 1) { + return { model: trimmed }; + } + + return { + model: trimmed.slice(separator + 1).trim(), + provider: trimmed.slice(0, separator).trim() + }; +} + +function normalizeLabel(value: string | undefined, fallback: string): string { + const trimmed = value?.trim(); + return trimmed || fallback; +} + +function normalizeFilterValue(value: string | undefined): string | undefined { + const trimmed = value?.trim(); + return trimmed || undefined; +} + +function getRangeSince(range: UsageStatsRange, now: Date): Date { + const date = new Date(now); + if (range === "today") { + return floorDay(date); + } + if (range === "24h") { + date.setHours(date.getHours() - 24); + } else if (range === "7d") { + date.setDate(date.getDate() - 7); + } else { + date.setDate(date.getDate() - 30); + } + return date; +} + +function floorHour(date: Date): Date { + const next = new Date(date); + next.setMinutes(0, 0, 0); + return next; +} + +function floorDay(date: Date): Date { + const next = new Date(date); + next.setHours(0, 0, 0, 0); + return next; +} + +function formatBucketKey(date: Date, unit: "day" | "hour"): string { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, "0"); + const day = String(date.getDate()).padStart(2, "0"); + if (unit === "day") { + return `${year}-${month}-${day}`; + } + const hour = String(date.getHours()).padStart(2, "0"); + return `${year}-${month}-${day} ${hour}:00`; +} + +function formatRequestTime(value: string): string { + const date = new Date(value); + if (Number.isNaN(date.getTime())) { + return "--:--"; + } + return `${String(date.getHours()).padStart(2, "0")}:${String(date.getMinutes()).padStart(2, "0")}`; +} + +function ratio(numerator: number, denominator: number): number { + if (numerator <= 0 || denominator <= 0) { + return 0; + } + return Math.min(1, numerator / denominator); +} + +function sum(items: T[], read: (item: T) => number): number { + return items.reduce((total, item) => total + read(item), 0); +} + +function emptySnapshot(range: UsageStatsRange): UsageStatsSnapshot { + return { + clientModels: [], + generatedAt: new Date().toISOString(), + models: [], + providerModels: [], + range, + recentRequests: [], + series: buildSeries(range, new Date(), []), + totals: { ...emptyTotals } + }; +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/core/src/web/management-server.ts b/packages/core/src/web/management-server.ts new file mode 100644 index 0000000..cf3f787 --- /dev/null +++ b/packages/core/src/web/management-server.ts @@ -0,0 +1,1167 @@ +import { spawn } from "node:child_process"; +import { randomBytes, timingSafeEqual } from "node:crypto"; +import { createServer, type IncomingMessage, type Server, type ServerResponse } from "node:http"; +import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs"; +import net from "node:net"; +import os from "node:os"; +import path from "node:path"; +import packageJson from "../../package.json"; +import { loadPersistedAppSetting, replacePersistedAppSetting } from "@ccr/core/config/app-config-store"; +import { scanBotHandoffBluetoothTargets, scanBotHandoffWifiTargets } from "@ccr/core/agents/bot-gateway/handoff-scan-service"; +import { cancelBotGatewayQrLogin, startBotGatewayQrLogin, waitBotGatewayQrLogin } from "@ccr/core/agents/bot-gateway/qr-login-service"; +import { syncClaudeAppGatewayConfig, restoreClaudeAppGatewayConfig } from "@ccr/core/agents/claude-app/gateway-service"; +import { loadAppConfig, saveApiKeysConfig, saveAppConfig } from "@ccr/core/config/config"; +import { API_KEYS_DB_FILE, APP_CONFIG_DB_FILE, APP_NAME, CONFIGDIR, CONFIG_FILE, DATADIR, GATEWAY_CONFIG_FILE, LEGACY_CONFIG_FILE, ONBOARDING_FINISHED_FILE, PROXY_CA_CERT_FILE, REQUEST_LOGS_DB_FILE, USAGE_DB_FILE } from "@ccr/core/config/constants"; +import { detectProviderIcon } from "@ccr/core/providers/icons"; +import { fetchProviderManifest } from "@ccr/core/providers/manifest-service"; +import { getLocalAgentProviderCandidates, importLocalAgentProvider, probeLocalAgentProvider } from "@ccr/core/agents/local-providers/service"; +import { getProviderCatalogModels } from "@ccr/core/providers/model-catalog"; +import { getProviderPresets } from "@ccr/core/providers/presets/index"; +import { checkGatewayProviderConnectivity, probeGatewayProvider, probeGatewayProviderCandidates } from "@ccr/core/providers/probe"; +import { applyProfileConfig } from "@ccr/core/profiles/service"; +import { getProfileOpenCommand, getProfileRuntimeStatus, openProfileFromCcr, stopProfileFromCcr } from "@ccr/core/profiles/launch-service"; +import { ensureProxyCertificateAuthority } from "@ccr/core/proxy/certificates"; +import { proxyService } from "@ccr/core/proxy/service"; +import { listMcpServerTools } from "@ccr/core/mcp/tool-discovery"; +import { getAgentAnalysis, getAgentTracePayload, getRequestLogDetail, getRequestLogs } from "@ccr/core/observability/request-log-store"; +import { getUsageStats } from "@ccr/core/usage/store"; +import { gatewayService } from "@ccr/core/gateway/service"; +import { shouldRestartGatewayForRuntimeConfigChange } from "@ccr/core/gateway/runtime-change"; +import { getProviderAccountSnapshots, invalidateProviderAccountSnapshotCache, resetCodexRateLimitCredit, testProviderAccountConnector } from "@ccr/core/providers/account-service"; +import type { + AgentAnalysisFilter, + AgentAnalysisTracePayloadRequest, + ApiKeyConfig, + AppConfig, + AppDataExportResult, + AppInfo, + AppSaveConfigOptions, + AppUpdateStatus, + BotGatewayQrLoginCancelRequest, + BotGatewayQrLoginStartRequest, + BotGatewayQrLoginWaitRequest, + BotGatewayQrWindowOpenRequest, + GatewayPluginAppConfig, + GatewayProviderConnectivityCheckRequest, + GatewayProviderProbeCandidatesRequest, + GatewayProviderProbeRequest, + GatewayStatus, + LocalAgentProviderImportRequest, + LocalAgentProviderProbeRequest, + PluginDependency, + PluginDirectorySelection, + PluginMarketplaceEntry, + ProfileApplyResult, + ProfileOpenRequest, + ProviderAccountResetRequest, + ProviderAccountSnapshotRequestOptions, + ProviderAccountTestRequest, + ProviderCatalogModelsRequest, + ProviderIconDetectionRequest, + ProviderManifestFetchRequest, + RequestLogDetailRequest, + RequestLogListFilter, + UsageStatsFilter, + UsageStatsRange +} from "@ccr/core/contracts/app"; + +export type WebManagementServerOptions = { + authToken?: string; + host?: string; + open?: boolean; + port?: number; + startGateway?: boolean; +}; + +export type WebManagementServerRuntime = { + close: () => Promise; + server: Server; + url: string; +}; + +type RpcRequest = { + args?: unknown[]; + method?: string; +}; + +type RpcHandler = (...args: unknown[]) => Promise | unknown; + +type WebManagementSecurityContext = { + allowIpLiteralHosts: boolean; + allowedHostnames: Set; + authToken: string; + port: number; +}; + +const defaultWebHost = "127.0.0.1"; +const defaultWebPort = 3458; +const onboardingFinishedAtSettingKey = "onboardingFinishedAt"; +const maxRpcBodyBytes = 8 * 1024 * 1024; +const webAuthHeader = "x-ccr-web-auth"; +const webAuthQueryParam = "ccr_web_token"; +const staticRoot = path.resolve(__dirname, "..", "renderer"); +const homeHtmlFile = path.join(staticRoot, "pages", "home", "index.html"); +const rendererAssetsRoot = path.join(staticRoot, "assets"); +const webBridgeScriptTag = ' '; + +const pluginMarketplace: PluginMarketplaceEntry[] = [ + { + capabilities: ["Wrapper runtime", "Claude App proxy", "Claude Design", "Model routing"], + dependencies: [], + description: "Routes Claude App Design traffic through the local CCR wrapper backend with configurable model routing.", + id: "claude-design", + modulePath: path.join(__dirname, "..", "marketplace", "plugins", "claude-design-plugin.cjs"), + name: "Claude Design" + }, + { + capabilities: ["Wrapper runtime", "Proxy mode", "Cursor", "Model routing", "OpenAI/Anthropic/Gemini forwarding"], + dependencies: [], + description: "Routes Cursor-compatible LLM traffic captured by proxy mode into the local CCR gateway.", + id: "cursor-proxy", + modulePath: path.join(__dirname, "..", "marketplace", "plugins", "cursor-proxy-plugin.cjs"), + name: "Cursor Proxy" + } +]; + +export async function startWebManagementServer(options: WebManagementServerOptions = {}): Promise { + const host = options.host?.trim() || readEnvString("CCR_WEB_HOST") || defaultWebHost; + const requestedPort = options.port ?? readEnvPort("CCR_WEB_PORT") ?? defaultWebPort; + const authToken = options.authToken?.trim() || readEnvString("CCR_WEB_AUTH_TOKEN") || randomBytes(32).toString("base64url"); + let security: WebManagementSecurityContext | undefined; + const server = createServer((request, response) => { + if (!security) { + sendJson(response, 503, { error: { message: "CCR web management server is not ready." }, ok: false }); + return; + } + void handleRequest(request, response, security).catch((error) => { + sendJson(response, 500, { error: { message: formatError(error) }, ok: false }); + }); + }); + + const listenedPort = await listenWithFallback(server, requestedPort, host); + const address = server.address(); + const port = typeof address === "object" && address ? address.port : listenedPort; + const baseUrl = `http://${formatListenHost(host)}:${port}/`; + const url = urlWithWebAuthToken(baseUrl, authToken); + security = createWebManagementSecurityContext(host, port, authToken); + + if (options.startGateway !== false) { + await startConfiguredServices("web startup"); + } + if (options.open) { + await openSystemExternal(url).catch((error) => { + console.warn(`[web] Failed to open ${url}: ${formatError(error)}`); + }); + } + + return { + close: async () => { + await closeServer(server); + await stopConfiguredServices(); + }, + server, + url + }; +} + +async function handleRequest(request: IncomingMessage, response: ServerResponse, security: WebManagementSecurityContext): Promise { + if (!isAllowedWebRequestHost(request, security)) { + sendText(response, 403, "Forbidden host"); + return; + } + + const url = requestUrl(request); + if (url.pathname === "/api/ccr/rpc") { + await handleRpcRequest(request, response, security); + return; + } + if (request.method !== "GET" && request.method !== "HEAD") { + sendText(response, 405, "Method not allowed"); + return; + } + if (url.pathname === "/" || url.pathname === "/pages/home/index.html") { + sendHomeHtml(response, request.method === "HEAD"); + return; + } + if (url.pathname.startsWith("/assets/")) { + sendStaticFile(response, rendererAssetsRoot, decodeURIComponent(url.pathname.slice("/assets/".length)), request.method === "HEAD"); + return; + } + sendText(response, 404, "Not found"); +} + +async function handleRpcRequest(request: IncomingMessage, response: ServerResponse, security: WebManagementSecurityContext): Promise { + if (request.method !== "POST") { + sendJson(response, 405, { error: { message: "RPC only supports POST." }, ok: false }); + return; + } + if (!isJsonRequest(request)) { + sendJson(response, 415, { error: { message: "RPC requests must use application/json." }, ok: false }); + return; + } + if (!isAllowedWebRequestOrigin(request, security)) { + sendJson(response, 403, { error: { message: "Forbidden RPC origin." }, ok: false }); + return; + } + if (!hasValidWebAuthToken(request, security)) { + sendJson(response, 401, { error: { message: "CCR web authentication token is missing or invalid." }, ok: false }); + return; + } + + let payload: RpcRequest; + try { + payload = JSON.parse((await readRequestBody(request, maxRpcBodyBytes)).toString("utf8")) as RpcRequest; + } catch (error) { + sendJson(response, 400, { error: { message: `Invalid JSON: ${formatError(error)}` }, ok: false }); + return; + } + + const method = typeof payload.method === "string" ? payload.method.trim() : ""; + const handler = rpcHandlers[method]; + if (!method || !handler) { + sendJson(response, 404, { error: { message: `Unknown CCR web RPC method: ${method || "(empty)"}` }, ok: false }); + return; + } + + try { + const value = await handler(...(Array.isArray(payload.args) ? payload.args : [])); + sendJson(response, 200, { ok: true, value }); + } catch (error) { + sendJson(response, 500, { error: { message: formatError(error) }, ok: false }); + } +} + +const unsupportedUpdateStatus: AppUpdateStatus = { + canCheck: false, + canDownload: false, + canInstall: false, + currentVersion: packageJson.version, + lastError: "Updates are only available in the desktop app.", + state: "idle", + supported: false +}; + +const rpcHandlers: Record = { + applyClaudeAppGateway: async (config?: unknown) => { + const previousConfig = await loadAppConfig(); + const baseConfig = config ? await saveAppConfig(config as AppConfig) : previousConfig; + const synced = await syncClaudeAppGatewayConfig(baseConfig); + const savedConfig = synced.config; + let runtimeStatus = gatewayService.getStatus(); + if (synced.configChanged || shouldRestartGatewayForRuntimeConfigChange(previousConfig, savedConfig) || runtimeStatus.state !== "running") { + runtimeStatus = await gatewayService.start(savedConfig); + } else { + gatewayService.updateConfig(savedConfig); + } + if (config || synced.configChanged) { + invalidateProviderAccountSnapshotCache(); + } + const gatewayDetail = runtimeStatus.state === "running" + ? "CCR gateway is running." + : `CCR gateway did not start: ${runtimeStatus.lastError || "unknown error"}`; + const apiKeyDetail = synced.result.apiKeyGenerated ? "Generated a Claude App API key." : "Reused an existing CCR API key."; + return { + ...synced.result, + message: `${synced.result.message}\n${gatewayDetail}\n${apiKeyDetail}` + }; + }, + applyProfile: async () => applyProfileConfig(await loadAppConfig()), + cancelBotGatewayQrLogin: (request) => cancelBotGatewayQrLogin(request as BotGatewayQrLoginCancelRequest), + checkProviderConnectivity: (request) => checkGatewayProviderConnectivity(request as GatewayProviderConnectivityCheckRequest), + clearProxyNetworkCaptures: () => proxyService.clearNetworkCaptures(), + closeBotGatewayQrWindow: (_request) => ({ closed: false }), + detectProviderIcon: (request) => detectProviderIcon(request as ProviderIconDetectionRequest), + exportData: () => exportAppData(), + fetchProviderManifest: (request) => fetchProviderManifest(request as ProviderManifestFetchRequest), + getAgentAnalysis: (filter) => getAgentAnalysis(filter as AgentAnalysisFilter | undefined), + getAgentTracePayload: (request) => getAgentTracePayload(request as AgentAnalysisTracePayloadRequest), + getAppInfo: () => getCliAppInfo(), + getConfig: () => loadAppConfig(), + getGatewayStatus: () => gatewayService.getStatus(), + getServiceIdentity: (serviceToken) => ({ + pid: process.pid, + serviceTokenConfigured: Boolean(process.env.CCR_SERVICE_INSTANCE_TOKEN?.trim()), + serviceTokenMatches: typeof serviceToken === "string" && + Boolean(serviceToken.trim()) && + serviceToken === process.env.CCR_SERVICE_INSTANCE_TOKEN + }), + getLocalAgentProviderCandidates: () => getLocalAgentProviderCandidates(), + getOnboardingFinished: async () => Boolean(readString(await loadPersistedAppSetting(onboardingFinishedAtSettingKey)) || existsSync(ONBOARDING_FINISHED_FILE)), + getPluginMarketplace: () => pluginMarketplace, + getProfileOpenCommand: async (request) => getProfileOpenCommand(await loadAppConfig(), request as ProfileOpenRequest), + getProfileRuntimeStatus: () => getProfileRuntimeStatus(), + getProviderAccountSnapshots: (provider, options) => getProviderAccountSnapshots(provider as string | undefined, options as ProviderAccountSnapshotRequestOptions | undefined), + getProviderCatalogModels: (request) => getProviderCatalogModels(request as ProviderCatalogModelsRequest), + getProviderPresets: () => getProviderPresets(), + getProxyCertificateStatus: () => proxyService.getCertificateStatus(), + getProxyNetworkCaptures: () => proxyService.getNetworkCaptures(), + getProxyStatus: () => proxyService.getStatus(), + getRequestLogDetail: (request) => getRequestLogDetail(request as RequestLogDetailRequest), + getRequestLogs: (filter) => getRequestLogs(filter as RequestLogListFilter | undefined), + getUpdateStatus: () => unsupportedUpdateStatus, + getUsageStats: (range, filter) => getUsageStats(range as UsageStatsRange | undefined, filter as UsageStatsFilter | undefined), + importLocalAgentProvider: (request) => importLocalAgentProvider(request as LocalAgentProviderImportRequest), + installProxyCertificate: () => proxyService.installCertificate(), + listMcpServerTools: async (serverName) => { + const name = typeof serverName === "string" ? serverName.trim() : ""; + if (!name) { + throw new Error("MCP server name is required."); + } + const config = await loadAppConfig(); + const server = config.agent.mcpServers.find((candidate) => candidate.name === name); + if (!server) { + throw new Error("MCP server must be saved before tool discovery."); + } + return listMcpServerTools(server); + }, + openBotGatewayQrWindow: async (request) => { + const qrRequest = request as BotGatewayQrWindowOpenRequest; + await openSystemExternal(qrRequest.url); + return { + message: "Opened the QR login URL in your default browser.", + observed: false, + opened: true + }; + }, + openBuiltInBrowser: async () => { + const config = await loadAppConfig(); + const appUrl = firstConfiguredBrowserAppUrl(config) || "about:blank"; + if (appUrl === "about:blank") { + throw new Error("No browser app is configured."); + } + await openSystemExternal(appUrl); + }, + openProfile: async (request) => { + const syncedClaudeAppConfig = await syncClaudeAppGatewayConfig(await loadAppConfig()); + const config = syncedClaudeAppConfig.config; + const status = await gatewayService.start(config); + if (status.state !== "running") { + throw new Error(status.lastError || "CCR gateway did not start."); + } + logProfileApplyResult(await applyProfileConfig(config)); + return openProfileFromCcr(config, request as ProfileOpenRequest); + }, + probeLocalAgentProvider: (request) => probeLocalAgentProvider(request as LocalAgentProviderProbeRequest), + probeProvider: (request) => probeGatewayProvider(request as GatewayProviderProbeRequest), + probeProviderCandidates: (request) => probeGatewayProviderCandidates(request as GatewayProviderProbeCandidatesRequest), + quitApp: async () => { + setTimeout(() => process.kill(process.pid, "SIGTERM"), 50).unref(); + }, + restartGateway: async () => { + const syncedClaudeAppConfig = await syncClaudeAppGatewayConfig(await loadAppConfig()); + const config = syncedClaudeAppConfig.config; + const status = await gatewayService.start(config); + await applyProfileIfServiceRunning(config, status); + return status; + }, + restartProxy: async () => { + const syncedClaudeAppConfig = await syncClaudeAppGatewayConfig(await loadAppConfig()); + const config = syncedClaudeAppConfig.config; + const status = await gatewayService.start(config); + await applyProfileIfServiceRunning(config, status); + return proxyService.getStatus(); + }, + revealProxyCertificate: async () => { + ensureProxyCertificateAuthority(); + await revealFile(PROXY_CA_CERT_FILE); + }, + resetCodexRateLimitCredit: (request) => resetCodexRateLimitCredit(request as ProviderAccountResetRequest), + saveApiKeys: async (apiKeys) => { + const savedConfig = await saveApiKeysConfig(apiKeys as ApiKeyConfig[]); + const syncedClaudeAppConfig = await syncClaudeAppGatewayConfig(savedConfig); + const nextConfig = syncedClaudeAppConfig.config; + gatewayService.updateConfig(nextConfig); + logProfileApplyResult(await applyProfileConfig(nextConfig)); + invalidateProviderAccountSnapshotCache(); + return nextConfig; + }, + saveConfig: async (config, options) => { + const previousConfig = await loadAppConfig(); + const nextInput = config as AppConfig; + if (nextInput.proxy.enabled) { + const certificateStatus = await proxyService.getCertificateStatus(); + if (!certificateStatus.trusted) { + throw new Error(certificateStatus.message); + } + } + let savedConfig = await saveAppConfig(nextInput); + const syncedClaudeAppConfig = await syncClaudeAppGatewayConfig(savedConfig); + savedConfig = syncedClaudeAppConfig.config; + let runtimeStatus = gatewayService.getStatus(); + if (syncedClaudeAppConfig.configChanged || shouldRestartGatewayForRuntimeConfigChange(previousConfig, savedConfig)) { + runtimeStatus = await gatewayService.start(savedConfig); + } else { + gatewayService.updateConfig(savedConfig); + } + if ((options as AppSaveConfigOptions | undefined)?.applyProfile !== false) { + await applyProfileIfServiceRunning(savedConfig, runtimeStatus); + } + invalidateProviderAccountSnapshotCache(); + return savedConfig; + }, + scanBotHandoffBluetoothTargets: () => scanBotHandoffBluetoothTargets(), + scanBotHandoffWifiTargets: () => scanBotHandoffWifiTargets(), + selectPluginDirectory: (directory) => inspectPluginDirectory(readRequiredString(directory, "Plugin directory path is required.")), + setOnboardingFinished: async () => { + await replacePersistedAppSetting(onboardingFinishedAtSettingKey, new Date().toISOString()); + return true; + }, + setProxyNetworkCaptureEnabled: (enabled) => proxyService.setNetworkCaptureEnabled(Boolean(enabled)), + startBotGatewayQrLogin: (request) => startBotGatewayQrLogin(request as BotGatewayQrLoginStartRequest), + startGateway: async () => { + const syncedClaudeAppConfig = await syncClaudeAppGatewayConfig(await loadAppConfig()); + const config = syncedClaudeAppConfig.config; + const status = await gatewayService.start(config); + await applyProfileIfServiceRunning(config, status); + return status; + }, + stopGateway: () => gatewayService.stop(), + stopProfile: async (request) => stopProfileFromCcr(await loadAppConfig(), request as ProfileOpenRequest), + testProviderAccountConnector: (request) => testProviderAccountConnector(request as ProviderAccountTestRequest), + updateCheck: () => unsupportedUpdateStatus, + updateDownload: () => unsupportedUpdateStatus, + updateInstall: () => { + throw new Error("Updates are only available in the desktop app."); + }, + waitBotGatewayQrLogin: (request) => waitBotGatewayQrLogin(request as BotGatewayQrLoginWaitRequest) +}; + +async function startConfiguredServices(reason: string): Promise { + try { + let config = await loadAppConfig(); + try { + config = (await syncClaudeAppGatewayConfig(config)).config; + } catch (error) { + console.error(`Failed to sync Claude App gateway config during ${reason}: ${formatError(error)}`); + } + const status = await gatewayService.start(config); + if (status.state === "error") { + console.error(`Failed to start gateway during ${reason}: ${status.lastError}`); + } + if (status.state === "running") { + const profileResult = await applyProfileConfig(config); + logProfileApplyResult(profileResult); + } + if (config.proxy.enabled && config.proxy.systemProxy) { + const proxyStatus = await proxyService.ensureSystemProxyActive(); + if (proxyStatus.systemProxy.state !== "active") { + const details = proxyStatus.systemProxy.lastError ? `: ${proxyStatus.systemProxy.lastError}` : ""; + console.error(`Proxy mode is enabled, but system proxy is ${proxyStatus.systemProxy.state} during ${reason}${details}`); + } + } + } catch (error) { + console.error(`Failed to start configured services during ${reason}: ${formatError(error)}`); + } +} + +async function stopConfiguredServices(): Promise { + await gatewayService.stop({ proxyRestoreTimeoutMs: 30_000 }).catch((error) => { + console.error(`Failed to stop gateway: ${formatError(error)}`); + }); + try { + restoreClaudeAppGatewayConfig(); + } catch (error) { + console.error(`Failed to restore Claude App gateway config: ${formatError(error)}`); + } +} + +async function applyProfileIfServiceRunning(config: AppConfig, status: GatewayStatus): Promise { + if (status.state !== "running") { + return; + } + logProfileApplyResult(await applyProfileConfig(config)); +} + +function logProfileApplyResult(result: ProfileApplyResult): void { + for (const client of result.clients) { + if (!client.ok) { + console.warn(`[profile:${client.client}] ${client.message}`); + } + } +} + +function getCliAppInfo(): AppInfo { + return { + appConfigDbFile: APP_CONFIG_DB_FILE, + apiKeysDbFile: API_KEYS_DB_FILE, + configDir: CONFIGDIR, + configFile: CONFIG_FILE, + dataDir: DATADIR, + gatewayConfigFile: GATEWAY_CONFIG_FILE, + launchAtLoginSupported: false, + name: APP_NAME, + platform: process.platform, + requestLogsDbFile: REQUEST_LOGS_DB_FILE, + usageDbFile: USAGE_DB_FILE, + version: packageJson.version + }; +} + +function sendHomeHtml(response: ServerResponse, headOnly: boolean): void { + if (!existsSync(homeHtmlFile)) { + sendText(response, 500, "CCR renderer assets were not found. Run npm run build:assets first."); + return; + } + let html = readFileSync(homeHtmlFile, "utf8"); + if (!html.includes("web-client-bridge.js")) { + html = html.replace(' ', `${webBridgeScriptTag}\n `); + } + sendBuffer(response, 200, Buffer.from(html, "utf8"), "text/html; charset=utf-8", headOnly); +} + +function sendStaticFile(response: ServerResponse, root: string, relativePath: string, headOnly: boolean): void { + const normalizedRelativePath = relativePath.replace(/^[/\\]+/, ""); + const file = path.resolve(root, normalizedRelativePath); + const resolvedRoot = path.resolve(root); + if (!file.startsWith(`${resolvedRoot}${path.sep}`) && file !== resolvedRoot) { + sendText(response, 403, "Forbidden"); + return; + } + if (!isFile(file)) { + sendText(response, 404, "Not found"); + return; + } + sendBuffer(response, 200, readFileSync(file), contentTypeForFile(file), headOnly); +} + +function sendBuffer(response: ServerResponse, status: number, body: Buffer, contentType: string, headOnly: boolean): void { + response.writeHead(status, { + "cache-control": "no-store", + "content-length": body.length, + "content-type": contentType, + "x-content-type-options": "nosniff" + }); + if (headOnly) { + response.end(); + return; + } + response.end(body); +} + +function sendJson(response: ServerResponse, status: number, payload: unknown): void { + const body = Buffer.from(JSON.stringify(payload), "utf8"); + response.writeHead(status, { + "cache-control": "no-store", + "content-length": body.length, + "content-type": "application/json; charset=utf-8", + "x-content-type-options": "nosniff" + }); + response.end(body); +} + +function sendText(response: ServerResponse, status: number, text: string): void { + sendBuffer(response, status, Buffer.from(`${text}\n`, "utf8"), "text/plain; charset=utf-8", false); +} + +function requestUrl(request: IncomingMessage): URL { + return new URL(request.url || "/", `http://${request.headers.host || "127.0.0.1"}`); +} + +function createWebManagementSecurityContext(host: string, port: number, authToken: string): WebManagementSecurityContext { + const normalizedHost = normalizeHostname(host); + const allowedHostnames = new Set(["localhost", "127.0.0.1", "::1", "0:0:0:0:0:0:0:1"]); + if (normalizedHost) { + allowedHostnames.add(normalizedHost); + } + return { + allowIpLiteralHosts: isWildcardBindHost(normalizedHost), + allowedHostnames, + authToken, + port + }; +} + +function urlWithWebAuthToken(value: string, authToken: string): string { + const url = new URL(value); + url.searchParams.set(webAuthQueryParam, authToken); + return url.toString(); +} + +function isAllowedWebRequestHost(request: IncomingMessage, security: WebManagementSecurityContext): boolean { + const hostname = requestHostname(request); + return Boolean(hostname && isAllowedWebHostname(hostname, security)); +} + +function isAllowedWebRequestOrigin(request: IncomingMessage, security: WebManagementSecurityContext): boolean { + const origin = readHeaderValue(request.headers.origin); + if (origin && !isAllowedWebOriginValue(origin, security)) { + return false; + } + + const referer = readHeaderValue(request.headers.referer); + if (!origin && referer && !isAllowedWebOriginValue(referer, security)) { + return false; + } + + return true; +} + +function isAllowedWebOriginValue(value: string, security: WebManagementSecurityContext): boolean { + try { + const url = new URL(value); + const port = url.port ? Number(url.port) : url.protocol === "http:" ? 80 : url.protocol === "https:" ? 443 : undefined; + return url.protocol === "http:" && + port === security.port && + isAllowedWebHostname(normalizeHostname(url.hostname), security); + } catch { + return false; + } +} + +function isAllowedWebHostname(hostname: string, security: WebManagementSecurityContext): boolean { + const normalized = normalizeHostname(hostname); + return security.allowedHostnames.has(normalized) || + (security.allowIpLiteralHosts && Boolean(net.isIP(normalized))); +} + +function requestHostname(request: IncomingMessage): string | undefined { + const host = readHeaderValue(request.headers.host); + if (!host) { + return undefined; + } + try { + return normalizeHostname(new URL(`http://${host}`).hostname); + } catch { + return undefined; + } +} + +function isJsonRequest(request: IncomingMessage): boolean { + const contentType = readHeaderValue(request.headers["content-type"])?.toLowerCase() ?? ""; + return contentType.split(";")[0]?.trim() === "application/json"; +} + +function hasValidWebAuthToken(request: IncomingMessage, security: WebManagementSecurityContext): boolean { + const token = readHeaderValue(request.headers[webAuthHeader]); + return constantTimeEquals(token, security.authToken); +} + +function constantTimeEquals(value: string | undefined, expected: string): boolean { + if (!value) { + return false; + } + const valueBuffer = Buffer.from(value); + const expectedBuffer = Buffer.from(expected); + return valueBuffer.length === expectedBuffer.length && timingSafeEqual(valueBuffer, expectedBuffer); +} + +function readHeaderValue(value: string | string[] | undefined): string | undefined { + if (Array.isArray(value)) { + return readString(value[0]); + } + return readString(value); +} + +function normalizeHostname(value: string): string { + return value.trim().toLowerCase().replace(/^\[|\]$/g, "").replace(/\.$/, ""); +} + +function isWildcardBindHost(host: string): boolean { + return host === "" || host === "0.0.0.0" || host === "::" || host === "::0"; +} + +function readRequestBody(request: IncomingMessage, maxBytes: number): Promise { + return new Promise((resolve, reject) => { + const chunks: Buffer[] = []; + let totalBytes = 0; + request.on("data", (chunk: Buffer) => { + totalBytes += chunk.length; + if (totalBytes > maxBytes) { + reject(new Error(`Request body exceeds ${maxBytes} bytes.`)); + request.destroy(); + return; + } + chunks.push(chunk); + }); + request.once("end", () => resolve(Buffer.concat(chunks))); + request.once("error", reject); + }); +} + +async function listenWithFallback(server: Server, port: number, host: string): Promise { + let candidate = port; + for (let attempt = 0; attempt < 20; attempt += 1) { + try { + await listen(server, candidate, host); + return candidate; + } catch (error) { + if (!isAddressInUseError(error) || candidate >= 65535) { + throw error; + } + candidate += 1; + } + } + throw new Error(`No available CCR web management port found starting at ${port}.`); +} + +function listen(server: Server, port: number, host: string): Promise { + return new Promise((resolve, reject) => { + const onError = (error: Error) => { + server.off("listening", onListening); + reject(error); + }; + const onListening = () => { + server.off("error", onError); + resolve(); + }; + server.once("error", onError); + server.once("listening", onListening); + server.listen(port, host); + }); +} + +function closeServer(server: Server): Promise { + return new Promise((resolve, reject) => { + server.close((error) => error ? reject(error) : resolve()); + }); +} + +async function exportAppData(): Promise { + const exportedAt = new Date().toISOString(); + const exportDir = defaultExportDir(); + mkdirSync(exportDir, { recursive: true }); + const file = path.join(exportDir, `claude-code-router-data-${fileSafeTimestamp(exportedAt)}.json`); + assertExportTargetIsNotInternalDataFile(file); + const payload = { + app: { + name: APP_NAME, + platform: process.platform, + version: packageJson.version + }, + appState: { + onboardingFinished: Boolean(readString(await loadPersistedAppSetting(onboardingFinishedAtSettingKey)) || existsSync(ONBOARDING_FINISHED_FILE)) + }, + config: await loadAppConfig(), + exportedAt, + files: readDataExportFiles(), + kind: "claude-code-router-data-export", + version: 1 + }; + + writeFileSync(file, `${JSON.stringify(payload, null, 2)}\n`, { encoding: "utf8", mode: 0o600 }); + return { + canceled: false, + exportedAt, + file + }; +} + +function defaultExportDir(): string { + const downloads = path.join(os.homedir(), "Downloads"); + return existsSync(downloads) ? downloads : CONFIGDIR; +} + +function readDataExportFiles(): Array<{ base64: string; name: string; path: string; sizeBytes: number }> { + const files: Array<{ base64: string; name: string; path: string; sizeBytes: number }> = []; + for (const file of dataExportCandidateFiles()) { + try { + if (!isFile(file)) { + continue; + } + const stat = statSync(file); + files.push({ + base64: readFileSync(file).toString("base64"), + name: path.basename(file), + path: file, + sizeBytes: stat.size + }); + } catch (error) { + console.warn(`[export] Failed to include ${file}: ${formatError(error)}`); + } + } + return files; +} + +function dataExportCandidateFiles(): string[] { + return uniqueStrings([ + ...sqliteDataFiles(APP_CONFIG_DB_FILE), + ...sqliteDataFiles(API_KEYS_DB_FILE), + ...sqliteDataFiles(REQUEST_LOGS_DB_FILE), + ...sqliteDataFiles(USAGE_DB_FILE) + ]); +} + +function sqliteDataFiles(file: string): string[] { + return [file, `${file}-wal`, `${file}-shm`]; +} + +function assertExportTargetIsNotInternalDataFile(file: string): void { + const target = path.resolve(file); + const reserved = new Set([ + CONFIG_FILE, + LEGACY_CONFIG_FILE, + APP_CONFIG_DB_FILE, + API_KEYS_DB_FILE, + REQUEST_LOGS_DB_FILE, + USAGE_DB_FILE, + ...dataExportCandidateFiles() + ].map((item) => path.resolve(item))); + if (reserved.has(target)) { + throw new Error("Choose a different export path. Internal CCR data files cannot be overwritten."); + } +} + +function inspectPluginDirectory(directory: string): PluginDirectorySelection { + const manifest = readFirstJson([ + path.join(directory, "plugin.json"), + path.join(directory, "ccr-plugin.json"), + path.join(directory, ".ccr-plugin", "plugin.json"), + path.join(directory, ".codex-plugin", "plugin.json") + ]); + const packageJsonManifest = readFirstJson([path.join(directory, "package.json")]); + const moduleValue = + readString(manifest?.module) || + readString(manifest?.main) || + readString(manifest?.path) || + readString(readRecord(packageJsonManifest?.ccr)?.module) || + readString(readRecord(packageJsonManifest?.ccrPlugin)?.module) || + readString(packageJsonManifest?.main); + const id = + pluginIdValue(readString(manifest?.id) || readString(manifest?.key) || readString(packageJsonManifest?.name)) || + pluginIdValue(path.basename(directory)) || + "plugin"; + const name = readString(manifest?.name) || readString(packageJsonManifest?.displayName) || readString(packageJsonManifest?.name); + const apps = readPluginApps(manifest, packageJsonManifest); + return { + ...(apps.length ? { apps } : {}), + dependencies: readPluginDependencies(directory, manifest, packageJsonManifest), + directory, + id, + modulePath: resolvePluginDirectoryModule(directory, moduleValue), + ...(name ? { name } : {}) + }; +} + +function readPluginApps( + manifest: Record | undefined, + packageJsonManifest: Record | undefined +): GatewayPluginAppConfig[] { + const values = [ + manifest?.apps, + readRecord(manifest?.ccr)?.apps, + readRecord(manifest?.ccrPlugin)?.apps, + readRecord(packageJsonManifest?.ccr)?.apps, + readRecord(packageJsonManifest?.ccrPlugin)?.apps + ]; + const apps = values.flatMap(parsePluginApps); + const byId = new Map(); + for (const app of apps) { + const key = app.id || `${app.name}:${app.url}`; + if (!byId.has(key)) { + byId.set(key, app); + } + } + return [...byId.values()]; +} + +function parsePluginApps(value: unknown): GatewayPluginAppConfig[] { + if (!Array.isArray(value)) { + return []; + } + return value.map(parsePluginAppItem).filter((item): item is GatewayPluginAppConfig => Boolean(item)); +} + +function parsePluginAppItem(value: unknown): GatewayPluginAppConfig | undefined { + if (!value || typeof value !== "object" || Array.isArray(value)) { + return undefined; + } + + const record = value as Record; + const name = readString(record.name) || readString(record.title); + const url = readString(record.url) || readString(record.href) || readString(record.target); + if (!name || !url) { + return undefined; + } + const id = pluginIdValue(readString(record.id) || name); + const description = readString(record.description); + const icon = readString(record.icon); + return { + ...(description ? { description } : {}), + ...(icon ? { icon } : {}), + ...(id ? { id } : {}), + name, + url + }; +} + +function readPluginDependencies( + directory: string, + manifest: Record | undefined, + packageJsonManifest: Record | undefined +): PluginDependency[] { + const values = [ + manifest?.dependencies, + manifest?.pluginDependencies, + readRecord(manifest?.ccr)?.dependencies, + readRecord(manifest?.ccrPlugin)?.dependencies, + readRecord(packageJsonManifest?.ccr)?.dependencies, + readRecord(packageJsonManifest?.ccrPlugin)?.dependencies + ]; + const dependencies = values.flatMap((value) => parsePluginDependencies(value, directory)); + const byId = new Map(); + for (const dependency of dependencies) { + if (dependency.id && !byId.has(dependency.id)) { + byId.set(dependency.id, dependency); + } + } + return [...byId.values()]; +} + +function parsePluginDependencies(value: unknown, directory: string): PluginDependency[] { + if (Array.isArray(value)) { + return value.map((item) => parsePluginDependencyItem(item, directory)).filter((item): item is PluginDependency => Boolean(item)); + } + if (value && typeof value === "object" && !Array.isArray(value)) { + return Object.entries(value as Record) + .map(([id, item]) => parsePluginDependencyEntry(id, item, directory)) + .filter((item): item is PluginDependency => Boolean(item)); + } + return []; +} + +function parsePluginDependencyEntry(idValue: string, value: unknown, directory: string): PluginDependency | undefined { + if (value && typeof value === "object" && !Array.isArray(value)) { + return parsePluginDependencyItem({ id: idValue, ...(value as Record) }, directory); + } + + const id = pluginIdValue(idValue); + if (!id) { + return undefined; + } + const specifier = readString(value); + const modulePath = specifier && looksLikeDependencyModulePath(specifier) ? resolveDependencyModulePath(directory, specifier) : undefined; + return { + id, + ...(modulePath ? { modulePath } : {}) + }; +} + +function parsePluginDependencyItem(value: unknown, directory: string): PluginDependency | undefined { + if (typeof value === "string") { + const id = pluginIdValue(value); + return id ? { id } : undefined; + } + if (!value || typeof value !== "object" || Array.isArray(value)) { + return undefined; + } + + const record = value as Record; + const id = pluginIdValue(readString(record.id) || readString(record.key) || readString(record.name)); + if (!id) { + return undefined; + } + const moduleValue = readString(record.module) || readString(record.path) || readString(record.modulePath); + const modulePath = moduleValue ? resolveDependencyModulePath(directory, moduleValue) : undefined; + const name = readString(record.name); + return { + id, + ...(modulePath ? { modulePath } : {}), + ...(name ? { name } : {}) + }; +} + +function resolveDependencyModulePath(directory: string, value: string): string { + if (value === "~" || value.startsWith("~/")) { + return path.join(os.homedir(), value.slice(2)); + } + return path.isAbsolute(value) ? value : path.join(directory, value); +} + +function looksLikeDependencyModulePath(value: string): boolean { + return value.startsWith(".") || value.startsWith("/") || value.startsWith("~"); +} + +function resolvePluginDirectoryModule(directory: string, moduleValue: string | undefined): string { + if (moduleValue) { + return path.isAbsolute(moduleValue) ? moduleValue : path.join(directory, moduleValue); + } + + for (const filename of ["index.cjs", "index.mjs", "index.js", "plugin.cjs", "plugin.mjs", "plugin.js"]) { + const candidate = path.join(directory, filename); + if (isFile(candidate)) { + return candidate; + } + } + + return directory; +} + +function readFirstJson(files: string[]): Record | undefined { + for (const file of files) { + if (!isFile(file)) { + continue; + } + try { + const parsed = JSON.parse(readFileSync(file, "utf8")) as unknown; + if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) { + return parsed as Record; + } + } catch { + // Ignore invalid plugin metadata and fall back to directory inference. + } + } + return undefined; +} + +function readRecord(value: unknown): Record | undefined { + return value && typeof value === "object" && !Array.isArray(value) ? value as Record : undefined; +} + +function firstConfiguredBrowserAppUrl(config: AppConfig): string | undefined { + for (const plugin of config.plugins) { + if (plugin.enabled === false) { + continue; + } + const app = plugin.apps?.find((candidate) => readString(candidate.url)); + if (app?.url) { + return app.url; + } + } + return undefined; +} + +async function revealFile(file: string): Promise { + if (process.platform === "darwin") { + await execDetached("/usr/bin/open", ["-R", file]); + return; + } + if (process.platform === "win32") { + await execDetached("explorer.exe", ["/select,", file]); + return; + } + await execDetached("xdg-open", [path.dirname(file)]); +} + +export function openSystemExternal(target: string): Promise { + const url = normalizeExternalHttpTarget(target); + if (!url) { + return Promise.resolve(); + } + if (process.platform === "darwin") { + return execDetached("/usr/bin/open", [url]); + } + if (process.platform === "win32") { + return execDetached("rundll32.exe", ["url.dll,FileProtocolHandler", url]); + } + return execDetached("xdg-open", [url]); +} + +export function normalizeExternalHttpTarget(target: unknown): string | undefined { + const trimmed = typeof target === "string" ? target.trim() : ""; + if (!trimmed || trimmed === "about:blank") { + return undefined; + } + let url: URL; + try { + url = new URL(trimmed); + } catch { + throw new Error("External URL must be a valid absolute URL."); + } + if (url.protocol !== "http:" && url.protocol !== "https:") { + throw new Error("Only http and https URLs can be opened."); + } + return url.toString(); +} + +function execDetached(command: string, args: string[]): Promise { + return new Promise((resolve, reject) => { + const child = spawn(command, args, { + detached: true, + stdio: "ignore", + windowsHide: true + }); + child.once("error", reject); + child.once("spawn", () => { + child.unref(); + resolve(); + }); + }); +} + +function contentTypeForFile(file: string): string { + switch (path.extname(file).toLowerCase()) { + case ".css": + return "text/css; charset=utf-8"; + case ".gif": + return "image/gif"; + case ".html": + return "text/html; charset=utf-8"; + case ".ico": + return "image/x-icon"; + case ".js": + return "text/javascript; charset=utf-8"; + case ".jpg": + case ".jpeg": + return "image/jpeg"; + case ".png": + return "image/png"; + case ".svg": + return "image/svg+xml"; + case ".webp": + return "image/webp"; + default: + return "application/octet-stream"; + } +} + +function readRequiredString(value: unknown, message: string): string { + const text = readString(value); + if (!text) { + throw new Error(message); + } + return text; +} + +function readString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function readEnvString(key: string): string | undefined { + return readString(process.env[key]); +} + +function readEnvPort(key: string): number | undefined { + const value = Number(process.env[key]); + return Number.isInteger(value) && value > 0 && value < 65536 ? value : undefined; +} + +function pluginIdValue(value: string | undefined): string { + return value?.toLowerCase().replace(/^@/, "").replace(/[^a-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || ""; +} + +function isFile(file: string): boolean { + try { + return existsSync(file) && statSync(file).isFile(); + } catch { + return false; + } +} + +function uniqueStrings(values: string[]): string[] { + const seen = new Set(); + const result: string[] = []; + for (const value of values) { + if (!value || seen.has(value)) { + continue; + } + seen.add(value); + result.push(value); + } + return result; +} + +function fileSafeTimestamp(value: string): string { + return value.replace(/[:.]/g, "-"); +} + +function formatListenHost(host: string): string { + return host.includes(":") && !host.startsWith("[") ? `[${host}]` : host; +} + +function isAddressInUseError(error: unknown): boolean { + return typeof error === "object" && error !== null && "code" in error && (error as { code?: unknown }).code === "EADDRINUSE"; +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json new file mode 100644 index 0000000..1f70006 --- /dev/null +++ b/packages/core/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "src" + }, + "include": ["src/**/*.ts", "src/**/*.d.ts"] +} diff --git a/packages/electron/assets/logo.png b/packages/electron/assets/logo.png new file mode 100644 index 0000000..76801d1 Binary files /dev/null and b/packages/electron/assets/logo.png differ diff --git a/packages/electron/assets/tray-cyan.png b/packages/electron/assets/tray-cyan.png new file mode 100644 index 0000000..b259c8a Binary files /dev/null and b/packages/electron/assets/tray-cyan.png differ diff --git a/packages/electron/assets/tray-orange.png b/packages/electron/assets/tray-orange.png new file mode 100644 index 0000000..8b7b544 Binary files /dev/null and b/packages/electron/assets/tray-orange.png differ diff --git a/packages/electron/assets/tray-violet.png b/packages/electron/assets/tray-violet.png new file mode 100644 index 0000000..65e5d81 Binary files /dev/null and b/packages/electron/assets/tray-violet.png differ diff --git a/packages/electron/assets/tray.png b/packages/electron/assets/tray.png new file mode 100644 index 0000000..b259c8a Binary files /dev/null and b/packages/electron/assets/tray.png differ diff --git a/packages/electron/package.json b/packages/electron/package.json new file mode 100644 index 0000000..1e55555 --- /dev/null +++ b/packages/electron/package.json @@ -0,0 +1,13 @@ +{ + "name": "@claude-code-router/electron", + "version": "3.0.11", + "private": true, + "description": "Claude Code Router Electron desktop shell.", + "main": "dist/main/main.js", + "dependencies": { + "better-sqlite3": "^12.11.1" + }, + "devDependencies": { + "electron-updater": "^6.8.9" + } +} diff --git a/packages/electron/src/main/app-menu.ts b/packages/electron/src/main/app-menu.ts new file mode 100644 index 0000000..b601dbc --- /dev/null +++ b/packages/electron/src/main/app-menu.ts @@ -0,0 +1,154 @@ +import { app, dialog, Menu, type BrowserWindow, type MenuItemConstructorOptions } from "electron"; +import { APP_NAME, IPC_CHANNELS } from "@ccr/core/config/constants"; +import windowsManager from "./windows"; + +export function setupApplicationMenu(): void { + Menu.setApplicationMenu(Menu.buildFromTemplate(createMenuTemplate())); +} + +function createMenuTemplate(): MenuItemConstructorOptions[] { + const template: MenuItemConstructorOptions[] = []; + + if (process.platform === "darwin") { + template.push({ + label: APP_NAME, + submenu: [ + { label: `About ${APP_NAME}`, click: showAboutPanel }, + { type: "separator" }, + { label: "Settings...", accelerator: "CmdOrCtrl+,", click: openSettings }, + { label: "Check for Updates...", click: checkForUpdatesFromMenu }, + { type: "separator" }, + { role: "services" }, + { type: "separator" }, + { role: "hide" }, + { role: "hideOthers" }, + { role: "unhide" }, + { type: "separator" }, + { role: "quit" } + ] + }); + } else { + template.push({ + label: "File", + submenu: [ + { label: "Settings...", accelerator: "Ctrl+,", click: openSettings }, + { type: "separator" }, + { role: "quit" } + ] + }); + } + + template.push( + { + label: "Edit", + submenu: [ + { role: "undo" }, + { role: "redo" }, + { type: "separator" }, + { role: "cut" }, + { role: "copy" }, + { role: "paste" }, + ...(process.platform === "darwin" + ? [ + { role: "pasteAndMatchStyle" as const }, + { role: "delete" as const }, + { role: "selectAll" as const }, + { type: "separator" as const }, + { + label: "Speech", + submenu: [ + { role: "startSpeaking" as const }, + { role: "stopSpeaking" as const } + ] + } + ] + : [ + { role: "delete" as const }, + { type: "separator" as const }, + { role: "selectAll" as const } + ]) + ] + }, + { + label: "View", + submenu: [ + { role: "reload" }, + { role: "forceReload" }, + { role: "toggleDevTools" }, + { type: "separator" }, + { role: "resetZoom" }, + { role: "zoomIn" }, + { role: "zoomOut" }, + { type: "separator" }, + { role: "togglefullscreen" } + ] + }, + { + label: "Window", + submenu: process.platform === "darwin" + ? [ + { role: "minimize" }, + { role: "zoom" }, + { type: "separator" }, + { role: "front" } + ] + : [ + { role: "minimize" }, + { role: "close" } + ] + } + ); + + if (process.platform !== "darwin") { + template.push({ + label: "Help", + submenu: [ + { label: "Check for Updates...", click: checkForUpdatesFromMenu }, + { type: "separator" }, + { label: `About ${APP_NAME}`, click: showAboutPanel } + ] + }); + } + + return template; +} + +function openSettings(): void { + const window = windowsManager.showMainWindow(); + sendWhenReady(window, IPC_CHANNELS.appOpenSettings); +} + +function showAboutPanel(): void { + const window = windowsManager.getWindow("main"); + const options = { + detail: `Version ${app.getVersion()}`, + message: APP_NAME, + title: `About ${APP_NAME}`, + type: "info" + } as const; + void (window ? dialog.showMessageBox(window, options) : dialog.showMessageBox(options)); +} + +function checkForUpdatesFromMenu(): void { + const window = windowsManager.showMainWindow(); + sendWhenReady(window, IPC_CHANNELS.appOpenUpdate); +} + +function sendWhenReady(window: BrowserWindow, channel: string): void { + if (window.isDestroyed() || window.webContents.isDestroyed()) { + return; + } + + const send = () => { + if (!window.isDestroyed() && !window.webContents.isDestroyed()) { + window.webContents.send(channel); + } + }; + + if (window.webContents.isLoading()) { + window.webContents.once("did-finish-load", send); + return; + } + + send(); +} diff --git a/packages/electron/src/main/bot-gateway-qr-window-service.ts b/packages/electron/src/main/bot-gateway-qr-window-service.ts new file mode 100644 index 0000000..a65d490 --- /dev/null +++ b/packages/electron/src/main/bot-gateway-qr-window-service.ts @@ -0,0 +1,126 @@ +import { BrowserWindow, shell } from "electron"; +import type { + BotGatewayQrWindowCloseRequest, + BotGatewayQrWindowCloseResult, + BotGatewayQrWindowOpenRequest, + BotGatewayQrWindowOpenResult +} from "@ccr/core/contracts/app"; + +const qrWindows = new Map(); + +export async function openBotGatewayQrWindow( + request: BotGatewayQrWindowOpenRequest +): Promise { + const sessionId = request.sessionId.trim(); + if (!sessionId) { + throw new Error("QR window sessionId is required."); + } + + const url = parseQrWindowUrl(request.url); + const existing = qrWindows.get(sessionId); + if (existing && !existing.isDestroyed()) { + if (existing.webContents.getURL() !== url) { + await loadQrWindowUrl(existing, url, Boolean(request.waitForScan)); + } + existing.show(); + existing.focus(); + if (request.waitForScan) { + return { opened: true, ...await waitForQrWindowClose(existing) }; + } + return { opened: true }; + } + + const window = new BrowserWindow({ + height: 760, + minHeight: 560, + minWidth: 380, + show: true, + title: request.title?.trim() || "Weixin Login", + webPreferences: { + contextIsolation: true, + nodeIntegration: false, + sandbox: true, + webSecurity: true + }, + width: 460 + }); + + qrWindows.set(sessionId, window); + window.on("closed", () => { + if (qrWindows.get(sessionId) === window) { + qrWindows.delete(sessionId); + } + }); + window.webContents.setWindowOpenHandler(({ url: targetUrl }) => { + if (isHttpUrl(targetUrl)) { + void shell.openExternal(targetUrl); + } + return { action: "deny" }; + }); + + window.show(); + window.focus(); + await loadQrWindowUrl(window, url, Boolean(request.waitForScan)); + if (!window.isDestroyed()) { + window.show(); + window.focus(); + } + if (request.waitForScan) { + return { opened: true, ...await waitForQrWindowClose(window) }; + } + return { opened: true }; +} + +export function closeBotGatewayQrWindow( + request: BotGatewayQrWindowCloseRequest +): BotGatewayQrWindowCloseResult { + const sessionId = request.sessionId.trim(); + const window = qrWindows.get(sessionId); + if (!window || window.isDestroyed()) { + qrWindows.delete(sessionId); + return { closed: false }; + } + qrWindows.delete(sessionId); + window.close(); + return { closed: true }; +} + +function parseQrWindowUrl(value: string): string { + const trimmed = value.trim(); + if (!isHttpUrl(trimmed)) { + throw new Error("Only http and https QR login URLs can be opened."); + } + return new URL(trimmed).toString(); +} + +async function loadQrWindowUrl(window: BrowserWindow, url: string, allowClosed: boolean) { + try { + await window.loadURL(url); + } catch (error) { + if (allowClosed && window.isDestroyed()) { + return; + } + throw error; + } +} + +async function waitForQrWindowClose( + window: BrowserWindow +): Promise> { + if (window.isDestroyed()) { + return { observed: true, reason: "closed" }; + } + return new Promise((resolve) => { + const onClosed = () => resolve({ observed: true, reason: "closed" }); + window.once("closed", onClosed); + }); +} + +function isHttpUrl(value: string): boolean { + try { + const url = new URL(value); + return url.protocol === "http:" || url.protocol === "https:"; + } catch { + return false; + } +} diff --git a/packages/electron/src/main/browser-automation-mcp.ts b/packages/electron/src/main/browser-automation-mcp.ts new file mode 100644 index 0000000..10f8558 --- /dev/null +++ b/packages/electron/src/main/browser-automation-mcp.ts @@ -0,0 +1,3544 @@ +import type { IncomingMessage, ServerResponse } from "node:http"; +import { randomUUID } from "node:crypto"; +import type { Event as ElectronEvent, WebContents } from "electron"; +import { loadAppConfig } from "@ccr/core/config/config"; +import type { + BuiltInBrowserAutomationHandoff, + BuiltInBrowserAutomationHandoffKind, + BuiltInBrowserState, + BuiltInBrowserTabState +} from "@ccr/core/contracts/app"; +import type { BrowserAutomationMcpIntegration } from "@ccr/core/gateway/service"; +import { BROWSER_AUTOMATION_MCP_PATH } from "@ccr/core/mcp/toolhub-config"; +import { builtInBrowserService, type BrowserAutomationEvent } from "./built-in-browser"; +import { chromeLoginImportService } from "./chrome-login-import"; + +type JsonPrimitive = boolean | null | number | string; +type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue }; + +type JsonRpcRequest = { + id?: null | number | string; + jsonrpc?: string; + method?: string; + params?: unknown; +}; + +type JsonRpcResponse = + | { + id: null | number | string; + jsonrpc: "2.0"; + result: JsonValue; + } + | { + error: { + code: number; + data?: JsonValue; + message: string; + }; + id: null | number | string; + jsonrpc: "2.0"; + }; + +type McpTool = { + description: string; + inputSchema: JsonValue; + name: string; + tags?: string[]; + title?: string; +}; + +type ToolCallResult = { + content: Array<{ text: string; type: "text" }>; + isError?: boolean; +}; + +type BrowserTarget = { + axNodeId?: string; + backendNodeId?: number; + exact?: boolean; + index?: number; + ref?: string; + role?: string; + selector?: string; + text?: string; +}; + +type BrowserSessionRef = { + frameId?: string; + sessionId: string; + tabId: string; + userId?: string; +}; + +type SnapshotOptions = { + limit?: number; + maxElements: number; + maxText?: number; + offset?: number; +}; + +type AttachedSession = { + attachedAt: number; + leaseId: string; + observeOnly: boolean; + ref: BrowserSessionRef; +}; + +type EventSubscription = { + channels: Set; + dropped: boolean; + events: BrowserAutomationEvent[]; + ref?: BrowserSessionRef; + redactTextInput: boolean; + sampleMouseMove: boolean; + startedAt: number; + subscriptionId: string; + unsubscribe: () => void; +}; + +type AxSnapshotResult = { + handoff?: BuiltInBrowserAutomationHandoff; + handoffRequired?: boolean; + humanHelp?: Record; + humanHelpRequired?: boolean; + nextAction?: "human_help"; + nodes: Array>; + scope: string; + session: BrowserSessionRef; + title: string; + url: string; +}; + +type BrowserHandoffDetection = { + kind: BuiltInBrowserAutomationHandoffKind; + message: string; + reason: string; +}; + +type ReadinessResult = { + matched: boolean; + matchedEvent?: string; + navigationError?: { + errorCode?: number; + errorDescription?: string; + url?: string; + }; + readinessUrl?: string; + timedOut: boolean; +}; + +type ReadinessEvent = { + errorCode?: number; + errorDescription?: string; + isMainFrame?: boolean; + type: string; + url?: string; +}; + +type NavigationReadinessContext = { + expectedUrl?: string; + previousUrl?: string; +}; + +const protocolVersion = "2024-11-05"; +const automationEventReplayMs = 15_000; +const defaultAxSnapshotLimit = 60; +const defaultSnapshotMaxElements = 80; +const defaultSnapshotMaxText = 3_000; +const defaultEventAwaitTimeoutMs = 10_000; +const defaultJavascriptTimeoutMs = 8_000; +const maxSnapshotTextLimit = 20_000; +const maxSnapshotTextOffset = 1_000_000_000; +const maxMcpRequestBytes = 2 * 1024 * 1024; +const maxSubscriptionEvents = 512; +const maxToolResultChars = 60_000; +const maxToolResultArrayItems = 120; +const maxToolResultStringChars = 2_000; +const maxToolResultObjectKeys = 120; +const maxSnapshotResultElements = 80; +const maxAxSnapshotResultNodes = 80; +const maxBrowserResultTextChars = maxSnapshotTextLimit; +const defaultWaitTimeoutMs = 10_000; + +const sessionSchema = objectSchema({ + frameId: { description: "Optional frame id. CCR currently targets the main frame.", type: "string" }, + sessionId: { description: "Browser automation session id.", type: "string" }, + tabId: { description: "Built-in browser tab id.", type: "string" }, + userId: { description: "Optional logical user id.", type: "string" } +}, ["sessionId", "tabId"]); + +const cursorSchema = objectSchema({ + dropped: { description: "Whether earlier events were dropped before this cursor.", type: "boolean" }, + seq: { description: "Last observed event sequence.", type: "number" }, + subscriptionId: { description: "Event subscription id.", type: "string" }, + ts: { description: "Last observed event timestamp.", type: "number" } +}, ["subscriptionId", "seq"]); + +const targetSchema = objectSchema({ + axNodeId: { description: "Accessibility node id returned by browser_ax_snapshot/query. In CCR this is a stable element ref.", type: "string" }, + backendNodeId: { description: "Reserved for CDP-compatible clients. CSS/ref targeting is preferred in CCR.", type: "number" }, + exact: { description: "Match text/name exactly instead of by substring.", type: "boolean" }, + index: { description: "Zero-based match index when text/role resolves multiple elements.", minimum: 0, type: "number" }, + ref: { description: "Element ref returned by browser_snapshot. Refs are CSS selectors.", type: "string" }, + role: { description: "Accessible or implicit role such as button, link, textbox, combobox, checkbox.", type: "string" }, + selector: { description: "CSS selector. Used directly when provided.", type: "string" }, + text: { description: "Visible text, accessible name, placeholder, label, or value to match.", type: "string" } +}); + +const browserAutomationTools: McpTool[] = [ + ...browserPublicAutomationTools(), + ...browserLegacyAliasTools() +].filter((tool, index, tools) => tools.findIndex((candidate) => candidate.name === tool.name) === index); + +function browserPublicAutomationTools(): McpTool[] { + return [ + { + description: "Open a URL or attach an existing CCR built-in browser tab and create an automation session.", + inputSchema: objectSchema({ + observeOnly: { description: "If true, action tools reject this session.", type: "boolean" }, + tabId: { description: "Existing tab id to attach.", type: "string" }, + timeoutMs: { description: "Optional navigation timeout in milliseconds.", type: "number" }, + url: { description: "Optional URL or search query to open.", type: "string" }, + userId: { description: "Optional logical user id.", type: "string" }, + waitUntil: { description: "Readiness condition. Default/recommended: interactive, which waits until the page is inspectable/actionable and avoids long-lived network requests. network_idle is rarely appropriate for SPAs, Google, mail, chat, auth, or streaming pages.", enum: ["none", "interactive", "domcontentloaded", "load", "network_idle"], type: "string" }, + windowId: { description: "Ignored in CCR; included for agentic-browser compatibility.", type: "string" } + }), + name: "browser_session_open", + tags: ["browser", "automation", "session", "open", "tab"], + title: "Open Browser Automation Session" + }, + { + description: "Detach and release a browser automation session. Does not close the tab.", + inputSchema: objectSchema({ session: sessionSchema }, ["session"]), + name: "browser_session_close", + tags: ["browser", "automation", "session", "close"], + title: "Close Browser Automation Session" + }, + { + description: "Create a new CCR built-in browser tab. Accepts an existing session or the fixed CCR browser window id.", + inputSchema: objectSchema({ + activate: { description: "Whether the new tab should become active. Defaults to true.", type: "boolean" }, + session: sessionSchema, + url: { description: "Optional URL or search query.", type: "string" }, + windowId: { description: "Ignored in CCR; included for compatibility.", type: "string" } + }), + name: "browser_tab_create", + tags: ["browser", "automation", "tab", "create"], + title: "Create Browser Tab" + }, + { + description: "List all CCR built-in browser tabs with active, loading, URL, title, and navigation state.", + inputSchema: objectSchema({ + session: sessionSchema, + windowId: { description: "Ignored in CCR; included for compatibility.", type: "string" } + }), + name: "browser_tab_list", + tags: ["browser", "automation", "tab", "list"], + title: "List Browser Tabs" + }, + { + description: "Activate an existing CCR built-in browser tab.", + inputSchema: objectSchema({ + session: sessionSchema, + tabId: { description: "Tab id to activate. Defaults to session.tabId.", type: "string" } + }), + name: "browser_tab_activate", + tags: ["browser", "automation", "tab", "activate", "focus"], + title: "Activate Browser Tab" + }, + { + description: "Close a CCR built-in browser tab.", + inputSchema: objectSchema({ + session: sessionSchema, + tabId: { description: "Tab id to close. Defaults to session.tabId.", type: "string" } + }), + name: "browser_tab_close", + tags: ["browser", "automation", "tab", "close"], + title: "Close Browser Tab" + }, + { + description: "Navigate the session tab or a specified tab to a URL or search query.", + inputSchema: objectSchema({ + session: sessionSchema, + tabId: { description: "Optional tab id. Defaults to session.tabId or active tab.", type: "string" }, + timeoutMs: { description: "Optional navigation timeout in milliseconds.", maximum: 120000, minimum: 100, type: "number" }, + url: { description: "URL or search query to load.", type: "string" }, + waitUntil: { description: "Readiness condition. Default/recommended: interactive, which waits until the page is inspectable/actionable and avoids long-lived network requests. network_idle is rarely appropriate for SPAs, Google, mail, chat, auth, or streaming pages.", enum: ["none", "interactive", "domcontentloaded", "load", "network_idle"], type: "string" } + }, ["url"]), + name: "browser_navigate", + tags: ["browser", "automation", "navigate", "tab", "url"], + title: "Navigate Browser Tab" + }, + { + description: "Go back in the session tab or a specified tab.", + inputSchema: objectSchema({ session: sessionSchema, tabId: { type: "string" } }), + name: "browser_tab_go_back", + tags: ["browser", "automation", "tab", "back"], + title: "Browser Tab Back" + }, + { + description: "Go forward in the session tab or a specified tab.", + inputSchema: objectSchema({ session: sessionSchema, tabId: { type: "string" } }), + name: "browser_tab_go_forward", + tags: ["browser", "automation", "tab", "forward"], + title: "Browser Tab Forward" + }, + { + description: "Reload the session tab or a specified tab.", + inputSchema: objectSchema({ session: sessionSchema, tabId: { type: "string" } }), + name: "browser_tab_reload", + tags: ["browser", "automation", "tab", "reload"], + title: "Reload Browser Tab" + }, + { + description: "Read a condensed accessibility-oriented page snapshot. Nodes include axNodeId/ref, role, name, value, text, and rect.", + inputSchema: objectSchema({ + includeIgnored: { description: "Included for compatibility; CCR returns visible/high-signal nodes.", type: "boolean" }, + limit: { description: "Maximum nodes to return.", maximum: 300, minimum: 1, type: "number" }, + maxDepth: { description: "Included for compatibility.", type: "number" }, + rootAxNodeId: { description: "Optional root node/ref to scope the snapshot.", type: "string" }, + scope: { description: "full or outline. CCR returns the same compact shape for both.", enum: ["full", "outline"], type: "string" }, + session: sessionSchema + }, ["session"]), + name: "browser_ax_snapshot", + tags: ["browser", "automation", "accessibility", "snapshot", "dom", "page"], + title: "Browser Accessibility Snapshot" + }, + { + description: "Search the page accessibility outline by role, accessible name, visible text, label, placeholder, or value.", + inputSchema: objectSchema({ + includeIgnored: { description: "Included for compatibility; CCR searches visible/high-signal nodes.", type: "boolean" }, + limit: { description: "Maximum matches.", maximum: 300, minimum: 1, type: "number" }, + name: { description: "Accessible name filter.", type: "string" }, + role: { description: "Role filter such as button, link, textbox, combobox.", type: "string" }, + rootAxNodeId: { description: "Optional root node/ref to scope the query.", type: "string" }, + session: sessionSchema, + text: { description: "Visible text/value/description filter.", type: "string" } + }, ["session"]), + name: "browser_ax_query", + tags: ["browser", "automation", "accessibility", "query", "find"], + title: "Query Browser Accessibility Tree" + }, + { + description: "Click an element resolved by axNodeId/ref, CSS selector, role, or text.", + inputSchema: objectSchema({ force: { type: "boolean" }, session: sessionSchema, target: targetSchema }, ["session", "target"]), + name: "browser_element_click", + tags: ["browser", "automation", "element", "click"], + title: "Click Browser Element" + }, + { + description: "Set text into an input, textarea, contenteditable, or textbox-like element.", + inputSchema: objectSchema({ + replace: { description: "Replace existing text. Defaults to true.", type: "boolean" }, + session: sessionSchema, + target: targetSchema, + text: { type: "string" } + }, ["session", "target", "text"]), + name: "browser_element_input", + tags: ["browser", "automation", "element", "input", "type", "form"], + title: "Input Browser Element" + }, + { + description: "Select an option on a native select by value or visible label.", + inputSchema: objectSchema({ + exact: { type: "boolean" }, + session: sessionSchema, + target: targetSchema, + value: { description: "Requested option value or visible label.", type: "string" } + }, ["session", "target", "value"]), + name: "browser_element_select", + tags: ["browser", "automation", "element", "select", "form"], + title: "Select Browser Element Option" + }, + { + description: "Press a keyboard key against a resolved target or the current focused element.", + inputSchema: objectSchema({ + key: { description: "Keyboard key, e.g. Enter, Tab, Escape, ArrowDown.", type: "string" }, + session: sessionSchema, + target: targetSchema + }, ["session", "key"]), + name: "browser_element_press", + tags: ["browser", "automation", "element", "press", "keyboard"], + title: "Press Browser Element Key" + }, + { + description: "Scroll the page or a target element.", + inputSchema: objectSchema({ + amount: { description: "Scroll amount in CSS pixels.", type: "number" }, + direction: { description: "Scroll direction.", enum: ["up", "down"], type: "string" }, + session: sessionSchema, + target: targetSchema + }, ["session"]), + name: "browser_element_scroll", + tags: ["browser", "automation", "element", "scroll"], + title: "Scroll Browser Element" + }, + { + description: "Subscribe to browser automation events such as tab, navigation, DOM-ready, runtime, and loading signals.", + inputSchema: objectSchema({ + channels: { description: "Event channels: tab, navigation, dom, runtime, dialog, download, input, focus, selection, handoff.", items: { type: "string" }, type: "array" }, + redactTextInput: { type: "boolean" }, + sampleMouseMove: { type: "boolean" }, + session: sessionSchema + }, ["session", "channels"]), + name: "browser_events_subscribe", + tags: ["browser", "automation", "events", "subscribe"], + title: "Subscribe Browser Events" + }, + { + description: "Read buffered browser automation events from a subscription.", + inputSchema: objectSchema({ + cursor: cursorSchema, + limit: { maximum: 200, minimum: 1, type: "number" }, + subscriptionId: { type: "string" } + }, ["subscriptionId"]), + name: "browser_events_read", + tags: ["browser", "automation", "events", "read"], + title: "Read Browser Events" + }, + { + description: "Wait for browser automation events matching kind, tabId, URL pattern, title pattern, or summary pattern.", + inputSchema: objectSchema({ + coalesceMs: { description: "Small delay after a first match to collect related events.", type: "number" }, + cursor: cursorSchema, + kinds: { items: { type: "string" }, type: "array" }, + maxEvents: { maximum: 50, minimum: 1, type: "number" }, + summaryPattern: { type: "string" }, + tabId: { type: "string" }, + timeoutMs: { maximum: 120000, minimum: 100, type: "number" }, + titlePattern: { type: "string" }, + urlPattern: { type: "string" }, + subscriptionId: { type: "string" } + }, ["subscriptionId"]), + name: "browser_events_await", + tags: ["browser", "automation", "events", "await", "wait"], + title: "Await Browser Events" + }, + { + description: "Unsubscribe from browser automation events and release the subscription.", + inputSchema: objectSchema({ subscriptionId: { type: "string" } }, ["subscriptionId"]), + name: "browser_events_unsubscribe", + tags: ["browser", "automation", "events", "unsubscribe"], + title: "Unsubscribe Browser Events" + }, + { + description: "Handle a currently open JavaScript alert/confirm/prompt dialog using Chromium CDP.", + inputSchema: objectSchema({ + accept: { type: "boolean" }, + promptText: { type: "string" }, + session: sessionSchema + }, ["session", "accept"]), + name: "browser_dialog_handle", + tags: ["browser", "automation", "dialog", "alert", "confirm", "prompt"], + title: "Handle Browser Dialog" + }, + { + description: "Request human intervention for the current browser task. Shows the hidden browser window and displays the requested action in the top toolbar.", + inputSchema: objectSchema({ + kind: { + description: "Type of help needed.", + enum: ["login_required", "verification_code", "human_verification", "blocked", "other"], + type: "string" + }, + message: { description: "Short instruction shown in the top toolbar.", type: "string" }, + reason: { description: "Why automation is blocked.", type: "string" }, + session: sessionSchema, + tabId: { description: "Optional tab id. Defaults to session.tabId or active tab.", type: "string" } + }, ["reason"]), + name: "browser_handoff_request", + tags: ["browser", "automation", "human", "handoff", "intervention"], + title: "Request Browser Human Handoff" + }, + { + description: "Read the current browser human handoff status.", + inputSchema: objectSchema({}), + name: "browser_handoff_status", + tags: ["browser", "automation", "human", "handoff"], + title: "Browser Handoff Status" + }, + { + description: "Wait until the user clicks Done or Hide on the current browser handoff toolbar. Use after browser_handoff_request or a tool result with humanHelpRequired.", + inputSchema: objectSchema({ + handoffId: { description: "Optional handoff id returned by browser_handoff_request or humanHelp.handoff.", type: "string" }, + session: sessionSchema, + tabId: { description: "Optional tab id. Defaults to session.tabId.", type: "string" }, + timeoutMs: { description: "Maximum wait time in milliseconds.", maximum: 600000, minimum: 100, type: "number" } + }), + name: "browser_handoff_wait", + tags: ["browser", "automation", "human", "handoff", "wait"], + title: "Wait For Browser Human Handoff" + }, + { + description: "Clear the current browser human handoff prompt.", + inputSchema: objectSchema({ + status: { enum: ["completed", "dismissed"], type: "string" } + }), + name: "browser_handoff_clear", + tags: ["browser", "automation", "human", "handoff"], + title: "Clear Browser Handoff" + }, + { + description: "Ask the user to confirm importing Chrome cookies and localStorage for selected domains into CCR's in-app browser. Opens a browser confirmation page; the Chrome extension performs the import after user confirmation.", + inputSchema: objectSchema({ + domain: { description: "Single domain to import, such as github.com. Used with domains if both are provided.", type: "string" }, + domains: { description: "Domains to import. If omitted, CCR derives the current tab hostname.", items: { type: "string" }, type: "array" }, + openConfirmationPage: { description: "Open the system browser confirmation page. Defaults to true.", type: "boolean" }, + session: sessionSchema, + tabId: { description: "Optional tab id used to derive a domain when domain/domains are omitted.", type: "string" }, + target: { description: "Target CCR browser storage partition.", enum: ["browser", "browser-and-web-search"], type: "string" } + }), + name: "browser_chrome_login_import", + tags: ["browser", "automation", "chrome", "login", "import", "cookies", "localStorage"], + title: "Import Chrome Login State" + }, + { + description: "Read the status of a Chrome login import job created by browser_chrome_login_import.", + inputSchema: objectSchema({ + jobId: { description: "Chrome login import job id.", type: "string" } + }, ["jobId"]), + name: "browser_chrome_login_import_status", + tags: ["browser", "automation", "chrome", "login", "import", "status"], + title: "Chrome Login Import Status" + } + ]; +} + +function browserLegacyAliasTools(): McpTool[] { + return [ + { + description: "Open or focus the CCR built-in browser window. Optionally navigate the active tab to a URL.", + inputSchema: objectSchema({ + url: { description: "Optional URL or search query to load in the active tab.", type: "string" } + }), + name: "browser_open", + tags: ["browser", "automation", "open", "focus"], + title: "Open Browser" + }, + { + description: "List CCR built-in browser tabs, including active tab, URL, title, and loading state.", + inputSchema: objectSchema({}), + name: "browser_tabs", + tags: ["browser", "automation", "tabs"], + title: "List Browser Tabs" + }, + { + description: "Open a new CCR built-in browser tab. Optionally load a URL or search query.", + inputSchema: objectSchema({ + url: { description: "Optional URL or search query to load in the new tab.", type: "string" } + }), + name: "browser_tab_new", + tags: ["browser", "automation", "tab"], + title: "New Browser Tab" + }, + { + description: "Focus a CCR built-in browser tab by tabId.", + inputSchema: objectSchema({ + tabId: { description: "Tab id returned by browser_tabs or browser_tab_new.", type: "string" } + }, ["tabId"]), + name: "browser_tab_activate", + tags: ["browser", "automation", "tab", "focus"], + title: "Activate Browser Tab" + }, + { + description: "Close a CCR built-in browser tab by tabId.", + inputSchema: objectSchema({ + tabId: { description: "Tab id returned by browser_tabs or browser_tab_new.", type: "string" } + }, ["tabId"]), + name: "browser_tab_close", + tags: ["browser", "automation", "tab"], + title: "Close Browser Tab" + }, + { + description: "Navigate a CCR built-in browser tab to a URL or search query.", + inputSchema: objectSchema({ + tabId: { description: "Optional tab id. Defaults to the active tab.", type: "string" }, + url: { description: "URL or search query to load.", type: "string" } + }, ["url"]), + name: "browser_navigate", + tags: ["browser", "automation", "navigate", "url"], + title: "Navigate Browser" + }, + { + description: "Capture page text plus interactable element refs for browser automation. Use returned refs for browser_click, browser_type, browser_select, browser_press_key, or browser_scroll.", + inputSchema: objectSchema({ + limit: { description: "Maximum page text characters to include. Overrides maxText when both are provided.", maximum: maxSnapshotTextLimit, minimum: 0, type: "number" }, + maxElements: { description: "Maximum interactable elements to include.", maximum: 300, minimum: 1, type: "number" }, + maxText: { description: "Legacy alias for limit.", maximum: maxSnapshotTextLimit, minimum: 0, type: "number" }, + offset: { description: "Starting character offset into the normalized page text.", maximum: maxSnapshotTextOffset, minimum: 0, type: "number" }, + tabId: { description: "Optional tab id. Defaults to the active tab.", type: "string" } + }), + name: "browser_snapshot", + tags: ["browser", "automation", "snapshot", "accessibility", "dom", "page"], + title: "Browser Page Snapshot" + }, + { + description: "Click an element in the CCR built-in browser by ref, CSS selector, role, or visible text.", + inputSchema: objectSchema({ + tabId: { description: "Optional tab id. Defaults to the active tab.", type: "string" }, + target: targetSchema + }, ["target"]), + name: "browser_click", + tags: ["browser", "automation", "click", "element"], + title: "Click Browser Element" + }, + { + description: "Type text into an input, textarea, select-like textbox, or contenteditable element in the CCR built-in browser.", + inputSchema: objectSchema({ + replaceExisting: { description: "Replace existing text. Defaults to true.", type: "boolean" }, + tabId: { description: "Optional tab id. Defaults to the active tab.", type: "string" }, + target: targetSchema, + text: { description: "Text to type.", type: "string" } + }, ["target", "text"]), + name: "browser_type", + tags: ["browser", "automation", "type", "input", "form"], + title: "Type In Browser Element" + }, + { + description: "Choose an option in a select element by value or visible label.", + inputSchema: objectSchema({ + exact: { description: "Match label exactly instead of by substring.", type: "boolean" }, + label: { description: "Visible option label to choose.", type: "string" }, + tabId: { description: "Optional tab id. Defaults to the active tab.", type: "string" }, + target: targetSchema, + value: { description: "Option value to choose.", type: "string" } + }, ["target"]), + name: "browser_select", + tags: ["browser", "automation", "select", "form"], + title: "Select Browser Option" + }, + { + description: "Press a keyboard key in the CCR built-in browser. Optionally focus an element first.", + inputSchema: objectSchema({ + key: { description: "Electron keyCode, for example Enter, Tab, Escape, Backspace, ArrowDown.", type: "string" }, + tabId: { description: "Optional tab id. Defaults to the active tab.", type: "string" }, + target: targetSchema + }, ["key"]), + name: "browser_press_key", + tags: ["browser", "automation", "keyboard", "press"], + title: "Press Browser Key" + }, + { + description: "Scroll the page or a target element in the CCR built-in browser.", + inputSchema: objectSchema({ + deltaX: { description: "Horizontal scroll delta in pixels.", type: "number" }, + deltaY: { description: "Vertical scroll delta in pixels.", type: "number" }, + tabId: { description: "Optional tab id. Defaults to the active tab.", type: "string" }, + target: targetSchema + }), + name: "browser_scroll", + tags: ["browser", "automation", "scroll"], + title: "Scroll Browser" + }, + { + description: "Wait until a browser page condition is true: URL includes/matches, selector is visible, or text is visible.", + inputSchema: objectSchema({ + selector: { description: "CSS selector that must be visible.", type: "string" }, + tabId: { description: "Optional tab id. Defaults to the active tab.", type: "string" }, + text: { description: "Text that must be visible in document body.", type: "string" }, + timeoutMs: { description: "Maximum wait time in milliseconds.", maximum: 120000, minimum: 100, type: "number" }, + urlIncludes: { description: "Substring that must appear in the URL.", type: "string" }, + urlMatches: { description: "JavaScript regular expression that must match the URL.", type: "string" } + }), + name: "browser_wait_for", + tags: ["browser", "automation", "wait", "url", "selector", "text"], + title: "Wait For Browser Page" + }, + { + description: "Agentic-browser-compatible alias for browser_handoff_request. Request human help for login, verification, CAPTCHA, or other manual-only blockers.", + inputSchema: objectSchema({ + browserSessionId: { type: "string" }, + kind: { enum: ["login_required", "verification_code", "human_verification", "blocked", "other"], type: "string" }, + message: { type: "string" }, + reason: { type: "string" }, + tabId: { type: "string" } + }, ["reason", "kind"]), + name: "askHumanHelp", + tags: ["browser", "automation", "human", "handoff", "intervention"], + title: "Ask Human Help" + } + ]; +} + +class BrowserAutomationMcpService implements BrowserAutomationMcpIntegration { + private readonly sessions = new Map(); + private readonly subscriptions = new Map(); + + async handleBrowserAutomationMcpRequest(request: IncomingMessage, response: ServerResponse): Promise { + response.setHeader("MCP-Protocol-Version", protocolVersion); + const path = request.url ? new URL(request.url, "http://127.0.0.1").pathname : "/"; + + if (request.method === "GET" && (path === BROWSER_AUTOMATION_MCP_PATH || path === `${BROWSER_AUTOMATION_MCP_PATH}/`)) { + sendJson(response, 200, { + endpoint: BROWSER_AUTOMATION_MCP_PATH, + name: "ccr-browser-automation", + protocol: "mcp", + transport: "streamable-http" + }); + return; + } + + if (request.method !== "POST") { + sendJson(response, 405, { error: { message: "Browser automation MCP endpoint only supports GET and POST." } }); + return; + } + + let payload: unknown; + try { + payload = JSON.parse((await readRequestBody(request, maxMcpRequestBytes)).toString("utf8")) as unknown; + } catch (error) { + sendJson(response, 400, jsonRpcError(null, -32700, `Invalid JSON-RPC request: ${formatError(error)}`)); + return; + } + + const requests = Array.isArray(payload) ? payload : [payload]; + const responses = await Promise.all(requests.map((item) => this.handleJsonRpcRequest(item))); + const filtered = responses.filter((item): item is JsonRpcResponse => Boolean(item)); + if (filtered.length === 0) { + response.writeHead(204); + response.end(); + return; + } + + sendJson(response, 200, Array.isArray(payload) ? filtered : filtered[0]); + } + + async stopBrowserAutomationMcpServer(): Promise { + for (const subscription of this.subscriptions.values()) { + subscription.unsubscribe(); + } + this.subscriptions.clear(); + this.sessions.clear(); + // The gateway owns this MCP route. Browser tabs remain user-visible state and are + // intentionally not closed when the gateway restarts. + } + + private async handleJsonRpcRequest(payload: unknown): Promise { + if (!isRecord(payload)) { + return jsonRpcError(null, -32600, "JSON-RPC request must be an object."); + } + + const request = payload as JsonRpcRequest; + const id = request.id ?? null; + if (request.id === undefined && request.method?.startsWith("notifications/")) { + return undefined; + } + if (request.jsonrpc !== "2.0" || !request.method) { + return jsonRpcError(id, -32600, "Invalid JSON-RPC 2.0 request."); + } + + try { + switch (request.method) { + case "initialize": + return jsonRpcResult(id, { + capabilities: { + tools: {} + }, + protocolVersion, + serverInfo: { + name: "ccr-browser-automation", + title: "CCR Browser Automation", + version: "1.0.0" + } + }); + case "ping": + return jsonRpcResult(id, {}); + case "tools/list": + return jsonRpcResult(id, { tools: browserAutomationTools as unknown as JsonValue }); + case "tools/call": + return jsonRpcResult(id, await this.callTool(request.params) as unknown as JsonValue); + default: + return jsonRpcError(id, -32601, `Unsupported MCP method: ${request.method}`); + } + } catch (error) { + return jsonRpcError(id, -32603, formatError(error)); + } + } + + private async callTool(params: unknown): Promise { + if (!isRecord(params) || typeof params.name !== "string") { + throw new Error("tools/call params must include a tool name."); + } + const args = isRecord(params.arguments) ? params.arguments : {}; + try { + const result = await this.runTool(params.name, args); + return textResult(formatToolResult(params.name, result)); + } catch (error) { + return { + ...textResult(formatError(error)), + isError: true + }; + } + } + + private async runTool(name: string, args: Record): Promise { + switch (name) { + case "browser_session_open": + return await this.openSession(args); + case "browser_session_close": + return this.closeSession(args); + case "browser_tab_create": + return await this.createTab(args); + case "browser_tab_list": + await this.ensureBrowserOpen(); + return browserWindowState(); + case "browser_tab_activate": { + await this.ensureBrowserOpen(); + const session = this.resolveOptionalSession(args); + const tabId = readString(args.tabId) || session?.ref.tabId; + if (!tabId) { + throw new Error("browser_tab_activate requires tabId or session."); + } + const state = builtInBrowserService.selectAutomationTab(tabId); + return { + ...browserWindowState(state), + tab: summarizeTab(requiredTabState(state, tabId), state.activeTabId) + }; + } + case "browser_tab_close": { + await this.ensureBrowserOpen(); + const session = this.resolveOptionalSession(args); + this.assertCanMutate(session); + const tabId = readString(args.tabId) || session?.ref.tabId; + if (!tabId) { + throw new Error("browser_tab_close requires tabId or session."); + } + const state = builtInBrowserService.closeAutomationTab(tabId); + this.removeSessionsForTab(tabId); + return browserWindowState(state); + } + case "browser_navigate": { + await this.ensureBrowserOpen(); + const session = this.resolveOptionalSession(args); + this.assertCanMutate(session); + const tabId = readString(args.tabId) || session?.ref.tabId || builtInBrowserService.getAutomationState().activeTabId; + if (!tabId) { + throw new Error("browser_navigate could not resolve an active tab."); + } + const url = requiredString(args.url, "browser_navigate requires url."); + const waitUntil = normalizeWaitUntil(readString(args.waitUntil), "interactive"); + const readiness = await waitForReadiness( + builtInBrowserService.getAutomationWebContents(tabId), + waitUntil, + clampInteger(readNumber(args.timeoutMs) ?? defaultWaitTimeoutMs, 100, 120000), + () => builtInBrowserService.navigateAutomationTab(url, tabId), + url + ); + const state = builtInBrowserService.getAutomationState(); + const webContents = builtInBrowserService.getAutomationWebContents(tabId); + const handoff = await maybeRequestHandoffAfterNavigation(webContents, readiness, { + requestedUrl: url, + session: session?.ref, + tabId, + waitUntil + }); + return { + ...browserWindowState(state), + ...(handoff ? humanHelpResultFields(handoff) : {}), + session: session?.ref, + tab: summarizeTab(requiredTabState(state, tabId), state.activeTabId), + ...readiness + }; + } + case "browser_tab_go_back": { + await this.ensureBrowserOpen(); + const session = this.resolveOptionalSession(args); + this.assertCanMutate(session); + return browserWindowState(builtInBrowserService.goBackAutomationTab(readString(args.tabId) || session?.ref.tabId)); + } + case "browser_tab_go_forward": { + await this.ensureBrowserOpen(); + const session = this.resolveOptionalSession(args); + this.assertCanMutate(session); + return browserWindowState(builtInBrowserService.goForwardAutomationTab(readString(args.tabId) || session?.ref.tabId)); + } + case "browser_tab_reload": { + await this.ensureBrowserOpen(); + const session = this.resolveOptionalSession(args); + this.assertCanMutate(session); + return browserWindowState(builtInBrowserService.reloadAutomationTab(readString(args.tabId) || session?.ref.tabId)); + } + case "browser_ax_snapshot": { + await this.ensureBrowserOpen(); + const session = this.requireSession(args); + return await captureAxSnapshot( + builtInBrowserService.getAutomationWebContents(session.ref.tabId), + session.ref, + { + limit: clampInteger(readNumber(args.limit) ?? defaultAxSnapshotLimit, 1, 300), + rootAxNodeId: readString(args.rootAxNodeId), + scope: readString(args.scope) === "outline" ? "outline" : "full" + } + ); + } + case "browser_ax_query": { + await this.ensureBrowserOpen(); + const session = this.requireSession(args); + return await queryAxSnapshot( + builtInBrowserService.getAutomationWebContents(session.ref.tabId), + session.ref, + { + limit: clampInteger(readNumber(args.limit) ?? 50, 1, 300), + name: readString(args.name), + role: readString(args.role), + rootAxNodeId: readString(args.rootAxNodeId), + text: readString(args.text) + } + ); + } + case "browser_element_click": { + await this.ensureBrowserOpen(); + const session = this.requireSession(args); + this.assertCanMutate(session); + const webContents = builtInBrowserService.getAutomationWebContents(session.ref.tabId); + const result = await runTargetAction(webContents, "click", readTarget(args.target)); + return await pageActionResult(webContents, session.ref, "click", result); + } + case "browser_element_input": { + await this.ensureBrowserOpen(); + const session = this.requireSession(args); + this.assertCanMutate(session); + const webContents = builtInBrowserService.getAutomationWebContents(session.ref.tabId); + const result = await runTargetAction(webContents, "type", readTarget(args.target), { + replaceExisting: args.replace !== false, + text: typeof args.text === "string" ? args.text : "" + }); + return await pageActionResult(webContents, session.ref, "input", result); + } + case "browser_element_select": { + await this.ensureBrowserOpen(); + const session = this.requireSession(args); + this.assertCanMutate(session); + const value = requiredString(args.value, "browser_element_select requires value."); + const webContents = builtInBrowserService.getAutomationWebContents(session.ref.tabId); + const result = await runTargetAction(webContents, "select", readTarget(args.target), { + exact: args.exact === true, + label: value, + value + }); + return await pageActionResult(webContents, session.ref, "select", result); + } + case "browser_element_press": { + await this.ensureBrowserOpen(); + const session = this.requireSession(args); + this.assertCanMutate(session); + const webContents = builtInBrowserService.getAutomationWebContents(session.ref.tabId); + const result = await pressKey( + webContents, + requiredString(args.key, "browser_element_press requires key."), + isRecord(args.target) ? readTarget(args.target) : undefined + ); + return await pageActionResult(webContents, session.ref, "press", result); + } + case "browser_element_scroll": { + await this.ensureBrowserOpen(); + const session = this.requireSession(args); + this.assertCanMutate(session); + const amount = Math.abs(readNumber(args.amount) ?? 700); + const direction = readString(args.direction) === "up" ? "up" : "down"; + const webContents = builtInBrowserService.getAutomationWebContents(session.ref.tabId); + const result = await runTargetAction( + webContents, + "scroll", + isRecord(args.target) ? readTarget(args.target) : undefined, + { + deltaX: 0, + deltaY: direction === "up" ? -amount : amount + } + ); + return await pageActionResult(webContents, session.ref, "scroll", result); + } + case "browser_events_subscribe": + await this.ensureBrowserOpen(); + return this.subscribeEvents(args); + case "browser_events_read": + return this.readEvents(args); + case "browser_events_await": + return await this.awaitEvents(args); + case "browser_events_unsubscribe": + return this.unsubscribeEvents(args); + case "browser_dialog_handle": { + await this.ensureBrowserOpen(); + const session = this.requireSession(args); + this.assertCanMutate(session); + const webContents = builtInBrowserService.getAutomationWebContents(session.ref.tabId); + return await handleJavaScriptDialog(webContents, args.accept === true, readString(args.promptText), session.ref); + } + case "browser_handoff_request": + case "askHumanHelp": + await this.ensureBrowserOpen(); + return this.requestHandoff(args); + case "browser_handoff_status": + await this.ensureBrowserOpen(); + return { + handoff: builtInBrowserService.getAutomationState().automationHandoff, + state: browserWindowState() + }; + case "browser_handoff_wait": + await this.ensureBrowserOpen(); + return await this.waitForHandoff(args); + case "browser_handoff_clear": + return { + handoff: undefined, + state: builtInBrowserService.resolveAutomationHandoff(readString(args.status) === "dismissed" ? "dismissed" : "completed") + }; + case "browser_chrome_login_import": { + await this.ensureBrowserOpen(); + const session = this.resolveOptionalSession(args); + const domains = resolveChromeLoginImportDomains(args, session?.ref.tabId); + const job = await chromeLoginImportService.createJob({ + domains, + openConfirmationPage: args.openConfirmationPage !== false, + target: readString(args.target) === "browser-and-web-search" ? "browser-and-web-search" : "browser" + }); + return { + humanHelpRequired: true, + job, + nextAction: "user_confirm_chrome_import", + state: browserWindowState(), + summary: `Opened Chrome login import confirmation for ${job.domains.join(", ")}.` + }; + } + case "browser_chrome_login_import_status": { + const jobId = requiredString(args.jobId, "browser_chrome_login_import_status requires jobId."); + const job = chromeLoginImportService.getJob(jobId); + if (!job) { + throw new Error(`Chrome login import job was not found: ${jobId}`); + } + return { job }; + } + case "browser_open": { + const state = await this.ensureBrowserVisible(); + const url = readString(args.url); + return url ? await builtInBrowserService.navigateAutomationTab(url, state.activeTabId) : builtInBrowserService.getAutomationState(); + } + case "browser_tabs": + await this.ensureBrowserOpen(); + return builtInBrowserService.getAutomationState(); + case "browser_tab_new": { + await this.ensureBrowserOpen(); + const tab = builtInBrowserService.createAutomationTab(readString(args.url) || undefined); + return { state: builtInBrowserService.getAutomationState(), tab }; + } + case "browser_snapshot": + await this.ensureBrowserOpen(); + return await captureSnapshotWithHandoff( + builtInBrowserService.getAutomationWebContents(readString(args.tabId)), + readString(args.tabId), + { + limit: clampInteger(readNumber(args.limit) ?? readNumber(args.maxText) ?? defaultSnapshotMaxText, 0, maxSnapshotTextLimit), + maxElements: clampInteger(readNumber(args.maxElements) ?? defaultSnapshotMaxElements, 1, 300), + offset: clampInteger(readNumber(args.offset) ?? 0, 0, maxSnapshotTextOffset) + } + ); + case "browser_click": + await this.ensureBrowserOpen(); + return await runTargetAction( + builtInBrowserService.getAutomationWebContents(readString(args.tabId)), + "click", + readTarget(args.target) + ); + case "browser_type": + await this.ensureBrowserOpen(); + return await runTargetAction( + builtInBrowserService.getAutomationWebContents(readString(args.tabId)), + "type", + readTarget(args.target), + { + replaceExisting: args.replaceExisting !== false, + text: typeof args.text === "string" ? args.text : "" + } + ); + case "browser_select": + await this.ensureBrowserOpen(); + return await runTargetAction( + builtInBrowserService.getAutomationWebContents(readString(args.tabId)), + "select", + readTarget(args.target), + { + exact: args.exact === true, + label: readString(args.label), + value: readString(args.value) + } + ); + case "browser_press_key": + await this.ensureBrowserOpen(); + return await pressKey( + builtInBrowserService.getAutomationWebContents(readString(args.tabId)), + requiredString(args.key, "browser_press_key requires key."), + isRecord(args.target) ? readTarget(args.target) : undefined + ); + case "browser_scroll": + await this.ensureBrowserOpen(); + return await runTargetAction( + builtInBrowserService.getAutomationWebContents(readString(args.tabId)), + "scroll", + isRecord(args.target) ? readTarget(args.target) : undefined, + { + deltaX: readNumber(args.deltaX) ?? 0, + deltaY: readNumber(args.deltaY) ?? 700 + } + ); + case "browser_wait_for": + await this.ensureBrowserOpen(); + return await waitForPageCondition( + builtInBrowserService.getAutomationWebContents(readString(args.tabId)), + { + selector: readString(args.selector), + text: readString(args.text), + timeoutMs: clampInteger(readNumber(args.timeoutMs) ?? defaultWaitTimeoutMs, 100, 120000), + urlIncludes: readString(args.urlIncludes), + urlMatches: readString(args.urlMatches) + } + ); + default: + throw new Error(`Unknown browser automation tool: ${name}`); + } + } + + private async ensureBrowserOpen(): Promise { + await builtInBrowserService.openHidden(await loadAppConfig()); + return builtInBrowserService.getAutomationState(); + } + + private async ensureBrowserVisible(): Promise { + await builtInBrowserService.open(await loadAppConfig()); + return builtInBrowserService.getAutomationState(); + } + + private async openSession(args: Record): Promise { + let state = await this.ensureBrowserOpen(); + const url = readString(args.url); + const requestedTabId = readString(args.tabId); + const previousActiveTabId = state.activeTabId; + let tabId = requestedTabId; + let createdTab = false; + + if (tabId && !state.tabs.some((tab) => tab.id === tabId)) { + throw new Error(`Browser tab was not found: ${tabId}`); + } + + if (!tabId && url) { + const tab = builtInBrowserService.createAutomationTab(); + tabId = tab.id; + createdTab = true; + } else if (!tabId) { + tabId = state.activeTabId || builtInBrowserService.createAutomationTab().id; + createdTab = !state.activeTabId; + } else if (state.activeTabId !== tabId) { + builtInBrowserService.selectAutomationTab(tabId); + } + + if (!tabId) { + throw new Error("Unable to resolve browser tab for automation session."); + } + + const waitUntil = normalizeWaitUntil(readString(args.waitUntil), url ? "interactive" : "none"); + const timeoutMs = clampInteger(readNumber(args.timeoutMs) ?? defaultWaitTimeoutMs, 100, 120000); + const webContents = builtInBrowserService.getAutomationWebContents(tabId); + const readiness = await waitForReadiness( + webContents, + waitUntil, + timeoutMs, + url ? () => builtInBrowserService.navigateAutomationTab(url, tabId) : undefined, + url + ); + state = builtInBrowserService.getAutomationState(); + const tab = requiredTabState(state, tabId); + const ref: BrowserSessionRef = { + sessionId: randomUUID(), + tabId, + ...(readString(args.userId) ? { userId: readString(args.userId) } : {}) + }; + const attached: AttachedSession = { + attachedAt: Date.now(), + leaseId: randomUUID(), + observeOnly: args.observeOnly === true, + ref + }; + this.sessions.set(ref.sessionId, attached); + const handoff = await maybeRequestHandoffAfterNavigation(webContents, readiness, { + requestedUrl: url, + session: ref, + tabId, + waitUntil + }); + + return { + session: ref, + attachedAt: attached.attachedAt, + createdTab, + ...(handoff ? humanHelpResultFields(handoff) : {}), + matched: readiness.matched, + matchedEvent: readiness.matchedEvent, + ...(readiness.navigationError ? { navigationError: readiness.navigationError } : {}), + previousActiveTabId, + readinessUrl: readiness.readinessUrl, + tabId, + timedOut: readiness.timedOut, + title: tab.title, + url: tab.url, + waitUntil, + windowId: builtInBrowserService.getAutomationWindowId() + }; + } + + private closeSession(args: Record): unknown { + const session = this.requireSession(args); + this.sessions.delete(session.ref.sessionId); + for (const [subscriptionId, subscription] of this.subscriptions) { + if (subscription.ref?.sessionId === session.ref.sessionId) { + subscription.unsubscribe(); + this.subscriptions.delete(subscriptionId); + } + } + return { success: true }; + } + + private async createTab(args: Record): Promise { + const state = await this.ensureBrowserOpen(); + const session = this.resolveOptionalSession(args); + this.assertCanMutate(session); + const previousActiveTabId = state.activeTabId; + const tab = builtInBrowserService.createAutomationTab(readString(args.url) || undefined); + if (args.activate === false && previousActiveTabId) { + builtInBrowserService.selectAutomationTab(previousActiveTabId); + } + const nextState = builtInBrowserService.getAutomationState(); + return summarizeTab(requiredTabState(nextState, tab.id), nextState.activeTabId); + } + + private requireSession(args: Record): AttachedSession { + const session = this.resolveOptionalSession(args); + if (!session) { + throw new Error("A valid browser automation session is required."); + } + return session; + } + + private resolveOptionalSession(args: Record): AttachedSession | undefined { + const ref = readSessionRef(args.session); + if (!ref) { + return undefined; + } + const existing = this.sessions.get(ref.sessionId); + if (existing) { + if (existing.ref.tabId !== ref.tabId) { + throw new Error("Browser automation session tabId does not match the attached session."); + } + return existing; + } + const state = builtInBrowserService.getAutomationState(); + if (!state.tabs.some((tab) => tab.id === ref.tabId)) { + throw new Error(`Browser automation session tab was not found: ${ref.tabId}`); + } + const restored: AttachedSession = { + attachedAt: Date.now(), + leaseId: randomUUID(), + observeOnly: false, + ref + }; + this.sessions.set(ref.sessionId, restored); + return restored; + } + + private assertCanMutate(session?: AttachedSession): void { + if (session?.observeOnly) { + throw new Error("This browser automation session is observeOnly and cannot mutate browser state."); + } + } + + private removeSessionsForTab(tabId: string): void { + for (const [sessionId, session] of this.sessions) { + if (session.ref.tabId === tabId) { + this.sessions.delete(sessionId); + } + } + for (const [subscriptionId, subscription] of this.subscriptions) { + if (subscription.ref?.tabId === tabId) { + subscription.unsubscribe(); + this.subscriptions.delete(subscriptionId); + } + } + } + + private subscribeEvents(args: Record): unknown { + const session = this.requireSession(args); + const channels = normalizeEventChannels(readStringArray(args.channels)); + const subscription: EventSubscription = { + channels, + dropped: false, + events: [], + ref: session.ref, + redactTextInput: args.redactTextInput !== false, + sampleMouseMove: args.sampleMouseMove === true, + startedAt: Date.now(), + subscriptionId: randomUUID(), + unsubscribe: () => undefined + }; + const listener = (event: BrowserAutomationEvent) => { + if (!matchesSubscriptionEvent(subscription, event)) { + return; + } + subscription.events.push(event); + if (subscription.events.length > maxSubscriptionEvents) { + subscription.events.splice(0, subscription.events.length - maxSubscriptionEvents); + subscription.dropped = true; + } + }; + subscription.unsubscribe = builtInBrowserService.subscribeAutomationEvents(listener, { + replayRecentMs: automationEventReplayMs + }); + this.subscriptions.set(subscription.subscriptionId, subscription); + + return { + subscription: subscriptionDescriptor(subscription) + }; + } + + private readEvents(args: Record): unknown { + const subscription = this.requireSubscription(args); + const limit = clampInteger(readNumber(args.limit) ?? 100, 1, 200); + const cursorSeq = readCursorSeq(args.cursor); + const events = eventsAfterCursor(subscription, cursorSeq).slice(0, limit); + return { + dropped: subscription.dropped || cursorDropped(subscription, cursorSeq), + events, + nextCursor: makeEventCursor(subscription, events.at(-1)?.seq ?? cursorSeq), + subscriptionId: subscription.subscriptionId + }; + } + + private async awaitEvents(args: Record): Promise { + const subscription = this.requireSubscription(args); + const timeoutMs = clampInteger(readNumber(args.timeoutMs) ?? defaultEventAwaitTimeoutMs, 100, 120000); + const maxEvents = clampInteger(readNumber(args.maxEvents) ?? 10, 1, 50); + const coalesceMs = clampInteger(readNumber(args.coalesceMs) ?? 100, 0, 2000); + const cursorSeq = readCursorSeq(args.cursor); + const deadline = Date.now() + timeoutMs; + let matched: BrowserAutomationEvent[] = []; + + while (Date.now() <= deadline) { + matched = eventsAfterCursor(subscription, cursorSeq) + .filter((event) => matchesAwaitFilter(event, args)) + .slice(0, maxEvents); + if (matched.length > 0) { + if (coalesceMs > 0) { + await sleep(coalesceMs); + matched = eventsAfterCursor(subscription, cursorSeq) + .filter((event) => matchesAwaitFilter(event, args)) + .slice(0, maxEvents); + } + break; + } + await sleep(100); + } + + return { + dropped: subscription.dropped || cursorDropped(subscription, cursorSeq), + event: matched[0], + events: matched, + matched: matched.length > 0, + nextCursor: makeEventCursor(subscription, matched.at(-1)?.seq ?? cursorSeq), + subscriptionId: subscription.subscriptionId, + timedOut: matched.length === 0 + }; + } + + private unsubscribeEvents(args: Record): unknown { + const subscription = this.requireSubscription(args); + subscription.unsubscribe(); + this.subscriptions.delete(subscription.subscriptionId); + return { + ok: true, + subscriptionId: subscription.subscriptionId + }; + } + + private requireSubscription(args: Record): EventSubscription { + const subscriptionId = requiredString(args.subscriptionId, "Browser event subscriptionId is required."); + const subscription = this.subscriptions.get(subscriptionId); + if (!subscription) { + throw new Error(`Browser event subscription was not found: ${subscriptionId}`); + } + return subscription; + } + + private requestHandoff(args: Record): unknown { + const session = this.resolveOptionalSession(args); + const sessionId = session?.ref.sessionId || readString(args.browserSessionId); + const tabId = readString(args.tabId) || session?.ref.tabId; + const handoff = builtInBrowserService.requestAutomationHandoff({ + kind: readHandoffKind(args.kind), + message: readString(args.message), + reason: requiredString(args.reason, "browser_handoff_request requires reason."), + sessionId, + tabId + }); + return { + ...humanHelpResultFields(handoff), + state: browserWindowState() + }; + } + + private async waitForHandoff(args: Record): Promise { + const session = this.resolveOptionalSession(args); + const handoffId = readString(args.handoffId); + const tabId = readString(args.tabId) || session?.ref.tabId; + const timeoutMs = clampInteger(readNumber(args.timeoutMs) ?? 300000, 100, 600000); + + const current = builtInBrowserService.getAutomationState().automationHandoff; + if (!handoffMatches(current, { handoffId, tabId })) { + const recentResolution = findRecentHandoffResolution({ handoffId, tabId }); + if (recentResolution) { + return handoffResolutionResult(recentResolution, undefined, false); + } + return { + handoff: current, + matched: false, + reason: current ? "A browser handoff is pending, but it does not match the requested handoffId/tabId." : "No browser handoff is currently pending.", + state: browserWindowState(), + timedOut: false + }; + } + + return await new Promise((resolve) => { + let settled = false; + const finish = (result: Record) => { + if (settled) { + return; + } + settled = true; + clearTimeout(timer); + unsubscribe(); + resolve(result); + }; + const unsubscribe = builtInBrowserService.subscribeAutomationEvents((event) => { + if (event.kind !== "handoff.completed" && event.kind !== "handoff.dismissed") { + return; + } + if (handoffId && event.handoffId !== handoffId) { + return; + } + if (tabId && event.tabId !== tabId) { + return; + } + finish(handoffResolutionResult(event, current, false)); + }); + const timer = setTimeout(() => { + finish({ + handoff: current, + matched: false, + state: browserWindowState(), + timedOut: true + }); + }, timeoutMs); + }); + } +} + +export const browserAutomationMcpService = new BrowserAutomationMcpService(); + +function browserWindowState(state = builtInBrowserService.getAutomationState()): Record { + return { + activeTabId: state.activeTabId, + tabs: state.tabs.map((tab) => summarizeTab(tab, state.activeTabId)), + windowId: builtInBrowserService.getAutomationWindowId() + }; +} + +function resolveChromeLoginImportDomains(args: Record, fallbackTabId?: string): string[] { + const explicit = uniqueStrings([ + ...readStringArray(args.domains), + ...(readString(args.domain) ? [readString(args.domain) as string] : []) + ].map(normalizeChromeLoginImportDomain).filter((domain): domain is string => Boolean(domain))); + if (explicit.length > 0) { + return explicit; + } + + const state = builtInBrowserService.getAutomationState(); + const tabId = readString(args.tabId) || fallbackTabId || state.activeTabId; + const tab = state.tabs.find((candidate) => candidate.id === tabId) || state.tabs.find((candidate) => candidate.id === state.activeTabId); + const domain = normalizeChromeLoginImportDomain(tab?.url); + if (!domain) { + throw new Error("browser_chrome_login_import requires domains or an active http(s) tab."); + } + return [domain]; +} + +function normalizeChromeLoginImportDomain(value: unknown): string | undefined { + const raw = readString(value)?.toLowerCase(); + if (!raw) { + return undefined; + } + try { + const url = new URL(raw.includes("://") ? raw : `https://${raw}`); + return url.hostname.replace(/^\*\./, "").replace(/^\./, ""); + } catch { + const domain = raw.replace(/^\*\./, "").replace(/^\./, "").split("/")[0]; + return domain && !domain.includes(" ") ? domain : undefined; + } +} + +function summarizeTab(tab: BuiltInBrowserTabState, activeTabId?: string): Record { + return { + canGoBack: tab.canGoBack, + canGoForward: tab.canGoForward, + displayUrl: tab.url, + isActive: tab.id === activeTabId, + isLoading: tab.isLoading, + tabId: tab.id, + title: tab.title, + url: tab.url, + windowId: builtInBrowserService.getAutomationWindowId() + }; +} + +function requiredTabState(state: BuiltInBrowserState, tabId: string): BuiltInBrowserTabState { + const tab = state.tabs.find((candidate) => candidate.id === tabId); + if (!tab) { + throw new Error(`Browser tab was not found: ${tabId}`); + } + return tab; +} + +function readSessionRef(value: unknown): BrowserSessionRef | undefined { + if (!isRecord(value)) { + return undefined; + } + const sessionId = readString(value.sessionId); + const tabId = readString(value.tabId); + if (!sessionId || !tabId) { + return undefined; + } + return { + sessionId, + tabId, + ...(readString(value.frameId) ? { frameId: readString(value.frameId) } : {}), + ...(readString(value.userId) ? { userId: readString(value.userId) } : {}) + }; +} + +async function pageActionResult( + webContents: WebContents, + session: BrowserSessionRef, + action: string, + result: unknown +): Promise> { + const handoff = await maybeRequestPageHandoff(webContents, { + session, + tabId: session.tabId + }); + return { + action, + ...(handoff ? humanHelpResultFields(handoff) : {}), + result, + session, + title: await webContents.getTitle(), + url: webContents.getURL() + }; +} + +async function captureAxSnapshot( + webContents: WebContents, + session: BrowserSessionRef, + options: { limit: number; rootAxNodeId?: string; scope: string } +): Promise { + const snapshot = await captureSnapshot(webContents, { + maxElements: options.limit, + maxText: options.scope === "outline" ? 0 : defaultSnapshotMaxText + }); + const record = isRecord(snapshot) ? snapshot : {}; + const title = readString(record.title) || await webContents.getTitle(); + const url = readString(record.url) || webContents.getURL(); + const elements = Array.isArray(record.elements) ? record.elements.filter(isRecord) : []; + const elementNodes = elements.map((element, index) => axNodeFromSnapshotElement(element, index)); + const rootNode = { + axNodeId: "document", + childAxNodeIds: elementNodes.map((node) => String(node.axNodeId)), + ignored: false, + name: title || url, + role: "document", + url + }; + let nodes: Array> = [rootNode, ...elementNodes]; + if (options.rootAxNodeId && options.rootAxNodeId !== "document") { + nodes = nodes.filter((node) => node.axNodeId === options.rootAxNodeId || node.ref === options.rootAxNodeId); + } + const result: AxSnapshotResult = { + nodes: nodes.slice(0, options.limit), + scope: options.scope, + session, + title, + url + }; + const handoff = await maybeRequestPageHandoff(webContents, { + session, + snapshot, + tabId: session.tabId + }); + return handoff ? { ...result, ...humanHelpResultFields(handoff) } : result; +} + +async function queryAxSnapshot( + webContents: WebContents, + session: BrowserSessionRef, + options: { limit: number; name?: string; role?: string; rootAxNodeId?: string; text?: string } +): Promise> { + const snapshot = await captureAxSnapshot(webContents, session, { + limit: 300, + rootAxNodeId: options.rootAxNodeId, + scope: "outline" + }); + const role = options.role?.toLowerCase(); + const name = options.name?.toLowerCase(); + const text = options.text?.toLowerCase(); + const matches = snapshot.nodes + .filter((node) => node.role !== "document") + .filter((node) => { + if (role && String(node.role || "").toLowerCase() !== role) { + return false; + } + if (name && !String(node.name || "").toLowerCase().includes(name)) { + return false; + } + if (text) { + const haystack = [ + node.name, + node.value, + node.description, + node.text, + node.placeholder + ].join(" ").toLowerCase(); + if (!haystack.includes(text)) { + return false; + } + } + return true; + }) + .slice(0, options.limit); + return { + ...(snapshot.handoff ? humanHelpResultFields(snapshot.handoff) : {}), + matches, + session, + title: snapshot.title, + url: snapshot.url + }; +} + +function axNodeFromSnapshotElement(element: Record, index: number): Record { + const ref = readString(element.ref) || `element-${index}`; + const text = readString(element.text); + const name = readString(element.name) || text || readString(element.placeholder) || ref; + const description = text && text !== name ? text : undefined; + return { + axNodeId: ref, + backendNodeId: readNumber(element.backendNodeId), + checked: element.checked === true ? true : undefined, + description, + disabled: element.disabled === true ? true : undefined, + href: readString(element.href), + ignored: false, + index, + name, + placeholder: readString(element.placeholder), + rect: isRecord(element.rect) ? element.rect : undefined, + ref, + role: readString(element.role) || readString(element.tag) || "generic", + tag: readString(element.tag), + text: description, + value: readString(element.value) + }; +} + +async function waitForReadiness( + webContents: WebContents, + waitUntil: string, + timeoutMs: number, + requestNavigation?: () => Promise, + expectedUrl?: string +): Promise { + if (waitUntil === "none") { + if (requestNavigation) { + await requestNavigation(); + } + return { matched: true, matchedEvent: "none", readinessUrl: safeWebContentsUrl(webContents), timedOut: false }; + } + if (webContents.isDestroyed()) { + return { matched: false, matchedEvent: "destroyed", timedOut: false }; + } + if (requestNavigation) { + const readiness = waitForNextReadinessEvent(webContents, waitUntil, timeoutMs, { + expectedUrl: normalizeNavigationUrlForMatch(expectedUrl), + previousUrl: safeWebContentsUrl(webContents) + }); + try { + await requestNavigation(); + } catch (error) { + return navigationFailureResult("navigation_request_failed", { + errorDescription: formatError(error), + url: normalizeNavigationUrlForMatch(expectedUrl) || safeWebContentsUrl(webContents) + }); + } + return await readiness; + } + + const deadline = Date.now() + timeoutMs; + while (Date.now() <= deadline) { + if (webContents.isDestroyed()) { + return { matched: false, matchedEvent: "destroyed", timedOut: false }; + } + + if (!webContents.isLoading()) { + const readinessUrl = safeWebContentsUrl(webContents); + if (isChromiumErrorPage(readinessUrl)) { + return navigationFailureResult("chrome-error", { + errorDescription: "Chromium displayed an internal error page.", + url: readinessUrl + }); + } + if (waitUntil === "interactive") { + const interactive = await interactiveReadinessResult(webContents, readinessUrl); + if (interactive) { + return interactive; + } + } + if (waitUntil === "domcontentloaded") { + return { matched: true, matchedEvent: "domcontentloaded", readinessUrl, timedOut: false }; + } + if (waitUntil === "load") { + return { matched: true, matchedEvent: "load", readinessUrl, timedOut: false }; + } + if (waitUntil === "network_idle") { + const idle = await waitForNoLoadingStart(webContents, Math.min(500, Math.max(0, deadline - Date.now()))); + if (idle && !webContents.isDestroyed() && !webContents.isLoading()) { + return { matched: true, matchedEvent: "network_idle", readinessUrl: safeWebContentsUrl(webContents), timedOut: false }; + } + } + } + + const event = await waitForReadinessEvent(webContents, Math.max(0, deadline - Date.now())); + if (event.type === "timeout") { + break; + } + if (event.type === "destroyed") { + return { matched: false, matchedEvent: "destroyed", timedOut: false }; + } + if (event.type === "did-fail-load" && event.errorCode !== -3) { + return navigationFailureResult("did-fail-load", event); + } + const eventUrl = event.url || safeWebContentsUrl(webContents); + if (isChromiumErrorPage(eventUrl)) { + return navigationFailureResult("chrome-error", { + errorDescription: "Chromium displayed an internal error page.", + url: eventUrl + }); + } + if (waitUntil === "interactive" && isInteractiveReadinessEvent(event)) { + const interactive = await interactiveReadinessResult(webContents, eventUrl); + if (interactive) { + return interactive; + } + } + if (waitUntil === "domcontentloaded" && event.type === "dom-ready") { + return { matched: true, matchedEvent: "domcontentloaded", readinessUrl: eventUrl, timedOut: false }; + } + if (waitUntil === "load" && (event.type === "did-finish-load" || event.type === "did-stop-loading") && !webContents.isDestroyed() && !webContents.isLoading()) { + return { matched: true, matchedEvent: "load", readinessUrl: eventUrl, timedOut: false }; + } + if (waitUntil === "network_idle" && (event.type === "did-finish-load" || event.type === "did-stop-loading") && !webContents.isDestroyed() && !webContents.isLoading()) { + const idle = await waitForNoLoadingStart(webContents, Math.min(500, Math.max(0, deadline - Date.now()))); + if (idle && !webContents.isDestroyed() && !webContents.isLoading()) { + return { matched: true, matchedEvent: "network_idle", readinessUrl: safeWebContentsUrl(webContents), timedOut: false }; + } + } + } + if (waitUntil === "interactive" || waitUntil === "network_idle") { + const fallback = await interactiveReadinessResult( + webContents, + undefined, + waitUntil === "network_idle" ? "interactive_after_network_idle_timeout" : "interactive" + ); + if (fallback) { + return fallback; + } + } + return { + matched: false, + matchedEvent: webContents.isDestroyed() ? "destroyed" : undefined, + timedOut: !webContents.isDestroyed() + }; +} + +async function waitForNextReadinessEvent( + webContents: WebContents, + waitUntil: string, + timeoutMs: number, + context: NavigationReadinessContext +): Promise { + const deadline = Date.now() + timeoutMs; + let navigationStarted = false; + let lastNavigationUrl: string | undefined; + + while (Date.now() <= deadline) { + if (webContents.isDestroyed()) { + return { matched: false, matchedEvent: "destroyed", timedOut: false }; + } + + const event = await waitForReadinessEvent(webContents, Math.max(0, deadline - Date.now())); + if (event.type === "timeout") { + break; + } + if (event.type === "destroyed") { + return { matched: false, matchedEvent: "destroyed", timedOut: false }; + } + + const eventUrl = event.url || safeWebContentsUrl(webContents); + if (isNavigationStartEvent(event)) { + if (event.isMainFrame !== false && isRelevantNavigationUrl(eventUrl, context)) { + navigationStarted = true; + lastNavigationUrl = eventUrl; + } + continue; + } + + if (event.type === "did-fail-load") { + if (event.errorCode === -3) { + continue; + } + if (event.isMainFrame !== false && (navigationStarted || isRelevantNavigationUrl(eventUrl, context))) { + return navigationFailureResult("did-fail-load", event); + } + continue; + } + + if (!navigationStarted) { + continue; + } + + if (isChromiumErrorPage(eventUrl)) { + return navigationFailureResult("chrome-error", { + errorDescription: "Chromium displayed an internal error page.", + url: eventUrl + }); + } + if (waitUntil === "interactive" && isInteractiveReadinessEvent(event)) { + const interactive = await interactiveReadinessResult(webContents, eventUrl || lastNavigationUrl); + if (interactive) { + return interactive; + } + } + if (waitUntil === "domcontentloaded" && event.type === "dom-ready") { + return { matched: true, matchedEvent: "domcontentloaded", readinessUrl: eventUrl || lastNavigationUrl, timedOut: false }; + } + if (waitUntil === "load" && (event.type === "did-finish-load" || event.type === "did-stop-loading") && !webContents.isDestroyed() && !webContents.isLoading()) { + return { matched: true, matchedEvent: "load", readinessUrl: eventUrl || lastNavigationUrl, timedOut: false }; + } + if (waitUntil === "network_idle" && (event.type === "did-finish-load" || event.type === "did-stop-loading") && !webContents.isDestroyed() && !webContents.isLoading()) { + const idle = await waitForNoLoadingStart(webContents, Math.min(500, Math.max(0, deadline - Date.now()))); + if (idle && !webContents.isDestroyed() && !webContents.isLoading()) { + return { matched: true, matchedEvent: "network_idle", readinessUrl: safeWebContentsUrl(webContents) || lastNavigationUrl, timedOut: false }; + } + } + } + if (waitUntil === "interactive" || waitUntil === "network_idle") { + const fallback = await interactiveReadinessResult( + webContents, + lastNavigationUrl, + waitUntil === "network_idle" ? "interactive_after_network_idle_timeout" : "interactive" + ); + if (fallback && (navigationStarted || isRelevantNavigationUrl(fallback.readinessUrl, context))) { + return fallback; + } + } + return { + matched: false, + matchedEvent: webContents.isDestroyed() ? "destroyed" : undefined, + timedOut: !webContents.isDestroyed() + }; +} + +function waitForReadinessEvent(webContents: WebContents, timeoutMs: number): Promise { + return new Promise((resolve) => { + let settled = false; + const finish = (event: ReadinessEvent) => { + if (settled) { + return; + } + settled = true; + clearTimeout(timer); + webContents.off("did-navigate", onDidNavigate); + webContents.off("did-redirect-navigation", onDidRedirectNavigation); + webContents.off("did-fail-load", onDidFailLoad); + webContents.off("did-finish-load", onDidFinishLoad); + webContents.off("did-start-navigation", onDidStartNavigation); + webContents.off("did-start-loading", onDidStartLoading); + webContents.off("did-stop-loading", onDidStopLoading); + webContents.off("dom-ready", onDomReady); + webContents.off("destroyed", onDestroyed); + resolve(event); + }; + const onDidFailLoad = ( + _event: ElectronEvent, + errorCode: number, + errorDescription: string, + validatedUrl: string, + isMainFrame?: boolean + ) => finish({ + errorCode, + errorDescription, + isMainFrame, + type: "did-fail-load", + url: validatedUrl || safeWebContentsUrl(webContents) + }); + const onDidFinishLoad = () => finish({ type: "did-finish-load", url: safeWebContentsUrl(webContents) }); + const onDidNavigate = (_event: ElectronEvent, url: string) => finish({ isMainFrame: true, type: "did-navigate", url }); + const onDidRedirectNavigation = (_event: ElectronEvent, url: string, isInPlace?: boolean, isMainFrame?: boolean) => { + finish({ isMainFrame, type: isInPlace ? "did-navigate-in-page" : "did-redirect-navigation", url }); + }; + const onDidStartNavigation = (_event: ElectronEvent, url: string, isInPlace?: boolean, isMainFrame?: boolean) => { + finish({ isMainFrame, type: isInPlace ? "did-navigate-in-page" : "did-start-navigation", url }); + }; + const onDidStartLoading = () => finish({ type: "did-start-loading", url: safeWebContentsUrl(webContents) }); + const onDidStopLoading = () => finish({ type: "did-stop-loading", url: safeWebContentsUrl(webContents) }); + const onDomReady = () => finish({ type: "dom-ready", url: safeWebContentsUrl(webContents) }); + const onDestroyed = () => finish({ type: "destroyed" }); + const timer = setTimeout(() => finish({ type: "timeout" }), Math.max(0, timeoutMs)); + + webContents.once("did-navigate", onDidNavigate); + webContents.once("did-redirect-navigation", onDidRedirectNavigation); + webContents.once("did-fail-load", onDidFailLoad); + webContents.once("did-finish-load", onDidFinishLoad); + webContents.once("did-start-navigation", onDidStartNavigation); + webContents.once("did-start-loading", onDidStartLoading); + webContents.once("did-stop-loading", onDidStopLoading); + webContents.once("dom-ready", onDomReady); + webContents.once("destroyed", onDestroyed); + }); +} + +function waitForNoLoadingStart(webContents: WebContents, timeoutMs: number): Promise { + return new Promise((resolve) => { + let settled = false; + const finish = (idle: boolean) => { + if (settled) { + return; + } + settled = true; + clearTimeout(timer); + webContents.off("did-start-loading", onDidStartLoading); + webContents.off("destroyed", onDestroyed); + resolve(idle); + }; + const onDidStartLoading = () => finish(false); + const onDestroyed = () => finish(false); + const timer = setTimeout(() => finish(true), Math.max(0, timeoutMs)); + webContents.once("did-start-loading", onDidStartLoading); + webContents.once("destroyed", onDestroyed); + }); +} + +async function interactiveReadinessResult( + webContents: WebContents, + fallbackUrl?: string, + matchedEvent = "interactive" +): Promise { + if (webContents.isDestroyed()) { + return undefined; + } + const readinessUrl = safeWebContentsUrl(webContents) || fallbackUrl; + if (!isUsableInteractiveUrl(readinessUrl)) { + return undefined; + } + const readyState = await documentReadyState(webContents); + if (readyState === "interactive" || readyState === "complete" || !webContents.isLoading()) { + return { matched: true, matchedEvent, readinessUrl, timedOut: false }; + } + return undefined; +} + +async function documentReadyState(webContents: WebContents): Promise { + try { + const value = await executeJavaScriptWithTimeout( + webContents, + "document.readyState", + 1000, + "Document readiness check" + ); + return typeof value === "string" ? value : undefined; + } catch { + return undefined; + } +} + +function isInteractiveReadinessEvent(event: ReadinessEvent): boolean { + return event.type === "dom-ready" || + event.type === "did-finish-load" || + event.type === "did-stop-loading"; +} + +function isUsableInteractiveUrl(value: string | undefined): value is string { + return Boolean(value) && !isBlankPageUrl(value) && !isChromiumErrorPage(value); +} + +function navigationFailureResult(matchedEvent: string, event: Pick): ReadinessResult { + return { + matched: false, + matchedEvent, + navigationError: { + ...(event.errorCode !== undefined ? { errorCode: event.errorCode } : {}), + ...(event.errorDescription ? { errorDescription: event.errorDescription } : {}), + ...(event.url ? { url: event.url } : {}) + }, + readinessUrl: event.url, + timedOut: false + }; +} + +function isNavigationStartEvent(event: ReadinessEvent): boolean { + return event.type === "did-start-navigation" || + event.type === "did-redirect-navigation" || + event.type === "did-navigate"; +} + +function isRelevantNavigationUrl(url: string | undefined, context: NavigationReadinessContext): boolean { + if (!url) { + return false; + } + const normalizedUrl = normalizeUrlForComparison(url); + if (!normalizedUrl) { + return false; + } + if (context.expectedUrl && urlsMatchForNavigation(normalizedUrl, context.expectedUrl)) { + return true; + } + if (isChromiumErrorPage(normalizedUrl)) { + return true; + } + if (isBlankPageUrl(normalizedUrl)) { + return isBlankPageUrl(context.expectedUrl); + } + if (!context.previousUrl) { + return true; + } + return !urlsMatchForNavigation(normalizedUrl, context.previousUrl); +} + +function normalizeNavigationUrlForMatch(value: string | undefined): string | undefined { + const trimmed = value?.trim(); + if (!trimmed) { + return undefined; + } + if (isBlankPageUrl(trimmed) || isChromiumErrorPage(trimmed)) { + return trimmed; + } + if (/^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed)) { + return normalizeUrlForComparison(trimmed); + } + if (/^(localhost|127\.0\.0\.1|\[::1\])(?::\d+)?(?:\/|$)/i.test(trimmed) || trimmed.includes(".")) { + return normalizeUrlForComparison(`https://${trimmed}`); + } + return normalizeUrlForComparison(`https://www.google.com/search?q=${encodeURIComponent(trimmed)}`); +} + +function normalizeUrlForComparison(value: string | undefined): string | undefined { + const trimmed = value?.trim(); + if (!trimmed) { + return undefined; + } + try { + const url = new URL(trimmed); + url.hash = ""; + return url.toString(); + } catch { + return trimmed; + } +} + +function urlsMatchForNavigation(left: string | undefined, right: string | undefined): boolean { + if (!left || !right) { + return false; + } + const normalizedLeft = normalizeUrlForComparison(left); + const normalizedRight = normalizeUrlForComparison(right); + if (!normalizedLeft || !normalizedRight) { + return false; + } + if (normalizedLeft === normalizedRight) { + return true; + } + try { + const leftUrl = new URL(normalizedLeft); + const rightUrl = new URL(normalizedRight); + return leftUrl.protocol === rightUrl.protocol && + leftUrl.hostname === rightUrl.hostname && + leftUrl.pathname === rightUrl.pathname && + leftUrl.search === rightUrl.search; + } catch { + return normalizedLeft === normalizedRight; + } +} + +function isBlankPageUrl(value: string | undefined): boolean { + return value === "about:blank"; +} + +function isChromiumErrorPage(value: string | undefined): boolean { + return value === "chrome-error://chromewebdata/"; +} + +function safeWebContentsUrl(webContents: WebContents): string | undefined { + if (webContents.isDestroyed()) { + return undefined; + } + try { + return webContents.getURL(); + } catch { + return undefined; + } +} + +function normalizeWaitUntil(value: string | undefined, fallback: string): string { + const normalized = (value || fallback).toLowerCase().replace(/[-\s]/g, "_"); + if (normalized === "auto" || normalized === "interactive" || normalized === "ready") { + return "interactive"; + } + if (normalized === "dom_ready" || normalized === "domcontentloaded") { + return "domcontentloaded"; + } + if (normalized === "networkidle" || normalized === "network_idle") { + return "network_idle"; + } + if (normalized === "none" || normalized === "load") { + return normalized; + } + return fallback; +} + +function readHandoffKind(value: unknown): BuiltInBrowserAutomationHandoffKind { + const kind = readString(value); + if ( + kind === "blocked" || + kind === "human_verification" || + kind === "login_required" || + kind === "other" || + kind === "verification_code" + ) { + return kind; + } + return "other"; +} + +function normalizeEventChannels(values: string[]): Set { + const normalized = values + .map((value) => value.toLowerCase().trim()) + .filter(Boolean); + if (normalized.length === 0) { + return new Set(["tab", "navigation", "dom", "runtime", "dialog", "download", "input", "focus", "selection", "handoff"]); + } + return new Set(normalized); +} + +function matchesSubscriptionEvent(subscription: EventSubscription, event: BrowserAutomationEvent): boolean { + const channel = eventChannel(event.kind); + if (!subscription.channels.has(channel) && !subscription.channels.has(event.kind) && !subscription.channels.has("*")) { + return false; + } + if (!subscription.ref) { + return true; + } + if (!event.tabId || event.tabId === subscription.ref.tabId) { + return true; + } + return channel === "tab"; +} + +function eventChannel(kind: string): string { + if (kind.startsWith("tab.")) return "tab"; + if (kind.startsWith("page.navigation") || kind.startsWith("page.loading")) return "navigation"; + if (kind === "page.dom_ready") return "dom"; + if (kind.startsWith("runtime.")) return "runtime"; + if (kind.startsWith("dialog.")) return "dialog"; + if (kind.startsWith("download.")) return "download"; + if (kind.startsWith("handoff.")) return "handoff"; + if (kind.startsWith("input.")) return "input"; + if (kind.startsWith("focus.")) return "focus"; + if (kind.startsWith("selection.")) return "selection"; + return kind.split(".")[0] || kind; +} + +function subscriptionDescriptor(subscription: EventSubscription): Record { + return { + channels: [...subscription.channels], + cursor: makeEventCursor(subscription), + redactTextInput: subscription.redactTextInput, + sampleMouseMove: subscription.sampleMouseMove, + session: subscription.ref, + startedAt: subscription.startedAt, + subscriptionId: subscription.subscriptionId + }; +} + +function findRecentHandoffResolution(filter: { handoffId?: string; tabId?: string }): BrowserAutomationEvent | undefined { + const events = builtInBrowserService.getAutomationEvents({ replayRecentMs: automationEventReplayMs }); + for (let index = events.length - 1; index >= 0; index -= 1) { + const event = events[index]; + if (event.kind !== "handoff.completed" && event.kind !== "handoff.dismissed") { + continue; + } + if (filter.handoffId && event.handoffId !== filter.handoffId) { + continue; + } + if (filter.tabId && event.tabId !== filter.tabId) { + continue; + } + return event; + } + return undefined; +} + +function handoffResolutionResult( + event: BrowserAutomationEvent, + handoff: BuiltInBrowserAutomationHandoff | undefined, + timedOut: boolean +): Record { + return { + event, + handoff, + matched: !timedOut, + state: browserWindowState(), + status: event.handoffStatus || (event.kind === "handoff.completed" ? "completed" : "dismissed"), + timedOut, + title: event.title, + url: event.url + }; +} + +function eventsAfterCursor(subscription: EventSubscription, cursorSeq?: number): BrowserAutomationEvent[] { + const seq = cursorSeq ?? 0; + return subscription.events.filter((event) => event.seq > seq); +} + +function cursorDropped(subscription: EventSubscription, cursorSeq?: number): boolean { + if (cursorSeq === undefined || subscription.events.length === 0) { + return subscription.dropped; + } + return subscription.dropped && cursorSeq < subscription.events[0].seq - 1; +} + +function makeEventCursor(subscription: EventSubscription, seq?: number): Record { + const lastEvent = subscription.events.findLast((event) => seq === undefined || event.seq <= seq) || subscription.events.at(-1); + return { + dropped: subscription.dropped, + seq: seq ?? lastEvent?.seq ?? 0, + subscriptionId: subscription.subscriptionId, + ts: lastEvent?.ts ?? subscription.startedAt + }; +} + +function readCursorSeq(value: unknown): number | undefined { + if (!isRecord(value)) { + return undefined; + } + return readNumber(value.seq); +} + +function matchesAwaitFilter(event: BrowserAutomationEvent, args: Record): boolean { + const match = isRecord(args.match) ? args.match : args; + const kinds = readStringArray(match.kinds); + const kind = readString(match.kind); + if (kind && event.kind !== kind) { + return false; + } + if (kinds.length > 0 && !kinds.includes(event.kind)) { + return false; + } + const tabId = readString(match.tabId); + if (tabId && event.tabId !== tabId) { + return false; + } + const windowId = readString(match.windowId); + if (windowId && event.windowId !== windowId) { + return false; + } + return stringMatchesPattern(event.url, readString(match.urlPattern)) + && stringMatchesPattern(event.title, readString(match.titlePattern)) + && stringMatchesPattern(event.summary, readString(match.summaryPattern)); +} + +function stringMatchesPattern(value: string | undefined, pattern: string | undefined): boolean { + if (!pattern) { + return true; + } + const haystack = value || ""; + try { + return new RegExp(pattern).test(haystack); + } catch { + return haystack.toLowerCase().includes(pattern.toLowerCase()); + } +} + +async function handleJavaScriptDialog( + webContents: WebContents, + accept: boolean, + promptText: string | undefined, + session: BrowserSessionRef +): Promise> { + let attachedHere = false; + try { + if (!webContents.debugger.isAttached()) { + webContents.debugger.attach("1.3"); + attachedHere = true; + } + await withTimeout(webContents.debugger.sendCommand("Page.enable"), defaultJavascriptTimeoutMs, "Timed out enabling browser dialog handling."); + await withTimeout( + webContents.debugger.sendCommand("Page.handleJavaScriptDialog", { + accept, + ...(promptText !== undefined ? { promptText } : {}) + }), + defaultJavascriptTimeoutMs, + "Timed out handling browser dialog." + ); + return { + accepted: accept, + ok: true, + promptText, + session, + title: await webContents.getTitle(), + url: webContents.getURL() + }; + } catch (error) { + throw new Error(`Failed to handle browser dialog: ${formatError(error)}`); + } finally { + if (attachedHere && webContents.debugger.isAttached()) { + try { + webContents.debugger.detach(); + } catch { + // Ignore detach errors after the dialog is resolved. + } + } + } +} + +async function executeJavaScriptWithTimeout( + webContents: WebContents, + script: string, + timeoutMs: number, + label: string +): Promise { + if (webContents.isDestroyed()) { + throw new Error(`${label} failed because the browser tab is destroyed.`); + } + return await withTimeout( + webContents.executeJavaScript(script, true) as Promise, + timeoutMs, + `${label} timed out after ${timeoutMs}ms.` + ); +} + +async function withTimeout(promise: Promise, timeoutMs: number, message: string): Promise { + let timer: ReturnType | undefined; + try { + return await Promise.race([ + promise, + new Promise((_resolve, reject) => { + timer = setTimeout(() => reject(new Error(message)), Math.max(0, timeoutMs)); + }) + ]); + } finally { + if (timer) { + clearTimeout(timer); + } + } +} + +async function captureSnapshot(webContents: WebContents, options: SnapshotOptions): Promise { + return await executeJavaScriptWithTimeout( + webContents, + `(${snapshotScript})(${JSON.stringify(options)})`, + defaultJavascriptTimeoutMs, + "Browser snapshot" + ) as unknown; +} + +async function captureSnapshotWithHandoff( + webContents: WebContents, + tabId: string | undefined, + options: SnapshotOptions +): Promise { + const snapshot = await captureSnapshot(webContents, options); + const handoff = await maybeRequestPageHandoff(webContents, { + snapshot, + tabId + }); + if (!handoff || !isRecord(snapshot)) { + return snapshot; + } + return { + ...snapshot, + ...humanHelpResultFields(handoff) + }; +} + +async function maybeRequestHandoffAfterNavigation( + webContents: WebContents, + readiness: ReadinessResult, + options: { + requestedUrl?: string; + session?: BrowserSessionRef; + tabId?: string; + waitUntil?: string; + } +): Promise { + if (webContents.isDestroyed()) { + return undefined; + } + + if (!readiness.navigationError) { + const pageHandoff = await maybeRequestPageHandoff(webContents, { + session: options.session, + tabId: options.tabId + }); + if (pageHandoff) { + return pageHandoff; + } + } + + return maybeRequestNavigationHandoff(webContents, readiness, options); +} + +function maybeRequestNavigationHandoff( + webContents: WebContents, + readiness: ReadinessResult, + options: { + requestedUrl?: string; + session?: BrowserSessionRef; + tabId?: string; + waitUntil?: string; + } +): BuiltInBrowserAutomationHandoff | undefined { + if (readiness.matched || webContents.isDestroyed()) { + return undefined; + } + + const tabId = options.tabId || options.session?.tabId; + const existing = existingHandoffForTab(tabId); + if (existing) { + return existing; + } + + const currentUrl = safeWebContentsUrl(webContents); + const target = options.requestedUrl || readiness.readinessUrl || currentUrl || "the requested page"; + const error = readiness.navigationError; + const reason = error + ? `Browser navigation was blocked or failed while opening ${target}${error.errorCode !== undefined ? ` (error ${error.errorCode})` : ""}${error.errorDescription ? `: ${error.errorDescription}` : "."}` + : `Browser automation did not reach ${options.waitUntil || "the requested readiness state"} while opening ${target}.`; + + return builtInBrowserService.requestAutomationHandoff({ + kind: "blocked", + message: "Please inspect this browser page and complete or retry the blocked step, then click Done.", + reason, + sessionId: options.session?.sessionId, + tabId + }); +} + +async function maybeRequestPageHandoff( + webContents: WebContents, + options: { + session?: BrowserSessionRef; + snapshot?: unknown; + tabId?: string; + } = {} +): Promise { + if (webContents.isDestroyed()) { + return undefined; + } + + let snapshot = options.snapshot; + if (snapshot === undefined) { + try { + snapshot = await captureSnapshot(webContents, { + maxElements: 20, + maxText: 1200 + }); + } catch { + snapshot = undefined; + } + } + + const detection = detectPageHandoff(snapshot, { + title: await webContents.getTitle(), + url: webContents.getURL() + }); + if (!detection) { + return undefined; + } + + const tabId = options.tabId || options.session?.tabId; + const existing = existingHandoffForTab(tabId); + if (existing) { + return existing; + } + + return builtInBrowserService.requestAutomationHandoff({ + kind: detection.kind, + message: detection.message, + reason: detection.reason, + sessionId: options.session?.sessionId, + tabId + }); +} + +function existingHandoffForTab(tabId: string | undefined): BuiltInBrowserAutomationHandoff | undefined { + const existing = builtInBrowserService.getAutomationState().automationHandoff; + if (existing && (!tabId || existing.tabId === tabId)) { + return existing; + } + return undefined; +} + +function handoffMatches( + handoff: BuiltInBrowserAutomationHandoff | undefined, + filter: { handoffId?: string; tabId?: string } +): boolean { + if (!handoff) { + return false; + } + if (filter.handoffId && handoff.id !== filter.handoffId) { + return false; + } + if (filter.tabId && handoff.tabId !== filter.tabId) { + return false; + } + return true; +} + +function detectPageHandoff(snapshot: unknown, fallback: { title?: string; url?: string }): BrowserHandoffDetection | undefined { + const record = isRecord(snapshot) ? snapshot : {}; + const title = readString(record.title) || fallback.title || ""; + const url = readString(record.url) || fallback.url || ""; + const signal = pageHandoffSignal(record, title, url); + if (isChromiumErrorPage(url)) { + return { + kind: "blocked", + message: "Please inspect this browser error page and retry or complete the blocked step, then click Done.", + reason: "Chromium displayed an internal error page for this navigation." + }; + } + if (!signal) { + return undefined; + } + + const verificationCode = /verification code|security code|one[-\s]?time code|2[-\s]?step|two[-\s]?step|authenticator|check your (?:phone|email)|enter the code/.test(signal); + if (verificationCode) { + return { + kind: "verification_code", + message: "Please enter the verification code in this browser window, then click Done.", + reason: `The page appears to require a verification code: ${title || url || "current page"}.` + }; + } + + const cloudflare = signal.includes("cloudflare") || /\bray id\s*:/.test(signal); + const botVerification = /performing security verification|security verification|verif(?:y|ies|ying)[^.\n]{0,80}(?:not a bot|human)|not a bot|not a robot|human verification|are you human|checking your browser|security check/.test(signal); + const challenge = /captcha|hcaptcha|recaptcha|turnstile|cf-challenge|cf-turnstile/.test(signal); + const justAMoment = title.trim().toLowerCase() === "just a moment..." || signal.includes("just a moment..."); + if (challenge || (cloudflare && (botVerification || justAMoment))) { + return { + kind: "human_verification", + message: "Please complete the security verification in this browser window, then click Done.", + reason: `The page appears to be a human verification or bot-protection challenge: ${title || url || "current page"}.` + }; + } + + const loginUrl = /(?:^|[/.?=&_-])(?:login|signin|sign-in|accounts)(?:[/.?=&_-]|$)/.test(url.toLowerCase()) || + /accounts\.google\.com|mail\.google\.com/.test(url.toLowerCase()); + const loginTitle = /\bsign in\b|\blog in\b|\blogin\b|google accounts|account login/.test(title.toLowerCase()); + const credentialFields = /email or phone|email address|username|password|forgot (?:email|password)|create account|\bnext\b/.test(signal); + if ((loginUrl || loginTitle) && credentialFields) { + return { + kind: "login_required", + message: "Please sign in in this browser window, then click Done.", + reason: `The page appears to require a human login: ${title || url || "current page"}.` + }; + } + + return undefined; +} + +function humanHelpResultFields(handoff: BuiltInBrowserAutomationHandoff): Record { + return { + handoff, + handoffRequired: true, + humanHelp: { + aliasTool: "askHumanHelp", + instruction: "Browser automation needs human help. The browser window has been shown with a top toolbar instruction. Call browser_handoff_wait to receive the user's Done/Hide result before continuing automation.", + handoffId: handoff.id, + message: handoff.message, + reason: handoff.reason, + required: true, + status: "requested", + tool: "browser_handoff_wait" + }, + humanHelpRequired: true, + nextAction: "human_help" + }; +} + +function pageHandoffSignal(record: Record, title: string, url: string): string { + const parts = [title, url, rawString(record.text)]; + const activeElement = isRecord(record.activeElement) ? record.activeElement : undefined; + if (activeElement) { + parts.push(rawString(activeElement.name), rawString(activeElement.text), rawString(activeElement.role)); + } + const elements = Array.isArray(record.elements) ? record.elements : []; + for (const element of elements.slice(0, 40)) { + if (!isRecord(element)) { + continue; + } + parts.push( + rawString(element.name), + rawString(element.text), + rawString(element.role), + rawString(element.tag), + rawString(element.href) + ); + } + return parts + .filter((part): part is string => Boolean(part)) + .join("\n") + .replace(/\s+/g, " ") + .toLowerCase(); +} + +async function runTargetAction( + webContents: WebContents, + action: "click" | "focus" | "scroll" | "select" | "type", + target?: BrowserTarget, + value: Record = {} +): Promise { + const result = await executeJavaScriptWithTimeout( + webContents, + `(${targetActionScript})(${JSON.stringify({ action, target, value })})`, + defaultJavascriptTimeoutMs, + `Browser target action ${action}` + ) as { error?: string; ok?: boolean }; + if (!result?.ok) { + throw new Error(result?.error || `Browser target action failed: ${action}`); + } + return result; +} + +async function pressKey(webContents: WebContents, key: string, target?: BrowserTarget): Promise { + if (target) { + await runTargetAction(webContents, "focus", target); + } + webContents.sendInputEvent({ keyCode: key, type: "keyDown" }); + webContents.sendInputEvent({ keyCode: key, type: "keyUp" }); + return { + key, + ok: true, + title: await webContents.getTitle(), + url: webContents.getURL() + }; +} + +async function waitForPageCondition( + webContents: WebContents, + condition: { + selector?: string; + text?: string; + timeoutMs: number; + urlIncludes?: string; + urlMatches?: string; + } +): Promise { + const deadline = Date.now() + condition.timeoutMs; + let last: unknown; + while (Date.now() <= deadline) { + try { + last = await executeJavaScriptWithTimeout( + webContents, + `(${waitForConditionScript})(${JSON.stringify(condition)})`, + Math.max(100, Math.min(1000, deadline - Date.now())), + "Browser wait condition check" + ) as unknown; + if (isRecord(last) && last.matched === true) { + return last; + } + } catch (error) { + last = { + error: formatError(error), + matched: false + }; + } + await sleep(150); + } + return { + last, + matched: false, + timedOut: true, + title: await webContents.getTitle(), + url: webContents.getURL() + }; +} + +const snapshotScript = function(options: { limit?: number; maxElements: number; maxText?: number; offset?: number }) { + const maxElements = Math.max(1, Math.min(300, Math.floor(options.maxElements || 80))); + const textLimitInput = options.limit ?? options.maxText ?? 3000; + const textLimit = Math.max(0, Math.min(20000, Math.floor(textLimitInput))); + const requestedTextOffset = Math.max(0, Math.floor(options.offset || 0)); + const refAttribute = "data-ccr-browser-ref"; + const elementSelector = [ + "a[href]", + "button", + "input", + "textarea", + "select", + "summary", + "[role]", + "[contenteditable='true']", + "[contenteditable='plaintext-only']", + "[tabindex]:not([tabindex='-1'])" + ].join(","); + + function visible(el: Element) { + const style = window.getComputedStyle(el); + const rect = el.getBoundingClientRect(); + return style.display !== "none" && + style.visibility !== "hidden" && + Number(style.opacity || "1") > 0 && + rect.width > 0 && + rect.height > 0; + } + + function cssEscape(value: string) { + return window.CSS && typeof window.CSS.escape === "function" + ? window.CSS.escape(value) + : value.replace(/[^a-zA-Z0-9_-]/g, "\\$&"); + } + + function uniqueIdSelector(id: string) { + if (!id) return ""; + const selector = `#${cssEscape(id)}`; + try { + return document.querySelectorAll(selector).length === 1 ? selector : ""; + } catch { + return ""; + } + } + + function refFor(el: Element) { + const win = window as Window & { __ccrBrowserRefSeq?: number }; + const existing = el.getAttribute(refAttribute); + if (existing) { + return `[${refAttribute}="${cssEscape(existing)}"]`; + } + for (let attempt = 0; attempt < 1000; attempt += 1) { + win.__ccrBrowserRefSeq = (win.__ccrBrowserRefSeq || 0) + 1; + const nextRef = `ccr-${win.__ccrBrowserRefSeq}`; + const selector = `[${refAttribute}="${cssEscape(nextRef)}"]`; + if (!document.querySelector(selector)) { + el.setAttribute(refAttribute, nextRef); + return selector; + } + } + + const idSelector = uniqueIdSelector((el as HTMLElement).id || ""); + if (idSelector) return idSelector; + const parts: string[] = []; + let current: Element | null = el; + while (current && current.nodeType === 1 && current !== document.documentElement && parts.length < 8) { + const tag = current.tagName.toLowerCase(); + const parent: HTMLElement | null = current.parentElement; + if (!parent) { + parts.unshift(tag); + break; + } + const parentIdSelector = uniqueIdSelector(parent.id || ""); + const sameTag = Array.from(parent.children).filter((child): child is Element => child instanceof Element && child.tagName === current!.tagName); + const index = sameTag.indexOf(current) + 1; + parts.unshift(`${tag}:nth-of-type(${Math.max(index, 1)})`); + if (parentIdSelector) { + parts.unshift(parentIdSelector); + break; + } + current = parent; + } + return parts.join(" > "); + } + + function text(el: Element) { + return ((el as HTMLElement).innerText || el.textContent || "").replace(/\s+/g, " ").trim(); + } + + function labelText(el: Element) { + const labelledBy = el.getAttribute("aria-labelledby"); + if (labelledBy) { + const value = labelledBy + .split(/\s+/) + .map((id) => document.getElementById(id)?.innerText || "") + .join(" ") + .replace(/\s+/g, " ") + .trim(); + if (value) return value; + } + const id = (el as HTMLInputElement).id; + if (id) { + const label = document.querySelector(`label[for="${cssEscape(id)}"]`); + if (label) return text(label); + } + const wrappingLabel = el.closest("label"); + return wrappingLabel ? text(wrappingLabel) : ""; + } + + function unsafeField(el: Element) { + const input = el as HTMLInputElement; + const haystack = [ + input.type, + input.name, + input.id, + input.autocomplete, + el.getAttribute("aria-label"), + labelText(el) + ].join(" ").toLowerCase(); + return /\b(password|secret|token|api[-_ ]?key|bearer|credential)\b/.test(haystack); + } + + function valueOf(el: Element) { + if (!(el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement)) { + return ""; + } + if (unsafeField(el)) { + return ""; + } + return el.value || ""; + } + + function roleOf(el: Element) { + const explicit = el.getAttribute("role"); + if (explicit) return explicit; + const tag = el.tagName.toLowerCase(); + const input = el as HTMLInputElement; + if (tag === "a") return "link"; + if (tag === "button") return "button"; + if (tag === "textarea") return "textbox"; + if (tag === "select") return "combobox"; + if (tag === "summary") return "button"; + if (tag === "input") { + if (["button", "submit", "reset"].includes(input.type)) return "button"; + if (input.type === "checkbox") return "checkbox"; + if (input.type === "radio") return "radio"; + if (input.type === "range") return "slider"; + return "textbox"; + } + if (el.getAttribute("contenteditable")) return "textbox"; + return ""; + } + + function nameOf(el: Element) { + const input = el as HTMLInputElement; + return ( + el.getAttribute("aria-label") || + labelText(el) || + el.getAttribute("alt") || + el.getAttribute("title") || + input.placeholder || + (input.type && ["button", "submit", "reset"].includes(input.type) ? input.value : "") || + text(el) + ).replace(/\s+/g, " ").trim(); + } + + const elements = Array.from(document.querySelectorAll(elementSelector)) + .filter(visible) + .slice(0, maxElements) + .map((el, index) => { + const rect = el.getBoundingClientRect(); + return { + checked: el instanceof HTMLInputElement && ["checkbox", "radio"].includes(el.type) ? el.checked : undefined, + disabled: (el as HTMLButtonElement | HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement).disabled || undefined, + href: el instanceof HTMLAnchorElement ? el.href : undefined, + index, + name: nameOf(el).slice(0, 240), + placeholder: (el as HTMLInputElement).placeholder || undefined, + rect: { + height: Math.round(rect.height), + width: Math.round(rect.width), + x: Math.round(rect.x), + y: Math.round(rect.y) + }, + ref: refFor(el), + role: roleOf(el), + tag: el.tagName.toLowerCase(), + text: text(el).slice(0, 180), + value: valueOf(el) || undefined + }; + }); + + const pageText = (document.body?.innerText || "").replace(/\s+\n/g, "\n").replace(/\n{3,}/g, "\n\n").trim(); + const textOffset = Math.min(requestedTextOffset, pageText.length); + const textWindow = pageText.slice(textOffset, textOffset + textLimit); + const textNextOffset = textOffset + textWindow.length; + + return { + activeElement: document.activeElement ? { + name: nameOf(document.activeElement).slice(0, 240), + ref: refFor(document.activeElement), + role: roleOf(document.activeElement), + tag: document.activeElement.tagName.toLowerCase() + } : undefined, + elements, + text: textWindow, + textHasMore: textNextOffset < pageText.length, + textLength: pageText.length, + textLimit, + textNextOffset, + textOffset, + textRemaining: Math.max(0, pageText.length - textNextOffset), + textReturned: textWindow.length, + textRequestedOffset: requestedTextOffset !== textOffset ? requestedTextOffset : undefined, + title: document.title, + url: location.href + }; +}; + +const targetActionScript = function(request: { + action: "click" | "focus" | "scroll" | "select" | "type"; + target?: BrowserTarget; + value?: Record; +}) { + function visible(el: Element) { + const style = window.getComputedStyle(el); + const rect = el.getBoundingClientRect(); + return style.display !== "none" && style.visibility !== "hidden" && rect.width > 0 && rect.height > 0; + } + function text(el: Element) { + return ((el as HTMLElement).innerText || el.textContent || "").replace(/\s+/g, " ").trim(); + } + function cssEscape(value: string) { + return window.CSS && typeof window.CSS.escape === "function" + ? window.CSS.escape(value) + : value.replace(/[^a-zA-Z0-9_-]/g, "\\$&"); + } + function labelText(el: Element) { + const id = (el as HTMLInputElement).id; + if (id) { + const label = document.querySelector(`label[for="${cssEscape(id)}"]`); + if (label) return text(label); + } + const wrappingLabel = el.closest("label"); + return wrappingLabel ? text(wrappingLabel) : ""; + } + function roleOf(el: Element) { + const explicit = el.getAttribute("role"); + if (explicit) return explicit.toLowerCase(); + const tag = el.tagName.toLowerCase(); + const input = el as HTMLInputElement; + if (tag === "a") return "link"; + if (tag === "button") return "button"; + if (tag === "textarea") return "textbox"; + if (tag === "select") return "combobox"; + if (tag === "summary") return "button"; + if (tag === "input") { + if (["button", "submit", "reset"].includes(input.type)) return "button"; + if (input.type === "checkbox") return "checkbox"; + if (input.type === "radio") return "radio"; + return "textbox"; + } + if (el.getAttribute("contenteditable")) return "textbox"; + return ""; + } + function nameOf(el: Element) { + const input = el as HTMLInputElement; + return ( + el.getAttribute("aria-label") || + labelText(el) || + el.getAttribute("alt") || + el.getAttribute("title") || + input.placeholder || + input.value || + text(el) + ).replace(/\s+/g, " ").trim(); + } + function summarize(el: Element) { + const rect = el.getBoundingClientRect(); + return { + name: nameOf(el).slice(0, 240), + rect: { + height: Math.round(rect.height), + width: Math.round(rect.width), + x: Math.round(rect.x), + y: Math.round(rect.y) + }, + role: roleOf(el), + tag: el.tagName.toLowerCase(), + text: text(el).slice(0, 180) + }; + } + function selectorElement(selector: string) { + try { + return document.querySelector(selector); + } catch { + return null; + } + } + function matchesText(value: string, needle: string, exact?: boolean) { + const left = value.trim().toLowerCase(); + const right = needle.trim().toLowerCase(); + return exact ? left === right : left.includes(right); + } + function findTarget(target?: BrowserTarget) { + if (!target && request.action !== "scroll") return null; + const directSelector = target?.selector || target?.ref || target?.axNodeId; + if (directSelector) { + return selectorElement(directSelector); + } + const selector = [ + "a[href]", + "button", + "input", + "textarea", + "select", + "summary", + "[role]", + "[contenteditable='true']", + "[contenteditable='plaintext-only']", + "[tabindex]:not([tabindex='-1'])" + ].join(","); + const candidates = Array.from(document.querySelectorAll(selector)).filter(visible); + const role = target?.role?.trim().toLowerCase(); + const needle = target?.text?.trim(); + const matches = candidates.filter((el) => { + if (role && roleOf(el) !== role) return false; + if (!needle) return true; + const haystack = [ + nameOf(el), + text(el), + (el as HTMLInputElement).placeholder || "", + (el as HTMLInputElement).value || "" + ].join(" "); + return matchesText(haystack, needle, target?.exact); + }); + return matches[Math.max(0, Math.floor(target?.index || 0))] || null; + } + function dispatchValueEvents(el: Element) { + el.dispatchEvent(new Event("input", { bubbles: true })); + el.dispatchEvent(new Event("change", { bubbles: true })); + } + + const el = findTarget(request.target); + if (!el && request.action !== "scroll") { + return { error: "No matching browser element found.", ok: false }; + } + if (el) { + el.scrollIntoView({ block: "center", inline: "center" }); + if (el instanceof HTMLElement) { + el.focus({ preventScroll: true }); + } + } + + if (request.action === "focus") { + return { element: el ? summarize(el) : undefined, ok: true }; + } + + if (request.action === "click") { + if (!(el instanceof HTMLElement)) { + return { error: "Matched element is not clickable.", ok: false }; + } + el.click(); + return { element: summarize(el), ok: true }; + } + + if (request.action === "type") { + const nextText = typeof request.value?.text === "string" ? request.value.text : ""; + const replaceExisting = request.value?.replaceExisting !== false; + if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) { + el.value = replaceExisting ? nextText : `${el.value}${nextText}`; + dispatchValueEvents(el); + return { element: summarize(el), ok: true, value: el.type === "password" ? "" : el.value }; + } + if (el instanceof HTMLElement && el.isContentEditable) { + if (replaceExisting) { + el.textContent = nextText; + } else { + el.textContent = `${el.textContent || ""}${nextText}`; + } + dispatchValueEvents(el); + return { element: summarize(el), ok: true }; + } + return { error: "Matched element cannot receive typed text.", ok: false }; + } + + if (request.action === "select") { + if (!(el instanceof HTMLSelectElement)) { + return { error: "Matched element is not a select.", ok: false }; + } + const requestedValue = typeof request.value?.value === "string" ? request.value.value : ""; + const requestedLabel = typeof request.value?.label === "string" ? request.value.label : ""; + const exact = request.value?.exact === true; + const option = Array.from(el.options).find((candidate) => { + if (requestedValue && candidate.value === requestedValue) return true; + if (!requestedLabel) return false; + return matchesText(candidate.textContent || "", requestedLabel, exact); + }); + if (!option) { + return { error: "No matching select option found.", ok: false }; + } + el.value = option.value; + dispatchValueEvents(el); + return { element: summarize(el), label: option.textContent || "", ok: true, value: option.value }; + } + + if (request.action === "scroll") { + const deltaX = typeof request.value?.deltaX === "number" ? request.value.deltaX : 0; + const deltaY = typeof request.value?.deltaY === "number" ? request.value.deltaY : 700; + if (el instanceof HTMLElement) { + el.scrollBy({ behavior: "auto", left: deltaX, top: deltaY }); + return { element: summarize(el), ok: true }; + } + window.scrollBy({ behavior: "auto", left: deltaX, top: deltaY }); + return { ok: true, scrollX: window.scrollX, scrollY: window.scrollY }; + } + + return { error: "Unsupported browser target action.", ok: false }; +}; + +const waitForConditionScript = function(condition: { + selector?: string; + text?: string; + urlIncludes?: string; + urlMatches?: string; +}) { + const checks: Array<{ matched: boolean; type: string }> = []; + if (condition.urlIncludes) { + checks.push({ matched: location.href.includes(condition.urlIncludes), type: "urlIncludes" }); + } + if (condition.urlMatches) { + let matched = false; + try { + matched = new RegExp(condition.urlMatches).test(location.href); + } catch { + matched = false; + } + checks.push({ matched, type: "urlMatches" }); + } + if (condition.selector) { + let matched = false; + try { + const el = document.querySelector(condition.selector); + if (el) { + const style = window.getComputedStyle(el); + const rect = el.getBoundingClientRect(); + matched = style.display !== "none" && style.visibility !== "hidden" && rect.width > 0 && rect.height > 0; + } + } catch { + matched = false; + } + checks.push({ matched, type: "selector" }); + } + if (condition.text) { + const pageText = (document.body?.innerText || "").toLowerCase(); + checks.push({ matched: pageText.includes(condition.text.toLowerCase()), type: "text" }); + } + return { + checks, + matched: checks.length > 0 && checks.every((check) => check.matched), + title: document.title, + url: location.href + }; +}; + +function readTarget(value: unknown): BrowserTarget { + if (!isRecord(value)) { + throw new Error("A browser target object is required."); + } + return { + axNodeId: readString(value.axNodeId), + backendNodeId: readNumber(value.backendNodeId), + exact: value.exact === true, + index: clampInteger(readNumber(value.index) ?? 0, 0, 10000), + ref: readString(value.ref) || readString(value.axNodeId), + role: readString(value.role), + selector: readString(value.selector), + text: readString(value.text) + }; +} + +function requiredString(value: unknown, message: string): string { + const text = readString(value); + if (!text) { + throw new Error(message); + } + return text; +} + +function readString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function readStringArray(value: unknown): string[] { + return Array.isArray(value) ? value.filter((item): item is string => typeof item === "string" && item.trim().length > 0) : []; +} + +function uniqueStrings(values: string[]): string[] { + return [...new Set(values)]; +} + +function readNumber(value: unknown): number | undefined { + return typeof value === "number" && Number.isFinite(value) ? value : undefined; +} + +function clampInteger(value: number, min: number, max: number): number { + return Math.min(max, Math.max(min, Math.trunc(value))); +} + +function objectSchema(properties: Record, required: string[] = []): JsonValue { + return { + additionalProperties: false, + properties, + required, + type: "object" + }; +} + +type CompactResultOptions = { + maxArrayItems: number; + maxDepth: number; + maxObjectKeys: number; + maxStringChars: number; +}; + +function formatToolResult(toolName: string, result: unknown): string { + const compacted = compactToolResult(toolName, result); + const serialized = stringifyToolResult(compacted); + if (serialized.length <= maxToolResultChars) { + return serialized; + } + + const tighter = compactJsonValue(compacted, { + maxArrayItems: 50, + maxDepth: 6, + maxObjectKeys: 80, + maxStringChars: 600 + }); + const tightSerialized = stringifyToolResult({ + guidance: largeResultGuidance(toolName), + maxChars: maxToolResultChars, + originalChars: serialized.length, + result: tighter, + tool: toolName, + truncated: true + }); + if (tightSerialized.length <= maxToolResultChars) { + return tightSerialized; + } + + return stringifyToolResult({ + guidance: largeResultGuidance(toolName), + maxChars: maxToolResultChars, + originalChars: serialized.length, + preview: truncateString(tightSerialized, 12_000), + tool: toolName, + truncated: true + }); +} + +function compactToolResult(toolName: string, result: unknown): unknown { + if (toolName === "browser_snapshot") { + return compactSnapshotResult(result); + } + if (toolName === "browser_ax_snapshot") { + return compactAxSnapshotResult(result); + } + if (toolName === "browser_ax_query") { + return compactArrayResult(result, "matches", 80, 600); + } + if (toolName === "browser_events_read" || toolName === "browser_events_await") { + return compactArrayResult(result, "events", 80, 800); + } + return compactJsonValue(result, defaultCompactResultOptions()); +} + +function compactSnapshotResult(result: unknown): unknown { + if (!isRecord(result)) { + return compactJsonValue(result, defaultCompactResultOptions()); + } + + const elements = Array.isArray(result.elements) ? result.elements : []; + const text = rawString(result.text); + const compacted: Record = {}; + for (const [key, value] of Object.entries(result)) { + if (key === "elements" || key === "text") { + continue; + } + compacted[key] = compactJsonValue(value, { + maxArrayItems: 40, + maxDepth: 5, + maxObjectKeys: 60, + maxStringChars: 600 + }); + } + + if (text !== undefined) { + compacted.text = truncateString(text, maxBrowserResultTextChars); + } + compacted.elements = elements + .slice(0, maxSnapshotResultElements) + .map((element) => compactJsonValue(element, { + maxArrayItems: 20, + maxDepth: 4, + maxObjectKeys: 40, + maxStringChars: 500 + })); + compacted.elementCount = elements.length; + + const truncated: Record = {}; + if (text !== undefined && text.length > maxBrowserResultTextChars) { + truncated.textChars = text.length - maxBrowserResultTextChars; + } + if (elements.length > maxSnapshotResultElements) { + truncated.elements = elements.length - maxSnapshotResultElements; + } + if (Object.keys(truncated).length > 0) { + compacted.truncated = truncated; + } + return compacted; +} + +function compactAxSnapshotResult(result: unknown): unknown { + if (!isRecord(result)) { + return compactJsonValue(result, defaultCompactResultOptions()); + } + + const nodes = Array.isArray(result.nodes) ? result.nodes : []; + const compacted: Record = {}; + for (const [key, value] of Object.entries(result)) { + if (key === "nodes") { + continue; + } + compacted[key] = compactJsonValue(value, { + maxArrayItems: 40, + maxDepth: 5, + maxObjectKeys: 60, + maxStringChars: 400 + }); + } + compacted.nodes = nodes + .slice(0, maxAxSnapshotResultNodes) + .map((node) => compactJsonValue(node, { + maxArrayItems: 80, + maxDepth: 5, + maxObjectKeys: 40, + maxStringChars: 260 + })); + compacted.nodeCount = nodes.length; + if (nodes.length > maxAxSnapshotResultNodes) { + compacted.truncated = { + nodes: nodes.length - maxAxSnapshotResultNodes + }; + } + return compacted; +} + +function compactArrayResult(result: unknown, key: string, maxItems: number, maxStringChars: number): unknown { + if (!isRecord(result)) { + return compactJsonValue(result, defaultCompactResultOptions()); + } + + const items = Array.isArray(result[key]) ? result[key] : []; + const compacted: Record = {}; + for (const [entryKey, value] of Object.entries(result)) { + if (entryKey === key) { + continue; + } + compacted[entryKey] = compactJsonValue(value, { + maxArrayItems: 40, + maxDepth: 5, + maxObjectKeys: 60, + maxStringChars + }); + } + compacted[key] = items + .slice(0, maxItems) + .map((item) => compactJsonValue(item, { + maxArrayItems: 40, + maxDepth: 5, + maxObjectKeys: 60, + maxStringChars + })); + compacted[`${key}Count`] = items.length; + if (items.length > maxItems) { + compacted.truncated = { + [key]: items.length - maxItems + }; + } + return compacted; +} + +function compactJsonValue( + value: unknown, + options: CompactResultOptions, + depth = 0, + seen: WeakSet = new WeakSet() +): unknown { + if (value === null || typeof value === "boolean" || typeof value === "number") { + return value; + } + if (typeof value === "string") { + return truncateString(value, options.maxStringChars); + } + if (typeof value === "bigint") { + return value.toString(); + } + if (typeof value === "undefined" || typeof value === "function" || typeof value === "symbol") { + return undefined; + } + if (typeof value !== "object") { + return String(value); + } + if (seen.has(value)) { + return "[Circular]"; + } + if (depth >= options.maxDepth) { + return { + reason: "Maximum result depth reached.", + truncated: true + }; + } + + seen.add(value); + if (Array.isArray(value)) { + const limit = Math.max(0, options.maxArrayItems); + const items = value + .slice(0, limit) + .map((item) => compactJsonValue(item, options, depth + 1, seen)); + if (value.length > limit) { + items.push({ + omittedItems: value.length - limit, + truncated: true + }); + } + seen.delete(value); + return items; + } + + const entries = Object.entries(value); + const compacted: Record = {}; + for (const [key, entryValue] of entries.slice(0, options.maxObjectKeys)) { + compacted[key] = compactJsonValue(entryValue, options, depth + 1, seen); + } + if (entries.length > options.maxObjectKeys) { + compacted.truncatedKeys = entries.length - options.maxObjectKeys; + } + seen.delete(value); + return compacted; +} + +function defaultCompactResultOptions(): CompactResultOptions { + return { + maxArrayItems: maxToolResultArrayItems, + maxDepth: 8, + maxObjectKeys: maxToolResultObjectKeys, + maxStringChars: maxToolResultStringChars + }; +} + +function stringifyToolResult(value: unknown): string { + return JSON.stringify(value, null, 2) || "null"; +} + +function rawString(value: unknown): string | undefined { + return typeof value === "string" ? value : undefined; +} + +function truncateString(value: string, maxChars: number): string { + if (value.length <= maxChars) { + return value; + } + let suffix = "\n[truncated]"; + for (let index = 0; index < 2; index += 1) { + const keep = Math.max(0, maxChars - suffix.length); + suffix = `\n[truncated ${value.length - keep} chars]`; + } + return `${value.slice(0, Math.max(0, maxChars - suffix.length))}${suffix}`; +} + +function largeResultGuidance(toolName: string): string { + if (toolName === "browser_snapshot") { + return "Result was compacted. Re-run browser_snapshot with lower maxElements/limit, page text with offset/limit, or use browser_ax_query to fetch targeted elements."; + } + if (toolName === "browser_ax_snapshot") { + return "Result was compacted. Re-run browser_ax_snapshot with lower limit or scope=outline, or use browser_ax_query with role/name/text filters."; + } + if (toolName === "browser_ax_query") { + return "Result was compacted. Re-run browser_ax_query with a lower limit or narrower role/name/text filters."; + } + if (toolName === "browser_events_read" || toolName === "browser_events_await") { + return "Result was compacted. Read events with a lower limit/maxEvents or a more specific cursor/filter."; + } + return "Result was compacted before returning to the MCP client. Use narrower arguments or lower limits for more detail."; +} + +function textResult(text: string): ToolCallResult { + return { + content: [{ text, type: "text" }] + }; +} + +function jsonRpcResult(id: null | number | string, result: JsonValue): JsonRpcResponse { + return { + id, + jsonrpc: "2.0", + result + }; +} + +function jsonRpcError(id: null | number | string, code: number, message: string): JsonRpcResponse { + return { + error: { + code, + message + }, + id, + jsonrpc: "2.0" + }; +} + +function sendJson(response: ServerResponse, status: number, payload: unknown): void { + const body = `${JSON.stringify(payload)}\n`; + response.writeHead(status, { + "content-length": Buffer.byteLength(body), + "content-type": "application/json; charset=utf-8" + }); + response.end(body); +} + +function readRequestBody(request: IncomingMessage, maxBytes: number): Promise { + return new Promise((resolve, reject) => { + const chunks: Buffer[] = []; + let total = 0; + request.on("data", (chunk: Buffer | string) => { + const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); + total += buffer.byteLength; + if (total > maxBytes) { + reject(new Error("MCP request body is too large.")); + request.destroy(); + return; + } + chunks.push(buffer); + }); + request.on("end", () => resolve(Buffer.concat(chunks))); + request.on("error", reject); + }); +} + +function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/electron/src/main/browser-preload.ts b/packages/electron/src/main/browser-preload.ts new file mode 100644 index 0000000..9d571ff --- /dev/null +++ b/packages/electron/src/main/browser-preload.ts @@ -0,0 +1,22 @@ +import { contextBridge, ipcRenderer, type IpcRendererEvent } from "electron"; +import { IPC_CHANNELS } from "@ccr/core/contracts/ipc-channels"; +import type { BuiltInBrowserState, ChromeLoginImportJob, ChromeLoginImportRequest } from "@ccr/core/contracts/app"; + +contextBridge.exposeInMainWorld("ccrBrowser", { + back: (tabId?: string) => ipcRenderer.invoke(IPC_CHANNELS.browserBack, tabId) as Promise, + closeTab: (tabId: string) => ipcRenderer.invoke(IPC_CHANNELS.browserCloseTab, tabId) as Promise, + forward: (tabId?: string) => ipcRenderer.invoke(IPC_CHANNELS.browserForward, tabId) as Promise, + getChromeLoginImport: (id: string) => ipcRenderer.invoke(IPC_CHANNELS.browserGetChromeLoginImport, id) as Promise, + getState: () => ipcRenderer.invoke(IPC_CHANNELS.browserGetState) as Promise, + navigate: (url: string, tabId?: string) => ipcRenderer.invoke(IPC_CHANNELS.browserNavigate, url, tabId) as Promise, + newTab: (url?: string) => ipcRenderer.invoke(IPC_CHANNELS.browserNewTab, url) as Promise, + reload: (tabId?: string) => ipcRenderer.invoke(IPC_CHANNELS.browserReload, tabId) as Promise, + resolveAutomationHandoff: (status: "completed" | "dismissed") => ipcRenderer.invoke(IPC_CHANNELS.browserResolveAutomationHandoff, status) as Promise, + selectTab: (tabId: string) => ipcRenderer.invoke(IPC_CHANNELS.browserSelectTab, tabId) as Promise, + startChromeLoginImport: (request: ChromeLoginImportRequest) => ipcRenderer.invoke(IPC_CHANNELS.browserStartChromeLoginImport, request) as Promise, + onStateChanged: (callback: (state: BuiltInBrowserState) => void) => { + const handler = (_event: IpcRendererEvent, state: BuiltInBrowserState) => callback(state); + ipcRenderer.on(IPC_CHANNELS.browserStateChanged, handler); + return () => ipcRenderer.removeListener(IPC_CHANNELS.browserStateChanged, handler); + } +}); diff --git a/packages/electron/src/main/built-in-browser.ts b/packages/electron/src/main/built-in-browser.ts new file mode 100644 index 0000000..c941016 --- /dev/null +++ b/packages/electron/src/main/built-in-browser.ts @@ -0,0 +1,1047 @@ +import { randomUUID } from "node:crypto"; +import { EventEmitter } from "node:events"; +import { + BrowserWindow, + clipboard, + ipcMain, + Menu, + screen, + session, + shell, + WebContentsView, + type ContextMenuParams, + type IpcMainInvokeEvent, + type MenuItemConstructorOptions, + type WebContents +} from "electron"; +import path from "node:path"; +import { pathToFileURL } from "node:url"; +import type { + AppConfig, + BuiltInBrowserAutomationHandoff, + BuiltInBrowserAutomationHandoffKind, + BuiltInBrowserState, + BuiltInBrowserTabState, + ChromeLoginImportRequest, + GatewayPluginAppConfig, + InstalledBrowserApp +} from "@ccr/core/contracts/app"; +import { IPC_CHANNELS } from "@ccr/core/contracts/ipc-channels"; +import { APP_NAME } from "@ccr/core/config/constants"; +import { pluginService } from "@ccr/core/plugins/service"; +import { chromeLoginImportService } from "./chrome-login-import"; + +type BrowserTab = BuiltInBrowserTabState & { + view: WebContentsView; +}; + +export type BrowserAutomationEvent = { + errorCode?: number; + errorDescription?: string; + handoffId?: string; + handoffStatus?: "completed" | "dismissed"; + kind: string; + seq: number; + summary?: string; + tabId?: string; + title?: string; + ts: number; + url?: string; + windowId?: string; +}; + +export type BrowserAutomationEventListener = (event: BrowserAutomationEvent) => void; + +const browserChromeBaseHeight = 82; +const browserHandoffToolbarHeight = 44; +const browserHomeUrl = "about:blank"; +const browserPartition = "persist:ccr-built-in-browser"; +const browserAutomationWindowId = "ccr-built-in-browser"; +const maxAutomationEventHistory = 512; +const maxAutomationEventAgeMs = 60_000; +const titleBarHeight = 46; + +class BuiltInBrowserService { + private activeTabId?: string; + private apps: InstalledBrowserApp[] = []; + private automationHandoff?: BuiltInBrowserAutomationHandoff; + private automationEventSeq = 0; + private readonly automationEvents = new EventEmitter(); + private readonly automationEventHistory: BrowserAutomationEvent[] = []; + private hideWindowAfterAutomationHandoff = false; + private proxyConfigKey = ""; + private tabOrder: string[] = []; + private tabs = new Map(); + private window?: BrowserWindow; + + constructor() { + this.registerIpcHandlers(); + } + + async open(config: AppConfig): Promise { + await this.syncProxy(config); + + const window = this.ensureWindow(); + if (window.isMinimized()) { + window.restore(); + } + this.layoutActiveView(); + window.show(); + window.focus(); + this.sendState(); + } + + async openHidden(config: AppConfig): Promise { + await this.syncProxy(config); + this.ensureWindow(); + this.layoutActiveView(); + this.sendState(); + } + + async syncProxy(config: AppConfig): Promise { + this.syncApps(config); + + const browserSession = session.fromPartition(browserPartition); + const proxyConfig = { mode: "system" as const }; + const nextKey = JSON.stringify(proxyConfig); + if (nextKey === this.proxyConfigKey) { + return; + } + + await browserSession.setProxy(proxyConfig); + await browserSession.forceReloadProxyConfig(); + this.proxyConfigKey = nextKey; + } + + private syncApps(config: AppConfig): void { + const nextApps = resolveInstalledBrowserApps(config, pluginService.getApps()); + if (JSON.stringify(nextApps) === JSON.stringify(this.apps)) { + return; + } + this.apps = nextApps; + this.sendState(); + } + + async clearProxy(): Promise { + const browserSession = session.fromPartition(browserPartition); + const proxyConfig = { mode: "system" as const }; + await browserSession.setProxy(proxyConfig); + await browserSession.forceReloadProxyConfig(); + this.proxyConfigKey = JSON.stringify(proxyConfig); + } + + getAutomationState(): BuiltInBrowserState { + return this.getState(); + } + + getAutomationWindowId(): string { + return browserAutomationWindowId; + } + + getAutomationEvents(options: { replayRecentMs?: number } = {}): BrowserAutomationEvent[] { + const replayRecentMs = Math.max(0, Math.floor(options.replayRecentMs ?? 0)); + const cutoff = replayRecentMs > 0 ? Date.now() - replayRecentMs : 0; + this.pruneAutomationEventHistory(); + return this.automationEventHistory + .filter((event) => event.ts >= cutoff) + .map((event) => ({ ...event })); + } + + requestAutomationHandoff(request: { + kind?: BuiltInBrowserAutomationHandoffKind; + message?: string; + reason?: string; + sessionId?: string; + tabId?: string; + }): BuiltInBrowserAutomationHandoff { + const existingWindow = this.window && !this.window.isDestroyed() ? this.window : undefined; + if (!this.automationHandoff) { + this.hideWindowAfterAutomationHandoff = !existingWindow || !existingWindow.isVisible() || existingWindow.isMinimized(); + } + const tab = this.getTab(request.tabId); + if (request.tabId && tab?.id) { + this.selectTab(request.tabId); + } + const targetTab = tab || this.getTab(); + const handoff: BuiltInBrowserAutomationHandoff = { + id: randomUUID(), + kind: request.kind || "other", + message: request.message?.trim() || defaultAutomationHandoffMessage(request.kind), + ...(request.reason?.trim() ? { reason: request.reason.trim() } : {}), + requestedAt: Date.now(), + ...(request.sessionId?.trim() ? { sessionId: request.sessionId.trim() } : {}), + status: "pending", + tabId: targetTab?.id || request.tabId || this.activeTabId + }; + this.automationHandoff = handoff; + this.layoutActiveView(); + this.showAutomationWindow(); + this.sendState(); + this.emitAutomationEvent({ + handoffId: handoff.id, + kind: "handoff.requested", + summary: handoff.message, + tabId: handoff.tabId, + title: targetTab?.title, + url: targetTab?.url + }); + return handoff; + } + + resolveAutomationHandoff(status: "completed" | "dismissed" = "completed"): BuiltInBrowserState { + const handoff = this.automationHandoff; + const shouldHideWindow = this.hideWindowAfterAutomationHandoff; + this.automationHandoff = undefined; + this.hideWindowAfterAutomationHandoff = false; + this.layoutActiveView(); + this.sendState(); + if (handoff) { + const tab = this.getTab(handoff.tabId); + if (shouldHideWindow) { + this.hideAutomationWindow(); + } + this.emitAutomationEvent({ + handoffId: handoff.id, + handoffStatus: status, + kind: status === "completed" ? "handoff.completed" : "handoff.dismissed", + summary: status === "completed" ? "User completed the requested browser handoff." : "User dismissed the requested browser handoff.", + tabId: handoff.tabId, + title: tab?.title, + url: tab?.url + }); + } + return this.getState(); + } + + subscribeAutomationEvents( + listener: BrowserAutomationEventListener, + options: { replayRecentMs?: number } = {} + ): () => void { + this.automationEvents.on("event", listener); + const replayRecentMs = Math.max(0, Math.floor(options.replayRecentMs ?? 0)); + if (replayRecentMs > 0) { + const cutoff = Date.now() - replayRecentMs; + this.pruneAutomationEventHistory(); + for (const event of this.automationEventHistory) { + if (event.ts >= cutoff) { + listener(event); + } + } + } + return () => this.automationEvents.off("event", listener); + } + + createAutomationTab(url = browserHomeUrl): BuiltInBrowserTabState { + const tab = this.createTab(url); + const { view: _view, ...state } = tab; + return state; + } + + selectAutomationTab(tabId: string): BuiltInBrowserState { + this.selectTab(tabId); + return this.getState(); + } + + closeAutomationTab(tabId: string): BuiltInBrowserState { + this.closeTab(tabId); + return this.getState(); + } + + async navigateAutomationTab(url: string, tabId?: string): Promise { + const tab = this.getTab(tabId); + if (!tab) { + throw new Error("Browser tab was not found."); + } + + const nextUrl = normalizeBrowserUrl(url); + tab.url = nextUrl; + if (tab.id === this.activeTabId) { + this.layoutActiveView(); + } + this.sendState(); + void tab.view.webContents.loadURL(nextUrl).catch((error) => { + this.emitAutomationEvent({ + kind: "page.load_failed", + summary: `Navigation request failed: ${formatError(error)}`, + tabId: tab.id, + title: tab.title, + url: nextUrl + }); + }); + this.emitAutomationEvent({ + kind: "page.navigation_requested", + summary: `Navigation requested: ${nextUrl}`, + tabId: tab.id, + title: tab.title, + url: nextUrl + }); + return this.getState(); + } + + goBackAutomationTab(tabId?: string): BuiltInBrowserState { + const tab = this.getTab(tabId); + tab?.view.webContents.navigationHistory.goBack(); + if (tab) { + this.emitAutomationEvent({ + kind: "tab.go_back", + summary: `Go back in tab ${tab.id}.`, + tabId: tab.id, + title: tab.title, + url: tab.url + }); + } + return this.getState(); + } + + goForwardAutomationTab(tabId?: string): BuiltInBrowserState { + const tab = this.getTab(tabId); + tab?.view.webContents.navigationHistory.goForward(); + if (tab) { + this.emitAutomationEvent({ + kind: "tab.go_forward", + summary: `Go forward in tab ${tab.id}.`, + tabId: tab.id, + title: tab.title, + url: tab.url + }); + } + return this.getState(); + } + + reloadAutomationTab(tabId?: string): BuiltInBrowserState { + const tab = this.getTab(tabId); + tab?.view.webContents.reload(); + if (tab) { + this.emitAutomationEvent({ + kind: "tab.reload", + summary: `Reload tab ${tab.id}.`, + tabId: tab.id, + title: tab.title, + url: tab.url + }); + } + return this.getState(); + } + + getAutomationWebContents(tabId?: string): WebContents { + const tab = this.getTab(tabId); + if (!tab || tab.view.webContents.isDestroyed()) { + throw new Error("Browser tab is unavailable."); + } + return tab.view.webContents; + } + + private registerIpcHandlers(): void { + ipcMain.handle(IPC_CHANNELS.browserGetState, (event) => { + this.assertBrowserSender(event); + return this.getState(); + }); + ipcMain.handle(IPC_CHANNELS.browserStartChromeLoginImport, async (event, request: ChromeLoginImportRequest) => { + this.assertBrowserSender(event); + return await chromeLoginImportService.createJob(request); + }); + ipcMain.handle(IPC_CHANNELS.browserGetChromeLoginImport, (event, id: string) => { + this.assertBrowserSender(event); + return chromeLoginImportService.getJob(typeof id === "string" ? id : ""); + }); + ipcMain.handle(IPC_CHANNELS.browserNewTab, (event, url?: string) => { + this.assertBrowserSender(event); + this.createTab(url); + return this.getState(); + }); + ipcMain.handle(IPC_CHANNELS.browserSelectTab, (event, tabId: string) => { + this.assertBrowserSender(event); + this.selectTab(tabId); + return this.getState(); + }); + ipcMain.handle(IPC_CHANNELS.browserCloseTab, (event, tabId: string) => { + this.assertBrowserSender(event); + this.closeTab(tabId); + return this.getState(); + }); + ipcMain.handle(IPC_CHANNELS.browserNavigate, (event, url: string, tabId?: string) => { + this.assertBrowserSender(event); + this.navigate(url, tabId); + return this.getState(); + }); + ipcMain.handle(IPC_CHANNELS.browserBack, (event, tabId?: string) => { + this.assertBrowserSender(event); + this.getTab(tabId)?.view.webContents.navigationHistory.goBack(); + return this.getState(); + }); + ipcMain.handle(IPC_CHANNELS.browserForward, (event, tabId?: string) => { + this.assertBrowserSender(event); + this.getTab(tabId)?.view.webContents.navigationHistory.goForward(); + return this.getState(); + }); + ipcMain.handle(IPC_CHANNELS.browserReload, (event, tabId?: string) => { + this.assertBrowserSender(event); + this.getTab(tabId)?.view.webContents.reload(); + return this.getState(); + }); + ipcMain.handle(IPC_CHANNELS.browserResolveAutomationHandoff, (event, status?: string) => { + this.assertBrowserSender(event); + return this.resolveAutomationHandoff(status === "dismissed" ? "dismissed" : "completed"); + }); + } + + private ensureWindow(): BrowserWindow { + const window = this.window && !this.window.isDestroyed() ? this.window : this.createWindow(); + if (this.tabs.size === 0) { + this.createTab(browserHomeUrl); + } + return window; + } + + private showAutomationWindow(): void { + const window = this.ensureWindow(); + if (window.isMinimized()) { + window.restore(); + } + window.show(); + window.focus(); + } + + private hideAutomationWindow(): void { + const window = this.window; + if (window && !window.isDestroyed()) { + window.hide(); + } + } + + private createWindow(): BrowserWindow { + const { height: availableHeight, width: availableWidth } = screen.getPrimaryDisplay().workAreaSize; + const minHeight = 560; + const minWidth = 820; + const height = fitWindowSize(840, minHeight, availableHeight - 48); + const width = fitWindowSize(1180, minWidth, availableWidth - 48); + + const window = new BrowserWindow({ + height, + minHeight, + minWidth, + show: false, + title: `${APP_NAME} APPs`, + ...(process.platform === "darwin" + ? { + titleBarStyle: "hiddenInset" as const, + trafficLightPosition: { + x: 16, + y: Math.round((titleBarHeight - 14) / 2) + } + } + : { titleBarStyle: "hidden" as const }), + webPreferences: { + contextIsolation: true, + nodeIntegration: false, + preload: path.join(__dirname, "browser-preload.js"), + sandbox: true, + webSecurity: true + }, + width + }); + + this.window = window; + window.on("resize", () => this.layoutActiveView()); + window.on("closed", () => { + this.destroyTabs(); + if (this.window === window) { + this.window = undefined; + } + }); + window.webContents.setWindowOpenHandler(() => ({ action: "deny" })); + window.webContents.on("did-finish-load", () => this.sendState()); + + void window.loadURL(this.resolveRendererUrl("pages/browser/index.html")).catch((error) => { + console.warn(`[browser] Failed to load browser chrome: ${formatError(error)}`); + }); + return window; + } + + private createTab(url = browserHomeUrl): BrowserTab { + const view = new WebContentsView({ + webPreferences: { + contextIsolation: true, + nodeIntegration: false, + partition: browserPartition, + sandbox: true, + webSecurity: true + } + }); + const tab: BrowserTab = { + canGoBack: false, + canGoForward: false, + id: randomUUID(), + isLoading: false, + title: "New Tab", + url: normalizeBrowserUrl(url), + view + }; + + this.tabs.set(tab.id, tab); + this.tabOrder.push(tab.id); + this.configureTab(tab); + this.window?.contentView.addChildView(view); + view.setVisible(false); + this.selectTab(tab.id); + void view.webContents.loadURL(tab.url).catch((error) => { + this.emitAutomationEvent({ + kind: "page.load_failed", + summary: `Initial tab load failed: ${formatError(error)}`, + tabId: tab.id, + title: tab.title, + url: tab.url + }); + }); + this.sendState(); + this.emitAutomationEvent({ + kind: "tab.created", + summary: `Created tab ${tab.id}.`, + tabId: tab.id, + title: tab.title, + url: tab.url + }); + return tab; + } + + private configureTab(tab: BrowserTab): void { + const { webContents } = tab.view; + webContents.setWindowOpenHandler(({ url }) => { + if (isHttpUrl(url)) { + const opened = this.createTab(url); + this.emitAutomationEvent({ + kind: "tab.opened", + summary: `Opened new tab from window.open: ${url}`, + tabId: opened.id, + title: opened.title, + url: opened.url + }); + } + return { action: "deny" }; + }); + webContents.on("context-menu", (_event, params) => { + this.showContextMenu(tab, params); + }); + webContents.on("page-title-updated", (_event, title) => { + tab.title = title || titleFromUrl(tab.url); + this.sendState(); + this.emitAutomationEvent({ + kind: "page.title", + summary: `Title updated: ${tab.title}`, + tabId: tab.id, + title: tab.title, + url: tab.url + }); + }); + webContents.on("did-start-loading", () => { + tab.isLoading = true; + this.updateTabNavigationState(tab); + this.emitAutomationEvent({ + kind: "page.loading_started", + summary: `Loading started: ${tab.url}`, + tabId: tab.id, + title: tab.title, + url: tab.url + }); + }); + webContents.on("did-stop-loading", () => { + tab.isLoading = false; + this.updateTabNavigationState(tab); + this.emitAutomationEvent({ + kind: "page.loading_stopped", + summary: `Loading stopped: ${tab.url}`, + tabId: tab.id, + title: tab.title, + url: tab.url + }); + }); + webContents.on("did-navigate", (_event, url) => { + tab.url = url; + tab.title = tab.title || titleFromUrl(url); + if (tab.id === this.activeTabId) { + this.layoutActiveView(); + } + this.updateTabNavigationState(tab); + this.emitAutomationEvent({ + kind: "page.navigation", + summary: `Navigated to ${url}`, + tabId: tab.id, + title: tab.title, + url + }); + }); + webContents.on("did-navigate-in-page", (_event, url) => { + tab.url = url; + if (tab.id === this.activeTabId) { + this.layoutActiveView(); + } + this.updateTabNavigationState(tab); + this.emitAutomationEvent({ + kind: "page.navigation_in_page", + summary: `In-page navigation to ${url}`, + tabId: tab.id, + title: tab.title, + url + }); + }); + webContents.on("did-fail-load", (_event, errorCode, errorDescription, validatedUrl) => { + if (errorCode !== -3) { + tab.isLoading = false; + tab.url = validatedUrl || tab.url; + if (tab.id === this.activeTabId) { + this.layoutActiveView(); + } + this.updateTabNavigationState(tab); + this.emitAutomationEvent({ + errorCode, + errorDescription, + kind: "page.load_failed", + summary: `Load failed (${errorCode}): ${errorDescription}`, + tabId: tab.id, + title: tab.title, + url: tab.url + }); + } + }); + webContents.on("dom-ready", () => { + this.emitAutomationEvent({ + kind: "page.dom_ready", + summary: `DOM ready: ${tab.url}`, + tabId: tab.id, + title: tab.title, + url: tab.url + }); + }); + webContents.on("console-message", (_event, level, message) => { + if (level >= 2) { + this.emitAutomationEvent({ + kind: "runtime.console", + summary: message, + tabId: tab.id, + title: tab.title, + url: tab.url + }); + } + }); + webContents.on("destroyed", () => { + if (this.tabs.get(tab.id) === tab) { + this.tabs.delete(tab.id); + this.tabOrder = this.tabOrder.filter((id) => id !== tab.id); + if (this.activeTabId === tab.id) { + this.activeTabId = this.tabOrder[0]; + } + this.sendState(); + this.emitAutomationEvent({ + kind: "tab.destroyed", + summary: `Destroyed tab ${tab.id}.`, + tabId: tab.id, + title: tab.title, + url: tab.url + }); + } + }); + } + + private showContextMenu(tab: BrowserTab, params: ContextMenuParams): void { + const window = this.window; + if (!window || window.isDestroyed() || tab.view.webContents.isDestroyed()) { + return; + } + + const { webContents } = tab.view; + const { navigationHistory } = webContents; + const template: MenuItemConstructorOptions[] = [ + { + click: () => navigationHistory.goBack(), + enabled: navigationHistory.canGoBack(), + label: "Back" + }, + { + click: () => navigationHistory.goForward(), + enabled: navigationHistory.canGoForward(), + label: "Forward" + }, + { + click: () => webContents.reload(), + label: "Reload" + }, + { type: "separator" } + ]; + + if (isHttpUrl(params.linkURL)) { + template.push( + { + click: () => this.createTab(params.linkURL), + label: "Open Link in New Tab" + }, + { + click: () => { + void shell.openExternal(params.linkURL); + }, + label: "Open Link in System Browser" + }, + { + click: () => clipboard.writeText(params.linkURL), + label: "Copy Link" + }, + { type: "separator" } + ); + } + + if (params.isEditable) { + template.push( + { + click: () => webContents.cut(), + enabled: params.editFlags.canCut, + label: "Cut" + }, + { + click: () => webContents.copy(), + enabled: params.editFlags.canCopy, + label: "Copy" + }, + { + click: () => webContents.paste(), + enabled: params.editFlags.canPaste, + label: "Paste" + }, + { + click: () => webContents.selectAll(), + enabled: params.editFlags.canSelectAll, + label: "Select All" + }, + { type: "separator" } + ); + } else if (params.selectionText.trim()) { + template.push( + { + click: () => webContents.copy(), + label: "Copy" + }, + { type: "separator" } + ); + } + + template.push( + { + click: () => webContents.openDevTools({ mode: "detach" }), + enabled: !webContents.isDevToolsOpened(), + label: "Open DevTools" + }, + { + click: () => webContents.inspectElement(params.x, params.y), + label: "Inspect Element" + } + ); + + Menu.buildFromTemplate(template).popup({ window }); + } + + private selectTab(tabId: string): void { + const selected = this.tabs.get(tabId); + if (!selected) { + return; + } + + this.activeTabId = tabId; + for (const tab of this.tabs.values()) { + tab.view.setVisible(tab.id === tabId && !isBrowserHomeUrl(tab.url)); + } + this.window?.contentView.addChildView(selected.view); + this.layoutActiveView(); + if (isBrowserHomeUrl(selected.url)) { + this.window?.webContents.focus(); + } else { + selected.view.webContents.focus(); + } + this.sendState(); + this.emitAutomationEvent({ + kind: "tab.activated", + summary: `Activated tab ${tabId}.`, + tabId, + title: selected.title, + url: selected.url + }); + } + + private closeTab(tabId: string): void { + const tab = this.tabs.get(tabId); + if (!tab) { + return; + } + + this.window?.contentView.removeChildView(tab.view); + this.tabs.delete(tabId); + this.tabOrder = this.tabOrder.filter((id) => id !== tabId); + tab.view.webContents.close({ waitForBeforeUnload: false }); + this.emitAutomationEvent({ + kind: "tab.closed", + summary: `Closed tab ${tabId}.`, + tabId, + title: tab.title, + url: tab.url + }); + + if (this.tabOrder.length === 0) { + this.createTab(browserHomeUrl); + return; + } + + if (this.activeTabId === tabId) { + this.selectTab(this.tabOrder[Math.max(0, this.tabOrder.length - 1)]); + return; + } + + this.sendState(); + } + + private navigate(url: string, tabId?: string): void { + const tab = this.getTab(tabId); + if (!tab) { + return; + } + + const nextUrl = normalizeBrowserUrl(url); + tab.url = nextUrl; + if (tab.id === this.activeTabId) { + this.layoutActiveView(); + } + void tab.view.webContents.loadURL(nextUrl).catch((error) => { + this.emitAutomationEvent({ + kind: "page.load_failed", + summary: `Navigation request failed: ${formatError(error)}`, + tabId: tab.id, + title: tab.title, + url: nextUrl + }); + }); + this.sendState(); + this.emitAutomationEvent({ + kind: "page.navigation_requested", + summary: `Navigation requested: ${nextUrl}`, + tabId: tab.id, + title: tab.title, + url: nextUrl + }); + } + + private getTab(tabId?: string): BrowserTab | undefined { + return this.tabs.get(tabId || this.activeTabId || ""); + } + + private updateTabNavigationState(tab: BrowserTab): void { + tab.canGoBack = tab.view.webContents.navigationHistory.canGoBack(); + tab.canGoForward = tab.view.webContents.navigationHistory.canGoForward(); + this.sendState(); + } + + private layoutActiveView(): void { + const window = this.window; + const activeTab = this.getTab(); + if (!window || window.isDestroyed() || !activeTab) { + return; + } + + if (isBrowserHomeUrl(activeTab.url)) { + activeTab.view.setVisible(false); + return; + } + + const { height, width } = window.getContentBounds(); + activeTab.view.setVisible(true); + activeTab.view.setBounds({ + height: Math.max(0, height - this.browserChromeHeight()), + width, + x: 0, + y: this.browserChromeHeight() + }); + } + + private browserChromeHeight(): number { + return browserChromeBaseHeight + (this.automationHandoff ? browserHandoffToolbarHeight : 0); + } + + private getState(): BuiltInBrowserState { + return { + activeTabId: this.activeTabId, + apps: this.apps.map((app) => ({ ...app })), + ...(this.automationHandoff ? { automationHandoff: { ...this.automationHandoff } } : {}), + tabs: this.tabOrder + .map((id) => this.tabs.get(id)) + .filter((tab): tab is BrowserTab => Boolean(tab)) + .map(({ view: _view, ...tab }) => tab) + }; + } + + private sendState(): void { + const window = this.window; + if (!window || window.isDestroyed() || window.webContents.isDestroyed()) { + return; + } + window.webContents.send(IPC_CHANNELS.browserStateChanged, this.getState()); + } + + private assertBrowserSender(event: IpcMainInvokeEvent): void { + if (!this.window || event.sender !== this.window.webContents) { + throw new Error("Browser controls are only available from the built-in browser window."); + } + } + + private destroyTabs(): void { + for (const tab of this.tabs.values()) { + if (!tab.view.webContents.isDestroyed()) { + tab.view.webContents.close({ waitForBeforeUnload: false }); + } + } + this.tabs.clear(); + this.tabOrder = []; + this.activeTabId = undefined; + } + + private emitAutomationEvent(event: Omit): void { + const nextEvent: BrowserAutomationEvent = { + ...event, + seq: ++this.automationEventSeq, + ts: Date.now(), + windowId: browserAutomationWindowId + }; + this.automationEventHistory.push(nextEvent); + this.pruneAutomationEventHistory(nextEvent.ts); + this.automationEvents.emit("event", nextEvent); + } + + private pruneAutomationEventHistory(now = Date.now()): void { + while (this.automationEventHistory.length > 0 && now - this.automationEventHistory[0].ts > maxAutomationEventAgeMs) { + this.automationEventHistory.shift(); + } + if (this.automationEventHistory.length > maxAutomationEventHistory) { + this.automationEventHistory.splice(0, this.automationEventHistory.length - maxAutomationEventHistory); + } + } + + private resolveRendererUrl(relativeHtmlPath: string): string { + return pathToFileURL(path.join(__dirname, "../renderer", relativeHtmlPath)).toString(); + } +} + +export const builtInBrowserService = new BuiltInBrowserService(); + +function fitWindowSize(preferred: number, minimum: number, available: number): number { + return Math.max(minimum, Math.min(preferred, available > 0 ? available : preferred)); +} + +function isHttpUrl(value: string): boolean { + try { + const url = new URL(value); + return url.protocol === "http:" || url.protocol === "https:"; + } catch { + return false; + } +} + +function normalizeBrowserUrl(value: string | undefined): string { + const trimmed = (value || "").trim(); + if (!trimmed) { + return browserHomeUrl; + } + if (isBrowserHomeUrl(trimmed)) { + return browserHomeUrl; + } + if (/^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed)) { + return isHttpUrl(trimmed) ? trimmed : `https://www.google.com/search?q=${encodeURIComponent(trimmed)}`; + } + if (/^(localhost|127\.0\.0\.1|\[::1\])(?::\d+)?(?:\/|$)/i.test(trimmed) || trimmed.includes(".")) { + return `https://${trimmed}`; + } + return `https://www.google.com/search?q=${encodeURIComponent(trimmed)}`; +} + +function resolveInstalledBrowserApps(config: AppConfig, runtimeApps: InstalledBrowserApp[]): InstalledBrowserApp[] { + const apps = new Map(); + for (const plugin of config.plugins ?? []) { + if (plugin.enabled === false) { + continue; + } + if (plugin.id === "claude-design") { + continue; + } + for (const app of plugin.apps ?? []) { + const normalized = normalizeConfiguredBrowserApp(plugin.id, app, apps.size + 1); + if (normalized) { + apps.set(`${normalized.pluginId}:${normalized.id}`, normalized); + } + } + } + for (const app of runtimeApps) { + if (app.pluginId === "claude-design") { + continue; + } + apps.set(`${app.pluginId}:${app.id}`, { ...app }); + } + return [...apps.values()]; +} + +function normalizeConfiguredBrowserApp(pluginId: string, app: GatewayPluginAppConfig, index: number): InstalledBrowserApp | undefined { + const name = app.name?.trim(); + const url = app.url?.trim(); + if (!name || !url) { + return undefined; + } + + return { + ...(app.description?.trim() ? { description: app.description.trim() } : {}), + ...(app.icon?.trim() ? { icon: app.icon.trim() } : {}), + id: app.id?.trim() || sanitizeBrowserAppId(`${name}-${url}`) || `app-${index}`, + name, + pluginId, + url + }; +} + +function isPlainRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function sanitizeBrowserAppId(value: string): string { + return value + .toLowerCase() + .replace(/[^a-z0-9_.-]+/g, "-") + .replace(/^-+|-+$/g, "") + .slice(0, 80); +} + +function stringValue(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function isBrowserHomeUrl(value: string): boolean { + return value.trim().toLowerCase() === browserHomeUrl; +} + +function titleFromUrl(value: string): string { + try { + return new URL(value).hostname || "New Tab"; + } catch { + return "New Tab"; + } +} + +function defaultAutomationHandoffMessage(kind?: BuiltInBrowserAutomationHandoffKind): string { + if (kind === "login_required") { + return "Please sign in on this page, then click Done."; + } + if (kind === "verification_code") { + return "Please enter the verification code, then click Done."; + } + if (kind === "human_verification") { + return "Please complete the human verification, then click Done."; + } + if (kind === "blocked") { + return "Please resolve the blocker on this page, then click Done."; + } + return "Please complete the requested browser step, then click Done."; +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/electron/src/main/chrome-login-import.ts b/packages/electron/src/main/chrome-login-import.ts new file mode 100644 index 0000000..850dd17 --- /dev/null +++ b/packages/electron/src/main/chrome-login-import.ts @@ -0,0 +1,593 @@ +import { randomUUID } from "node:crypto"; +import http, { type IncomingMessage, type Server, type ServerResponse } from "node:http"; +import { BrowserWindow, session, shell } from "electron"; +import type { + ChromeLoginImportCookie, + ChromeLoginImportJob, + ChromeLoginImportLocalStorage, + ChromeLoginImportRequest, + ChromeLoginImportResult, + ChromeLoginImportTarget +} from "@ccr/core/contracts/app"; + +type ServerInfo = { + server: Server; + url: string; +}; + +type StoredChromeLoginImportJob = ChromeLoginImportJob; + +type CookieSetDetails = Parameters[0]; + +const browserPartition = "persist:ccr-built-in-browser"; +const webSearchPartition = "persist:ccr-browser-web-search-mcp"; +const importJobTtlMs = 5 * 60_000; +const maxImportRequestBytes = 16 * 1024 * 1024; +const maxStoredErrors = 20; +const localStorageWriteTimeoutMs = 15_000; + +class ChromeLoginImportService { + private readonly jobs = new Map(); + private serverInfo?: ServerInfo; + private serverStartPromise?: Promise; + + async createJob(request: ChromeLoginImportRequest): Promise { + const domains = uniqueStrings(request.domains.map(normalizeImportDomain).filter((item): item is string => Boolean(item))); + if (domains.length === 0) { + throw new Error("At least one Chrome import domain is required."); + } + + const target = normalizeImportTarget(request.target); + const serverInfo = await this.ensureServer(); + const id = randomUUID(); + const now = Date.now(); + const job: StoredChromeLoginImportJob = { + confirmUrl: `${serverInfo.url}/chrome-import/jobs/${id}/confirm`, + createdAt: now, + domains, + endpointUrl: serverInfo.url, + expiresAt: now + importJobTtlMs, + id, + importUrl: `${serverInfo.url}/chrome-import/jobs/${id}`, + status: "pending", + target + }; + this.jobs.set(id, job); + this.pruneJobs(); + if (request.openConfirmationPage) { + await this.openConfirmationPage(job.id); + } + return cloneJob(job); + } + + getJob(id: string): ChromeLoginImportJob | undefined { + const job = this.jobs.get(id); + if (!job) { + return undefined; + } + this.refreshExpiredJob(job); + return cloneJob(job); + } + + async openConfirmationPage(id: string): Promise { + const job = this.jobs.get(id); + if (!job) { + throw new Error("Chrome login import job was not found."); + } + this.refreshExpiredJob(job); + if (job.status !== "pending") { + throw new Error(`Chrome login import job is ${job.status}.`); + } + await shell.openExternal(job.confirmUrl); + return cloneJob(job); + } + + private async ensureServer(): Promise { + if (this.serverInfo) { + return this.serverInfo; + } + if (this.serverStartPromise) { + return this.serverStartPromise; + } + + this.serverStartPromise = new Promise((resolve, reject) => { + const server = http.createServer((request, response) => { + void this.handleRequest(request, response).catch((error) => { + sendJson(response, 500, { error: { message: formatError(error) } }); + }); + }); + server.once("error", reject); + server.listen(0, "127.0.0.1", () => { + server.off("error", reject); + const address = server.address(); + if (!address || typeof address === "string") { + server.close(); + reject(new Error("Chrome login import server failed to start.")); + return; + } + const info = { + server, + url: `http://127.0.0.1:${address.port}` + }; + this.serverInfo = info; + resolve(info); + }); + }).finally(() => { + this.serverStartPromise = undefined; + }); + return this.serverStartPromise; + } + + private async handleRequest(request: IncomingMessage, response: ServerResponse): Promise { + setCorsHeaders(response); + if (request.method === "OPTIONS") { + response.writeHead(204); + response.end(); + return; + } + + const path = request.url ? new URL(request.url, "http://127.0.0.1").pathname : "/"; + const match = path.match(/^\/chrome-import\/jobs\/([^/]+)(?:\/(confirm|cookies))?$/); + if (!match) { + sendJson(response, 404, { error: { message: "Chrome login import endpoint not found." } }); + return; + } + + const id = decodeURIComponent(match[1]); + const job = this.jobs.get(id); + if (!job) { + sendJson(response, 404, { error: { message: "Chrome login import job was not found." } }); + return; + } + this.refreshExpiredJob(job); + if (job.status === "expired") { + sendJson(response, 410, { error: { message: "Chrome login import job expired." }, job: cloneJob(job) }); + return; + } + + const action = match[2]; + if (request.method === "GET" && action === "confirm") { + sendHtml(response, 200, confirmationPageHtml(job)); + return; + } + + if (request.method === "GET" && !action) { + sendJson(response, 200, { job: cloneJob(job) }); + return; + } + + if (request.method === "POST" && action === "cookies") { + if (job.status !== "pending") { + sendJson(response, 409, { + error: { + message: `Chrome login import job is ${job.status}.` + }, + job: cloneJob(job) + }); + return; + } + const payload = await readJsonRequest(request); + const result = await this.importLoginState(job, payload); + sendJson(response, 200, { job: cloneJob(job), result }); + return; + } + + sendJson(response, 405, { error: { message: "Unsupported Chrome login import method." } }); + } + + private async importLoginState(job: StoredChromeLoginImportJob, payload: unknown): Promise { + const importPayload = readImportPayload(payload); + const partitions = targetPartitions(job.target); + const result: ChromeLoginImportResult = { + completedAt: Date.now(), + cookieImported: 0, + cookieSkipped: 0, + domains: [...job.domains], + imported: 0, + localStorageImported: 0, + localStorageSkipped: 0, + partitions, + skipped: 0 + }; + const errors: string[] = []; + + for (const cookie of importPayload.cookies) { + const normalized = normalizeChromeCookie(cookie, job.domains); + if (!normalized) { + result.cookieSkipped += 1; + continue; + } + + try { + await Promise.all(partitions.map((partition) => session.fromPartition(partition).cookies.set(normalized))); + result.cookieImported += 1; + } catch (error) { + result.cookieSkipped += 1; + if (errors.length < maxStoredErrors) { + errors.push(`${normalized.domain || new URL(normalized.url).hostname}:${normalized.name}: ${formatError(error)}`); + } + } + } + + await Promise.all(partitions.map((partition) => session.fromPartition(partition).cookies.flushStore())); + + for (const localStorageEntry of importPayload.localStorage) { + const normalized = normalizeLocalStorageEntry(localStorageEntry, job.domains); + if (!normalized) { + result.localStorageSkipped += 1; + continue; + } + + const itemCount = Object.keys(normalized.items).length; + if (itemCount === 0) { + result.localStorageSkipped += 1; + continue; + } + + try { + await Promise.all(partitions.map((partition) => writeLocalStorage(partition, normalized.origin, normalized.items))); + result.localStorageImported += itemCount; + } catch (error) { + result.localStorageSkipped += itemCount; + if (errors.length < maxStoredErrors) { + errors.push(`${normalized.origin}: localStorage: ${formatError(error)}`); + } + } + } + + result.imported = result.cookieImported + result.localStorageImported; + result.skipped = result.cookieSkipped + result.localStorageSkipped; + if (errors.length > 0) { + result.errors = errors; + } + job.result = result; + job.status = result.imported > 0 || result.skipped > 0 ? "completed" : "failed"; + return result; + } + + private refreshExpiredJob(job: StoredChromeLoginImportJob): void { + if (job.status === "pending" && Date.now() > job.expiresAt) { + job.status = "expired"; + } + } + + private pruneJobs(): void { + const cutoff = Date.now() - importJobTtlMs; + for (const [id, job] of this.jobs) { + this.refreshExpiredJob(job); + if (job.expiresAt < cutoff) { + this.jobs.delete(id); + } + } + } +} + +export const chromeLoginImportService = new ChromeLoginImportService(); + +function targetPartitions(target: ChromeLoginImportTarget): string[] { + return target === "browser-and-web-search" + ? [browserPartition, webSearchPartition] + : [browserPartition]; +} + +function normalizeChromeCookie(cookie: ChromeLoginImportCookie, allowedDomains: string[]): CookieSetDetails | undefined { + if (!isRecord(cookie) || typeof cookie.name !== "string" || typeof cookie.value !== "string") { + return undefined; + } + if (cookie.partitionKey !== undefined) { + return undefined; + } + + const rawDomain = readString(cookie.domain).toLowerCase(); + const cookieHost = normalizeCookieHost(rawDomain); + if (!cookieHost || !allowedDomains.some((domain) => cookieDomainMatches(cookieHost, domain))) { + return undefined; + } + + const path = normalizeCookiePath(cookie.path); + const expirationDate = typeof cookie.expirationDate === "number" && Number.isFinite(cookie.expirationDate) + ? cookie.expirationDate + : undefined; + if (expirationDate !== undefined && expirationDate <= Date.now() / 1000) { + return undefined; + } + + const secure = cookie.secure === true; + const details: CookieSetDetails = { + httpOnly: cookie.httpOnly === true, + name: cookie.name, + path, + secure, + url: cookieUrl(cookieHost, path, secure), + value: cookie.value + }; + if (cookie.hostOnly !== true) { + details.domain = rawDomain || cookieHost; + } + if (expirationDate !== undefined && cookie.session !== true) { + details.expirationDate = expirationDate; + } + const sameSite = normalizeSameSite(cookie.sameSite); + if (sameSite) { + details.sameSite = sameSite; + } + return details; +} + +function normalizeLocalStorageEntry( + entry: ChromeLoginImportLocalStorage, + allowedDomains: string[] +): ChromeLoginImportLocalStorage | undefined { + if (!isRecord(entry) || !isRecord(entry.items)) { + return undefined; + } + + let origin: URL; + try { + origin = new URL(readString(entry.origin)); + } catch { + return undefined; + } + + if (!["http:", "https:"].includes(origin.protocol)) { + return undefined; + } + if (!allowedDomains.some((domain) => cookieDomainMatches(origin.hostname.toLowerCase(), domain))) { + return undefined; + } + + const items: Record = {}; + for (const [key, value] of Object.entries(entry.items)) { + if (typeof key === "string" && typeof value === "string") { + items[key] = value; + } + } + return { + items, + origin: origin.origin + }; +} + +async function writeLocalStorage(partition: string, origin: string, items: Record): Promise { + const window = new BrowserWindow({ + height: 480, + paintWhenInitiallyHidden: true, + show: false, + skipTaskbar: true, + title: "CCR Chrome Login Import", + webPreferences: { + contextIsolation: true, + nodeIntegration: false, + partition, + sandbox: true, + webSecurity: true + }, + width: 640 + }); + try { + await withTimeout(window.webContents.loadURL(`${origin}/`), localStorageWriteTimeoutMs, "Timed out loading localStorage origin."); + const loadedOrigin = new URL(window.webContents.getURL()).origin; + if (loadedOrigin !== origin) { + throw new Error(`Origin redirected to ${loadedOrigin}.`); + } + const entries = Object.entries(items); + await window.webContents.executeJavaScript( + `(() => { + const entries = ${JSON.stringify(entries)}; + for (const [key, value] of entries) { + window.localStorage.setItem(key, value); + } + return entries.length; + })()`, + true + ); + } finally { + if (!window.isDestroyed()) { + window.destroy(); + } + } +} + +function normalizeImportTarget(value: unknown): ChromeLoginImportTarget { + return value === "browser-and-web-search" ? "browser-and-web-search" : "browser"; +} + +function normalizeImportDomain(value: unknown): string | undefined { + const raw = readString(value).toLowerCase(); + if (!raw) { + return undefined; + } + try { + const parsed = new URL(raw.includes("://") ? raw : `https://${raw}`); + return normalizeCookieHost(parsed.hostname); + } catch { + return normalizeCookieHost(raw.replace(/^\*\./, "").split("/")[0] || ""); + } +} + +function normalizeCookieHost(value: string): string | undefined { + const host = value.trim().replace(/^\./, "").toLowerCase(); + if (!host || host.includes("*") || host.includes("/") || host.includes(" ")) { + return undefined; + } + return host; +} + +function normalizeCookiePath(value: unknown): string { + const path = readString(value); + return path.startsWith("/") ? path : "/"; +} + +function cookieUrl(host: string, path: string, secure: boolean): string { + const normalizedPath = path.startsWith("/") ? path : "/"; + return `${secure ? "https" : "http"}://${host}${normalizedPath}`; +} + +function cookieDomainMatches(cookieHost: string, allowedDomain: string): boolean { + return cookieHost === allowedDomain || cookieHost.endsWith(`.${allowedDomain}`); +} + +function normalizeSameSite(value: unknown): CookieSetDetails["sameSite"] | undefined { + return value === "lax" || value === "strict" || value === "no_restriction" || value === "unspecified" + ? value + : undefined; +} + +function readImportPayload(payload: unknown): { + cookies: ChromeLoginImportCookie[]; + localStorage: ChromeLoginImportLocalStorage[]; +} { + if (!isRecord(payload)) { + throw new Error("Chrome login import payload must be an object."); + } + const cookies = Array.isArray(payload.cookies) + ? payload.cookies.filter(isRecord) as ChromeLoginImportCookie[] + : []; + const localStorage = Array.isArray(payload.localStorage) + ? payload.localStorage.filter(isRecord) as ChromeLoginImportLocalStorage[] + : []; + if (cookies.length === 0 && localStorage.length === 0) { + throw new Error("Chrome login import payload must include cookies or localStorage."); + } + return { cookies, localStorage }; +} + +function cloneJob(job: StoredChromeLoginImportJob): ChromeLoginImportJob { + return { + ...job, + domains: [...job.domains], + ...(job.result + ? { + result: { + ...job.result, + domains: [...job.result.domains], + ...(job.result.errors ? { errors: [...job.result.errors] } : {}), + partitions: [...job.result.partitions] + } + } + : {}) + }; +} + +async function readJsonRequest(request: IncomingMessage): Promise { + const chunks: Buffer[] = []; + let total = 0; + for await (const chunk of request) { + const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); + total += buffer.byteLength; + if (total > maxImportRequestBytes) { + throw new Error("Chrome login import payload is too large."); + } + chunks.push(buffer); + } + return JSON.parse(Buffer.concat(chunks).toString("utf8")) as unknown; +} + +function sendJson(response: ServerResponse, statusCode: number, body: unknown): void { + if (!response.headersSent) { + response.writeHead(statusCode, { "content-type": "application/json" }); + } + response.end(`${JSON.stringify(body)}\n`); +} + +function sendHtml(response: ServerResponse, statusCode: number, body: string): void { + if (!response.headersSent) { + response.writeHead(statusCode, { + "content-security-policy": "default-src 'none'; style-src 'unsafe-inline'; script-src 'none'; connect-src http://127.0.0.1:* http://localhost:*", + "content-type": "text/html; charset=utf-8" + }); + } + response.end(body); +} + +function confirmationPageHtml(job: StoredChromeLoginImportJob): string { + const domains = job.domains.map((domain) => `
  • ${escapeHtml(domain)}
  • `).join(""); + return ` + + + + + CCR Chrome Login Import + + + +
    +

    Import Chrome Login State into CCR

    +

    CCR is requesting permission to import cookies and localStorage for these domains into the in-app browser.

    +
      ${domains}
    + +
    Install or enable the CCR Login Import extension in Chrome to continue.
    +
    + +`; +} + +function setCorsHeaders(response: ServerResponse): void { + response.setHeader("access-control-allow-headers", "content-type, x-ccr-login-import"); + response.setHeader("access-control-allow-methods", "GET, POST, OPTIONS"); + response.setHeader("access-control-allow-origin", "*"); +} + +function uniqueStrings(values: string[]): string[] { + return [...new Set(values)]; +} + +function readString(value: unknown): string { + return typeof value === "string" ? value.trim() : ""; +} + +function isRecord(value: unknown): value is Record { + return Boolean(value) && typeof value === "object" && !Array.isArray(value); +} + +function escapeHtml(value: string): string { + return value.replace(/[&<>"']/g, (char) => { + switch (char) { + case "&": + return "&"; + case "<": + return "<"; + case ">": + return ">"; + case "\"": + return """; + default: + return "'"; + } + }); +} + +function withTimeout(promise: Promise, timeoutMs: number, message: string): Promise { + let timeout: NodeJS.Timeout | undefined; + const timeoutPromise = new Promise((_resolve, reject) => { + timeout = setTimeout(() => reject(new Error(message)), timeoutMs); + }); + return Promise.race([promise, timeoutPromise]).finally(() => { + if (timeout) { + clearTimeout(timeout); + } + }); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/electron/src/main/deep-link.ts b/packages/electron/src/main/deep-link.ts new file mode 100644 index 0000000..6d6f1cf --- /dev/null +++ b/packages/electron/src/main/deep-link.ts @@ -0,0 +1,89 @@ +import { app } from "electron"; +import path from "node:path"; +import { appDeepLinkProtocol, createProviderDeepLinkRequest as createSharedProviderDeepLinkRequest, isAppDeepLinkUrl } from "@ccr/core/contracts/deep-link"; +import type { ProviderDeepLinkRequest } from "@ccr/core/contracts/app"; +import { IPC_CHANNELS } from "@ccr/core/config/constants"; +import { providerIdentitySafetyIssue } from "@ccr/core/providers/presets/index"; +import windowsManager from "./windows"; + +class DeepLinkService { + private pendingProviderRequests: ProviderDeepLinkRequest[] = []; + + register(): void { + this.registerProtocolClient(); + + app.on("open-url", (event, url) => { + event.preventDefault(); + this.handleUrl(url); + }); + } + + consumePendingProviderRequests(): ProviderDeepLinkRequest[] { + const requests = [...this.pendingProviderRequests]; + this.pendingProviderRequests = []; + return requests; + } + + handleArgv(argv: string[]): boolean { + const urls = argv.filter((item) => isAppDeepLinkUrl(item)); + for (const url of urls) { + this.handleUrl(url); + } + return urls.length > 0; + } + + handleUrl(url: string): void { + const request = createProviderDeepLinkRequest(url); + this.pendingProviderRequests.push(request); + if (this.pendingProviderRequests.length > 20) { + this.pendingProviderRequests = this.pendingProviderRequests.slice(-20); + } + + if (!app.isReady()) { + return; + } + + windowsManager.showMainWindow(); + windowsManager.broadcast(IPC_CHANNELS.appProviderDeepLink, request); + } + + private registerProtocolClient(): void { + try { + if (process.defaultApp && process.argv.length >= 2) { + app.setAsDefaultProtocolClient(appDeepLinkProtocol, process.execPath, [path.resolve(process.argv[1])]); + return; + } + app.setAsDefaultProtocolClient(appDeepLinkProtocol); + } catch (error) { + console.warn(`[deep-link] Failed to register ${appDeepLinkProtocol} protocol: ${formatError(error)}`); + } + } +} + +function createProviderDeepLinkRequest(rawUrl: string): ProviderDeepLinkRequest { + const request = createSharedProviderDeepLinkRequest(rawUrl); + if (!request.provider) { + return request; + } + + const identityIssue = providerIdentitySafetyIssue({ + baseUrl: request.provider.baseUrl, + name: request.provider.name + }); + if (!identityIssue) { + return request; + } + + return { + error: identityIssue.message, + id: request.id, + rawUrl: request.rawUrl, + receivedAt: request.receivedAt + }; +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + +export const deepLinkService = new DeepLinkService(); diff --git a/packages/electron/src/main/electron-web-search-mcp.ts b/packages/electron/src/main/electron-web-search-mcp.ts new file mode 100644 index 0000000..e59ec3a --- /dev/null +++ b/packages/electron/src/main/electron-web-search-mcp.ts @@ -0,0 +1,1316 @@ +import { BrowserWindow, WebContentsView, app, session, type WebContents } from "electron"; +import type { IncomingMessage, ServerResponse } from "node:http"; +import { join as pathJoin } from "node:path"; +import { backendService } from "@ccr/core/plugins/backend-service"; +import type { GatewayMcpServerConfig } from "@ccr/core/contracts/app"; +import type { + BrowserWebSearchMcpIntegration, + BrowserWebSearchMcpRegistration, + BrowserWebSearchProtocolRecord +} from "@ccr/core/gateway/service"; + +type JsonPrimitive = boolean | null | number | string; +type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue }; + +type JsonRpcRequest = { + id?: null | number | string; + jsonrpc?: string; + method?: string; + params?: unknown; +}; + +type JsonRpcResponse = + | { + id: null | number | string; + jsonrpc: "2.0"; + result: JsonValue; + } + | { + error: { + code: number; + data?: JsonValue; + message: string; + }; + id: null | number | string; + jsonrpc: "2.0"; + }; + +type ToolCallResult = { + content: Array<{ text: string; type: "text" }>; + isError?: boolean; +}; + +type BrowserSearchEngine = "bing" | "duckduckgo" | "google"; +type BrowserSearchFreshness = "day" | "month" | "week" | "year"; + +type BrowserSearchInput = { + after?: string; + anyTerms: string[]; + before?: string; + count: number; + country?: string; + engine: BrowserSearchEngine; + exactPhrase?: string; + excludeDomains: string[]; + excludeTerms: string[]; + freshness?: BrowserSearchFreshness; + includeDomains: string[]; + includeRaw: boolean; + keywords: string[]; + language?: string; + prompt: string; + safeSearch?: "moderate" | "off" | "strict"; + timeoutMs: number; +}; + +type BrowserSearchRequest = BrowserSearchInput & { + query: string; + searchUrl: string; +}; + +type BrowserSearchResult = { + content?: string; + diagnostics?: string[]; + snippet?: string; + title: string; + url: string; +}; + +type BrowserSearchPageResult = { + blocked?: string; + results?: BrowserSearchResult[]; + title?: string; +}; + +type BrowserSearchResponse = { + engine: BrowserSearchEngine; + query: string; + results: BrowserSearchResult[]; + searchUrl: string; +}; + +type BrowserSearchWorker = { + busy: boolean; + view: WebContentsView; +}; + +type BrowserSearchQueueEntry = { + reject: (error: Error) => void; + resolve: () => void; +}; + +const ownerId = "ccr-browser-web-search-mcp"; +const protocolVersion = "2024-11-05"; +const maxMcpRequestBytes = 2 * 1024 * 1024; +const defaultResultCount = 5; +const defaultTimeoutMs = 30_000; +const maxSearchResultCount = 20; +const searchPartition = "persist:ccr-browser-web-search-mcp"; +const defaultEngine: BrowserSearchEngine = "bing"; +const desktopUserAgent = + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " + + "(KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"; + +function bundledBrowserWebSearchProxyMcpEntryPath(): string { + return pathJoin(__dirname, "browser-web-search-proxy-mcp.js"); +} + +class BrowserWebSearchMcpService implements BrowserWebSearchMcpIntegration { + private readonly recentResults: BrowserWebSearchProtocolRecord[] = []; + private readonly servers = new Map(); + private readonly searchPool = new HiddenBrowserSearchPool(); + + async registerBrowserWebSearchMcpServer(options: BrowserWebSearchMcpRegistration): Promise { + await app.whenReady(); + const existing = this.servers.get(options.toolName); + if (existing) { + return existing.mcpConfig(); + } + + const server = new BrowserWebSearchToolServer(options, this.searchPool, (record) => this.recordSearchResult(record)); + const backend = await backendService.registerHttpBackend(ownerId, { + handler: (request, response) => server.handleRequest(request, response), + id: `${ownerId}:${options.name}` + }); + server.setUrl(`${backend.url}/mcp`); + this.servers.set(options.toolName, server); + return server.mcpConfig(); + } + + recentBrowserWebSearchResults(options: { sinceMs: number; toolName?: string }): BrowserWebSearchProtocolRecord[] { + this.pruneRecentResults(); + return this.recentResults.filter((record) => { + if (record.completedAtMs < options.sinceMs) { + return false; + } + return !options.toolName || record.toolName === options.toolName; + }); + } + + async runBrowserWebSearch(options: { count?: number; prompt: string; timeoutMs?: number; toolName?: string }): Promise { + const server = options.toolName ? this.servers.get(options.toolName) : this.servers.values().next().value; + return await server?.searchForProtocolResult(options); + } + + async stopBrowserWebSearchMcpServers(): Promise { + this.servers.clear(); + this.recentResults.splice(0); + await backendService.stopOwner(ownerId); + this.searchPool.destroy(); + } + + private recordSearchResult(record: BrowserWebSearchProtocolRecord): void { + this.recentResults.push(record); + this.pruneRecentResults(); + } + + private pruneRecentResults(): void { + const cutoff = Date.now() - 5 * 60_000; + while (this.recentResults.length > 0 && (this.recentResults[0].completedAtMs < cutoff || this.recentResults.length > 50)) { + this.recentResults.shift(); + } + } +} + +class BrowserWebSearchToolServer { + private readonly defaultCount: number; + private readonly defaultEngine: BrowserSearchEngine; + private readonly defaultLanguage?: string; + private readonly defaultCountry?: string; + private readonly defaultSafeSearch?: "moderate" | "off" | "strict"; + private readonly defaultTimeoutMs: number; + private readonly toolName: string; + private url = ""; + + constructor( + options: BrowserWebSearchMcpRegistration, + private readonly searchPool: HiddenBrowserSearchPool, + private readonly recordSearchResult: (record: BrowserWebSearchProtocolRecord) => void + ) { + const env = options.env ?? {}; + this.toolName = options.toolName; + this.defaultCount = clampInteger( + options.resultCount ?? readNumber(env.BROWSER_SEARCH_RESULT_COUNT) ?? readNumber(env.SEARCH_RESULT_COUNT) ?? defaultResultCount, + 1, + maxSearchResultCount + ); + this.defaultEngine = parseSearchEngine(env.BROWSER_SEARCH_ENGINE || env.SEARCH_ENGINE) ?? defaultEngine; + this.defaultLanguage = readString(env.BROWSER_SEARCH_LANGUAGE || env.SEARCH_LANGUAGE); + this.defaultCountry = readString(env.BROWSER_SEARCH_COUNTRY || env.SEARCH_COUNTRY); + this.defaultSafeSearch = parseSafeSearch(env.BROWSER_SEARCH_SAFE_SEARCH || env.SEARCH_SAFE_SEARCH); + this.defaultTimeoutMs = clampInteger( + options.timeoutMs ?? readNumber(env.BROWSER_SEARCH_TIMEOUT_MS) ?? readNumber(env.SEARCH_TIMEOUT_MS) ?? defaultTimeoutMs, + 100, + 600_000 + ); + } + + setUrl(url: string): void { + this.url = url; + } + + mcpConfig(): GatewayMcpServerConfig { + const requestTimeoutMs = clampInteger(this.defaultTimeoutMs + 5_000, 1_000, 600_000); + return { + args: [bundledBrowserWebSearchProxyMcpEntryPath()], + command: process.execPath, + env: { + BROWSER_WEB_SEARCH_MCP_URL: this.url, + BROWSER_WEB_SEARCH_PROXY_TIMEOUT_MS: String(requestTimeoutMs), + ELECTRON_RUN_AS_NODE: "1" + }, + name: this.toolName, + protocolVersion, + requestTimeoutMs, + startupTimeoutMs: 60_000, + stdioMessageMode: "content-length", + transport: "stdio" + }; + } + + async handleRequest(request: IncomingMessage, response: ServerResponse): Promise { + response.setHeader("MCP-Protocol-Version", protocolVersion); + const path = request.url ? new URL(request.url, this.url || "http://127.0.0.1").pathname : "/"; + + if (request.method === "GET" && (path === "/mcp" || path === "/mcp/")) { + sendJson(response, 200, { + endpoint: "/mcp", + name: this.toolName, + protocol: "mcp", + transport: "streamable-http" + }); + return; + } + + if (request.method !== "POST" || (path !== "/mcp" && path !== "/mcp/")) { + sendJson(response, 404, { error: { message: "In-app browser web search MCP endpoint not found." } }); + return; + } + + let payload: unknown; + try { + payload = JSON.parse((await readRequestBody(request, maxMcpRequestBytes)).toString("utf8")) as unknown; + } catch (error) { + sendJson(response, 400, jsonRpcError(null, -32700, `Invalid JSON-RPC request: ${formatError(error)}`)); + return; + } + + const requests = Array.isArray(payload) ? payload : [payload]; + const responses = await Promise.all(requests.map((item) => this.handleJsonRpcRequest(item))); + const filtered = responses.filter((item): item is JsonRpcResponse => Boolean(item)); + if (filtered.length === 0) { + response.writeHead(204); + response.end(); + return; + } + + sendJson(response, 200, Array.isArray(payload) ? filtered : filtered[0]); + } + + private async handleJsonRpcRequest(payload: unknown): Promise { + if (!isRecord(payload)) { + return jsonRpcError(null, -32600, "JSON-RPC request must be an object."); + } + + const request = payload as JsonRpcRequest; + const id = request.id ?? null; + if (request.id === undefined && request.method?.startsWith("notifications/")) { + return undefined; + } + if (request.jsonrpc !== "2.0" || !request.method) { + return jsonRpcError(id, -32600, "Invalid JSON-RPC 2.0 request."); + } + + try { + switch (request.method) { + case "initialize": + return jsonRpcResult(id, { + capabilities: { + tools: {} + }, + protocolVersion, + serverInfo: { + name: "ccr-browser-web-search", + title: "CCR In-app Browser Web Search", + version: "1.0.0" + } + }); + case "ping": + return jsonRpcResult(id, {}); + case "tools/list": + return jsonRpcResult(id, { tools: [this.tool()] as unknown as JsonValue }); + case "tools/call": + return jsonRpcResult(id, await this.callTool(request.params) as unknown as JsonValue); + default: + return jsonRpcError(id, -32601, `Unsupported MCP method: ${request.method}`); + } + } catch (error) { + return jsonRpcError(id, -32603, formatError(error)); + } + } + + private tool(): JsonValue { + return { + description: + "Search the web through a hidden in-app browser window. " + + "Supports Google, Bing, and DuckDuckGo plus advanced query controls such as domains, keywords, phrases, excluded terms, and date filters.", + inputSchema: objectSchema({ + after: { description: "Earliest result date as YYYY-MM-DD. Also added to the engine query as after:YYYY-MM-DD.", type: "string" }, + allowedDomains: { description: "Alias for includeDomains; compatible with Anthropic web search declarations.", items: { type: "string" }, type: "array" }, + allowed_domains: { description: "Alias for includeDomains; compatible with Anthropic web_search_20250305.", items: { type: "string" }, type: "array" }, + anyTerms: { description: "Terms where any one may match; encoded as OR terms.", items: { type: "string" }, type: "array" }, + before: { description: "Latest result date as YYYY-MM-DD. Also added to the engine query as before:YYYY-MM-DD.", type: "string" }, + blockedDomains: { description: "Alias for excludeDomains; compatible with Anthropic web search declarations.", items: { type: "string" }, type: "array" }, + blocked_domains: { description: "Alias for excludeDomains; compatible with Anthropic web_search_20250305.", items: { type: "string" }, type: "array" }, + count: { maximum: maxSearchResultCount, minimum: 1, type: "number" }, + country: { description: "Country/region hint such as US, CN, GB.", type: "string" }, + domains: { description: "Alias for includeDomains.", items: { type: "string" }, type: "array" }, + engine: { enum: ["auto", "bing", "google", "duckduckgo"], type: "string" }, + exactPhrase: { description: "Phrase to search exactly.", type: "string" }, + excludeDomain: { description: "Single domain alias for excludeDomains.", type: "string" }, + excludeDomains: { description: "Domains to exclude with -site:domain.", items: { type: "string" }, type: "array" }, + excludeTerms: { description: "Terms to exclude with a leading minus.", items: { type: "string" }, type: "array" }, + freshness: { description: "Relative time filter.", enum: ["day", "week", "month", "year"], type: "string" }, + includeDomains: { description: "Domains to restrict with site:domain.", items: { type: "string" }, type: "array" }, + includeRaw: { description: "Include the engine search URL in the text response.", type: "boolean" }, + keywords: { description: "Additional required keywords. A comma-separated string is also accepted.", items: { type: "string" }, type: "array" }, + language: { description: "Language hint such as en, zh-CN, ja.", type: "string" }, + prompt: { description: "Natural-language query. Search engine operators already present here are preserved.", type: "string" }, + query: { description: "Alias for prompt.", type: "string" }, + safeSearch: { enum: ["off", "moderate", "strict"], type: "string" }, + site: { description: "Single domain alias for includeDomains.", type: "string" }, + timeRange: { description: "Alias for freshness.", enum: ["day", "week", "month", "year"], type: "string" }, + timeoutMs: { minimum: 100, type: "number" } + }, ["prompt"]), + name: this.toolName, + title: "In-app Browser Web Search" + }; + } + + private async callTool(params: unknown): Promise { + if (!isRecord(params) || typeof params.name !== "string") { + throw new Error("tools/call params must include a tool name."); + } + if (params.name !== this.toolName) { + throw new Error(`Unknown in-app browser web search tool: ${params.name}`); + } + + const args = isRecord(params.arguments) ? params.arguments : {}; + try { + const input = this.readSearchInput(args); + const record = await this.search(input); + return textResult(formatSearchResponse(record, input.includeRaw)); + } catch (error) { + return { + ...textResult(formatError(error)), + isError: true + }; + } + } + + async searchForProtocolResult(options: { count?: number; prompt: string; timeoutMs?: number }): Promise { + return await this.search(this.readSearchInput({ + count: options.count, + prompt: options.prompt, + timeoutMs: options.timeoutMs + })); + } + + private async search(input: BrowserSearchInput): Promise { + const response = await this.searchPool.search(input); + const record = { + completedAtMs: Date.now(), + engine: response.engine, + query: response.query, + results: response.results, + searchUrl: response.searchUrl, + toolName: this.toolName + }; + this.recordSearchResult(record); + return record; + } + + private readSearchInput(args: Record): BrowserSearchInput { + const prompt = readString(args.prompt) || readString(args.query); + if (!prompt) { + throw new Error(`${this.toolName} requires prompt.`); + } + + const engine = parseSearchEngine(readString(args.engine)) ?? this.defaultEngine; + const includeDomains = uniqueStrings([ + ...readStringArray(args.includeDomains), + ...readStringArray(args.domains), + ...readStringArray(args.domain), + ...readStringArray(args.site), + ...readStringArray(args.allowedDomains), + ...readStringArray(args.allowed_domains) + ].map(normalizeDomain).filter((item): item is string => Boolean(item))); + const excludeDomains = uniqueStrings([ + ...readStringArray(args.excludeDomains), + ...readStringArray(args.excludeDomain), + ...readStringArray(args.blockedDomains), + ...readStringArray(args.blocked_domains) + ].map(normalizeDomain).filter((item): item is string => Boolean(item))); + + return { + after: normalizeSearchDate(readString(args.after) || readString(args.since) || readString(args.fromDate)), + anyTerms: readStringArray(args.anyTerms), + before: normalizeSearchDate(readString(args.before) || readString(args.until) || readString(args.toDate)), + count: clampInteger(readNumber(args.count) ?? this.defaultCount, 1, maxSearchResultCount), + country: readString(args.country) || this.defaultCountry, + engine, + exactPhrase: readString(args.exactPhrase), + excludeDomains, + excludeTerms: readStringArray(args.excludeTerms), + freshness: parseFreshness(readString(args.freshness) || readString(args.timeRange)), + includeDomains, + includeRaw: args.includeRaw === true, + keywords: readStringArray(args.keywords), + language: readString(args.language) || this.defaultLanguage, + prompt, + safeSearch: parseSafeSearch(readString(args.safeSearch)) ?? this.defaultSafeSearch, + timeoutMs: clampInteger(readNumber(args.timeoutMs) ?? this.defaultTimeoutMs, 100, 600_000) + }; + } +} + +class HiddenBrowserSearchPool { + private configuredSession = false; + private queue: BrowserSearchQueueEntry[] = []; + private window?: BrowserWindow; + private workers: BrowserSearchWorker[] = []; + + async search(input: BrowserSearchInput): Promise { + const request = buildBrowserSearchRequest(input); + const worker = await this.acquire(request.timeoutMs); + let page: BrowserSearchPageResult; + try { + page = await runSearchInWorker(worker, request); + } finally { + this.release(worker); + } + if (page.blocked) { + throw new Error(page.blocked); + } + const results = uniqueSearchResults(page.results ?? []).slice(0, request.count); + return { + engine: request.engine, + query: request.query, + results: await this.enrichResults(results, request), + searchUrl: request.searchUrl + }; + } + + destroy(): void { + this.queue.splice(0).forEach((entry) => entry.reject(new Error("Browser search service stopped."))); + this.queue = []; + for (const worker of this.workers) { + if (!worker.view.webContents.isDestroyed()) { + worker.view.webContents.close({ waitForBeforeUnload: false }); + } + } + this.workers = []; + if (this.window && !this.window.isDestroyed()) { + this.window.destroy(); + } + this.window = undefined; + this.configuredSession = false; + } + + private async acquire(timeoutMs: number): Promise { + await app.whenReady(); + this.ensureWindow(); + const maxWorkers = browserSearchConcurrency(); + for (;;) { + const idle = this.workers.find((worker) => !worker.busy); + if (idle) { + idle.busy = true; + return idle; + } + if (this.workers.length < maxWorkers) { + const worker = this.createWorker(); + worker.busy = true; + return worker; + } + await waitForQueueTurn(this.queue, timeoutMs); + } + } + + private release(worker: BrowserSearchWorker): void { + worker.busy = false; + const next = this.queue.shift(); + next?.resolve(); + } + + private ensureWindow(): BrowserWindow { + if (this.window && !this.window.isDestroyed()) { + return this.window; + } + this.configureSearchSession(); + this.window = new BrowserWindow({ + height: 900, + paintWhenInitiallyHidden: true, + show: false, + skipTaskbar: true, + title: "CCR In-app Browser Web Search", + webPreferences: { + backgroundThrottling: false, + contextIsolation: true, + images: false, + nodeIntegration: false, + sandbox: true, + webSecurity: true + }, + width: 1280 + }); + this.window.on("closed", () => { + this.workers = []; + this.window = undefined; + }); + return this.window; + } + + private createWorker(): BrowserSearchWorker { + const window = this.ensureWindow(); + const view = new WebContentsView({ + webPreferences: { + backgroundThrottling: false, + contextIsolation: true, + images: false, + nodeIntegration: false, + partition: searchPartition, + sandbox: true, + webSecurity: true + } + }); + view.webContents.setAudioMuted(true); + view.webContents.on("console-message", (event) => { + event.preventDefault(); + }); + view.setBounds({ height: 900, width: 1280, x: 0, y: 0 }); + window.contentView.addChildView(view); + const worker = { busy: false, view }; + this.workers.push(worker); + return worker; + } + + private configureSearchSession(): void { + if (this.configuredSession) { + return; + } + const browserSession = session.fromPartition(searchPartition); + browserSession.setUserAgent(desktopUserAgent); + browserSession.webRequest.onBeforeRequest((details, callback) => { + if (details.resourceType === "image" || details.resourceType === "media" || details.resourceType === "font") { + callback({ cancel: true }); + return; + } + callback({}); + }); + this.configuredSession = true; + } + + private async enrichResults(results: BrowserSearchResult[], request: BrowserSearchRequest): Promise { + const openCount = Math.min(results.length, browserSearchOpenResultCount()); + if (openCount <= 0) { + return results; + } + const enriched = await Promise.all(results.slice(0, openCount).map((result) => this.enrichResult(result, request))); + return results.map((result, index) => enriched[index] ?? result); + } + + private async enrichResult(result: BrowserSearchResult, request: BrowserSearchRequest): Promise { + if (!shouldOpenSearchResult(result.url)) { + return result; + } + const timeoutMs = browserSearchPageTimeoutMs(request.timeoutMs); + let worker: BrowserSearchWorker | undefined; + try { + worker = await this.acquire(timeoutMs); + await loadSearchUrl(worker.view.webContents, result.url, timeoutMs); + const page = await withTimeout( + worker.view.webContents.executeJavaScript(pageContentExtractionScript(), true) as Promise<{ description?: string; text?: string; title?: string }>, + timeoutMs, + "Browser result page extraction timed out." + ); + const content = compactExtractedContent(page.text); + const snippet = result.snippet || compactExtractedContent(page.description); + return { + ...result, + ...(content ? { content } : {}), + ...(!content ? { diagnostics: appendSearchResultDiagnostic(result.diagnostics, "No extractable page content found.") } : {}), + ...(snippet ? { snippet } : {}), + ...(page.title && page.title.length > result.title.length ? { title: page.title.slice(0, 240) } : {}) + }; + } catch (error) { + return { + ...result, + diagnostics: appendSearchResultDiagnostic(result.diagnostics, `Page extraction failed: ${formatError(error)}`) + }; + } finally { + if (worker) { + this.release(worker); + } + } + } +} + +async function runSearchInWorker(worker: BrowserSearchWorker, request: BrowserSearchRequest): Promise { + const webContents = worker.view.webContents; + if (webContents.isDestroyed()) { + throw new Error("Browser search view is unavailable."); + } + + await loadSearchUrl(webContents, request.searchUrl, request.timeoutMs); + return await pollSearchResults(webContents, request); +} + +async function loadSearchUrl(webContents: WebContents, url: string, timeoutMs: number): Promise { + webContents.stop(); + await withTimeout( + webContents.loadURL(url, { + userAgent: desktopUserAgent + }), + timeoutMs, + "Browser search navigation timed out." + ); +} + +async function pollSearchResults(webContents: WebContents, request: BrowserSearchRequest): Promise { + const deadline = Date.now() + request.timeoutMs; + let last: BrowserSearchPageResult = { results: [] }; + while (Date.now() < deadline) { + try { + last = await withTimeout( + webContents.executeJavaScript(searchResultExtractionScript(request.engine, request.count), true) as Promise, + Math.max(100, Math.min(1000, deadline - Date.now())), + "Browser search result extraction timed out." + ); + } catch { + await sleep(150); + continue; + } + if (last.blocked || (last.results?.length ?? 0) >= Math.min(request.count, 3)) { + return last; + } + await sleep(150); + } + return last; +} + +function buildBrowserSearchRequest(input: BrowserSearchInput): BrowserSearchRequest { + const query = buildAdvancedSearchQuery(input); + const searchUrl = searchUrlForEngine(input, query); + return { + ...input, + query, + searchUrl + }; +} + +function searchUrlForEngine(input: BrowserSearchInput, query: string): string { + if (input.engine === "google") { + const url = new URL("https://www.google.com/search"); + url.searchParams.set("q", query); + url.searchParams.set("num", String(Math.min(input.count, 10))); + url.searchParams.set("filter", "0"); + url.searchParams.set("pws", "0"); + url.searchParams.set("udm", "14"); + if (input.language) url.searchParams.set("hl", input.language); + if (input.country) url.searchParams.set("gl", input.country); + if (input.safeSearch) url.searchParams.set("safe", input.safeSearch === "off" ? "off" : "active"); + const tbs = googleTimeFilter(input); + if (tbs) url.searchParams.set("tbs", tbs); + return url.toString(); + } + + if (input.engine === "duckduckgo") { + const url = new URL("https://duckduckgo.com/"); + url.searchParams.set("q", query); + url.searchParams.set("ia", "web"); + if (input.language) url.searchParams.set("kl", input.language); + if (input.safeSearch) url.searchParams.set("kp", input.safeSearch === "off" ? "-2" : "1"); + const df = duckDuckGoTimeFilter(input.freshness); + if (df) url.searchParams.set("df", df); + return url.toString(); + } + + const url = new URL("https://www.bing.com/search"); + url.searchParams.set("q", query); + url.searchParams.set("count", String(input.count)); + url.searchParams.set("qs", "n"); + url.searchParams.set("form", "QBRE"); + if (input.language) url.searchParams.set("setlang", input.language); + if (input.country) url.searchParams.set("cc", input.country); + if (input.safeSearch) url.searchParams.set("safeSearch", bingSafeSearch(input.safeSearch)); + const qft = bingTimeFilter(input.freshness); + if (qft) url.searchParams.set("qft", qft); + return url.toString(); +} + +function buildAdvancedSearchQuery(input: BrowserSearchInput): string { + const parts = [input.prompt.trim()]; + parts.push(...input.keywords.map(searchTerm)); + if (input.exactPhrase) { + parts.push(quoteSearchPhrase(input.exactPhrase)); + } + if (input.anyTerms.length > 0) { + parts.push(`(${input.anyTerms.map(searchTerm).join(" OR ")})`); + } + parts.push(...input.excludeTerms.map((term) => `-${searchTerm(term)}`)); + if (input.includeDomains.length === 1) { + parts.push(`site:${input.includeDomains[0]}`); + } else if (input.includeDomains.length > 1) { + parts.push(`(${input.includeDomains.map((domain) => `site:${domain}`).join(" OR ")})`); + } + parts.push(...input.excludeDomains.map((domain) => `-site:${domain}`)); + if (input.after) { + parts.push(`after:${input.after}`); + } + if (input.before) { + parts.push(`before:${input.before}`); + } + return parts.filter(Boolean).join(" ").replace(/\s+/g, " ").trim(); +} + +function searchTerm(value: string): string { + const trimmed = value.trim(); + if (!trimmed) { + return ""; + } + return /\s/.test(trimmed) && !/^".*"$/.test(trimmed) ? quoteSearchPhrase(trimmed) : trimmed; +} + +function quoteSearchPhrase(value: string): string { + return `"${value.trim().replace(/"/g, " ")}"`; +} + +function googleTimeFilter(input: BrowserSearchInput): string | undefined { + if (input.after || input.before) { + const parts = ["cdr:1"]; + if (input.after) parts.push(`cd_min:${dateToGoogleDate(input.after)}`); + if (input.before) parts.push(`cd_max:${dateToGoogleDate(input.before)}`); + return parts.join(","); + } + if (input.freshness === "day") return "qdr:d"; + if (input.freshness === "week") return "qdr:w"; + if (input.freshness === "month") return "qdr:m"; + if (input.freshness === "year") return "qdr:y"; + return undefined; +} + +function bingTimeFilter(value: BrowserSearchFreshness | undefined): string | undefined { + if (value === "day") return "+filterui:age-lt1440"; + if (value === "week") return "+filterui:age-lt10080"; + if (value === "month") return "+filterui:age-lt43200"; + if (value === "year") return "+filterui:age-lt525600"; + return undefined; +} + +function duckDuckGoTimeFilter(value: BrowserSearchFreshness | undefined): string | undefined { + if (value === "day") return "d"; + if (value === "week") return "w"; + if (value === "month") return "m"; + if (value === "year") return "y"; + return undefined; +} + +function bingSafeSearch(value: "moderate" | "off" | "strict"): string { + if (value === "strict") return "Strict"; + if (value === "off") return "Off"; + return "Moderate"; +} + +function dateToGoogleDate(value: string): string { + const [year, month, day] = value.split("-"); + return `${month}/${day}/${year}`; +} + +function searchResultExtractionScript(engine: BrowserSearchEngine, count: number): string { + return `(() => { + const engine = ${JSON.stringify(engine)}; + const maxResults = ${JSON.stringify(count)}; + const results = []; + const seen = new Set(); + const blockedText = detectBlocked(); + if (blockedText) return { blocked: blockedText, results, title: document.title || "" }; + + function compact(value) { + return String(value || "").replace(/\\s+/g, " ").trim(); + } + function absoluteUrl(href) { + try { return new URL(href, location.href); } catch (_) { return undefined; } + } + function decodeMaybeBase64(value) { + if (!value) return ""; + let raw = value.replace(/-/g, "+").replace(/_/g, "/"); + if (raw.startsWith("a1")) raw = raw.slice(2); + try { + const decoded = atob(raw); + return /^https?:\\/\\//i.test(decoded) ? decoded : ""; + } catch (_) { + return ""; + } + } + function normalizeResultUrl(href) { + const url = absoluteUrl(href); + if (!url || !/^https?:$/i.test(url.protocol)) return ""; + const host = url.hostname.toLowerCase(); + if (host.includes("google.") && url.pathname === "/url") { + const q = url.searchParams.get("q") || url.searchParams.get("url"); + if (q) return normalizeResultUrl(q); + } + if (host.endsWith("bing.com") && url.pathname.startsWith("/ck/")) { + const raw = url.searchParams.get("u"); + const decoded = decodeMaybeBase64(raw || ""); + if (decoded) return normalizeResultUrl(decoded); + } + if (host.endsWith("duckduckgo.com") && url.pathname.startsWith("/l/")) { + const target = url.searchParams.get("uddg"); + if (target) return normalizeResultUrl(target); + } + if (isSearchChromeUrl(url)) return ""; + url.hash = ""; + return url.toString(); + } + function isSearchChromeUrl(url) { + const host = url.hostname.toLowerCase(); + const path = url.pathname.toLowerCase(); + if (host === location.hostname.toLowerCase() && (path === "/" || path === "/search" || path.startsWith("/search/"))) return true; + if (host.includes("google.") && /\\/(preferences|advanced_search|intl|policies|support|sorry|search|aclk|imgres)/.test(path)) return true; + if (host.endsWith("bing.com") && /\\/(search|account|profile|images|videos|maps|news|aclick)/.test(path)) return true; + if (host.endsWith("bing.com") && path.startsWith("/ck/")) return true; + if (host.endsWith("duckduckgo.com") && (path === "/" || path.startsWith("/settings") || path.startsWith("/y.js"))) return true; + return false; + } + function resultContainer(anchor, title) { + const root = anchor && anchor.closest("li.b_algo, li.b_ad, div.g, div[data-sokoban-container], div[data-testid='result'], article, .result, .result__body, .web-result"); + if (root) return root; + let node = anchor; + for (let depth = 0; node && depth < 8; depth += 1, node = node.parentElement) { + if (node.matches && node.matches("nav, header, footer, form, aside")) return undefined; + if (node.matches && node.matches("main, #search, #b_results, #rso")) break; + const text = compact(node.textContent || ""); + if (text.length > title.length + 40) return node; + } + return undefined; + } + function isLikelyOrganicResult(anchor, container) { + if (!anchor || !container) return false; + if (anchor.closest("nav, header, footer, form, aside")) return false; + if (anchor.closest("li.b_algo, div.g, div[data-sokoban-container], div[data-testid='result'], article, .result, .result__body, .web-result")) return true; + const heading = anchor.closest("h1, h2, h3, [role='heading']"); + const searchRegion = anchor.closest("main, #search, #b_results, #rso"); + return Boolean(heading && searchRegion); + } + function isAdOrUtilityResult(anchor, container) { + let node = anchor; + for (let depth = 0; node && depth < 6; depth += 1, node = node.parentElement) { + const attributes = [ + node.getAttribute && node.getAttribute("aria-label"), + node.getAttribute && node.getAttribute("data-text-ad"), + node.getAttribute && node.getAttribute("data-testid"), + node.className + ].filter(Boolean).join(" "); + if (/\\b(?:ad|ads|sponsored|promo|shopping)\\b|广告|赞助|推廣/i.test(attributes)) return true; + } + const firstText = compact(container && container.textContent).slice(0, 180); + if (/^(?:ad|ads|sponsored|promo|shopping)\\b|^(?:广告|赞助|推廣)/i.test(firstText)) return true; + return false; + } + function cleanSnippetCandidate(value, title, url) { + const host = (() => { try { return new URL(url).hostname.replace(/^www\\./, ""); } catch (_) { return ""; } })(); + return compact(String(value || "") + .replace(title, " ") + .replace(url, " ") + .replace(host, " ") + .replace(/https?:\\/\\/\\S+/g, " ") + .replace(/\\b(?:Cached|Translate this page|Similar)\\b/gi, " ")); + } + function breadcrumbLike(value) { + const text = compact(value); + if (!text) return true; + if (/https?:\\/\\//i.test(text)) return true; + if (text.length < 35 && /[›/]|^https?:|^www\\./i.test(text)) return true; + if (/[›]/.test(text) && !/[.!?,。!?]/.test(text)) return true; + if (!/[.!?:;,。!?:;]/.test(text) && /^[\\w\\s.:-]+(?:[›/]\\s*[\\w\\s.:-]+)+$/i.test(text)) return true; + return false; + } + function snippetFor(anchor, container, title, url) { + const preferred = container && container.querySelector(".b_caption p, .b_snippet, [data-sncf], .VwiC3b, .IsZvec, [data-result='snippet'], .result__snippet, p"); + const preferredText = cleanSnippetCandidate(preferred && preferred.textContent, title, url); + if (preferredText && !breadcrumbLike(preferredText)) return preferredText.slice(0, 700); + const candidates = container + ? Array.from(container.querySelectorAll("p, span, div")) + .map((node) => cleanSnippetCandidate(node.textContent, title, url)) + .filter((text) => text.length >= 35 && !breadcrumbLike(text)) + : []; + const text = candidates.find((candidate) => candidate.length >= 50) || candidates[0] || ""; + if (!text) return ""; + return text.slice(0, 700); + } + function titleFor(anchor, titleOverride) { + const explicit = compact(titleOverride); + if (explicit && explicit.length >= 2) return explicit; + const heading = anchor && anchor.querySelector("h1, h2, h3, [role='heading']"); + return compact((heading && heading.textContent) || (anchor && (anchor.textContent || anchor.innerText))); + } + function add(anchor, titleOverride) { + if (!anchor || results.length >= maxResults) return; + const href = anchor.getAttribute("href") || ""; + const url = normalizeResultUrl(href); + if (!url || seen.has(url)) return; + const title = titleFor(anchor, titleOverride); + if (!title || title.length < 2) return; + const container = resultContainer(anchor, title); + if (!isLikelyOrganicResult(anchor, container) || isAdOrUtilityResult(anchor, container)) return; + seen.add(url); + results.push({ + snippet: snippetFor(anchor, container, title, url), + title: title.slice(0, 240), + url + }); + } + function collect(selector) { + document.querySelectorAll(selector).forEach((node) => { + const anchor = node.matches && node.matches("a[href]") ? node : node.closest && node.closest("a[href]"); + add(anchor, node.matches && node.matches("h1, h2, h3, [role='heading']") ? node.textContent : ""); + }); + } + function collectGoogle() { + collect("#search h3"); + collect("#rso h3"); + collect("a[href] h3"); + } + function collectBing() { + collect("li.b_algo h2 a[href]"); + collect("main ol li h2 a[href]"); + } + function collectDuckDuckGo() { + collect("a[data-testid='result-title-a']"); + collect(".result__a"); + collect("article h2 a[href]"); + } + function collectGenericHeadings() { + collect("main h1 a[href], main h2 a[href], main h3 a[href], #search h3, #b_results h2 a[href], #rso h3, article h2 a[href], article h3 a[href]"); + } + if (engine === "google") collectGoogle(); + if (engine === "bing") collectBing(); + if (engine === "duckduckgo") collectDuckDuckGo(); + collectGenericHeadings(); + return { results, title: document.title || "" }; + + function detectBlocked() { + const text = compact(document.body && document.body.innerText).toLowerCase(); + if (!text) return ""; + if (text.includes("unusual traffic") || text.includes("detected unusual") || text.includes("not a robot") || text.includes("captcha") || text.includes("验证码") || text.includes("人机验证")) { + return "Search engine returned an anti-bot or CAPTCHA page."; + } + if (text.includes("before you continue to google") || text.includes("consent.google") || text.includes("cookie consent")) { + return "Google returned a consent page instead of search results."; + } + return ""; + } + })();`; +} + +function pageContentExtractionScript(): string { + return `(() => { + function compact(value) { + return String(value || "").replace(/[\\t\\f\\v ]+/g, " ").replace(/\\n\\s*\\n+/g, "\\n").trim(); + } + function textFrom(node) { + if (!node) return ""; + const clone = node.cloneNode(true); + clone.querySelectorAll("script, style, noscript, svg, nav, header, footer, aside, form, button, input, select, textarea, iframe, [aria-hidden='true']").forEach((item) => item.remove()); + const lines = String(clone.innerText || clone.textContent || "") + .split(/\\n+/) + .map((line) => compact(line)) + .filter((line) => line.length >= 20) + .filter((line, index, array) => array.indexOf(line) === index); + return lines.join("\\n"); + } + function scoreText(text) { + const length = text.length; + const sentenceMarks = (text.match(/[.!?。!?]/g) || []).length; + return length + sentenceMarks * 80; + } + const title = compact( + document.querySelector("meta[property='og:title']")?.getAttribute("content") || + document.querySelector("h1")?.textContent || + document.title || + "" + ); + const description = compact( + document.querySelector("meta[name='description']")?.getAttribute("content") || + document.querySelector("meta[property='og:description']")?.getAttribute("content") || + "" + ); + const candidates = [ + ...document.querySelectorAll("article, main, [role='main'], .article, .article-content, .post, .post-content, .entry-content, .content, #content, .main-content") + ].map(textFrom).filter(Boolean); + const fallback = textFrom(document.body); + const text = [...candidates, fallback] + .filter(Boolean) + .sort((left, right) => scoreText(right) - scoreText(left))[0] || ""; + return { + description, + text: text.slice(0, 5000), + title + }; + })();`; +} + +function formatSearchResponse( + response: Pick & { engine: string }, + includeRaw: boolean +): string { + if (response.results.length === 0) { + return [ + `Search engine: ${response.engine}`, + `Query: ${response.query}`, + includeRaw ? `Search URL: ${response.searchUrl}` : "", + "No results." + ].filter(Boolean).join("\n"); + } + + return [ + `Search engine: ${response.engine}`, + `Query: ${response.query}`, + includeRaw ? `Search URL: ${response.searchUrl}` : "", + ...response.results.map((result, index) => [ + `${index + 1}. ${result.title}`, + `URL: ${result.url}`, + result.snippet ? `Snippet: ${result.snippet}` : "", + result.content ? `Extracted content: ${result.content}` : "", + result.diagnostics?.length ? `Diagnostics: ${result.diagnostics.join("; ")}` : "" + ].filter(Boolean).join("\n")) + ].filter(Boolean).join("\n\n"); +} + +function appendSearchResultDiagnostic(existing: string[] | undefined, message: string): string[] { + return uniqueStrings([...(existing ?? []), message]); +} + +function uniqueSearchResults(results: BrowserSearchResult[]): BrowserSearchResult[] { + const seen = new Set(); + const unique: BrowserSearchResult[] = []; + for (const result of results) { + if (!result.url || seen.has(result.url)) { + continue; + } + seen.add(result.url); + unique.push(result); + } + return unique; +} + +function normalizeDomain(value: string): string | undefined { + const trimmed = value.trim().replace(/^site:/i, ""); + if (!trimmed) { + return undefined; + } + try { + const url = new URL(trimmed.includes("://") ? trimmed : `https://${trimmed}`); + return url.hostname.replace(/^www\./i, "").toLowerCase(); + } catch { + return trimmed.replace(/^www\./i, "").replace(/\/.*$/, "").toLowerCase(); + } +} + +function normalizeSearchDate(value: string | undefined): string | undefined { + if (!value) { + return undefined; + } + const trimmed = value.trim(); + if (/^\\d{4}-\\d{2}-\\d{2}$/.test(trimmed)) { + return trimmed; + } + const time = Date.parse(trimmed); + return Number.isFinite(time) ? new Date(time).toISOString().slice(0, 10) : undefined; +} + +function parseSearchEngine(value: string | undefined): BrowserSearchEngine | undefined { + const normalized = value?.trim().toLowerCase().replace(/[_\s]+/g, "-"); + if (!normalized || normalized === "auto") { + return undefined; + } + if (normalized === "google") return "google"; + if (normalized === "bing") return "bing"; + if (normalized === "duckduckgo" || normalized === "duck-duck-go" || normalized === "ddg") return "duckduckgo"; + return undefined; +} + +function parseFreshness(value: string | undefined): BrowserSearchFreshness | undefined { + const normalized = value?.trim().toLowerCase(); + if (normalized === "day" || normalized === "24h" || normalized === "d") return "day"; + if (normalized === "week" || normalized === "7d" || normalized === "w") return "week"; + if (normalized === "month" || normalized === "30d" || normalized === "m") return "month"; + if (normalized === "year" || normalized === "365d" || normalized === "y") return "year"; + return undefined; +} + +function parseSafeSearch(value: string | undefined): "moderate" | "off" | "strict" | undefined { + const normalized = value?.trim().toLowerCase(); + if (normalized === "off" || normalized === "false" || normalized === "0") return "off"; + if (normalized === "strict") return "strict"; + if (normalized === "moderate" || normalized === "medium" || normalized === "on" || normalized === "true" || normalized === "1") return "moderate"; + return undefined; +} + +function browserSearchConcurrency(): number { + return clampInteger(readNumber(process.env.CCR_BROWSER_SEARCH_CONCURRENCY) ?? 2, 1, 4); +} + +function browserSearchOpenResultCount(): number { + return clampInteger(readNumber(process.env.CCR_BROWSER_SEARCH_OPEN_RESULT_COUNT) ?? 3, 0, 8); +} + +function browserSearchPageTimeoutMs(requestTimeoutMs: number): number { + return clampInteger( + readNumber(process.env.CCR_BROWSER_SEARCH_PAGE_TIMEOUT_MS) ?? Math.min(requestTimeoutMs, 8_000), + 500, + 30_000 + ); +} + +function shouldOpenSearchResult(url: string): boolean { + try { + const parsed = new URL(url); + if (!/^https?:$/i.test(parsed.protocol)) { + return false; + } + return !/\.(?:avi|dmg|docx?|exe|gif|jpe?g|mov|mp3|mp4|pdf|png|pptx?|rar|webp|xlsx?|zip)$/i.test(parsed.pathname); + } catch { + return false; + } +} + +function compactExtractedContent(value: string | undefined): string | undefined { + const compacted = value?.replace(/\s+/g, " ").trim(); + if (!compacted || compacted.length < 40) { + return undefined; + } + return compacted.slice(0, 2_400); +} + +function waitForQueueTurn(queue: BrowserSearchQueueEntry[], timeoutMs: number): Promise { + return new Promise((resolve, reject) => { + let settled = false; + const entry = { + reject: (error: Error) => { + if (settled) { + return; + } + settled = true; + clearTimeout(timer); + reject(error); + }, + resolve: () => { + if (settled) { + return; + } + settled = true; + clearTimeout(timer); + resolve(); + } + }; + const timer = setTimeout(() => { + if (settled) { + return; + } + settled = true; + const index = queue.indexOf(entry); + if (index >= 0) { + queue.splice(index, 1); + } + reject(new Error("Browser search worker queue timed out.")); + }, timeoutMs); + queue.push(entry); + }); +} + +function withTimeout(promise: Promise, timeoutMs: number, message: string): Promise { + return new Promise((resolve, reject) => { + const timer = setTimeout(() => reject(new Error(message)), timeoutMs); + promise.then( + (value) => { + clearTimeout(timer); + resolve(value); + }, + (error: unknown) => { + clearTimeout(timer); + reject(error); + } + ); + }); +} + +function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +function textResult(text: string): ToolCallResult { + return { + content: [{ text, type: "text" }] + }; +} + +function objectSchema(properties: Record, required: string[] = []): JsonValue { + return { + additionalProperties: true, + properties, + ...(required.length ? { required } : {}), + type: "object" + }; +} + +function jsonRpcResult(id: null | number | string, result: JsonValue): JsonRpcResponse { + return { + id, + jsonrpc: "2.0", + result + }; +} + +function jsonRpcError(id: null | number | string, code: number, message: string): JsonRpcResponse { + return { + error: { + code, + message + }, + id, + jsonrpc: "2.0" + }; +} + +function readRequestBody(request: IncomingMessage, maxBytes: number): Promise { + return new Promise((resolve, reject) => { + const chunks: Buffer[] = []; + let total = 0; + request.on("data", (chunk: Buffer) => { + total += chunk.byteLength; + if (total > maxBytes) { + reject(new Error(`Request body exceeds ${maxBytes} bytes.`)); + request.destroy(); + return; + } + chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)); + }); + request.on("end", () => resolve(Buffer.concat(chunks))); + request.on("error", reject); + }); +} + +function sendJson(response: ServerResponse, statusCode: number, payload: unknown): void { + const body = `${JSON.stringify(payload)}\n`; + response.writeHead(statusCode, { + "cache-control": "no-store", + "content-length": Buffer.byteLength(body), + "content-type": "application/json; charset=utf-8" + }); + response.end(body); +} + +function readString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function readNumber(value: unknown): number | undefined { + if (typeof value === "number" && Number.isFinite(value)) { + return value; + } + if (typeof value === "string" && value.trim()) { + const parsed = Number(value); + return Number.isFinite(parsed) ? parsed : undefined; + } + return undefined; +} + +function readStringArray(value: unknown): string[] { + if (typeof value === "string") { + return value.split(",").map((item) => item.trim()).filter(Boolean); + } + if (!Array.isArray(value)) { + return []; + } + return value.map(readString).filter((item): item is string => Boolean(item)); +} + +function uniqueStrings(values: string[]): string[] { + return [...new Set(values.filter(Boolean))]; +} + +function clampInteger(value: number, minimum: number, maximum: number): number { + return Math.max(minimum, Math.min(maximum, Math.round(value))); +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + +export const browserWebSearchMcpService = new BrowserWebSearchMcpService(); diff --git a/packages/electron/src/main/ipc.ts b/packages/electron/src/main/ipc.ts new file mode 100644 index 0000000..062f754 --- /dev/null +++ b/packages/electron/src/main/ipc.ts @@ -0,0 +1,1177 @@ +import { app, BrowserWindow, dialog, ipcMain, nativeImage, shell, type OpenDialogOptions, type Rectangle, type SaveDialogOptions } from "electron"; +import { randomUUID } from "node:crypto"; +import { existsSync, mkdtempSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs"; +import path from "node:path"; +import { deflateSync, inflateSync } from "node:zlib"; +import { loadPersistedAppSetting, replacePersistedAppSetting } from "@ccr/core/config/app-config-store"; +import { builtInBrowserService } from "./built-in-browser"; +import { scanBotHandoffBluetoothTargets, scanBotHandoffWifiTargets } from "@ccr/core/agents/bot-gateway/handoff-scan-service"; +import { cancelBotGatewayQrLogin, startBotGatewayQrLogin, waitBotGatewayQrLogin } from "@ccr/core/agents/bot-gateway/qr-login-service"; +import { closeBotGatewayQrWindow, openBotGatewayQrWindow } from "./bot-gateway-qr-window-service"; +import { syncClaudeAppGatewayConfig } from "@ccr/core/agents/claude-app/gateway-service"; +import { loadAppConfig, saveApiKeysConfig, saveAppConfig } from "@ccr/core/config/config"; +import { API_KEYS_DB_FILE, APP_CONFIG_DB_FILE, APP_NAME, CONFIGDIR, CONFIG_FILE, DATADIR, GATEWAY_CONFIG_FILE, IPC_CHANNELS, LEGACY_CONFIG_FILE, ONBOARDING_FINISHED_FILE, PROXY_CA_CERT_FILE, REQUEST_LOGS_DB_FILE, USAGE_DB_FILE } from "@ccr/core/config/constants"; +import { deepLinkService } from "./deep-link"; +import { gatewayService } from "@ccr/core/gateway/service"; +import { shouldRestartGatewayForRuntimeConfigChange } from "@ccr/core/gateway/runtime-change"; +import { getProviderAccountSnapshots, invalidateProviderAccountSnapshotCache, resetCodexRateLimitCredit, testProviderAccountConnector } from "@ccr/core/providers/account-service"; +import { detectProviderIcon } from "@ccr/core/providers/icons"; +import { fetchProviderManifest } from "@ccr/core/providers/manifest-service"; +import { getLocalAgentProviderCandidates, importLocalAgentProvider, probeLocalAgentProvider } from "@ccr/core/agents/local-providers/service"; +import { isLaunchAtLoginSupported, syncLaunchAtLogin } from "./launch-at-login"; +import { getProviderCatalogModels } from "@ccr/core/providers/model-catalog"; +import { getProviderPresets } from "@ccr/core/providers/presets/index"; +import { checkGatewayProviderConnectivity, probeGatewayProvider, probeGatewayProviderCandidates } from "@ccr/core/providers/probe"; +import { applyProfileConfig } from "@ccr/core/profiles/service"; +import { desktopCliCommandName, getProfileOpenCommand, getProfileRuntimeStatus, openProfileFromCcr, stopProfileFromCcr } from "@ccr/core/profiles/launch-service"; +import { ensureProxyCertificateAuthority } from "@ccr/core/proxy/certificates"; +import { proxyService } from "@ccr/core/proxy/service"; +import { listMcpServerTools } from "@ccr/core/mcp/tool-discovery"; +import { getAgentAnalysis, getAgentTracePayload, getRequestLogDetail, getRequestLogs } from "@ccr/core/observability/request-log-store"; +import trayController from "./tray-controller"; +import { appUpdateService } from "./update-service"; +import { getUsageStats } from "@ccr/core/usage/store"; +import windowsManager from "./windows"; +import type { AgentAnalysisFilter, AgentAnalysisTracePayloadRequest, ApiKeyConfig, AppCaptureElementPngRequest, AppCaptureElementPngResult, AppConfig, AppDataExportResult, AppImageExportTargetRequest, AppImageExportTargetResult, AppInfo, AppRenderHtmlPngRequest, AppRenderHtmlPngResult, AppSaveConfigOptions, BotGatewayQrLoginCancelRequest, BotGatewayQrLoginStartRequest, BotGatewayQrLoginWaitRequest, BotGatewayQrWindowCloseRequest, BotGatewayQrWindowOpenRequest, GatewayPluginAppConfig, GatewayProviderConnectivityCheckRequest, GatewayProviderProbeCandidatesRequest, GatewayProviderProbeRequest, GatewayStatus, LocalAgentProviderImportRequest, PluginDependency, PluginDirectorySelection, PluginMarketplaceEntry, ProfileApplyResult, ProfileOpenRequest, ProviderAccountResetRequest, ProviderAccountSnapshotRequestOptions, ProviderAccountTestRequest, ProviderCatalogModelsRequest, ProviderIconDetectionRequest, ProviderManifestFetchRequest, RequestLogListFilter, UsageStatsFilter, UsageStatsRange } from "@ccr/core/contracts/app"; + +const pluginMarketplace: PluginMarketplaceEntry[] = [ + { + capabilities: ["Wrapper runtime", "Claude App proxy", "Claude Design", "Model routing"], + dependencies: [], + description: "Routes Claude App Design traffic through the local CCR wrapper backend with configurable model routing.", + id: "claude-design", + modulePath: path.join(__dirname, "..", "marketplace", "plugins", "claude-design-plugin.cjs"), + name: "Claude Design" + }, + { + capabilities: ["Wrapper runtime", "Proxy mode", "Cursor", "Model routing", "OpenAI/Anthropic/Gemini forwarding"], + dependencies: [], + description: "Routes Cursor-compatible LLM traffic captured by proxy mode into the local CCR gateway.", + id: "cursor-proxy", + modulePath: path.join(__dirname, "..", "marketplace", "plugins", "cursor-proxy-plugin.cjs"), + name: "Cursor Proxy" + } +]; +const onboardingFinishedAtSettingKey = "onboardingFinishedAt"; +const imageExportTargets = new Map(); + +ipcMain.handle(IPC_CHANNELS.appGetInfo, () => { + return { + appConfigDbFile: APP_CONFIG_DB_FILE, + apiKeysDbFile: API_KEYS_DB_FILE, + configDir: CONFIGDIR, + configFile: CONFIG_FILE, + dataDir: DATADIR, + gatewayConfigFile: GATEWAY_CONFIG_FILE, + launchAtLoginSupported: isLaunchAtLoginSupported(), + name: APP_NAME, + platform: process.platform, + requestLogsDbFile: REQUEST_LOGS_DB_FILE, + usageDbFile: USAGE_DB_FILE, + version: app.getVersion() + } satisfies AppInfo; +}); + +ipcMain.handle(IPC_CHANNELS.appExportData, async (event): Promise => { + return exportAppData(BrowserWindow.fromWebContents(event.sender)); +}); +ipcMain.handle(IPC_CHANNELS.appCaptureElementPng, async (event, request: AppCaptureElementPngRequest): Promise => { + return captureElementPng(BrowserWindow.fromWebContents(event.sender), request); +}); +ipcMain.handle(IPC_CHANNELS.appPrepareImageExportTarget, async (event, request: AppImageExportTargetRequest): Promise => { + return prepareImageExportTarget(BrowserWindow.fromWebContents(event.sender), request); +}); +ipcMain.handle(IPC_CHANNELS.appRenderHtmlPng, async (event, request: AppRenderHtmlPngRequest): Promise => { + return renderHtmlPng(BrowserWindow.fromWebContents(event.sender), request); +}); + +ipcMain.handle(IPC_CHANNELS.appGetConfig, () => loadAppConfig()); +ipcMain.handle(IPC_CHANNELS.appGetOnboardingFinished, async () => { + const persisted = await loadPersistedAppSetting(onboardingFinishedAtSettingKey); + return Boolean(readString(persisted) || existsSync(ONBOARDING_FINISHED_FILE)); +}); +ipcMain.handle(IPC_CHANNELS.appGetPendingProviderDeepLinks, () => deepLinkService.consumePendingProviderRequests()); +ipcMain.handle(IPC_CHANNELS.appGetLocalAgentProviderCandidates, () => getLocalAgentProviderCandidates()); +ipcMain.handle(IPC_CHANNELS.appGetProfileOpenCommand, async (_event, request: ProfileOpenRequest) => { + return getProfileOpenCommand(await loadAppConfig(), request, { + commandName: desktopCliCommandName, + ensureLauncher: true + }); +}); +ipcMain.handle(IPC_CHANNELS.appGetProfileRuntimeStatus, () => { + return getProfileRuntimeStatus(); +}); +ipcMain.handle(IPC_CHANNELS.appGetProviderAccountSnapshots, (_event, provider?: string, options?: ProviderAccountSnapshotRequestOptions) => getProviderAccountSnapshots(provider, options)); +ipcMain.handle(IPC_CHANNELS.appGetProviderCatalogModels, (_event, request: ProviderCatalogModelsRequest) => getProviderCatalogModels(request)); +ipcMain.handle(IPC_CHANNELS.appGetProviderPresets, () => getProviderPresets()); +ipcMain.handle(IPC_CHANNELS.appGetAgentAnalysis, (_event, filter?: AgentAnalysisFilter) => getAgentAnalysis(filter)); +ipcMain.handle(IPC_CHANNELS.appGetAgentTracePayload, (_event, request: AgentAnalysisTracePayloadRequest) => getAgentTracePayload(request)); +ipcMain.handle(IPC_CHANNELS.appGetGatewayStatus, () => gatewayService.getStatus()); +ipcMain.handle(IPC_CHANNELS.appGetProxyCertificateStatus, () => proxyService.getCertificateStatus()); +ipcMain.handle(IPC_CHANNELS.appGetProxyNetworkCaptures, () => proxyService.getNetworkCaptures()); +ipcMain.handle(IPC_CHANNELS.appGetProxyStatus, () => proxyService.getStatus()); +ipcMain.handle(IPC_CHANNELS.appGetPluginMarketplace, () => pluginMarketplace); +ipcMain.handle(IPC_CHANNELS.appGetRequestLogDetail, (_event, request) => getRequestLogDetail(request)); +ipcMain.handle(IPC_CHANNELS.appGetRequestLogs, (_event, filter?: RequestLogListFilter) => getRequestLogs(filter)); +ipcMain.handle(IPC_CHANNELS.appGetUpdateStatus, () => appUpdateService.getStatus()); +ipcMain.handle(IPC_CHANNELS.appGetUsageStats, (_event, range?: UsageStatsRange, filter?: UsageStatsFilter) => getUsageStats(range, filter)); +ipcMain.handle(IPC_CHANNELS.appFetchProviderManifest, (_event, request: ProviderManifestFetchRequest) => fetchProviderManifest(request)); +ipcMain.handle(IPC_CHANNELS.appImportLocalAgentProvider, (_event, request: LocalAgentProviderImportRequest) => importLocalAgentProvider(request)); +ipcMain.handle(IPC_CHANNELS.appProbeLocalAgentProvider, (_event, request) => probeLocalAgentProvider(request)); +ipcMain.handle(IPC_CHANNELS.appInstallProxyCertificate, () => proxyService.installCertificate()); +ipcMain.handle(IPC_CHANNELS.appListMcpServerTools, async (_event, serverName: string) => { + const name = typeof serverName === "string" ? serverName.trim() : ""; + if (!name) { + throw new Error("MCP server name is required."); + } + const config = await loadAppConfig(); + const server = config.agent.mcpServers.find((candidate) => candidate.name === name); + if (!server) { + throw new Error("MCP server must be saved before tool discovery."); + } + return listMcpServerTools(server); +}); +ipcMain.handle(IPC_CHANNELS.appOpenBuiltInBrowser, async () => { + const config = await loadAppConfig(); + await builtInBrowserService.open(config); +}); +ipcMain.handle(IPC_CHANNELS.appCloseTray, () => { + trayController.hidePopover(); +}); +ipcMain.handle(IPC_CHANNELS.appDetectProviderIcon, (_event, request: ProviderIconDetectionRequest) => { + return detectProviderIcon(request); +}); +ipcMain.handle(IPC_CHANNELS.appClearProxyNetworkCaptures, () => proxyService.clearNetworkCaptures()); +ipcMain.handle(IPC_CHANNELS.appSetProxyNetworkCaptureEnabled, (_event, enabled: boolean) => { + return proxyService.setNetworkCaptureEnabled(Boolean(enabled)); +}); +ipcMain.handle(IPC_CHANNELS.appSelectPluginDirectory, async (event) => { + const window = BrowserWindow.fromWebContents(event.sender); + const options: OpenDialogOptions = { + buttonLabel: "Select plugin", + properties: ["openDirectory"], + title: "Select plugin directory" + }; + const result = window ? await dialog.showOpenDialog(window, options) : await dialog.showOpenDialog(options); + if (result.canceled || result.filePaths.length === 0) { + return undefined; + } + return inspectPluginDirectory(result.filePaths[0]); +}); +ipcMain.handle(IPC_CHANNELS.appOpenExternal, async (_event, url: string) => { + const parsed = new URL(url); + if (!["http:", "https:"].includes(parsed.protocol)) { + throw new Error("Only http and https URLs can be opened."); + } + await shell.openExternal(parsed.toString()); +}); +ipcMain.handle(IPC_CHANNELS.appOpenProfile, async (_event, request: ProfileOpenRequest) => { + const syncedClaudeAppConfig = await syncClaudeAppGatewayConfig(await loadAppConfig()); + const config = syncedClaudeAppConfig.config; + const status = await gatewayService.start(config); + if (status.state !== "running") { + throw new Error(status.lastError || "CCR gateway did not start."); + } + logProfileApplyResult(await applyProfileConfig(config)); + return openProfileFromCcr(config, request); +}); +ipcMain.handle(IPC_CHANNELS.appApplyClaudeAppGateway, async (_event, config?: AppConfig) => { + const previousConfig = await loadAppConfig(); + const baseConfig = config ? await saveAppConfig(config) : previousConfig; + const synced = await syncClaudeAppGatewayConfig(baseConfig); + const savedConfig = synced.config; + let runtimeStatus = gatewayService.getStatus(); + + if (synced.configChanged || shouldRestartGatewayForRuntimeConfigChange(previousConfig, savedConfig) || runtimeStatus.state !== "running") { + runtimeStatus = await gatewayService.start(savedConfig); + } else { + gatewayService.updateConfig(savedConfig); + } + + await builtInBrowserService.syncProxy(savedConfig); + await trayController.refreshIconFromConfig(savedConfig); + if (config || synced.configChanged) { + invalidateProviderAccountSnapshotCache(); + } + + const gatewayDetail = runtimeStatus.state === "running" + ? "CCR gateway is running." + : `CCR gateway did not start: ${runtimeStatus.lastError || "unknown error"}`; + const apiKeyDetail = synced.result.apiKeyGenerated ? "Generated a Claude App API key." : "Reused an existing CCR API key."; + return { + ...synced.result, + message: `${synced.result.message}\n${gatewayDetail}\n${apiKeyDetail}` + }; +}); +ipcMain.handle(IPC_CHANNELS.appBotGatewayQrLoginStart, (_event, request: BotGatewayQrLoginStartRequest) => { + return startBotGatewayQrLogin(request); +}); +ipcMain.handle(IPC_CHANNELS.appBotGatewayQrLoginWait, (_event, request: BotGatewayQrLoginWaitRequest) => { + return waitBotGatewayQrLogin(request); +}); +ipcMain.handle(IPC_CHANNELS.appBotGatewayQrLoginCancel, (_event, request: BotGatewayQrLoginCancelRequest) => { + return cancelBotGatewayQrLogin(request); +}); +ipcMain.handle(IPC_CHANNELS.appBotGatewayQrWindowOpen, (_event, request: BotGatewayQrWindowOpenRequest) => { + return openBotGatewayQrWindow(request); +}); +ipcMain.handle(IPC_CHANNELS.appBotGatewayQrWindowClose, (_event, request: BotGatewayQrWindowCloseRequest) => { + return closeBotGatewayQrWindow(request); +}); +ipcMain.handle(IPC_CHANNELS.appBotHandoffWifiTargetsScan, () => { + return scanBotHandoffWifiTargets(); +}); +ipcMain.handle(IPC_CHANNELS.appBotHandoffBluetoothTargetsScan, () => { + return scanBotHandoffBluetoothTargets(); +}); +ipcMain.handle(IPC_CHANNELS.appApplyProfile, async () => { + const config = await loadAppConfig(); + return applyProfileConfig(config); +}); +ipcMain.handle(IPC_CHANNELS.appCheckProviderConnectivity, (_event, request: GatewayProviderConnectivityCheckRequest) => { + return checkGatewayProviderConnectivity(request); +}); +ipcMain.handle(IPC_CHANNELS.appProbeProvider, (_event, request: GatewayProviderProbeRequest) => { + return probeGatewayProvider(request); +}); +ipcMain.handle(IPC_CHANNELS.appProbeProviderCandidates, (_event, request: GatewayProviderProbeCandidatesRequest) => { + return probeGatewayProviderCandidates(request); +}); +ipcMain.handle(IPC_CHANNELS.appResetCodexRateLimitCredit, (_event, request: ProviderAccountResetRequest) => { + return resetCodexRateLimitCredit(request); +}); +ipcMain.handle(IPC_CHANNELS.appTestProviderAccountConnector, (_event, request: ProviderAccountTestRequest) => { + return testProviderAccountConnector(request); +}); +ipcMain.handle(IPC_CHANNELS.appUpdateCheck, () => appUpdateService.checkForUpdates()); +ipcMain.handle(IPC_CHANNELS.appUpdateDownload, () => appUpdateService.downloadUpdate()); +ipcMain.handle(IPC_CHANNELS.appUpdateInstall, () => appUpdateService.installUpdate()); +ipcMain.handle(IPC_CHANNELS.appQuit, () => { + app.quit(); +}); +ipcMain.handle(IPC_CHANNELS.appRevealProxyCertificate, () => { + ensureProxyCertificateAuthority(); + shell.showItemInFolder(PROXY_CA_CERT_FILE); +}); +ipcMain.handle(IPC_CHANNELS.appSaveConfig, async (_event, config: AppConfig, options?: AppSaveConfigOptions) => { + const previousConfig = await loadAppConfig(); + if (config.proxy.enabled) { + const certificateStatus = await proxyService.getCertificateStatus(); + if (!certificateStatus.trusted) { + throw new Error(certificateStatus.message); + } + } + const launchAtLoginChanged = Boolean(config.launchAtLogin) !== Boolean(previousConfig.launchAtLogin); + let savedConfig = await saveAppConfig(config); + if (launchAtLoginChanged) { + try { + syncLaunchAtLogin(savedConfig); + } catch (error) { + await saveAppConfig({ + ...savedConfig, + launchAtLogin: previousConfig.launchAtLogin + }); + throw error; + } + } + const syncedClaudeAppConfig = await syncClaudeAppGatewayConfig(savedConfig); + savedConfig = syncedClaudeAppConfig.config; + let runtimeStatus = gatewayService.getStatus(); + if (syncedClaudeAppConfig.configChanged || shouldRestartGatewayForRuntimeConfigChange(previousConfig, savedConfig)) { + runtimeStatus = await gatewayService.start(savedConfig); + } else { + gatewayService.updateConfig(savedConfig); + } + if (options?.applyProfile !== false) { + await applyProfileIfServiceRunning(savedConfig, runtimeStatus); + } + await builtInBrowserService.syncProxy(savedConfig); + await trayController.refreshIconFromConfig(savedConfig); + invalidateProviderAccountSnapshotCache(); + return savedConfig; +}); +ipcMain.handle(IPC_CHANNELS.appSaveApiKeys, async (_event, apiKeys: ApiKeyConfig[]) => { + const savedConfig = await saveApiKeysConfig(apiKeys); + const syncedClaudeAppConfig = await syncClaudeAppGatewayConfig(savedConfig); + const nextConfig = syncedClaudeAppConfig.config; + gatewayService.updateConfig(nextConfig); + logProfileApplyResult(await applyProfileConfig(nextConfig)); + invalidateProviderAccountSnapshotCache(); + return nextConfig; +}); +ipcMain.handle(IPC_CHANNELS.appSetOnboardingFinished, async () => { + await replacePersistedAppSetting(onboardingFinishedAtSettingKey, new Date().toISOString()); + windowsManager.resizeMainWindowToScreenSize(); + return true; +}); +ipcMain.handle(IPC_CHANNELS.appRestartGateway, async () => { + const syncedClaudeAppConfig = await syncClaudeAppGatewayConfig(await loadAppConfig()); + const config = syncedClaudeAppConfig.config; + const status = await gatewayService.start(config); + await applyProfileIfServiceRunning(config, status); + await builtInBrowserService.syncProxy(config); + return status; +}); +ipcMain.handle(IPC_CHANNELS.appStartGateway, async () => { + const syncedClaudeAppConfig = await syncClaudeAppGatewayConfig(await loadAppConfig()); + const config = syncedClaudeAppConfig.config; + const status = await gatewayService.start(config); + await applyProfileIfServiceRunning(config, status); + await builtInBrowserService.syncProxy(config); + return status; +}); +ipcMain.handle(IPC_CHANNELS.appStopGateway, async () => { + const status = await gatewayService.stop(); + await builtInBrowserService.clearProxy(); + return status; +}); +ipcMain.handle(IPC_CHANNELS.appStopProfile, async (_event, request: ProfileOpenRequest) => { + return stopProfileFromCcr(await loadAppConfig(), request); +}); +ipcMain.handle(IPC_CHANNELS.appSetTrayDetailOpen, (_event, open: boolean, provider?: string) => { + trayController.setDetailOpen(Boolean(open), provider); +}); +ipcMain.handle(IPC_CHANNELS.appShowMainWindow, () => { + trayController.hidePopover(); + windowsManager.showMainWindow(); +}); +ipcMain.handle(IPC_CHANNELS.appRestartProxy, async () => { + const syncedClaudeAppConfig = await syncClaudeAppGatewayConfig(await loadAppConfig()); + const config = syncedClaudeAppConfig.config; + const status = await gatewayService.start(config); + await applyProfileIfServiceRunning(config, status); + await builtInBrowserService.syncProxy(config); + return proxyService.getStatus(); +}); + +async function applyProfileIfServiceRunning(config: AppConfig, status: GatewayStatus): Promise { + if (status.state !== "running") { + return; + } + logProfileApplyResult(await applyProfileConfig(config)); +} + +function logProfileApplyResult(result: ProfileApplyResult): void { + for (const client of result.clients) { + if (client.ok) { + continue; + } + console.warn(`[profile:${client.client}] ${client.message}`); + } +} + +async function exportAppData(window: BrowserWindow | null): Promise { + const exportedAt = new Date().toISOString(); + const result = window + ? await dialog.showSaveDialog(window, dataExportSaveDialogOptions(exportedAt)) + : await dialog.showSaveDialog(dataExportSaveDialogOptions(exportedAt)); + if (result.canceled || !result.filePath) { + return { canceled: true }; + } + + assertExportTargetIsNotInternalDataFile(result.filePath); + const config = await loadAppConfig(); + const onboardingFinished = Boolean( + readString(await loadPersistedAppSetting(onboardingFinishedAtSettingKey)) || + existsSync(ONBOARDING_FINISHED_FILE) + ); + const payload = { + app: { + name: APP_NAME, + platform: process.platform, + version: app.getVersion() + }, + appState: { + onboardingFinished + }, + config, + exportedAt, + files: readDataExportFiles(), + kind: "claude-code-router-data-export", + version: 1 + }; + + writeFileSync(result.filePath, `${JSON.stringify(payload, null, 2)}\n`, { encoding: "utf8", mode: 0o600 }); + return { + canceled: false, + exportedAt, + file: result.filePath + }; +} + +async function captureElementPng(window: BrowserWindow | null, request: AppCaptureElementPngRequest): Promise { + if (!window) { + throw new Error("Window is unavailable."); + } + + const rect = sanitizeCaptureRect(request.rect); + const result = await imageExportFile(window, request.fileName, request.exportId); + if (result.canceled || !result.filePath) { + return { canceled: true }; + } + + const image = await window.webContents.capturePage(rect); + const png = image.toPNG(); + writeFileSync(result.filePath, pngWithExportProcessing(png, request, rect.width), { mode: 0o600 }); + return { canceled: false, file: result.filePath }; +} + +async function renderHtmlPng(window: BrowserWindow | null, request: AppRenderHtmlPngRequest): Promise { + const html = typeof request.html === "string" ? request.html : ""; + if (!html.trim()) { + throw new Error("Export HTML is empty."); + } + + const size = sanitizeRenderSize(request.size); + const result = await imageExportFile(window, request.fileName, request.exportId); + if (result.canceled || !result.filePath) { + return { canceled: true }; + } + + const renderWindow = new BrowserWindow({ + backgroundColor: "#00000000", + frame: false, + height: size.height, + paintWhenInitiallyHidden: true, + resizable: false, + show: false, + skipTaskbar: true, + transparent: true, + useContentSize: true, + webPreferences: { + backgroundThrottling: false, + contextIsolation: true, + nodeIntegration: false, + offscreen: true, + sandbox: true + }, + width: size.width + }); + + const tempDir = mkdtempSync(path.join(app.getPath("temp"), "ccr-export-")); + const tempHtmlFile = path.join(tempDir, "export.html"); + writeFileSync(tempHtmlFile, html, { encoding: "utf8", mode: 0o600 }); + + try { + await renderWindow.loadFile(tempHtmlFile); + await waitForExportWindowPaint(renderWindow); + const image = await renderWindow.webContents.capturePage({ + height: size.height, + width: size.width, + x: 0, + y: 0 + }); + const png = image.toPNG(); + writeFileSync(result.filePath, pngWithExportProcessing(png, request, size.width), { mode: 0o600 }); + return { canceled: false, file: result.filePath }; + } finally { + if (!renderWindow.isDestroyed()) { + renderWindow.destroy(); + } + rmSync(tempDir, { force: true, recursive: true }); + } +} + +async function prepareImageExportTarget(window: BrowserWindow | null, request: AppImageExportTargetRequest): Promise { + const result = window + ? await dialog.showSaveDialog(window, shareCardSaveDialogOptions(request.fileName)) + : await dialog.showSaveDialog(shareCardSaveDialogOptions(request.fileName)); + if (result.canceled || !result.filePath) { + return { canceled: true }; + } + + const exportId = randomUUID(); + imageExportTargets.set(exportId, result.filePath); + return { + canceled: false, + exportId, + file: result.filePath + }; +} + +async function imageExportFile(window: BrowserWindow | null, fileName: string, exportId?: string): Promise<{ canceled: boolean; filePath?: string }> { + const targetFile = exportId ? consumeImageExportTarget(exportId) : undefined; + return targetFile + ? { canceled: false, filePath: targetFile } + : window + ? await dialog.showSaveDialog(window, shareCardSaveDialogOptions(fileName)) + : await dialog.showSaveDialog(shareCardSaveDialogOptions(fileName)); +} + +function dataExportSaveDialogOptions(exportedAt: string): SaveDialogOptions { + return { + buttonLabel: "Export", + defaultPath: path.join(app.getPath("downloads"), `claude-code-router-data-${fileSafeTimestamp(exportedAt)}.json`), + filters: [ + { extensions: ["json"], name: "CCR data export" } + ], + title: "Export CCR data" + }; +} + +function shareCardSaveDialogOptions(fileName: string): SaveDialogOptions { + return { + buttonLabel: "Save image", + defaultPath: path.join(app.getPath("downloads"), safePngFileName(fileName)), + filters: [ + { extensions: ["png"], name: "PNG image" } + ], + title: "Save image" + }; +} + +function sanitizeCaptureRect(rect: AppCaptureElementPngRequest["rect"]): Rectangle { + const x = finiteNumber(rect?.x, "capture x"); + const y = finiteNumber(rect?.y, "capture y"); + const width = finiteNumber(rect?.width, "capture width"); + const height = finiteNumber(rect?.height, "capture height"); + if (width <= 0 || height <= 0) { + throw new Error("Capture area must not be empty."); + } + return { + height: Math.ceil(height), + width: Math.ceil(width), + x: Math.max(0, Math.floor(x)), + y: Math.max(0, Math.floor(y)) + }; +} + +function sanitizeRenderSize(size: AppRenderHtmlPngRequest["size"]): { height: number; width: number } { + const width = finiteNumber(size?.width, "render width"); + const height = finiteNumber(size?.height, "render height"); + if (width <= 0 || height <= 0 || width > 4096 || height > 4096) { + throw new Error("Render size is out of range."); + } + return { + height: Math.ceil(height), + width: Math.ceil(width) + }; +} + +async function waitForExportWindowPaint(window: BrowserWindow): Promise { + await window.webContents.executeJavaScript(` + new Promise((resolve) => { + const fontsReady = document.fonts && document.fonts.ready ? document.fonts.ready.catch(() => undefined) : Promise.resolve(); + fontsReady.then(() => { + requestAnimationFrame(() => requestAnimationFrame(() => resolve(true))); + }); + }); + `); +} + +function finiteNumber(value: unknown, label: string): number { + if (typeof value !== "number" || !Number.isFinite(value)) { + throw new Error(`Invalid ${label}.`); + } + return value; +} + +function safePngFileName(value: string): string { + const raw = typeof value === "string" ? value : ""; + const safe = path.basename(raw).replace(/[<>:"/\\|?*\x00-\x1f]/g, "-").trim() || "ccr-share-card.png"; + return safe.toLowerCase().endsWith(".png") ? safe : `${safe}.png`; +} + +function consumeImageExportTarget(exportId: string): string { + const target = imageExportTargets.get(exportId); + imageExportTargets.delete(exportId); + if (!target) { + throw new Error("Image export target is unavailable."); + } + return target; +} + +const pngSignature = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); + +type PngExportProcessingRequest = { + borderRadius?: number; + output?: { + height: number; + width: number; + }; +}; + +type DecodedPngPixels = { + bitDepth: number; + colorType: 2 | 6; + height: number; + pixels: Uint8Array; + width: number; +}; + +function pngWithExportProcessing(png: Buffer, request: PngExportProcessingRequest, cssWidth: number): Buffer { + const radius = typeof request.borderRadius === "number" && Number.isFinite(request.borderRadius) ? Math.max(0, request.borderRadius) : 0; + const outputWidth = sanitizePngOutputDimension(request.output?.width); + const outputHeight = sanitizePngOutputDimension(request.output?.height); + if (radius <= 0 && (!outputWidth || !outputHeight)) { + return png; + } + + try { + const decoded = decodePngPixels(png); + let width = decoded.width; + let height = decoded.height; + let rgba = pngPixelsToRgba(decoded); + if (outputWidth && outputHeight && (outputWidth !== width || outputHeight !== height)) { + rgba = resizeRgbaBilinear(rgba, width, height, outputWidth, outputHeight); + width = outputWidth; + height = outputHeight; + } + if (radius > 0 && cssWidth > 0) { + const pixelRadius = Math.min(width / 2, height / 2, radius * width / cssWidth); + applyRoundedAlphaMask(rgba, width, height, pixelRadius); + } + return encodeRgbaPng(width, height, rgba); + } catch (error) { + console.warn(`[export] Failed to process exported PNG: ${formatError(error)}`); + const resized = resizePngWithNativeImage(png, outputWidth, outputHeight); + if (resized) { + return resized; + } + return png; + } +} + +function resizePngWithNativeImage(png: Buffer, width?: number, height?: number): Buffer | undefined { + if (!width || !height) { + return undefined; + } + try { + const image = nativeImage.createFromBuffer(png); + if (image.isEmpty()) { + return undefined; + } + return image.resize({ height, width }).toPNG(); + } catch (error) { + console.warn(`[export] Failed to resize exported PNG fallback: ${formatError(error)}`); + return undefined; + } +} + +function sanitizePngOutputDimension(value: unknown): number | undefined { + if (typeof value !== "number" || !Number.isFinite(value)) { + return undefined; + } + const rounded = Math.round(value); + return rounded > 0 && rounded <= 4096 ? rounded : undefined; +} + +function decodePngPixels(png: Buffer): DecodedPngPixels { + if (png.length < 33 || !png.subarray(0, pngSignature.length).equals(pngSignature)) { + throw new Error("Invalid PNG file."); + } + + let offset = pngSignature.length; + let width = 0; + let height = 0; + let bitDepth = 0; + let colorType = 0; + let interlaceMethod = 0; + const idatChunks: Buffer[] = []; + + while (offset + 12 <= png.length) { + const length = png.readUInt32BE(offset); + offset += 4; + const type = png.toString("ascii", offset, offset + 4); + offset += 4; + const data = png.subarray(offset, offset + length); + offset += length + 4; + + if (type === "IHDR") { + width = data.readUInt32BE(0); + height = data.readUInt32BE(4); + bitDepth = data[8]; + colorType = data[9]; + interlaceMethod = data[12]; + } else if (type === "IDAT") { + idatChunks.push(Buffer.from(data)); + } else if (type === "IEND") { + break; + } + } + + if (width <= 0 || height <= 0 || bitDepth !== 8 || (colorType !== 2 && colorType !== 6) || interlaceMethod !== 0) { + throw new Error("Unsupported PNG format."); + } + + const channels = colorType === 6 ? 4 : 3; + const stride = width * channels; + const inflated = inflateSync(Buffer.concat(idatChunks)); + const pixels = new Uint8Array(width * height * channels); + let sourceOffset = 0; + let previousRow = new Uint8Array(stride); + + for (let y = 0; y < height; y += 1) { + const filter = inflated[sourceOffset]; + sourceOffset += 1; + const row = new Uint8Array(stride); + for (let x = 0; x < stride; x += 1) { + const raw = inflated[sourceOffset + x]; + const left = x >= channels ? row[x - channels] : 0; + const up = previousRow[x] ?? 0; + const upLeft = x >= channels ? previousRow[x - channels] ?? 0 : 0; + row[x] = unfilterPngByte(filter, raw, left, up, upLeft); + } + pixels.set(row, y * stride); + previousRow = row; + sourceOffset += stride; + } + + return { + bitDepth, + colorType: colorType as 2 | 6, + height, + pixels, + width + }; +} + +function unfilterPngByte(filter: number, raw: number, left: number, up: number, upLeft: number): number { + if (filter === 0) return raw; + if (filter === 1) return (raw + left) & 0xff; + if (filter === 2) return (raw + up) & 0xff; + if (filter === 3) return (raw + Math.floor((left + up) / 2)) & 0xff; + if (filter === 4) return (raw + pngPaethPredictor(left, up, upLeft)) & 0xff; + throw new Error(`Unsupported PNG filter: ${filter}`); +} + +function pngPaethPredictor(left: number, up: number, upLeft: number): number { + const estimate = left + up - upLeft; + const leftDistance = Math.abs(estimate - left); + const upDistance = Math.abs(estimate - up); + const upLeftDistance = Math.abs(estimate - upLeft); + if (leftDistance <= upDistance && leftDistance <= upLeftDistance) return left; + if (upDistance <= upLeftDistance) return up; + return upLeft; +} + +function pngPixelsToRgba(decoded: DecodedPngPixels): Uint8Array { + const rgba = new Uint8Array(decoded.width * decoded.height * 4); + const sourceChannels = decoded.colorType === 6 ? 4 : 3; + for (let source = 0, target = 0; source < decoded.pixels.length; source += sourceChannels, target += 4) { + rgba[target] = decoded.pixels[source]; + rgba[target + 1] = decoded.pixels[source + 1]; + rgba[target + 2] = decoded.pixels[source + 2]; + rgba[target + 3] = sourceChannels === 4 ? decoded.pixels[source + 3] : 255; + } + return rgba; +} + +function resizeRgbaBilinear(source: Uint8Array, sourceWidth: number, sourceHeight: number, targetWidth: number, targetHeight: number): Uint8Array { + const target = new Uint8Array(targetWidth * targetHeight * 4); + const xRatio = targetWidth > 1 ? (sourceWidth - 1) / (targetWidth - 1) : 0; + const yRatio = targetHeight > 1 ? (sourceHeight - 1) / (targetHeight - 1) : 0; + + for (let y = 0; y < targetHeight; y += 1) { + const sourceY = y * yRatio; + const y0 = Math.floor(sourceY); + const y1 = Math.min(sourceHeight - 1, y0 + 1); + const yWeight = sourceY - y0; + for (let x = 0; x < targetWidth; x += 1) { + const sourceX = x * xRatio; + const x0 = Math.floor(sourceX); + const x1 = Math.min(sourceWidth - 1, x0 + 1); + const xWeight = sourceX - x0; + const targetOffset = (y * targetWidth + x) * 4; + const topLeft = (y0 * sourceWidth + x0) * 4; + const topRight = (y0 * sourceWidth + x1) * 4; + const bottomLeft = (y1 * sourceWidth + x0) * 4; + const bottomRight = (y1 * sourceWidth + x1) * 4; + for (let channel = 0; channel < 4; channel += 1) { + const top = source[topLeft + channel] * (1 - xWeight) + source[topRight + channel] * xWeight; + const bottom = source[bottomLeft + channel] * (1 - xWeight) + source[bottomRight + channel] * xWeight; + target[targetOffset + channel] = Math.round(top * (1 - yWeight) + bottom * yWeight); + } + } + } + + return target; +} + +function applyRoundedAlphaMask(rgba: Uint8Array, width: number, height: number, radius: number): void { + if (radius <= 0) { + return; + } + + const halfWidth = width / 2; + const halfHeight = height / 2; + const innerHalfWidth = Math.max(0, halfWidth - radius); + const innerHalfHeight = Math.max(0, halfHeight - radius); + + for (let y = 0; y < height; y += 1) { + for (let x = 0; x < width; x += 1) { + const qx = Math.abs(x + 0.5 - halfWidth) - innerHalfWidth; + const qy = Math.abs(y + 0.5 - halfHeight) - innerHalfHeight; + const outside = Math.hypot(Math.max(qx, 0), Math.max(qy, 0)); + const inside = Math.min(Math.max(qx, qy), 0); + const distance = outside + inside - radius; + const coverage = Math.max(0, Math.min(1, 0.5 - distance)); + if (coverage >= 1) { + continue; + } + const alphaOffset = (y * width + x) * 4 + 3; + rgba[alphaOffset] = Math.round(rgba[alphaOffset] * coverage); + } + } +} + +function encodeRgbaPng(width: number, height: number, rgba: Uint8Array): Buffer { + const stride = width * 4; + const scanlines = Buffer.alloc((stride + 1) * height); + for (let y = 0; y < height; y += 1) { + const target = y * (stride + 1); + scanlines[target] = 0; + scanlines.set(rgba.subarray(y * stride, (y + 1) * stride), target + 1); + } + + const ihdr = Buffer.alloc(13); + ihdr.writeUInt32BE(width, 0); + ihdr.writeUInt32BE(height, 4); + ihdr[8] = 8; + ihdr[9] = 6; + ihdr[10] = 0; + ihdr[11] = 0; + ihdr[12] = 0; + + return Buffer.concat([ + pngSignature, + pngChunk("IHDR", ihdr), + pngChunk("IDAT", deflateSync(scanlines)), + pngChunk("IEND", Buffer.alloc(0)) + ]); +} + +function pngChunk(type: string, data: Buffer): Buffer { + const typeBuffer = Buffer.from(type, "ascii"); + const chunk = Buffer.alloc(12 + data.length); + chunk.writeUInt32BE(data.length, 0); + typeBuffer.copy(chunk, 4); + data.copy(chunk, 8); + chunk.writeUInt32BE(crc32(Buffer.concat([typeBuffer, data])), 8 + data.length); + return chunk; +} + +let crc32Table: Uint32Array | undefined; + +function crc32(buffer: Buffer): number { + const table = crc32Table ?? createCrc32Table(); + crc32Table = table; + let crc = 0xffffffff; + for (const byte of buffer) { + crc = table[(crc ^ byte) & 0xff] ^ (crc >>> 8); + } + return (crc ^ 0xffffffff) >>> 0; +} + +function createCrc32Table(): Uint32Array { + const table = new Uint32Array(256); + for (let index = 0; index < table.length; index += 1) { + let value = index; + for (let bit = 0; bit < 8; bit += 1) { + value = value & 1 ? 0xedb88320 ^ (value >>> 1) : value >>> 1; + } + table[index] = value >>> 0; + } + return table; +} + +function readDataExportFiles(): Array<{ base64: string; name: string; path: string; sizeBytes: number }> { + const files: Array<{ base64: string; name: string; path: string; sizeBytes: number }> = []; + for (const file of dataExportCandidateFiles()) { + try { + if (!existsSync(file)) { + continue; + } + const stat = statSync(file); + if (!stat.isFile()) { + continue; + } + files.push({ + base64: readFileSync(file).toString("base64"), + name: path.basename(file), + path: file, + sizeBytes: stat.size + }); + } catch (error) { + console.warn(`[export] Failed to include ${file}: ${formatError(error)}`); + } + } + return files; +} + +function dataExportCandidateFiles(): string[] { + return uniqueStrings([ + ...sqliteDataFiles(APP_CONFIG_DB_FILE), + ...sqliteDataFiles(API_KEYS_DB_FILE), + ...sqliteDataFiles(REQUEST_LOGS_DB_FILE), + ...sqliteDataFiles(USAGE_DB_FILE) + ]); +} + +function sqliteDataFiles(file: string): string[] { + return [file, `${file}-wal`, `${file}-shm`]; +} + +function assertExportTargetIsNotInternalDataFile(file: string): void { + const target = path.resolve(file); + const reserved = new Set([ + CONFIG_FILE, + LEGACY_CONFIG_FILE, + APP_CONFIG_DB_FILE, + API_KEYS_DB_FILE, + REQUEST_LOGS_DB_FILE, + USAGE_DB_FILE, + ...dataExportCandidateFiles() + ].map((item) => path.resolve(item))); + if (reserved.has(target)) { + throw new Error("Choose a different export path. Internal CCR data files cannot be overwritten."); + } +} + +function fileSafeTimestamp(value: string): string { + return value.replace(/[:.]/g, "-"); +} + +function uniqueStrings(values: string[]): string[] { + const seen = new Set(); + const result: string[] = []; + for (const value of values) { + if (!value || seen.has(value)) { + continue; + } + seen.add(value); + result.push(value); + } + return result; +} + +function inspectPluginDirectory(directory: string): PluginDirectorySelection { + const manifest = readFirstJson([ + path.join(directory, "plugin.json"), + path.join(directory, "ccr-plugin.json"), + path.join(directory, ".ccr-plugin", "plugin.json"), + path.join(directory, ".codex-plugin", "plugin.json") + ]); + const packageJson = readFirstJson([path.join(directory, "package.json")]); + const moduleValue = + readString(manifest?.module) || + readString(manifest?.main) || + readString(manifest?.path) || + readString(readRecord(packageJson?.ccr)?.module) || + readString(readRecord(packageJson?.ccrPlugin)?.module) || + readString(packageJson?.main); + const id = + pluginIdValue(readString(manifest?.id) || readString(manifest?.key) || readString(packageJson?.name)) || + pluginIdValue(path.basename(directory)) || + "plugin"; + const name = readString(manifest?.name) || readString(packageJson?.displayName) || readString(packageJson?.name); + const apps = readPluginApps(manifest, packageJson); + return { + ...(apps.length ? { apps } : {}), + dependencies: readPluginDependencies(directory, manifest, packageJson), + directory, + id, + modulePath: resolvePluginDirectoryModule(directory, moduleValue), + ...(name ? { name } : {}) + }; +} + +function readPluginApps( + manifest: Record | undefined, + packageJson: Record | undefined +): GatewayPluginAppConfig[] { + const values = [ + manifest?.apps, + readRecord(manifest?.ccr)?.apps, + readRecord(manifest?.ccrPlugin)?.apps, + readRecord(packageJson?.ccr)?.apps, + readRecord(packageJson?.ccrPlugin)?.apps + ]; + const apps = values.flatMap(parsePluginApps); + const byId = new Map(); + for (const app of apps) { + const key = app.id || `${app.name}:${app.url}`; + if (byId.has(key)) { + continue; + } + byId.set(key, app); + } + return [...byId.values()]; +} + +function parsePluginApps(value: unknown): GatewayPluginAppConfig[] { + if (!Array.isArray(value)) { + return []; + } + return value.map(parsePluginAppItem).filter((item): item is GatewayPluginAppConfig => Boolean(item)); +} + +function parsePluginAppItem(value: unknown): GatewayPluginAppConfig | undefined { + if (!value || typeof value !== "object" || Array.isArray(value)) { + return undefined; + } + + const record = value as Record; + const name = readString(record.name) || readString(record.title); + const url = readString(record.url) || readString(record.href) || readString(record.target); + if (!name || !url) { + return undefined; + } + const id = pluginIdValue(readString(record.id) || name); + const description = readString(record.description); + const icon = readString(record.icon); + return { + ...(description ? { description } : {}), + ...(icon ? { icon } : {}), + ...(id ? { id } : {}), + name, + url + }; +} + +function readPluginDependencies( + directory: string, + manifest: Record | undefined, + packageJson: Record | undefined +): PluginDependency[] { + const values = [ + manifest?.dependencies, + manifest?.pluginDependencies, + readRecord(manifest?.ccr)?.dependencies, + readRecord(manifest?.ccrPlugin)?.dependencies, + readRecord(packageJson?.ccr)?.dependencies, + readRecord(packageJson?.ccrPlugin)?.dependencies + ]; + const dependencies = values.flatMap((value) => parsePluginDependencies(value, directory)); + const byId = new Map(); + for (const dependency of dependencies) { + if (!dependency.id || byId.has(dependency.id)) { + continue; + } + byId.set(dependency.id, dependency); + } + return [...byId.values()]; +} + +function parsePluginDependencies(value: unknown, directory: string): PluginDependency[] { + if (Array.isArray(value)) { + return value.map((item) => parsePluginDependencyItem(item, directory)).filter((item): item is PluginDependency => Boolean(item)); + } + + if (value && typeof value === "object" && !Array.isArray(value)) { + return Object.entries(value as Record) + .map(([id, item]) => parsePluginDependencyEntry(id, item, directory)) + .filter((item): item is PluginDependency => Boolean(item)); + } + + return []; +} + +function parsePluginDependencyEntry(idValue: string, value: unknown, directory: string): PluginDependency | undefined { + if (value && typeof value === "object" && !Array.isArray(value)) { + return parsePluginDependencyItem({ id: idValue, ...(value as Record) }, directory); + } + + const id = pluginIdValue(idValue); + if (!id) { + return undefined; + } + const specifier = readString(value); + const modulePath = specifier && looksLikeDependencyModulePath(specifier) ? resolveDependencyModulePath(directory, specifier) : undefined; + return { + id, + ...(modulePath ? { modulePath } : {}) + }; +} + +function parsePluginDependencyItem(value: unknown, directory: string): PluginDependency | undefined { + if (typeof value === "string") { + const id = pluginIdValue(value); + return id ? { id } : undefined; + } + + if (!value || typeof value !== "object" || Array.isArray(value)) { + return undefined; + } + + const record = value as Record; + const id = pluginIdValue(readString(record.id) || readString(record.key) || readString(record.name)); + if (!id) { + return undefined; + } + const moduleValue = readString(record.module) || readString(record.path) || readString(record.modulePath); + const modulePath = moduleValue ? resolveDependencyModulePath(directory, moduleValue) : undefined; + const name = readString(record.name); + return { + id, + ...(modulePath ? { modulePath } : {}), + ...(name ? { name } : {}) + }; +} + +function resolveDependencyModulePath(directory: string, value: string): string { + if (value === "~" || value.startsWith("~/")) { + return path.join(app.getPath("home"), value.slice(2)); + } + return path.isAbsolute(value) ? value : path.join(directory, value); +} + +function looksLikeDependencyModulePath(value: string): boolean { + return value.startsWith(".") || value.startsWith("/") || value.startsWith("~"); +} + +function resolvePluginDirectoryModule(directory: string, moduleValue: string | undefined): string { + if (moduleValue) { + return path.isAbsolute(moduleValue) ? moduleValue : path.join(directory, moduleValue); + } + + for (const filename of ["index.cjs", "index.mjs", "index.js", "plugin.cjs", "plugin.mjs", "plugin.js"]) { + const candidate = path.join(directory, filename); + if (isFile(candidate)) { + return candidate; + } + } + + return directory; +} + +function readFirstJson(files: string[]): Record | undefined { + for (const file of files) { + if (!isFile(file)) { + continue; + } + try { + const parsed = JSON.parse(readFileSync(file, "utf8")) as unknown; + if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) { + return parsed as Record; + } + } catch { + // Ignore invalid plugin metadata and fall back to directory inference. + } + } + return undefined; +} + +function readRecord(value: unknown): Record | undefined { + return value && typeof value === "object" && !Array.isArray(value) ? value as Record : undefined; +} + +function readString(value: unknown): string | undefined { + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function pluginIdValue(value: string | undefined): string { + return value?.toLowerCase().replace(/^@/, "").replace(/[^a-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || ""; +} + +function isFile(file: string): boolean { + try { + return existsSync(file) && statSync(file).isFile(); + } catch { + return false; + } +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/packages/electron/src/main/launch-at-login.ts b/packages/electron/src/main/launch-at-login.ts new file mode 100644 index 0000000..183cfb4 --- /dev/null +++ b/packages/electron/src/main/launch-at-login.ts @@ -0,0 +1,33 @@ +import { app } from "electron"; +import type { AppConfig } from "@ccr/core/contracts/app"; + +export function isLaunchAtLoginSupported(platform = process.platform): boolean { + return platform === "darwin" || platform === "win32"; +} + +export function syncLaunchAtLogin(config: Pick): void { + if (!isLaunchAtLoginSupported()) { + return; + } + const openAtLogin = Boolean(config.launchAtLogin); + const current = app.getLoginItemSettings(); + if (current.openAtLogin === openAtLogin) { + return; + } + app.setLoginItemSettings(loginItemSettings(openAtLogin)); +} + +function loginItemSettings(openAtLogin: boolean): Electron.Settings { + const settings: Electron.Settings = { + openAtLogin + }; + + if (process.platform === "darwin") { + settings.openAsHidden = false; + return settings; + } + + settings.path = process.execPath; + settings.args = process.defaultApp ? [app.getAppPath()] : []; + return settings; +} diff --git a/packages/electron/src/main/main-app.ts b/packages/electron/src/main/main-app.ts new file mode 100644 index 0000000..4cc37d1 --- /dev/null +++ b/packages/electron/src/main/main-app.ts @@ -0,0 +1,299 @@ +import { app, BrowserWindow, dialog, shell } from "electron"; +import { setupApplicationMenu } from "./app-menu"; +import { loadAppConfig } from "@ccr/core/config/config"; +import { restoreClaudeAppGatewayConfig, syncClaudeAppGatewayConfig } from "@ccr/core/agents/claude-app/gateway-service"; +import { deepLinkService } from "./deep-link"; +import { gatewayService } from "@ccr/core/gateway/service"; +import "./ipc"; +import { applyProfileConfig, restoreGlobalProfileConfigsOnExit } from "@ccr/core/profiles/service"; +import { ensureCcrCliLauncher, persistPreparedCcrCliPath, prepareCcrCliLauncherRuntime, type CcrCliLauncherPreparation } from "@ccr/core/profiles/launch-service"; +import { syncLaunchAtLogin } from "./launch-at-login"; +import { proxyService } from "@ccr/core/proxy/service"; +import trayController from "./tray-controller"; +import { appUpdateService } from "./update-service"; +import { browserAutomationMcpService } from "./browser-automation-mcp"; +import { browserWebSearchMcpService } from "./electron-web-search-mcp"; +import windowsManager from "./windows"; + +const gotTheLock = app.requestSingleInstanceLock(); +const quitProxyRestoreTimeoutMs = 30_000; +let quitPrepared = false; +let stoppingForQuit = false; +let ensureProxyModePromise: Promise | undefined; +let startServicesPromise: Promise | undefined; +let stopForQuitPromise: Promise | undefined; + +if (!gotTheLock) { + app.quit(); +} else { + startPrimaryInstance(); +} + +function startPrimaryInstance(): void { + gatewayService.setBrowserAutomationMcpIntegration(browserAutomationMcpService); + gatewayService.setBrowserWebSearchMcpIntegration(browserWebSearchMcpService); + deepLinkService.register(); + deepLinkService.handleArgv(process.argv); + + app.on("second-instance", (_event, argv) => { + windowsManager.showMainWindow(); + deepLinkService.handleArgv(argv); + queueEnsureConfiguredProxyModeActive("second-instance"); + }); + + void app.whenReady().then(() => { + configureProxyDesktopIntegration(); + let ccrLauncherPreparation: CcrCliLauncherPreparation | undefined; + try { + ccrLauncherPreparation = prepareCcrCliLauncherRuntime(); + } catch (error) { + console.error(`Failed to prepare ccr CLI runtime: ${formatError(error)}`); + } + setupApplicationMenu(); + const mainWindow = windowsManager.createMainWindow(); + if (ccrLauncherPreparation?.persistentPathRequired) { + mainWindow.once("ready-to-show", () => { + setTimeout(() => { + try { + persistPreparedCcrCliPath(ccrLauncherPreparation); + } catch (error) { + console.error(`Failed to persist ccr CLI PATH: ${formatError(error)}`); + } + }, 0); + }); + } + trayController.start(); + appUpdateService.start(); + appUpdateService.setInstallPreparation(prepareForUpdateInstall); + void startConfiguredServices("startup"); + + app.on("activate", () => { + const mainWindow = windowsManager.getWindow("main"); + if (!trayController.consumeMainWindowActivationSuppression() && (!mainWindow || !mainWindow.isVisible())) { + windowsManager.showMainWindow(); + } + queueEnsureConfiguredProxyModeActive("activate"); + }); + }).catch((error) => { + const detail = formatErrorDetail(error); + console.error(`Failed to initialize ${app.name || "application"}: ${detail}`); + try { + dialog.showErrorBox("Claude Code Router failed to start", detail); + } catch { + // Keep the console log as the fallback diagnostic channel. + } + app.exit(1); + }); + + app.on("before-quit", (event) => { + if (quitPrepared || appUpdateService.isInstallingUpdate()) { + return; + } + event.preventDefault(); + prepareAndQuit(); + }); + + app.on("will-quit", (event) => { + if (quitPrepared || appUpdateService.isInstallingUpdate()) { + return; + } + event.preventDefault(); + prepareAndQuit(); + }); + + app.on("window-all-closed", () => { + if (process.platform !== "darwin") { + app.quit(); + } + }); + + process.once("SIGINT", () => handleTerminationSignal("SIGINT")); + process.once("SIGTERM", () => handleTerminationSignal("SIGTERM")); +} + +function configureProxyDesktopIntegration(): void { + proxyService.setDesktopIntegration({ + requestMacosCertificateInstallPermission, + revealFile: async (file) => { + shell.showItemInFolder(file); + } + }); +} + +async function requestMacosCertificateInstallPermission(): Promise { + const window = BrowserWindow.getFocusedWindow() ?? BrowserWindow.getAllWindows()[0]; + const options = { + buttons: ["Continue", "Cancel"], + cancelId: 1, + defaultId: 0, + detail: + "macOS will ask for administrator credentials. This is required so Chrome can trust HTTPS certificates generated by CCR proxy mode.", + message: "Install CCR Proxy CA into the macOS System keychain?", + noLink: true, + type: "warning" as const + }; + const result = window ? await dialog.showMessageBox(window, options) : await dialog.showMessageBox(options); + return result.response === 0; +} + +function prepareAndQuit(): void { + if (stoppingForQuit) { + return; + } + + stoppingForQuit = true; + void stopServicesForQuit().finally(() => { + quitPrepared = true; + app.quit(); + }); +} + +async function prepareForUpdateInstall(): Promise { + if (!stoppingForQuit) { + stoppingForQuit = true; + } + await stopServicesForQuit(); + quitPrepared = true; +} + +function handleTerminationSignal(signal: NodeJS.Signals): void { + if (stoppingForQuit) { + return; + } + + stoppingForQuit = true; + void stopServicesForQuit().finally(() => { + quitPrepared = true; + app.exit(signal === "SIGINT" ? 130 : 143); + }); +} + +function stopServicesForQuit(): Promise { + if (!stopForQuitPromise) { + stopForQuitPromise = gatewayService + .stop({ proxyRestoreTimeoutMs: quitProxyRestoreTimeoutMs }) + .then(() => undefined) + .catch((error) => { + console.error(`Failed to stop services before quit: ${formatError(error)}`); + }) + .finally(async () => { + try { + const config = await loadAppConfig(); + for (const status of restoreGlobalProfileConfigsOnExit(config.profile.profiles)) { + if (!status.ok) { + console.error(`Failed to restore ${status.client} global profile config before quit: ${status.message}`); + } + } + } catch (error) { + console.error(`Failed to restore global profile configs before quit: ${formatError(error)}`); + } + try { + restoreClaudeAppGatewayConfig(); + } catch (error) { + console.error(`Failed to restore Claude App gateway config before quit: ${formatError(error)}`); + } + trayController.destroy(); + }); + } + return stopForQuitPromise; +} + +function startConfiguredServices(reason: string): Promise { + if (!startServicesPromise) { + startServicesPromise = loadAppConfig() + .then(async (config) => { + try { + config = (await syncClaudeAppGatewayConfig(config)).config; + } catch (error) { + console.error(`Failed to sync Claude App gateway config during ${reason}: ${formatError(error)}`); + } + try { + ensureCcrCliLauncher(config, { persistPath: false }); + } catch (error) { + console.error(`Failed to install ccr CLI launcher during ${reason}: ${formatError(error)}`); + } + try { + syncLaunchAtLogin(config); + } catch (error) { + console.error(`Failed to sync launch-at-login setting during ${reason}: ${formatError(error)}`); + } + const status = await gatewayService.start(config); + if (status.state === "error") { + console.error(`Failed to start gateway during ${reason}: ${status.lastError}`); + } + if (status.state === "running") { + const profileResult = await applyProfileConfig(config); + for (const client of profileResult.clients) { + if (!client.ok) { + console.error(`Failed to apply ${client.client} profile during ${reason}: ${client.message}`); + } + } + } + if (config.proxy.enabled && config.proxy.systemProxy) { + const proxyStatus = await proxyService.ensureSystemProxyActive(); + logProxySystemProxyIssue(reason, proxyStatus); + } + }) + .catch((error) => { + console.error(`Failed to start configured services during ${reason}: ${formatError(error)}`); + }) + .finally(() => { + trayController.refreshUsageTitle(); + startServicesPromise = undefined; + }); + } + return startServicesPromise; +} + +function queueEnsureConfiguredProxyModeActive(reason: string): void { + void (startServicesPromise ?? Promise.resolve()) + .then(() => ensureConfiguredProxyModeActive(reason)) + .catch((error) => { + console.error(`Failed to ensure proxy mode during ${reason}: ${formatError(error)}`); + }); +} + +function ensureConfiguredProxyModeActive(reason: string): Promise { + if (stoppingForQuit) { + return Promise.resolve(); + } + + if (!ensureProxyModePromise) { + ensureProxyModePromise = loadAppConfig() + .then(async (config) => { + if (!config.proxy.enabled || !config.proxy.systemProxy) { + return; + } + + const proxyStatus = proxyService.getStatus(); + if (proxyStatus.state !== "running") { + await startConfiguredServices(reason); + return; + } + + const ensuredStatus = await proxyService.ensureSystemProxyActive(); + logProxySystemProxyIssue(reason, ensuredStatus); + }) + .finally(() => { + ensureProxyModePromise = undefined; + }); + } + return ensureProxyModePromise; +} + +function logProxySystemProxyIssue(reason: string, status: ReturnType): void { + if (status.systemProxy.state === "active") { + return; + } + + const details = status.systemProxy.lastError ? `: ${status.systemProxy.lastError}` : ""; + console.error(`Proxy mode is enabled, but system proxy is ${status.systemProxy.state} during ${reason}${details}`); +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + +function formatErrorDetail(error: unknown): string { + return error instanceof Error ? error.stack || error.message : String(error); +} diff --git a/packages/electron/src/main/main.ts b/packages/electron/src/main/main.ts new file mode 100644 index 0000000..8873d24 --- /dev/null +++ b/packages/electron/src/main/main.ts @@ -0,0 +1,87 @@ +import { app, dialog } from "electron"; +import { mkdirSync } from "node:fs"; +import { resolveRuntimeDataDir, setRuntimeAppPaths } from "@ccr/core/runtime/app-paths"; +import { copyMissingDirectoryContents, sameFilesystemPath } from "@ccr/core/storage/migration"; + +const appDataPath = app.getPath("appData"); +const homePath = app.getPath("home"); +setRuntimeAppPaths({ + appData: appDataPath, + home: homePath +}); +const userDataPath = configureRuntimeUserDataPath(app.getPath("userData")); +setRuntimeAppPaths({ + appData: appDataPath, + home: homePath, + userData: userDataPath +}); + +let fatalStartupErrorReported = false; + +process.once("uncaughtException", reportFatalStartupError); +process.once("unhandledRejection", reportFatalStartupError); + +void import("./main-app.js") + .then(() => { + process.off("uncaughtException", reportFatalStartupError); + process.off("unhandledRejection", reportFatalStartupError); + }) + .catch((error) => { + reportFatalStartupError(error); + }); + +function reportFatalStartupError(error: unknown): void { + if (fatalStartupErrorReported) { + return; + } + fatalStartupErrorReported = true; + + const detail = formatErrorDetail(error); + console.error(detail); + + try { + dialog.showErrorBox("Claude Code Router failed to start", startupErrorMessage(detail)); + } catch { + // If the platform dialog is unavailable, the console output above still + // preserves the actionable failure for command-line launches. + } + + app.exit(1); +} + +function configureRuntimeUserDataPath(currentUserDataPath: string): string { + const sharedUserDataPath = resolveRuntimeDataDir(); + mkdirSync(sharedUserDataPath, { recursive: true }); + if (sameFilesystemPath(currentUserDataPath, sharedUserDataPath)) { + return currentUserDataPath; + } + + copyMissingDirectoryContents(currentUserDataPath, sharedUserDataPath, "Electron app data directory"); + app.setPath("userData", sharedUserDataPath); + return app.getPath("userData"); +} + +function startupErrorMessage(detail: string): string { + if (isBetterSqliteNativeError(detail)) { + return [ + "The bundled SQLite native module could not be loaded.", + "", + "This usually means the Windows package was built with a missing or incompatible better-sqlite3 binary. Rebuild the app with npm run rebuild:sqlite3 before packaging, or build the Windows artifact on a Windows x64 runner.", + "", + detail + ].join("\n"); + } + + return detail; +} + +function isBetterSqliteNativeError(detail: string): boolean { + return /better[-_]sqlite3|better_sqlite3\.node|NODE_MODULE_VERSION|ERR_DLOPEN_FAILED|Cannot find module ['"]better-sqlite3/i.test(detail); +} + +function formatErrorDetail(error: unknown): string { + if (error instanceof Error) { + return error.stack || error.message; + } + return String(error); +} diff --git a/packages/electron/src/main/preload.ts b/packages/electron/src/main/preload.ts new file mode 100644 index 0000000..9d2b392 --- /dev/null +++ b/packages/electron/src/main/preload.ts @@ -0,0 +1,189 @@ +import { contextBridge, ipcRenderer, webUtils } from "electron"; +import { browserErrorI18nLanguage, formatLocalizedErrorMessage } from "@ccr/core/contracts/i18n"; +import { IPC_CHANNELS } from "@ccr/core/contracts/ipc-channels"; +import type { + AgentAnalysisFilter, + AgentAnalysisSnapshot, + AgentAnalysisTracePayloadFullResult, + AgentAnalysisTracePayloadRequest, + AppConfig, + AppCaptureElementPngRequest, + AppCaptureElementPngResult, + AppDataExportResult, + AppInfo, + AppImageExportTargetRequest, + AppImageExportTargetResult, + AppRenderHtmlPngRequest, + AppRenderHtmlPngResult, + AppSaveConfigOptions, + AppUpdateStatus, + ApiKeyConfig, + BotGatewayQrLoginCancelRequest, + BotGatewayQrLoginCancelResult, + BotGatewayQrLoginStartRequest, + BotGatewayQrLoginStartResult, + BotGatewayQrLoginWaitRequest, + BotGatewayQrLoginWaitResult, + BotGatewayQrWindowCloseRequest, + BotGatewayQrWindowCloseResult, + BotGatewayQrWindowOpenRequest, + BotGatewayQrWindowOpenResult, + BotHandoffScanTarget, + ClaudeAppGatewayApplyResult, + GatewayMcpToolInfo, + GatewayProviderConnectivityCheckReport, + GatewayProviderConnectivityCheckRequest, + GatewayProviderProbeCandidateResult, + GatewayProviderProbeCandidatesRequest, + GatewayProviderProbeRequest, + GatewayProviderProbeResult, + GatewayStatus, + LocalAgentProviderCandidate, + LocalAgentProviderImportRequest, + LocalAgentProviderImportResult, + LocalAgentProviderProbeRequest, + LocalAgentProviderProbeResult, + PluginDirectorySelection, + PluginMarketplaceEntry, + ProfileOpenCommandResult, + ProfileOpenRequest, + ProfileOpenResult, + ProfileRuntimeStatus, + ProfileStopResult, + ProviderAccountResetRequest, + ProviderAccountResetResult, + ProviderAccountSnapshotRequestOptions, + ProviderAccountTestRequest, + ProviderAccountTestResult, + ProviderIconDetectionRequest, + ProviderIconDetectionResult, + ProviderAccountSnapshot, + ProviderCatalogModelsRequest, + ProviderCatalogModelsResult, + ProviderDeepLinkRequest, + ProviderManifestFetchRequest, + ProviderManifestFetchResult, + ProfileApplyResult, + ProxyCertificateInstallResult, + ProxyCertificateStatus, + ProxyNetworkSnapshot, + ProxyStatus, + RequestLogDetailRequest, + RequestLogEntry, + RequestLogListFilter, + RequestLogPage, + UsageStatsFilter, + UsageStatsRange, + UsageStatsSnapshot +} from "@ccr/core/contracts/app"; +import type { ProviderPreset } from "@ccr/core/providers/presets/types"; + +function invoke(channel: string, ...args: unknown[]): Promise { + return ipcRenderer.invoke(channel, ...args).catch((error) => { + throw localizedIpcError(error); + }); +} + +function localizedIpcError(error: unknown): Error { + const localized = new Error(formatLocalizedErrorMessage(browserErrorI18nLanguage(), error)); + if (error instanceof Error && error.stack) { + localized.stack = error.stack.replace(error.message, localized.message); + } + return localized; +} + +contextBridge.exposeInMainWorld("ccr", { + applyClaudeAppGateway: (config?: AppConfig) => invoke(IPC_CHANNELS.appApplyClaudeAppGateway, config) as Promise, + applyProfile: () => invoke(IPC_CHANNELS.appApplyProfile) as Promise, + cancelBotGatewayQrLogin: (request: BotGatewayQrLoginCancelRequest) => invoke(IPC_CHANNELS.appBotGatewayQrLoginCancel, request) as Promise, + captureElementPng: (request: AppCaptureElementPngRequest) => invoke(IPC_CHANNELS.appCaptureElementPng, request) as Promise, + checkProviderConnectivity: (request: GatewayProviderConnectivityCheckRequest) => invoke(IPC_CHANNELS.appCheckProviderConnectivity, request) as Promise, + closeBotGatewayQrWindow: (request: BotGatewayQrWindowCloseRequest) => invoke(IPC_CHANNELS.appBotGatewayQrWindowClose, request) as Promise, + clearProxyNetworkCaptures: () => invoke(IPC_CHANNELS.appClearProxyNetworkCaptures) as Promise, + closeTray: () => invoke(IPC_CHANNELS.appCloseTray) as Promise, + detectProviderIcon: (request: ProviderIconDetectionRequest) => invoke(IPC_CHANNELS.appDetectProviderIcon, request) as Promise, + exportData: () => invoke(IPC_CHANNELS.appExportData) as Promise, + fetchProviderManifest: (request: ProviderManifestFetchRequest) => invoke(IPC_CHANNELS.appFetchProviderManifest, request) as Promise, + getAgentAnalysis: (filter?: AgentAnalysisFilter) => invoke(IPC_CHANNELS.appGetAgentAnalysis, filter) as Promise, + getAgentTracePayload: (request: AgentAnalysisTracePayloadRequest) => invoke(IPC_CHANNELS.appGetAgentTracePayload, request) as Promise, + getAppInfo: () => invoke(IPC_CHANNELS.appGetInfo) as Promise, + getConfig: () => invoke(IPC_CHANNELS.appGetConfig) as Promise, + getFilePath: (file: File) => webUtils.getPathForFile(file), + getGatewayStatus: () => invoke(IPC_CHANNELS.appGetGatewayStatus) as Promise, + getLocalAgentProviderCandidates: () => invoke(IPC_CHANNELS.appGetLocalAgentProviderCandidates) as Promise, + getOnboardingFinished: () => invoke(IPC_CHANNELS.appGetOnboardingFinished) as Promise, + getPendingProviderDeepLinks: () => invoke(IPC_CHANNELS.appGetPendingProviderDeepLinks) as Promise, + getProfileOpenCommand: (request: ProfileOpenRequest) => invoke(IPC_CHANNELS.appGetProfileOpenCommand, request) as Promise, + getProfileRuntimeStatus: () => invoke(IPC_CHANNELS.appGetProfileRuntimeStatus) as Promise, + getProviderAccountSnapshots: (provider?: string, options?: ProviderAccountSnapshotRequestOptions) => invoke(IPC_CHANNELS.appGetProviderAccountSnapshots, provider, options) as Promise, + getProviderCatalogModels: (request: ProviderCatalogModelsRequest) => invoke(IPC_CHANNELS.appGetProviderCatalogModels, request) as Promise, + getProviderPresets: () => invoke(IPC_CHANNELS.appGetProviderPresets) as Promise, + getPluginMarketplace: () => invoke(IPC_CHANNELS.appGetPluginMarketplace) as Promise, + getProxyCertificateStatus: () => invoke(IPC_CHANNELS.appGetProxyCertificateStatus) as Promise, + getProxyNetworkCaptures: () => invoke(IPC_CHANNELS.appGetProxyNetworkCaptures) as Promise, + getProxyStatus: () => invoke(IPC_CHANNELS.appGetProxyStatus) as Promise, + getRequestLogDetail: (request: RequestLogDetailRequest) => invoke(IPC_CHANNELS.appGetRequestLogDetail, request) as Promise, + getRequestLogs: (filter?: RequestLogListFilter) => invoke(IPC_CHANNELS.appGetRequestLogs, filter) as Promise, + getUpdateStatus: () => invoke(IPC_CHANNELS.appGetUpdateStatus) as Promise, + getUsageStats: (range?: UsageStatsRange, filter?: UsageStatsFilter) => invoke(IPC_CHANNELS.appGetUsageStats, range, filter) as Promise, + installProxyCertificate: () => invoke(IPC_CHANNELS.appInstallProxyCertificate) as Promise, + importLocalAgentProvider: (request: LocalAgentProviderImportRequest) => invoke(IPC_CHANNELS.appImportLocalAgentProvider, request) as Promise, + listMcpServerTools: (serverName: string) => invoke(IPC_CHANNELS.appListMcpServerTools, serverName) as Promise, + openBuiltInBrowser: () => invoke(IPC_CHANNELS.appOpenBuiltInBrowser) as Promise, + openBotGatewayQrWindow: (request: BotGatewayQrWindowOpenRequest) => invoke(IPC_CHANNELS.appBotGatewayQrWindowOpen, request) as Promise, + openExternal: (url: string) => invoke(IPC_CHANNELS.appOpenExternal, url) as Promise, + openProfile: (request: ProfileOpenRequest) => invoke(IPC_CHANNELS.appOpenProfile, request) as Promise, + prepareImageExportTarget: (request: AppImageExportTargetRequest) => invoke(IPC_CHANNELS.appPrepareImageExportTarget, request) as Promise, + probeLocalAgentProvider: (request: LocalAgentProviderProbeRequest) => invoke(IPC_CHANNELS.appProbeLocalAgentProvider, request) as Promise, + probeProviderCandidates: (request: GatewayProviderProbeCandidatesRequest) => invoke(IPC_CHANNELS.appProbeProviderCandidates, request) as Promise, + probeProvider: (request: GatewayProviderProbeRequest) => invoke(IPC_CHANNELS.appProbeProvider, request) as Promise, + quitApp: () => invoke(IPC_CHANNELS.appQuit) as Promise, + revealProxyCertificate: () => invoke(IPC_CHANNELS.appRevealProxyCertificate) as Promise, + renderHtmlPng: (request: AppRenderHtmlPngRequest) => invoke(IPC_CHANNELS.appRenderHtmlPng, request) as Promise, + resetCodexRateLimitCredit: (request: ProviderAccountResetRequest) => invoke(IPC_CHANNELS.appResetCodexRateLimitCredit, request) as Promise, + restartGateway: () => invoke(IPC_CHANNELS.appRestartGateway) as Promise, + restartProxy: () => invoke(IPC_CHANNELS.appRestartProxy) as Promise, + saveApiKeys: (apiKeys: ApiKeyConfig[]) => invoke(IPC_CHANNELS.appSaveApiKeys, apiKeys) as Promise, + saveConfig: (config: AppConfig, options?: AppSaveConfigOptions) => invoke(IPC_CHANNELS.appSaveConfig, config, options) as Promise, + selectPluginDirectory: () => invoke(IPC_CHANNELS.appSelectPluginDirectory) as Promise, + setOnboardingFinished: () => invoke(IPC_CHANNELS.appSetOnboardingFinished) as Promise, + setProxyNetworkCaptureEnabled: (enabled: boolean) => invoke(IPC_CHANNELS.appSetProxyNetworkCaptureEnabled, enabled) as Promise, + setTrayDetailOpen: (open: boolean, provider?: string) => invoke(IPC_CHANNELS.appSetTrayDetailOpen, open, provider) as Promise, + showMainWindow: () => invoke(IPC_CHANNELS.appShowMainWindow) as Promise, + startGateway: () => invoke(IPC_CHANNELS.appStartGateway) as Promise, + startBotGatewayQrLogin: (request: BotGatewayQrLoginStartRequest) => invoke(IPC_CHANNELS.appBotGatewayQrLoginStart, request) as Promise, + stopGateway: () => invoke(IPC_CHANNELS.appStopGateway) as Promise, + stopProfile: (request: ProfileOpenRequest) => invoke(IPC_CHANNELS.appStopProfile, request) as Promise, + scanBotHandoffBluetoothTargets: () => invoke(IPC_CHANNELS.appBotHandoffBluetoothTargetsScan) as Promise, + scanBotHandoffWifiTargets: () => invoke(IPC_CHANNELS.appBotHandoffWifiTargetsScan) as Promise, + testProviderAccountConnector: (request: ProviderAccountTestRequest) => invoke(IPC_CHANNELS.appTestProviderAccountConnector, request) as Promise, + updateCheck: () => invoke(IPC_CHANNELS.appUpdateCheck) as Promise, + updateDownload: () => invoke(IPC_CHANNELS.appUpdateDownload) as Promise, + updateInstall: () => invoke(IPC_CHANNELS.appUpdateInstall) as Promise, + waitBotGatewayQrLogin: (request: BotGatewayQrLoginWaitRequest) => invoke(IPC_CHANNELS.appBotGatewayQrLoginWait, request) as Promise, + onBeforeQuit: (callback: () => void) => { + const handler = () => callback(); + ipcRenderer.on(IPC_CHANNELS.appBeforeQuit, handler); + return () => ipcRenderer.removeListener(IPC_CHANNELS.appBeforeQuit, handler); + }, + onProviderDeepLink: (callback: (request: ProviderDeepLinkRequest) => void) => { + const handler = (_event: Electron.IpcRendererEvent, request: ProviderDeepLinkRequest) => callback(request); + ipcRenderer.on(IPC_CHANNELS.appProviderDeepLink, handler); + return () => ipcRenderer.removeListener(IPC_CHANNELS.appProviderDeepLink, handler); + }, + onOpenSettingsRequest: (callback: () => void) => { + const handler = () => callback(); + ipcRenderer.on(IPC_CHANNELS.appOpenSettings, handler); + return () => ipcRenderer.removeListener(IPC_CHANNELS.appOpenSettings, handler); + }, + onOpenUpdateRequest: (callback: () => void) => { + const handler = () => callback(); + ipcRenderer.on(IPC_CHANNELS.appOpenUpdate, handler); + return () => ipcRenderer.removeListener(IPC_CHANNELS.appOpenUpdate, handler); + }, + onUpdateStatusChanged: (callback: (status: AppUpdateStatus) => void) => { + const handler = (_event: Electron.IpcRendererEvent, status: AppUpdateStatus) => callback(status); + ipcRenderer.on(IPC_CHANNELS.appUpdateStatusChanged, handler); + return () => ipcRenderer.removeListener(IPC_CHANNELS.appUpdateStatusChanged, handler); + } +}); diff --git a/packages/electron/src/main/tray-controller.ts b/packages/electron/src/main/tray-controller.ts new file mode 100644 index 0000000..b3d287c --- /dev/null +++ b/packages/electron/src/main/tray-controller.ts @@ -0,0 +1,833 @@ +import { BrowserWindow, Menu, Tray, app, nativeImage, screen } from "electron"; +import path from "node:path"; +import { pathToFileURL } from "node:url"; +import { deflateSync } from "node:zlib"; +import { loadAppConfig } from "@ccr/core/config/config"; +import { APP_NAME } from "@ccr/core/config/constants"; +import { getProviderAccountSnapshots } from "@ccr/core/providers/account-service"; +import { getTodayUsageTotals, onUsageRecorded } from "@ccr/core/usage/store"; +import windowsManager from "./windows"; +import type { AppConfig, ProviderAccountMeter, TrayBalanceProgressConfig, TrayIconPreference } from "@ccr/core/contracts/app"; + +const popoverMenuWidth = 420; +const popoverPreferredHeight = 740; +const popoverDetailGap = 12; +const popoverDetailTopOffset = 0; +const popoverDetailWidth = 420; +const popoverMargin = 8; +const trayActivationSuppressMs = 750; +const trayMenuBarIconSize = 20; +const trayWindowBackgroundColor = "#020617"; +const trayTokenFallbackTitle = "0 tokens"; +const trayIconFallbackPath = path.join(__dirname, "../assets/tray.png"); +const trayMascotIconIds = ["violet", "orange", "cyan"] as const; + +type TrayMascotIconId = (typeof trayMascotIconIds)[number]; + +const trayMascotIconPaths: Record = { + cyan: path.join(__dirname, "../assets/tray-cyan.png"), + orange: path.join(__dirname, "../assets/tray-orange.png"), + violet: path.join(__dirname, "../assets/tray-violet.png") +}; + +class TrayController { + private activeDetailProvider?: string; + private detailCloseTimer?: NodeJS.Timeout; + private detailOpen = false; + private detailPopover?: BrowserWindow; + private ignorePopoverBlurUntil = 0; + private popover?: BrowserWindow; + private randomTrayIconDateKey?: string; + private resolvedRandomTrayIcon?: TrayMascotIconId; + private refreshTimer?: NodeJS.Timeout; + private suppressMainWindowActivationUntil = 0; + private tray?: Tray; + private trayBalanceProgress?: TrayBalanceProgressConfig; + private trayIconPreference: TrayIconPreference = "random"; + private trayTotalTokens = 0; + private unsubscribeUsageUpdates?: () => void; + + start(): void { + if (!supportsTrayPlatform() || this.tray) { + return; + } + + const icon = createTrayIcon(this.resolveTrayIconId("random")); + this.tray = new Tray(icon.isEmpty() ? nativeImage.createEmpty() : icon); + this.applyTrayTitle(trayTokenFallbackTitle); + this.tray.on("click", () => { + this.suppressMainWindowActivation(); + this.togglePopover(); + }); + this.tray.on("double-click", () => { + this.suppressMainWindowActivation(); + this.showMainWindow(); + }); + this.tray.on("right-click", () => { + this.suppressMainWindowActivation(); + this.showContextMenu(); + }); + void this.refreshIconFromConfig(); + + this.unsubscribeUsageUpdates = onUsageRecorded(() => { + this.refreshUsageTitle(); + }); + this.refreshUsageTitle(); + this.refreshTimer = setInterval(() => { + this.refreshUsageTitle(); + }, 15_000); + } + + hidePopover(): void { + this.clearDetailCloseTimer(); + this.detailOpen = false; + this.activeDetailProvider = undefined; + this.hideDetailPopover(); + if (this.popover && !this.popover.isDestroyed()) { + this.popover.hide(); + } + } + + destroy(): void { + this.clearDetailCloseTimer(); + if (this.refreshTimer) { + clearInterval(this.refreshTimer); + this.refreshTimer = undefined; + } + this.unsubscribeUsageUpdates?.(); + this.unsubscribeUsageUpdates = undefined; + if (this.detailPopover && !this.detailPopover.isDestroyed()) { + this.detailPopover.destroy(); + this.detailPopover = undefined; + } + if (this.popover && !this.popover.isDestroyed()) { + this.popover.destroy(); + this.popover = undefined; + } + if (this.tray) { + this.tray.destroy(); + this.tray = undefined; + } + } + + refreshUsageTitle(): void { + this.refreshRandomTrayIconForCurrentDay(); + void this.refreshTrayTitle(); + } + + consumeMainWindowActivationSuppression(): boolean { + if (process.platform !== "darwin" || Date.now() > this.suppressMainWindowActivationUntil) { + return false; + } + this.suppressMainWindowActivationUntil = 0; + return true; + } + + async refreshIconFromConfig(config?: AppConfig): Promise { + if (!supportsTrayPlatform() || !this.tray) { + return; + } + + const nextConfig = config ?? await loadAppConfig(); + const nextPreference = normalizeTrayIconPreference(nextConfig.trayIcon); + if (nextPreference === "random" && this.trayIconPreference !== "random") { + this.randomTrayIconDateKey = undefined; + this.resolvedRandomTrayIcon = undefined; + } + this.trayIconPreference = nextPreference; + this.trayBalanceProgress = normalizeTrayBalanceProgressConfig(nextConfig.trayBalanceProgress); + if (nextPreference === "progress" && this.trayBalanceProgress) { + await this.refreshBalanceProgressTrayIcon(); + return; + } + this.applyTrayIcon(this.resolveTrayIconId(nextPreference)); + } + + setDetailOpen(open: boolean, _provider?: string): void { + if (open) { + this.detailOpen = false; + this.hideDetailPopover(); + this.repositionMenu(false); + return; + } + this.scheduleDetailClose(); + } + + private togglePopover(): void { + if (this.popover?.isVisible()) { + this.hidePopover(); + return; + } + this.showPopover(); + } + + private suppressMainWindowActivation(): void { + if (process.platform === "darwin") { + this.suppressMainWindowActivationUntil = Date.now() + trayActivationSuppressMs; + } + } + + private showPopover(): void { + const popover = this.ensurePopover(); + this.clearDetailCloseTimer(); + this.detailOpen = false; + this.activeDetailProvider = undefined; + this.hideDetailPopover(); + const { menu } = resolvePopoverLayout(this.tray?.getBounds(), false); + + popover.setBounds(menu, false); + this.ignorePopoverBlurUntil = Date.now() + 120; + popover.show(); + popover.focus(); + popover.moveTop(); + } + + private ensurePopover(): BrowserWindow { + if (this.popover && !this.popover.isDestroyed()) { + return this.popover; + } + + this.popover = new BrowserWindow({ + acceptFirstMouse: true, + alwaysOnTop: true, + backgroundColor: trayWindowBackgroundColor, + frame: false, + fullscreenable: false, + hasShadow: true, + height: popoverPreferredHeight, + maximizable: false, + minimizable: false, + movable: false, + roundedCorners: true, + resizable: false, + show: false, + skipTaskbar: true, + title: `${APP_NAME} Usage`, + transparent: false, + webPreferences: { + contextIsolation: true, + nodeIntegration: false, + preload: path.join(__dirname, "preload.js"), + sandbox: true, + webSecurity: true, + zoomFactor: 1 + }, + width: popoverMenuWidth + }); + + prepareTrayWindowForSharpRendering(this.popover); + this.popover.setAlwaysOnTop(true, "pop-up-menu"); + this.popover.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true }); + this.popover.on("blur", () => this.handlePopoverBlur()); + this.popover.on("closed", () => { + this.popover = undefined; + }); + + void this.popover.loadURL(createTrayPageUrl("menu")); + return this.popover; + } + + private ensureDetailPopover(provider?: string): BrowserWindow { + if (this.detailPopover && !this.detailPopover.isDestroyed()) { + return this.detailPopover; + } + + this.detailPopover = new BrowserWindow({ + acceptFirstMouse: true, + alwaysOnTop: true, + backgroundColor: trayWindowBackgroundColor, + frame: false, + fullscreenable: false, + hasShadow: true, + height: popoverPreferredHeight - popoverDetailTopOffset, + maximizable: false, + minimizable: false, + movable: false, + roundedCorners: true, + resizable: false, + show: false, + skipTaskbar: true, + title: `${APP_NAME} Usage Detail`, + transparent: false, + webPreferences: { + contextIsolation: true, + nodeIntegration: false, + preload: path.join(__dirname, "preload.js"), + sandbox: true, + webSecurity: true, + zoomFactor: 1 + }, + width: popoverDetailWidth + }); + + prepareTrayWindowForSharpRendering(this.detailPopover); + this.detailPopover.setAlwaysOnTop(true, "pop-up-menu"); + this.detailPopover.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true }); + this.detailPopover.on("blur", () => this.handlePopoverBlur()); + this.detailPopover.on("closed", () => { + this.detailPopover = undefined; + }); + + this.activeDetailProvider = normalizeDetailProvider(provider); + void this.detailPopover.loadURL(createTrayPageUrl("detail", this.activeDetailProvider)); + return this.detailPopover; + } + + private showContextMenu(): void { + const menu = Menu.buildFromTemplate([ + { + enabled: false, + label: formatTokenTitle(this.trayTotalTokens) + }, + { type: "separator" }, + { + click: () => this.showMainWindow(), + label: `Open ${APP_NAME}` + }, + { + click: () => this.showPopover(), + label: "Show Usage" + }, + { type: "separator" }, + { + click: () => app.quit(), + label: `Quit ${APP_NAME}` + } + ]); + + this.tray?.popUpContextMenu(menu); + } + + private showMainWindow(): void { + this.hidePopover(); + windowsManager.showMainWindow(); + } + + private showDetailPopover(provider?: string): void { + if (!this.popover || this.popover.isDestroyed() || !this.popover.isVisible()) { + return; + } + + this.clearDetailCloseTimer(); + this.detailOpen = true; + + const { detail, menu } = resolvePopoverLayout(this.tray?.getBounds(), true); + if (detail.width < 320) { + this.detailOpen = false; + return; + } + + this.popover.setBounds(menu, false); + + const detailPopover = this.ensureDetailPopover(provider); + const nextProvider = normalizeDetailProvider(provider); + if (this.activeDetailProvider !== nextProvider) { + this.activeDetailProvider = nextProvider; + void detailPopover.loadURL(createTrayPageUrl("detail", nextProvider)); + } + + detailPopover.setBounds(detail, false); + this.ignorePopoverBlurUntil = Date.now() + 120; + detailPopover.showInactive(); + detailPopover.moveTop(); + } + + private scheduleDetailClose(): void { + this.clearDetailCloseTimer(); + this.detailCloseTimer = setTimeout(() => { + this.detailCloseTimer = undefined; + this.detailOpen = false; + this.hideDetailPopover(); + this.repositionMenu(false); + }, 140); + } + + private clearDetailCloseTimer(): void { + if (this.detailCloseTimer) { + clearTimeout(this.detailCloseTimer); + this.detailCloseTimer = undefined; + } + } + + private hideDetailPopover(): void { + if (this.detailPopover && !this.detailPopover.isDestroyed()) { + this.detailPopover.hide(); + } + } + + private repositionMenu(detailOpen = this.detailOpen): void { + if (!this.popover || this.popover.isDestroyed() || !this.popover.isVisible()) { + return; + } + const { menu } = resolvePopoverLayout(this.tray?.getBounds(), detailOpen); + this.popover.setBounds(menu, false); + } + + private handlePopoverBlur(): void { + setTimeout(() => { + if (Date.now() < this.ignorePopoverBlurUntil) { + return; + } + const focused = BrowserWindow.getFocusedWindow(); + if (focused && (focused === this.popover || focused === this.detailPopover)) { + return; + } + this.hidePopover(); + }, 30); + } + + private async refreshTrayTitle(): Promise { + if (!this.tray) { + return; + } + + try { + const totals = await getTodayUsageTotals(undefined, { includeProxy: true }); + this.trayTotalTokens = Math.max(0, totals.totalTokens); + if (this.trayIconPreference === "progress" && this.trayBalanceProgress) { + await this.refreshBalanceProgressTrayIcon(); + } + this.applyTrayTitle(formatTokenTitle(totals.totalTokens)); + } catch { + this.applyTrayTitle(trayTokenFallbackTitle); + } + } + + private applyTrayTitle(title: string): void { + if (!this.tray) { + return; + } + if (supportsTrayTitle()) { + this.tray.setTitle(title); + } + this.tray.setToolTip(`${APP_NAME} Usage\n${title}`); + } + + private applyTrayIcon(iconId: TrayMascotIconId): void { + if (!this.tray) { + return; + } + const icon = createTrayIcon(iconId); + this.tray.setImage(icon.isEmpty() ? nativeImage.createEmpty() : icon); + } + + private applyProgressTrayIcon(progress: number): void { + if (!this.tray) { + return; + } + const icon = createTrayProgressIcon(progress); + this.tray.setImage(icon.isEmpty() ? nativeImage.createEmpty() : icon); + } + + private async refreshBalanceProgressTrayIcon(): Promise { + if (!this.trayBalanceProgress) { + return; + } + try { + const snapshots = await getProviderAccountSnapshots(this.trayBalanceProgress.provider); + const snapshot = snapshots.find((account) => account.provider === this.trayBalanceProgress?.provider) ?? snapshots[0]; + const meter = snapshot?.meters.find((candidate) => candidate.id === this.trayBalanceProgress?.meterId); + this.applyProgressTrayIcon(meter ? calculateTrayBalanceProgress(meter) : 0); + } catch { + this.applyProgressTrayIcon(0); + } + } + + private refreshRandomTrayIconForCurrentDay(): void { + if (this.trayIconPreference !== "random") { + return; + } + const previousDateKey = this.randomTrayIconDateKey; + const previousIconId = this.resolvedRandomTrayIcon; + const iconId = this.resolveTrayIconId("random"); + if (previousDateKey !== this.randomTrayIconDateKey || previousIconId !== iconId) { + this.applyTrayIcon(iconId); + } + } + + private resolveTrayIconId(preference: TrayIconPreference): TrayMascotIconId { + if (preference === "violet" || preference === "orange" || preference === "cyan") { + return preference; + } + + const dateKey = formatLocalDateKey(new Date()); + if (this.resolvedRandomTrayIcon && this.randomTrayIconDateKey === dateKey) { + return this.resolvedRandomTrayIcon; + } + + this.randomTrayIconDateKey = dateKey; + this.resolvedRandomTrayIcon = trayMascotIconIds[Math.floor(Math.random() * trayMascotIconIds.length)]; + return this.resolvedRandomTrayIcon; + } +} + +const trayController = new TrayController(); + +export default trayController; + +function supportsTrayPlatform(): boolean { + return process.platform === "darwin" || process.platform === "win32"; +} + +function supportsTrayTitle(): boolean { + return process.platform === "darwin"; +} + +function resolvePopoverLayout( + trayBounds: Electron.Rectangle | undefined, + detailOpen: boolean +): { detail: Electron.Rectangle; menu: Electron.Rectangle } { + const anchor = trayBounds + ? { x: trayBounds.x + trayBounds.width / 2, y: trayBounds.y + trayBounds.height / 2 } + : screen.getCursorScreenPoint(); + const display = screen.getDisplayNearestPoint(anchor); + const workArea = display.workArea; + const availableWidth = Math.max(360, workArea.width - popoverMargin * 2); + const menuWidth = Math.min(popoverMenuWidth, availableWidth); + const preferredGroupWidth = detailOpen ? menuWidth + popoverDetailGap + popoverDetailWidth : menuWidth; + const groupWidth = Math.min(preferredGroupWidth, availableWidth); + const detailWidth = detailOpen ? Math.max(0, groupWidth - menuWidth - popoverDetailGap) : 0; + const height = Math.min(popoverPreferredHeight, Math.max(460, workArea.height - popoverMargin * 2)); + const menuX = Math.round(anchor.x - menuWidth / 2); + const x = clamp(menuX, workArea.x + popoverMargin, workArea.x + workArea.width - groupWidth - popoverMargin); + const y = resolvePopoverY(trayBounds, workArea, height); + + const menu = alignBoundsToDevicePixels({ + height, + width: menuWidth, + x, + y + }, display.scaleFactor); + const detail = alignBoundsToDevicePixels( + { + height: Math.max(260, menu.height - popoverDetailTopOffset), + width: detailWidth, + x: menu.x + menu.width + popoverDetailGap, + y: menu.y + popoverDetailTopOffset + }, + display.scaleFactor + ); + + return { detail, menu }; +} + +function resolvePopoverY( + trayBounds: Electron.Rectangle | undefined, + workArea: Electron.Rectangle, + height: number +): number { + if (!trayBounds) { + const cursor = screen.getCursorScreenPoint(); + return clamp( + cursor.y + popoverMargin, + workArea.y + popoverMargin, + workArea.y + workArea.height - height - popoverMargin + ); + } + + const taskbarIsVertical = trayBounds.x + trayBounds.width <= workArea.x || + trayBounds.x >= workArea.x + workArea.width; + if (taskbarIsVertical) { + return clamp( + Math.round(trayBounds.y + trayBounds.height / 2 - height / 2), + workArea.y + popoverMargin, + workArea.y + workArea.height - height - popoverMargin + ); + } + + const topSpace = trayBounds.y - workArea.y; + const bottomSpace = workArea.y + workArea.height - (trayBounds.y + trayBounds.height); + const placeBelow = bottomSpace >= height + popoverMargin || bottomSpace > topSpace; + const preferredY = placeBelow + ? trayBounds.y + trayBounds.height + popoverMargin + : trayBounds.y - height - popoverMargin; + + return clamp( + Math.round(preferredY), + workArea.y + popoverMargin, + workArea.y + workArea.height - height - popoverMargin + ); +} + +function createTrayPageUrl(mode: "detail" | "menu", provider?: string): string { + const url = new URL(pathToFileURL(path.join(__dirname, "../renderer/pages/tray/index.html")).toString()); + url.searchParams.set("mode", mode); + if (provider) { + url.searchParams.set("provider", provider); + } + return url.toString(); +} + +function normalizeDetailProvider(provider?: string): string | undefined { + const trimmed = provider?.trim(); + return trimmed ? trimmed : undefined; +} + +function prepareTrayWindowForSharpRendering(window: BrowserWindow): void { + const resetZoom = () => { + if (!window.isDestroyed() && !window.webContents.isDestroyed()) { + window.webContents.setZoomFactor(1); + } + }; + + resetZoom(); + void window.webContents.setVisualZoomLevelLimits(1, 1).catch(() => undefined); + window.webContents.on("did-finish-load", resetZoom); + window.webContents.on("zoom-changed", (event) => { + event.preventDefault(); + resetZoom(); + }); +} + +function alignBoundsToDevicePixels( + bounds: Electron.Rectangle, + scaleFactor: number +): Electron.Rectangle { + const scale = Number.isFinite(scaleFactor) && scaleFactor > 0 ? scaleFactor : 1; + return { + height: alignDimensionToDevicePixel(bounds.height, scale), + width: alignDimensionToDevicePixel(bounds.width, scale), + x: alignCoordinateToDevicePixel(bounds.x, scale), + y: alignCoordinateToDevicePixel(bounds.y, scale) + }; +} + +function alignCoordinateToDevicePixel(value: number, scaleFactor: number): number { + return Math.round(value * scaleFactor) / scaleFactor; +} + +function alignDimensionToDevicePixel(value: number, scaleFactor: number): number { + if (value <= 0) { + return 0; + } + return Math.max(1, Math.round(value * scaleFactor) / scaleFactor); +} + +function createTrayIcon(iconId: TrayMascotIconId): Electron.NativeImage { + const size = trayIconPixelSize(); + const image = nativeImage.createFromPath(trayMascotIconPaths[iconId]); + if (image.isEmpty()) { + const fallback = nativeImage.createFromPath(trayIconFallbackPath); + if (fallback.isEmpty()) { + return nativeImage.createEmpty(); + } + const fallbackIcon = fallback.resize({ height: size, width: size }); + fallbackIcon.setTemplateImage(process.platform === "darwin"); + return fallbackIcon; + } + const resized = image.resize({ height: size, width: size }); + resized.setTemplateImage(false); + return resized; +} + +function createTrayProgressIcon(progress: number): Electron.NativeImage { + const size = trayIconPixelSize(); + const clamped = Math.max(0, Math.min(1, progress)); + const image = nativeImage.createFromBuffer(createBalanceProgressBarPng(clamped)); + if (image.isEmpty()) { + return nativeImage.createEmpty(); + } + const resized = image.resize({ height: size, width: size }); + resized.setTemplateImage(false); + return resized; +} + +function trayIconPixelSize(): number { + return process.platform === "win32" ? 16 : trayMenuBarIconSize; +} + +function normalizeTrayIconPreference(value: unknown): TrayIconPreference { + return value === "violet" || value === "orange" || value === "cyan" || value === "progress" || value === "random" + ? value + : "random"; +} + +function normalizeTrayBalanceProgressConfig(value: unknown): TrayBalanceProgressConfig | undefined { + if (!isRecord(value)) { + return undefined; + } + const provider = readRecordString(value, "provider"); + const meterId = readRecordString(value, "meterId"); + return provider && meterId ? { meterId, provider } : undefined; +} + +function calculateTrayBalanceProgress(meter: ProviderAccountMeter): number { + if (meter.limit && meter.limit > 0) { + if (meter.remaining !== undefined) { + return Math.max(0, Math.min(1, meter.remaining / meter.limit)); + } + if (meter.used !== undefined) { + return Math.max(0, Math.min(1, 1 - meter.used / meter.limit)); + } + } + if (meter.unit === "%") { + if (meter.remaining !== undefined) { + return Math.max(0, Math.min(1, meter.remaining / 100)); + } + if (meter.used !== undefined) { + return Math.max(0, Math.min(1, 1 - meter.used / 100)); + } + } + const rawValue = meter.remaining ?? meter.limit ?? meter.used ?? 0; + return rawValue > 0 ? 1 : 0; +} + +function createBalanceProgressBarPng(progress: number): Buffer { + const size = 36; + const rgba = Buffer.alloc(size * size * 4); + const clamped = Math.max(0, Math.min(1, progress)); + const track = { a: 0.48, b: 184, g: 163, r: 148 }; + const fill = clamped <= 0.05 + ? { a: 1, b: 68, g: 68, r: 248 } + : clamped <= 0.2 + ? { a: 1, b: 36, g: 191, r: 245 } + : { a: 1, b: 252, g: 250, r: 248 }; + const accent = { a: 0.95, b: 191, g: 212, r: 45 }; + const background = { a: 0.92, b: 42, g: 23, r: 15 }; + + for (let y = 0; y < size; y += 1) { + for (let x = 0; x < size; x += 1) { + const px = x + 0.5; + const py = y + 0.5; + const index = (y * size + x) * 4; + blendPngPixel(rgba, index, background, roundedRectAlpha(px, py, 3, 3, 30, 30, 8)); + blendPngPixel(rgba, index, { a: 0.74, b: 250, g: 250, r: 248 }, roundedRectAlpha(px, py, 7, 9, 12, 2.5, 1.25)); + blendPngPixel(rgba, index, accent, roundedRectAlpha(px, py, 7, 15, 18, 2.5, 1.25)); + blendPngPixel(rgba, index, track, roundedRectAlpha(px, py, 7, 22, 22, 5, 2.5)); + blendPngPixel(rgba, index, fill, roundedRectAlpha(px, py, 7, 22, Math.max(2, 22 * clamped), 5, 2.5)); + } + } + + return encodePngRgba(rgba, size, size); +} + +function roundedRectAlpha( + px: number, + py: number, + x: number, + y: number, + width: number, + height: number, + radius: number +): number { + const halfWidth = Math.max(0, width / 2 - radius); + const halfHeight = Math.max(0, height / 2 - radius); + const centerX = x + width / 2; + const centerY = y + height / 2; + const dx = Math.abs(px - centerX) - halfWidth; + const dy = Math.abs(py - centerY) - halfHeight; + const outside = Math.hypot(Math.max(dx, 0), Math.max(dy, 0)); + const inside = Math.min(Math.max(dx, dy), 0); + return Math.max(0, Math.min(1, 0.5 - (outside + inside - radius))); +} + +function readRecordString(record: Record, key: string): string | undefined { + const value = record[key]; + return typeof value === "string" && value.trim() ? value.trim() : undefined; +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function blendPngPixel( + rgba: Buffer, + index: number, + color: { a: number; b: number; g: number; r: number }, + alpha: number +): void { + const sourceAlpha = Math.max(0, Math.min(1, alpha * color.a)); + if (sourceAlpha <= 0) { + return; + } + const targetAlpha = rgba[index + 3] / 255; + const outAlpha = sourceAlpha + targetAlpha * (1 - sourceAlpha); + rgba[index] = Math.round((color.r * sourceAlpha + rgba[index] * targetAlpha * (1 - sourceAlpha)) / outAlpha); + rgba[index + 1] = Math.round((color.g * sourceAlpha + rgba[index + 1] * targetAlpha * (1 - sourceAlpha)) / outAlpha); + rgba[index + 2] = Math.round((color.b * sourceAlpha + rgba[index + 2] * targetAlpha * (1 - sourceAlpha)) / outAlpha); + rgba[index + 3] = Math.round(outAlpha * 255); +} + +function encodePngRgba(rgba: Buffer, width: number, height: number): Buffer { + const header = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]); + const ihdr = Buffer.alloc(13); + ihdr.writeUInt32BE(width, 0); + ihdr.writeUInt32BE(height, 4); + ihdr[8] = 8; + ihdr[9] = 6; + const raw = Buffer.alloc((width * 4 + 1) * height); + for (let y = 0; y < height; y += 1) { + const sourceOffset = y * width * 4; + const targetOffset = y * (width * 4 + 1); + raw[targetOffset] = 0; + rgba.copy(raw, targetOffset + 1, sourceOffset, sourceOffset + width * 4); + } + return Buffer.concat([ + header, + pngChunk("IHDR", ihdr), + pngChunk("IDAT", deflateSync(raw, { level: 9 })), + pngChunk("IEND", Buffer.alloc(0)) + ]); +} + +function pngChunk(type: string, data: Buffer): Buffer { + const typeBuffer = Buffer.from(type, "ascii"); + const length = Buffer.alloc(4); + length.writeUInt32BE(data.length, 0); + const crc = Buffer.alloc(4); + crc.writeUInt32BE(pngCrc32(Buffer.concat([typeBuffer, data])), 0); + return Buffer.concat([length, typeBuffer, data, crc]); +} + +function pngCrc32(buffer: Buffer): number { + const table = pngCrcTable(); + let crc = 0xffffffff; + for (const byte of buffer) { + crc = table[(crc ^ byte) & 0xff] ^ (crc >>> 8); + } + return (crc ^ 0xffffffff) >>> 0; +} + +let cachedPngCrcTable: Uint32Array | undefined; + +function pngCrcTable(): Uint32Array { + if (cachedPngCrcTable) { + return cachedPngCrcTable; + } + const table = new Uint32Array(256); + for (let index = 0; index < 256; index += 1) { + let value = index; + for (let bit = 0; bit < 8; bit += 1) { + value = value & 1 ? 0xedb88320 ^ (value >>> 1) : value >>> 1; + } + table[index] = value >>> 0; + } + cachedPngCrcTable = table; + return table; +} + +function formatLocalDateKey(date: Date): string { + return [ + date.getFullYear(), + String(date.getMonth() + 1).padStart(2, "0"), + String(date.getDate()).padStart(2, "0") + ].join("-"); +} + +function clamp(value: number, min: number, max: number): number { + if (max < min) { + return min; + } + return Math.min(max, Math.max(min, value)); +} + +function formatCompactNumber(value: number): string { + return new Intl.NumberFormat(undefined, { + maximumFractionDigits: value >= 1000 ? 1 : 0, + notation: value >= 10000 ? "compact" : "standard" + }).format(value); +} + +function formatTokenTitle(value: number): string { + return `${formatCompactNumber(Math.max(0, value))} tokens`; +} diff --git a/packages/electron/src/main/update-service.ts b/packages/electron/src/main/update-service.ts new file mode 100644 index 0000000..2af3ac9 --- /dev/null +++ b/packages/electron/src/main/update-service.ts @@ -0,0 +1,381 @@ +import { app } from "electron"; +import { autoUpdater, type ProgressInfo, type UpdateDownloadedEvent, type UpdateInfo } from "electron-updater"; +import { IPC_CHANNELS } from "@ccr/core/config/constants"; +import windowsManager from "./windows"; +import type { AppUpdateStatus } from "@ccr/core/contracts/app"; + +type InstallPreparation = () => Promise; +type UpdateCheckOptions = { + silentFailure?: boolean; +}; + +const startupCheckDelayMs = 12_000; +const defaultUpdateSource = "GitHub Releases"; + +class AppUpdateService { + private activeSilentCheckFailureRestoreStatus?: AppUpdateStatus; + private configuredUpdateSource = defaultUpdateSource; + private initialized = false; + private installingUpdate = false; + private prepareInstall?: InstallPreparation; + private startupCheckTimer?: NodeJS.Timeout; + private status: AppUpdateStatus = this.deriveStatus({ + canCheck: false, + canDownload: false, + canInstall: false, + currentVersion: app.getVersion(), + state: "idle", + supported: this.isUpdaterSupported() + }); + + start(): void { + if (this.initialized) { + return; + } + + this.initialized = true; + this.configureUpdater(); + this.registerUpdaterEvents(); + this.publishStatus({ feedUrl: this.configuredUpdateSource }); + + if (this.isUpdaterSupported()) { + this.queueStartupCheck(); + } + } + + getStatus(): AppUpdateStatus { + return this.status; + } + + setInstallPreparation(callback: InstallPreparation): void { + this.prepareInstall = callback; + } + + isInstallingUpdate(): boolean { + return this.installingUpdate; + } + + async checkForUpdates(options: UpdateCheckOptions = {}): Promise { + this.start(); + if (!this.isUpdaterSupported()) { + return this.publishStatus({ + lastError: "Updates are only available in packaged builds.", + state: "error" + }); + } + + const restoreStatus = options.silentFailure ? this.status : undefined; + this.activeSilentCheckFailureRestoreStatus = restoreStatus; + this.publishStatus({ + lastError: undefined, + progress: undefined, + state: "checking" + }); + + try { + const result = await autoUpdater.checkForUpdates(); + const checkedAt = new Date().toISOString(); + + if (!result) { + return this.publishStatus({ + availableVersion: undefined, + downloadedAt: undefined, + lastCheckedAt: checkedAt, + progress: undefined, + releaseDate: undefined, + releaseName: undefined, + releaseNotes: undefined, + state: "not-available" + }); + } + + if (result.isUpdateAvailable) { + return this.publishUpdateInfo("available", result.updateInfo, { + downloadedAt: undefined, + lastCheckedAt: checkedAt, + progress: undefined + }); + } + + return this.publishUpdateInfo("not-available", result.updateInfo, { + availableVersion: undefined, + downloadedAt: undefined, + lastCheckedAt: checkedAt, + progress: undefined + }); + } catch (error) { + if (options.silentFailure && restoreStatus) { + return this.publishSilentCheckFailure(error, restoreStatus); + } + return this.publishStatus({ + lastError: formatError(error), + progress: undefined, + state: "error" + }); + } finally { + if (this.activeSilentCheckFailureRestoreStatus === restoreStatus) { + this.activeSilentCheckFailureRestoreStatus = undefined; + } + } + } + + async downloadUpdate(): Promise { + this.start(); + if (!this.status.canDownload) { + const checkedStatus = await this.checkForUpdates(); + if (checkedStatus.state === "downloaded" || checkedStatus.canDownload) { + return this.downloadUpdate(); + } + return checkedStatus; + } + + this.publishStatus({ + lastError: undefined, + progress: undefined, + state: "downloading" + }); + + try { + await autoUpdater.downloadUpdate(); + return this.status; + } catch (error) { + const status = this.publishStatus({ + lastError: formatError(error), + state: "error" + }); + throw new Error(status.lastError); + } + } + + async installUpdate(): Promise { + this.start(); + if (!this.status.canInstall) { + const status = this.publishStatus({ + lastError: "No downloaded update is ready to install.", + state: "error" + }); + throw new Error(status.lastError); + } + + this.installingUpdate = true; + this.publishStatus({ + lastError: undefined, + state: "installing" + }); + + try { + await this.prepareInstall?.(); + autoUpdater.quitAndInstall(false, true); + } catch (error) { + this.installingUpdate = false; + this.publishStatus({ + lastError: formatError(error), + state: "error" + }); + throw error; + } + } + + private configureUpdater(): void { + const feedUrl = readEnvString("CCR_UPDATE_FEED_URL"); + if (feedUrl) { + this.configuredUpdateSource = feedUrl; + autoUpdater.setFeedURL({ + provider: "generic", + url: feedUrl + }); + autoUpdater.forceDevUpdateConfig = true; + } + + autoUpdater.autoDownload = false; + autoUpdater.autoInstallOnAppQuit = false; + autoUpdater.allowPrerelease = readEnvBoolean("CCR_UPDATE_ALLOW_PRERELEASE"); + autoUpdater.fullChangelog = true; + autoUpdater.logger = { + debug: (message) => console.debug(`[update] ${message}`), + error: (message) => console.error(`[update] ${String(message)}`), + info: (message) => console.info(`[update] ${String(message)}`), + warn: (message) => console.warn(`[update] ${String(message)}`) + }; + } + + private registerUpdaterEvents(): void { + autoUpdater.on("checking-for-update", () => { + this.publishStatus({ + lastError: undefined, + progress: undefined, + state: "checking" + }); + }); + autoUpdater.on("update-available", (info) => { + this.publishUpdateInfo("available", info, { + downloadedAt: undefined, + lastCheckedAt: new Date().toISOString(), + progress: undefined + }); + }); + autoUpdater.on("update-not-available", (info) => { + this.publishUpdateInfo("not-available", info, { + availableVersion: undefined, + downloadedAt: undefined, + lastCheckedAt: new Date().toISOString(), + progress: undefined + }); + }); + autoUpdater.on("download-progress", (progress) => { + this.publishStatus({ + progress: normalizeProgress(progress), + state: "downloading" + }); + }); + autoUpdater.on("update-downloaded", (event) => { + this.publishUpdateInfo("downloaded", event, { + downloadedAt: new Date().toISOString(), + lastError: undefined, + progress: normalizeProgress({ + bytesPerSecond: 0, + delta: 0, + percent: 100, + total: 0, + transferred: 0 + }) + }); + }); + autoUpdater.on("update-cancelled", (info) => { + this.publishUpdateInfo("available", info, { + lastError: "Update download was cancelled.", + progress: undefined + }); + }); + autoUpdater.on("error", (error) => { + if (this.activeSilentCheckFailureRestoreStatus) { + this.publishSilentCheckFailure(error, this.activeSilentCheckFailureRestoreStatus); + return; + } + this.publishStatus({ + lastError: formatError(error), + progress: undefined, + state: "error" + }); + }); + } + + private queueStartupCheck(): void { + if (this.startupCheckTimer) { + return; + } + this.startupCheckTimer = setTimeout(() => { + this.startupCheckTimer = undefined; + void this.checkForUpdates({ silentFailure: true }); + }, readEnvNumber("CCR_UPDATE_STARTUP_DELAY_MS") ?? startupCheckDelayMs); + this.startupCheckTimer.unref?.(); + } + + private publishSilentCheckFailure(error: unknown, restoreStatus: AppUpdateStatus): AppUpdateStatus { + const state = restoreStatus.state === "checking" || restoreStatus.state === "error" ? "idle" : restoreStatus.state; + return this.publishStatus({ + availableVersion: restoreStatus.availableVersion, + downloadedAt: restoreStatus.downloadedAt, + lastCheckedAt: restoreStatus.lastCheckedAt, + lastError: formatError(error), + progress: restoreStatus.progress, + releaseDate: restoreStatus.releaseDate, + releaseName: restoreStatus.releaseName, + releaseNotes: restoreStatus.releaseNotes, + state + }); + } + + private publishUpdateInfo( + state: AppUpdateStatus["state"], + info: UpdateInfo | UpdateDownloadedEvent, + patch: Partial = {} + ): AppUpdateStatus { + return this.publishStatus({ + availableVersion: info.version, + lastError: undefined, + releaseDate: info.releaseDate, + releaseName: info.releaseName || undefined, + releaseNotes: formatReleaseNotes(info.releaseNotes), + state, + ...patch + }); + } + + private publishStatus(patch: Partial): AppUpdateStatus { + this.status = this.deriveStatus({ + ...this.status, + ...patch, + currentVersion: app.getVersion(), + feedUrl: this.configuredUpdateSource, + supported: this.isUpdaterSupported() + }); + windowsManager.broadcast(IPC_CHANNELS.appUpdateStatusChanged, this.status); + return this.status; + } + + private deriveStatus(status: AppUpdateStatus): AppUpdateStatus { + const busy = status.state === "checking" || status.state === "downloading" || status.state === "installing"; + return { + ...status, + canCheck: status.supported && !busy, + canDownload: status.supported && status.state === "available", + canInstall: status.supported && status.state === "downloaded" + }; + } + + private isUpdaterSupported(): boolean { + return app.isPackaged || Boolean(readEnvString("CCR_UPDATE_FEED_URL")); + } +} + +export const appUpdateService = new AppUpdateService(); + +function normalizeProgress(progress: ProgressInfo): AppUpdateStatus["progress"] { + return { + bytesPerSecond: finiteNumber(progress.bytesPerSecond), + percent: finiteNumber(progress.percent), + total: finiteNumber(progress.total), + transferred: finiteNumber(progress.transferred) + }; +} + +function finiteNumber(value: unknown): number | undefined { + return typeof value === "number" && Number.isFinite(value) ? value : undefined; +} + +function formatReleaseNotes(notes: UpdateInfo["releaseNotes"]): string | undefined { + if (typeof notes === "string") { + return notes.trim() || undefined; + } + if (!Array.isArray(notes)) { + return undefined; + } + return notes + .map((item) => [item.version, item.note].filter(Boolean).join("\n")) + .filter(Boolean) + .join("\n\n") || undefined; +} + +function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + +function readEnvString(name: string): string | undefined { + const value = process.env[name]?.trim(); + return value || undefined; +} + +function readEnvBoolean(name: string): boolean { + const value = readEnvString(name)?.toLowerCase(); + return value === "1" || value === "true" || value === "yes"; +} + +function readEnvNumber(name: string): number | undefined { + const value = readEnvString(name); + if (!value) { + return undefined; + } + const parsed = Number(value); + return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined; +} diff --git a/packages/electron/src/main/windows.ts b/packages/electron/src/main/windows.ts new file mode 100644 index 0000000..81f7070 --- /dev/null +++ b/packages/electron/src/main/windows.ts @@ -0,0 +1,162 @@ +import { app, BrowserWindow, screen } from "electron"; +import { existsSync } from "node:fs"; +import path from "node:path"; +import { pathToFileURL } from "node:url"; +import { APP_NAME, IPC_CHANNELS, ONBOARDING_FINISHED_FILE } from "@ccr/core/config/constants"; + +type WindowName = "main" | string; +type WindowBounds = { height: number; width: number; x?: number; y?: number }; + +const titleBarHeight = 46; +const mainWindowDefaultHeight = 760; +const mainWindowDefaultWidth = 1180; +const mainWindowMargin = 48; +const mainWindowMinHeight = 420; +const mainWindowMinWidth = 360; + +class WindowsManager { + private windows = new Map(); + + createMainWindow(): BrowserWindow { + const existing = this.getWindow("main"); + if (existing) { + existing.focus(); + return existing; + } + + const bounds = getMainWindowInitialBounds(); + + const window = new BrowserWindow({ + ...bounds, + minHeight: mainWindowMinHeight, + minWidth: mainWindowMinWidth, + show: false, + title: APP_NAME, + ...(process.platform === "darwin" + ? { + titleBarStyle: "hiddenInset" as const, + trafficLightPosition: { + x: 16, + y: Math.round((titleBarHeight - 14) / 2) + } + } + : {}), + webPreferences: { + contextIsolation: true, + nodeIntegration: false, + preload: path.join(__dirname, "preload.js"), + sandbox: true, + webSecurity: true + } + }); + + this.windows.set("main", window); + + window.once("ready-to-show", () => { + if (!window.isDestroyed()) { + window.show(); + } + }); + window.on("close", (event) => { + if (!shouldHideMainWindowOnClose()) { + return; + } + event.preventDefault(); + window.hide(); + }); + window.on("closed", () => this.windows.delete("main")); + window.webContents.on("page-title-updated", (_event, title) => { + window.setTitle(title || APP_NAME); + }); + + void window.loadURL(this.resolveRendererUrl("pages/home/index.html")); + + if (process.env.NODE_ENV === "development") { + window.webContents.openDevTools({ mode: "detach" }); + } + + return window; + } + + showMainWindow(): BrowserWindow { + const window = this.getWindow("main") ?? this.createMainWindow(); + if (window.isMinimized()) { + window.restore(); + } + window.show(); + window.focus(); + return window; + } + + resizeMainWindowToScreenSize(): void { + const window = this.getWindow("main"); + if (!window) { + return; + } + window.setBounds(getMainWindowScreenBounds()); + } + + getWindow(name: WindowName): BrowserWindow | undefined { + const window = this.windows.get(name); + if (!window || window.isDestroyed()) { + this.windows.delete(name); + return undefined; + } + return window; + } + + broadcast(channel: string, payload?: unknown): void { + for (const window of this.windows.values()) { + if (!window.isDestroyed() && !window.webContents.isDestroyed()) { + window.webContents.send(channel, payload); + } + } + } + + private resolveRendererUrl(relativeHtmlPath: string): string { + return pathToFileURL(path.join(__dirname, "../renderer", relativeHtmlPath)).toString(); + } +} + +const windowsManager = new WindowsManager(); + +export default windowsManager; + +let appIsQuitting = false; + +app.on("before-quit", () => { + appIsQuitting = true; + windowsManager.broadcast(IPC_CHANNELS.appBeforeQuit); +}); + +function shouldHideMainWindowOnClose(): boolean { + return process.platform === "win32" && !appIsQuitting; +} + +function fitWindowSize(preferred: number, minimum: number, available: number): number { + return Math.max(minimum, Math.min(preferred, available > 0 ? available : preferred)); +} + +function getMainWindowInitialBounds(): WindowBounds { + const { height: availableHeight, width: availableWidth } = screen.getPrimaryDisplay().workAreaSize; + + if (existsSync(ONBOARDING_FINISHED_FILE)) { + return getMainWindowScreenBounds(); + } + + return { + height: fitWindowSize(mainWindowDefaultHeight, mainWindowMinHeight, availableHeight - mainWindowMargin), + width: fitWindowSize(mainWindowDefaultWidth, mainWindowMinWidth, availableWidth - mainWindowMargin) + }; +} + +function getMainWindowScreenBounds(): Required { + const { workArea } = screen.getPrimaryDisplay(); + + return { + height: Math.max(mainWindowMinHeight, workArea.height), + width: Math.max(mainWindowMinWidth, workArea.width), + x: workArea.x, + y: workArea.y + }; +} diff --git a/packages/electron/tsconfig.json b/packages/electron/tsconfig.json new file mode 100644 index 0000000..1f70006 --- /dev/null +++ b/packages/electron/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "src" + }, + "include": ["src/**/*.ts", "src/**/*.d.ts"] +} diff --git a/packages/ui/package.json b/packages/ui/package.json new file mode 100644 index 0000000..609fab2 --- /dev/null +++ b/packages/ui/package.json @@ -0,0 +1,21 @@ +{ + "name": "@claude-code-router/ui", + "version": "3.0.11", + "private": true, + "description": "Claude Code Router web management UI.", + "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", + "baseui": "^16.1.1", + "clsx": "^2.1.1", + "lucide-react": "^1.17.0", + "motion": "^12.40.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "recharts": "^3.8.1", + "styletron-engine-atomic": "^1.6.2", + "styletron-react": "^6.1.1", + "tailwind-merge": "^3.6.0" + } +} diff --git a/packages/ui/src/assets/agent-logos/claude-code.png b/packages/ui/src/assets/agent-logos/claude-code.png new file mode 100644 index 0000000..7045039 Binary files /dev/null and b/packages/ui/src/assets/agent-logos/claude-code.png differ diff --git a/packages/ui/src/assets/agent-logos/codex.png b/packages/ui/src/assets/agent-logos/codex.png new file mode 100644 index 0000000..912415e Binary files /dev/null and b/packages/ui/src/assets/agent-logos/codex.png differ diff --git a/packages/ui/src/assets/agent-logos/zcode.png b/packages/ui/src/assets/agent-logos/zcode.png new file mode 100644 index 0000000..c680878 Binary files /dev/null and b/packages/ui/src/assets/agent-logos/zcode.png differ diff --git a/packages/ui/src/assets/logo.png b/packages/ui/src/assets/logo.png new file mode 100644 index 0000000..76801d1 Binary files /dev/null and b/packages/ui/src/assets/logo.png differ diff --git a/packages/ui/src/assets/onboarding/mascot-transition.svg b/packages/ui/src/assets/onboarding/mascot-transition.svg new file mode 100644 index 0000000..d0bfb3e --- /dev/null +++ b/packages/ui/src/assets/onboarding/mascot-transition.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/ui/src/assets/provider-icons/anthropic.png b/packages/ui/src/assets/provider-icons/anthropic.png new file mode 100644 index 0000000..c884fe1 Binary files /dev/null and b/packages/ui/src/assets/provider-icons/anthropic.png differ diff --git a/packages/ui/src/assets/provider-icons/bailian.ico b/packages/ui/src/assets/provider-icons/bailian.ico new file mode 100644 index 0000000..f525bfa Binary files /dev/null and b/packages/ui/src/assets/provider-icons/bailian.ico differ diff --git a/packages/ui/src/assets/provider-icons/claudeapi.png b/packages/ui/src/assets/provider-icons/claudeapi.png new file mode 100644 index 0000000..776ced8 Binary files /dev/null and b/packages/ui/src/assets/provider-icons/claudeapi.png differ diff --git a/packages/ui/src/assets/provider-icons/code0.png b/packages/ui/src/assets/provider-icons/code0.png new file mode 100644 index 0000000..32d81c1 Binary files /dev/null and b/packages/ui/src/assets/provider-icons/code0.png differ diff --git a/packages/ui/src/assets/provider-icons/deepseek.ico b/packages/ui/src/assets/provider-icons/deepseek.ico new file mode 100644 index 0000000..8e78c0b Binary files /dev/null and b/packages/ui/src/assets/provider-icons/deepseek.ico differ diff --git a/packages/ui/src/assets/provider-icons/fenno.jpg b/packages/ui/src/assets/provider-icons/fenno.jpg new file mode 100644 index 0000000..364f735 Binary files /dev/null and b/packages/ui/src/assets/provider-icons/fenno.jpg differ diff --git a/packages/ui/src/assets/provider-icons/gemini.svg b/packages/ui/src/assets/provider-icons/gemini.svg new file mode 100644 index 0000000..38f5625 --- /dev/null +++ b/packages/ui/src/assets/provider-icons/gemini.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/ui/src/assets/provider-icons/mistral.webp b/packages/ui/src/assets/provider-icons/mistral.webp new file mode 100644 index 0000000..74e3817 Binary files /dev/null and b/packages/ui/src/assets/provider-icons/mistral.webp differ diff --git a/packages/ui/src/assets/provider-icons/moonshot.ico b/packages/ui/src/assets/provider-icons/moonshot.ico new file mode 100644 index 0000000..9b4870b Binary files /dev/null and b/packages/ui/src/assets/provider-icons/moonshot.ico differ diff --git a/packages/ui/src/assets/provider-icons/openai.png b/packages/ui/src/assets/provider-icons/openai.png new file mode 100644 index 0000000..16896d2 Binary files /dev/null and b/packages/ui/src/assets/provider-icons/openai.png differ diff --git a/packages/ui/src/assets/provider-icons/openrouter.ico b/packages/ui/src/assets/provider-icons/openrouter.ico new file mode 100644 index 0000000..5d47b23 Binary files /dev/null and b/packages/ui/src/assets/provider-icons/openrouter.ico differ diff --git a/packages/ui/src/assets/provider-icons/qiniu-ai.png b/packages/ui/src/assets/provider-icons/qiniu-ai.png new file mode 100644 index 0000000..2ff255d Binary files /dev/null and b/packages/ui/src/assets/provider-icons/qiniu-ai.png differ diff --git a/packages/ui/src/assets/provider-icons/runapi.jpg b/packages/ui/src/assets/provider-icons/runapi.jpg new file mode 100644 index 0000000..cbd5e94 Binary files /dev/null and b/packages/ui/src/assets/provider-icons/runapi.jpg differ diff --git a/packages/ui/src/assets/provider-icons/siliconflow.png b/packages/ui/src/assets/provider-icons/siliconflow.png new file mode 100644 index 0000000..a4fd985 Binary files /dev/null and b/packages/ui/src/assets/provider-icons/siliconflow.png differ diff --git a/packages/ui/src/assets/provider-icons/teamorouter.png b/packages/ui/src/assets/provider-icons/teamorouter.png new file mode 100644 index 0000000..55f0c06 Binary files /dev/null and b/packages/ui/src/assets/provider-icons/teamorouter.png differ diff --git a/packages/ui/src/assets/provider-icons/zai-global-coding.svg b/packages/ui/src/assets/provider-icons/zai-global-coding.svg new file mode 100644 index 0000000..4f511bd --- /dev/null +++ b/packages/ui/src/assets/provider-icons/zai-global-coding.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/ui/src/assets/provider-icons/zai-global-general.svg b/packages/ui/src/assets/provider-icons/zai-global-general.svg new file mode 100644 index 0000000..4f511bd --- /dev/null +++ b/packages/ui/src/assets/provider-icons/zai-global-general.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/ui/src/assets/provider-icons/zhipu-cn-coding.png b/packages/ui/src/assets/provider-icons/zhipu-cn-coding.png new file mode 100644 index 0000000..0cc7d36 Binary files /dev/null and b/packages/ui/src/assets/provider-icons/zhipu-cn-coding.png differ diff --git a/packages/ui/src/assets/provider-icons/zhipu-cn-general.png b/packages/ui/src/assets/provider-icons/zhipu-cn-general.png new file mode 100644 index 0000000..0cc7d36 Binary files /dev/null and b/packages/ui/src/assets/provider-icons/zhipu-cn-general.png differ diff --git a/packages/ui/src/assets/tray-cyan.png b/packages/ui/src/assets/tray-cyan.png new file mode 100644 index 0000000..b259c8a Binary files /dev/null and b/packages/ui/src/assets/tray-cyan.png differ diff --git a/packages/ui/src/assets/tray-orange.png b/packages/ui/src/assets/tray-orange.png new file mode 100644 index 0000000..8b7b544 Binary files /dev/null and b/packages/ui/src/assets/tray-orange.png differ diff --git a/packages/ui/src/assets/tray-violet.png b/packages/ui/src/assets/tray-violet.png new file mode 100644 index 0000000..65e5d81 Binary files /dev/null and b/packages/ui/src/assets/tray-violet.png differ diff --git a/packages/ui/src/components/ui/badge.tsx b/packages/ui/src/components/ui/badge.tsx new file mode 100644 index 0000000..e6bef74 --- /dev/null +++ b/packages/ui/src/components/ui/badge.tsx @@ -0,0 +1,30 @@ +import * as React from "react"; +import { cn } from "@/lib/utils"; + +type BadgeVariant = "danger" | "default" | "outline" | "secondary" | "success" | "warning"; + +export interface BadgeProps extends React.HTMLAttributes { + variant?: BadgeVariant; +} + +function badgeVariants({ className, variant = "default" }: { className?: string; variant?: BadgeVariant }) { + return cn( + "inline-flex min-w-0 items-center gap-1 rounded-full border px-2 py-0.5 text-[11px] font-medium leading-4", + variant === "default" && "border-transparent bg-primary/10 text-primary", + variant === "secondary" && "border-border bg-secondary text-secondary-foreground", + variant === "success" && "border-emerald-200 bg-emerald-50 text-emerald-700", + variant === "warning" && "border-amber-200 bg-amber-50 text-amber-700", + variant === "danger" && "border-red-200 bg-red-50 text-red-700", + variant === "outline" && "border-border bg-background text-muted-foreground", + className + ); +} + +const Badge = React.forwardRef( + ({ className, variant, ...props }, ref) => ( + + ) +); +Badge.displayName = "Badge"; + +export { Badge, badgeVariants }; diff --git a/packages/ui/src/components/ui/button.tsx b/packages/ui/src/components/ui/button.tsx new file mode 100644 index 0000000..bf6794e --- /dev/null +++ b/packages/ui/src/components/ui/button.tsx @@ -0,0 +1,60 @@ +import * as React from "react"; +import { cn } from "@/lib/utils"; + +type ButtonVariant = "default" | "destructive" | "ghost" | "outline" | "secondary" | "subtle"; +type ButtonSize = "default" | "icon" | "iconSm" | "sm"; + +export interface ButtonProps + extends Omit, "color" | "size"> { + size?: ButtonSize; + unstyled?: boolean; + variant?: ButtonVariant; +} + +function buttonVariants({ + className, + size = "default", + variant = "default" +}: { + className?: string; + size?: ButtonSize; + variant?: ButtonVariant; +}) { + return cn( + "inline-flex shrink-0 select-none items-center justify-center gap-1.5 whitespace-nowrap rounded-md border text-[12px] font-medium leading-4 outline-none transition-[background-color,border-color,color,box-shadow] duration-150 focus-visible:ring-2 focus-visible:ring-ring/25 disabled:pointer-events-none disabled:opacity-45", + variant === "default" && "border-primary/70 bg-primary text-primary-foreground shadow-[0_1px_2px_rgba(15,118,110,0.2),inset_0_1px_0_rgba(255,255,255,0.14)] hover:border-primary hover:bg-primary/90 active:bg-primary/80", + variant === "secondary" && "border-border bg-secondary text-secondary-foreground shadow-[0_1px_1px_rgba(0,0,0,.04)] hover:bg-muted", + variant === "ghost" && "border-transparent bg-transparent text-muted-foreground hover:bg-muted/70 hover:text-foreground", + variant === "outline" && "border-input bg-background text-foreground shadow-[0_1px_1px_rgba(0,0,0,.03)] hover:border-muted-foreground/45 hover:bg-muted/55", + variant === "destructive" && "border-destructive/80 bg-destructive text-destructive-foreground hover:bg-destructive/90 active:bg-destructive/80", + variant === "subtle" && "border-transparent bg-muted text-muted-foreground hover:bg-muted/80 hover:text-foreground", + size === "sm" && "h-7 px-2 text-[11px]", + size === "default" && "h-8 px-3", + size === "icon" && "h-8 w-8 px-0", + size === "iconSm" && "h-7 w-7 px-0", + className + ); +} + +const Button = React.forwardRef( + ({ children, className, size = "default", type, unstyled = false, variant = "default", ...props }, ref) => { + if (unstyled) { + return ; + } + + return ( + + ); + } +); + +Button.displayName = "Button"; + +export { Button, buttonVariants }; diff --git a/packages/ui/src/components/ui/card.tsx b/packages/ui/src/components/ui/card.tsx new file mode 100644 index 0000000..ac5eb86 --- /dev/null +++ b/packages/ui/src/components/ui/card.tsx @@ -0,0 +1,40 @@ +import * as React from "react"; +import { cn } from "@/lib/utils"; + +const Card = React.forwardRef>( + ({ className, style, ...props }, ref) => ( +
    + ) +); +Card.displayName = "Card"; + +const CardHeader = React.forwardRef>( + ({ className, ...props }, ref) => ( +
    + ) +); +CardHeader.displayName = "CardHeader"; + +const CardTitle = React.forwardRef>( + ({ className, ...props }, ref) => ( +

    + ) +); +CardTitle.displayName = "CardTitle"; + +const CardContent = React.forwardRef>( + ({ className, ...props }, ref) => ( +
    + ) +); +CardContent.displayName = "CardContent"; + +export { Card, CardContent, CardHeader, CardTitle }; diff --git a/packages/ui/src/components/ui/checkbox.tsx b/packages/ui/src/components/ui/checkbox.tsx new file mode 100644 index 0000000..008e744 --- /dev/null +++ b/packages/ui/src/components/ui/checkbox.tsx @@ -0,0 +1,32 @@ +import * as React from "react"; +import { Check } from "lucide-react"; +import { cn } from "@/lib/utils"; + +export interface CheckboxProps extends Omit, "type"> { + onCheckedChange?: (checked: boolean) => void; +} + +const Checkbox = React.forwardRef( + ({ checked = false, className, disabled, onChange, onCheckedChange, ...props }, ref) => ( + + { + onChange?.(event); + onCheckedChange?.(event.target.checked); + }} + ref={ref} + type="checkbox" + {...props} + /> + + + ) +); + +Checkbox.displayName = "Checkbox"; + +export { Checkbox }; diff --git a/packages/ui/src/components/ui/dialog.tsx b/packages/ui/src/components/ui/dialog.tsx new file mode 100644 index 0000000..1d971dd --- /dev/null +++ b/packages/ui/src/components/ui/dialog.tsx @@ -0,0 +1,141 @@ +import * as React from "react"; +import { motion, useReducedMotion } from "motion/react"; +import { cn } from "@/lib/utils"; + +type MotionSafeDivAttributes = Omit< + React.HTMLAttributes, + "onAnimationStart" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragStart" | "onDragStartCapture" +>; + +type MotionSafeSectionAttributes = Omit< + React.HTMLAttributes, + "onAnimationStart" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragStart" | "onDragStartCapture" +>; + +const DialogStackContext = React.createContext(0); + +function DialogStackLayer({ + children, + depth = 0 +}: { + children: React.ReactNode; + depth?: number; +}) { + return {children}; +} + +export interface DialogProps extends MotionSafeDivAttributes { + onOpenChange?: (open: boolean) => void; + open?: boolean; +} + +function Dialog({ + children, + className, + onMouseDown, + onOpenChange, + open = true, + ...props +}: DialogProps) { + const shouldReduceMotion = useReducedMotion(); + + if (!open) { + return null; + } + + return ( + { + onMouseDown?.(event); + if (!event.defaultPrevented && event.target === event.currentTarget) { + onOpenChange?.(false); + } + }} + transition={shouldReduceMotion ? { duration: 0.12, ease: "easeOut" } : { duration: 0.16, ease: [0.22, 1, 0.36, 1] }} + {...props} + > + {children} + + ); +} + +export interface DialogContentProps extends MotionSafeSectionAttributes {} + +const DialogContent = React.forwardRef( + ({ className, ...props }, ref) => { + const shouldReduceMotion = useReducedMotion(); + const stackDepth = React.useContext(DialogStackContext); + const stackedScale = Math.max(0.96, 1 - stackDepth * 0.015); + + return ( + 0 ? stackedScale : 1, y: 0 }} + aria-hidden={stackDepth > 0 ? true : undefined} + aria-modal={stackDepth > 0 ? undefined : true} + className={cn("flex max-h-[calc(100dvh-1.5rem)] w-full max-w-[680px] flex-col overflow-hidden rounded-md border border-border bg-card shadow-xl", className)} + exit={shouldReduceMotion ? { opacity: 0 } : { opacity: 0, scale: 0.98, y: 10 }} + initial={shouldReduceMotion ? { opacity: 0 } : { opacity: 0, scale: 0.98, y: 14 }} + ref={ref} + role="dialog" + transition={shouldReduceMotion ? { duration: 0.12, ease: "easeOut" } : { type: "spring", stiffness: 520, damping: 38, mass: 0.75 }} + {...props} + /> + ); + } +); + +DialogContent.displayName = "DialogContent"; + +const DialogHeader = React.forwardRef>( + ({ className, ...props }, ref) => ( +
    + ) +); + +DialogHeader.displayName = "DialogHeader"; + +const DialogBody = React.forwardRef>( + ({ className, ...props }, ref) => ( +
    + ) +); + +DialogBody.displayName = "DialogBody"; + +const DialogFooter = React.forwardRef>( + ({ className, ...props }, ref) => ( +